From fd1f45f308e418d1c1b44b968ce83f77e4f8a689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Masci?= <> Date: Fri, 14 Sep 2018 22:30:23 +0200 Subject: add option to open multiple uri in tabs at startup --- src/caja-application.c | 157 ++++++++++++++++++++++++++++++-------------- src/caja-application.h | 3 +- src/caja-freedesktop-dbus.c | 6 +- src/caja-window.c | 10 ++- src/caja-window.h | 2 + 5 files changed, 123 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/caja-application.c b/src/caja-application.c index 5f460d3d..c2ce7b2a 100644 --- a/src/caja-application.c +++ b/src/caja-application.c @@ -267,26 +267,90 @@ open_window (CajaApplication *application, g_free (uri); } +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) + 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++ ; + } + } } } @@ -298,40 +362,41 @@ caja_application_open (GApplication *app, { 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]; } + 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; } - open_windows (self, files, + open_windows (self, files, gdk_screen_get_default (), geometry, n_files, - browser_window); + 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 +408,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); @@ -1997,6 +2063,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 +2089,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 URI 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 +2120,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 +2178,6 @@ caja_application_local_command_line (GApplication *application, caja_application_load_session (self); } - GFile **files; gint idx, len; @@ -2143,30 +2211,19 @@ 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); + 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 if (browser_window == TRUE && self->priv->geometry != NULL){ - if (len > 0) { - g_application_open (application, files, len, (g_strconcat("browser","=", - self->priv->geometry, NULL))); - } - } - - else { + g_application_open (application, files, len, concatOptions); + g_free(concatOptions); + } else { + g_print("non\n"); if (len > 0) { g_application_open (application, files, len, ""); } @@ -2420,11 +2477,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 @@ -234,6 +234,14 @@ caja_window_go_to (CajaWindow *window, GFile *location) caja_window_slot_go_to (window->details->active_pane->active_slot, location, FALSE); } +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, @@ -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..4ee50835 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, -- cgit v1.2.1