summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2021-12-29 18:37:04 +0800
committerPo Lu <luangruo@yahoo.com>2021-12-29 18:37:04 +0800
commit7d672ed069f7936b9410f61cff2df97f804fabff (patch)
tree6378bd292726c9f90f6b0c18f260a52f88cebc4f
parent9d1312d8e9bf78c12a94fa075cda3c8ad7d1dad7 (diff)
downloademacs-7d672ed069f7936b9410f61cff2df97f804fabff.tar.gz
emacs-7d672ed069f7936b9410f61cff2df97f804fabff.tar.bz2
emacs-7d672ed069f7936b9410f61cff2df97f804fabff.zip
Translate state of XI2 entry events when sending them to xwidgets
* src/xwidget.c (xi_translate_notify_detail): New function. (xwidget_motion_or_crossing): Translate detail and state of GenericEvents before sending them to the widget.
-rw-r--r--src/xwidget.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index 671d0390a0b..30e9c2895d4 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -1229,6 +1229,28 @@ xwidget_scroll (struct xwidget_view *view, double x, double y,
}
#endif
+#ifdef HAVE_XINPUT2
+static GdkNotifyType
+xi_translate_notify_detail (int detail)
+{
+ switch (detail)
+ {
+ case NotifyInferior:
+ return GDK_NOTIFY_INFERIOR;
+ case NotifyAncestor:
+ return GDK_NOTIFY_ANCESTOR;
+ case NotifyVirtual:
+ return GDK_NOTIFY_VIRTUAL;
+ case NotifyNonlinear:
+ return GDK_NOTIFY_NONLINEAR;
+ case NotifyNonlinearVirtual:
+ return GDK_NOTIFY_NONLINEAR_VIRTUAL;
+ default:
+ emacs_abort ();
+ }
+}
+#endif
+
void
xwidget_motion_or_crossing (struct xwidget_view *view, const XEvent *event)
{
@@ -1306,6 +1328,19 @@ xwidget_motion_or_crossing (struct xwidget_view *view, const XEvent *event)
xg_event->crossing.y_root = (gdouble) xev->root_y;
xg_event->crossing.time = xev->time;
xg_event->crossing.focus = xev->focus;
+ xg_event->crossing.detail = xi_translate_notify_detail (xev->detail);
+ xg_event->crossing.state = xev->mods.effective;
+
+ if (xev->buttons.mask_len)
+ {
+ if (XIMaskIsSet (xev->buttons.mask, 1))
+ xg_event->crossing.state |= GDK_BUTTON1_MASK;
+ if (XIMaskIsSet (xev->buttons.mask, 2))
+ xg_event->crossing.state |= GDK_BUTTON2_MASK;
+ if (XIMaskIsSet (xev->buttons.mask, 3))
+ xg_event->crossing.state |= GDK_BUTTON3_MASK;
+ }
+
gdk_event_set_device (xg_event, find_suitable_pointer (view->frame));
}
#endif