From 7e47d5c8f3c1daa2c02a789b74243432db631a21 Mon Sep 17 00:00:00 2001
From: Benedikt Meurer <benny@xfce.org>
Date: Tue, 14 Feb 2006 18:30:05 +0000
Subject: [PATCH] 2006-02-14	Benedikt Meurer <benny@xfce.org>

	* thunar/thunar-file.c(thunar_file_get_emblem_names): Use "cant-write"
	  emblem for non-writable files owned by the user, to make it obvious
	  why an application will not be able to save the file (unless the
	  application uses a write to temporary, rename, unlink temporary
	  procedure).
	* thunar/thunar-location-buttons.c(thunar_location_buttons_forall): Do
	  not include the slider buttons unless include_internals is TRUE.
	* thunar/thunar-location-buttons.c: Remove buttons from the path bar
	  whenever a displayed directory is deleted. Bug #1451.




(Old svn revision: 19871)
---
 ChangeLog                        | 12 +++++
 thunar/thunar-file.c             |  7 +++
 thunar/thunar-location-buttons.c | 86 ++++++++++++++++++++++++++------
 3 files changed, 90 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 77ebb8304..6d7a54900 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-02-14	Benedikt Meurer <benny@xfce.org>
+
+	* thunar/thunar-file.c(thunar_file_get_emblem_names): Use "cant-write"
+	  emblem for non-writable files owned by the user, to make it obvious
+	  why an application will not be able to save the file (unless the
+	  application uses a write to temporary, rename, unlink temporary
+	  procedure).
+	* thunar/thunar-location-buttons.c(thunar_location_buttons_forall): Do
+	  not include the slider buttons unless include_internals is TRUE.
+	* thunar/thunar-location-buttons.c: Remove buttons from the path bar
+	  whenever a displayed directory is deleted. Bug #1451.
+
 2006-02-14	Benedikt Meurer <benny@xfce.org>
 
 	* thunar-vfs/thunar-vfs-creat-job.c, thunar-vfs/thunar-vfs-info.c,
diff --git a/thunar/thunar-file.c b/thunar/thunar-file.c
index acd9d0789..e3ff3bfb5 100644
--- a/thunar/thunar-file.c
+++ b/thunar/thunar-file.c
@@ -1478,6 +1478,13 @@ thunar_file_get_emblem_names (ThunarFile *file)
     {
       emblems = g_list_prepend (emblems, THUNAR_FILE_EMBLEM_NAME_CANT_READ);
     }
+  else if (G_UNLIKELY (file->info->uid == effective_user_id && !thunar_file_is_writable (file)))
+    {
+      /* we own the file, but we cannot write to it, that's why we mark it as "cant-write", so
+       * users won't be surprised when opening the file in a text editor, but are unable to save.
+       */
+      emblems = g_list_prepend (emblems, THUNAR_FILE_EMBLEM_NAME_CANT_WRITE);
+    }
 
   return emblems;
 }
diff --git a/thunar/thunar-location-buttons.c b/thunar/thunar-location-buttons.c
index 32c90716d..d220caba1 100644
--- a/thunar/thunar-location-buttons.c
+++ b/thunar/thunar-location-buttons.c
@@ -32,6 +32,7 @@
 #endif
 
 #include <thunar/thunar-dnd.h>
+#include <thunar/thunar-file-monitor.h>
 #include <thunar/thunar-gobject-extensions.h>
 #include <thunar/thunar-icon-factory.h>
 #include <thunar/thunar-location-buttons.h>
@@ -91,6 +92,9 @@ static GtkWidget     *thunar_location_buttons_make_button            (ThunarLoca
                                                                       ThunarFile                 *file);
 static void           thunar_location_buttons_remove_1               (GtkContainer               *container,
                                                                       GtkWidget                  *widget);
+static void           thunar_location_buttons_file_destroyed         (ThunarFileMonitor          *file_monitor,
+                                                                      ThunarFile                 *file,
+                                                                      ThunarLocationButtons      *buttons);
 static gboolean       thunar_location_buttons_scroll_timeout         (gpointer                    user_data);
 static void           thunar_location_buttons_scroll_timeout_destroy (gpointer                    user_data);
 static void           thunar_location_buttons_stop_scrolling         (ThunarLocationButtons      *buttons);
@@ -156,27 +160,29 @@ struct _ThunarLocationButtons
 {
   GtkContainer __parent__;
 
-  GtkWidget     *left_slider;
-  GtkWidget     *right_slider;
+  GtkWidget         *left_slider;
+  GtkWidget         *right_slider;
+
+  ThunarFileMonitor *file_monitor;
 
-  ThunarFile    *current_directory;
+  ThunarFile        *current_directory;
 
-  gint           slider_width;
-  gboolean       ignore_click : 1;
+  gint               slider_width;
+  gboolean           ignore_click : 1;
 
-  GList         *list;
-  GList         *first_scrolled_button;
+  GList             *list;
+  GList             *first_scrolled_button;
 
-  gint           scroll_timeout_id;
+  gint               scroll_timeout_id;
 
   /* enter directories using DnD */
-  GtkWidget     *enter_button;
-  gint           enter_timeout_id;
+  GtkWidget         *enter_button;
+  gint               enter_timeout_id;
 
   /* Drop support for the buttons */
-  GList         *drop_path_list;
-  guint          drop_data_ready : 1;
-  guint          drop_occurred : 1;
+  GList             *drop_path_list;
+  guint              drop_data_ready : 1;
+  guint              drop_occurred : 1;
 };
 
 
@@ -312,6 +318,10 @@ thunar_location_buttons_init (ThunarLocationButtons *buttons)
 {
   GtkWidget *arrow;
 
+  /* connect to the file monitor */
+  buttons->file_monitor = thunar_file_monitor_get_default ();
+  g_signal_connect (G_OBJECT (buttons->file_monitor), "file-destroyed", G_CALLBACK (thunar_location_buttons_file_destroyed), buttons);
+
   GTK_WIDGET_SET_FLAGS (buttons, GTK_NO_WINDOW);
   gtk_widget_set_redraw_on_allocate (GTK_WIDGET (buttons), FALSE);
 
@@ -373,6 +383,10 @@ thunar_location_buttons_finalize (GObject *object)
   /* release from the current_directory */
   thunar_navigator_set_current_directory (THUNAR_NAVIGATOR (buttons), NULL);
 
+  /* disconnect from the file monitor */
+  g_signal_handlers_disconnect_by_func (G_OBJECT (buttons->file_monitor), thunar_location_buttons_file_destroyed, buttons);
+  g_object_unref (G_OBJECT (buttons->file_monitor));
+
   (*G_OBJECT_CLASS (thunar_location_buttons_parent_class)->finalize) (object);
 }
 
@@ -863,10 +877,10 @@ thunar_location_buttons_forall (GtkContainer *container,
       (*callback) (child, callback_data);
     }
 
-  if (buttons->left_slider != NULL)
+  if (buttons->left_slider != NULL && include_internals)
     (*callback) (buttons->left_slider, callback_data);
 
-  if (buttons->right_slider != NULL)
+  if (buttons->right_slider != NULL && include_internals)
     (*callback) (buttons->right_slider, callback_data);
 }
 
@@ -960,6 +974,48 @@ thunar_location_buttons_remove_1 (GtkContainer *container,
 
 
 
+static void
+thunar_location_buttons_file_destroyed (ThunarFileMonitor     *file_monitor,
+                                        ThunarFile            *file,
+                                        ThunarLocationButtons *buttons)
+{
+  GList *children;
+  GList *lp;
+
+  g_return_if_fail (THUNAR_IS_FILE (file));
+  g_return_if_fail (THUNAR_IS_LOCATION_BUTTONS (buttons));
+  g_return_if_fail (THUNAR_IS_FILE_MONITOR (file_monitor));
+
+  /* check all buttons whether one of them refers to the destroyed file,
+   * remember the children list is in reversed order. That is, the last
+   * button displayed in the path bar, is the first entry in the child
+   * list.
+   */
+  children = gtk_container_get_children (GTK_CONTAINER (buttons));
+  for (lp = children; lp != NULL; lp = lp->next)
+    {
+      /* stop as soon as we reach the current-directory button */
+      if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lp->data)))
+        {
+          lp = NULL;
+          break;
+        }
+
+      /* check if the button is for the destroyed file */
+      if (g_object_get_qdata (G_OBJECT (lp->data), thunar_file_quark) == file)
+        break;
+    }
+
+  /* remove all buttons after (and including) the destroyed file */
+  for (; lp != NULL; lp = lp->prev)
+    gtk_widget_destroy (GTK_WIDGET (lp->data));
+
+  /* release the list of children */
+  g_list_free (children);
+}
+
+
+
 static gboolean
 thunar_location_buttons_scroll_timeout (gpointer user_data)
 {
-- 
GitLab