mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 19:40:43 -05:00
Add META_GRAB_OP_WAYLAND_CLIENT
Which is used for Wayland popup grabs. The issue here is that we don't want the code that raises or focuses windows based on mouse ops to run while a client has a grab. We still keep the "old" grab infrastructure in place for now, but ideally we'd replace it eventually with a better grab-op infrastructure.
This commit is contained in:
parent
dd8d8e436d
commit
81eb7d9537
@ -1418,6 +1418,20 @@ meta_grab_op_is_moving (MetaGrabOp op)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
grab_op_should_block_mouse_events (MetaGrabOp op)
|
||||||
|
{
|
||||||
|
switch (op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_WAYLAND_CLIENT:
|
||||||
|
case META_GRAB_OP_COMPOSITOR:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_display_xserver_time_is_before:
|
* meta_display_xserver_time_is_before:
|
||||||
* @display: a #MetaDisplay
|
* @display: a #MetaDisplay
|
||||||
@ -2054,7 +2068,7 @@ meta_display_handle_event (MetaDisplay *display,
|
|||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
case CLUTTER_BUTTON_PRESS:
|
case CLUTTER_BUTTON_PRESS:
|
||||||
if (display->grab_op == META_GRAB_OP_COMPOSITOR)
|
if (grab_op_should_block_mouse_events (display->grab_op))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
display->overlay_key_only_pressed = FALSE;
|
display->overlay_key_only_pressed = FALSE;
|
||||||
@ -2226,7 +2240,7 @@ meta_display_handle_event (MetaDisplay *display,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CLUTTER_BUTTON_RELEASE:
|
case CLUTTER_BUTTON_RELEASE:
|
||||||
if (display->grab_op == META_GRAB_OP_COMPOSITOR)
|
if (grab_op_should_block_mouse_events (display->grab_op))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
display->overlay_key_only_pressed = FALSE;
|
display->overlay_key_only_pressed = FALSE;
|
||||||
@ -2240,7 +2254,7 @@ meta_display_handle_event (MetaDisplay *display,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CLUTTER_MOTION:
|
case CLUTTER_MOTION:
|
||||||
if (display->grab_op == META_GRAB_OP_COMPOSITOR)
|
if (grab_op_should_block_mouse_events (display->grab_op))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (display->grab_window == window &&
|
if (display->grab_window == window &&
|
||||||
@ -2274,6 +2288,10 @@ meta_display_handle_event (MetaDisplay *display,
|
|||||||
if (display->grab_op == META_GRAB_OP_COMPOSITOR)
|
if (display->grab_op == META_GRAB_OP_COMPOSITOR)
|
||||||
bypass_wayland = TRUE;
|
bypass_wayland = TRUE;
|
||||||
|
|
||||||
|
/* If a Wayland client has a grab, don't pass that through to Clutter */
|
||||||
|
if (display->grab_op == META_GRAB_OP_WAYLAND_CLIENT)
|
||||||
|
bypass_clutter = TRUE;
|
||||||
|
|
||||||
if (compositor && !bypass_wayland)
|
if (compositor && !bypass_wayland)
|
||||||
{
|
{
|
||||||
if (meta_wayland_compositor_handle_event (compositor, event))
|
if (meta_wayland_compositor_handle_event (compositor, event))
|
||||||
|
@ -228,7 +228,10 @@ typedef enum
|
|||||||
META_GRAB_OP_CLICKING_UNSTICK,
|
META_GRAB_OP_CLICKING_UNSTICK,
|
||||||
|
|
||||||
/* Special grab op when the compositor asked for a grab */
|
/* Special grab op when the compositor asked for a grab */
|
||||||
META_GRAB_OP_COMPOSITOR
|
META_GRAB_OP_COMPOSITOR,
|
||||||
|
|
||||||
|
/* For when a client takes a popup grab */
|
||||||
|
META_GRAB_OP_WAYLAND_CLIENT,
|
||||||
} MetaGrabOp;
|
} MetaGrabOp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -478,6 +478,12 @@ meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer)
|
|||||||
g_slice_free (MetaWaylandPopup, popup);
|
g_slice_free (MetaWaylandPopup, popup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
meta_display_end_grab_op (display,
|
||||||
|
meta_display_get_current_time_roundtrip (display));
|
||||||
|
}
|
||||||
|
|
||||||
meta_wayland_pointer_end_grab (pointer);
|
meta_wayland_pointer_end_grab (pointer);
|
||||||
g_slice_free (MetaWaylandPopupGrab, popup_grab);
|
g_slice_free (MetaWaylandPopupGrab, popup_grab);
|
||||||
}
|
}
|
||||||
@ -517,6 +523,8 @@ meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
|||||||
|
|
||||||
if (pointer->grab == &pointer->default_grab)
|
if (pointer->grab == &pointer->default_grab)
|
||||||
{
|
{
|
||||||
|
MetaWindow *window = surface->window;
|
||||||
|
|
||||||
grab = g_slice_new0 (MetaWaylandPopupGrab);
|
grab = g_slice_new0 (MetaWaylandPopupGrab);
|
||||||
grab->generic.interface = &popup_grab_interface;
|
grab->generic.interface = &popup_grab_interface;
|
||||||
grab->generic.pointer = pointer;
|
grab->generic.pointer = pointer;
|
||||||
@ -524,6 +532,19 @@ meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
|||||||
wl_list_init (&grab->all_popups);
|
wl_list_init (&grab->all_popups);
|
||||||
|
|
||||||
meta_wayland_pointer_start_grab (pointer, (MetaWaylandPointerGrab*)grab);
|
meta_wayland_pointer_start_grab (pointer, (MetaWaylandPointerGrab*)grab);
|
||||||
|
|
||||||
|
meta_display_begin_grab_op (window->display,
|
||||||
|
window->screen,
|
||||||
|
window,
|
||||||
|
META_GRAB_OP_WAYLAND_CLIENT,
|
||||||
|
FALSE, /* pointer_already_grabbed */
|
||||||
|
FALSE, /* frame_action */
|
||||||
|
1, /* button. XXX? */
|
||||||
|
0, /* modmask */
|
||||||
|
meta_display_get_current_time_roundtrip (window->display),
|
||||||
|
wl_fixed_to_int (pointer->grab_x),
|
||||||
|
wl_fixed_to_int (pointer->grab_y));
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
grab = (MetaWaylandPopupGrab*)pointer->grab;
|
grab = (MetaWaylandPopupGrab*)pointer->grab;
|
||||||
@ -538,7 +559,6 @@ meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
|
|||||||
wl_resource_add_destroy_listener (surface->wl_shell_surface.resource, &popup->surface_destroy_listener);
|
wl_resource_add_destroy_listener (surface->wl_shell_surface.resource, &popup->surface_destroy_listener);
|
||||||
|
|
||||||
wl_list_insert (&grab->all_popups, &popup->link);
|
wl_list_insert (&grab->all_popups, &popup->link);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user