[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