]> git.eshelyaron.com Git - emacs.git/commitdiff
Render Android hourglass cursor mechanics more consistent with X
authorPo Lu <luangruo@yahoo.com>
Tue, 4 Mar 2025 01:46:48 +0000 (09:46 +0800)
committerEshel Yaron <me@eshelyaron.com>
Tue, 4 Mar 2025 21:05:07 +0000 (22:05 +0100)
* src/androidterm.c (android_show_hourglass): Always define the
hourglass cursor, but...
(android_hide_hourglass): ... restore the invisible cursor
subsequently, if need be.
(android_toggle_visible_pointer): Do not hide the current cursor
if it is an hourglass.

(cherry picked from commit 144b268a84e6be81f59669b77651b4522a2f2805)

src/androidterm.c

index 79ee374f2ca91eb7ad342ac0f2f2a3ab67b9d80e..7fd61ee6d1c738d4b3293a47779faa443f98f4ac 100644 (file)
@@ -125,22 +125,39 @@ android_show_hourglass (struct frame *f)
 
   x->hourglass = true;
 
-  if (!f->pointer_invisible)
-    android_define_cursor (FRAME_ANDROID_WINDOW (f),
-                          x->hourglass_cursor);
+  /* An hourglass cursor ought to be visible whether or not the standard
+     cursor is invisible.  */
+  android_define_cursor (FRAME_ANDROID_WINDOW (f),
+                        x->hourglass_cursor);
+}
+
+static android_cursor
+make_invisible_cursor (struct android_display_info *dpyinfo)
+{
+  return android_create_font_cursor (ANDROID_XC_NULL);
 }
 
 static void
 android_hide_hourglass (struct frame *f)
 {
   struct android_output *x;
+  struct android_display_info *dpyinfo;
 
   x = FRAME_ANDROID_OUTPUT (f);
+  dpyinfo = FRAME_DISPLAY_INFO (f);
   x->hourglass = false;
 
   if (!f->pointer_invisible)
     android_define_cursor (FRAME_ANDROID_WINDOW (f),
                           x->current_cursor);
+  else
+    {
+      if (!dpyinfo->invisible_cursor)
+       dpyinfo->invisible_cursor = make_invisible_cursor (dpyinfo);
+
+      android_define_cursor (FRAME_ANDROID_WINDOW (f),
+                            dpyinfo->invisible_cursor);
+    }
 }
 
 static void
@@ -259,12 +276,6 @@ android_ring_bell (struct frame *f)
     }
 }
 
-static android_cursor
-make_invisible_cursor (struct android_display_info *dpyinfo)
-{
-  return android_create_font_cursor (ANDROID_XC_NULL);
-}
-
 static void
 android_toggle_visible_pointer (struct frame *f, bool invisible)
 {
@@ -272,6 +283,10 @@ android_toggle_visible_pointer (struct frame *f, bool invisible)
 
   dpyinfo = FRAME_DISPLAY_INFO (f);
 
+  /* An hourglass cursor overrides invisibility.  */
+  if (FRAME_ANDROID_OUTPUT (f)->hourglass)
+    goto set_invisibility;
+
   if (!dpyinfo->invisible_cursor)
     dpyinfo->invisible_cursor = make_invisible_cursor (dpyinfo);
 
@@ -280,10 +295,9 @@ android_toggle_visible_pointer (struct frame *f, bool invisible)
                           dpyinfo->invisible_cursor);
   else
     android_define_cursor (FRAME_ANDROID_WINDOW (f),
-                          (FRAME_ANDROID_OUTPUT (f)->hourglass
-                           ? f->output_data.android->hourglass_cursor
-                           : f->output_data.android->current_cursor));
+                          f->output_data.android->current_cursor);
 
+ set_invisibility:
   f->pointer_invisible = invisible;
 }