diff options
author | Simon Steinbeiss <simon.steinbeiss@elfenbeinturm.at> | 2018-11-08 00:05:32 +0100 |
---|---|---|
committer | Simon Steinbeiss <simon.steinbeiss@elfenbeinturm.at> | 2018-11-16 19:09:32 +0100 |
commit | b49f648fc7df64cd8f88f3ec10ed700bce36833a (patch) | |
tree | 1a2944110b8d14bf78b837cfdeb51441fc11fa9a /src/xfdesktop-icon-view.c | |
parent | 947a8e144b43d7e386e721e3683d3e020c7e1d90 (diff) | |
download | xfdesktop-b49f648fc7df64cd8f88f3ec10ed700bce36833a.tar.gz |
Add support for RandR's primary monitor (Bug #10688)
Diffstat (limited to 'src/xfdesktop-icon-view.c')
-rw-r--r-- | src/xfdesktop-icon-view.c | 115 |
1 files changed, 91 insertions, 24 deletions
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); } @@ -2415,11 +2420,27 @@ 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)) { @@ -4105,16 +4156,32 @@ xfdesktop_icon_view_get_icon_size(XfdesktopIconView *icon_view) } 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); |