Show cursor again when window not in focus

master^2
Marius Petcu 2019-09-27 10:21:52 +03:00
parent 24f146d240
commit 2d8908a3f6
1 changed files with 24 additions and 5 deletions

View File

@ -67,6 +67,8 @@ static CustomCursor * current_cursor;
static CustomCursor * default_cursors[DEFOS_CURSOR_INTMAX]; static CustomCursor * default_cursors[DEFOS_CURSOR_INTMAX];
static bool is_cursor_visible = true; static bool is_cursor_visible = true;
static bool is_cursor_actually_visible = true;
static bool window_has_focus = true;
static bool resize_locked = false; static bool resize_locked = false;
static bool is_window_visible(Window window); static bool is_window_visible(Window window);
@ -95,6 +97,8 @@ void defos_init()
resize_locked = false; resize_locked = false;
is_cursor_visible = true; is_cursor_visible = true;
is_cursor_actually_visible = true;
window_has_focus = true;
current_cursor = NULL; current_cursor = NULL;
memset(default_cursors, 0, DEFOS_CURSOR_INTMAX * sizeof(CustomCursor*)); memset(default_cursors, 0, DEFOS_CURSOR_INTMAX * sizeof(CustomCursor*));
@ -253,10 +257,10 @@ static void apply_cursor() {
XDefineCursor(disp, win, cursor); XDefineCursor(disp, win, cursor);
} }
void defos_set_cursor_visible(bool visible) static void apply_cursor_visible() {
{ bool visible = is_cursor_visible || !window_has_focus;
if (visible == is_cursor_visible) { return; } if (visible == is_cursor_actually_visible) { return; }
is_cursor_visible = visible; is_cursor_actually_visible = visible;
if (visible) { if (visible) {
XFixesShowCursor(disp, win); XFixesShowCursor(disp, win);
@ -266,6 +270,13 @@ void defos_set_cursor_visible(bool visible)
XFlush(disp); XFlush(disp);
} }
void defos_set_cursor_visible(bool visible)
{
if (visible == is_cursor_visible) { return; }
is_cursor_visible = visible;
apply_cursor_visible();
}
bool defos_is_cursor_visible() bool defos_is_cursor_visible()
{ {
return is_cursor_visible; return is_cursor_visible;
@ -493,6 +504,14 @@ bool defos_is_cursor_locked()
void defos_update() void defos_update()
{ {
Window focused_window;
int revert_to;
if (!XGetInputFocus(disp, &focused_window, &revert_to)) {
focused_window = None;
}
window_has_focus = focused_window == win;
apply_cursor_visible();
} }
void * defos_load_cursor_linux(const char *filename) void * defos_load_cursor_linux(const char *filename)
@ -550,7 +569,7 @@ void defos_set_cursor(DefosCursor cursor_type)
void defos_reset_cursor() void defos_reset_cursor()
{ {
if (is_cursor_visible) { XUndefineCursor(disp, win); } XUndefineCursor(disp, win);
defos_gc_custom_cursor(current_cursor); defos_gc_custom_cursor(current_cursor);
current_cursor = NULL; current_cursor = NULL;
} }