mirror of
https://github.com/brl/mutter.git
synced 2024-12-23 11:32:04 +00:00
xwayland: add _XWAYLAND_MAY_GRAB_KEYBOARD property
Add a new client message "_XWAYLAND_MAY_GRAB_KEYBOARD" that X11 clients can use to tell mutter this is a well behaving X11 client so it may grant the keyboard grabs when requested. An X11 client wishing to be granted Xwayland grabs by gnome-shell/mutter must send a ClientMessage to the root window with: - message_type set to "_XWAYLAND_MAY_GRAB_KEYBOARD" - window set to the xid of the window on which the grab is to be issued - data.l[0] to a non-zero value Note: Sending this client message when running a plain native X11 environment would have no effect. https://bugzilla.gnome.org/show_bug.cgi?id=783342
This commit is contained in:
parent
1546989845
commit
5f132f3975
@ -23,9 +23,22 @@
|
|||||||
#include "wayland/meta-window-xwayland.h"
|
#include "wayland/meta-window-xwayland.h"
|
||||||
#include "wayland/meta-wayland.h"
|
#include "wayland/meta-wayland.h"
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PROP_0,
|
||||||
|
|
||||||
|
PROP_XWAYLAND_MAY_GRAB_KEYBOARD,
|
||||||
|
|
||||||
|
PROP_LAST
|
||||||
|
};
|
||||||
|
|
||||||
|
static GParamSpec *obj_props[PROP_LAST];
|
||||||
|
|
||||||
struct _MetaWindowXwayland
|
struct _MetaWindowXwayland
|
||||||
{
|
{
|
||||||
MetaWindowX11 parent;
|
MetaWindowX11 parent;
|
||||||
|
|
||||||
|
gboolean xwayland_may_grab_keyboard;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaWindowXwaylandClass
|
struct _MetaWindowXwaylandClass
|
||||||
@ -58,11 +71,62 @@ meta_window_xwayland_shortcuts_inhibited (MetaWindow *window,
|
|||||||
return meta_wayland_compositor_is_shortcuts_inhibited (compositor, source);
|
return meta_wayland_compositor_is_shortcuts_inhibited (compositor, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_xwayland_get_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
MetaWindowXwayland *window = META_WINDOW_XWAYLAND (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_XWAYLAND_MAY_GRAB_KEYBOARD:
|
||||||
|
g_value_set_boolean (value, window->xwayland_may_grab_keyboard);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_xwayland_set_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
MetaWindowXwayland *window = META_WINDOW_XWAYLAND (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_XWAYLAND_MAY_GRAB_KEYBOARD:
|
||||||
|
window->xwayland_may_grab_keyboard = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_xwayland_class_init (MetaWindowXwaylandClass *klass)
|
meta_window_xwayland_class_init (MetaWindowXwaylandClass *klass)
|
||||||
{
|
{
|
||||||
MetaWindowClass *window_class = META_WINDOW_CLASS (klass);
|
MetaWindowClass *window_class = META_WINDOW_CLASS (klass);
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
window_class->force_restore_shortcuts = meta_window_xwayland_force_restore_shortcuts;
|
window_class->force_restore_shortcuts = meta_window_xwayland_force_restore_shortcuts;
|
||||||
window_class->shortcuts_inhibited = meta_window_xwayland_shortcuts_inhibited;
|
window_class->shortcuts_inhibited = meta_window_xwayland_shortcuts_inhibited;
|
||||||
|
|
||||||
|
gobject_class->get_property = meta_window_xwayland_get_property;
|
||||||
|
gobject_class->set_property = meta_window_xwayland_set_property;
|
||||||
|
|
||||||
|
obj_props[PROP_XWAYLAND_MAY_GRAB_KEYBOARD] =
|
||||||
|
g_param_spec_boolean ("xwayland-may-grab-keyboard",
|
||||||
|
"Xwayland may use keyboard grabs",
|
||||||
|
"Whether the client may use Xwayland keyboard grabs on this window",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
|
||||||
}
|
}
|
||||||
|
@ -37,4 +37,8 @@ meta_xwayland_handle_wl_surface_id (MetaWindow *window,
|
|||||||
gboolean
|
gboolean
|
||||||
meta_xwayland_is_xwayland_surface (MetaWaylandSurface *surface);
|
meta_xwayland_is_xwayland_surface (MetaWaylandSurface *surface);
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_xwayland_handle_xwayland_grab (MetaWindow *window,
|
||||||
|
gboolean allow);
|
||||||
|
|
||||||
#endif /* META_XWAYLAND_H */
|
#endif /* META_XWAYLAND_H */
|
||||||
|
@ -81,6 +81,7 @@ item(VERSION)
|
|||||||
item(ATOM_PAIR)
|
item(ATOM_PAIR)
|
||||||
item(_XKB_RULES_NAMES)
|
item(_XKB_RULES_NAMES)
|
||||||
item(WL_SURFACE_ID)
|
item(WL_SURFACE_ID)
|
||||||
|
item(_XWAYLAND_MAY_GRAB_KEYBOARD)
|
||||||
|
|
||||||
/* Oddities: These are used, and we need atoms for them,
|
/* Oddities: These are used, and we need atoms for them,
|
||||||
* but when we need all _NET_WM hints (i.e. when we're making
|
* but when we need all _NET_WM hints (i.e. when we're making
|
||||||
|
@ -1515,6 +1515,13 @@ handle_other_xevent (MetaDisplay *display,
|
|||||||
guint32 surface_id = event->xclient.data.l[0];
|
guint32 surface_id = event->xclient.data.l[0];
|
||||||
meta_xwayland_handle_wl_surface_id (window, surface_id);
|
meta_xwayland_handle_wl_surface_id (window, surface_id);
|
||||||
}
|
}
|
||||||
|
else if (event->xclient.message_type == display->atom__XWAYLAND_MAY_GRAB_KEYBOARD)
|
||||||
|
{
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
g_object_set (G_OBJECT (window),
|
||||||
|
"xwayland-may-grab-keyboard", (event->xclient.data.l[0] != 0),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if (!frame_was_receiver)
|
if (!frame_was_receiver)
|
||||||
|
Loading…
Reference in New Issue
Block a user