diff options
author | Clément Masci <> | 2018-09-14 22:30:23 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2018-09-17 09:28:48 +0200 |
commit | 6a31ce65e4213d6069e5eb515640233cd27c3937 (patch) | |
tree | b982839d912c1ff13ccbe06e00f1bfb2ab6b445d | |
parent | fb9a3cfdd0eeac12044ed2f317f51193bf44b6e0 (diff) | |
download | caja-6a31ce65e4213d6069e5eb515640233cd27c3937.tar.bz2 caja-6a31ce65e4213d6069e5eb515640233cd27c3937.tar.xz |
add option to open multiple uri in tabs at startup
-rw-r--r-- | docs/caja.1 | 3 | ||||
-rw-r--r-- | src/caja-application.c | 196 | ||||
-rw-r--r-- | src/caja-application.h | 3 | ||||
-rw-r--r-- | src/caja-freedesktop-dbus.c | 6 | ||||
-rw-r--r-- | src/caja-window.c | 10 | ||||
-rw-r--r-- | src/caja-window.h | 2 |
6 files changed, 146 insertions, 74 deletions
diff --git a/docs/caja.1 b/docs/caja.1 index a7741c2e..03f31bee 100644 --- a/docs/caja.1 +++ b/docs/caja.1 @@ -26,6 +26,9 @@ X display to use. \fB\-g, \-\-geometry=\fIGEOMETRY\fR Create the initial window with the given geometry. .TP +\fB\-t, \-\-tabs\fR +Open URIs in tabs. +.TP \fB\-n, \-\-no\-default\-window\fR Only create windows for explicitly specified URIs. .TP diff --git a/src/caja-application.c b/src/caja-application.c index 5f460d3d..befc6133 100644 --- a/src/caja-application.c +++ b/src/caja-application.c @@ -221,7 +221,10 @@ caja_empty_callback_to_ensure_read() { static void open_window (CajaApplication *application, - GFile *location, GdkScreen *screen, const char *geometry, gboolean browser_window) + GFile *location, + GdkScreen *screen, + const char *geometry, + gboolean browser_window) { CajaApplication *self = CAJA_APPLICATION (application); CajaWindow *window; @@ -239,9 +242,7 @@ open_window (CajaApplication *application, if (browser_window ||g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_ALWAYS_USE_BROWSER)) { window = caja_application_create_navigation_window (application, screen); - } - - else { + } else { window = caja_application_get_spatial_window (application, NULL, NULL, @@ -254,8 +255,7 @@ open_window (CajaApplication *application, if (geometry != NULL && !gtk_widget_get_visible (GTK_WIDGET (window))) { /* never maximize windows opened from shell if a - * custom geometry has been requested. - */ + * custom geometry has been requested. */ gtk_window_unmaximize (GTK_WINDOW (window)); eel_gtk_window_set_initial_geometry_from_string (GTK_WINDOW (window), geometry, @@ -268,70 +268,138 @@ open_window (CajaApplication *application, } static void +open_tabs (CajaApplication *application, + GFile **locations, + guint n_files, + GdkScreen *screen, + const char *geometry, + gboolean browser_window) +{ + CajaApplication *self = CAJA_APPLICATION (application); + CajaWindow *window; + gchar *uri = NULL; + + /* monitor the preference to use browser or spatial windows */ + /* connect before trying to read or this preference won't be read by root or after change */ + g_signal_connect_swapped (caja_preferences, + "changed::"CAJA_PREFERENCES_ALWAYS_USE_BROWSER, + G_CALLBACK (caja_empty_callback_to_ensure_read), + self); + + if (browser_window ||g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_ALWAYS_USE_BROWSER)) { + window = caja_application_create_navigation_window (application, screen); + } else { + window = caja_application_get_spatial_window (application, + NULL, + NULL, + locations[0], + screen, + NULL); + } + + /* open all locations */ + uri = g_file_get_uri (locations[0]); + g_debug ("Opening new tab at uri %s\n", uri); + caja_window_go_to (window, locations[0]); + for (int i = 1; i< n_files;i++) { + /* open tabs in reverse order because each + * tab is opened before the previous one */ + guint tab = n_files-i; + uri = g_file_get_uri (locations[tab]); + g_debug ("Opening new tab at uri %s\n", uri); + if (i == 0) { + caja_window_go_to (window, locations[tab]); + } else { + caja_window_go_to_tab (window, locations[tab]); + } + } + + if (geometry != NULL && !gtk_widget_get_visible (GTK_WIDGET (window))) { + /* never maximize windows opened from shell if a + * custom geometry has been requested. */ + gtk_window_unmaximize (GTK_WINDOW (window)); + eel_gtk_window_set_initial_geometry_from_string (GTK_WINDOW (window), + geometry, + APPLICATION_WINDOW_MIN_WIDTH, + APPLICATION_WINDOW_MIN_HEIGHT, + FALSE); + } + + g_free (uri); +} + +static void open_windows (CajaApplication *application, - GFile **files, - GdkScreen *screen, - const char *geometry, - guint len, - gboolean browser_window) + GFile **files, + GdkScreen *screen, + const char *geometry, + guint n_files, + gboolean browser_window, + gboolean open_in_tabs) { guint i; if (files == NULL || files[0] == NULL) { /* Open a window pointing at the default location. */ - open_window (application, NULL, screen, geometry, browser_window ); + open_window (application, NULL, screen, geometry, browser_window); } else { - /* Open windows at each requested location. */ - i = 0; - while (i < len ){ - open_window (application, files[i], screen, geometry, browser_window); - i++ ; - } + if (open_in_tabs) { + /* Open one window with one tab at each requested location */ + open_tabs (application, files, n_files, screen, geometry, browser_window); + } else { + /* Open windows at each requested location. */ + i = 0; + while (i < n_files) { + open_window (application, files[i], screen, geometry, browser_window); + i++ ; + } + } } } static void caja_application_open (GApplication *app, - GFile **files, - gint n_files, - const gchar *options) + GFile **files, + gint n_files, + const gchar *options) { CajaApplication *self = CAJA_APPLICATION (app); gboolean browser_window = FALSE; + gboolean open_in_tabs = FALSE; const gchar *geometry = NULL; const char splitter = '='; g_debug ("Open called on the GApplication instance; %d files", n_files); - /*Check if local command line passed --browser or --geometry */ - if (strcmp(options,"") != 0 ){ - if (g_str_match_string ("browser", - options, - FALSE) == TRUE){ - browser_window = TRUE; - geometry = strchr(options, splitter); - } - else { - geometry = options; + /* Check if local command line passed --browser, --geometry or --tabs */ + if (strlen (options) > 0) { + gchar** splitedOptions = g_strsplit (options, &splitter, 3); + sscanf (splitedOptions[0], "%d", &browser_window); + if (strcmp (splitedOptions[1], "NULL") != 0) { + geometry = splitedOptions[1]; } - /*Reset this or 3ed and later invocations will use same - *geometry even if the user has resized open window - */ + sscanf (splitedOptions[2], "%d", &open_in_tabs); + + /* Reset this or 3ed and later invocations will use same + * geometry even if the user has resized open window */ self->priv->geometry = NULL; + g_strfreev (splitedOptions); } open_windows (self, files, - gdk_screen_get_default (), - geometry, - n_files, - browser_window); + gdk_screen_get_default (), + geometry, + n_files, + browser_window, + open_in_tabs); } void caja_application_open_location (CajaApplication *application, GFile *location, GFile *selection, - const char *startup_id) + const char *startup_id, + const gboolean open_in_tabs) { CajaWindow *window; GList *sel_list = NULL; @@ -343,7 +411,8 @@ caja_application_open_location (CajaApplication *application, } caja_window_slot_open_location_full (caja_window_get_active_slot (window), location, - 0, CAJA_WINDOW_OPEN_FLAG_NEW_WINDOW, sel_list, NULL, NULL); + open_in_tabs, CAJA_WINDOW_OPEN_FLAG_NEW_WINDOW, + sel_list, NULL, NULL); if (sel_list != NULL) { caja_file_list_free (sel_list); @@ -358,7 +427,7 @@ caja_application_quit (CajaApplication *self) windows = gtk_application_get_windows (GTK_APPLICATION (app)); g_list_foreach (windows, (GFunc) gtk_widget_destroy, NULL); - /* we have been asked to force quit */ + /* we have been asked to force quit */ g_application_quit (G_APPLICATION (self)); } @@ -1997,6 +2066,7 @@ caja_application_local_command_line (GApplication *application, gboolean perform_self_check = FALSE; gboolean version = FALSE; gboolean browser_window = FALSE; + gboolean open_in_tabs = FALSE; gboolean kill_shell = FALSE; const gchar *autostart_id; gboolean no_default_window = FALSE; @@ -2022,6 +2092,8 @@ caja_application_local_command_line (GApplication *application, N_("Do not manage the desktop (ignore the preference set in the preferences dialog)."), NULL }, { "force-desktop", '\0', 0, G_OPTION_ARG_NONE, &self->priv->force_desktop, N_("Manage the desktop regardless of set preferences or environment (on new startup only)"), NULL }, + { "tabs", 't', 0, G_OPTION_ARG_NONE, &open_in_tabs, + N_("Open URIs in tabs."), NULL }, { "browser", '\0', 0, G_OPTION_ARG_NONE, &browser_window, N_("Open a browser window."), NULL }, { "quit", 'q', 0, G_OPTION_ARG_NONE, &kill_shell, @@ -2051,7 +2123,7 @@ caja_application_local_command_line (GApplication *application, if (autostart_id != NULL && *autostart_id != '\0') { no_default_window = TRUE; self->priv->autostart = TRUE; - } + } argv = *arguments; @@ -2109,7 +2181,6 @@ caja_application_local_command_line (GApplication *application, caja_application_load_session (self); } - GFile **files; gint idx, len; @@ -2143,30 +2214,18 @@ caja_application_local_command_line (GApplication *application, files[1] = NULL; } - /*Set up geometry and --browser options */ + /*Set up --geometry, --browser and --tabs options */ /*Invoke "Open" to create new windows */ - - if (browser_window == TRUE && self->priv->geometry == NULL){ - - if (len > 0) { - g_application_open (application, files, len, "browser"); - } - } - - else if (browser_window == FALSE && self->priv->geometry != NULL){ - if (len > 0) { - g_application_open (application, files, len, self->priv->geometry); - } - } - - else if (browser_window == TRUE && self->priv->geometry != NULL){ - if (len > 0) { - g_application_open (application, files, len, (g_strconcat("browser","=", - self->priv->geometry, NULL))); + if (len > 0) { + gchar* concatOptions = g_malloc0(64); + if (self->priv->geometry == NULL) { + g_snprintf (concatOptions, 64, "%d=NULL=%d", browser_window, open_in_tabs); + } else { + g_snprintf (concatOptions, 64, "%d=%s=%d", browser_window, self->priv->geometry, open_in_tabs); } - } - - else { + g_application_open (application, files, len, concatOptions); + g_free (concatOptions); + } else { if (len > 0) { g_application_open (application, files, len, ""); } @@ -2180,7 +2239,6 @@ caja_application_local_command_line (GApplication *application, out: g_option_context_free (context); - return TRUE; } @@ -2420,11 +2478,11 @@ caja_application_quit_mainloop (GApplication *app) static void caja_application_class_init (CajaApplicationClass *class) { - GObjectClass *object_class; + GObjectClass *object_class; GApplicationClass *application_class; - object_class = G_OBJECT_CLASS (class); - object_class->finalize = caja_application_finalize; + object_class = G_OBJECT_CLASS (class); + object_class->finalize = caja_application_finalize; application_class = G_APPLICATION_CLASS (class); application_class->startup = caja_application_startup; diff --git a/src/caja-application.h b/src/caja-application.h index e48b4ba1..7a191e90 100644 --- a/src/caja-application.h +++ b/src/caja-application.h @@ -100,6 +100,7 @@ void caja_application_close_all_spatial_windows (void); void caja_application_open_location (CajaApplication *application, GFile *location, GFile *selection, - const char *startup_id); + const char *startup_id, + const gboolean open_in_tabs); #endif /* CAJA_APPLICATION_H */ diff --git a/src/caja-freedesktop-dbus.c b/src/caja-freedesktop-dbus.c index 5047a58c..28544f63 100644 --- a/src/caja-freedesktop-dbus.c +++ b/src/caja-freedesktop-dbus.c @@ -75,10 +75,10 @@ skeleton_handle_show_items_cb (CajaFreedesktopFileManager1 *object, parent = g_file_get_parent (file); if (parent != NULL) { - caja_application_open_location (application, parent, file, startup_id); + caja_application_open_location (application, parent, file, startup_id, 0); g_object_unref (parent); } else { - caja_application_open_location (application, file, NULL, startup_id); + caja_application_open_location (application, file, NULL, startup_id, 0); } g_object_unref (file); @@ -105,7 +105,7 @@ skeleton_handle_show_folders_cb (CajaFreedesktopFileManager1 *object, file = g_file_new_for_uri (uris[i]); - caja_application_open_location (application, file, NULL, startup_id); + caja_application_open_location (application, file, NULL, startup_id, 0); g_object_unref (file); } diff --git a/src/caja-window.c b/src/caja-window.c index 098160ce..52676dd5 100644 --- a/src/caja-window.c +++ b/src/caja-window.c @@ -235,6 +235,14 @@ caja_window_go_to (CajaWindow *window, GFile *location) } void +caja_window_go_to_tab (CajaWindow *window, GFile *location) +{ + g_return_if_fail (CAJA_IS_WINDOW (window)); + + caja_window_slot_go_to (window->details->active_pane->active_slot, location, TRUE); +} + +void caja_window_go_to_full (CajaWindow *window, GFile *location, CajaWindowGoToCallback callback, @@ -266,7 +274,7 @@ caja_window_new_tab (CajaWindow *window) CajaWindowSlot *current_slot; CajaWindowSlot *new_slot; CajaWindowOpenFlags flags; - GFile *location; + GFile *location = NULL; int new_slot_position; char *scheme; diff --git a/src/caja-window.h b/src/caja-window.h index b5ea219c..7d53ab7a 100644 --- a/src/caja-window.h +++ b/src/caja-window.h @@ -136,6 +136,8 @@ void caja_window_disconnect_content_view (CajaWindow *window, void caja_window_go_to (CajaWindow *window, GFile *location); +void caja_window_go_to_tab (CajaWindow *window, + GFile *location); void caja_window_go_to_full (CajaWindow *window, GFile *location, CajaWindowGoToCallback callback, |