Updating branch refs/heads/master
         to dede380139cf264918cc2478d19227e49ff0a1c5 (commit)
       from 21752061a451aa46b20a4b5417bc97a6dc8c1155 (commit)

commit dede380139cf264918cc2478d19227e49ff0a1c5
Author: Martin Pitt <[email protected]>
Date:   Tue Oct 12 10:21:47 2010 +0200

    Provide eject button on side pane for volumes
    
    Add an eject icon to the shortcuts sidebar for volumes which are ejectable 
or
    mounts which are unmountable by the user. This makes it much more obvious 
and
    easy how to unmount/eject removable storage again.
    
    http://bugzilla.xfce.org/show_bug.cgi?id=3658
    
    Signed-off-by: Jannis Pohlmann <[email protected]>

 thunar/thunar-shortcuts-model.c |   20 +++++++++++++++++++
 thunar/thunar-shortcuts-model.h |    2 +
 thunar/thunar-shortcuts-view.c  |   40 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 62 insertions(+), 0 deletions(-)

diff --git a/thunar/thunar-shortcuts-model.c b/thunar/thunar-shortcuts-model.c
index 2916aa9..0018c88 100644
--- a/thunar/thunar-shortcuts-model.c
+++ b/thunar/thunar-shortcuts-model.c
@@ -432,6 +432,9 @@ thunar_shortcuts_model_get_column_type (GtkTreeModel 
*tree_model,
     case THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE:
       return G_TYPE_BOOLEAN;
 
+    case THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT:
+      return G_TYPE_STRING;
+
     case THUNAR_SHORTCUTS_MODEL_COLUMN_SEPARATOR:
       return G_TYPE_BOOLEAN;
     }
@@ -554,6 +557,23 @@ thunar_shortcuts_model_get_value (GtkTreeModel *tree_model,
       g_value_set_boolean (value, shortcut->type == 
THUNAR_SHORTCUT_USER_DEFINED);
       break;
 
+    case THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT:
+      g_value_init (value, G_TYPE_STRING);
+      if (shortcut->volume != NULL)
+        {
+          mount = g_volume_get_mount (shortcut->volume);
+          if (g_volume_can_eject (shortcut->volume) || (mount != NULL && 
g_mount_can_unmount (mount)))
+            g_value_set_static_string (value, "media-eject");
+          else
+            g_value_set_static_string (value, "");
+          g_object_unref (mount);
+        }
+      else
+        {
+          g_value_set_static_string (value, "");
+        }
+      break;
+
     case THUNAR_SHORTCUTS_MODEL_COLUMN_SEPARATOR:
       g_value_init (value, G_TYPE_BOOLEAN);
       g_value_set_boolean (value, shortcut->type == THUNAR_SHORTCUT_SEPARATOR);
diff --git a/thunar/thunar-shortcuts-model.h b/thunar/thunar-shortcuts-model.h
index 98e8088..fad2c72 100644
--- a/thunar/thunar-shortcuts-model.h
+++ b/thunar/thunar-shortcuts-model.h
@@ -40,6 +40,7 @@ typedef struct _ThunarShortcutsModel      
ThunarShortcutsModel;
  * @THUNAR_SHORTCUTS_MODEL_COLUMN_FILE      : the index of the file column.
  * @THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME    : the index of the volume column.
  * @THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE   : tells whether a row is mutable.
+ * @THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT     : stock icon name for eject symbol
  * @THUNAR_SHORTCUTS_MODEL_COLUMN_SEPARATOR : tells whether a row is a 
separator.
  *
  * Columns exported by #ThunarShortcutsModel using the
@@ -51,6 +52,7 @@ typedef enum
   THUNAR_SHORTCUTS_MODEL_COLUMN_FILE,
   THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME,
   THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE,
+  THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT,
   THUNAR_SHORTCUTS_MODEL_COLUMN_SEPARATOR,
   THUNAR_SHORTCUTS_MODEL_N_COLUMNS,
 } ThunarShortcutsModelColumn;
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 58afcec..8ef7cdd 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -150,6 +150,7 @@ struct _ThunarShortcutsView
    * button-release-event should activate.
    */
   gint pressed_button;
+  guint pressed_eject_button : 1;
 
   /* drop site support */
   guint  drop_data_ready : 1; /* whether the drop data was received already */
@@ -283,6 +284,15 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view)
                                        "text", 
THUNAR_SHORTCUTS_MODEL_COLUMN_NAME,
                                        NULL);
 
+  /* allocate icon renderer for the eject symbol */
+  renderer = gtk_cell_renderer_pixbuf_new ();
+  g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+  gtk_tree_view_column_pack_start (column, renderer, FALSE);
+  gtk_tree_view_column_set_attributes (column, renderer,
+                                       "icon-name", 
THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT,
+                                       NULL);
+
+
   /* enable drag support for the shortcuts view (actually used to support 
reordering) */
   gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (view), 
GDK_BUTTON1_MASK, drag_targets,
                                           G_N_ELEMENTS (drag_targets), 
GDK_ACTION_MOVE);
@@ -331,9 +341,11 @@ thunar_shortcuts_view_button_press_event (GtkWidget      
*widget,
   GtkTreePath         *path;
   GtkTreeIter          iter;
   gboolean             result;
+  gchar               *eject_icon;
 
   /* reset the pressed button state */
   view->pressed_button = -1;
+  view->pressed_eject_button = 0;
 
   /* completely ignore double click events */
   if (event->type == GDK_2BUTTON_PRESS)
@@ -362,8 +374,32 @@ thunar_shortcuts_view_button_press_event (GtkWidget      
*widget,
       else if ((event->button == 1 || event->button == 2) && event->type == 
GDK_BUTTON_PRESS
             && (event->state & gtk_accelerator_get_default_mod_mask ()) == 0)
         {
+          /* check if we clicked the eject button area */
+          gint icon_width, icon_height, column_width;
+          column_width = gtk_tree_view_column_get_width 
(gtk_tree_view_get_column (GTK_TREE_VIEW (view), 0));
+          gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &icon_width, &icon_height);
+          if (event->x >= column_width - icon_width - 3)
+            {
+              /* check if that shortcut actually has an eject button */
+              model = gtk_tree_view_get_model (GTK_TREE_VIEW (view));
+              if (gtk_tree_model_get_iter (model, &iter, path))
+                {
+                  gtk_tree_model_get (model, &iter, 
THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT, &eject_icon, -1);
+                  if (strlen (eject_icon) > 0)
+                    view->pressed_eject_button = 1;
+                  g_free (eject_icon);
+                }
+            }
+
+          /*
+          g_debug("thunar_shortcuts_view_button_press_event(): x: %f, y: %f; 
my width: %i, eject width: %i, eject: %i", 
+                  event->x, event->y, column_width, icon_width, 
view->pressed_eject_button);
+          */
+
           /* remember the button as pressed and handle it in the release 
handler */
           view->pressed_button = event->button;
+
+
         }
 
       /* release the path */
@@ -384,6 +420,9 @@ thunar_shortcuts_view_button_release_event (GtkWidget      
*widget,
   /* check if we have an event matching the pressed button state */
   if (G_LIKELY (view->pressed_button == (gint) event->button))
     {
+      if (view->pressed_eject_button)
+        thunar_shortcuts_view_eject (view);
+
       /* check if we should simply open or open in new window */
       if (G_LIKELY (event->button == 1))
         thunar_shortcuts_view_open (view, FALSE);
@@ -393,6 +432,7 @@ thunar_shortcuts_view_button_release_event (GtkWidget      
*widget,
 
   /* reset the pressed button state */
   view->pressed_button = -1;
+  view->pressed_eject_button = 0;
 
   /* call the parent's release event handler */
   return (*GTK_WIDGET_CLASS 
(thunar_shortcuts_view_parent_class)->button_release_event) (widget, event);
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to