diff options
Diffstat (limited to 'src/conn_info/cursors.rs')
-rw-r--r-- | src/conn_info/cursors.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/conn_info/cursors.rs b/src/conn_info/cursors.rs new file mode 100644 index 0000000..119de5c --- /dev/null +++ b/src/conn_info/cursors.rs @@ -0,0 +1,59 @@ +use crate::error::Result; +use xcb::{ + x::{CreateGlyphCursor, Cursor, Font, OpenFont}, + Connection, +}; + +// https://tronche.com/gui/x/xlib/appendix/b/ +const XC_LEFT_PTR: u16 = 68; + +/// Caches X11 cursor objects +#[derive(Debug)] +pub struct Cursors { + #[allow(unused)] // Needs to be kept around since the cursors depend on it + font: Font, + + normal: Cursor, +} + +impl Cursors { + /// Load default cursors using the given connection. + pub fn new_with(conn: &Connection) -> Result<Self> { + // Open cursor font + let font = conn.generate_id(); + conn.check_request(conn.send_request_checked(&OpenFont { + fid: font, + name: b"cursor", + }))?; + + Ok(Self { + normal: Self::load_cursor(conn, font, XC_LEFT_PTR)?, + font, + }) + } + + /// Load the cursor with the given id from `font` + fn load_cursor(conn: &Connection, font: Font, id: u16) -> Result<Cursor> { + let cid = conn.generate_id(); + // https://github.com/mirror/libX11/blob/ff8706a5eae25b8bafce300527079f68a201d27f/src/Cursor.c#L34 + conn.check_request(conn.send_request_checked(&CreateGlyphCursor { + cid, + source_font: font, + mask_font: font, + source_char: id, + mask_char: id + 1, + fore_red: 0, + fore_green: 0, + fore_blue: 0, + back_red: u16::MAX, + back_green: u16::MAX, + back_blue: u16::MAX, + }))?; + + Ok(cid) + } + + pub const fn normal(&self) -> Cursor { + self.normal + } +} |