[gtk/readonly-events-1: 47/74] x11: change event translator interface
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/readonly-events-1: 47/74] x11: change event translator interface
- Date: Tue, 18 Feb 2020 02:59:15 +0000 (UTC)
commit b919e4a58a912c165b971522e87b9c0a6d848424
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Feb 15 12:09:31 2020 -0500
x11: change event translator interface
Make the event translator return a new event, instead of
filling in a half-constructed one.
Update the two implementation in GdkX11Display and
GdkDeviceManagerXI2.
gdk/x11/gdkdevicemanager-xi2.c | 391 +++++++++++++++++++----------------------
gdk/x11/gdkdisplay-x11.c | 115 ++++--------
gdk/x11/gdkeventtranslator.c | 10 +-
gdk/x11/gdkeventtranslator.h | 7 +-
4 files changed, 216 insertions(+), 307 deletions(-)
---
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index 4c8a137bb5..9e763094ff 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -114,10 +114,9 @@ static void gdk_x11_device_manager_xi2_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
-static gboolean gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
- GdkDisplay *display,
- GdkEvent *event,
- const XEvent *xevent);
+static GdkEvent * gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
+ GdkDisplay *display,
+ const XEvent *xevent);
static GdkEventMask gdk_x11_device_manager_xi2_get_handled_events (GdkEventTranslator *translator);
static void gdk_x11_device_manager_xi2_select_surface_events (GdkEventTranslator *translator,
Window window,
@@ -1463,38 +1462,39 @@ _gdk_device_manager_xi2_handle_focus (GdkSurface *surface,
}
}
-static gboolean
+static GdkEvent *
gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
GdkDisplay *display,
- GdkEvent *event,
const XEvent *xevent)
{
GdkX11DeviceManagerXI2 *device_manager;
const XGenericEventCookie *cookie;
GdkDevice *device, *source_device;
- gboolean return_val = TRUE;
GdkSurface *surface;
GdkX11Surface *impl;
int scale;
XIEvent *ev;
+ GdkEvent *event;
+
+ event = NULL;
device_manager = (GdkX11DeviceManagerXI2 *) translator;
cookie = &xevent->xcookie;
if (xevent->type != GenericEvent ||
cookie->extension != device_manager->opcode)
- return FALSE;
+ return event;
ev = (XIEvent *) cookie->data;
if (!ev)
- return FALSE;
+ return NULL;
if (!get_event_surface (translator, ev, &surface))
- return FALSE;
+ return NULL;
if (surface && GDK_SURFACE_DESTROYED (surface))
- return FALSE;
+ return NULL;
scale = 1;
if (surface)
@@ -1507,7 +1507,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
ev->evtype == XI_ButtonRelease)
{
if (_gdk_x11_moveresize_handle_event (xevent))
- return FALSE;
+ return NULL;
}
switch (ev->evtype)
@@ -1515,17 +1515,14 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
case XI_HierarchyChanged:
handle_hierarchy_changed (device_manager,
(XIHierarchyEvent *) ev);
- return_val = FALSE;
break;
case XI_DeviceChanged:
handle_device_changed (device_manager,
(XIDeviceChangedEvent *) ev);
- return_val = FALSE;
break;
case XI_PropertyEvent:
handle_property_change (device_manager,
(XIPropertyEvent *) ev);
- return_val = FALSE;
break;
case XI_KeyPress:
case XI_KeyRelease:
@@ -1533,6 +1530,7 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
XIDeviceEvent *xev = (XIDeviceEvent *) ev;
GdkKeymap *keymap = gdk_display_get_keymap (display);
GdkModifierType consumed, state;
+ guint keyval;
GDK_DISPLAY_NOTE (display, EVENTS,
g_message ("key %s:\twindow %ld\n"
@@ -1545,38 +1543,39 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
xev->sourceid,
xev->detail));
- event->any.type = xev->evtype == XI_KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
-
- event->any.surface = surface;
-
- event->key.time = xev->time;
- event->key.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
- event->key.group = xev->group.effective;
-
- event->key.hardware_keycode = xev->detail;
- gdk_event_set_scancode (event, xev->detail);
- event->key.is_modifier = gdk_x11_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
+ state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->deviceid));
- gdk_event_set_device (event, device);
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
- gdk_event_set_source_device (event, source_device);
- event->key.keyval = GDK_KEY_VoidSymbol;
+ keyval = GDK_KEY_VoidSymbol;
gdk_keymap_translate_keyboard_state (keymap,
- event->key.hardware_keycode,
- event->key.state,
- event->key.group,
- &event->key.keyval,
+ xev->detail,
+ state,
+ xev->group.effective,
+ &keyval,
NULL, NULL, &consumed);
- state = event->key.state & ~consumed;
+ state &= ~consumed;
_gdk_x11_keymap_add_virt_mods (keymap, &state);
- event->key.state |= state;
+
+ event = gdk_event_key_new (xev->evtype == XI_KeyPress
+ ? GDK_KEY_PRESS
+ : GDK_KEY_RELEASE,
+ surface,
+ device,
+ source_device,
+ xev->time,
+ state,
+ keyval,
+ xev->detail,
+ xev->detail,
+ xev->group.effective,
+ gdk_x11_keymap_key_is_modifier (keymap, xev->detail));
if (ev->evtype == XI_KeyPress)
set_user_time (event);
@@ -1616,76 +1615,78 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
else if (ev->evtype == XI_ButtonPress &&
(xev->detail >= 4 && xev->detail <= 7))
{
+ GdkScrollDirection direction;
+
/* Button presses of button 4-7 are scroll events */
- event->any.type = GDK_SCROLL;
if (xev->detail == 4)
- event->scroll.direction = GDK_SCROLL_UP;
+ direction = GDK_SCROLL_UP;
else if (xev->detail == 5)
- event->scroll.direction = GDK_SCROLL_DOWN;
+ direction = GDK_SCROLL_DOWN;
else if (xev->detail == 6)
- event->scroll.direction = GDK_SCROLL_LEFT;
+ direction = GDK_SCROLL_LEFT;
else
- event->scroll.direction = GDK_SCROLL_RIGHT;
-
- event->any.surface = surface;
- event->scroll.time = xev->time;
- event->scroll.x = (gdouble) xev->event_x / scale;
- event->scroll.y = (gdouble) xev->event_y / scale;
- event->scroll.delta_x = 0;
- event->scroll.delta_y = 0;
+ direction = GDK_SCROLL_RIGHT;
device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->deviceid));
- gdk_event_set_device (event, device);
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
- gdk_event_set_source_device (event, source_device);
- event->scroll.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group);
+ event = gdk_event_discrete_scroll_new (surface,
+ device,
+ source_device,
+ NULL,
+ xev->time,
+ _gdk_x11_device_xi2_translate_state (&xev->mods,
&xev->buttons, &xev->group),
+ direction,
+ FALSE);
+
}
else
{
- event->any.type = (ev->evtype == XI_ButtonPress) ? GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE;
-
- event->any.surface = surface;
- event->button.time = xev->time;
- event->button.x = (gdouble) xev->event_x / scale;
- event->button.y = (gdouble) xev->event_y / scale;
+ double x, y;
+ double *axes;
device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->deviceid));
- gdk_event_set_device (event, device);
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
- gdk_event_set_source_device (event, source_device);
- gdk_event_set_device_tool (event, source_device->last_tool);
- event->button.axes = translate_axes (device,
- event->button.x,
- event->button.y,
- event->any.surface,
- &xev->valuators);
+ axes = translate_axes (device,
+ event->button.x,
+ event->button.y,
+ event->any.surface,
+ &xev->valuators);
if (gdk_device_get_mode (device) == GDK_MODE_SURFACE)
{
/* Update event coordinates from axes */
- gdk_device_get_axis (device, event->button.axes, GDK_AXIS_X, &event->button.x);
- gdk_device_get_axis (device, event->button.axes, GDK_AXIS_Y, &event->button.y);
+ gdk_device_get_axis (device, event->button.axes, GDK_AXIS_X, &x);
+ gdk_device_get_axis (device, event->button.axes, GDK_AXIS_Y, &y);
+ }
+ else
+ {
+ x = (double) xev->event_x / scale;
+ y = (double) xev->event_y / scale;
}
- event->button.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group);
-
- event->button.button = xev->detail;
+ event = gdk_event_button_new (ev->evtype == XI_ButtonPress
+ ? GDK_BUTTON_PRESS
+ : GDK_BUTTON_RELEASE,
+ surface,
+ device,
+ source_device,
+ source_device->last_tool,
+ xev->time,
+ _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group),
+ xev->detail,
+ x, y,
+ axes);
}
- if (return_val == FALSE)
- break;
-
- gdk_event_set_display (event, display);
-
if (ev->evtype == XI_ButtonPress)
set_user_time (event);
@@ -1697,6 +1698,9 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
XIDeviceEvent *xev = (XIDeviceEvent *) ev;
gdouble delta_x, delta_y;
+ double x, y;
+ double *axes;
+
#ifdef XINPUT_2_2
if (xev->flags & XIPointerEmulated)
return FALSE;
@@ -1719,56 +1723,50 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
scroll_valuators_changed (GDK_X11_DEVICE_XI2 (source_device),
&xev->valuators, &delta_x, &delta_y))
{
- event->any.type = GDK_SCROLL;
- event->scroll.direction = GDK_SCROLL_SMOOTH;
-
- if (delta_x == 0.0 && delta_y == 0.0)
- event->scroll.is_stop = TRUE;
-
GDK_DISPLAY_NOTE (display, EVENTS,
g_message ("smooth scroll: \n\tdevice: %u\n\tsource device: %u\n\twindow %ld\n\tdeltas:
%f %f",
xev->deviceid, xev->sourceid,
xev->event, delta_x, delta_y));
-
- event->any.surface = surface;
- event->scroll.time = xev->time;
- event->scroll.x = (gdouble) xev->event_x / scale;
- event->scroll.y = (gdouble) xev->event_y / scale;
- event->scroll.delta_x = delta_x;
- event->scroll.delta_y = delta_y;
-
- gdk_event_set_device (event, device);
- gdk_event_set_source_device (event, source_device);
-
- event->scroll.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group);
+ event = gdk_event_scroll_new (surface,
+ device,
+ source_device,
+ NULL,
+ xev->time,
+ _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group),
+ delta_x,
+ delta_y,
+ delta_x == 0.0 && delta_y == 0.0);
break;
}
- event->any.type = GDK_MOTION_NOTIFY;
- event->any.surface = surface;
- event->motion.time = xev->time;
- event->motion.x = (gdouble) xev->event_x / scale;
- event->motion.y = (gdouble) xev->event_y / scale;
-
- gdk_event_set_device (event, device);
- gdk_event_set_source_device (event, source_device);
- gdk_event_set_device_tool (event, source_device->last_tool);
-
- event->motion.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
-
- event->motion.axes = translate_axes (device,
- event->motion.x,
- event->motion.y,
- event->any.surface,
- &xev->valuators);
+ axes = translate_axes (device,
+ event->motion.x,
+ event->motion.y,
+ event->any.surface,
+ &xev->valuators);
if (gdk_device_get_mode (device) == GDK_MODE_SURFACE)
{
/* Update event coordinates from axes */
- gdk_device_get_axis (device, event->motion.axes, GDK_AXIS_X, &event->motion.x);
- gdk_device_get_axis (device, event->motion.axes, GDK_AXIS_Y, &event->motion.y);
+ gdk_device_get_axis (device, event->motion.axes, GDK_AXIS_X, &x);
+ gdk_device_get_axis (device, event->motion.axes, GDK_AXIS_Y, &y);
+ }
+ else
+ {
+ x = (double) xev->event_x / scale;
+ y = (double) xev->event_y / scale;
}
+
+ event = gdk_event_motion_new (surface,
+ device,
+ source_device,
+ source_device->last_tool,
+ xev->time,
+ _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group),
+ x, y,
+ axes);
+
}
break;
@@ -1777,6 +1775,10 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
case XI_TouchEnd:
{
XIDeviceEvent *xev = (XIDeviceEvent *) ev;
+ GdkModifierType state;
+
+ double x, y;
+ double *axes;
GDK_DISPLAY_NOTE (display, EVENTS,
g_message ("touch %s:\twindow %ld\n\ttouch id: %u\n\tpointer emulating: %s",
@@ -1785,54 +1787,45 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
xev->detail,
xev->flags & XITouchEmulatingPointer ? "true" : "false"));
- if (ev->evtype == XI_TouchBegin)
- event->any.type = GDK_TOUCH_BEGIN;
- else if (ev->evtype == XI_TouchEnd)
- event->any.type = GDK_TOUCH_END;
-
- event->any.surface = surface;
- event->touch.time = xev->time;
- event->touch.x = (gdouble) xev->event_x / scale;
- event->touch.y = (gdouble) xev->event_y / scale;
-
device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->deviceid));
- gdk_event_set_device (event, device);
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
- gdk_event_set_source_device (event, source_device);
- event->touch.axes = translate_axes (device,
- event->touch.x,
- event->touch.y,
- event->any.surface,
- &xev->valuators);
+ state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
+ if (ev->evtype == XI_TouchBegin)
+ state |= GDK_BUTTON1_MASK;
+
+ axes = translate_axes (device,
+ event->touch.x,
+ event->touch.y,
+ event->any.surface,
+ &xev->valuators);
if (gdk_device_get_mode (device) == GDK_MODE_SURFACE)
{
/* Update event coordinates from axes */
- gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_X, &event->touch.x);
- gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_Y, &event->touch.y);
+ gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_X, &x);
+ gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_Y, &y);
}
-
- event->touch.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
-
- if (ev->evtype == XI_TouchBegin)
- event->touch.state |= GDK_BUTTON1_MASK;
-
- event->touch.sequence = GUINT_TO_POINTER (xev->detail);
-
- if (xev->flags & XITouchEmulatingPointer)
+ else
{
- event->touch.emulating_pointer = TRUE;
- gdk_event_set_pointer_emulated (event, TRUE);
+ x = (double) xev->event_x / scale;
+ y = (double) xev->event_y / scale;
}
-
- if (return_val == FALSE)
- break;
-
- gdk_event_set_display (event, display);
+ event = gdk_event_touch_new (ev->evtype == XI_TouchBegin
+ ? GDK_TOUCH_BEGIN
+ : GDK_TOUCH_END,
+ GUINT_TO_POINTER (xev->detail),
+ surface,
+ device,
+ source_device,
+ xev->time,
+ state,
+ x, y,
+ axes,
+ xev->flags & XITouchEmulatingPointer);
if (ev->evtype == XI_TouchBegin)
set_user_time (event);
@@ -1842,6 +1835,10 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
case XI_TouchUpdate:
{
XIDeviceEvent *xev = (XIDeviceEvent *) ev;
+ GdkModifierType state;
+
+ double x, y;
+ double *axes;
GDK_DISPLAY_NOTE (display, EVENTS,
g_message ("touch update:\twindow %ld\n\ttouch id: %u\n\tpointer emulating: %s",
@@ -1849,43 +1846,43 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
xev->detail,
xev->flags & XITouchEmulatingPointer ? "true" : "false"));
- event->any.surface = surface;
- event->touch.sequence = GUINT_TO_POINTER (xev->detail);
- event->any.type = GDK_TOUCH_UPDATE;
- event->touch.time = xev->time;
- event->touch.x = (gdouble) xev->event_x / scale;
- event->touch.y = (gdouble) xev->event_y / scale;
-
device = g_hash_table_lookup (device_manager->id_table,
GINT_TO_POINTER (xev->deviceid));
- gdk_event_set_device (event, device);
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
- gdk_event_set_source_device (event, source_device);
-
- event->touch.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
- event->touch.state |= GDK_BUTTON1_MASK;
+ state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
+ state |= GDK_BUTTON1_MASK;
- if (xev->flags & XITouchEmulatingPointer)
- {
- event->touch.emulating_pointer = TRUE;
- gdk_event_set_pointer_emulated (event, TRUE);
- }
-
- event->touch.axes = translate_axes (device,
- event->touch.x,
- event->touch.y,
- event->any.surface,
- &xev->valuators);
+ axes = translate_axes (device,
+ event->touch.x,
+ event->touch.y,
+ event->any.surface,
+ &xev->valuators);
if (gdk_device_get_mode (device) == GDK_MODE_SURFACE)
{
/* Update event coordinates from axes */
- gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_X, &event->touch.x);
- gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_Y, &event->touch.y);
+ gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_X, &x);
+ gdk_device_get_axis (device, event->touch.axes, GDK_AXIS_Y, &y);
+ }
+ else
+ {
+ x = (double) xev->event_x / scale;
+ y = (double) xev->event_y / scale;
}
+
+ event = gdk_event_touch_new (GDK_TOUCH_UPDATE,
+ GUINT_TO_POINTER (xev->detail),
+ surface,
+ device,
+ source_device,
+ xev->time,
+ state,
+ x, y,
+ axes,
+ xev->flags & XITouchEmulatingPointer);
}
break;
#endif /* XINPUT_2_2 */
@@ -1904,23 +1901,11 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
xev->deviceid, xev->sourceid,
xev->detail, xev->mode));
- event->any.type = (ev->evtype == XI_Enter) ? GDK_ENTER_NOTIFY : GDK_LEAVE_NOTIFY;
-
- event->crossing.x = (gdouble) xev->event_x / scale;
- event->crossing.y = (gdouble) xev->event_y / scale;
- event->crossing.time = xev->time;
- event->crossing.focus = xev->focus;
-
- event->any.surface = surface;
- event->crossing.child_surface = gdk_x11_surface_lookup_for_display (display, xev->child);
-
device = g_hash_table_lookup (device_manager->id_table,
GINT_TO_POINTER (xev->deviceid));
- gdk_event_set_device (event, device);
source_device = g_hash_table_lookup (device_manager->id_table,
GUINT_TO_POINTER (xev->sourceid));
- gdk_event_set_source_device (event, source_device);
if (ev->evtype == XI_Enter &&
xev->detail != XINotifyInferior && xev->mode != XINotifyPassiveUngrab &&
@@ -1941,9 +1926,19 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
}
}
- event->crossing.mode = translate_crossing_mode (xev->mode);
- event->crossing.detail = translate_notify_type (xev->detail);
- event->crossing.state = _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons, &xev->group);
+ event = gdk_event_crossing_new (ev->evtype == XI_Enter
+ ? GDK_ENTER_NOTIFY
+ : GDK_LEAVE_NOTIFY,
+ surface,
+ device,
+ source_device,
+ xev->time,
+ _gdk_x11_device_xi2_translate_state (&xev->mods, &xev->buttons,
&xev->group),
+ (double) xev->event_x / scale,
+ (double) xev->event_y / scale,
+ translate_crossing_mode (xev->mode),
+ translate_notify_type (xev->detail));
+
}
break;
case XI_FocusIn:
@@ -1967,35 +1962,13 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
xev->detail,
xev->mode);
}
-
- return_val = FALSE;
}
break;
default:
- return_val = FALSE;
break;
}
- event->any.send_event = cookie->send_event;
-
- if (return_val)
- {
- if (event->any.surface)
- g_object_ref (event->any.surface);
-
- if (((event->any.type == GDK_ENTER_NOTIFY) ||
- (event->any.type == GDK_LEAVE_NOTIFY)) &&
- (event->crossing.child_surface != NULL))
- g_object_ref (event->crossing.child_surface);
- }
- else
- {
- /* Mark this event as having no resources to be freed */
- event->any.surface = NULL;
- event->any.type = GDK_NOTHING;
- }
-
- return return_val;
+ return event;
}
static GdkEventMask
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 40bd26c0b4..ae5ad23719 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -106,10 +106,9 @@ static void gdk_x11_display_finalize (GObject *object);
static void gdk_x11_display_event_translator_init (GdkEventTranslatorIface *iface);
-static gboolean gdk_x11_display_translate_event (GdkEventTranslator *translator,
- GdkDisplay *display,
- GdkEvent *event,
- const XEvent *xevent);
+static GdkEvent * gdk_x11_display_translate_event (GdkEventTranslator *translator,
+ GdkDisplay *display,
+ const XEvent *xevent);
static void gdk_internal_connection_watch (Display *display,
XPointer arg,
@@ -630,10 +629,9 @@ get_event_xwindow (const XEvent *xevent)
return xwindow;
}
-static gboolean
+static GdkEvent *
gdk_x11_display_translate_event (GdkEventTranslator *translator,
GdkDisplay *display,
- GdkEvent *event,
const XEvent *xevent)
{
Window xwindow;
@@ -643,7 +641,9 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
GdkX11Screen *x11_screen = NULL;
GdkToplevelX11 *toplevel = NULL;
GdkX11Display *display_x11 = GDK_X11_DISPLAY (display);
- gboolean return_val;
+ GdkEvent *event;
+
+ event = NULL;
/* Find the GdkSurface that this event relates to. If that's
* not the same as the surface that the event was sent to,
@@ -665,7 +665,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
* and ShmCompletion for pixmaps
*/
if (!GDK_IS_SURFACE (surface))
- return FALSE;
+ return NULL;
x11_screen = GDK_SURFACE_SCREEN (surface);
toplevel = _gdk_x11_surface_get_toplevel (surface);
@@ -674,16 +674,10 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
g_object_ref (surface);
}
- event->any.surface = surface;
- event->any.send_event = xevent->xany.send_event ? TRUE : FALSE;
-
if (surface && GDK_SURFACE_DESTROYED (surface))
{
if (xevent->type != DestroyNotify)
- {
- return_val = FALSE;
- goto done;
- }
+ goto done;
}
if (xevent->type == DestroyNotify && !is_substructure)
@@ -700,7 +694,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
/* careful, reentrancy */
_gdk_x11_screen_window_manager_changed (x11_screen);
- return_val = FALSE;
goto done;
}
}
@@ -712,15 +705,12 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
* received.
*/
- return_val = TRUE;
-
switch (xevent->type)
{
case KeymapNotify:
GDK_DISPLAY_NOTE (display, EVENTS, g_message ("keymap notify"));
/* Not currently handled */
- return_val = FALSE;
break;
case Expose:
@@ -732,10 +722,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
event->any.send_event ? " (send)" : ""));
if (surface == NULL)
- {
- return_val = FALSE;
- break;
- }
+ break;
{
GdkRectangle expose_rect;
@@ -751,7 +738,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
expose_rect.height = y2 - expose_rect.y;
gdk_surface_invalidate_rect (surface, &expose_rect);
- return_val = FALSE;
}
break;
@@ -766,10 +752,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
xevent->xgraphicsexpose.drawable));
if (surface == NULL)
- {
- return_val = FALSE;
- break;
- }
+ break;
expose_rect.x = xevent->xgraphicsexpose.x / surface_impl->surface_scale;
expose_rect.y = xevent->xgraphicsexpose.y / surface_impl->surface_scale;
@@ -781,7 +764,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
expose_rect.height = y2 - expose_rect.y;
gdk_surface_invalidate_rect (surface, &expose_rect);
- return_val = FALSE;
}
break;
@@ -807,7 +789,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
}
#endif /* G_ENABLE_DEBUG */
/* not handled */
- return_val = FALSE;
break;
case CreateNotify:
@@ -831,17 +812,11 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
if (!is_substructure)
{
- /* handle destroy like delete */
- event->any.type = GDK_DELETE;
- event->any.surface = surface;
-
- return_val = surface && !GDK_SURFACE_DESTROYED (surface);
+ event = gdk_event_delete_new (surface);
if (surface && GDK_SURFACE_XID (surface) != x11_screen->xroot_window)
gdk_surface_destroy_notify (surface);
}
- else
- return_val = FALSE;
break;
@@ -887,8 +862,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
gdk_profiler_add_markf (g_get_monotonic_time (), 0, "unmapped window", "0x%lx", GDK_SURFACE_XID
(surface));
}
- return_val = FALSE;
-
break;
case MapNotify:
@@ -914,8 +887,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
}
}
- return_val = FALSE;
-
break;
case ReparentNotify:
@@ -928,7 +899,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
xevent->xreparent.override_redirect));
/* Not currently handled */
- return_val = FALSE;
break;
case ConfigureNotify:
@@ -957,15 +927,14 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
}
#endif
- if (!surface ||
- xevent->xconfigure.event != xevent->xconfigure.window)
- return_val = FALSE;
- else
- {
- event->any.type = GDK_CONFIGURE;
- event->any.surface = surface;
- event->configure.width = (xevent->xconfigure.width + surface_impl->surface_scale - 1) /
surface_impl->surface_scale;
- event->configure.height = (xevent->xconfigure.height + surface_impl->surface_scale - 1) /
surface_impl->surface_scale;
+ if (surface &&
+ xevent->xconfigure.event == xevent->xconfigure.window)
+ {
+ int x, y;
+
+ event = gdk_event_configure_new (surface,
+ (xevent->xconfigure.width + surface_impl->surface_scale - 1) /
surface_impl->surface_scale,
+ (xevent->xconfigure.height + surface_impl->surface_scale - 1) /
surface_impl->surface_scale);
if (!xevent->xconfigure.send_event &&
!xevent->xconfigure.override_redirect &&
@@ -975,6 +944,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
gint ty = 0;
Window child_window = 0;
+ x = y = 0;
gdk_x11_display_error_trap_push (display);
if (XTranslateCoordinates (GDK_SURFACE_XDISPLAY (surface),
GDK_SURFACE_XID (surface),
@@ -983,23 +953,22 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
&tx, &ty,
&child_window))
{
- event->configure.x = tx / surface_impl->surface_scale;
- event->configure.y = ty / surface_impl->surface_scale;
+ x = tx / surface_impl->surface_scale;
+ y = ty / surface_impl->surface_scale;
}
gdk_x11_display_error_trap_pop_ignored (display);
}
else
{
- event->configure.x = xevent->xconfigure.x / surface_impl->surface_scale;
- event->configure.y = xevent->xconfigure.y / surface_impl->surface_scale;
+ x = xevent->xconfigure.x / surface_impl->surface_scale;
+ y = xevent->xconfigure.y / surface_impl->surface_scale;
}
if (!is_substructure)
{
- if (surface->x != event->configure.x ||
- surface->y != event->configure.y)
+ if (surface->x != x || surface->y != y)
{
- surface->x = event->configure.x;
- surface->y = event->configure.y;
+ surface->x = x;
+ surface->y = y;
}
if (surface_impl->unscaled_width != xevent->xconfigure.width ||
@@ -1037,10 +1006,7 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
"\""));
if (surface == NULL)
- {
- return_val = FALSE;
- break;
- }
+ break;
/* We compare with the serial of the last time we mapped the
* window to avoid refetching properties that we set ourselves
@@ -1057,8 +1023,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
if (xevent->xproperty.atom == gdk_x11_get_xatom_by_name_for_display (display,
"_GTK_EDGE_CONSTRAINTS"))
gdk_check_edge_constraints_changed (surface);
}
-
- return_val = FALSE;
break;
case ColormapNotify:
@@ -1067,7 +1031,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
xevent->xcolormap.window));
/* Not currently handled */
- return_val = FALSE;
break;
case ClientMessage:
@@ -1076,7 +1039,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
xevent->xclient.window));
/* Not currently handled */
- return_val = FALSE;
break;
case MappingNotify:
@@ -1087,7 +1049,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
*/
XRefreshKeyboardMapping ((XMappingEvent *) xevent);
_gdk_x11_keymap_keys_changed (display);
- return_val = FALSE;
break;
default:
@@ -1110,8 +1071,6 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
case XkbNewKeyboardNotify:
case XkbMapNotify:
_gdk_x11_keymap_keys_changed (display);
-
- return_val = FALSE;
break;
case XkbStateNotify:
@@ -1121,28 +1080,14 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
break;
}
}
- else
#endif
- return_val = FALSE;
}
done:
- if (return_val)
- {
- if (event->any.surface)
- g_object_ref (event->any.surface);
- }
- else
- {
- /* Mark this event as having no resources to be freed */
- event->any.surface = NULL;
- event->any.type = GDK_NOTHING;
- }
-
if (surface)
g_object_unref (surface);
- return return_val;
+ return event;
}
static GdkFrameTimings *
diff --git a/gdk/x11/gdkeventtranslator.c b/gdk/x11/gdkeventtranslator.c
index d475ce0148..7a4a1b3a11 100644
--- a/gdk/x11/gdkeventtranslator.c
+++ b/gdk/x11/gdkeventtranslator.c
@@ -36,7 +36,6 @@ _gdk_x11_event_translator_translate (GdkEventTranslator *translator,
const XEvent *xevent)
{
GdkEventTranslatorIface *iface;
- GdkEvent *event;
g_return_val_if_fail (GDK_IS_EVENT_TRANSLATOR (translator), NULL);
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
@@ -46,14 +45,7 @@ _gdk_x11_event_translator_translate (GdkEventTranslator *translator,
if (!iface->translate_event)
return NULL;
- event = gdk_event_new (GDK_NOTHING);
-
- if ((iface->translate_event) (translator, display, event, xevent))
- return event;
-
- g_object_unref (event);
-
- return NULL;
+ return (iface->translate_event) (translator, display, xevent);
}
GdkEventMask
diff --git a/gdk/x11/gdkeventtranslator.h b/gdk/x11/gdkeventtranslator.h
index 96a3a0b69e..4d3ea95154 100644
--- a/gdk/x11/gdkeventtranslator.h
+++ b/gdk/x11/gdkeventtranslator.h
@@ -38,10 +38,9 @@ struct _GdkEventTranslatorIface
GTypeInterface iface;
/* VMethods */
- gboolean (* translate_event) (GdkEventTranslator *translator,
- GdkDisplay *display,
- GdkEvent *event,
- const XEvent *xevent);
+ GdkEvent * (* translate_event) (GdkEventTranslator *translator,
+ GdkDisplay *display,
+ const XEvent *xevent);
GdkEventMask (* get_handled_events) (GdkEventTranslator *translator);
void (* select_surface_events) (GdkEventTranslator *translator,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]