emacs-diffs
[Top][All Lists]
Advanced

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

master 2bc6d82831: Handle modifiers during Haiku DND wheel movement


From: Po Lu
Subject: master 2bc6d82831: Handle modifiers during Haiku DND wheel movement
Date: Tue, 26 Jul 2022 01:43:23 -0400 (EDT)

branch: master
commit 2bc6d8283189bcbbf9bceeac5013b9e41a511222
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Handle modifiers during Haiku DND wheel movement
    
    * lisp/term/haiku-win.el (haiku-dnd-modifier-mask)
    (haiku-dnd-wheel-modifier-type): New functions.
    (haiku-handle-drag-wheel): Use them.
    * lisp/x-dnd.el (x-dnd-modifier-mask): Remove outdated comment.
    * src/haikuselect.c (haiku_note_drag_wheel): Pass modifiers to
    wheel function.
    (syms_of_haikuselect): Update doc strings.
---
 lisp/term/haiku-win.el | 62 +++++++++++++++++++++++++++++++++++++++++++++-----
 lisp/x-dnd.el          |  1 -
 src/haikuselect.c      | 13 ++++++-----
 3 files changed, 63 insertions(+), 13 deletions(-)

diff --git a/lisp/term/haiku-win.el b/lisp/term/haiku-win.el
index 9d9c31970d..a16169d477 100644
--- a/lisp/term/haiku-win.el
+++ b/lisp/term/haiku-win.el
@@ -489,19 +489,56 @@ Return the number of clicks that were made in quick 
succession."
 
 (defvar haiku-drag-wheel-function)
 
-(defun haiku-handle-drag-wheel (frame x y horizontal up)
+(defun haiku-dnd-modifier-mask (mods)
+  "Return the internal modifier mask for the Emacs modifier state MODS.
+MODS is a single symbol, or a list of symbols such as `shift' or
+`control'."
+  (let ((mask 0))
+    (unless (consp mods)
+      (setq mods (list mods)))
+    (dolist (modifier mods)
+      (cond ((eq modifier 'shift)
+             (setq mask (logior mask ?\S-\0)))
+            ((eq modifier 'control)
+             (setq mask (logior mask ?\C-\0)))
+            ((eq modifier 'meta)
+             (setq mask (logior mask ?\M-\0)))
+            ((eq modifier 'hyper)
+             (setq mask (logior mask ?\H-\0)))
+            ((eq modifier 'super)
+             (setq mask (logior mask ?\s-\0)))
+            ((eq modifier 'alt)
+             (setq mask (logior mask ?\A-\0)))))
+    mask))
+
+(defun haiku-dnd-wheel-modifier-type (flags)
+  "Return the modifier type of an internal modifier mask.
+FLAGS is the internal modifier mask of a turn of the mouse wheel."
+  (let ((modifiers (logior ?\M-\0 ?\C-\0 ?\S-\0
+                          ?\H-\0 ?\s-\0 ?\A-\0)))
+    (catch 'type
+      (dolist (modifier mouse-wheel-scroll-amount)
+        (when (and (consp modifier)
+                   (eq (haiku-dnd-modifier-mask (car modifier))
+                       (logand flags modifiers)))
+          (throw 'type (cdr modifier))))
+      nil)))
+
+(defun haiku-handle-drag-wheel (frame x y horizontal up modifiers)
   "Handle wheel movement during drag-and-drop.
 FRAME is the frame on top of which the wheel moved.
 X and Y are the frame-relative coordinates of the wheel movement.
 HORIZONTAL is whether or not the wheel movement was horizontal.
-UP is whether or not the wheel moved up (or left)."
+UP is whether or not the wheel moved up (or left).
+MODIFIERS is the internal modifier mask of the wheel movement."
   (when (not (equal haiku-last-wheel-direction
                     (cons horizontal up)))
     (setq haiku-last-wheel-direction
           (cons horizontal up))
     (when (consp haiku-dnd-wheel-count)
       (setcar haiku-dnd-wheel-count 0)))
-  (let ((function (cond
+  (let ((type (haiku-dnd-wheel-modifier-type modifiers))
+        (function (cond
                    ((and (not horizontal) (not up))
                     mwheel-scroll-up-function)
                    ((not horizontal)
@@ -512,14 +549,27 @@ UP is whether or not the wheel moved up (or left)."
                    (t (if mouse-wheel-flip-direction
                           mwheel-scroll-left-function
                         mwheel-scroll-right-function))))
-        (timestamp (time-convert nil 1000)))
+        (timestamp (time-convert nil 1000))
+        (amt 1))
+    (cond ((and (eq type 'hscroll)
+                (not horizontal))
+           (setq function (if (not up)
+                              mwheel-scroll-left-function
+                            mwheel-scroll-right-function)))
+          ((and (eq type 'global-text-scale))
+           (setq function 'global-text-scale-adjust
+                 amt (if up 1 -1)))
+          ((and (eq type 'text-scale))
+           (setq function 'text-scale-adjust
+                 amt (if up 1 -1))))
     (when function
       (let ((posn (posn-at-x-y x y frame)))
         (when (windowp (posn-window posn))
           (with-selected-window (posn-window posn)
             (funcall function
-                     (or (and (not mouse-wheel-progressive-speed) 1)
-                         (haiku-note-wheel-click (car timestamp))))))))))
+                     (* amt
+                        (or (and (not mouse-wheel-progressive-speed) 1)
+                            (haiku-note-wheel-click (car timestamp)))))))))))
 
 (setq haiku-drag-wheel-function #'haiku-handle-drag-wheel)
 
diff --git a/lisp/x-dnd.el b/lisp/x-dnd.el
index 10fd9e5dac..bdfe444bc1 100644
--- a/lisp/x-dnd.el
+++ b/lisp/x-dnd.el
@@ -708,7 +708,6 @@ MODS is a single symbol, or a list of symbols such as 
`shift' or
     (unless (consp mods)
       (setq mods (list mods)))
     (dolist (modifier mods)
-      ;; TODO: handle virtual modifiers such as Meta and Hyper.
       (cond ((eq modifier 'shift)
              (setq mask (logior mask 1))) ; ShiftMask
             ((eq modifier 'control)
diff --git a/src/haikuselect.c b/src/haikuselect.c
index 268d8b1ec9..7eb93a2754 100644
--- a/src/haikuselect.c
+++ b/src/haikuselect.c
@@ -1062,8 +1062,9 @@ haiku_note_drag_wheel (struct input_event *ie)
   if (!NILP (Vhaiku_drag_wheel_function)
       && (haiku_dnd_allow_same_frame
          || XFRAME (ie->frame_or_window) != haiku_dnd_frame))
-    safe_call (6, Vhaiku_drag_wheel_function, ie->frame_or_window,
-              ie->x, ie->y, horizontal ? Qt : Qnil, up ? Qt : Qnil);
+    safe_call (7, Vhaiku_drag_wheel_function, ie->frame_or_window,
+              ie->x, ie->y, horizontal ? Qt : Qnil, up ? Qt : Qnil,
+              make_int (ie->modifiers));
 
   redisplay_preserve_echo_area (35);
 }
@@ -1149,12 +1150,12 @@ These are only called if a connection to the Haiku 
display was opened.  */);
 
   DEFVAR_LISP ("haiku-drag-wheel-function", Vhaiku_drag_wheel_function,
     doc: /* Function called upon wheel movement while dragging a message.
-If non-nil, it is called with 5 arguments when the mouse wheel moves
+If non-nil, it is called with 6 arguments when the mouse wheel moves
 while a drag-and-drop operation is in progress: the frame where the
 mouse moved, the frame-relative X and Y positions where the mouse
-moved, whether or not the wheel movement was horizontal, and whether
-or not the wheel moved up (or left, if the movement was
-horizontal).  */);
+moved, whether or not the wheel movement was horizontal, whether or
+not the wheel moved up (or left, if the movement was horizontal), and
+keyboard modifiers currently held down.  */);
   Vhaiku_drag_wheel_function = Qnil;
 
   DEFSYM (QSECONDARY, "SECONDARY");



reply via email to

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