@@ -221,7 +221,10 @@ caja_empty_callback_to_ensure_read() {
221221
222222static void
223223open_window (CajaApplication * application ,
224- GFile * location , GdkScreen * screen , const char * geometry , gboolean browser_window )
224+ GFile * location ,
225+ GdkScreen * screen ,
226+ const char * geometry ,
227+ gboolean browser_window )
225228{
226229 CajaApplication * self = CAJA_APPLICATION (application );
227230 CajaWindow * window ;
@@ -239,9 +242,7 @@ open_window (CajaApplication *application,
239242 if (browser_window || g_settings_get_boolean (caja_preferences , CAJA_PREFERENCES_ALWAYS_USE_BROWSER )) {
240243 window = caja_application_create_navigation_window (application ,
241244 screen );
242- }
243-
244- else {
245+ } else {
245246 window = caja_application_get_spatial_window (application ,
246247 NULL ,
247248 NULL ,
@@ -254,8 +255,7 @@ open_window (CajaApplication *application,
254255
255256 if (geometry != NULL && !gtk_widget_get_visible (GTK_WIDGET (window ))) {
256257 /* never maximize windows opened from shell if a
257- * custom geometry has been requested.
258- */
258+ * custom geometry has been requested. */
259259 gtk_window_unmaximize (GTK_WINDOW (window ));
260260 eel_gtk_window_set_initial_geometry_from_string (GTK_WINDOW (window ),
261261 geometry ,
@@ -267,71 +267,139 @@ open_window (CajaApplication *application,
267267 g_free (uri );
268268}
269269
270+ static void
271+ open_tabs (CajaApplication * application ,
272+ GFile * * locations ,
273+ guint n_files ,
274+ GdkScreen * screen ,
275+ const char * geometry ,
276+ gboolean browser_window )
277+ {
278+ CajaApplication * self = CAJA_APPLICATION (application );
279+ CajaWindow * window ;
280+ gchar * uri = NULL ;
281+
282+ /* monitor the preference to use browser or spatial windows */
283+ /* connect before trying to read or this preference won't be read by root or after change */
284+ g_signal_connect_swapped (caja_preferences ,
285+ "changed::" CAJA_PREFERENCES_ALWAYS_USE_BROWSER ,
286+ G_CALLBACK (caja_empty_callback_to_ensure_read ),
287+ self );
288+
289+ if (browser_window || g_settings_get_boolean (caja_preferences , CAJA_PREFERENCES_ALWAYS_USE_BROWSER )) {
290+ window = caja_application_create_navigation_window (application , screen );
291+ } else {
292+ window = caja_application_get_spatial_window (application ,
293+ NULL ,
294+ NULL ,
295+ locations [0 ],
296+ screen ,
297+ NULL );
298+ }
299+
300+ /* open all locations */
301+ uri = g_file_get_uri (locations [0 ]);
302+ g_debug ("Opening new tab at uri %s\n" , uri );
303+ caja_window_go_to (window , locations [0 ]);
304+ for (int i = 1 ; i < n_files ;i ++ ) {
305+ /* open tabs in reverse order because each
306+ * tab is opened before the previous one */
307+ guint tab = n_files - i ;
308+ uri = g_file_get_uri (locations [tab ]);
309+ g_debug ("Opening new tab at uri %s\n" , uri );
310+ if (i == 0 ) {
311+ caja_window_go_to (window , locations [tab ]);
312+ } else {
313+ caja_window_go_to_tab (window , locations [tab ]);
314+ }
315+ }
316+
317+ if (geometry != NULL && !gtk_widget_get_visible (GTK_WIDGET (window ))) {
318+ /* never maximize windows opened from shell if a
319+ * custom geometry has been requested. */
320+ gtk_window_unmaximize (GTK_WINDOW (window ));
321+ eel_gtk_window_set_initial_geometry_from_string (GTK_WINDOW (window ),
322+ geometry ,
323+ APPLICATION_WINDOW_MIN_WIDTH ,
324+ APPLICATION_WINDOW_MIN_HEIGHT ,
325+ FALSE);
326+ }
327+
328+ g_free (uri );
329+ }
330+
270331static void
271332open_windows (CajaApplication * application ,
272- GFile * * files ,
273- GdkScreen * screen ,
274- const char * geometry ,
275- guint len ,
276- gboolean browser_window )
333+ GFile * * files ,
334+ GdkScreen * screen ,
335+ const char * geometry ,
336+ guint n_files ,
337+ gboolean browser_window ,
338+ gboolean open_in_tabs )
277339{
278340 guint i ;
279341
280342 if (files == NULL || files [0 ] == NULL ) {
281343 /* Open a window pointing at the default location. */
282- open_window (application , NULL , screen , geometry , browser_window );
344+ open_window (application , NULL , screen , geometry , browser_window );
283345 } else {
284- /* Open windows at each requested location. */
285- i = 0 ;
286- while (i < len ){
287- open_window (application , files [i ], screen , geometry , browser_window );
288- i ++ ;
289- }
346+ if (open_in_tabs ) {
347+ /* Open one window with one tab at each requested location */
348+ open_tabs (application , files , n_files , screen , geometry , browser_window );
349+ } else {
350+ /* Open windows at each requested location. */
351+ i = 0 ;
352+ while (i < n_files ) {
353+ open_window (application , files [i ], screen , geometry , browser_window );
354+ i ++ ;
355+ }
356+ }
290357 }
291358}
292359
293360static void
294361caja_application_open (GApplication * app ,
295- GFile * * files ,
296- gint n_files ,
297- const gchar * options )
362+ GFile * * files ,
363+ gint n_files ,
364+ const gchar * options )
298365{
299366 CajaApplication * self = CAJA_APPLICATION (app );
300367 gboolean browser_window = FALSE;
368+ gboolean open_in_tabs = FALSE;
301369 const gchar * geometry = NULL ;
302370 const char splitter = '=' ;
303371
304372 g_debug ("Open called on the GApplication instance; %d files" , n_files );
305373
306- /*Check if local command line passed --browser or --geometry */
307- if (strcmp (options ,"" ) != 0 ){
308- if (g_str_match_string ("browser" ,
309- options ,
310- FALSE) == TRUE){
311- browser_window = TRUE;
312- geometry = strchr (options , splitter );
313- }
314- else {
315- geometry = options ;
374+ /* Check if local command line passed --browser, --geometry or --tabs */
375+ if (strlen (options ) > 0 ) {
376+ gchar * * splitedOptions = g_strsplit (options , & splitter , 3 );
377+ sscanf (splitedOptions [0 ], "%d" , & browser_window );
378+ if (strcmp (splitedOptions [1 ], "NULL" ) != 0 ) {
379+ geometry = splitedOptions [1 ];
316380 }
317- /*Reset this or 3ed and later invocations will use same
318- *geometry even if the user has resized open window
319- */
381+ sscanf (splitedOptions [2 ], "%d" , & open_in_tabs );
382+
383+ /* Reset this or 3ed and later invocations will use same
384+ * geometry even if the user has resized open window */
320385 self -> priv -> geometry = NULL ;
386+ g_strfreev (splitedOptions );
321387 }
322388
323389 open_windows (self , files ,
324- gdk_screen_get_default (),
325- geometry ,
326- n_files ,
327- browser_window );
390+ gdk_screen_get_default (),
391+ geometry ,
392+ n_files ,
393+ browser_window ,
394+ open_in_tabs );
328395}
329396
330397void
331398caja_application_open_location (CajaApplication * application ,
332399 GFile * location ,
333400 GFile * selection ,
334- const char * startup_id )
401+ const char * startup_id ,
402+ const gboolean open_in_tabs )
335403{
336404 CajaWindow * window ;
337405 GList * sel_list = NULL ;
@@ -343,7 +411,8 @@ caja_application_open_location (CajaApplication *application,
343411 }
344412
345413 caja_window_slot_open_location_full (caja_window_get_active_slot (window ), location ,
346- 0 , CAJA_WINDOW_OPEN_FLAG_NEW_WINDOW , sel_list , NULL , NULL );
414+ open_in_tabs , CAJA_WINDOW_OPEN_FLAG_NEW_WINDOW ,
415+ sel_list , NULL , NULL );
347416
348417 if (sel_list != NULL ) {
349418 caja_file_list_free (sel_list );
@@ -358,7 +427,7 @@ caja_application_quit (CajaApplication *self)
358427
359428 windows = gtk_application_get_windows (GTK_APPLICATION (app ));
360429 g_list_foreach (windows , (GFunc ) gtk_widget_destroy , NULL );
361- /* we have been asked to force quit */
430+ /* we have been asked to force quit */
362431 g_application_quit (G_APPLICATION (self ));
363432}
364433
@@ -1997,6 +2066,7 @@ caja_application_local_command_line (GApplication *application,
19972066 gboolean perform_self_check = FALSE;
19982067 gboolean version = FALSE;
19992068 gboolean browser_window = FALSE;
2069+ gboolean open_in_tabs = FALSE;
20002070 gboolean kill_shell = FALSE;
20012071 const gchar * autostart_id ;
20022072 gboolean no_default_window = FALSE;
@@ -2022,6 +2092,8 @@ caja_application_local_command_line (GApplication *application,
20222092 N_ ("Do not manage the desktop (ignore the preference set in the preferences dialog)." ), NULL },
20232093 { "force-desktop" , '\0' , 0 , G_OPTION_ARG_NONE , & self -> priv -> force_desktop ,
20242094 N_ ("Manage the desktop regardless of set preferences or environment (on new startup only)" ), NULL },
2095+ { "tabs" , 't' , 0 , G_OPTION_ARG_NONE , & open_in_tabs ,
2096+ N_ ("Open URIs in tabs." ), NULL },
20252097 { "browser" , '\0' , 0 , G_OPTION_ARG_NONE , & browser_window ,
20262098 N_ ("Open a browser window." ), NULL },
20272099 { "quit" , 'q' , 0 , G_OPTION_ARG_NONE , & kill_shell ,
@@ -2051,7 +2123,7 @@ caja_application_local_command_line (GApplication *application,
20512123 if (autostart_id != NULL && * autostart_id != '\0' ) {
20522124 no_default_window = TRUE;
20532125 self -> priv -> autostart = TRUE;
2054- }
2126+ }
20552127
20562128
20572129 argv = * arguments ;
@@ -2109,7 +2181,6 @@ caja_application_local_command_line (GApplication *application,
21092181 caja_application_load_session (self );
21102182 }
21112183
2112-
21132184 GFile * * files ;
21142185 gint idx , len ;
21152186
@@ -2143,30 +2214,18 @@ caja_application_local_command_line (GApplication *application,
21432214 files [1 ] = NULL ;
21442215 }
21452216
2146- /*Set up geometry and --browser options */
2217+ /*Set up -- geometry, --browser and --tabs options */
21472218 /*Invoke "Open" to create new windows */
2148-
2149- if (browser_window == TRUE && self -> priv -> geometry == NULL ){
2150-
2151- if (len > 0 ) {
2152- g_application_open (application , files , len , "browser" );
2153- }
2154- }
2155-
2156- else if (browser_window == FALSE && self -> priv -> geometry != NULL ){
2157- if (len > 0 ) {
2158- g_application_open (application , files , len , self -> priv -> geometry );
2159- }
2160- }
2161-
2162- else if (browser_window == TRUE && self -> priv -> geometry != NULL ){
2163- if (len > 0 ) {
2164- g_application_open (application , files , len , (g_strconcat ("browser" ,"=" ,
2165- self -> priv -> geometry , NULL )));
2219+ if (len > 0 ) {
2220+ gchar * concatOptions = g_malloc0 (64 );
2221+ if (self -> priv -> geometry == NULL ) {
2222+ g_snprintf (concatOptions , 64 , "%d=NULL=%d" , browser_window , open_in_tabs );
2223+ } else {
2224+ g_snprintf (concatOptions , 64 , "%d=%s=%d" , browser_window , self -> priv -> geometry , open_in_tabs );
21662225 }
2167- }
2168-
2169- else {
2226+ g_application_open ( application , files , len , concatOptions );
2227+ g_free ( concatOptions );
2228+ } else {
21702229 if (len > 0 ) {
21712230 g_application_open (application , files , len , "" );
21722231 }
@@ -2180,7 +2239,6 @@ caja_application_local_command_line (GApplication *application,
21802239 out :
21812240 g_option_context_free (context );
21822241
2183-
21842242 return TRUE;
21852243}
21862244
@@ -2420,11 +2478,11 @@ caja_application_quit_mainloop (GApplication *app)
24202478static void
24212479caja_application_class_init (CajaApplicationClass * class )
24222480{
2423- GObjectClass * object_class ;
2481+ GObjectClass * object_class ;
24242482 GApplicationClass * application_class ;
24252483
2426- object_class = G_OBJECT_CLASS (class );
2427- object_class -> finalize = caja_application_finalize ;
2484+ object_class = G_OBJECT_CLASS (class );
2485+ object_class -> finalize = caja_application_finalize ;
24282486
24292487 application_class = G_APPLICATION_CLASS (class );
24302488 application_class -> startup = caja_application_startup ;
0 commit comments