diff options
Diffstat (limited to 'src/file-manager/fm-desktop-icon-view.c')
| -rw-r--r-- | src/file-manager/fm-desktop-icon-view.c | 125 |
1 files changed, 98 insertions, 27 deletions
diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c index a90f884f..954c26de 100644 --- a/src/file-manager/fm-desktop-icon-view.c +++ b/src/file-manager/fm-desktop-icon-view.c @@ -62,6 +62,12 @@ #include "fm-desktop-icon-view.h" #include "fm-actions.h" +#ifdef HAVE_WAYLAND +#include <gdk/gdkwayland.h> +#include "fm-desktop-wayland-bg-dialog.h" + +#endif + /* Timeout to check the desktop directory for updates */ #define RESCAN_TIMEOUT 4 @@ -120,13 +126,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 +168,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 +260,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 +280,6 @@ desktop_icon_view_property_filter (GdkXEvent *gdk_xevent, default: break; } - return GDK_FILTER_CONTINUE; } @@ -317,6 +338,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 +395,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 +412,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 +428,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 +657,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", @@ -661,12 +713,31 @@ action_change_background_callback (GtkAction *action, gpointer data) { g_assert (FM_DIRECTORY_VIEW (data)); - - caja_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)), - _("Background"), - "mate-appearance-properties", - FALSE, - "--show-page=background", NULL); +#ifdef HAVE_WAYLAND + /*Get the new background and switch to it in wayland*/ + if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default())) + { + /*We can use the appearance capplet with some versions of mate-control-center + *in which the appearance capplet works in wayland + *Try it first, and fall back to the standalone dialog if it fails + */ + GError *error = NULL; + + g_spawn_command_line_async ("mate-appearance-properties --show-page=background", + &error); + if (error != NULL) + wayland_bg_dialog_new (); + } + else +#endif + /*Get the new background and switch to it in x11*/ + { + caja_launch_application_from_command (gtk_widget_get_screen (GTK_WIDGET (data)), + _("Background"), + "mate-appearance-properties", + FALSE, + "--show-page=background", NULL); + } } static void |
