From: Po Lu Date: Mon, 22 Nov 2021 07:10:57 +0000 (+0000) Subject: Fix mouse movement event generation on Haiku X-Git-Tag: emacs-29.0.90~2852^2~114 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c7699b97022f5bdc3848d474485e0da5f2673595;p=emacs.git Fix mouse movement event generation on Haiku * src/haikuterm.c (haiku_mouse_position): Set timestamp. (haiku_read_socket): Set last_mouse_movement_time. * src/haikuterm.h (struct haiku_display_info): Add field `last_mouse_movement_time'. --- diff --git a/src/haikuterm.c b/src/haikuterm.c index bc956f066a9..5364ebf823a 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c @@ -2386,9 +2386,10 @@ haiku_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y, Time *timestamp) { - block_input (); if (!fp) return; + + block_input (); Lisp_Object frame, tail; struct frame *f1 = NULL; FOR_EACH_FRAME (tail, frame) @@ -2428,6 +2429,7 @@ haiku_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, *bar_window = Qnil; *part = scroll_bar_above_handle; *fp = f1; + *timestamp = x_display_list->last_mouse_movement_time; XSETINT (*x, sx); XSETINT (*y, sy); } @@ -2578,6 +2580,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) static void *buf = NULL; ssize_t b_size; struct unhandled_event *unhandled_events = NULL; + int button_or_motion_p; if (!buf) buf = xmalloc (200); @@ -2597,6 +2600,8 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) inev.arg = Qnil; inev2.arg = Qnil; + button_or_motion_p = 0; + haiku_read (&type, buf, b_size); switch (type) @@ -2721,6 +2726,9 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) Lisp_Object frame; XSETFRAME (frame, f); + x_display_list->last_mouse_movement_time = time (NULL); + button_or_motion_p = 1; + if (b->just_exited_p) { Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); @@ -2748,9 +2756,9 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) previous_help_echo_string = help_echo_string; help_echo_string = Qnil; - if (f != dpyinfo->last_mouse_glyph_frame || - b->x < r.x || b->x >= r.x + r.width - 1 || b->y < r.y || - b->y >= r.y + r.height - 1) + if (f != dpyinfo->last_mouse_glyph_frame + || b->x < r.x || b->x >= r.x + r.width + || b->y < r.y || b->y >= r.y + r.height) { f->mouse_moved = true; dpyinfo->last_mouse_scroll_bar = NULL; @@ -2805,6 +2813,8 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) inev.modifiers = haiku_modifiers_to_emacs (b->modifiers); x_display_list->last_mouse_glyph_frame = 0; + x_display_list->last_mouse_movement_time = time (NULL); + button_or_motion_p = 1; /* Is this in the tab-bar? */ if (WINDOWP (f->tab_bar_window) @@ -2858,6 +2868,8 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) inev.arg = tab_bar_arg; inev.code = b->btn_no; + f->mouse_moved = false; + XSETINT (inev.x, b->x); XSETINT (inev.y, b->y); @@ -3183,15 +3195,19 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) if (inev.kind != NO_EVENT) { if (inev.kind != HELP_EVENT) - inev.timestamp = time (NULL); + inev.timestamp = (button_or_motion_p + ? x_display_list->last_mouse_movement_time + : time (NULL)); kbd_buffer_store_event_hold (&inev, hold_quit); ++message_count; } if (inev2.kind != NO_EVENT) { - if (inev.kind != HELP_EVENT) - inev.timestamp = time (NULL); + if (inev2.kind != HELP_EVENT) + inev2.timestamp = (button_or_motion_p + ? x_display_list->last_mouse_movement_time + : time (NULL)); kbd_buffer_store_event_hold (&inev2, hold_quit); ++message_count; } diff --git a/src/haikuterm.h b/src/haikuterm.h index af55f68c679..7ed7485ef53 100644 --- a/src/haikuterm.h +++ b/src/haikuterm.h @@ -30,6 +30,7 @@ along with GNU Emacs. If not, see . */ #include "character.h" #include "dispextern.h" #include "font.h" +#include "systime.h" #define C_FRAME struct frame * #define C_FONT struct font * @@ -107,6 +108,8 @@ struct haiku_display_info haiku display; double resx, resy; + + Time last_mouse_movement_time; }; struct haiku_output