@@ -267,26 +267,90 @@ open_window (CajaApplication *application,
267
267
g_free (uri );
268
268
}
269
269
270
+ static void
271
+ open_tabs (CajaApplication * application ,
272
+ GFile * * locations , guint n_files , GdkScreen * screen , const char * geometry , gboolean browser_window )
273
+ {
274
+ CajaApplication * self = CAJA_APPLICATION (application );
275
+ CajaWindow * window ;
276
+ gchar * uri = NULL ;
277
+
278
+ /*monitor the preference to use browser or spatial windows */
279
+ /*connect before trying to read or this preference won't be read by root or after change*/
280
+ g_signal_connect_swapped (caja_preferences , "changed::" CAJA_PREFERENCES_ALWAYS_USE_BROWSER ,
281
+ G_CALLBACK (caja_empty_callback_to_ensure_read ),
282
+ self );
283
+
284
+ if (browser_window || g_settings_get_boolean (caja_preferences , CAJA_PREFERENCES_ALWAYS_USE_BROWSER )) {
285
+ window = caja_application_create_navigation_window (application ,
286
+ screen );
287
+ } else {
288
+ window = caja_application_get_spatial_window (application ,
289
+ NULL ,
290
+ NULL ,
291
+ locations [0 ],
292
+ screen ,
293
+ NULL );
294
+ }
295
+
296
+ /* open all locations */
297
+ uri = g_file_get_uri (locations [0 ]);
298
+ g_debug ("Opening new tab at uri %s\n" , uri );
299
+ caja_window_go_to (window , locations [0 ]);
300
+ for (int i = 1 ; i < n_files ;i ++ ){
301
+ /* open tabs in reverse order because each
302
+ * tab is opened before the previous one */
303
+ guint tab = n_files - i ;
304
+ uri = g_file_get_uri (locations [tab ]);
305
+ g_debug ("Opening new tab at uri %s\n" , uri );
306
+ if (i == 0 ){
307
+ caja_window_go_to (window , locations [tab ]);
308
+ }else {
309
+ caja_window_go_to_tab (window , locations [tab ]);
310
+ }
311
+ }
312
+
313
+ if (geometry != NULL && !gtk_widget_get_visible (GTK_WIDGET (window ))) {
314
+ /* never maximize windows opened from shell if a
315
+ * custom geometry has been requested.
316
+ */
317
+ gtk_window_unmaximize (GTK_WINDOW (window ));
318
+ eel_gtk_window_set_initial_geometry_from_string (GTK_WINDOW (window ),
319
+ geometry ,
320
+ APPLICATION_WINDOW_MIN_WIDTH ,
321
+ APPLICATION_WINDOW_MIN_HEIGHT ,
322
+ FALSE);
323
+ }
324
+
325
+ g_free (uri );
326
+ }
327
+
270
328
static void
271
329
open_windows (CajaApplication * application ,
272
330
GFile * * files ,
273
331
GdkScreen * screen ,
274
332
const char * geometry ,
275
- guint len ,
276
- gboolean browser_window )
333
+ guint n_files ,
334
+ gboolean browser_window ,
335
+ gboolean open_in_tabs )
277
336
{
278
337
guint i ;
279
338
280
339
if (files == NULL || files [0 ] == NULL ) {
281
340
/* Open a window pointing at the default location. */
282
- open_window (application , NULL , screen , geometry , browser_window );
341
+ open_window (application , NULL , screen , geometry , browser_window );
283
342
} 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
- }
343
+ if (open_in_tabs ){
344
+ /* Open one window with one tab at each requested location */
345
+ open_tabs (application , files , n_files , screen , geometry , browser_window );
346
+ }else {
347
+ /* Open windows at each requested location. */
348
+ i = 0 ;
349
+ while (i < n_files ){
350
+ open_window (application , files [i ], screen , geometry , browser_window );
351
+ i ++ ;
352
+ }
353
+ }
290
354
}
291
355
}
292
356
@@ -298,40 +362,41 @@ caja_application_open (GApplication *app,
298
362
{
299
363
CajaApplication * self = CAJA_APPLICATION (app );
300
364
gboolean browser_window = FALSE;
365
+ gboolean open_in_tabs = FALSE;
301
366
const gchar * geometry = NULL ;
302
367
const char splitter = '=' ;
303
368
304
369
g_debug ("Open called on the GApplication instance; %d files" , n_files );
305
370
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 ;
371
+ /*Check if local command line passed --browser, --geometry or --tabs*/
372
+ if (strlen (options ) > 0 ){
373
+ gchar * * splitedOptions = g_strsplit (options , & splitter , 3 );
374
+ sscanf (splitedOptions [0 ], "%d" , & browser_window );
375
+ if (strcmp (splitedOptions [1 ], "NULL" )!= 0 ){
376
+ geometry = splitedOptions [1 ];
316
377
}
378
+ sscanf (splitedOptions [2 ], "%d" , & open_in_tabs );
379
+
317
380
/*Reset this or 3ed and later invocations will use same
318
381
*geometry even if the user has resized open window
319
382
*/
320
383
self -> priv -> geometry = NULL ;
321
384
}
322
385
323
- open_windows (self , files ,
386
+ open_windows (self , files ,
324
387
gdk_screen_get_default (),
325
388
geometry ,
326
389
n_files ,
327
- browser_window );
390
+ browser_window ,
391
+ open_in_tabs );
328
392
}
329
393
330
394
void
331
395
caja_application_open_location (CajaApplication * application ,
332
396
GFile * location ,
333
397
GFile * selection ,
334
- const char * startup_id )
398
+ const char * startup_id ,
399
+ const gboolean open_in_tabs )
335
400
{
336
401
CajaWindow * window ;
337
402
GList * sel_list = NULL ;
@@ -343,7 +408,8 @@ caja_application_open_location (CajaApplication *application,
343
408
}
344
409
345
410
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 );
411
+ open_in_tabs , CAJA_WINDOW_OPEN_FLAG_NEW_WINDOW ,
412
+ sel_list , NULL , NULL );
347
413
348
414
if (sel_list != NULL ) {
349
415
caja_file_list_free (sel_list );
@@ -1997,6 +2063,7 @@ caja_application_local_command_line (GApplication *application,
1997
2063
gboolean perform_self_check = FALSE;
1998
2064
gboolean version = FALSE;
1999
2065
gboolean browser_window = FALSE;
2066
+ gboolean open_in_tabs = FALSE;
2000
2067
gboolean kill_shell = FALSE;
2001
2068
const gchar * autostart_id ;
2002
2069
gboolean no_default_window = FALSE;
@@ -2022,6 +2089,8 @@ caja_application_local_command_line (GApplication *application,
2022
2089
N_ ("Do not manage the desktop (ignore the preference set in the preferences dialog)." ), NULL },
2023
2090
{ "force-desktop" , '\0' , 0 , G_OPTION_ARG_NONE , & self -> priv -> force_desktop ,
2024
2091
N_ ("Manage the desktop regardless of set preferences or environment (on new startup only)" ), NULL },
2092
+ { "tabs" , 't' , 0 , G_OPTION_ARG_NONE , & open_in_tabs ,
2093
+ N_ ("Open URI in tabs." ), NULL },
2025
2094
{ "browser" , '\0' , 0 , G_OPTION_ARG_NONE , & browser_window ,
2026
2095
N_ ("Open a browser window." ), NULL },
2027
2096
{ "quit" , 'q' , 0 , G_OPTION_ARG_NONE , & kill_shell ,
@@ -2051,7 +2120,7 @@ caja_application_local_command_line (GApplication *application,
2051
2120
if (autostart_id != NULL && * autostart_id != '\0' ) {
2052
2121
no_default_window = TRUE;
2053
2122
self -> priv -> autostart = TRUE;
2054
- }
2123
+ }
2055
2124
2056
2125
2057
2126
argv = * arguments ;
@@ -2109,7 +2178,6 @@ caja_application_local_command_line (GApplication *application,
2109
2178
caja_application_load_session (self );
2110
2179
}
2111
2180
2112
-
2113
2181
GFile * * files ;
2114
2182
gint idx , len ;
2115
2183
@@ -2143,30 +2211,19 @@ caja_application_local_command_line (GApplication *application,
2143
2211
files [1 ] = NULL ;
2144
2212
}
2145
2213
2146
- /*Set up geometry and --browser options */
2214
+ /*Set up -- geometry, --browser and --tabs options */
2147
2215
/*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 );
2216
+ if (len > 0 ) {
2217
+ gchar * concatOptions = g_malloc0 (64 );
2218
+ if (self -> priv -> geometry == NULL ){
2219
+ g_snprintf (concatOptions , 64 , "%d=NULL=%d" , browser_window , open_in_tabs );
2220
+ }else {
2221
+ g_snprintf (concatOptions , 64 , "%d=%s=%d" , browser_window , self -> priv -> geometry , open_in_tabs );
2159
2222
}
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 )));
2166
- }
2167
- }
2168
-
2169
- else {
2223
+ g_application_open (application , files , len , concatOptions );
2224
+ g_free (concatOptions );
2225
+ } else {
2226
+ g_print ("non\n" );
2170
2227
if (len > 0 ) {
2171
2228
g_application_open (application , files , len , "" );
2172
2229
}
@@ -2420,11 +2477,11 @@ caja_application_quit_mainloop (GApplication *app)
2420
2477
static void
2421
2478
caja_application_class_init (CajaApplicationClass * class )
2422
2479
{
2423
- GObjectClass * object_class ;
2480
+ GObjectClass * object_class ;
2424
2481
GApplicationClass * application_class ;
2425
2482
2426
- object_class = G_OBJECT_CLASS (class );
2427
- object_class -> finalize = caja_application_finalize ;
2483
+ object_class = G_OBJECT_CLASS (class );
2484
+ object_class -> finalize = caja_application_finalize ;
2428
2485
2429
2486
application_class = G_APPLICATION_CLASS (class );
2430
2487
application_class -> startup = caja_application_startup ;
0 commit comments