summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2013-10-09 16:55:55 -0400
committerJasper St. Pierre <jstpierre@mecheye.net>2013-10-28 18:03:26 -0400
commitb3cffb85f39183a83a99e7517191e46bcd744749 (patch)
tree9f1eeadba40707d1491a53a58219af7e391bd35e /gdk
parent1ace4b886dea865c5f6c3251c3bc06c819eb366d (diff)
downloadgtk+-b3cffb85f39183a83a99e7517191e46bcd744749.tar.gz
wayland: Support always-on-top / sticky windows
Use the new gtk-shell APIs available in mutter to add support for this. https://bugzilla.gnome.org/show_bug.cgi?id=710056
Diffstat (limited to 'gdk')
-rw-r--r--gdk/wayland/gdkdisplay-wayland.c2
-rw-r--r--gdk/wayland/gdkwindow-wayland.c12
-rw-r--r--gdk/wayland/protocol/gtk-shell.xml32
3 files changed, 41 insertions, 5 deletions
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 71debb944a..f90db8ff48 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -169,7 +169,7 @@ gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id
wl_registry_bind(display_wayland->wl_registry, id, &wl_shell_interface, 1);
} else if (strcmp(interface, "gtk_shell") == 0) {
display_wayland->gtk_shell =
- wl_registry_bind(display_wayland->wl_registry, id, &gtk_shell_interface, 1);
+ wl_registry_bind(display_wayland->wl_registry, id, &gtk_shell_interface, 2);
_gdk_wayland_screen_set_has_gtk_shell (display_wayland->screen);
/* We need another roundtrip to receive the shell capabilities */
wait_for_roundtrip(display_wayland);
diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c
index 70abf77da5..e9f2d3bf8a 100644
--- a/gdk/wayland/gdkwindow-wayland.c
+++ b/gdk/wayland/gdkwindow-wayland.c
@@ -1647,15 +1647,23 @@ gdk_wayland_window_deiconify (GdkWindow *window)
static void
gdk_wayland_window_stick (GdkWindow *window)
{
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
if (GDK_WINDOW_DESTROYED (window))
return;
+
+ gtk_surface_set_on_all_workspaces (impl->gtk_surface, TRUE);
}
static void
gdk_wayland_window_unstick (GdkWindow *window)
{
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
+
if (GDK_WINDOW_DESTROYED (window))
return;
+
+ gtk_surface_set_on_all_workspaces (impl->gtk_surface, FALSE);
}
static void
@@ -1769,10 +1777,12 @@ static void
gdk_wayland_window_set_keep_above (GdkWindow *window,
gboolean setting)
{
- g_return_if_fail (GDK_IS_WINDOW (window));
+ GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl);
if (GDK_WINDOW_DESTROYED (window))
return;
+
+ gtk_surface_set_always_on_top (impl->gtk_surface, setting);
}
static void
diff --git a/gdk/wayland/protocol/gtk-shell.xml b/gdk/wayland/protocol/gtk-shell.xml
index a4e25653f1..4407cb8981 100644
--- a/gdk/wayland/protocol/gtk-shell.xml
+++ b/gdk/wayland/protocol/gtk-shell.xml
@@ -1,11 +1,11 @@
<protocol name="gtk">
- <interface name="gtk_shell" version="1">
+ <interface name="gtk_shell" version="2">
<enum name="capability">
<entry name="global_app_menu" value="1"/>
<entry name="global_menu_bar" value="2"/>
</enum>
-
+
<event name="capabilities">
<arg name="capabilities" type="uint"/>
</event>
@@ -16,7 +16,7 @@
</request>
</interface>
- <interface name="gtk_surface" version="1">
+ <interface name="gtk_surface" version="2">
<request name="set_dbus_properties">
<arg name="application_id" type="string" allow-null="true"/>
<arg name="app_menu_path" type="string" allow-null="true"/>
@@ -25,6 +25,32 @@
<arg name="application_object_path" type="string" allow-null="true"/>
<arg name="unique_bus_name" type="string" allow-null="true"/>
</request>
+
+ <request name="set_workspace">
+ <arg name="workspace" type="uint" />
+ </request>
+
+ <event name="workspace_changed">
+ <arg name="new_workspace" type="uint" />
+ </event>
+
+ <enum name="always_on_top_state">
+ <entry name="not_always_on_top" value="0" />
+ <entry name="always_on_top" value="1" />
+ </enum>
+
+ <request name="set_always_on_top">
+ <arg name="always_on_top" type="uint" />
+ </request>
+
+ <enum name="on_all_workspaces">
+ <entry name="not_on_all_workspaces" value="0" />
+ <entry name="on_all_workspaces" value="1" />
+ </enum>
+
+ <request name="set_on_all_workspaces">
+ <arg name="on_all_workspaces" type="uint" />
+ </request>
</interface>
</protocol>