[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master c7699b9: Fix mouse movement event generation on Haiku
From: |
Po Lu |
Subject: |
master c7699b9: Fix mouse movement event generation on Haiku |
Date: |
Mon, 22 Nov 2021 02:12:41 -0500 (EST) |
branch: master
commit c7699b97022f5bdc3848d474485e0da5f2673595
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
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'.
---
src/haikuterm.c | 30 +++++++++++++++++++++++-------
src/haikuterm.h | 3 +++
2 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/src/haikuterm.c b/src/haikuterm.c
index bc956f0..5364ebf 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 af55f68..7ed7485 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -30,6 +30,7 @@ along with GNU Emacs. If not, see
<https://www.gnu.org/licenses/>. */
#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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master c7699b9: Fix mouse movement event generation on Haiku,
Po Lu <=