summaryrefslogtreecommitdiff
path: root/src/caja-desktop-window.c
diff options
context:
space:
mode:
authorLuke from DC <[email protected]>2023-07-08 17:10:25 +0000
committerGitHub <[email protected]>2023-07-08 19:10:25 +0200
commitc1b2e7798670cc795979090023d1b9dcb2a0b330 (patch)
tree632a206d3501fd48f0e1d1af709b0c4054c49c84 /src/caja-desktop-window.c
parentdf25aef7d386d3bf8da08ec5d8dd9e44c9b09e50 (diff)
downloadcaja-c1b2e7798670cc795979090023d1b9dcb2a0b330.tar.bz2
caja-c1b2e7798670cc795979090023d1b9dcb2a0b330.tar.xz
wayland: initial support for showing the desktop
* Wayland: Support rendering the desktop *Wayland support is optional via the --enable-wayland option * eel-editable-label-c: remove unused variable This was leftover from earlier code compatable only with x11 * Fix gtk-layer-shell-0 version check, improve error message when Wayland requested but not found
Diffstat (limited to 'src/caja-desktop-window.c')
-rw-r--r--src/caja-desktop-window.c132
1 files changed, 108 insertions, 24 deletions
diff --git a/src/caja-desktop-window.c b/src/caja-desktop-window.c
index b5f7e9a5..6188fa63 100644
--- a/src/caja-desktop-window.c
+++ b/src/caja-desktop-window.c
@@ -29,7 +29,10 @@
#include <gtk/gtk.h>
#include <gio/gio.h>
#include <glib/gi18n.h>
-
+#ifdef HAVE_WAYLAND
+#include <gdk/gdkwayland.h>
+#include <gtk-layer-shell/gtk-layer-shell.h>
+#endif
#include <eel/eel-background.h>
#include <eel/eel-vfs-extensions.h>
@@ -156,9 +159,23 @@ caja_desktop_window_screen_size_changed (GdkScreen *screen,
{
int width_request, height_request;
- GdkWindow *root_window;
- root_window = gdk_screen_get_root_window (screen);
- gdk_window_get_geometry (root_window, NULL, NULL, &width_request, &height_request);
+ GdkDisplay *display = gdk_screen_get_display (screen);
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ GdkWindow *root_window;
+ root_window = gdk_screen_get_root_window (screen);
+ gdk_window_get_geometry (root_window, NULL, NULL, &width_request, &height_request);
+ }
+ else
+ {
+ /*No root window or primary monitor in wayland unless compositors add it back*/
+ GdkRectangle geometry = {0};
+ GdkMonitor *monitor;
+ monitor = gdk_display_get_monitor (display, 0);
+ gdk_monitor_get_geometry (monitor, &geometry);
+ width_request = geometry.width;
+ height_request = geometry.height;
+ }
g_object_set (window,
"width_request", width_request,
@@ -174,10 +191,27 @@ caja_desktop_window_new (CajaApplication *application,
int width_request, height_request;
int scale;
- scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
-
- width_request = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
- height_request = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ GdkDisplay *display = gdk_screen_get_display (screen);
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
+ width_request = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ height_request = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ }
+ else
+ {
+ /*FIXME: There is no primary monitor in wayland itself
+ *compositors can implement this but as this is written
+ *only a few wayland compositors allow setting a primary monitor
+ *and they all do it differently. For now, use the first monitor
+ */
+ GdkRectangle geometry = {0};
+ GdkMonitor *monitor;
+ monitor = gdk_display_get_monitor (display, 0);
+ gdk_monitor_get_geometry (monitor, &geometry);
+ width_request = geometry.width;
+ height_request = geometry.height;
+ }
window = CAJA_DESKTOP_WINDOW
(gtk_widget_new (caja_desktop_window_get_type(),
@@ -191,11 +225,47 @@ caja_desktop_window_new (CajaApplication *application,
/* will cause the desktop window to open at the wrong size in gtk 3.20 */
gtk_window_set_default_size (GTK_WINDOW (window), -1, -1);
+ /*For wayland only
+ *Code taken from gtk-layer-shell simple-example.c
+ */
+#ifdef HAVE_WAYLAND
+ if (GDK_IS_WAYLAND_DISPLAY (display))
+ {
+ GtkWindow *gtkwin;
+ gtkwin = (GTK_WINDOW(window));
+
+ /* Before the window is first realized, set it up to be a layer surface */
+ gtk_layer_init_for_window (gtkwin);
+
+ /* Order below normal windows */
+ gtk_layer_set_layer (gtkwin, GTK_LAYER_SHELL_LAYER_BOTTOM);
+
+ gtk_layer_set_namespace (gtkwin, "desktop");
+
+ /*Anchor the desktop to all four corners
+ *This is much simpler than on x11 and
+ *should always render the desktop across
+ *all of the screen
+ */
+ gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_TOP, TRUE);
+ gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
+ gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
+ gtk_layer_set_anchor (gtkwin, GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);
+
+ /*Enable keyboard use on the desktop*/
+ gtk_layer_set_keyboard_mode (gtkwin, GTK_LAYER_SHELL_KEYBOARD_MODE_ON_DEMAND);
+ }
+#endif
/* Special sawmill setting*/
GdkWindow *gdkwin;
- gtk_widget_realize (GTK_WIDGET (window));
+ if ((GDK_IS_X11_DISPLAY (display)))
+ gtk_widget_realize (GTK_WIDGET (window));
+ else
+ gtk_widget_show (GTK_WIDGET (window));
+
gdkwin = gtk_widget_get_window (GTK_WIDGET (window));
- if (gdk_window_ensure_native (gdkwin)) {
+ if ((GDK_IS_X11_DISPLAY (display)) && (gdk_window_ensure_native (gdkwin)))
+ {
Display *disp = GDK_DISPLAY_XDISPLAY (gdk_window_get_display (gdkwin));
XClassHint *xch = XAllocClassHint ();
xch->res_name = "desktop_window";
@@ -230,15 +300,21 @@ unrealize (GtkWidget *widget)
CajaDesktopWindow *window;
CajaDesktopWindowPrivate *details;
GdkWindow *root_window;
+ GdkDisplay *display;
window = CAJA_DESKTOP_WINDOW (widget);
details = window->details;
+ display = gtk_widget_get_display (widget);
- root_window = gdk_screen_get_root_window (
+ /*Avoid root window on wayland-it's not supposed to work*/
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ root_window = gdk_screen_get_root_window (
gtk_window_get_screen (GTK_WINDOW (window)));
- gdk_property_delete (root_window,
- gdk_atom_intern ("CAJA_DESKTOP_WINDOW_ID", TRUE));
+ gdk_property_delete (root_window,
+ gdk_atom_intern ("CAJA_DESKTOP_WINDOW_ID", TRUE));
+ }
if (details->size_changed_id != 0) {
g_signal_handler_disconnect (gtk_window_get_screen (GTK_WINDOW (window)),
@@ -249,6 +325,7 @@ unrealize (GtkWidget *widget)
GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->unrealize (widget);
}
+/*This should only be reached in x11*/
static void
set_wmspec_desktop_hint (GdkWindow *window)
{
@@ -262,18 +339,18 @@ set_wmspec_desktop_hint (GdkWindow *window)
GDK_PROP_MODE_REPLACE, (guchar *) &atom, 1);
}
+/*This should only be reached in x11*/
static void
set_desktop_window_id (CajaDesktopWindow *window,
GdkWindow *gdkwindow)
{
- /* Tuck the desktop windows xid in the root to indicate we own the desktop.
+ /* Tuck the desktop windows xid in the root to indicate we own the desktop in on x11
*/
Window window_xid;
GdkWindow *root_window;
root_window = gdk_screen_get_root_window (
gtk_window_get_screen (GTK_WINDOW (window)));
-
window_xid = GDK_WINDOW_XID (gdkwindow);
gdk_property_change (root_window,
@@ -289,17 +366,24 @@ realize (GtkWidget *widget)
CajaDesktopWindowPrivate *details;
window = CAJA_DESKTOP_WINDOW (widget);
details = window->details;
+ GdkDisplay *display;
/* Make sure we get keyboard events */
- gtk_widget_set_events (widget, gtk_widget_get_events (widget)
- | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
- /* Do the work of realizing. */
- GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->realize (widget);
+ display = gtk_widget_get_display (widget);
+ if (GDK_IS_X11_DISPLAY (display))
+ gtk_widget_set_events (widget, gtk_widget_get_events (widget)
+ | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
- /* This is the new way to set up the desktop window */
- set_wmspec_desktop_hint (gtk_widget_get_window (widget));
+ /*Do the work of realizing. */
+ GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->realize (widget);
- set_desktop_window_id (window, gtk_widget_get_window (widget));
+ /* This is the new way to set up the desktop window in x11 but not for wayland */
+ display = gtk_widget_get_display (widget);
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ set_wmspec_desktop_hint (gtk_widget_get_window (widget));
+ set_desktop_window_id (window, gtk_widget_get_window (widget));
+ }
details->size_changed_id =
g_signal_connect (gtk_window_get_screen (GTK_WINDOW (window)), "size_changed",
@@ -311,7 +395,6 @@ draw (GtkWidget *widget,
cairo_t *cr)
{
eel_background_draw (widget, cr);
-
return GTK_WIDGET_CLASS (caja_desktop_window_parent_class)->draw (widget, cr);
}
@@ -332,7 +415,8 @@ caja_desktop_window_class_init (CajaDesktopWindowClass *klass)
wclass->realize = realize;
wclass->unrealize = unrealize;
wclass->map = map;
- wclass->draw = draw;
+ if (GDK_IS_X11_DISPLAY (gdk_display_get_default()))
+ wclass->draw = draw;
gtk_widget_class_set_accessible_type (wclass, CAJA_TYPE_DESKTOP_WINDOW_ACCESSIBLE);