[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