[Xfce4-commits] [xfce/xfdesktop] 01/05: Add support for RandR's primary monitor (Bug #10688)

noreply at xfce.org noreply at xfce.org
Fri Nov 16 19:12:37 CET 2018


This is an automated email from the git hooks/post-receive script.

o   c   h   o   s   i       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/xfdesktop.

commit b49f648fc7df64cd8f88f3ec10ed700bce36833a
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Nov 8 00:05:32 2018 +0100

    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 8389ced..79ced49 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 d16ad2a..ff27726 100644
--- a/settings/xfdesktop-settings-ui.glade
+++ b/settings/xfdesktop-settings-ui.glade
@@ -786,7 +786,7 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">0</property>
-                                    <property name="top_attach">2</property>
+                                    <property name="top_attach">3</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -802,7 +802,7 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">1</property>
-                                    <property name="top_attach">2</property>
+                                    <property name="top_attach">3</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -817,7 +817,7 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">0</property>
-                                    <property name="top_attach">4</property>
+                                    <property name="top_attach">5</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -832,7 +832,7 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">0</property>
-                                    <property name="top_attach">5</property>
+                                    <property name="top_attach">6</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -848,7 +848,8 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">0</property>
-                                    <property name="top_attach">6</property>
+                                    <property name="top_attach">7</property>
+                                    <property name="width">2</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -864,7 +865,7 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">1</property>
-                                    <property name="top_attach">3</property>
+                                    <property name="top_attach">4</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -880,7 +881,20 @@
                                   </object>
                                   <packing>
                                     <property name="left_attach">0</property>
-                                    <property name="top_attach">3</property>
+                                    <property name="top_attach">4</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkCheckButton" id="primary">
+                                    <property name="label" translatable="yes">Show icons on primary monitor</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">False</property>
+                                    <property name="draw_indicator">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="left_attach">0</property>
+                                    <property name="top_attach">2</property>
                                   </packing>
                                 </child>
                                 <child>
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c
index a18a361..a8f3af8 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 3b16e71..d0e22a8 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);
diff --git a/src/xfdesktop-icon-view.h b/src/xfdesktop-icon-view.h
index 41e9d26..97b0d91 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);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list