From 70e0af45245d7e453e0761b4844902c67b4af943 Mon Sep 17 00:00:00 2001 From: GreenDimond <24834740+GreenXenith@users.noreply.github.com> Date: Wed, 25 Sep 2019 10:41:32 -0700 Subject: [PATCH 1/5] Fix cursor visibility on Linux (XFCE) --- defos/src/defos_linux.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/defos/src/defos_linux.cpp b/defos/src/defos_linux.cpp index f120b51..760595c 100644 --- a/defos/src/defos_linux.cpp +++ b/defos/src/defos_linux.cpp @@ -266,9 +266,21 @@ void defos_set_cursor_visible(bool visible) is_cursor_visible = visible; if (visible) { - XDefineCursor(disp, win, current_cursor ? current_cursor->cursor : None); + XGrabPointer(disp, win, true, ButtonPressMask | + ButtonReleaseMask | + PointerMotionMask | + FocusChangeMask | + EnterWindowMask | + LeaveWindowMask, GrabModeAsync, GrabModeAsync, None, + current_cursor ? current_cursor->cursor : None, CurrentTime); } else { - XDefineCursor(disp, win, invisible_cursor); + XGrabPointer(disp, win, true, ButtonPressMask | + ButtonReleaseMask | + PointerMotionMask | + FocusChangeMask | + EnterWindowMask | + LeaveWindowMask, GrabModeAsync, GrabModeAsync, None, + invisible_cursor, CurrentTime); } } From 4572fe61bcc396463f542f03634ea955273b26be Mon Sep 17 00:00:00 2001 From: GreenDimond <24834740+GreenXenith@users.noreply.github.com> Date: Thu, 26 Sep 2019 15:26:26 -0700 Subject: [PATCH 2/5] Use XFixes instead of XGrabPointer --- defos/src/defos_linux.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/defos/src/defos_linux.cpp b/defos/src/defos_linux.cpp index 760595c..530775d 100644 --- a/defos/src/defos_linux.cpp +++ b/defos/src/defos_linux.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -266,21 +267,11 @@ void defos_set_cursor_visible(bool visible) is_cursor_visible = visible; if (visible) { - XGrabPointer(disp, win, true, ButtonPressMask | - ButtonReleaseMask | - PointerMotionMask | - FocusChangeMask | - EnterWindowMask | - LeaveWindowMask, GrabModeAsync, GrabModeAsync, None, - current_cursor ? current_cursor->cursor : None, CurrentTime); + XFixesShowCursor(disp, win); + XFlush(disp); } else { - XGrabPointer(disp, win, true, ButtonPressMask | - ButtonReleaseMask | - PointerMotionMask | - FocusChangeMask | - EnterWindowMask | - LeaveWindowMask, GrabModeAsync, GrabModeAsync, None, - invisible_cursor, CurrentTime); + XFixesHideCursor(disp, win); + XFlush(disp); } } From 4196ff9565d032512a86070b5fd9171ea266095b Mon Sep 17 00:00:00 2001 From: Marius Petcu Date: Fri, 27 Sep 2019 09:11:15 +0300 Subject: [PATCH 3/5] Fix apply_cursor logic when hiding the cursor --- defos/src/defos_linux.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/defos/src/defos_linux.cpp b/defos/src/defos_linux.cpp index 14cfc45..471e7b7 100644 --- a/defos/src/defos_linux.cpp +++ b/defos/src/defos_linux.cpp @@ -262,11 +262,7 @@ void defos_disable_window_resize() } static void apply_cursor() { - Cursor cursor = is_cursor_visible - ? (current_cursor ? current_cursor->cursor : None) - : invisible_cursor; - - // XGrabPointer(disp, win, true, 0, GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime); + Cursor cursor = current_cursor ? current_cursor->cursor : None; XDefineCursor(disp, win, cursor); } @@ -275,14 +271,12 @@ void defos_set_cursor_visible(bool visible) if (visible == is_cursor_visible) { return; } is_cursor_visible = visible; - if (visible) - { + if (visible) { XFixesShowCursor(disp, win); - XFlush(disp); } else { XFixesHideCursor(disp, win); - XFlush(disp); } + XFlush(disp); } bool defos_is_cursor_visible() From 24f146d240f150cd24efa9e112ddf739d0b047b7 Mon Sep 17 00:00:00 2001 From: Marius Petcu Date: Fri, 27 Sep 2019 09:13:46 +0300 Subject: [PATCH 4/5] Remove invisible cursor --- defos/src/defos_linux.cpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/defos/src/defos_linux.cpp b/defos/src/defos_linux.cpp index 471e7b7..a4f7ef7 100644 --- a/defos/src/defos_linux.cpp +++ b/defos/src/defos_linux.cpp @@ -66,7 +66,6 @@ struct CustomCursor { static CustomCursor * current_cursor; static CustomCursor * default_cursors[DEFOS_CURSOR_INTMAX]; -static Cursor invisible_cursor; static bool is_cursor_visible = true; static bool resize_locked = false; @@ -95,17 +94,6 @@ void defos_init() NET_FRAME_EXTENTS = XATOM("_NET_FRAME_EXTENTS"); resize_locked = false; - - // Create invisible cursor - Pixmap bitmapNoData; - XColor black; - static char noData[] = { 0,0,0,0,0,0,0,0 }; - black.red = black.green = black.blue = 0; - - bitmapNoData = XCreateBitmapFromData(disp, win, noData, 8, 8); - invisible_cursor = XCreatePixmapCursor(disp, bitmapNoData, bitmapNoData, &black, &black, 0, 0); - XFreePixmap(disp, bitmapNoData); - is_cursor_visible = true; current_cursor = NULL; @@ -114,7 +102,6 @@ void defos_init() void defos_final() { - XFreeCursor(disp, invisible_cursor); defos_gc_custom_cursor(current_cursor); for (int i = 0; i < DEFOS_CURSOR_INTMAX; i++) { defos_gc_custom_cursor(default_cursors[i]); @@ -517,7 +504,7 @@ void * defos_load_cursor_linux(const char *filename) cursor->cursor = XcursorImageLoadCursor(disp, image); XcursorImageDestroy(image); } else { - cursor->cursor = invisible_cursor; + cursor->cursor = XCreateFontCursor(disp, XC_left_ptr); } cursor->ref_count = 1; return cursor; From 2d8908a3f6846734804dafa3629393e76f4e6943 Mon Sep 17 00:00:00 2001 From: Marius Petcu Date: Fri, 27 Sep 2019 10:21:52 +0300 Subject: [PATCH 5/5] Show cursor again when window not in focus --- defos/src/defos_linux.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/defos/src/defos_linux.cpp b/defos/src/defos_linux.cpp index a4f7ef7..deb5b80 100644 --- a/defos/src/defos_linux.cpp +++ b/defos/src/defos_linux.cpp @@ -67,6 +67,8 @@ static CustomCursor * current_cursor; static CustomCursor * default_cursors[DEFOS_CURSOR_INTMAX]; 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 is_window_visible(Window window); @@ -95,6 +97,8 @@ void defos_init() resize_locked = false; is_cursor_visible = true; + is_cursor_actually_visible = true; + window_has_focus = true; current_cursor = NULL; memset(default_cursors, 0, DEFOS_CURSOR_INTMAX * sizeof(CustomCursor*)); @@ -253,10 +257,10 @@ static void apply_cursor() { XDefineCursor(disp, win, cursor); } -void defos_set_cursor_visible(bool visible) -{ - if (visible == is_cursor_visible) { return; } - is_cursor_visible = visible; +static void apply_cursor_visible() { + bool visible = is_cursor_visible || !window_has_focus; + if (visible == is_cursor_actually_visible) { return; } + is_cursor_actually_visible = visible; if (visible) { XFixesShowCursor(disp, win); @@ -266,6 +270,13 @@ void defos_set_cursor_visible(bool visible) 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() { return is_cursor_visible; @@ -493,6 +504,14 @@ bool defos_is_cursor_locked() 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) @@ -550,7 +569,7 @@ void defos_set_cursor(DefosCursor cursor_type) void defos_reset_cursor() { - if (is_cursor_visible) { XUndefineCursor(disp, win); } + XUndefineCursor(disp, win); defos_gc_custom_cursor(current_cursor); current_cursor = NULL; }