[Xfce4-commits] [xfce/xfdesktop] 02/02: Add an option to show hidden files (Bug 8132)

noreply at xfce.org noreply at xfce.org
Sun Aug 3 08:07:24 CEST 2014


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

eric pushed a commit to branch master
in repository xfce/xfdesktop.

commit 4fb565bc7b42683df3dbc7b1617eafaf047258b8
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Aug 3 09:04:53 2014 +0300

    Add an option to show hidden files (Bug 8132)
    
    This patch adds an option to toggle the display of hidden files
    on the desktop.
---
 common/xfdesktop-common.h            |    1 +
 doc/README.xfconf                    |    1 +
 settings/main.c                      |   10 ++-
 settings/xfdesktop-settings-ui.glade |   10 +++
 src/xfce-desktop.c                   |   44 +++++++++++
 src/xfdesktop-file-icon-manager.c    |  134 +++++++++++++++++++++++-----------
 src/xfdesktop-file-icon-manager.h    |    3 +
 7 files changed, 160 insertions(+), 43 deletions(-)

diff --git a/common/xfdesktop-common.h b/common/xfdesktop-common.h
index 4c8ade6..424d3fc 100644
--- a/common/xfdesktop-common.h
+++ b/common/xfdesktop-common.h
@@ -56,6 +56,7 @@
 #define SINGLE_WORKSPACE_NUMBER   "/backdrop/single-workspace-number"
 
 #define DESKTOP_ICONS_SHOW_THUMBNAILS        "/desktop-icons/show-thumbnails"
+#define DESKTOP_ICONS_SHOW_HIDDEN_FILES      "/desktop-icons/show-hidden-files"
 #define DESKTOP_ICONS_SHOW_NETWORK_REMOVABLE "/desktop-icons/file-icons/show-network-removable"
 #define DESKTOP_ICONS_SHOW_DEVICE_REMOVABLE  "/desktop-icons/file-icons/show-device-removable"
 #define DESKTOP_ICONS_SHOW_UNKNWON_REMOVABLE "/desktop-icons/file-icons/show-unknown-removable"
diff --git a/doc/README.xfconf b/doc/README.xfconf
index 80f0ed8..9b1ef8e 100644
--- a/doc/README.xfconf
+++ b/doc/README.xfconf
@@ -45,6 +45,7 @@ the same monitor is plugged in again those settings apply to it.
     <icon-size uint>
     <single-click bool>
     <show-thumbnails bool>
+    <show-hidden-files bool>
     <show-tooltips bool>
     <tooltip-size double>
     <file-icons>
diff --git a/settings/main.c b/settings/main.c
index 476cee5..12a9cc2 100644
--- a/settings/main.c
+++ b/settings/main.c
@@ -1689,7 +1689,8 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml,
     GtkWidget *appearance_container, *chk_custom_font_size,
               *spin_font_size, *w, *box, *spin_icon_size,
               *chk_show_thumbnails, *chk_single_click, *appearance_settings,
-              *chk_show_tooltips, *spin_tooltip_size, *bnt_exit, *content_area;
+              *chk_show_tooltips, *spin_tooltip_size, *bnt_exit, *content_area,
+              *chk_show_hidden_files;
     GtkBuilder *appearance_gxml;
     GError *error = NULL;
     GtkFileFilter *filter;
@@ -1730,6 +1731,10 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml,
     chk_single_click = GTK_WIDGET(gtk_builder_get_object(main_gxml,
                                                          "chk_single_click"));
 
+    /* show hidden files */
+    chk_show_hidden_files = GTK_WIDGET(gtk_builder_get_object(main_gxml,
+                                                              "chk_show_hidden_files"));
+
     /* tooltip options */
     chk_show_tooltips = GTK_WIDGET(gtk_builder_get_object(main_gxml, "chk_show_tooltips"));
     spin_tooltip_size = GTK_WIDGET(gtk_builder_get_object(main_gxml, "spin_tooltip_size"));
@@ -1957,6 +1962,9 @@ xfdesktop_settings_dialog_setup_tabs(GtkBuilder *main_gxml,
     xfconf_g_property_bind(channel, DESKTOP_ICONS_TOOLTIP_SIZE_PROP, G_TYPE_DOUBLE,
                            G_OBJECT(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin_tooltip_size))),
                            "value");
+    xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_HIDDEN_FILES,
+                           G_TYPE_BOOLEAN, G_OBJECT(chk_show_hidden_files),
+                           "active");
     xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_THUMBNAILS,
                            G_TYPE_BOOLEAN, G_OBJECT(chk_show_thumbnails),
                            "active");
diff --git a/settings/xfdesktop-settings-ui.glade b/settings/xfdesktop-settings-ui.glade
index 6ed21e0..c62e933 100644
--- a/settings/xfdesktop-settings-ui.glade
+++ b/settings/xfdesktop-settings-ui.glade
@@ -658,6 +658,16 @@
                                   </object>
                                 </child>
                                 <child>
+                                  <object class="GtkCheckButton" id="chk_show_hidden_files">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                    <property name="label" translatable="yes">Show hidden files on the desktop</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="draw_indicator">True</property>
+                                  </object>
+                                </child>
+                                <child>
                                   <object class="GtkHBox" id="hboxtooltip">
                                     <property name="visible">True</property>
                                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c
index 9c576ce..6e9e942 100644
--- a/src/xfce-desktop.c
+++ b/src/xfce-desktop.c
@@ -174,6 +174,8 @@ static void xfce_desktop_set_single_workspace_number(XfceDesktop *desktop,
 static gboolean xfce_desktop_get_single_workspace_mode(XfceDesktop *desktop);
 static gint xfce_desktop_get_current_workspace(XfceDesktop *desktop);
 
+static void hidden_state_changed_cb(GObject *object, XfceDesktop *desktop);
+
 static guint signals[N_SIGNALS] = { 0, };
 
 /* private functions */
@@ -258,6 +260,8 @@ xfce_desktop_setup_icon_view(XfceDesktop *desktop)
         }
         gtk_widget_show(desktop->priv->icon_view);
         gtk_container_add(GTK_CONTAINER(desktop), desktop->priv->icon_view);
+
+        g_signal_connect(G_OBJECT(manager), "hidden-state-changed", G_CALLBACK(hidden_state_changed_cb), desktop);
     }
     
     gtk_widget_queue_draw(GTK_WIDGET(desktop));
@@ -1448,6 +1452,46 @@ xfce_desktop_set_icon_style(XfceDesktop *desktop,
 #endif
 }
 
+static gboolean
+hidden_idle_cb(gpointer user_data)
+{
+    XfceDesktop *desktop;
+
+    g_return_if_fail(XFCE_IS_DESKTOP(user_data));
+
+    desktop = XFCE_DESKTOP(user_data);
+
+    /* destroy and load the icon view so that it adds or removes
+     * the hidden icons from the desktop */
+    if(desktop->priv->icon_view) {
+        gtk_widget_destroy(desktop->priv->icon_view);
+        desktop->priv->icon_view = NULL;
+    }
+
+    if(gtk_widget_get_realized(GTK_WIDGET(desktop)))
+        xfce_desktop_setup_icon_view(desktop);
+
+    return FALSE;
+}
+
+static void
+hidden_state_changed_cb(GObject *object,
+                        XfceDesktop *desktop)
+{
+    g_return_if_fail(XFCE_IS_DESKTOP(desktop));
+
+#ifdef ENABLE_DESKTOP_ICONS
+    if(desktop->priv->icon_view) {
+        g_signal_handlers_disconnect_by_func(object,
+                                             G_CALLBACK(hidden_state_changed_cb),
+                                             desktop);
+    }
+
+    /* We have to do this in an idle callback */
+    g_idle_add(hidden_idle_cb, desktop);
+#endif
+}
+
 XfceDesktopIconStyle
 xfce_desktop_get_icon_style(XfceDesktop *desktop)
 {
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index 943756a..4a2215b 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -91,9 +91,17 @@ typedef enum
     PROP_SHOW_DEVICE_VOLUME,
     PROP_SHOW_UNKNOWN_VOLUME,
     PROP_SHOW_THUMBNAILS,
+    PROP_SHOW_HIDDEN_FILES,
     PROP_MAX_TEMPLATES,
 } XfdesktopFileIconManagerProp;
 
+typedef enum
+{
+    HIDDEN_STATE_CHANGED,
+    LAST_SIGNAL,
+} XfdesktopFileIconManagerSignals;
+
+
 struct _XfdesktopFileIconManagerPrivate
 {
     gboolean inited;
@@ -125,6 +133,7 @@ struct _XfdesktopFileIconManagerPrivate
     gboolean show_unknown_volumes;
     gboolean show_special[XFDESKTOP_SPECIAL_FILE_ICON_TRASH+1];
     gboolean show_thumbnails;
+    gboolean show_hidden_files;
     
     guint save_icons_id;
     
@@ -197,6 +206,8 @@ static void xfdesktop_file_icon_manager_set_show_special_file(XfdesktopFileIconM
                                                               gboolean show_special_file);
 static void xfdesktop_file_icon_manager_set_show_thumbnails(XfdesktopFileIconManager *manager,
                                                             gboolean show_thumbnails);
+static void xfdesktop_file_icon_manager_set_show_hidden_files(XfdesktopFileIconManager *manager,
+                                                              gboolean show_hidden_files);
 static void xfdesktop_file_icon_manager_set_show_removable_media(XfdesktopFileIconManager *manager,
                                                                  XfdesktopFileIconManagerProp prop,
                                                                  gboolean show);
@@ -251,6 +262,8 @@ static XfdesktopClipboardManager *clipboard_manager = NULL;
 
 static GQuark xfdesktop_app_info_quark = 0;
 
+static guint fmanager_signals[LAST_SIGNAL] = { 0, };
+
 
 static void
 xfdesktop_file_icon_manager_class_init(XfdesktopFileIconManagerClass *klass)
@@ -262,7 +275,16 @@ xfdesktop_file_icon_manager_class_init(XfdesktopFileIconManagerClass *klass)
     gobject_class->set_property = xfdesktop_file_icon_manager_set_property;
     gobject_class->get_property = xfdesktop_file_icon_manager_get_property;
     gobject_class->finalize = xfdesktop_file_icon_manager_finalize;
-    
+
+    fmanager_signals[HIDDEN_STATE_CHANGED] = g_signal_new("hidden-state-changed",
+                                                          G_OBJECT_CLASS_TYPE(gobject_class),
+                                                          G_SIGNAL_RUN_FIRST,
+                                                          G_STRUCT_OFFSET(XfdesktopFileIconManagerClass, hidden_state_changed),
+                                                          NULL, NULL,
+                                                          g_cclosure_marshal_VOID__VOID,
+                                                          G_TYPE_NONE, 0);
+
+
     g_object_class_install_property(gobject_class, PROP_FOLDER,
                                     g_param_spec_object("folder", "Desktop Folder",
                                                        "Folder this icon manager manages",
@@ -326,6 +348,12 @@ xfdesktop_file_icon_manager_class_init(XfdesktopFileIconManagerClass *klass)
                                                          "show-thumbnails",
                                                          TRUE,
                                                          XFDESKTOP_PARAM_FLAGS));
+    g_object_class_install_property(gobject_class, PROP_SHOW_HIDDEN_FILES,
+                                    g_param_spec_boolean("show-hidden-files",
+                                                         "show-hidden-files",
+                                                         "show-hidden-files",
+                                                         FALSE,
+                                                         XFDESKTOP_PARAM_FLAGS));
     g_object_class_install_property(gobject_class, PROP_MAX_TEMPLATES,
                                     g_param_spec_uint("max-templates",
                                                       "max-templates",
@@ -402,6 +430,11 @@ xfdesktop_file_icon_manager_set_property(GObject *object,
                                                             g_value_get_boolean(value));
             break;
 
+        case PROP_SHOW_HIDDEN_FILES:
+            xfdesktop_file_icon_manager_set_show_hidden_files(fmanager,
+                                                              g_value_get_boolean(value));
+            break;
+
         case PROP_MAX_TEMPLATES:
             xfdesktop_file_icon_manager_set_max_templates(fmanager,
                                                           g_value_get_uint(value));
@@ -460,6 +493,10 @@ xfdesktop_file_icon_manager_get_property(GObject *object,
             g_value_set_boolean(value, fmanager->priv->show_thumbnails);
             break;
 
+        case PROP_SHOW_HIDDEN_FILES:
+            g_value_set_boolean(value, fmanager->priv->show_hidden_files);
+            break;
+
         case PROP_MAX_TEMPLATES:
             g_value_set_int(value, fmanager->priv->max_templates);
             break;
@@ -2112,7 +2149,7 @@ xfdesktop_file_icon_manager_add_regular_icon(XfdesktopFileIconManager *fmanager,
     /* if it's a .desktop file, and it has Hidden=true, or an
      * OnlyShowIn Or NotShowIn that would hide it from Xfce, don't
      * show it on the desktop (bug #4022) */
-    if(is_desktop_file)
+    if(is_desktop_file && !fmanager->priv->show_hidden_files)
     {
         gchar *path = g_file_get_path(file);
         XfceRc *rcfile = xfce_rc_simple_open(path, TRUE);
@@ -2124,18 +2161,21 @@ xfdesktop_file_icon_manager_add_regular_icon(XfdesktopFileIconManager *fmanager,
             xfce_rc_set_group(rcfile, "Desktop Entry");
             if(xfce_rc_read_bool_entry(rcfile, "Hidden", FALSE)) {
                 xfce_rc_close(rcfile);
+                XF_DEBUG("Not adding icon because it has the Hidden Desktop Entry set");
                 return NULL;
             }
 
             value = xfce_rc_read_entry(rcfile, "OnlyShowIn", NULL);
             if(value && strncmp(value, "XFCE;", 5) && !strstr(value, ";XFCE;")) {
                 xfce_rc_close(rcfile);
+                XF_DEBUG("Not adding icon because it has the OnlyShowIn Desktop Entry set");
                 return NULL;
             }
 
             value = xfce_rc_read_entry(rcfile, "NotShowIn", NULL);
             if(value && (!strncmp(value, "XFCE;", 5) || strstr(value, ";XFCE;"))) {
                 xfce_rc_close(rcfile);
+                XF_DEBUG("Not adding icon because it has the NotShowIn Desktop Entry set");
                 return NULL;
             }
 
@@ -2144,8 +2184,12 @@ xfdesktop_file_icon_manager_add_regular_icon(XfdesktopFileIconManager *fmanager,
     }
 
     /* If it's a hidden or backup file don't show it on the desktop */
-    if(g_file_info_get_is_hidden(info) || g_file_info_get_is_backup(info))
-        return NULL;
+    if(g_file_info_get_is_hidden(info) || g_file_info_get_is_backup(info)) {
+        if(!fmanager->priv->show_hidden_files) {
+            XF_DEBUG("Not adding icon because it is either hidden or a backup file");
+            return NULL;
+        }
+    }
 
     /* should never return NULL */
     icon = xfdesktop_regular_file_icon_new(file, info, fmanager->priv->gscreen, fmanager);
@@ -2448,22 +2492,15 @@ xfdesktop_file_icon_manager_file_changed(GFileMonitor     *monitor,
             }
 
             if(file_info) {
-                gboolean is_hidden;
-
-
-                is_hidden = g_file_info_get_attribute_boolean(file_info,
-                                                              G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN);
-                if(!is_hidden) {
-                    /* Add the icon adding the row/col info */
-                    icon = xfdesktop_file_icon_manager_add_regular_icon(fmanager,
-                                                                        other_file,
-                                                                        file_info,
-                                                                        row,
-                                                                        col,
-                                                                        FALSE);
-                    if(icon)
-                        xfdesktop_file_icon_position_changed(icon, fmanager);
-                }
+                /* Add the icon adding the row/col info */
+                icon = xfdesktop_file_icon_manager_add_regular_icon(fmanager,
+                                                                    other_file,
+                                                                    file_info,
+                                                                    row,
+                                                                    col,
+                                                                    FALSE);
+                if(icon)
+                    xfdesktop_file_icon_position_changed(icon, fmanager);
 
                 g_object_unref(file_info);
             }
@@ -2505,14 +2542,10 @@ xfdesktop_file_icon_manager_file_changed(GFileMonitor     *monitor,
             file_info = g_file_query_info(file, XFDESKTOP_FILE_INFO_NAMESPACE,
                                           G_FILE_QUERY_INFO_NONE, NULL, NULL);
             if(file_info) {
-                gboolean is_hidden = g_file_info_get_attribute_boolean(file_info,
-                                                                       G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN);
-                if(!is_hidden) {
-                    xfdesktop_file_icon_manager_add_regular_icon(fmanager,
-                                                                 file, file_info,
-                                                                 -1, -1,
-                                                                 TRUE);
-                }
+                xfdesktop_file_icon_manager_add_regular_icon(fmanager,
+                                                             file, file_info,
+                                                             -1, -1,
+                                                             TRUE);
 
                 g_object_unref(file_info);
             }
@@ -2646,7 +2679,6 @@ xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator,
     XfdesktopFileIconManager *fmanager;
     GError *error = NULL;
     GList *files, *l;
-    gboolean is_hidden;
 
     /* Sanity check */
     if(user_data == NULL || !XFDESKTOP_IS_FILE_ICON_MANAGER(user_data))
@@ -2706,21 +2738,17 @@ xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator,
         }
     } else {
         for(l = files; l; l = l->next) {
+            const gchar *name = g_file_info_get_name(l->data);
+            GFile *file = g_file_get_child(fmanager->priv->folder, name);
+
             DBG("got a GFileInfo: %s", g_file_info_get_display_name(l->data));
-            
-            is_hidden = g_file_info_get_attribute_boolean(l->data,
-                                                          G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN);
-            if(!is_hidden) {
-                const gchar *name = g_file_info_get_name(l->data);
-                GFile *file = g_file_get_child(fmanager->priv->folder, name);
-
-                xfdesktop_file_icon_manager_add_regular_icon(fmanager, 
-                                                             file, l->data,
-                                                             -1, -1,
-                                                             TRUE);
 
-                g_object_unref(file);
-            }
+            xfdesktop_file_icon_manager_add_regular_icon(fmanager,
+                                                         file, l->data,
+                                                         -1, -1,
+                                                         TRUE);
+
+            g_object_unref(file);
 
             g_object_unref(l->data);
         }
@@ -3615,6 +3643,8 @@ xfdesktop_file_icon_manager_new(GFile *folder,
                            G_OBJECT(fmanager), "show-unknown-volume");
     xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_THUMBNAILS, G_TYPE_BOOLEAN,
                            G_OBJECT(fmanager), "show-thumbnails");
+    xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_HIDDEN_FILES, G_TYPE_BOOLEAN,
+                           G_OBJECT(fmanager), "show-hidden-files");
     xfconf_g_property_bind(channel, DESKTOP_MENU_MAX_TEMPLATE_FILES, G_TYPE_INT,
                            G_OBJECT(fmanager), "max-templates");
 
@@ -3720,6 +3750,26 @@ xfdesktop_file_icon_manager_set_show_thumbnails(XfdesktopFileIconManager *manage
 }
 
 static void
+xfdesktop_file_icon_manager_set_show_hidden_files(XfdesktopFileIconManager *manager,
+                                                  gboolean show_hidden_files)
+{
+    g_return_if_fail(XFDESKTOP_IS_FILE_ICON_MANAGER(manager));
+
+    TRACE("entering show_hidden_files %s", show_hidden_files ? "TRUE" : "FALSE");
+
+    if(show_hidden_files == manager->priv->show_hidden_files)
+        return;
+
+    manager->priv->show_hidden_files = show_hidden_files;
+
+    if(!manager->priv->inited)
+        return;
+
+    /* Emit a signal so the desktop knows to reload the icons */
+    g_signal_emit(G_OBJECT(manager), fmanager_signals[HIDDEN_STATE_CHANGED], 0);
+}
+
+static void
 xfdesktop_file_icon_manager_set_max_templates(XfdesktopFileIconManager *manager,
                                               gint max_templates)
 {
diff --git a/src/xfdesktop-file-icon-manager.h b/src/xfdesktop-file-icon-manager.h
index 1317287..5a4fece 100644
--- a/src/xfdesktop-file-icon-manager.h
+++ b/src/xfdesktop-file-icon-manager.h
@@ -48,6 +48,9 @@ struct _XfdesktopFileIconManager
 struct _XfdesktopFileIconManagerClass
 {
     GObjectClass parent;
+
+    /*< signals >*/
+    void (*hidden_state_changed)(XfdesktopFileIconManager *fmanager);
 };
 
 GType xfdesktop_file_icon_manager_get_type(void) G_GNUC_CONST;

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


More information about the Xfce4-commits mailing list