Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
add option to open multiple uri in tabs at startup
  • Loading branch information
Clément Masci committed Sep 14, 2018
1 parent 3619f72 commit fd1f45f
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 55 deletions.
157 changes: 107 additions & 50 deletions src/caja-application.c
Expand Up @@ -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++ ;
}
}
}
}

Expand All @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -2109,7 +2178,6 @@ caja_application_local_command_line (GApplication *application,
caja_application_load_session (self);
}


GFile **files;
gint idx, len;

Expand Down Expand Up @@ -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, "");
}
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/caja-application.h
Expand Up @@ -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 */
6 changes: 3 additions & 3 deletions src/caja-freedesktop-dbus.c
Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down
10 changes: 9 additions & 1 deletion src/caja-window.c
Expand Up @@ -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,
Expand Down Expand Up @@ -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;

Expand Down
2 changes: 2 additions & 0 deletions src/caja-window.h
Expand Up @@ -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,
Expand Down

0 comments on commit fd1f45f

Please sign in to comment.