diff options
-rw-r--r-- | common/xfdesktop-common.h | 1 | ||||
-rw-r--r-- | doc/README.xfconf | 1 | ||||
-rw-r--r-- | settings/main.c | 10 | ||||
-rw-r--r-- | settings/xfdesktop-settings-ui.glade | 10 | ||||
-rw-r--r-- | src/xfce-desktop.c | 44 | ||||
-rw-r--r-- | src/xfdesktop-file-icon-manager.c | 134 | ||||
-rw-r--r-- | 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 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; |