summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/xfdesktop-common.h1
-rw-r--r--doc/README.xfconf1
-rw-r--r--settings/main.c10
-rw-r--r--settings/xfdesktop-settings-ui.glade10
-rw-r--r--src/xfce-desktop.c44
-rw-r--r--src/xfdesktop-file-icon-manager.c134
-rw-r--r--src/xfdesktop-file-icon-manager.h3
7 files changed, 160 insertions, 43 deletions
diff --git a/common/xfdesktop-common.h b/common/xfdesktop-common.h
index 4c8ade64..424d3fce 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 80f0ed8a..9b1ef8e9 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 476cee59..12a9cc22 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 6ed21e06..c62e933a 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 9c576cee..6e9e942b 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 943756a2..4a2215b8 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 1317287b..5a4fece6 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;