[geany/geany] 22aac4: Merge pull request #3125 from kugel-/project_session

Thomas Martitz git-noreply at xxxxx
Fri Mar 4 23:03:19 UTC 2022


Branch:      refs/heads/master
Author:      Thomas Martitz <thomas.martitz at mailbox.org>
Committer:   GitHub <noreply at github.com>
Date:        Fri, 04 Mar 2022 23:03:19 UTC
Commit:      22aac4436da749d69aa1b330feb517ad0a4bac74
             https://github.com/geany/geany/commit/22aac4436da749d69aa1b330feb517ad0a4bac74

Log Message:
-----------
Merge pull request #3125 from kugel-/project_session

Save & restore default session independently of projects (fixes #267)


Modified Paths:
--------------
    data/geany.glade
    src/keyfile.c
    src/keyfile.h
    src/libmain.c
    src/main.h
    src/prefs.c
    src/project.c
    src/project.h
    src/projectprivate.h

Modified: data/geany.glade
16 lines changed, 0 insertions(+), 16 deletions(-)
===================================================================
@@ -1445,22 +1445,6 @@
                               <object class="GtkVBox" id="vbox35">
                                 <property name="visible">True</property>
                                 <property name="can-focus">False</property>
-                                <child>
-                                  <object class="GtkCheckButton" id="check_project_session">
-                                    <property name="label" translatable="yes">Use project-based session files</property>
-                                    <property name="visible">True</property>
-                                    <property name="can-focus">True</property>
-                                    <property name="receives-default">False</property>
-                                    <property name="tooltip-text" translatable="yes">Whether to store a project's session files and open them when re-opening the project</property>
-                                    <property name="use-underline">True</property>
-                                    <property name="draw-indicator">True</property>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
                                 <child>
                                   <object class="GtkCheckButton" id="check_project_file_in_basedir">
                                     <property name="label" translatable="yes">Store project file inside the project base directory</property>


Modified: src/keyfile.c
112 lines changed, 58 insertions(+), 54 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
@@ -458,7 +457,6 @@ static void save_dialog_prefs(GKeyFile *config)
 
 	/* general */
 	g_key_file_set_boolean(config, PACKAGE, "pref_main_load_session", prefs.load_session);
-	g_key_file_set_boolean(config, PACKAGE, "pref_main_project_session", project_prefs.project_session);
 	g_key_file_set_boolean(config, PACKAGE, "pref_main_project_file_in_basedir", project_prefs.project_file_in_basedir);
 	g_key_file_set_boolean(config, PACKAGE, "pref_main_save_winpos", prefs.save_winpos);
 	g_key_file_set_boolean(config, PACKAGE, "pref_main_save_wingeom", prefs.save_wingeom);
@@ -666,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)
@@ -718,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)
@@ -758,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++;
 	}
 
@@ -771,6 +755,8 @@ void configuration_load_session_files(GKeyFile *config, gboolean read_recent_fil
 		g_free(tmp_string);
 	}
 #endif
+
+	return files;
 }
 
 
@@ -815,7 +801,6 @@ static void load_dialog_prefs(GKeyFile *config)
 	prefs.confirm_exit = utils_get_setting_boolean(config, PACKAGE, "pref_main_confirm_exit", FALSE);
 	prefs.suppress_status_messages = utils_get_setting_boolean(config, PACKAGE, "pref_main_suppress_status_messages", FALSE);
 	prefs.load_session = utils_get_setting_boolean(config, PACKAGE, "pref_main_load_session", TRUE);
-	project_prefs.project_session = utils_get_setting_boolean(config, PACKAGE, "pref_main_project_session", TRUE);
 	project_prefs.project_file_in_basedir = utils_get_setting_boolean(config, PACKAGE, "pref_main_project_file_in_basedir", FALSE);
 	prefs.save_winpos = utils_get_setting_boolean(config, PACKAGE, "pref_main_save_winpos", TRUE);
 	prefs.save_wingeom = utils_get_setting_boolean(config, PACKAGE, "pref_main_save_wingeom", prefs.save_winpos);
@@ -1172,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);
 }
@@ -1219,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;
 	}
 
@@ -1309,17 +1296,39 @@ 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;
 
 	/* necessary to set it to TRUE for project session support */
-	main_status.opening_session_files = TRUE;
+	main_status.opening_session_files++;
 
 	i = file_prefs.tab_order_ltr ? 0 : (session_files->len - 1);
 	while (TRUE)
@@ -1349,26 +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."));
 	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 = FALSE;
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), target_page);
-	}
-	main_status.opening_session_files = FALSE;
+		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
21 lines changed, 16 insertions(+), 5 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"
@@ -263,7 +264,7 @@ static void main_init(void)
 	ignore_callback	= FALSE;
 	ui_prefs.recent_queue				= g_queue_new();
 	ui_prefs.recent_projects_queue		= g_queue_new();
-	main_status.opening_session_files	= FALSE;
+	main_status.opening_session_files	= 0;
 
 	main_widgets.window = create_window1();
 	g_signal_connect(main_widgets.window, "notify::is-active", G_CALLBACK(on_window_active_changed), NULL);
@@ -957,7 +958,7 @@ static void load_startup_files(gint argc, gchar **argv)
 		main_load_project_from_command_line(filename, FALSE);
 		argc--, argv++;
 		/* force session load if using project-based session files */
-		load_session = project_prefs.project_session;
+		load_session = TRUE;
 		g_free(filename);
 	}
 
@@ -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)
 		{
@@ -1194,9 +1205,9 @@ gint main_lib(gint argc, gchar **argv)
 	tools_create_insert_custom_command_menu_items();
 
 	/* load any command line files or session files */
-	main_status.opening_session_files = TRUE;
+	main_status.opening_session_files++;
 	load_startup_files(argc, argv);
-	main_status.opening_session_files = FALSE;
+	main_status.opening_session_files--;
 
 	/* open a new file if no other file was opened */
 	document_new_file_if_non_open();


Modified: src/main.h
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -53,7 +53,7 @@ extern CommandLineOptions cl_options;
 
 typedef struct GeanyStatus
 {
-	gboolean	opening_session_files;	/* state at startup while opening session files */
+	gint	opening_session_files;	/* >0 indicates batch-opening of session files */
 	gboolean	closing_all; /* the state while closing all tabs
 							  * (used to prevent notebook switch page signals) */
 	gboolean	quitting;	/* state when Geany is quitting completely */


Modified: src/prefs.c
6 lines changed, 0 insertions(+), 6 deletions(-)
===================================================================
@@ -409,9 +409,6 @@ static void prefs_init_dialog(void)
 	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_load_session");
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), prefs.load_session);
 
-	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_session");
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), project_prefs.project_session);
-
 	widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_file_in_basedir");
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), project_prefs.project_file_in_basedir);
 
@@ -892,9 +889,6 @@ on_prefs_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
 		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_load_session");
 		prefs.load_session = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
 
-		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_session");
-		project_prefs.project_session = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
-
 		widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_project_file_in_basedir");
 		project_prefs.project_file_in_basedir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
 


Modified: src/project.c
54 lines changed, 23 insertions(+), 31 deletions(-)
===================================================================
@@ -50,7 +50,7 @@
 #include <errno.h>
 
 
-ProjectPrefs project_prefs = { NULL, FALSE, FALSE };
+ProjectPrefs project_prefs = { NULL, FALSE };
 
 
 static GeanyProjectPrivate priv;
@@ -112,7 +112,7 @@ static gboolean have_session_docs(void)
 
 static gboolean handle_current_session(void)
 {
-	if (!app->project && project_prefs.project_session)
+	if (!app->project)
 	{
 		/* save session in case the dialog is cancelled */
 		configuration_save_default_session();
@@ -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,12 +275,10 @@ gboolean project_load_file_with_session(const gchar *locale_file_name)
 {
 	if (project_load_file(locale_file_name))
 	{
-		if (project_prefs.project_session)
-		{
-			configuration_open_files();
-			document_new_file_if_non_open();
-			ui_focus_current_document();
-		}
+		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;
 	}
 	return FALSE;
@@ -413,12 +411,10 @@ gboolean project_close(gboolean open_default)
 	if (!write_config())
 		g_warning("Project file \"%s\" could not be written", app->project->file_name);
 
-	if (project_prefs.project_session)
-	{
-		/* close all existing tabs first */
-		if (!document_close_all())
-			return FALSE;
-	}
+	/* close all existing tabs first */
+	if (!document_close_all())
+		return FALSE;
+
 	ui_set_statusbar(TRUE, _("Project \"%s\" closed."), app->project->name);
 	destroy_project(open_default);
 	return TRUE;
@@ -461,16 +457,13 @@ static void destroy_project(gboolean open_default)
 
 	apply_editor_prefs(); /* ensure that global settings are restored */
 
-	if (project_prefs.project_session)
+	/* after closing all tabs let's open the tabs found in the default config */
+	if (open_default && cl_options.load_session)
 	{
-		/* 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();
-			document_new_file_if_non_open();
-			ui_focus_current_document();
-		}
+		configuration_load_default_session();
+		configuration_open_default_session();
+		document_new_file_if_non_open();
+		ui_focus_current_document();
 	}
 	g_signal_emit_by_name(geany_object, "project-close");
 
@@ -1072,15 +1065,15 @@ static gboolean load_config(const gchar *filename)
 	apply_editor_prefs();
 
 	build_load_menu(config, GEANY_BCS_PROJ, (gpointer)p);
-	if (project_prefs.project_session)
+	/* save current (non-project) session (it could have been changed since program startup) */
+	if (!main_status.opening_session_files)
 	{
-		/* 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();
-		/* read session files so they can be opened with configuration_open_files() */
-		configuration_load_session_files(config, FALSE);
 	}
+	/* read session files so they can be opened with configuration_open_files() */
+	p->priv->session_files = configuration_load_session_files(config);
 	g_signal_emit_by_name(geany_object, "project-open", config);
 	g_key_file_free(config);
 
@@ -1135,8 +1128,7 @@ static gboolean write_config(void)
 	g_key_file_set_integer(config, "long line marker", "long_line_column", p->priv->long_line_column);
 
 	/* store the session files into the project too */
-	if (project_prefs.project_session)
-		configuration_save_session_files(config);
+	configuration_save_session_files(config);
 	build_save_menu(config, (gpointer)p, GEANY_BCS_PROJ);
 	g_signal_emit_by_name(geany_object, "project-save", config);
 	/* write the file */


Modified: src/project.h
1 lines changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -55,7 +55,6 @@ void project_write_config(void);
 typedef struct ProjectPrefs
 {
 	gchar *session_file;
-	gboolean project_session;
 	gboolean project_file_in_basedir;
 } ProjectPrefs;
 


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