summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Masci <>2018-09-14 22:30:23 +0200
committerraveit65 <[email protected]>2018-09-17 09:28:48 +0200
commit6a31ce65e4213d6069e5eb515640233cd27c3937 (patch)
treeb982839d912c1ff13ccbe06e00f1bfb2ab6b445d
parentfb9a3cfdd0eeac12044ed2f317f51193bf44b6e0 (diff)
downloadcaja-6a31ce65e4213d6069e5eb515640233cd27c3937.tar.bz2
caja-6a31ce65e4213d6069e5eb515640233cd27c3937.tar.xz
add option to open multiple uri in tabs at startup
-rw-r--r--docs/caja.13
-rw-r--r--src/caja-application.c196
-rw-r--r--src/caja-application.h3
-rw-r--r--src/caja-freedesktop-dbus.c6
-rw-r--r--src/caja-window.c10
-rw-r--r--src/caja-window.h2
6 files changed, 146 insertions, 74 deletions
diff --git a/docs/caja.1 b/docs/caja.1
index a7741c2e..03f31bee 100644
--- a/docs/caja.1
+++ b/docs/caja.1
@@ -26,6 +26,9 @@ X display to use.
\fB\-g, \-\-geometry=\fIGEOMETRY\fR
Create the initial window with the given geometry.
.TP
+\fB\-t, \-\-tabs\fR
+Open URIs in tabs.
+.TP
\fB\-n, \-\-no\-default\-window\fR
Only create windows for explicitly specified URIs.
.TP
diff --git a/src/caja-application.c b/src/caja-application.c
index 5f460d3d..befc6133 100644
--- a/src/caja-application.c
+++ b/src/caja-application.c
@@ -221,7 +221,10 @@ caja_empty_callback_to_ensure_read() {
static void
open_window (CajaApplication *application,
- GFile *location, GdkScreen *screen, const char *geometry, gboolean browser_window)
+ GFile *location,
+ GdkScreen *screen,
+ const char *geometry,
+ gboolean browser_window)
{
CajaApplication *self = CAJA_APPLICATION (application);
CajaWindow *window;
@@ -239,9 +242,7 @@ open_window (CajaApplication *application,
if (browser_window ||g_settings_get_boolean (caja_preferences, CAJA_PREFERENCES_ALWAYS_USE_BROWSER)) {
window = caja_application_create_navigation_window (application,
screen);
- }
-
- else {
+ } else {
window = caja_application_get_spatial_window (application,
NULL,
NULL,
@@ -254,8 +255,7 @@ open_window (CajaApplication *application,
if (geometry != NULL && !gtk_widget_get_visible (GTK_WIDGET (window))) {
/* never maximize windows opened from shell if a
- * custom geometry has been requested.
- */
+ * custom geometry has been requested. */
gtk_window_unmaximize (GTK_WINDOW (window));
eel_gtk_window_set_initial_geometry_from_string (GTK_WINDOW (window),
geometry,
@@ -268,70 +268,138 @@ open_window (CajaApplication *application,
}
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)
+ GFile **files,
+ GdkScreen *screen,
+ const char *geometry,
+ 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++ ;
+ }
+ }
}
}
static void
caja_application_open (GApplication *app,
- GFile **files,
- gint n_files,
- const gchar *options)
+ GFile **files,
+ gint n_files,
+ const gchar *options)
{
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];
}
- /*Reset this or 3ed and later invocations will use same
- *geometry even if the user has resized open window
- */
+ 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;
+ g_strfreev (splitedOptions);
}
open_windows (self, files,
- gdk_screen_get_default (),
- geometry,
- n_files,
- browser_window);
+ gdk_screen_get_default (),
+ geometry,
+ n_files,
+ 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 +411,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);
@@ -358,7 +427,7 @@ caja_application_quit (CajaApplication *self)
windows = gtk_application_get_windows (GTK_APPLICATION (app));
g_list_foreach (windows, (GFunc) gtk_widget_destroy, NULL);
- /* we have been asked to force quit */
+ /* we have been asked to force quit */
g_application_quit (G_APPLICATION (self));
}
@@ -1997,6 +2066,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 +2092,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 URIs 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 +2123,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 +2181,6 @@ caja_application_local_command_line (GApplication *application,
caja_application_load_session (self);
}
-
GFile **files;
gint idx, len;
@@ -2143,30 +2214,18 @@ 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);
- }
- }
-
- 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)));
+ 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 {
+ g_application_open (application, files, len, concatOptions);
+ g_free (concatOptions);
+ } else {
if (len > 0) {
g_application_open (application, files, len, "");
}
@@ -2180,7 +2239,6 @@ caja_application_local_command_line (GApplication *application,
out:
g_option_context_free (context);
-
return TRUE;
}
@@ -2420,11 +2478,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
@@ -235,6 +235,14 @@ caja_window_go_to (CajaWindow *window, GFile *location)
}
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,
CajaWindowGoToCallback callback,
@@ -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..7d53ab7a 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,