Skip to content

Commit 6a31ce6

Browse files
Clément Masciraveit65
authored andcommitted
add option to open multiple uri in tabs at startup
1 parent fb9a3cf commit 6a31ce6

File tree

6 files changed

+146
-74
lines changed

6 files changed

+146
-74
lines changed

docs/caja.1

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ X display to use.
2626
\fB\-g, \-\-geometry=\fIGEOMETRY\fR
2727
Create the initial window with the given geometry.
2828
.TP
29+
\fB\-t, \-\-tabs\fR
30+
Open URIs in tabs.
31+
.TP
2932
\fB\-n, \-\-no\-default\-window\fR
3033
Only create windows for explicitly specified URIs.
3134
.TP

src/caja-application.c

Lines changed: 127 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,10 @@ caja_empty_callback_to_ensure_read() {
221221

222222
static void
223223
open_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+
270331
static void
271332
open_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

293360
static void
294361
caja_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

330397
void
331398
caja_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)
24202478
static void
24212479
caja_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;

src/caja-application.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ void caja_application_close_all_spatial_windows (void);
100100
void caja_application_open_location (CajaApplication *application,
101101
GFile *location,
102102
GFile *selection,
103-
const char *startup_id);
103+
const char *startup_id,
104+
const gboolean open_in_tabs);
104105

105106
#endif /* CAJA_APPLICATION_H */

src/caja-freedesktop-dbus.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ skeleton_handle_show_items_cb (CajaFreedesktopFileManager1 *object,
7575
parent = g_file_get_parent (file);
7676

7777
if (parent != NULL) {
78-
caja_application_open_location (application, parent, file, startup_id);
78+
caja_application_open_location (application, parent, file, startup_id, 0);
7979
g_object_unref (parent);
8080
} else {
81-
caja_application_open_location (application, file, NULL, startup_id);
81+
caja_application_open_location (application, file, NULL, startup_id, 0);
8282
}
8383

8484
g_object_unref (file);
@@ -105,7 +105,7 @@ skeleton_handle_show_folders_cb (CajaFreedesktopFileManager1 *object,
105105

106106
file = g_file_new_for_uri (uris[i]);
107107

108-
caja_application_open_location (application, file, NULL, startup_id);
108+
caja_application_open_location (application, file, NULL, startup_id, 0);
109109

110110
g_object_unref (file);
111111
}

src/caja-window.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,14 @@ caja_window_go_to (CajaWindow *window, GFile *location)
234234
caja_window_slot_go_to (window->details->active_pane->active_slot, location, FALSE);
235235
}
236236

237+
void
238+
caja_window_go_to_tab (CajaWindow *window, GFile *location)
239+
{
240+
g_return_if_fail (CAJA_IS_WINDOW (window));
241+
242+
caja_window_slot_go_to (window->details->active_pane->active_slot, location, TRUE);
243+
}
244+
237245
void
238246
caja_window_go_to_full (CajaWindow *window,
239247
GFile *location,
@@ -266,7 +274,7 @@ caja_window_new_tab (CajaWindow *window)
266274
CajaWindowSlot *current_slot;
267275
CajaWindowSlot *new_slot;
268276
CajaWindowOpenFlags flags;
269-
GFile *location;
277+
GFile *location = NULL;
270278
int new_slot_position;
271279
char *scheme;
272280

src/caja-window.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ void caja_window_disconnect_content_view (CajaWindow *window,
136136

137137
void caja_window_go_to (CajaWindow *window,
138138
GFile *location);
139+
void caja_window_go_to_tab (CajaWindow *window,
140+
GFile *location);
139141
void caja_window_go_to_full (CajaWindow *window,
140142
GFile *location,
141143
CajaWindowGoToCallback callback,

0 commit comments

Comments
 (0)