[nautilus/wip/gbsneto/pathbar] pathbar: handle context menu
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/gbsneto/pathbar] pathbar: handle context menu
- Date: Mon, 3 Aug 2015 01:37:21 +0000 (UTC)
commit fdcf91d0e84c203895ff8b28ad6b94d3550e13eb
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Sun Aug 2 22:14:40 2015 -0300
pathbar: handle context menu
NautilusView is an abstract class that manages
various context menus, depending on the view's
location, the clicked point and the implementation
details.
While this in theory provides a good isolation
from other classes, in practice NautilusView
manages the pathbar context menu, which is not
necessary, as it doesn't depend on the current
view by no means.
Fix that by making NautilusPathBar manage the
context menu by itself instead of the view. To
cleanly implement that, add a new signal that
matches GtkPlacesSidebar::open-location signature,
and adapt NautilusWindow to reuse the existing
methods to handle pathbar's new signal.
https://bugzilla.gnome.org/show_bug.cgi?id=753158
src/nautilus-pathbar-context-menu.xml | 23 +++
src/nautilus-pathbar.c | 248 +++++++++++++++++++++++++++++---
src/nautilus-pathbar.h | 6 +-
src/nautilus-view-context-menus.xml | 20 ---
src/nautilus-view.c | 180 +------------------------
src/nautilus-view.h | 3 -
src/nautilus-window.c | 63 +--------
src/nautilus.gresource.xml | 1 +
8 files changed, 259 insertions(+), 285 deletions(-)
---
diff --git a/src/nautilus-pathbar-context-menu.xml b/src/nautilus-pathbar-context-menu.xml
new file mode 100644
index 0000000..11b6885
--- /dev/null
+++ b/src/nautilus-pathbar-context-menu.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <menu id="pathbar-menu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">Open In New _Tab</attribute>
+ <attribute name="action">pathbar.open-item-new-tab</attribute>
+ <attribute name="hidden-when">action-disabled</attribute>
+ </item>
+ <item>
+ <attribute name="label" translatable="yes">Open In New _Window</attribute>
+ <attribute name="action">pathbar.open-item-new-window</attribute>
+ <attribute name="hidden-when">action-disabled</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">P_roperties</attribute>
+ <attribute name="action">pathbar.properties</attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/src/nautilus-pathbar.c b/src/nautilus-pathbar.c
index a0eed27..19ff073 100644
--- a/src/nautilus-pathbar.c
+++ b/src/nautilus-pathbar.c
@@ -24,18 +24,20 @@
#include <gio/gio.h>
#include "nautilus-pathbar.h"
+#include "nautilus-properties-window.h"
#include <libnautilus-private/nautilus-file.h>
#include <libnautilus-private/nautilus-file-utilities.h>
#include <libnautilus-private/nautilus-global-preferences.h>
#include <libnautilus-private/nautilus-icon-names.h>
#include <libnautilus-private/nautilus-trash-monitor.h>
+#include <libnautilus-private/nautilus-ui-utilities.h>
#include "nautilus-window-slot-dnd.h"
enum {
+ OPEN_LOCATION,
PATH_CLICKED,
- PATH_EVENT,
LAST_SIGNAL
};
@@ -91,6 +93,12 @@ struct _NautilusPathBarDetails {
unsigned int drag_slider_timeout;
gboolean drag_slider_timeout_for_up_button;
+
+ GActionGroup *action_group;
+
+ GMenu *context_menu;
+ NautilusFile *context_menu_file;
+ GdkEventButton *context_menu_event;
};
@@ -112,6 +120,85 @@ static void nautilus_path_bar_update_button_state (ButtonData *but
gboolean current_dir);
static void nautilus_path_bar_update_path (NautilusPathBar *path_bar,
GFile *file_path);
+static void unschedule_pop_up_context_menu (NautilusPathBar *path_bar);
+static void action_pathbar_open_item_new_window (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data);
+static void action_pathbar_open_item_new_tab (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data);
+static void action_pathbar_properties (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data);
+
+const GActionEntry path_bar_actions[] = {
+ { "open-item-new-tab", action_pathbar_open_item_new_tab },
+ { "open-item-new-window", action_pathbar_open_item_new_window },
+ { "properties", action_pathbar_properties}
+};
+
+
+static void
+action_pathbar_open_item_new_tab (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusPathBar *path_bar;
+ GFile *location;
+
+ path_bar = NAUTILUS_PATH_BAR (user_data);
+
+ if (!path_bar->priv->context_menu_file) {
+ return;
+ }
+
+ location = nautilus_file_get_location (path_bar->priv->context_menu_file);
+
+ if (location) {
+ g_signal_emit (user_data, path_bar_signals[OPEN_LOCATION], 0, location,
GTK_PLACES_OPEN_NEW_TAB);
+ g_object_unref (location);
+ }
+}
+
+static void
+action_pathbar_open_item_new_window (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusPathBar *path_bar;
+ GFile *location;
+
+ path_bar = NAUTILUS_PATH_BAR (user_data);
+
+ if (!path_bar->priv->context_menu_file) {
+ return;
+ }
+
+ location = nautilus_file_get_location (path_bar->priv->context_menu_file);
+
+ if (location) {
+ g_signal_emit (user_data, path_bar_signals[OPEN_LOCATION], 0, location,
GTK_PLACES_OPEN_NEW_WINDOW);
+ g_object_unref (location);
+ }
+}
+
+static void
+action_pathbar_properties (GSimpleAction *action,
+ GVariant *state,
+ gpointer user_data)
+{
+ NautilusPathBar *path_bar;
+ GList *files;
+
+ path_bar = NAUTILUS_PATH_BAR (user_data);
+ g_assert (NAUTILUS_IS_FILE (path_bar->priv->context_menu_file));
+
+ files = g_list_append (NULL, nautilus_file_ref (path_bar->priv->context_menu_file));
+
+ nautilus_properties_window_present (files, GTK_WIDGET (path_bar), NULL);
+
+ nautilus_file_list_free (files);
+}
static GtkWidget *
get_slider_button (NautilusPathBar *path_bar,
@@ -200,8 +287,25 @@ nautilus_path_bar_slider_drag_leave (GtkWidget *widget,
static void
nautilus_path_bar_init (NautilusPathBar *path_bar)
{
+ GtkBuilder *builder;
+
path_bar->priv = G_TYPE_INSTANCE_GET_PRIVATE (path_bar, NAUTILUS_TYPE_PATH_BAR,
NautilusPathBarDetails);
+ /* Action group */
+ path_bar->priv->action_group = G_ACTION_GROUP (g_simple_action_group_new ());
+ g_action_map_add_action_entries (G_ACTION_MAP (path_bar->priv->action_group),
+ path_bar_actions,
+ G_N_ELEMENTS (path_bar_actions),
+ path_bar);
+ gtk_widget_insert_action_group (GTK_WIDGET (path_bar),
+ "pathbar",
+ G_ACTION_GROUP (path_bar->priv->action_group));
+
+ /* Context menu */
+ builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-pathbar-context-menu.xml");
+ path_bar->priv->context_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder,
"pathbar-menu")));
+ g_object_unref (builder);
+
gtk_widget_set_has_window (GTK_WIDGET (path_bar), FALSE);
gtk_widget_set_redraw_on_allocate (GTK_WIDGET (path_bar), FALSE);
@@ -262,6 +366,11 @@ nautilus_path_bar_finalize (GObject *object)
g_list_free (path_bar->priv->button_list);
+ unschedule_pop_up_context_menu (NAUTILUS_PATH_BAR (object));
+ if (path_bar->priv->context_menu_event) {
+ gdk_event_free ((GdkEvent *) path_bar->priv->context_menu_event);
+ }
+
G_OBJECT_CLASS (nautilus_path_bar_parent_class)->finalize (object);
}
@@ -1001,6 +1110,15 @@ nautilus_path_bar_class_init (NautilusPathBarClass *path_bar_class)
container_class->remove = nautilus_path_bar_remove;
container_class->get_path_for_child = nautilus_path_bar_get_path_for_child;
+ path_bar_signals [OPEN_LOCATION] =
+ g_signal_new ("open-location",
+ G_OBJECT_CLASS_TYPE (path_bar_class),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (NautilusPathBarClass, open_location),
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 2,
+ G_TYPE_FILE,
+ GTK_TYPE_PLACES_OPEN_FLAGS);
path_bar_signals [PATH_CLICKED] =
g_signal_new ("path-clicked",
G_OBJECT_CLASS_TYPE (path_bar_class),
@@ -1010,15 +1128,6 @@ nautilus_path_bar_class_init (NautilusPathBarClass *path_bar_class)
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
G_TYPE_FILE);
- path_bar_signals [PATH_EVENT] =
- g_signal_new ("path-event",
- G_OBJECT_CLASS_TYPE (path_bar_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (NautilusPathBarClass, path_event),
- NULL, NULL, NULL,
- G_TYPE_BOOLEAN, 2,
- G_TYPE_FILE,
- GDK_TYPE_EVENT);
gtk_container_class_handle_border_width (container_class);
g_type_class_add_private (path_bar_class, sizeof (NautilusPathBarDetails));
@@ -1282,36 +1391,127 @@ button_clicked_cb (GtkWidget *button,
g_signal_emit (path_bar, path_bar_signals [PATH_CLICKED], 0, button_data->path);
}
+
+static void
+real_pop_up_pathbar_context_menu (NautilusPathBar *path_bar)
+{
+ nautilus_pop_up_context_menu (GTK_WIDGET (path_bar),
+ path_bar->priv->context_menu,
+ path_bar->priv->context_menu_event);
+}
+
+static void
+pathbar_popup_file_attributes_ready (NautilusFile *file,
+ gpointer data)
+{
+ NautilusPathBar *path_bar;
+
+ path_bar = NAUTILUS_PATH_BAR (data);
+ g_assert (NAUTILUS_IS_PATH_BAR (path_bar));
+
+ g_assert (file == path_bar->priv->context_menu_file);
+
+ real_pop_up_pathbar_context_menu (path_bar);
+}
+
+static void
+unschedule_pop_up_context_menu (NautilusPathBar *path_bar)
+{
+ if (path_bar->priv->context_menu_file) {
+ g_assert (NAUTILUS_IS_FILE (path_bar->priv->context_menu_file));
+ nautilus_file_cancel_call_when_ready (path_bar->priv->context_menu_file,
+ pathbar_popup_file_attributes_ready,
+ path_bar);
+ g_clear_pointer (&path_bar->priv->context_menu_file, nautilus_file_unref);
+ }
+}
+
+static void
+schedule_pop_up_context_menu (NautilusPathBar *path_bar,
+ GdkEventButton *event,
+ NautilusFile *file)
+{
+ g_assert (NAUTILUS_IS_FILE (file));
+
+ if (path_bar->priv->context_menu_event != NULL) {
+ gdk_event_free ((GdkEvent *) path_bar->priv->context_menu_event);
+ }
+ path_bar->priv->context_menu_event = (GdkEventButton *) gdk_event_copy ((GdkEvent *)event);
+
+ if (file == path_bar->priv->context_menu_file) {
+ if (nautilus_file_check_if_ready (file,
+ NAUTILUS_FILE_ATTRIBUTE_INFO |
+ NAUTILUS_FILE_ATTRIBUTE_MOUNT |
+ NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO)) {
+ real_pop_up_pathbar_context_menu (path_bar);
+ }
+ } else {
+ unschedule_pop_up_context_menu (path_bar);
+
+ path_bar->priv->context_menu_file = nautilus_file_ref (file);
+ nautilus_file_call_when_ready (path_bar->priv->context_menu_file,
+ NAUTILUS_FILE_ATTRIBUTE_INFO |
+ NAUTILUS_FILE_ATTRIBUTE_MOUNT |
+ NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO,
+ pathbar_popup_file_attributes_ready,
+ path_bar);
+ }
+}
+
+static void
+pop_up_pathbar_context_menu (NautilusPathBar *path_bar,
+ GdkEventButton *event,
+ NautilusFile *file)
+{
+ if (file) {
+ schedule_pop_up_context_menu (path_bar, event, file);
+ nautilus_file_unref (file);
+ }
+}
+
static gboolean
button_event_cb (GtkWidget *button,
GdkEventButton *event,
gpointer data)
{
+ GtkPlacesOpenFlags flags;
ButtonData *button_data;
NautilusPathBar *path_bar;
- GList *button_list;
- gboolean retval;
+ int mask;
button_data = BUTTON_DATA (data);
path_bar = NAUTILUS_PATH_BAR (gtk_widget_get_parent (button));
if (event->type == GDK_BUTTON_PRESS) {
- g_object_set_data (G_OBJECT (button), "handle-button-release",
- GINT_TO_POINTER (TRUE));
- }
+ g_object_set_data (G_OBJECT (button), "handle-button-release", GINT_TO_POINTER (TRUE));
- if (event->type == GDK_BUTTON_RELEASE &&
- !GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (button),
- "handle-button-release"))) {
- return FALSE;
- }
+ if (event->button == 3) {
+ pop_up_pathbar_context_menu (path_bar, event, button_data->file);
+ return TRUE;
+ }
- button_list = g_list_find (path_bar->priv->button_list, button_data);
- g_assert (button_list != NULL);
+ } else if (event->type == GDK_BUTTON_RELEASE) {
+ mask = event->state & gtk_accelerator_get_default_mod_mask ();
+ flags = 0;
+
+ if (!GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (button), "handle-button-release"))) {
+ return FALSE;
+ }
- g_signal_emit (path_bar, path_bar_signals [PATH_EVENT], 0, button_data->path, event, &retval);
+ if (event->button == 2 && mask == 0) {
+ flags = GTK_PLACES_OPEN_NEW_TAB;
+ } else if (event->button == 1 && mask == GDK_CONTROL_MASK) {
+ flags = GTK_PLACES_OPEN_NEW_WINDOW;
+ }
- return retval;
+ if (flags != 0) {
+ g_signal_emit (path_bar, path_bar_signals[OPEN_LOCATION], 0, button_data->path,
flags);
+ }
+
+ return FALSE;
+ }
+
+ return FALSE;
}
static void
diff --git a/src/nautilus-pathbar.h b/src/nautilus-pathbar.h
index 471c0e1..3f89785 100644
--- a/src/nautilus-pathbar.h
+++ b/src/nautilus-pathbar.h
@@ -47,9 +47,9 @@ struct _NautilusPathBarClass
void (* path_clicked) (NautilusPathBar *path_bar,
GFile *location);
- gboolean (* path_event) (NautilusPathBar *path_bar,
- GdkEventButton *event,
- GFile *location);
+ void (* open_location) (NautilusPathBar *path_bar,
+ GFile *location,
+ GtkPlacesOpenFlags flags);
};
GType nautilus_path_bar_get_type (void) G_GNUC_CONST;
diff --git a/src/nautilus-view-context-menus.xml b/src/nautilus-view-context-menus.xml
index 35fbe4d..df91fb8 100644
--- a/src/nautilus-view-context-menus.xml
+++ b/src/nautilus-view-context-menus.xml
@@ -223,24 +223,4 @@
</item>
</section>
</menu>
- <menu id="pathbar-menu">
- <section>
- <item>
- <attribute name="label" translatable="yes">Open In New _Window</attribute>
- <attribute name="action">view.pathbar-open-item-new-window</attribute>
- <attribute name="hidden-when">action-disabled</attribute>
- </item>
- <item>
- <attribute name="label" translatable="yes">Open In New _Tab</attribute>
- <attribute name="action">view.pathbar-open-item-new-tab</attribute>
- <attribute name="hidden-when">action-disabled</attribute>
- </item>
- </section>
- <section>
- <item>
- <attribute name="label" translatable="yes">P_roperties</attribute>
- <attribute name="action">view.pathbar-properties</attribute>
- </item>
- </section>
- </menu>
</interface>
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 8aa6819..aa64f46 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -157,8 +157,6 @@ struct NautilusViewDetails
NautilusWindowSlot *slot;
NautilusDirectory *model;
NautilusFile *directory_as_file;
- NautilusFile *pathbar_popup_directory_as_file;
- GdkEventButton *pathbar_popup_event;
guint dir_merge_id;
gint dialog_duplicated_name_label_timeout_id;
@@ -227,7 +225,6 @@ struct NautilusViewDetails
GMenu *selection_menu;
GMenu *background_menu;
- GMenu *pathbar_menu;
GActionGroup *view_action_group;
@@ -283,8 +280,6 @@ static void update_templates_directory (NautilusView *vi
static void check_empty_states (NautilusView *view);
-static void unschedule_pop_up_pathbar_context_menu (NautilusView *view);
-
G_DEFINE_TYPE (NautilusView, nautilus_view, GTK_TYPE_OVERLAY);
static void
@@ -1224,26 +1219,6 @@ action_open_item_new_tab (GSimpleAction *action,
}
static void
-action_pathbar_open_item_new_tab (GSimpleAction *action,
- GVariant *state,
- gpointer user_data)
-{
- NautilusView *view;
- NautilusFile *file;
-
- view = NAUTILUS_VIEW (user_data);
-
- file = view->details->pathbar_popup_directory_as_file;
- if (file == NULL) {
- return;
- }
-
- nautilus_view_activate_file (view,
- file,
- NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB);
-}
-
-static void
app_chooser_dialog_response_cb (GtkDialog *dialog,
gint response_id,
gpointer user_data)
@@ -2235,26 +2210,6 @@ action_properties (GSimpleAction *action,
}
static void
-action_pathbar_properties (GSimpleAction *action,
- GVariant *state,
- gpointer user_data)
-{
- NautilusView *view;
- GList *files;
-
- g_assert (NAUTILUS_IS_VIEW (user_data));
-
- view = NAUTILUS_VIEW (user_data);
- g_assert (NAUTILUS_IS_FILE (view->details->pathbar_popup_directory_as_file));
-
- files = g_list_append (NULL, nautilus_file_ref (view->details->pathbar_popup_directory_as_file));
-
- nautilus_properties_window_present (files, GTK_WIDGET (view), NULL);
-
- nautilus_file_list_free (files);
-}
-
-static void
nautilus_view_set_show_hidden_files (NautilusView *view,
gboolean show_hidden)
{
@@ -2350,26 +2305,6 @@ action_open_item_new_window (GSimpleAction *action,
}
static void
-action_pathbar_open_item_new_window (GSimpleAction *action,
- GVariant *state,
- gpointer user_data)
-{
- NautilusView *view;
- NautilusFile *file;
-
- view = NAUTILUS_VIEW (user_data);
-
- file = view->details->pathbar_popup_directory_as_file;
- if (file == NULL) {
- return;
- }
-
- nautilus_view_activate_file (view,
- file,
- NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW);
-}
-
-static void
paste_clipboard_data (NautilusView *view,
GtkSelectionData *selection_data,
char *destination_uri)
@@ -2853,11 +2788,6 @@ nautilus_view_finalize (GObject *object)
g_signal_handlers_disconnect_by_func (gnome_lockdown_preferences,
schedule_update_context_menus, view);
- unschedule_pop_up_pathbar_context_menu (view);
- if (view->details->pathbar_popup_event != NULL) {
- gdk_event_free ((GdkEvent *) view->details->pathbar_popup_event);
- }
-
g_hash_table_destroy (view->details->non_ready_files);
G_OBJECT_CLASS (nautilus_view_parent_class)->finalize (object);
@@ -6010,10 +5940,6 @@ const GActionEntry view_entries[] = {
{ "start-volume", action_start_volume },
{ "stop-volume", action_stop_volume },
{ "detect-media", action_detect_media },
- /* Pathbar menu */
- { "pathbar-open-item-new-window", action_pathbar_open_item_new_window },
- { "pathbar-open-item-new-tab", action_pathbar_open_item_new_tab },
- { "pathbar-properties", action_pathbar_properties},
/* Only accesible by shorcuts */
{ "select-pattern", action_select_pattern },
{ "invert-selection", action_invert_selection },
@@ -6779,13 +6705,11 @@ real_update_context_menus (NautilusView *view)
{
g_clear_object (&view->details->background_menu);
g_clear_object (&view->details->selection_menu);
- g_clear_object (&view->details->pathbar_menu);
GtkBuilder *builder;
builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-view-context-menus.xml");
view->details->background_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder,
"background-menu")));
view->details->selection_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder,
"selection-menu")));
- view->details->pathbar_menu = g_object_ref (G_MENU (gtk_builder_get_object (builder,
"pathbar-menu")));
g_object_unref (builder);
update_selection_menu (view);
@@ -6886,109 +6810,7 @@ nautilus_view_pop_up_background_context_menu (NautilusView *view,
}
static void
-real_pop_up_pathbar_context_menu (NautilusView *view)
-{
- /* Make the context menu items not flash as they update to proper disabled,
- * etc. states by forcing menus to update now.
- */
- update_context_menus_if_pending (view);
-
- update_context_menu_position_from_event (view, view->details->pathbar_popup_event);
-
- nautilus_pop_up_context_menu (GTK_WIDGET (view), view->details->pathbar_menu,
view->details->pathbar_popup_event);
-}
-
-static void
-pathbar_popup_file_attributes_ready (NautilusFile *file,
- gpointer data)
-{
- NautilusView *view;
-
- view = NAUTILUS_VIEW (data);
- g_assert (NAUTILUS_IS_VIEW (view));
-
- g_assert (file == view->details->pathbar_popup_directory_as_file);
-
- real_pop_up_pathbar_context_menu (view);
-}
-
-static void
-unschedule_pop_up_pathbar_context_menu (NautilusView *view)
-{
- if (view->details->pathbar_popup_directory_as_file != NULL) {
- g_assert (NAUTILUS_IS_FILE (view->details->pathbar_popup_directory_as_file));
- nautilus_file_cancel_call_when_ready (view->details->pathbar_popup_directory_as_file,
- pathbar_popup_file_attributes_ready,
- view);
- nautilus_file_unref (view->details->pathbar_popup_directory_as_file);
- view->details->pathbar_popup_directory_as_file = NULL;
- }
-}
-
-static void
-schedule_pop_up_pathbar_context_menu (NautilusView *view,
- GdkEventButton *event,
- NautilusFile *file)
-{
- g_assert (NAUTILUS_IS_FILE (file));
-
- if (view->details->pathbar_popup_event != NULL) {
- gdk_event_free ((GdkEvent *) view->details->pathbar_popup_event);
- }
- view->details->pathbar_popup_event = (GdkEventButton *) gdk_event_copy ((GdkEvent *)event);
-
- if (file == view->details->pathbar_popup_directory_as_file) {
- if (nautilus_file_check_if_ready (file, NAUTILUS_FILE_ATTRIBUTE_INFO |
- NAUTILUS_FILE_ATTRIBUTE_MOUNT |
- NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO)) {
- real_pop_up_pathbar_context_menu (view);
- }
- } else {
- unschedule_pop_up_pathbar_context_menu (view);
-
- view->details->pathbar_popup_directory_as_file = nautilus_file_ref (file);
- nautilus_file_call_when_ready (view->details->pathbar_popup_directory_as_file,
- NAUTILUS_FILE_ATTRIBUTE_INFO |
- NAUTILUS_FILE_ATTRIBUTE_MOUNT |
- NAUTILUS_FILE_ATTRIBUTE_FILESYSTEM_INFO,
- pathbar_popup_file_attributes_ready,
- view);
- }
-}
-
-/**
- * nautilus_view_pop_up_pathbar_context_menu
- *
- * Pop up a context menu appropriate to the view globally.
- * @view: NautilusView of interest.
- * @event: GdkEventButton triggering the popup.
- * @location: The location the popup-menu should be created for,
- * or NULL for the currently displayed location.
- *
- **/
-void
-nautilus_view_pop_up_pathbar_context_menu (NautilusView *view,
- GdkEventButton *event,
- const char *location)
-{
- NautilusFile *file;
-
- g_assert (NAUTILUS_IS_VIEW (view));
-
- if (location != NULL) {
- file = nautilus_file_get_by_uri (location);
- } else {
- file = nautilus_file_ref (view->details->directory_as_file);
- }
-
- if (file != NULL) {
- schedule_pop_up_pathbar_context_menu (view, event, file);
- nautilus_file_unref (file);
- }
-}
-
-static void
-schedule_update_context_menus (NautilusView *view)
+schedule_update_context_menus (NautilusView *view)
{
g_assert (NAUTILUS_IS_VIEW (view));
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 5bd42d9..93fbc89 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -377,9 +377,6 @@ void nautilus_view_zoom_to_level (NautilusView *v
void nautilus_view_restore_default_zoom_level (NautilusView *view);
gboolean nautilus_view_can_zoom_in (NautilusView *view);
gboolean nautilus_view_can_zoom_out (NautilusView *view);
-void nautilus_view_pop_up_pathbar_context_menu (NautilusView *view,
- GdkEventButton *event,
- const char *location);
void nautilus_view_update_menus (NautilusView *view);
void nautilus_view_update_context_menus (NautilusView *view);
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index 48c0c35..f2459b5 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -937,12 +937,10 @@ nautilus_window_location_opened (NautilusWindow *window,
/* Callback used when the places sidebar changes location; we need to change the displayed folder */
static void
-places_sidebar_open_location_cb (GtkPlacesSidebar *sidebar,
- GFile *location,
- GtkPlacesOpenFlags open_flags,
- gpointer user_data)
+open_location_cb (NautilusWindow *window,
+ GFile *location,
+ GtkPlacesOpenFlags open_flags)
{
- NautilusWindow *window = NAUTILUS_WINDOW (user_data);
NautilusWindowOpenFlags flags;
switch (open_flags) {
@@ -1280,8 +1278,8 @@ nautilus_window_set_up_sidebar (NautilusWindow *window)
| GTK_PLACES_OPEN_NEW_WINDOW));
gtk_places_sidebar_set_show_connect_to_server (GTK_PLACES_SIDEBAR (window->priv->places_sidebar),
TRUE);
- g_signal_connect (window->priv->places_sidebar, "open-location",
- G_CALLBACK (places_sidebar_open_location_cb), window);
+ g_signal_connect_swapped (window->priv->places_sidebar, "open-location",
+ G_CALLBACK (open_location_cb), window);
g_signal_connect (window->priv->places_sidebar, "show-error-message",
G_CALLBACK (places_sidebar_show_error_message_cb), window);
g_signal_connect (window->priv->places_sidebar, "show-connect-to-server",
@@ -1648,53 +1646,6 @@ path_bar_location_changed_callback (GtkWidget *widget,
}
}
-static gboolean
-path_bar_path_event_callback (NautilusPathBar *path_bar,
- GFile *location,
- GdkEventButton *event,
- NautilusWindow *window)
-{
- NautilusWindowSlot *slot;
- NautilusWindowOpenFlags flags;
- int mask;
- NautilusView *view;
- char *uri;
-
- if (event->type == GDK_BUTTON_RELEASE) {
- mask = event->state & gtk_accelerator_get_default_mod_mask ();
- flags = 0;
-
- if (event->button == 2 && mask == 0) {
- flags = NAUTILUS_WINDOW_OPEN_FLAG_NEW_TAB;
- } else if (event->button == 1 && mask == GDK_CONTROL_MASK) {
- flags = NAUTILUS_WINDOW_OPEN_FLAG_NEW_WINDOW;
- }
-
- if (flags != 0) {
- slot = nautilus_window_get_active_slot (window);
- nautilus_window_slot_open_location (slot, location, flags);
- }
-
- return FALSE;
- }
-
- if (event->button == 3) {
- slot = nautilus_window_get_active_slot (window);
- view = nautilus_window_slot_get_view (slot);
- if (view != NULL) {
- uri = g_file_get_uri (location);
- nautilus_view_pop_up_pathbar_context_menu (view, event, uri);
- g_free (uri);
- }
-
- return TRUE;
- } else if (event->button == 2) {
- return TRUE;
- }
-
- return FALSE;
-}
-
static void
notebook_popup_menu_new_tab_cb (GtkMenuItem *menuitem,
gpointer user_data)
@@ -1859,8 +1810,8 @@ setup_toolbar (NautilusWindow *window)
g_signal_connect_object (path_bar, "path-clicked",
G_CALLBACK (path_bar_location_changed_callback), window, 0);
- g_signal_connect_object (path_bar, "path-event",
- G_CALLBACK (path_bar_path_event_callback), window, 0);
+ g_signal_connect_swapped (path_bar, "open-location",
+ G_CALLBACK (open_location_cb), window);
/* connect to the location entry signals */
location_entry = nautilus_toolbar_get_location_entry (NAUTILUS_TOOLBAR (window->priv->toolbar));
diff --git a/src/nautilus.gresource.xml b/src/nautilus.gresource.xml
index 0eb49cb..acab5ff 100644
--- a/src/nautilus.gresource.xml
+++ b/src/nautilus.gresource.xml
@@ -4,6 +4,7 @@
<file compressed="true">nautilus-bookmarks-window.ui</file>
<file compressed="true">nautilus-file-management-properties.ui</file>
<file>nautilus-app-menu.ui</file>
+ <file>nautilus-pathbar-context-menu.xml</file>
<file>nautilus-toolbar-ui.xml</file>
<file>nautilus-toolbar-view-menu.xml</file>
<file>nautilus-toolbar-action-menu.xml</file>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]