mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 08:00:42 -05:00
wayland: Remove the motion event synthesizing
The event handling code for Wayland no longer needs to synthesize X events for the motion events because the main display code now handles motion events directly off of the Clutter events instead of off the X events.
This commit is contained in:
parent
4492845528
commit
e0df9eee28
@ -3028,8 +3028,7 @@ xevent_callback (XEvent *event,
|
|||||||
translation altogether by directly using the Clutter events */
|
translation altogether by directly using the Clutter events */
|
||||||
if (meta_is_wayland_compositor () &&
|
if (meta_is_wayland_compositor () &&
|
||||||
event->type == GenericEvent &&
|
event->type == GenericEvent &&
|
||||||
(event->xcookie.evtype == XI_Motion ||
|
(event->xcookie.evtype == XI_KeyPress ||
|
||||||
event->xcookie.evtype == XI_KeyPress ||
|
|
||||||
event->xcookie.evtype == XI_KeyRelease))
|
event->xcookie.evtype == XI_KeyRelease))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -357,7 +357,7 @@ handle_button_event (MetaWaylandSeat *seat,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: synth a XI2 event and handle in display.c */
|
/* FIXME: Handle in display.c */
|
||||||
if (state && pointer->button_count == 1)
|
if (state && pointer->button_count == 1)
|
||||||
{
|
{
|
||||||
MetaWaylandSurface *surface = pointer->current;
|
MetaWaylandSurface *surface = pointer->current;
|
||||||
|
@ -533,117 +533,6 @@ stage_destroy_cb (void)
|
|||||||
|
|
||||||
#define N_BUTTONS 5
|
#define N_BUTTONS 5
|
||||||
|
|
||||||
static void
|
|
||||||
synthesize_motion_event (MetaWaylandCompositor *compositor,
|
|
||||||
const ClutterEvent *event)
|
|
||||||
{
|
|
||||||
/* We want to synthesize X events for mouse motion events so that we
|
|
||||||
don't have to rely on the X server's window position being
|
|
||||||
synched with the surface position. See the comment in
|
|
||||||
event_callback() in display.c */
|
|
||||||
MetaWaylandSeat *seat = compositor->seat;
|
|
||||||
MetaWaylandPointer *pointer = &seat->pointer;
|
|
||||||
MetaWaylandSurface *surface;
|
|
||||||
XGenericEventCookie generic_event;
|
|
||||||
XIDeviceEvent device_event;
|
|
||||||
unsigned char button_mask[(N_BUTTONS + 7) / 8] = { 0 };
|
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
ClutterModifierType button_state;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
generic_event.type = GenericEvent;
|
|
||||||
generic_event.serial = 0;
|
|
||||||
generic_event.send_event = False;
|
|
||||||
generic_event.display = display->xdisplay;
|
|
||||||
generic_event.extension = display->xinput_opcode;
|
|
||||||
generic_event.evtype = XI_Motion;
|
|
||||||
/* Mutter assumes the data for the event is already retrieved by GDK
|
|
||||||
* so we don't need the cookie */
|
|
||||||
generic_event.cookie = 0;
|
|
||||||
generic_event.data = &device_event;
|
|
||||||
|
|
||||||
memcpy (&device_event, &generic_event, sizeof (XGenericEvent));
|
|
||||||
|
|
||||||
device_event.time = clutter_event_get_time (event);
|
|
||||||
device_event.deviceid = clutter_event_get_device_id (event);
|
|
||||||
device_event.sourceid = 0; /* not used, not sure what this should be */
|
|
||||||
device_event.detail = 0;
|
|
||||||
device_event.root = DefaultRootWindow (display->xdisplay);
|
|
||||||
device_event.flags = 0 /* not used for motion events */;
|
|
||||||
|
|
||||||
if (compositor->implicit_grab_surface)
|
|
||||||
surface = compositor->implicit_grab_surface;
|
|
||||||
else
|
|
||||||
surface = pointer->current;
|
|
||||||
|
|
||||||
if (surface == pointer->current)
|
|
||||||
{
|
|
||||||
device_event.event_x = wl_fixed_to_int (pointer->current_x);
|
|
||||||
device_event.event_y = wl_fixed_to_int (pointer->current_y);
|
|
||||||
}
|
|
||||||
else if (surface && surface->window)
|
|
||||||
{
|
|
||||||
ClutterActor *window_actor =
|
|
||||||
CLUTTER_ACTOR (meta_window_get_compositor_private (surface->window));
|
|
||||||
|
|
||||||
if (window_actor)
|
|
||||||
{
|
|
||||||
float ax, ay;
|
|
||||||
|
|
||||||
clutter_actor_transform_stage_point (window_actor,
|
|
||||||
wl_fixed_to_double (pointer->x),
|
|
||||||
wl_fixed_to_double (pointer->y),
|
|
||||||
&ax, &ay);
|
|
||||||
|
|
||||||
device_event.event_x = ax;
|
|
||||||
device_event.event_y = ay;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
device_event.event_x = wl_fixed_to_double (pointer->x);
|
|
||||||
device_event.event_y = wl_fixed_to_double (pointer->y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
device_event.event_x = wl_fixed_to_double (pointer->x);
|
|
||||||
device_event.event_y = wl_fixed_to_double (pointer->y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (surface && surface->window != NULL)
|
|
||||||
device_event.event = surface->window->xwindow;
|
|
||||||
else
|
|
||||||
device_event.event = device_event.root;
|
|
||||||
|
|
||||||
/* Mutter doesn't really know about the sub-windows. This assumes it
|
|
||||||
doesn't care either */
|
|
||||||
device_event.child = device_event.event;
|
|
||||||
device_event.root_x = wl_fixed_to_double (pointer->x);
|
|
||||||
device_event.root_y = wl_fixed_to_double (pointer->y);
|
|
||||||
|
|
||||||
clutter_event_get_state_full (event,
|
|
||||||
&button_state,
|
|
||||||
(ClutterModifierType*)&device_event.mods.base,
|
|
||||||
(ClutterModifierType*)&device_event.mods.latched,
|
|
||||||
(ClutterModifierType*)&device_event.mods.locked,
|
|
||||||
(ClutterModifierType*)&device_event.mods.effective);
|
|
||||||
device_event.mods.effective &= ~button_state;
|
|
||||||
memset (&device_event.group, 0, sizeof (device_event.group));
|
|
||||||
device_event.group.effective = (device_event.mods.effective >> 13) & 0x3;
|
|
||||||
|
|
||||||
for (i = 0; i < N_BUTTONS; i++)
|
|
||||||
if ((button_state & (CLUTTER_BUTTON1_MASK << i)))
|
|
||||||
XISetMask (button_mask, i + 1);
|
|
||||||
device_event.buttons.mask_len = N_BUTTONS + 1;
|
|
||||||
device_event.buttons.mask = button_mask;
|
|
||||||
|
|
||||||
device_event.valuators.mask_len = 0;
|
|
||||||
device_event.valuators.mask = NULL;
|
|
||||||
device_event.valuators.values = NULL;
|
|
||||||
|
|
||||||
meta_display_handle_xevent (display, (XEvent *) &generic_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
reset_idletimes (const ClutterEvent *event)
|
reset_idletimes (const ClutterEvent *event)
|
||||||
{
|
{
|
||||||
@ -736,10 +625,6 @@ event_cb (ClutterActor *stage,
|
|||||||
compositor->implicit_grab_surface = NULL;
|
compositor->implicit_grab_surface = NULL;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
case CLUTTER_MOTION:
|
|
||||||
synthesize_motion_event (compositor, event);
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user