From e9d4f119da48fe119d9d7a6d1b9a054c043bd517 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sun, 3 Apr 2022 01:26:32 +0000 Subject: [PATCH] Implement new DND options on Haiku * lisp/term/haiku-win.el (haiku-drag-and-drop): Handle special drag and drop motion events. * src/haiku_support.cc (MouseMoved): Set `dnd_message' flag. * src/haiku_support.h (struct haiku_mouse_motion_event): New member `dnd_message'. * src/haikuterm.c (haiku_read_socket): Create special DND events when the mouse moves with a drop message. --- lisp/term/haiku-win.el | 37 ++++++++++++++++++++----------------- src/haiku_support.cc | 1 + src/haiku_support.h | 1 + src/haikuterm.c | 21 ++++++++++++++++++--- 4 files changed, 40 insertions(+), 20 deletions(-) diff --git a/lisp/term/haiku-win.el b/lisp/term/haiku-win.el index 810feced212..5b4ef0aaef8 100644 --- a/lisp/term/haiku-win.el +++ b/lisp/term/haiku-win.el @@ -245,23 +245,26 @@ VALUE will be encoded as UTF-8 and stored under the type (interactive "e") (let* ((string (caddr event)) (window (posn-window (event-start event)))) - (cond - ((assoc "refs" string) - (with-selected-window window - (raise-frame) - (dolist (filename (cddr (assoc "refs" string))) - (dnd-handle-one-url window 'private - (concat "file:" filename))))) - ((assoc "text/plain" string) - (with-selected-window window - (raise-frame) - (dolist (text (cddr (assoc "text/plain" string))) - (goto-char (posn-point (event-start event))) - (dnd-insert-text window 'private - (if (multibyte-string-p text) - text - (decode-coding-string text 'undecided)))))) - (t (message "Don't know how to drop any of: %s" (mapcar #'car string)))))) + (if (eq string 'lambda) ; This means the mouse moved. + (dnd-handle-movement (event-start event)) + (cond + ((assoc "refs" string) + (with-selected-window window + (raise-frame) + (dolist (filename (cddr (assoc "refs" string))) + (dnd-handle-one-url window 'private + (concat "file:" filename))))) + ((assoc "text/plain" string) + (with-selected-window window + (raise-frame) + (dolist (text (cddr (assoc "text/plain" string))) + (goto-char (posn-point (event-start event))) + (dnd-insert-text window 'private + (if (multibyte-string-p text) + text + (decode-coding-string text 'undecided)))))) + (t (message "Don't know how to drop any of: %s" + (mapcar #'car string))))))) (define-key special-event-map [drag-n-drop] 'haiku-drag-and-drop) diff --git a/src/haiku_support.cc b/src/haiku_support.cc index dd27d6317c5..64556ba51b6 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc @@ -1529,6 +1529,7 @@ public: rq.y = point.y; rq.window = this->Window (); rq.time = system_time (); + rq.dnd_message = drag_msg != NULL; if (ToolTip ()) ToolTip ()->SetMouseRelativeLocation (BPoint (-(point.x - tt_absl_pos.x), diff --git a/src/haiku_support.h b/src/haiku_support.h index ae3ad6a68a8..ac3029fbf3f 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h @@ -159,6 +159,7 @@ struct haiku_mouse_motion_event int x; int y; bigtime_t time; + bool dnd_message; }; struct haiku_menu_bar_left_event diff --git a/src/haikuterm.c b/src/haikuterm.c index 304b7a34255..cdddf50d19d 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c @@ -2970,6 +2970,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) struct haiku_mouse_motion_event *b = buf; struct frame *f = haiku_mouse_or_wdesc_frame (b->window); Mouse_HLInfo *hlinfo = &x_display_list->mouse_highlight; + Lisp_Object frame; if (!f) continue; @@ -2986,7 +2987,6 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) break; } - Lisp_Object frame; XSETFRAME (frame, f); x_display_list->last_mouse_movement_time = b->time / 1000; @@ -3102,8 +3102,8 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) && (!NILP (focus_follows_mouse) || f == SELECTED_FRAME ())) { - inev.kind = SELECT_WINDOW_EVENT; - inev.frame_or_window = window; + inev2.kind = SELECT_WINDOW_EVENT; + inev2.frame_or_window = window; } last_mouse_window = window; @@ -3118,6 +3118,21 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) if (!NILP (help_echo_string) || !NILP (previous_help_echo_string)) do_help = 1; + + if (b->dnd_message) + { + /* It doesn't make sense to show tooltips when + another program is dragging stuff over us. */ + + do_help = -1; + inev.kind = DRAG_N_DROP_EVENT; + inev.arg = Qlambda; + + XSETINT (inev.x, b->x); + XSETINT (inev.y, b->y); + XSETFRAME (inev.frame_or_window, f); + break; + } } if (FRAME_DIRTY_P (f)) -- 2.39.5