Branch: refs/heads/master Author: Thomas Martitz thomas.martitz@mailbox.org Committer: Thomas Martitz thomas.martitz@mailbox.org Date: Thu, 17 Feb 2022 21:43:54 UTC Commit: 27982f333d731607e6efcf83d03a6129f45ef05e https://github.com/geany/geany/commit/27982f333d731607e6efcf83d03a6129f45ef0...
Log Message: ----------- Disconnect default session and project session files
Currently, when loading "projects" (i.e. named sessions), the file list overwrites the default session. Therefore, when loading a project, the previously opened files are lost.
With this the default session is maintained separately. Any time a project is opened it is written to session.conf and can be restored later on.
Modified Paths: -------------- src/keyfile.c src/keyfile.h src/libmain.c src/project.c src/projectprivate.h
Modified: src/keyfile.c 110 lines changed, 57 insertions(+), 53 deletions(-) =================================================================== @@ -106,11 +106,10 @@
static gchar *scribble_text = NULL; static gint scribble_pos = -1; -static GPtrArray *session_files = NULL; +static GPtrArray *default_session_files = NULL; static gint session_notebook_page; static gint hpan_position; static gint vpan_position; -static guint document_list_update_idle_func_id = 0; static const gchar atomic_file_saving_key[] = "use_atomic_file_saving";
typedef enum @@ -665,7 +664,7 @@ void write_config_file(gchar const *filename, ConfigPayload payload) save_recent_files(config, ui_prefs.recent_projects_queue, "recent_projects"); project_save_prefs(config); /* save project filename, etc. */ save_ui_session(config); - if (cl_options.load_session) + if (cl_options.load_session && app->project == NULL) configuration_save_session_files(config); #ifdef HAVE_VTE else if (vte_info.have_vte) @@ -717,34 +716,20 @@ static void load_recent_files(GKeyFile *config, GQueue *queue, const gchar *key)
/* - * Load session list from the given keyfile, and store it in the global - * session_files variable for later file loading + * Load session list from the given keyfile and return an array containg the file names * */ -void configuration_load_session_files(GKeyFile *config, gboolean read_recent_files) +GPtrArray *configuration_load_session_files(GKeyFile *config) { guint i; gboolean have_session_files; gchar entry[16]; gchar **tmp_array; GError *error = NULL; + GPtrArray *files;
session_notebook_page = utils_get_setting_integer(config, "files", "current_page", -1);
- if (read_recent_files) - { - load_recent_files(config, ui_prefs.recent_queue, "recent_files"); - load_recent_files(config, ui_prefs.recent_projects_queue, "recent_projects"); - } - - /* the project may load another list than the main setting */ - if (session_files != NULL) - { - foreach_ptr_array(tmp_array, i, session_files) - g_strfreev(tmp_array); - g_ptr_array_free(session_files, TRUE); - } - - session_files = g_ptr_array_new(); + files = g_ptr_array_new(); have_session_files = TRUE; i = 0; while (have_session_files) @@ -757,7 +742,7 @@ void configuration_load_session_files(GKeyFile *config, gboolean read_recent_fil error = NULL; have_session_files = FALSE; } - g_ptr_array_add(session_files, tmp_array); + g_ptr_array_add(files, tmp_array); i++; }
@@ -770,6 +755,8 @@ void configuration_load_session_files(GKeyFile *config, gboolean read_recent_fil g_free(tmp_string); } #endif + + return files; }
@@ -1170,15 +1157,17 @@ void configuration_clear_default_session(void) /* * Only reload the session part of the default configuration */ -void configuration_reload_default_session(void) +void configuration_load_default_session(void) { gchar *configfile = g_build_filename(app->configdir, SESSION_FILE, NULL); GKeyFile *config = g_key_file_new();
+ g_return_if_fail(default_session_files == NULL); + g_key_file_load_from_file(config, configfile, G_KEY_FILE_NONE, NULL); g_free(configfile);
- configuration_load_session_files(config, FALSE); + default_session_files = configuration_load_session_files(config);
g_key_file_free(config); } @@ -1217,8 +1206,8 @@ gboolean read_config_file(gchar const *filename, ConfigPayload payload) case SESSION: project_load_prefs(config); load_ui_session(config); - /* read stash prefs */ - configuration_load_session_files(config, TRUE); + load_recent_files(config, ui_prefs.recent_queue, "recent_files"); + load_recent_files(config, ui_prefs.recent_projects_queue, "recent_projects"); break; }
@@ -1307,11 +1296,33 @@ static gboolean open_session_file(gchar **tmp, guint len) return ret; }
+/* trigger a notebook page switch after unsetting main_status.opening_session_files + * for callbacks to run (and update window title, encoding settings, and so on) + */ +static gboolean switch_to_session_page(gpointer data) +{ + gint n_pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); + gint cur_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(main_widgets.notebook)); + gint target_page = session_notebook_page >= 0 ? session_notebook_page : cur_page; + + if (n_pages > 0) + { + if (target_page != cur_page) + gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), target_page); + else + g_signal_emit_by_name(GTK_NOTEBOOK(main_widgets.notebook), "switch-page", + gtk_notebook_get_nth_page(GTK_NOTEBOOK(main_widgets.notebook), target_page), + target_page); + } + session_notebook_page = -1; + + return G_SOURCE_REMOVE; +}
/* Open session files * Note: notebook page switch handler and adding to recent files list is always disabled * for all files opened within this function */ -void configuration_open_files(void) +void configuration_open_files(GPtrArray *session_files) { gint i; gboolean failure = FALSE; @@ -1347,28 +1358,25 @@ void configuration_open_files(void) }
g_ptr_array_free(session_files, TRUE); - session_files = NULL;
if (failure) - { ui_set_statusbar(TRUE, _("Failed to load one or more session files.")); - main_status.opening_session_files--; - } else - { - /* explicitly trigger a notebook page switch after unsetting main_status.opening_session_files - * for callbacks to run (and update window title, encoding settings, and so on) */ - gint n_pages = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); - gint cur_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(main_widgets.notebook)); - gint target_page = session_notebook_page >= 0 ? session_notebook_page : cur_page; - - /* if target page is current page, switch to another page first to really trigger an event */ - if (target_page == cur_page && n_pages > 0) - gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), (cur_page + 1) % n_pages); - - main_status.opening_session_files--; - gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), target_page); - } + g_idle_add(switch_to_session_page, NULL); + + main_status.opening_session_files--; +} + + +/* Open session files + * Note: notebook page switch handler and adding to recent files list is always disabled + * for all files opened within this function */ +void configuration_open_default_session(void) +{ + g_return_if_fail(default_session_files != NULL); + + configuration_open_files(default_session_files); + default_session_files = NULL; }
@@ -1410,12 +1418,10 @@ void configuration_apply_settings(void)
static gboolean save_configuration_cb(gpointer data) { - configuration_save(); if (app->project != NULL) - { project_write_config(); - } - document_list_update_idle_func_id = 0; + else + configuration_save_default_session(); return G_SOURCE_REMOVE; }
@@ -1431,10 +1437,8 @@ static void document_list_changed_cb(GObject *obj, GeanyDocument *doc, gpointer !main_status.opening_session_files && !main_status.quitting) { - if (document_list_update_idle_func_id == 0) - { - document_list_update_idle_func_id = g_idle_add(save_configuration_cb, NULL); - } + g_idle_remove_by_data(save_configuration_cb); + g_idle_add(save_configuration_cb, save_configuration_cb); } }
Modified: src/keyfile.h 8 lines changed, 5 insertions(+), 3 deletions(-) =================================================================== @@ -46,15 +46,17 @@ void configuration_save(void);
gboolean configuration_load(void);
-void configuration_open_files(void); +void configuration_open_files(GPtrArray *session_files);
-void configuration_reload_default_session(void); +void configuration_load_default_session(void); + +void configuration_open_default_session(void);
void configuration_save_default_session(void);
void configuration_clear_default_session(void);
-void configuration_load_session_files(GKeyFile *config, gboolean read_recent_files); +GPtrArray *configuration_load_session_files(GKeyFile *config);
void configuration_save_session_files(GKeyFile *config);
Modified: src/libmain.c 13 lines changed, 12 insertions(+), 1 deletions(-) =================================================================== @@ -46,6 +46,7 @@ #include "navqueue.h" #include "notebook.h" #include "plugins.h" +#include "projectprivate.h" #include "prefs.h" #include "printing.h" #include "sidebar.h" @@ -970,13 +971,23 @@ static void load_startup_files(gint argc, gchar **argv) { if (app->project == NULL) load_session_project_file(); + if (app->project == NULL) + configuration_load_default_session(); load_session = TRUE; }
if (load_session) { /* load session files into tabs, as they are found in the session_files variable */ - configuration_open_files(); + if (app->project != NULL) + { + configuration_open_files(app->project->priv->session_files); + app->project->priv->session_files = NULL; + } + else + { + configuration_open_default_session(); + }
if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)) == 0) {
Modified: src/project.c 22 lines changed, 13 insertions(+), 9 deletions(-) =================================================================== @@ -265,8 +265,8 @@ static void run_new_dialog(PropertyDialogElements *e) else { // reload any documents that were closed - configuration_reload_default_session(); - configuration_open_files(); + configuration_load_default_session(); + configuration_open_default_session(); } }
@@ -275,7 +275,8 @@ gboolean project_load_file_with_session(const gchar *locale_file_name) { if (project_load_file(locale_file_name)) { - configuration_open_files(); + configuration_open_files(app->project->priv->session_files); + app->project->priv->session_files = NULL; document_new_file_if_non_open(); ui_focus_current_document(); return TRUE; @@ -459,8 +460,8 @@ static void destroy_project(gboolean open_default) /* after closing all tabs let's open the tabs found in the default config */ if (open_default && cl_options.load_session) { - configuration_reload_default_session(); - configuration_open_files(); + configuration_load_default_session(); + configuration_open_default_session(); document_new_file_if_non_open(); ui_focus_current_document(); } @@ -1065,11 +1066,14 @@ static gboolean load_config(const gchar *filename)
build_load_menu(config, GEANY_BCS_PROJ, (gpointer)p); /* save current (non-project) session (it could have been changed since program startup) */ - configuration_save_default_session(); - /* now close all open files */ - document_close_all(); + if (!main_status.opening_session_files) + { + configuration_save_default_session(); + /* now close all open files */ + document_close_all(); + } /* read session files so they can be opened with configuration_open_files() */ - configuration_load_session_files(config, FALSE); + p->priv->session_files = configuration_load_session_files(config); g_signal_emit_by_name(geany_object, "project-open", config); g_key_file_free(config);
Modified: src/projectprivate.h 1 lines changed, 1 insertions(+), 0 deletions(-) =================================================================== @@ -45,6 +45,7 @@ typedef struct GeanyProjectPrivate gint long_line_column; /* Long line marker position. */
GPtrArray *build_filetypes_list; /* Project has custom filetype builds for these. */ + GPtrArray *session_files; } GeanyProjectPrivate;
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).