summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am5
-rw-r--r--src/caja-application.c43
-rw-r--r--src/caja-desktop-window.c132
-rw-r--r--src/file-manager/fm-desktop-icon-view.c88
4 files changed, 203 insertions, 65 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 391df3a2..d36b37e5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -38,6 +38,11 @@ LDADD = \
-lnotify
$(NULL)
+if ENABLE_WAYLAND
+LDADD += \
+ $(WAYLAND_LIBS)
+endif
+
dbus_freedesktop_built_sources = \
caja-freedesktop-generated.c \
caja-freedesktop-generated.h
diff --git a/src/caja-application.c b/src/caja-application.c
index 1467e421..e6d3000a 100644
--- a/src/caja-application.c
+++ b/src/caja-application.c
@@ -634,19 +634,15 @@ selection_get_cb (GtkWidget *widget,
static GtkWidget *
get_desktop_manager_selection (GdkDisplay *display)
{
- /*FIXME: for Wayland we need a new desktop canvas anyway
- *so when that is ready we will need to add a wayland code
- *path here to support it
- */
- if (GDK_IS_X11_DISPLAY (display)){
- char selection_name[32];
- GdkAtom selection_atom;
- Window selection_owner;
- GtkWidget *selection_widget;
-
- g_snprintf (selection_name, sizeof (selection_name), "_NET_DESKTOP_MANAGER_S0");
- selection_atom = gdk_atom_intern (selection_name, FALSE);
+ char selection_name[32];
+ GdkAtom selection_atom;
+ Window selection_owner;
+ GtkWidget *selection_widget;
+ g_snprintf (selection_name, sizeof (selection_name), "_NET_DESKTOP_MANAGER_S0");
+ selection_atom = gdk_atom_intern (selection_name, FALSE);
+ if (GDK_IS_X11_DISPLAY (display))
+ {
selection_owner = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display),
gdk_x11_atom_to_xatom_for_display (display,
selection_atom));
@@ -654,24 +650,31 @@ get_desktop_manager_selection (GdkDisplay *display)
{
return NULL;
}
+ }
+ selection_widget = gtk_invisible_new_for_screen (gdk_display_get_default_screen (display));
+ /* We need this for gdk_x11_get_server_time() */
+ gtk_widget_add_events (selection_widget, GDK_PROPERTY_CHANGE_MASK);
- selection_widget = gtk_invisible_new_for_screen (gdk_display_get_default_screen (display));
- /* We need this for gdk_x11_get_server_time() */
- gtk_widget_add_events (selection_widget, GDK_PROPERTY_CHANGE_MASK);
-
+ if (GDK_IS_X11_DISPLAY (display))
+ {
if (gtk_selection_owner_set_for_display (display,
selection_widget,
selection_atom,
gdk_x11_get_server_time (gtk_widget_get_window (selection_widget))))
{
-
g_signal_connect (selection_widget, "selection_get",
- G_CALLBACK (selection_get_cb), NULL);
+ G_CALLBACK (selection_get_cb), NULL);
return selection_widget;
}
-
- gtk_widget_destroy (selection_widget);
}
+ else
+ {
+ g_signal_connect (selection_widget, "selection_get",
+ G_CALLBACK (selection_get_cb), NULL);
+ return selection_widget;
+ }
+
+ gtk_widget_destroy (selection_widget);
return NULL;
}
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);
diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c
index a90f884f..3a88b091 100644
--- a/src/file-manager/fm-desktop-icon-view.c
+++ b/src/file-manager/fm-desktop-icon-view.c
@@ -120,13 +120,27 @@ icon_container_set_workarea (CajaIconContainer *icon_container,
int screen_width, screen_height;
int scale;
int i;
+ GdkDisplay *display;
left = right = top = bottom = 0;
- scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
-
- screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
- screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ display = gdk_screen_get_display (screen);
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
+ screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ }
+ else
+ {
+ scale = 1; /*wayland handles this for us*/
+ GdkRectangle geometry = {0};
+ GdkMonitor *monitor;
+ monitor = gdk_display_get_monitor (display, 0);
+ gdk_monitor_get_geometry (monitor, &geometry);
+ screen_width = geometry.width;
+ screen_height = geometry.height;
+ }
for (i = 0; i < n_items; i += 4)
{
@@ -148,6 +162,7 @@ icon_container_set_workarea (CajaIconContainer *icon_container,
left, right, top, bottom);
}
+/*This code is only reached when running in x11*/
static void
net_workarea_changed (FMDesktopIconView *icon_view,
GdkWindow *window)
@@ -239,6 +254,7 @@ net_workarea_changed (FMDesktopIconView *icon_view,
g_free (workareas);
}
+/*This code is reached only in x11*/
static GdkFilterReturn
desktop_icon_view_property_filter (GdkXEvent *gdk_xevent,
GdkEvent *event,
@@ -258,7 +274,6 @@ desktop_icon_view_property_filter (GdkXEvent *gdk_xevent,
default:
break;
}
-
return GDK_FILTER_CONTINUE;
}
@@ -317,6 +332,7 @@ fm_desktop_icon_view_class_init (FMDesktopIconViewClass *class)
FM_ICON_VIEW_CLASS (class)->supports_labels_beside_icons = real_supports_labels_beside_icons;
}
+/*This code is only reached when running on x11*/
static void
fm_desktop_icon_view_handle_middle_click (CajaIconContainer *icon_container,
GdkEventButton *event,
@@ -373,6 +389,9 @@ fm_desktop_icon_view_handle_middle_click (CajaIconContainer *icon_container,
static void
unrealized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view)
{
+ if (!GDK_IS_X11_DISPLAY (gdk_display_get_default()))
+ return;
+
g_return_if_fail (desktop_icon_view->priv->root_window != NULL);
/* Remove the property filter */
@@ -387,13 +406,13 @@ realized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view)
{
GdkWindow *root_window;
GdkScreen *screen;
+ GdkDisplay *display;
GtkAllocation allocation;
- gint scale;
g_return_if_fail (desktop_icon_view->priv->root_window == NULL);
screen = gtk_widget_get_screen (widget);
- scale = gtk_widget_get_scale_factor (widget);
+ display = gdk_screen_get_display (screen);
/* Ugly HACK for the problem that the views realize at the
* wrong size and then get resized. (This is a problem with
@@ -403,24 +422,46 @@ realized_callback (GtkWidget *widget, FMDesktopIconView *desktop_icon_view)
*/
allocation.x = 0;
allocation.y = 0;
- allocation.width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
- allocation.height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ gint scale;
+ scale = gtk_widget_get_scale_factor (widget);
+ allocation.width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ allocation.height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ }
+ else
+ {
+ /*No real 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);
+ allocation.width = geometry.width;
+ allocation.height = geometry.height;
+ }
+
gtk_widget_size_allocate (GTK_WIDGET(get_icon_container(desktop_icon_view)),
&allocation);
- root_window = gdk_screen_get_root_window (screen);
-
- desktop_icon_view->priv->root_window = root_window;
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ root_window = gdk_screen_get_root_window (screen);
+ desktop_icon_view->priv->root_window = root_window;
- /* Read out the workarea geometry and update the icon container accordingly */
- net_workarea_changed (desktop_icon_view, root_window);
+ /* Read out the workarea geometry and update the icon container accordingly */
+ net_workarea_changed (desktop_icon_view, root_window);
- /* Setup the property filter */
- gdk_window_set_events (root_window, GDK_PROPERTY_CHANGE_MASK);
- gdk_window_add_filter (root_window,
- desktop_icon_view_property_filter,
- desktop_icon_view);
+ /* Setup the property filter */
+ gdk_window_set_events (root_window, GDK_PROPERTY_CHANGE_MASK);
+ gdk_window_add_filter (root_window,
+ desktop_icon_view_property_filter,
+ desktop_icon_view);
+ }
+ else
+ {
+ desktop_icon_view->priv->root_window = NULL;
+ }
}
static CajaZoomLevel
@@ -610,8 +651,13 @@ fm_desktop_icon_view_init (FMDesktopIconView *desktop_icon_view)
CAJA_ICON_LAYOUT_T_B_R_L :
CAJA_ICON_LAYOUT_T_B_L_R);
- g_signal_connect_object (icon_container, "middle_click",
- G_CALLBACK (fm_desktop_icon_view_handle_middle_click), desktop_icon_view, 0);
+ /*Handle the middle click on x11 */
+ if (GDK_IS_X11_DISPLAY (gdk_display_get_default ()))
+ {
+ g_signal_connect_object (desktop_icon_view, "middle_click",
+ G_CALLBACK (fm_desktop_icon_view_handle_middle_click), desktop_icon_view, 0);
+ }
+
g_signal_connect_object (desktop_icon_view, "realize",
G_CALLBACK (realized_callback), desktop_icon_view, 0);
g_signal_connect_object (desktop_icon_view, "unrealize",