From 9e9b90bc01ba017aae0dfc3a5ce7982b47673bfa Mon Sep 17 00:00:00 2001
From: Benedikt Meurer <benny@xfce.org>
Date: Wed, 8 Mar 2006 15:25:29 +0000
Subject: [PATCH] 2006-03-08	Benedikt Meurer <benny@xfce.org>

	* thunar/thunar-shortcuts-view.c: Always open shortcuts using single
	  clicks.




(Old svn revision: 20291)
---
 ChangeLog                      |   5 +
 thunar/thunar-shortcuts-view.c | 414 +++++++++++++++++----------------
 2 files changed, 224 insertions(+), 195 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a2af7c9e3..601231d24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-08	Benedikt Meurer <benny@xfce.org>
+
+	* thunar/thunar-shortcuts-view.c: Always open shortcuts using single
+	  clicks.
+
 2006-03-08	Benedikt Meurer <benny@xfce.org>
 
 	* thunar-uca/thunar-uca-provider.c: Pass the correct working directory
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 5dffd0cd0..c38fe7ab9 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -30,7 +30,6 @@
 #include <thunar/thunar-shortcuts-icon-renderer.h>
 #include <thunar/thunar-shortcuts-model.h>
 #include <thunar/thunar-shortcuts-view.h>
-#include <thunar/thunar-text-renderer.h>
 
 
 
@@ -55,6 +54,10 @@ static void         thunar_shortcuts_view_init                   (ThunarShortcut
 static void         thunar_shortcuts_view_finalize               (GObject                  *object);
 static gboolean     thunar_shortcuts_view_button_press_event     (GtkWidget                *widget,
                                                                   GdkEventButton           *event);
+static gboolean     thunar_shortcuts_view_button_release_event   (GtkWidget                *widget,
+                                                                  GdkEventButton           *event);
+static void         thunar_shortcuts_view_drag_begin             (GtkWidget                *widget,
+                                                                  GdkDragContext           *context);
 static void         thunar_shortcuts_view_drag_data_received     (GtkWidget                *widget,
                                                                   GdkDragContext           *context,
                                                                   gint                      x,
@@ -72,9 +75,6 @@ static gboolean     thunar_shortcuts_view_drag_motion            (GtkWidget
                                                                   gint                      x,
                                                                   gint                      y,
                                                                   guint                     time);
-static void         thunar_shortcuts_view_row_activated          (GtkTreeView              *tree_view,
-                                                                  GtkTreePath              *path,
-                                                                  GtkTreeViewColumn        *column);
 static void         thunar_shortcuts_view_remove_activated       (GtkWidget                *item,
                                                                   ThunarShortcutsView      *view);
 static void         thunar_shortcuts_view_rename_activated       (GtkWidget                *item,
@@ -102,14 +102,20 @@ static gboolean     thunar_shortcuts_view_separator_func         (GtkTreeModel
 
 struct _ThunarShortcutsViewClass
 {
-  ExoTreeViewClass __parent__;
+  GtkTreeViewClass __parent__;
 };
 
 struct _ThunarShortcutsView
 {
-  ExoTreeView        __parent__;
+  GtkTreeView        __parent__;
   ThunarPreferences *preferences;
 
+  /* the currently pressed mouse button, set in the
+   * button-press-event handler if the associated
+   * button-release-event should activate.
+   */
+  gint pressed_button;
+
 #if GTK_CHECK_VERSION(2,8,0)
   /* id of the signal used to queue a resize on the
    * column whenever the shortcuts icon size is changed.
@@ -159,7 +165,7 @@ thunar_shortcuts_view_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (EXO_TYPE_TREE_VIEW, I_("ThunarShortcutsView"), &info, 0);
+      type = g_type_register_static (GTK_TYPE_TREE_VIEW, I_("ThunarShortcutsView"), &info, 0);
     }
 
   return type;
@@ -170,9 +176,8 @@ thunar_shortcuts_view_get_type (void)
 static void
 thunar_shortcuts_view_class_init (ThunarShortcutsViewClass *klass)
 {
-  GtkTreeViewClass *gtktree_view_class;
-  GtkWidgetClass   *gtkwidget_class;
-  GObjectClass     *gobject_class;
+  GtkWidgetClass *gtkwidget_class;
+  GObjectClass   *gobject_class;
 
   /* determine the parent type class */
   thunar_shortcuts_view_parent_class = g_type_class_peek_parent (klass);
@@ -182,13 +187,12 @@ thunar_shortcuts_view_class_init (ThunarShortcutsViewClass *klass)
 
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->button_press_event = thunar_shortcuts_view_button_press_event;
+  gtkwidget_class->button_release_event = thunar_shortcuts_view_button_release_event;
+  gtkwidget_class->drag_begin = thunar_shortcuts_view_drag_begin;
   gtkwidget_class->drag_data_received = thunar_shortcuts_view_drag_data_received;
   gtkwidget_class->drag_drop = thunar_shortcuts_view_drag_drop;
   gtkwidget_class->drag_motion = thunar_shortcuts_view_drag_motion;
 
-  gtktree_view_class = GTK_TREE_VIEW_CLASS (klass);
-  gtktree_view_class->row_activated = thunar_shortcuts_view_row_activated;
-
   /**
    * ThunarShortcutsView:shortcut-activated:
    *
@@ -221,9 +225,6 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view)
   view->preferences = thunar_preferences_get ();
   g_signal_connect_swapped (G_OBJECT (view->preferences), "notify::shortcuts-icon-emblems", G_CALLBACK (gtk_widget_queue_draw), view);
 
-  /* apply the single-click mode setting */
-  exo_binding_new (G_OBJECT (view->preferences), "misc-single-click", G_OBJECT (view), "single-click");
-
   /* allocate a single column for our renderers */
   column = g_object_new (GTK_TYPE_TREE_VIEW_COLUMN,
                          "reorderable", FALSE,
@@ -254,8 +255,7 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view)
   exo_binding_new (G_OBJECT (view->preferences), "shortcuts-icon-emblems", G_OBJECT (renderer), "emblems");
 
   /* allocate the text renderer */
-  renderer = g_object_new (THUNAR_TYPE_TEXT_RENDERER, "xalign", 0.0f, NULL);
-  exo_binding_new (G_OBJECT (view->preferences), "misc-single-click", G_OBJECT (renderer), "follow-prelit");
+  renderer = gtk_cell_renderer_text_new ();
   g_signal_connect (G_OBJECT (renderer), "edited", G_CALLBACK (thunar_shortcuts_view_renamed), view);
   gtk_tree_view_column_pack_start (column, renderer, TRUE);
   gtk_tree_view_column_set_attributes (column, renderer,
@@ -314,204 +314,202 @@ thunar_shortcuts_view_button_press_event (GtkWidget      *widget,
   GtkWidget           *menu;
   GtkWidget           *item;
   GMainLoop           *loop;
-  gboolean             single_click;
   gboolean             mutable;
   gboolean             result;
   GList               *actions;
   GList               *lp;
 
-  /* check if we are in single-click mode */
-  g_object_get (G_OBJECT (view->preferences), "misc-single-click", &single_click, NULL);
+  /* reset the pressed button state */
+  view->pressed_button = -1;
 
   /* let the widget process the event first (handles focussing and scrolling) */
   result = (*GTK_WIDGET_CLASS (thunar_shortcuts_view_parent_class)->button_press_event) (widget, event);
 
-  /* check if we have a right-click event */
-  if (G_LIKELY (event->button != 3))
-    {
-      /* we open a new window for single/double-middle-clicks */
-      if (G_UNLIKELY (event->type == (single_click ? GDK_BUTTON_PRESS : GDK_2BUTTON_PRESS) && event->button == 2))
-        {
-          /* just open in new window */
-          thunar_shortcuts_view_open_in_new_window (view);
-        }
-
-      return result;
-    }
-
   /* resolve the path at the cursor position */
   if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), event->x, event->y, &path, NULL, NULL, NULL))
     {
-      /* allocate a new tooltips object */
-      tooltips = gtk_tooltips_new ();
-      exo_gtk_object_ref_sink (GTK_OBJECT (tooltips));
-
-      /* determine the iterator for the selected row */
-      model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
-      gtk_tree_model_get_iter (model, &iter, path);
-
-      /* check whether the shortcut at the given path is mutable */
-      gtk_tree_model_get (model, &iter,
-                          THUNAR_SHORTCUTS_MODEL_COLUMN_FILE, &file,
-                          THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
-                          THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE, &mutable, 
-                          -1);
-
-      /* prepare the internal loop */
-      loop = g_main_loop_new (NULL, FALSE);
-
-      /* prepare the popup menu */
-      menu = gtk_menu_new ();
-      gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (widget));
-      g_signal_connect_swapped (G_OBJECT (menu), "deactivate", G_CALLBACK (g_main_loop_quit), loop);
-      exo_gtk_object_ref_sink (GTK_OBJECT (menu));
-
-      /* append the "Open" menu action */
-      item = gtk_image_menu_item_new_with_mnemonic (_("_Open"));
-      g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_open), widget);
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* set the stock icon */
-      image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
-      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
-      gtk_widget_show (image);
-
-      /* append the "Open in New Window" menu action */
-      item = gtk_image_menu_item_new_with_mnemonic (_("Open in New Window"));
-      g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_open_in_new_window), widget);
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* append a menu separator */
-      item = gtk_separator_menu_item_new ();
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* check if we have a volume here */
-      if (G_UNLIKELY (volume != NULL))
+      /* check if we should popup the context menu */
+      if (G_UNLIKELY (event->button == 3 && event->type == GDK_BUTTON_PRESS))
         {
-          /* append the "Mount Volume" menu action */
-          item = gtk_image_menu_item_new_with_mnemonic (_("_Mount Volume"));
-          gtk_widget_set_sensitive (item, !thunar_vfs_volume_is_mounted (volume));
-          g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_mount), widget);
+          /* allocate a new tooltips object */
+          tooltips = gtk_tooltips_new ();
+          exo_gtk_object_ref_sink (GTK_OBJECT (tooltips));
+
+          /* determine the iterator for the selected row */
+          model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+          gtk_tree_model_get_iter (model, &iter, path);
+
+          /* check whether the shortcut at the given path is mutable */
+          gtk_tree_model_get (model, &iter,
+                              THUNAR_SHORTCUTS_MODEL_COLUMN_FILE, &file,
+                              THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
+                              THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE, &mutable, 
+                              -1);
+
+          /* prepare the internal loop */
+          loop = g_main_loop_new (NULL, FALSE);
+
+          /* prepare the popup menu */
+          menu = gtk_menu_new ();
+          gtk_menu_set_screen (GTK_MENU (menu), gtk_widget_get_screen (widget));
+          g_signal_connect_swapped (G_OBJECT (menu), "deactivate", G_CALLBACK (g_main_loop_quit), loop);
+          exo_gtk_object_ref_sink (GTK_OBJECT (menu));
+
+          /* append the "Open" menu action */
+          item = gtk_image_menu_item_new_with_mnemonic (_("_Open"));
+          g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_open), widget);
           gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
           gtk_widget_show (item);
 
-          /* check if the volume is a disc */
-          if (thunar_vfs_volume_is_disc (volume))
-            {
-              /* append the "Eject Volume" menu action */
-              item = gtk_image_menu_item_new_with_mnemonic (_("E_ject Volume"));
-              g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_eject), widget);
-              gtk_widget_set_sensitive (item, thunar_vfs_volume_is_ejectable (volume));
-              gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-              gtk_widget_show (item);
-            }
-          else
-            {
-              /* append the "Unmount Volume" menu item */
-              item = gtk_image_menu_item_new_with_mnemonic (_("_Unmount Volume"));
-              gtk_widget_set_sensitive (item, thunar_vfs_volume_is_mounted (volume));
-              g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_unmount), widget);
-              gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-              gtk_widget_show (item);
-            }
+          /* set the stock icon */
+          image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU);
+          gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+          gtk_widget_show (image);
+
+          /* append the "Open in New Window" menu action */
+          item = gtk_image_menu_item_new_with_mnemonic (_("Open in New Window"));
+          g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_open_in_new_window), widget);
+          gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+          gtk_widget_show (item);
 
           /* append a menu separator */
           item = gtk_separator_menu_item_new ();
           gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
           gtk_widget_show (item);
-        }
 
-      /* append the custom actions for the selected file (if any) */
-      if (G_LIKELY (file != NULL))
-        {
-          /* determine the toplevel window */
-          window = gtk_widget_get_toplevel (widget);
-
-          /* determine the actions for the selected file */
-          actions = thunar_file_get_actions (file, window);
-
-          /* check if we have any actions */
-          if (G_LIKELY (actions != NULL))
+          /* check if we have a volume here */
+          if (G_UNLIKELY (volume != NULL))
             {
-              /* append the actions */
-              for (lp = actions; lp != NULL; lp = lp->next)
+              /* append the "Mount Volume" menu action */
+              item = gtk_image_menu_item_new_with_mnemonic (_("_Mount Volume"));
+              gtk_widget_set_sensitive (item, !thunar_vfs_volume_is_mounted (volume));
+              g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_mount), widget);
+              gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+              gtk_widget_show (item);
+
+              /* check if the volume is a disc */
+              if (thunar_vfs_volume_is_disc (volume))
                 {
-                  /* append the menu item */
-                  item = gtk_action_create_menu_item (GTK_ACTION (lp->data));
+                  /* append the "Eject Volume" menu action */
+                  item = gtk_image_menu_item_new_with_mnemonic (_("E_ject Volume"));
+                  g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_eject), widget);
+                  gtk_widget_set_sensitive (item, thunar_vfs_volume_is_ejectable (volume));
+                  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+                  gtk_widget_show (item);
+                }
+              else
+                {
+                  /* append the "Unmount Volume" menu item */
+                  item = gtk_image_menu_item_new_with_mnemonic (_("_Unmount Volume"));
+                  gtk_widget_set_sensitive (item, thunar_vfs_volume_is_mounted (volume));
+                  g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_unmount), widget);
                   gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
                   gtk_widget_show (item);
-
-                  /* release the reference on the action */
-                  g_object_unref (G_OBJECT (lp->data));
                 }
-              g_list_free (actions);
 
               /* append a menu separator */
               item = gtk_separator_menu_item_new ();
               gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
               gtk_widget_show (item);
             }
+
+          /* append the custom actions for the selected file (if any) */
+          if (G_LIKELY (file != NULL))
+            {
+              /* determine the toplevel window */
+              window = gtk_widget_get_toplevel (widget);
+
+              /* determine the actions for the selected file */
+              actions = thunar_file_get_actions (file, window);
+
+              /* check if we have any actions */
+              if (G_LIKELY (actions != NULL))
+                {
+                  /* append the actions */
+                  for (lp = actions; lp != NULL; lp = lp->next)
+                    {
+                      /* append the menu item */
+                      item = gtk_action_create_menu_item (GTK_ACTION (lp->data));
+                      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+                      gtk_widget_show (item);
+
+                      /* release the reference on the action */
+                      g_object_unref (G_OBJECT (lp->data));
+                    }
+                  g_list_free (actions);
+
+                  /* append a menu separator */
+                  item = gtk_separator_menu_item_new ();
+                  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+                  gtk_widget_show (item);
+                }
+            }
+
+          /* append the remove menu item */
+          item = gtk_image_menu_item_new_with_mnemonic (_("_Remove Shortcut"));
+          g_object_set_data_full (G_OBJECT (item), I_("thunar-shortcuts-row"),
+                                  gtk_tree_row_reference_new (model, path),
+                                  (GDestroyNotify) gtk_tree_row_reference_free);
+          g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_remove_activated), widget);
+          gtk_widget_set_sensitive (item, mutable);
+          gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+          gtk_widget_show (item);
+
+          /* set the remove stock icon */
+          image = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU);
+          gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+          gtk_widget_show (image);
+
+          /* append the rename menu item */
+          item = gtk_image_menu_item_new_with_mnemonic (_("Re_name Shortcut"));
+          g_object_set_data_full (G_OBJECT (item), I_("thunar-shortcuts-row"),
+                                  gtk_tree_row_reference_new (model, path),
+                                  (GDestroyNotify) gtk_tree_row_reference_free);
+          g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_rename_activated), widget);
+          gtk_widget_set_sensitive (item, mutable);
+          gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+          gtk_widget_show (item);
+
+          /* append a menu separator */
+          item = gtk_separator_menu_item_new ();
+          gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+          gtk_widget_show (item);
+
+          /* append the "Display icon emblems" item */
+          item = gtk_check_menu_item_new_with_mnemonic (_("Display _Emblem Icons"));
+          exo_mutual_binding_new (G_OBJECT (view->preferences), "shortcuts-icon-emblems", G_OBJECT (item), "active");
+          gtk_tooltips_set_tip (tooltips, item, _("Display emblem icons in the shortcuts list for all files for which "
+                                                  "emblems have been defined in the file properties dialog."), NULL);
+          gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+          gtk_widget_show (item);
+
+          /* run the internal loop */
+          gtk_grab_add (menu);
+          gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, event->time);
+          g_main_loop_run (loop);
+          gtk_grab_remove (menu);
+
+          /* clean up */
+          if (G_LIKELY (file != NULL))
+            g_object_unref (G_OBJECT (file));
+          if (G_UNLIKELY (volume != NULL))
+            g_object_unref (G_OBJECT (volume));
+          g_object_unref (G_OBJECT (tooltips));
+          g_object_unref (G_OBJECT (menu));
+          g_main_loop_unref (loop);
+
+          /* we effectively handled the event */
+          result = TRUE;
+        }
+      else if ((event->button == 1 || event->button == 2) && event->type == GDK_BUTTON_PRESS
+            && (event->state & gtk_accelerator_get_default_mod_mask ()) == 0)
+        {
+          /* remember the button as pressed and handle it in the release handler */
+          view->pressed_button = event->button;
         }
 
-      /* append the remove menu item */
-      item = gtk_image_menu_item_new_with_mnemonic (_("_Remove Shortcut"));
-      g_object_set_data_full (G_OBJECT (item), I_("thunar-shortcuts-row"),
-                              gtk_tree_row_reference_new (model, path),
-                              (GDestroyNotify) gtk_tree_row_reference_free);
-      g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_remove_activated), widget);
-      gtk_widget_set_sensitive (item, mutable);
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* set the remove stock icon */
-      image = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU);
-      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
-      gtk_widget_show (image);
-
-      /* append the rename menu item */
-      item = gtk_image_menu_item_new_with_mnemonic (_("Re_name Shortcut"));
-      g_object_set_data_full (G_OBJECT (item), I_("thunar-shortcuts-row"),
-                              gtk_tree_row_reference_new (model, path),
-                              (GDestroyNotify) gtk_tree_row_reference_free);
-      g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_rename_activated), widget);
-      gtk_widget_set_sensitive (item, mutable);
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* append a menu separator */
-      item = gtk_separator_menu_item_new ();
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* append the "Display icon emblems" item */
-      item = gtk_check_menu_item_new_with_mnemonic (_("Display _Emblem Icons"));
-      exo_mutual_binding_new (G_OBJECT (view->preferences), "shortcuts-icon-emblems", G_OBJECT (item), "active");
-      gtk_tooltips_set_tip (tooltips, item, _("Display emblem icons in the shortcuts list for all files for which "
-                                              "emblems have been defined in the file properties dialog."), NULL);
-      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-      gtk_widget_show (item);
-
-      /* run the internal loop */
-      gtk_grab_add (menu);
-      gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, 0, event->time);
-      g_main_loop_run (loop);
-      gtk_grab_remove (menu);
-
-      /* clean up */
-      if (G_LIKELY (file != NULL))
-        g_object_unref (G_OBJECT (file));
-      if (G_UNLIKELY (volume != NULL))
-        g_object_unref (G_OBJECT (volume));
-      g_object_unref (G_OBJECT (tooltips));
-      g_object_unref (G_OBJECT (menu));
+      /* release the path */
       gtk_tree_path_free (path);
-      g_main_loop_unref (loop);
-
-      /* we effectively handled the event */
-      return TRUE;
     }
 
   return result;
@@ -519,6 +517,47 @@ thunar_shortcuts_view_button_press_event (GtkWidget      *widget,
 
 
 
+static gboolean
+thunar_shortcuts_view_button_release_event (GtkWidget      *widget,
+                                            GdkEventButton *event)
+{
+  ThunarShortcutsView *view = THUNAR_SHORTCUTS_VIEW (widget);
+
+  /* check if we have an event matching the pressed button state */
+  if (G_LIKELY (view->pressed_button == event->button))
+    {
+      /* check if we should simply open or open in new window */
+      if (G_LIKELY (event->button == 1))
+        thunar_shortcuts_view_open (view);
+      else if (G_UNLIKELY (event->button == 2))
+        thunar_shortcuts_view_open_in_new_window (view);
+    }
+
+  /* reset the pressed button state */
+  view->pressed_button = -1;
+
+  /* call the parent's release event handler */
+  return (*GTK_WIDGET_CLASS (thunar_shortcuts_view_parent_class)->button_release_event) (widget, event);
+}
+
+
+
+static void
+thunar_shortcuts_view_drag_begin (GtkWidget      *widget,
+                                  GdkDragContext *context)
+{
+  ThunarShortcutsView *view = THUNAR_SHORTCUTS_VIEW (widget);
+
+  /* reset the pressed button state */
+  view->pressed_button = -1;
+
+  /* call the parent's drag_begin() handler */
+  if (GTK_WIDGET_CLASS (thunar_shortcuts_view_parent_class)->drag_begin != NULL)
+    (*GTK_WIDGET_CLASS (thunar_shortcuts_view_parent_class)->drag_begin) (widget, context);
+}
+
+
+
 static void
 thunar_shortcuts_view_drag_data_received (GtkWidget        *widget,
                                           GdkDragContext   *context,
@@ -630,21 +669,6 @@ thunar_shortcuts_view_drag_motion (GtkWidget      *widget,
 
 
 
-static void
-thunar_shortcuts_view_row_activated (GtkTreeView       *tree_view,
-                                     GtkTreePath       *path,
-                                     GtkTreeViewColumn *column)
-{
-  /* call the row-activated method in the parent class */
-  if (GTK_TREE_VIEW_CLASS (thunar_shortcuts_view_parent_class)->row_activated != NULL)
-    (*GTK_TREE_VIEW_CLASS (thunar_shortcuts_view_parent_class)->row_activated) (tree_view, path, column);
-
-  /* open the folder referenced by the shortcut */
-  thunar_shortcuts_view_open (THUNAR_SHORTCUTS_VIEW (tree_view));
-}
-
-
-
 static void
 thunar_shortcuts_view_remove_activated (GtkWidget           *item,
                                         ThunarShortcutsView *view)
-- 
GitLab