From 7be881982f02f7811db5f59593fdb80bdc50e453 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Tue, 4 Oct 2011 09:22:11 -0500 Subject: [PATCH] Add functions to say whether multiple tabs/windows are supported The file chooser will leave these off by default; file managers like Nautilus will turn them on. These control whether the places sidebar shows 'open in new tab' and similar items in its context menu. Signed-off-by: Federico Mena Quintero --- gtk/gtkplacessidebar.c | 67 ++++++++++++++++++++++++++++++++---------- gtk/gtkplacessidebar.h | 7 ++++- 2 files changed, 57 insertions(+), 17 deletions(-) diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index cfb6c25e1d..c6faa39cd1 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -75,6 +75,9 @@ struct _GtkPlacesSidebar { GtkPlacesOpenMode go_to_after_mount_open_mode; GtkTreePath *eject_highlight_path; + + guint multiple_tabs_supported : 1; + guint multiple_windows_supported : 1; }; struct _GtkPlacesSidebarClass { @@ -202,6 +205,10 @@ G_DEFINE_TYPE (GtkPlacesSidebar, gtk_places_sidebar, GTK_TYPE_SCROLLED_WINDOW); static void emit_location_selected (GtkPlacesSidebar *sidebar, GFile *location, GtkPlacesOpenMode open_mode) { + if ((!sidebar->multiple_tabs_supported && open_mode == GTK_PLACES_OPEN_MODE_NEW_TAB) + || (!sidebar->multiple_windows_supported && open_mode == GTK_PLACES_OPEN_MODE_NEW_WINDOW)) + open_mode = GTK_PLACES_OPEN_MODE_NORMAL; + g_signal_emit (sidebar, places_sidebar_signals[LOCATION_SELECTED], 0, location, open_mode); } @@ -2545,15 +2552,11 @@ static void bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) { GtkWidget *item; - gboolean use_browser; if (sidebar->popup_menu) { return; } - use_browser = g_settings_get_boolean (nautilus_preferences, - NAUTILUS_PREFERENCES_ALWAYS_USE_BROWSER); - sidebar->popup_menu = gtk_menu_new (); gtk_menu_attach_to_widget (GTK_MENU (sidebar->popup_menu), GTK_WIDGET (sidebar), @@ -2573,7 +2576,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) G_CALLBACK (open_shortcut_in_new_tab_cb), sidebar); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); - if (use_browser) { + if (settings->multiple_tabs_supported) { gtk_widget_show (item); } @@ -2582,7 +2585,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) G_CALLBACK (open_shortcut_in_new_window_cb), sidebar); gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); - if (use_browser) { + if (sidebar->multiple_windows_supported) { gtk_widget_show (item); } @@ -2873,13 +2876,13 @@ bookmarks_button_press_event_cb (GtkWidget *widget, &path, NULL, NULL, NULL); gtk_tree_model_get_iter (model, &iter, path); - if (g_settings_get_boolean (nautilus_preferences, - NAUTILUS_PREFERENCES_ALWAYS_USE_BROWSER)) { - open_mode = ((event->state & GDK_CONTROL_MASK) ? - GTK_PLACES_OPEN_MODE_NEW_WINDOW : - GTK_PLACES_OPEN_MODE_NEW_TAB); + if (sidebar->multiple_tabs_supported) { + if (event->state & GDK_CONTROL_MASK) + open_mode = GTK_PLACES_OPEN_MODE_NEW_WINDOW; + else + open_mode = GTK_PLACES_OPEN_MODE_NEW_TAB; } else { - open_mode = GTK_PLACES_OPEN_MODE_NEW_WINDOW; /* FIXME: was CLOSE_BEHIND; make Nautilus handle this */ + open_mode = GTK_PLACES_OPEN_MODE_NEW_WINDOW; } open_selected_bookmark (sidebar, model, &iter, open_mode); @@ -3315,10 +3318,6 @@ gtk_places_sidebar_dispose (GObject *object) desktop_setting_changed_callback, sidebar); - g_signal_handlers_disconnect_by_func (nautilus_preferences, - bookmarks_popup_menu_detach_cb, - sidebar); - g_signal_handlers_disconnect_by_func (gnome_background_preferences, desktop_setting_changed_callback, sidebar); @@ -3491,3 +3490,39 @@ gtk_places_sidebar_set_current_uri (GtkPlacesSidebar *sidebar, const char *uri) } } } + +/** + * gtk_places_sidebar_set_multiple_tabs_supported: + * @sidebar: a places sidebar + * @supported: whether the appliacation supports multiple notebook tabs for file browsing + * + * Sets whether the calling appliacation supports multiple tabs for file browsing. + * When @supported is #TRUE, the context menu for the @sidebar's items will show + * items relevant to opening folders in new tabs. + */ +void +gtk_places_sidebar_set_multiple_tabs_supported (GtkPlacesSidebar *sidebar, gboolean supported) +{ + g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar)); + + sidebar->multiple_tabs_supported = !!supported; + bookmarks_popup_menu_detach_cb (sidebar, NULL); +} + +/** + * gtk_places_sidebar_set_multiple_windows_supported: + * @sidebar: a places sidebar + * @supported: whether the appliacation supports multiple windows for file browsing + * + * Sets whether the calling appliacation supports multiple windows for file browsing. + * When @supported is #TRUE, the context menu for the @sidebar's items will show + * items relevant to opening folders in new windows. + */ +void +gtk_places_sidebar_set_multiple_windows_supported (GtkPlacesSidebar *sidebar, gboolean supported) +{ + g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar)); + + sidebar->multiple_windows_supported = !!supported; + bookmarks_popup_menu_detach_cb (sidebar, NULL); +} diff --git a/gtk/gtkplacessidebar.h b/gtk/gtkplacessidebar.h index a17afd149e..11766b2c90 100644 --- a/gtk/gtkplacessidebar.h +++ b/gtk/gtkplacessidebar.h @@ -50,9 +50,14 @@ typedef enum { GType gtk_places_sidebar_get_type (void); GtkWidget *gtk_places_sidebar_new (void); -/* FIXME: add an "uri" property so this can be set via g_object_set() */ +/* FIXME: add GObject properties for the following things */ + void gtk_places_sidebar_set_current_uri (GtkPlacesSidebar *sidebar, const char *uri); +void gtk_places_sidebar_set_multiple_tabs_supported (GtkPlacesSidebar *sidebar, gboolean supported); + +void gtk_places_sidebar_set_multiple_windows_supported (GtkPlacesSidebar *sidebar, gboolean supported); + G_END_DECLS #endif /* __GTK_PLACES_SIDEBAR_H__ */