[geany/geany] 27982f: Disconnect default session and project session files
Thomas Martitz
git-noreply at xxxxx
Fri Mar 4 23:03:24 UTC 2022
Branch: refs/heads/master
Author: Thomas Martitz <thomas.martitz at mailbox.org>
Committer: Thomas Martitz <thomas.martitz at mailbox.org>
Date: Thu, 17 Feb 2022 21:43:54 UTC
Commit: 27982f333d731607e6efcf83d03a6129f45ef05e
https://github.com/geany/geany/commit/27982f333d731607e6efcf83d03a6129f45ef05e
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).
More information about the Commits
mailing list