summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkfilechooserdefault.c2
-rw-r--r--gtk/gtkmarshalers.list1
-rw-r--r--gtk/gtkplacessidebar.c129
-rw-r--r--gtk/gtkplacessidebar.h10
4 files changed, 107 insertions, 35 deletions
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index 776d7baac8..ced3722005 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -1276,7 +1276,7 @@ file_is_recent_uri (GFile *file)
}
static void
-places_sidebar_open_location_cb (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenMode open_mode, GtkFileChooserDefault *impl)
+places_sidebar_open_location_cb (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenFlags open_flags, GtkFileChooserDefault *impl)
{
gboolean clear_entry;
diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list
index d39a768e5c..19959ff5d6 100644
--- a/gtk/gtkmarshalers.list
+++ b/gtk/gtkmarshalers.list
@@ -84,6 +84,7 @@ VOID:OBJECT,BOXED,BOXED
VOID:OBJECT,BOXED,UINT,UINT
VOID:OBJECT,BOXED,BOOLEAN,BOOLEAN
VOID:OBJECT,ENUM
+VOID:OBJECT,FLAGS
VOID:OBJECT,INT
VOID:OBJECT,INT,OBJECT
VOID:OBJECT,INT,INT
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index aa17bf9b8b..9b2c4f9222 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -118,13 +118,15 @@ struct _GtkPlacesSidebar {
/* volume mounting - delayed open process */
gboolean mounting;
- GtkPlacesOpenMode go_to_after_mount_open_mode;
+ GtkPlacesOpenFlags go_to_after_mount_open_flags;
GSList *shortcuts;
GDBusProxy *hostnamed_proxy;
char *hostname;
+ GtkPlacesOpenFlags open_flags;
+
guint show_desktop : 1;
guint accept_uri_drops : 1;
};
@@ -134,7 +136,7 @@ struct _GtkPlacesSidebarClass {
void (* open_location) (GtkPlacesSidebar *sidebar,
GFile *location,
- GtkPlacesOpenMode open_mode);
+ GtkPlacesOpenFlags open_flags);
void (* populate_popup) (GtkPlacesSidebar *sidebar,
GtkMenu *menu,
GFile *selected_item);
@@ -221,9 +223,9 @@ enum {
static guint places_sidebar_signals [LAST_SIGNAL] = { 0 };
static void open_selected_bookmark (GtkPlacesSidebar *sidebar,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkPlacesOpenMode open_mode);
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ GtkPlacesOpenFlags open_flags);
static void gtk_places_sidebar_style_set (GtkWidget *widget,
GtkStyle *previous_style);
static gboolean eject_or_unmount_bookmark (GtkPlacesSidebar *sidebar,
@@ -280,10 +282,13 @@ static GtkListStore *shortcuts_model_new (GtkPlacesSidebar *sidebar);
G_DEFINE_TYPE (GtkPlacesSidebar, gtk_places_sidebar, GTK_TYPE_SCROLLED_WINDOW);
static void
-emit_open_location (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenMode open_mode)
+emit_open_location (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenFlags open_flags)
{
+ if ((open_flags & sidebar->open_flags) == 0)
+ open_flags = GTK_PLACES_OPEN_NORMAL;
+
g_signal_emit (sidebar, places_sidebar_signals[OPEN_LOCATION], 0,
- location, open_mode);
+ location, open_flags);
}
static void
@@ -1878,7 +1883,7 @@ drive_start_from_bookmark_cb (GObject *source_object,
}
static void
-change_location_and_notify (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenMode open_mode)
+change_location_and_notify (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenFlags open_flags)
{
g_free (sidebar->uri);
sidebar->uri = NULL;
@@ -1886,7 +1891,7 @@ change_location_and_notify (GtkPlacesSidebar *sidebar, GFile *location, GtkPlace
if (location)
sidebar->uri = g_file_get_uri (location);
- emit_open_location (sidebar, location, open_mode);
+ emit_open_location (sidebar, location, open_flags);
}
/* Callback from g_volume_mount() */
@@ -1922,7 +1927,7 @@ volume_mount_cb (GObject *source_object, GAsyncResult *result, gpointer user_dat
GFile *location;
location = g_mount_get_default_location (mount);
- change_location_and_notify (sidebar, location, sidebar->go_to_after_mount_open_mode);
+ change_location_and_notify (sidebar, location, sidebar->go_to_after_mount_open_flags);
g_object_unref (G_OBJECT (location));
g_object_unref (G_OBJECT (mount));
@@ -1945,10 +1950,10 @@ mount_volume (GtkPlacesSidebar *sidebar, GVolume *volume)
}
static void
-open_selected_bookmark (GtkPlacesSidebar *sidebar,
- GtkTreeModel *model,
- GtkTreeIter *iter,
- GtkPlacesOpenMode open_mode)
+open_selected_bookmark (GtkPlacesSidebar *sidebar,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ GtkPlacesOpenFlags open_flags)
{
GFile *location;
char *uri;
@@ -1961,7 +1966,7 @@ open_selected_bookmark (GtkPlacesSidebar *sidebar,
if (uri != NULL) {
location = g_file_new_for_uri (uri);
- change_location_and_notify (sidebar, location, open_mode);
+ change_location_and_notify (sidebar, location, open_flags);
g_object_unref (location);
g_free (uri);
@@ -1978,7 +1983,7 @@ open_selected_bookmark (GtkPlacesSidebar *sidebar,
if (volume != NULL && !sidebar->mounting) {
sidebar->mounting = TRUE;
- sidebar->go_to_after_mount_open_mode = open_mode;
+ sidebar->go_to_after_mount_open_flags = open_flags;
mount_volume (sidebar, volume);
} else if (volume == NULL && drive != NULL &&
@@ -1999,7 +2004,7 @@ open_selected_bookmark (GtkPlacesSidebar *sidebar,
static void
open_shortcut_from_menu (GtkPlacesSidebar *sidebar,
- GtkPlacesOpenMode open_mode)
+ GtkPlacesOpenFlags open_flags)
{
GtkTreeModel *model;
GtkTreeIter iter;
@@ -2009,17 +2014,34 @@ open_shortcut_from_menu (GtkPlacesSidebar *sidebar,
gtk_tree_view_get_cursor (sidebar->tree_view, &path, NULL);
if (path != NULL && gtk_tree_model_get_iter (model, &iter, path)) {
- open_selected_bookmark (sidebar, model, &iter, open_mode);
+ open_selected_bookmark (sidebar, model, &iter, open_flags);
}
gtk_tree_path_free (path);
}
+/* Callback used for the "Open" menu item in the context menu */
static void
open_shortcut_cb (GtkMenuItem *item,
GtkPlacesSidebar *sidebar)
{
- open_shortcut_from_menu (sidebar, GTK_PLACES_OPEN_MODE_NORMAL);
+ open_shortcut_from_menu (sidebar, GTK_PLACES_OPEN_NORMAL);
+}
+
+/* Callback used for the "Open in new tab" menu item in the context menu */
+static void
+open_shortcut_in_new_tab_cb (GtkMenuItem *item,
+ GtkPlacesSidebar *sidebar)
+{
+ open_shortcut_from_menu (sidebar, GTK_PLACES_OPEN_NEW_TAB);
+}
+
+/* Callback used for the "Open in new window" menu item in the context menu */
+static void
+open_shortcut_in_new_window_cb (GtkMenuItem *item,
+ GtkPlacesSidebar *sidebar)
+{
+ open_shortcut_from_menu (sidebar, GTK_PLACES_OPEN_NEW_WINDOW);
}
/* Add bookmark for the selected item - just used from mount points */
@@ -2719,16 +2741,16 @@ bookmarks_key_press_event_cb (GtkWidget *widget,
event->keyval == GDK_KEY_ISO_Enter ||
event->keyval == GDK_KEY_space)) {
- GtkPlacesOpenMode open_mode = GTK_PLACES_OPEN_MODE_NORMAL;
+ GtkPlacesOpenFlags open_flags = GTK_PLACES_OPEN_NORMAL;
if ((event->state & modifiers) == GDK_SHIFT_MASK) {
- open_mode = GTK_PLACES_OPEN_MODE_NEW_TAB;
+ open_flags = GTK_PLACES_OPEN_NEW_TAB;
} else if ((event->state & modifiers) == GDK_CONTROL_MASK) {
- open_mode = GTK_PLACES_OPEN_MODE_NEW_WINDOW;
+ open_flags = GTK_PLACES_OPEN_NEW_WINDOW;
}
open_selected_bookmark (sidebar, GTK_TREE_MODEL (sidebar->store),
- &selected_iter, open_mode);
+ &selected_iter, open_flags);
return TRUE;
}
@@ -2806,6 +2828,22 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
+ if (sidebar->open_flags & GTK_PLACES_OPEN_NEW_TAB) {
+ item = gtk_menu_item_new_with_mnemonic (_("Open in New _Tab"));
+ g_signal_connect (item, "activate",
+ G_CALLBACK (open_shortcut_in_new_tab_cb), sidebar);
+ gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
+ }
+
+ if (sidebar->open_flags & GTK_PLACES_OPEN_NEW_WINDOW) {
+ item = gtk_menu_item_new_with_mnemonic (_("Open in New _Window"));
+ g_signal_connect (item, "activate",
+ G_CALLBACK (open_shortcut_in_new_window_cb), sidebar);
+ gtk_widget_show (item);
+ gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
+ }
+
append_menu_separator (GTK_MENU (sidebar->popup_menu));
item = gtk_menu_item_new_with_mnemonic (_("_Add Bookmark"));
@@ -2987,13 +3025,13 @@ bookmarks_button_release_event_cb (GtkWidget *widget,
if (event->button == 1) {
open_selected_bookmark (sidebar, model, &iter, 0);
} else if (event->button == 2) {
- GtkPlacesOpenMode open_mode = GTK_PLACES_OPEN_MODE_NORMAL;
+ GtkPlacesOpenFlags open_flags = GTK_PLACES_OPEN_NORMAL;
- open_mode = ((event->state & GDK_CONTROL_MASK) ?
- GTK_PLACES_OPEN_MODE_NEW_WINDOW :
- GTK_PLACES_OPEN_MODE_NEW_TAB);
+ open_flags = ((event->state & GDK_CONTROL_MASK) ?
+ GTK_PLACES_OPEN_NEW_WINDOW :
+ GTK_PLACES_OPEN_NEW_TAB);
- open_selected_bookmark (sidebar, model, &iter, open_mode);
+ open_selected_bookmark (sidebar, model, &iter, open_flags);
ret = TRUE;
} else if (event->button == 3) {
PlaceType row_type;
@@ -3323,6 +3361,8 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar)
create_volume_monitor (sidebar);
+ sidebar->open_flags = GTK_PLACES_OPEN_NORMAL;
+
sidebar->bookmarks_manager = _gtk_bookmarks_manager_new (bookmarks_changed_cb, sidebar);
sidebar->trash_monitor = _gtk_trash_monitor_get ();
@@ -3596,10 +3636,10 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GtkPlacesSidebarClass, open_location),
NULL, NULL,
- _gtk_marshal_VOID__OBJECT_ENUM,
+ _gtk_marshal_VOID__OBJECT_FLAGS,
G_TYPE_NONE, 2,
G_TYPE_OBJECT,
- GTK_TYPE_PLACES_OPEN_MODE);
+ GTK_TYPE_PLACES_OPEN_FLAGS);
places_sidebar_signals [POPULATE_POPUP] =
g_signal_new (I_("populate-popup"),
@@ -3759,6 +3799,35 @@ shortcuts_model_new (GtkPlacesSidebar *sidebar)
/* Public methods for GtkPlacesSidebar */
/**
+ * gtk_places_sidebar_set_open_flags:
+ * @sidebar: a places sidebar
+ * @flags: Bitmask of modes in which the calling application can open locations
+ *
+ * Sets the way in which the calling application can open new locations from
+ * the places sidebar. For example, some applications only open locations
+ * "directly" into their main view, while others may support opening locations
+ * in a new notebook tab or a new window.
+ *
+ * This function is used to tell the places @sidebar about the ways in which the
+ * application can open new locations, so that the sidebar can display (or not)
+ * the "Open in new tab" and "Open in new window" menu items as appropriate.
+ *
+ * When the #GtkPlacesSidebar::open-location signal is emitted, its flags
+ * argument will be set to one of the @flags that was passed in
+ * gtk_places_sidebar_set_open_flags().
+ *
+ * Passing 0 for @flags will cause #GTK_PLACES_OPEN_NORMAL to always be sent
+ * to callbacks for the "open-location" signal.
+ */
+void
+gtk_places_sidebar_set_open_flags (GtkPlacesSidebar *sidebar, GtkPlacesOpenFlags flags)
+{
+ g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar));
+
+ sidebar->open_flags = flags;
+}
+
+/**
* gtk_places_sidebar_set_current_location:
* @sidebar: a places sidebar
* @location: location to select, or #NULL for no current path
diff --git a/gtk/gtkplacessidebar.h b/gtk/gtkplacessidebar.h
index 1ad4cdd046..b09aa19aa3 100644
--- a/gtk/gtkplacessidebar.h
+++ b/gtk/gtkplacessidebar.h
@@ -45,16 +45,18 @@ typedef struct _GtkPlacesSidebar GtkPlacesSidebar;
typedef struct _GtkPlacesSidebarClass GtkPlacesSidebarClass;
typedef enum {
- GTK_PLACES_OPEN_MODE_NORMAL,
- GTK_PLACES_OPEN_MODE_NEW_TAB,
- GTK_PLACES_OPEN_MODE_NEW_WINDOW
-} GtkPlacesOpenMode;
+ GTK_PLACES_OPEN_NORMAL = 1 << 0,
+ GTK_PLACES_OPEN_NEW_TAB = 1 << 1,
+ GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2
+} GtkPlacesOpenFlags;
GType gtk_places_sidebar_get_type (void);
GtkWidget *gtk_places_sidebar_new (void);
/* FIXME: add GObject properties for the following things */
+void gtk_places_sidebar_set_open_flags (GtkPlacesSidebar *sidebar, GtkPlacesOpenFlags flags);
+
void gtk_places_sidebar_set_current_location (GtkPlacesSidebar *sidebar, GFile *location);
GFile *gtk_places_sidebar_get_selected_location (GtkPlacesSidebar *sidebar);