emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 95717db1e8: Fix mouse pointer avoidance in some configurations


From: Po Lu
Subject: master 95717db1e8: Fix mouse pointer avoidance in some configurations
Date: Wed, 11 May 2022 04:02:05 -0400 (EDT)

branch: master
commit 95717db1e8045f14ca427243a86a0cd433e07273
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix mouse pointer avoidance in some configurations
    
    * lisp/avoid.el (mouse-avoidance-random-shape): Ignore invisible
    pointer.
    (mouse-avoidance-ignore-p): Adjust for interprogram DND.
    * lisp/term/x-win.el (x-pointer-invisible): Make value larger
    than the maximum possible glyph.
    
    * src/xfns.c (x_set_mouse_color): Use function that handles
    `x-pointer-invisible' too.
    * src/xterm.c (x_create_font_cursor): New function.  Handle
    invisible cursors.
    * src/xterm.h: Update prototypes.
---
 lisp/avoid.el      | 17 ++++++++++-------
 lisp/term/x-win.el |  4 +++-
 src/xfns.c         | 44 ++++++++++++++++++++++++--------------------
 src/xterm.c        | 12 ++++++++++++
 src/xterm.h        |  3 ++-
 5 files changed, 51 insertions(+), 29 deletions(-)

diff --git a/lisp/avoid.el b/lisp/avoid.el
index b53d84d2e8..c97e51a6f7 100644
--- a/lisp/avoid.el
+++ b/lisp/avoid.el
@@ -300,12 +300,14 @@ has an integer value is a valid cursor shape.  You might 
want to
 redefine this function to suit your own tastes."
   (if (null mouse-avoidance-pointer-shapes)
       (progn
-       (setq mouse-avoidance-pointer-shapes
-             (mapcar (lambda (x) (symbol-value (intern x)))
-                     (all-completions "x-pointer-" obarray
-                                      (lambda (x)
-                                         (and (boundp x)
-                                               (integerp (symbol-value 
x)))))))))
+       (dolist (i (all-completions "x-pointer-" obarray
+                                   (lambda (x)
+                                     (and (boundp x)
+                                           (integerp (symbol-value x))))))
+          (ignore-errors
+            (let ((value (symbol-value (intern i))))
+              (when (< value x-pointer-invisible)
+                (push value mouse-avoidance-pointer-shapes)))))))
   (seq-random-elt mouse-avoidance-pointer-shapes))
 
 (defun mouse-avoidance-ignore-p ()
@@ -317,7 +319,8 @@ redefine this function to suit your own tastes."
        (not (eq (car mp) (selected-frame)))
         ;; Don't interfere with ongoing `mouse-drag-and-drop-region'
         ;; (Bug#36269).
-        (eq track-mouse 'dropping)
+        (or (eq track-mouse 'dropping)
+            (eq track-mouse 'drag-source))
        ;; Don't do anything if last event was a mouse event.
        ;; FIXME: this code fails in the case where the mouse was moved
        ;; since the last key-press but without generating any event.
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index ca38a0a8c9..08a8bf88e5 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -241,7 +241,9 @@ exists."
 (defconst x-pointer-ur-angle 148)
 (defconst x-pointer-watch 150)
 (defconst x-pointer-xterm 152)
-(defconst x-pointer-invisible 255)
+(defconst x-pointer-invisible 65536) ;; This value is larger than a
+                                     ;; CARD16, so it cannot be a
+                                     ;; valid cursor.
 
 
 ;;;; Keysyms
diff --git a/src/xfns.c b/src/xfns.c
index 5522684170..6eddf3a494 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -1261,25 +1261,27 @@ struct mouse_cursor_types {
 };
 
 /* This array must stay in sync with enum mouse_cursor above!  */
-static const struct mouse_cursor_types mouse_cursor_types[] = {
-  { "text",      &Vx_pointer_shape,                    XC_xterm               
},
-  { "nontext",   &Vx_nontext_pointer_shape,            XC_left_ptr            
},
-  { "hourglass", &Vx_hourglass_pointer_shape,          XC_watch               
},
-  { "modeline",  &Vx_mode_pointer_shape,               XC_xterm               
},
-  { NULL,        &Vx_sensitive_text_pointer_shape,     XC_hand2               
},
-  { NULL,        &Vx_window_horizontal_drag_shape,     XC_sb_h_double_arrow   
},
-  { NULL,        &Vx_window_vertical_drag_shape,       XC_sb_v_double_arrow   
},
-  { NULL,        &Vx_window_left_edge_shape,           XC_left_side           
},
-  { NULL,        &Vx_window_top_left_corner_shape,     XC_top_left_corner     
},
-  { NULL,        &Vx_window_top_edge_shape,            XC_top_side            
},
-  { NULL,        &Vx_window_top_right_corner_shape,    XC_top_right_corner    
},
-  { NULL,        &Vx_window_right_edge_shape,          XC_right_side          
},
-  { NULL,        &Vx_window_bottom_right_corner_shape, XC_bottom_right_corner 
},
-  { NULL,        &Vx_window_bottom_edge_shape,         XC_bottom_side         
},
-  { NULL,        &Vx_window_bottom_left_corner_shape,  XC_bottom_left_corner  
},
-};
+static const struct mouse_cursor_types mouse_cursor_types[] =
+  {
+    { "text",      &Vx_pointer_shape,                    XC_xterm              
 },
+    { "nontext",   &Vx_nontext_pointer_shape,            XC_left_ptr           
 },
+    { "hourglass", &Vx_hourglass_pointer_shape,          XC_watch              
 },
+    { "modeline",  &Vx_mode_pointer_shape,               XC_xterm              
 },
+    { NULL,        &Vx_sensitive_text_pointer_shape,     XC_hand2              
 },
+    { NULL,        &Vx_window_horizontal_drag_shape,     XC_sb_h_double_arrow  
 },
+    { NULL,        &Vx_window_vertical_drag_shape,       XC_sb_v_double_arrow  
 },
+    { NULL,        &Vx_window_left_edge_shape,           XC_left_side          
 },
+    { NULL,        &Vx_window_top_left_corner_shape,     XC_top_left_corner    
 },
+    { NULL,        &Vx_window_top_edge_shape,            XC_top_side           
 },
+    { NULL,        &Vx_window_top_right_corner_shape,    XC_top_right_corner   
 },
+    { NULL,        &Vx_window_right_edge_shape,          XC_right_side         
 },
+    { NULL,        &Vx_window_bottom_right_corner_shape, 
XC_bottom_right_corner },
+    { NULL,        &Vx_window_bottom_edge_shape,         XC_bottom_side        
 },
+    { NULL,        &Vx_window_bottom_left_corner_shape,  XC_bottom_left_corner 
 },
+  };
 
-struct mouse_cursor_data {
+struct mouse_cursor_data
+{
   /* Last index for which XCreateFontCursor has been called, and thus
      the last index for which x_request_serial[] is valid.  */
   int last_cursor_create_request;
@@ -1360,8 +1362,10 @@ x_set_mouse_color (struct frame *f, Lisp_Object arg, 
Lisp_Object oldval)
     {
       cursor_data.x_request_serial[i] = XNextRequest (dpy);
       cursor_data.last_cursor_create_request = i;
-      cursor_data.cursor[i] = XCreateFontCursor (dpy,
-                                                cursor_data.cursor_num[i]);
+
+      cursor_data.cursor[i]
+       = x_create_font_cursor (FRAME_DISPLAY_INFO (f),
+                               cursor_data.cursor_num[i]);
     }
 
   /* Now sync up and process all received errors from cursor
diff --git a/src/xterm.c b/src/xterm.c
index 4c1720ca94..a250fce9b0 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -22639,6 +22639,18 @@ x_make_frame_visible_invisible (struct frame *f, bool 
visible)
     x_make_frame_invisible (f);
 }
 
+Cursor
+x_create_font_cursor (struct x_display_info *dpyinfo, int glyph)
+{
+  if (glyph <= 65535)
+    return XCreateFontCursor (dpyinfo->display, glyph);
+
+  /* x-pointer-invisible cannot fit in CARD16, and thus cannot be any
+     existing cursor.  */
+  return make_invisible_cursor (dpyinfo);
+}
+
+
 /* Change window state from mapped to iconified.  */
 
 void
diff --git a/src/xterm.h b/src/xterm.h
index 98c4c5f01c..3437037e67 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -1383,7 +1383,8 @@ extern void x_iconify_frame (struct frame *f);
 extern void x_free_frame_resources (struct frame *);
 extern void x_wm_set_size_hint (struct frame *, long, bool);
 
-extern void x_delete_terminal (struct terminal *terminal);
+extern void x_delete_terminal (struct terminal *);
+extern Cursor x_create_font_cursor (struct x_display_info *, int);
 extern unsigned long x_copy_color (struct frame *, unsigned long);
 #ifdef USE_X_TOOLKIT
 extern XtAppContext Xt_app_con;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]