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