x11: Add cursor hiding

The created cursor could be cached and whatnot, but I'm not sure it
deserves the complexity.
This commit is contained in:
Emilio Cobos Álvarez 2016-04-17 17:32:34 +02:00
parent 558eeadbd5
commit 51aeb27d7e
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C

View file

@ -11,6 +11,7 @@ use std::sync::{Arc, Mutex};
use std::os::raw::c_long; use std::os::raw::c_long;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
use x11_dl::xlib;
use Api; use Api;
use ContextError; use ContextError;
@ -902,8 +903,7 @@ impl Window {
MouseCursor::ZoomIn => load("zoom-in"), MouseCursor::ZoomIn => load("zoom-in"),
MouseCursor::ZoomOut => load("zoom-out"), MouseCursor::ZoomOut => load("zoom-out"),
// TODO: Hide cursor MouseCursor::NoneCursor => self.create_empty_cursor(),
MouseCursor::NoneCursor => 0,
}; };
(self.x.display.xlib.XDefineCursor)(self.x.display.display, self.x.window, xcursor); (self.x.display.xlib.XDefineCursor)(self.x.display.display, self.x.window, xcursor);
@ -914,6 +914,34 @@ impl Window {
} }
} }
// TODO: This could maybe be cached. I don't think it's worth
// the complexity, since cursor changes are not so common,
// and this is just allocating a 1x1 pixmap...
fn create_empty_cursor(&self) -> xlib::Cursor {
use std::mem;
let data = 0;
unsafe {
let pixmap = (self.x.display.xlib.XCreateBitmapFromData)(self.x.display.display, self.x.window, &data, 1, 1);
if pixmap == 0 {
// Failed to allocate
return 0;
}
// We don't care about this color, since it only fills bytes
// in the pixmap which are not 0 in the mask.
let dummy_color: xlib::XColor = mem::uninitialized();
let cursor = (self.x.display.xlib.XCreatePixmapCursor)(self.x.display.display,
pixmap,
pixmap,
&dummy_color as *const _ as *mut _,
&dummy_color as *const _ as *mut _, 0, 0);
(self.x.display.xlib.XFreePixmap)(self.x.display.display, pixmap);
cursor
}
}
pub fn set_cursor_state(&self, state: CursorState) -> Result<(), String> { pub fn set_cursor_state(&self, state: CursorState) -> Result<(), String> {
use CursorState::{ Grab, Normal, Hide }; use CursorState::{ Grab, Normal, Hide };