From 422389a3dff0c9ef95759e18b3f8f6d8238e5d88 Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Thu, 8 Nov 2018 00:05:32 +0100 Subject: [PATCH] Add support for RandR's primary monitor (Bug #10688) --- settings/main.c | 4 + settings/xfdesktop-settings-ui.glade | 28 +++++-- src/xfce-desktop.c | 40 ++++++++++ src/xfdesktop-icon-view.c | 115 +++++++++++++++++++++------ src/xfdesktop-icon-view.h | 3 + 5 files changed, 159 insertions(+), 31 deletions(-) diff --git a/settings/main.c b/settings/main.c index 8389cedf..79ced49b 100644 --- a/settings/main.c +++ b/settings/main.c @@ -80,6 +80,7 @@ #define WINLIST_SHOW_WS_SUBMENUS_PROP "/windowlist-menu/show-submenus" #define WINLIST_SHOW_ADD_REMOVE_WORKSPACES_PROP "/windowlist-menu/show-add-remove-workspaces" +#define DESKTOP_ICONS_ON_PRIMARY_PROP "/desktop-icons/primary" #define DESKTOP_ICONS_STYLE_PROP "/desktop-icons/style" #define DESKTOP_ICONS_ICON_SIZE_PROP "/desktop-icons/icon-size" #define DESKTOP_ICONS_FONT_SIZE_PROP "/desktop-icons/font-size" @@ -2030,6 +2031,9 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml, gtk_builder_get_object(main_gxml, "chk_show_winlist_ws_submenus"), "active"); + w = GTK_WIDGET(gtk_builder_get_object(main_gxml, "primary")); + xfconf_g_property_bind(channel, DESKTOP_ICONS_ON_PRIMARY_PROP, G_TYPE_BOOLEAN, + G_OBJECT(w), "active"); w = GTK_WIDGET(gtk_builder_get_object(main_gxml, "combo_icons")); #ifdef ENABLE_FILE_ICONS gtk_combo_box_set_active(GTK_COMBO_BOX(w), 2); diff --git a/settings/xfdesktop-settings-ui.glade b/settings/xfdesktop-settings-ui.glade index d16ad2a1..ff277262 100644 --- a/settings/xfdesktop-settings-ui.glade +++ b/settings/xfdesktop-settings-ui.glade @@ -786,7 +786,7 @@ 0 - 2 + 3 @@ -802,7 +802,7 @@ 1 - 2 + 3 @@ -817,7 +817,7 @@ 0 - 4 + 5 @@ -832,7 +832,7 @@ 0 - 5 + 6 @@ -848,7 +848,8 @@ 0 - 6 + 7 + 2 @@ -864,7 +865,7 @@ 1 - 3 + 4 @@ -880,7 +881,20 @@ 0 - 3 + 4 + + + + + Show icons on primary monitor + True + True + False + True + + + 0 + 2 diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c index a18a3611..a8f3af8d 100644 --- a/src/xfce-desktop.c +++ b/src/xfce-desktop.c @@ -115,6 +115,7 @@ struct _XfceDesktopPriv gboolean icons_font_size_set; guint icons_font_size; guint icons_size; + gboolean primary; gboolean icons_center_text; gint style_refresh_timer; GtkWidget *icon_view; @@ -137,6 +138,7 @@ enum #ifdef ENABLE_DESKTOP_ICONS PROP_ICON_STYLE, PROP_ICON_SIZE, + PROP_ICON_ON_PRIMARY, PROP_ICON_FONT_SIZE, PROP_ICON_FONT_SIZE_SET, PROP_ICON_CENTER_TEXT, @@ -170,6 +172,9 @@ static gboolean xfce_desktop_delete_event(GtkWidget *w, GdkEventAny *evt); static void xfce_desktop_style_updated(GtkWidget *w); +static void xfce_desktop_set_primary(XfceDesktop *desktop, + gboolean primary); + static void xfce_desktop_set_single_workspace_mode(XfceDesktop *desktop, gboolean single_workspace); static void xfce_desktop_set_single_workspace_number(XfceDesktop *desktop, @@ -945,6 +950,13 @@ xfce_desktop_class_init(XfceDesktopClass *klass) 8, 192, DEFAULT_ICON_SIZE, XFDESKTOP_PARAM_FLAGS)); + g_object_class_install_property(gobject_class, PROP_ICON_ON_PRIMARY, + g_param_spec_boolean("primary", + "primary", + "primary", + FALSE, + XFDESKTOP_PARAM_FLAGS)); + g_object_class_install_property(gobject_class, PROP_ICON_FONT_SIZE, g_param_spec_uint("icon-font-size", "icon font size", @@ -1036,6 +1048,11 @@ xfce_desktop_set_property(GObject *object, g_value_get_uint(value)); break; + case PROP_ICON_ON_PRIMARY: + xfce_desktop_set_primary(desktop, + g_value_get_boolean(value)); + break; + case PROP_ICON_FONT_SIZE: xfce_desktop_set_icon_font_size(desktop, g_value_get_uint(value)); @@ -1086,6 +1103,10 @@ xfce_desktop_get_property(GObject *object, g_value_set_uint(value, desktop->priv->icons_size); break; + case PROP_ICON_ON_PRIMARY: + g_value_set_boolean(value, desktop->priv->primary); + break; + case PROP_ICON_FONT_SIZE: g_value_set_uint(value, desktop->priv->icons_font_size); break; @@ -1451,6 +1472,8 @@ xfce_desktop_connect_settings(XfceDesktop *desktop) G_OBJECT(desktop), "icon-style"); xfconf_g_property_bind(channel, ICONS_PREFIX "icon-size", G_TYPE_UINT, G_OBJECT(desktop), "icon-size"); + xfconf_g_property_bind(channel, ICONS_PREFIX "primary", G_TYPE_BOOLEAN, + G_OBJECT(desktop), "primary"); xfconf_g_property_bind(channel, ICONS_PREFIX "font-size", G_TYPE_UINT, G_OBJECT(desktop), "icon-font-size"); xfconf_g_property_bind(channel, ICONS_PREFIX "use-custom-font-size", @@ -1661,6 +1684,23 @@ xfce_desktop_set_icon_size(XfceDesktop *desktop, #endif } +static void +xfce_desktop_set_primary(XfceDesktop *desktop, + gboolean primary) +{ + g_return_if_fail(XFCE_IS_DESKTOP(desktop)); + + if(primary == desktop->priv->primary) + return; + + desktop->priv->primary = primary; + + if(desktop->priv->icon_view) { + xfdesktop_icon_view_set_primary(XFDESKTOP_ICON_VIEW(desktop->priv->icon_view), + primary); + } +} + void xfce_desktop_set_icon_font_size(XfceDesktop *desktop, guint font_size_points) diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index 3b16e713..d0e22a8c 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -110,20 +110,21 @@ typedef struct struct _XfdesktopIconViewPrivate { XfdesktopIconViewManager *manager; - + GtkWidget *parent_window; - + guint icon_size; + gboolean primary; gdouble font_size; gboolean center_text; - + WnckScreen *wnck_screen; PangoLayout *playout; - + GList *pending_icons; GList *icons; GList *selected_icons; - + gint xorigin; gint yorigin; gint width; @@ -313,8 +314,10 @@ static inline void xfdesktop_xy_to_rowcol(XfdesktopIconView *icon_view, gint16 *row, gint16 *col); static gboolean xfdesktop_grid_resize_timeout(gpointer user_data); +static void xfdesktop_monitors_changed_cb(GdkScreen *gscreen, + gpointer user_data); static void xfdesktop_screen_size_changed_cb(GdkScreen *gscreen, - gpointer user_data); + gpointer user_data); static GdkFilterReturn xfdesktop_rootwin_watch_workarea(GdkXEvent *gxevent, GdkEvent *event, gpointer user_data); @@ -1935,22 +1938,24 @@ xfdesktop_icon_view_realize(GtkWidget *widget) g_signal_connect(G_OBJECT(icon_view->priv->parent_window), "focus-out-event", G_CALLBACK(xfdesktop_icon_view_focus_out), icon_view); - + /* watch for _NET_WORKAREA changes */ gscreen = gtk_widget_get_screen(widget); groot = gdk_screen_get_root_window(gscreen); gdk_window_set_events(groot, gdk_window_get_events(groot) | GDK_PROPERTY_CHANGE_MASK); gdk_window_add_filter(groot, xfdesktop_rootwin_watch_workarea, icon_view); - + + g_signal_connect(G_OBJECT(gscreen), "monitors-changed", + G_CALLBACK(xfdesktop_monitors_changed_cb), icon_view); g_signal_connect(G_OBJECT(gscreen), "size-changed", G_CALLBACK(xfdesktop_screen_size_changed_cb), icon_view); - + g_signal_connect_after(G_OBJECT(gtk_icon_theme_get_for_screen(gscreen)), "changed", G_CALLBACK(xfdesktop_icon_view_icon_theme_changed), icon_view); - + xfdesktop_move_all_pending_icons_to_desktop(icon_view); } @@ -2414,12 +2419,28 @@ xfdesktop_icon_view_real_move_cursor(XfdesktopIconView *icon_view, } +static void +xfdesktop_monitors_changed_cb(GdkScreen *gscreen, + gpointer user_data) +{ + XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(user_data); + + /* Resize the grid to be sure we take into account monitor setup changes */ + //xfdesktop_grid_do_resize(icon_view); + if(icon_view->priv->grid_resize_timeout) + g_source_remove(icon_view->priv->grid_resize_timeout); + icon_view->priv->grid_resize_timeout = g_timeout_add(7000, + xfdesktop_grid_resize_timeout, + icon_view); +} + + static void xfdesktop_screen_size_changed_cb(GdkScreen *gscreen, gpointer user_data) { XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(user_data); - + /* this is kinda icky. we want to use _NET_WORKAREA to reset the size of * the grid, but we can never be sure it'll actually change. so let's * give it 7 seconds, and then fix it manually */ @@ -2539,30 +2560,45 @@ xfdesktop_icon_view_setup_grids_xinerama(XfdesktopIconView *icon_view) break; } } - + if(!bounded) { xfdesktop_grid_unset_position_free_raw(icon_view, row, col, (gpointer)0xdeadbeef); } } } - + g_free(monitor_geoms); - + DBG("exiting"); } - + static void xfdesktop_setup_grids(XfdesktopIconView *icon_view) { + gboolean primary; gint xorigin = 0, yorigin = 0, xrest = 0, yrest = 0, width = 0, height = 0; gsize old_size, new_size; - + old_size = (guint)icon_view->priv->nrows * icon_view->priv->ncols * sizeof(XfdesktopIcon *); - - if(!xfdesktop_get_workarea_single(icon_view, 0, + + primary = xfconf_channel_get_bool (icon_view->priv->channel, + "/desktop-icons/primary", + TRUE); + if (primary) + { + GdkMonitor *monitor; + GdkRectangle rectangle; + monitor = gdk_display_get_primary_monitor (gdk_display_get_default()); + gdk_monitor_get_geometry (monitor, &rectangle); + xorigin = rectangle.x; + yorigin = rectangle.y; + width = rectangle.width; + height = rectangle.height; + } + else if (!xfdesktop_get_workarea_single(icon_view, 0, &xorigin, &yorigin, &width, &height)) { @@ -3222,13 +3258,28 @@ xfdesktop_grid_do_resize(XfdesktopIconView *icon_view) gint16 new_rows, new_cols; gsize old_size, new_size; GdkScreen *gscreen; + gboolean primary; - /* First check to see if the grid actaully did change. This way + /* First check to see if the grid actually did change. This way * we don't remove all the icons just to put them back again */ old_size = (guint)icon_view->priv->nrows * icon_view->priv->ncols * sizeof(XfdesktopIcon *); - - if(!xfdesktop_get_workarea_single(icon_view, 0, + primary = xfconf_channel_get_bool (icon_view->priv->channel, + "/desktop-icons/primary", + TRUE); + if (primary) + { + GdkMonitor *monitor; + GdkRectangle rectangle; + monitor = gdk_display_get_primary_monitor (gdk_display_get_default()); + gdk_monitor_get_geometry (monitor, &rectangle); + xorigin = rectangle.x; + yorigin = rectangle.y; + width = rectangle.width; + height = rectangle.height; + /* TODO: Take into account struts (_NET_WORKAREA doesn't work if x/y!=0) */ + } + else if(!xfdesktop_get_workarea_single(icon_view, 0, &xorigin, &yorigin, &width, &height)) { @@ -4104,17 +4155,33 @@ xfdesktop_icon_view_get_icon_size(XfdesktopIconView *icon_view) return icon_view->priv->icon_size; } +void +xfdesktop_icon_view_set_primary(XfdesktopIconView *icon_view, + gboolean primary) +{ + g_return_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view)); + + if(primary == icon_view->priv->primary) + return; + + icon_view->priv->primary = primary; + + if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) { + xfdesktop_grid_do_resize(icon_view); + } +} + void xfdesktop_icon_view_set_font_size(XfdesktopIconView *icon_view, gdouble font_size_points) { g_return_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view)); - + if(font_size_points == icon_view->priv->font_size) return; - + icon_view->priv->font_size = font_size_points; - + if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) { xfdesktop_icon_view_modify_font_size(icon_view, font_size_points); xfdesktop_grid_do_resize(icon_view); diff --git a/src/xfdesktop-icon-view.h b/src/xfdesktop-icon-view.h index 41e9d262..97b0d91d 100644 --- a/src/xfdesktop-icon-view.h +++ b/src/xfdesktop-icon-view.h @@ -114,6 +114,9 @@ void xfdesktop_icon_view_set_icon_size(XfdesktopIconView *icon_view, guint icon_size); guint xfdesktop_icon_view_get_icon_size(XfdesktopIconView *icon_view); +void xfdesktop_icon_view_set_primary(XfdesktopIconView *icon_view, + gboolean primary); + void xfdesktop_icon_view_set_font_size(XfdesktopIconView *icon_view, gdouble font_size_points); gdouble xfdesktop_icon_view_get_font_size(XfdesktopIconView *icon_view); -- 2.19.1