SF.net SVN: geany: [857] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Sun Oct 1 16:14:52 UTC 2006


Revision: 857
          http://svn.sourceforge.net/geany/?rev=857&view=rev
Author:   ntrel
Date:     2006-10-01 09:14:45 -0700 (Sun, 01 Oct 2006)

Log Message:
-----------
Save the build includes and arguments on quitting.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/TODO
    trunk/src/callbacks.c
    trunk/src/filetypes.c
    trunk/src/filetypes.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-09-30 16:15:45 UTC (rev 856)
+++ trunk/ChangeLog	2006-10-01 16:14:45 UTC (rev 857)
@@ -1,3 +1,9 @@
+2006-10-01  Nick Treleaven  <nick.treleaven at btinternet.com>
+
+ * src/callbacks.c, src/filetypes.c, src/filetypes.h, TODO:
+   Save the build includes and arguments on quitting.
+
+
 2006-09-30  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/highlighting.c, src/highlighting.h:

Modified: trunk/TODO
===================================================================
--- trunk/TODO	2006-09-30 16:15:45 UTC (rev 856)
+++ trunk/TODO	2006-10-01 16:14:45 UTC (rev 857)
@@ -3,7 +3,7 @@
 (features included in () have lower priority)
 
 
-	Geany 0.8 or later:
+	Next version or later:
 
 	o fix problems when loading global.tags and other tags files are
 	  already loaded
@@ -11,7 +11,6 @@
 	o documentation: list and explain filetype modes
 	o documentation: preferences
 	o user-definable auto completion structs
-	o save build includes & arguments (->project management)
 	o don't override Scintilla keybindings by default
 	o allow use of custom global tags files
 	o common default highlighting all in one config file
@@ -19,6 +18,5 @@
 	o (DBUS)
 	o (startup notification)
 	o (indent wrapped lines  - Scintilla issue)
-	o (inverting highlighting by selection - Scintilla issue)
 	o (folder tree in the sidebar)
 	o (improved Windows support)

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2006-09-30 16:15:45 UTC (rev 856)
+++ trunk/src/callbacks.c	2006-10-01 16:14:45 UTC (rev 857)
@@ -161,7 +161,11 @@
 on_exit_clicked                        (GtkWidget *widget, gpointer gdata)
 {
 	app->quitting = TRUE;
+
+	// TODO: only save config if definitely quitting
 	configuration_save();
+	filetypes_save_commands();
+
 	if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(app->notebook)) > 0)
 	{
 		gint i;
@@ -2258,23 +2262,41 @@
 	
 	if (response == GTK_RESPONSE_ACCEPT)
 	{
+		const gchar *newstr;
+		struct build_programs *programs = ft->programs;
+
 		if (ft->menu_items->can_compile)
 		{
-			if (ft->programs->compiler) g_free(ft->programs->compiler);
-			ft->programs->compiler = g_strdup(gtk_entry_get_text(
-					GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry1"))));
+			newstr = gtk_entry_get_text(
+					GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry1")));
+			if (! utils_strcmp(newstr, programs->compiler))
+			{
+				if (programs->compiler) g_free(programs->compiler);
+				programs->compiler = g_strdup(newstr);
+				programs->modified = TRUE;
+			}
 		}
 		if (ft->menu_items->can_link)
 		{
-			if (ft->programs->linker) g_free(ft->programs->linker);
-			ft->programs->linker = g_strdup(gtk_entry_get_text(
-					GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry2"))));
+			newstr = gtk_entry_get_text(
+					GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry2")));
+			if (! utils_strcmp(newstr, programs->linker))
+			{
+				if (programs->linker) g_free(programs->linker);
+				programs->linker = g_strdup(newstr);
+				programs->modified = TRUE;
+			}
 		}
 		if (ft->menu_items->can_exec)
 		{
-			if (ft->programs->run_cmd) g_free(ft->programs->run_cmd);
-			ft->programs->run_cmd = g_strdup(gtk_entry_get_text(
-					GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry3"))));
+			newstr = gtk_entry_get_text(
+					GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry3")));
+			if (! utils_strcmp(newstr, programs->run_cmd))
+			{
+				if (programs->run_cmd) g_free(programs->run_cmd);
+				programs->run_cmd = g_strdup(newstr);
+				programs->modified = TRUE;
+			}
 		}
 	}
 }
@@ -2290,18 +2312,41 @@
 
 	if (response == GTK_RESPONSE_ACCEPT)
 	{
-		if (ft->programs->compiler) g_free(ft->programs->compiler);
-		ft->programs->compiler = g_strdup(gtk_entry_get_text(
-				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry1"))));
-		if (ft->programs->linker) g_free(ft->programs->linker);
-		ft->programs->linker = g_strdup(gtk_entry_get_text(
-				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry2"))));
-		if (ft->programs->run_cmd) g_free(ft->programs->run_cmd);
-		ft->programs->run_cmd = g_strdup(gtk_entry_get_text(
-				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry3"))));
-		if (ft->programs->run_cmd2) g_free(ft->programs->run_cmd2);
-		ft->programs->run_cmd2 = g_strdup(gtk_entry_get_text(
-				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry4"))));
+		const gchar *newstr;
+		struct build_programs *programs = ft->programs;
+
+		newstr = gtk_entry_get_text(
+				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry1")));
+		if (! utils_strcmp(newstr, programs->compiler))
+		{
+			if (programs->compiler) g_free(programs->compiler);
+			programs->compiler = g_strdup(newstr);
+			programs->modified = TRUE;
+		}
+		newstr = gtk_entry_get_text(
+				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry2")));
+		if (! utils_strcmp(newstr, programs->linker))
+		{
+			if (programs->linker) g_free(programs->linker);
+			programs->linker = g_strdup(newstr);
+			programs->modified = TRUE;
+		}
+		newstr = gtk_entry_get_text(
+				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry3")));
+		if (! utils_strcmp(newstr, programs->run_cmd))
+		{
+			if (programs->run_cmd) g_free(programs->run_cmd);
+			programs->run_cmd = g_strdup(newstr);
+			programs->modified = TRUE;
+		}
+		newstr = gtk_entry_get_text(
+				GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "tex_entry4")));
+		if (! utils_strcmp(newstr, programs->run_cmd2))
+		{
+			if (programs->run_cmd2) g_free(programs->run_cmd2);
+			programs->run_cmd2 = g_strdup(newstr);
+			programs->modified = TRUE;
+		}
 	}
 	gtk_widget_destroy(GTK_WIDGET(dialog));
 }

Modified: trunk/src/filetypes.c
===================================================================
--- trunk/src/filetypes.c	2006-09-30 16:15:45 UTC (rev 856)
+++ trunk/src/filetypes.c	2006-10-01 16:14:45 UTC (rev 857)
@@ -30,6 +30,7 @@
 #include "callbacks.h"
 #include "templates.h"
 #include "msgwindow.h"
+#include "utils.h"
 
 
 /* This is the order of unique ids used in the config file.
@@ -683,7 +684,7 @@
 }
 
 
-/* convenient function to save code size */
+/* convenience function - NULLs and zeros struct members */
 static void filetypes_init_build_programs(filetype *ftype)
 {
 	ftype->programs = g_new0(struct build_programs, 1);
@@ -911,6 +912,62 @@
 }
 
 
+static gchar *get_conf_extension(gint filetype_idx)
+{
+	gchar *result, *tmp = g_strdup(filetypes[filetype_idx]->name);
+
+	switch (filetype_idx)
+	{
+		case GEANY_FILETYPES_CPP: result = g_strdup("cpp"); break;
+		case GEANY_FILETYPES_MAKE: result = g_strdup("makefile"); break;
+		case GEANY_FILETYPES_OMS: result = g_strdup("oms"); break;
+		default: result = g_ascii_strdown(tmp, -1); break;
+	}
+	g_free(tmp);
+	return result;
+}
+
+
+void filetypes_save_commands()
+{
+	gchar *conf_prefix = g_strconcat(app->configdir,
+		G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", NULL);
+	gint i;
+
+	for (i = 0; i < GEANY_FILETYPES_ALL; i++)
+	{
+		struct build_programs *bp = filetypes[i]->programs;
+		GKeyFile *config_home;
+		gchar *fname, *ext, *data;
+
+		if (! bp->modified) continue;
+		
+		ext = get_conf_extension(i);
+		fname = g_strconcat(conf_prefix, ext, NULL);
+		g_free(ext);
+
+		config_home = g_key_file_new();
+		g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
+
+		if (bp->compiler && *bp->compiler)
+			g_key_file_set_string(config_home, "build_settings", "compiler", bp->compiler);
+		if (bp->linker && *bp->linker)
+			g_key_file_set_string(config_home, "build_settings", "linker", bp->linker);
+		if (bp->run_cmd && *bp->run_cmd)
+			g_key_file_set_string(config_home, "build_settings", "run_cmd", bp->run_cmd);
+		if (bp->run_cmd2 && *bp->run_cmd2)
+			g_key_file_set_string(config_home, "build_settings", "run_cmd2", bp->run_cmd2);
+
+		data = g_key_file_to_data(config_home, NULL, NULL);
+		utils_write_file(fname, data);
+		g_free(data);
+		g_key_file_free(config_home);
+		g_free(fname);
+	}
+	g_free(conf_prefix);
+}
+
+
 GtkFileFilter *filetypes_create_file_filter(filetype *ft)
 {
 	GtkFileFilter *new_filter;

Modified: trunk/src/filetypes.h
===================================================================
--- trunk/src/filetypes.h	2006-09-30 16:15:45 UTC (rev 856)
+++ trunk/src/filetypes.h	2006-10-01 16:14:45 UTC (rev 857)
@@ -59,7 +59,7 @@
 	GEANY_FILETYPES_OMS,
 	GEANY_FILETYPES_DIFF,
 	GEANY_FILETYPES_CONF,
-	GEANY_FILETYPES_ALL,
+	GEANY_FILETYPES_ALL,	// must be last filetype
 	GEANY_MAX_FILE_TYPES
 };
 
@@ -81,6 +81,7 @@
 	gchar *linker;
 	gchar *run_cmd;
 	gchar *run_cmd2;
+	gboolean modified;
 };
 
 typedef struct filetype
@@ -123,6 +124,8 @@
 
 void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft);
 
+void filetypes_save_commands();
+
 void filetypes_select_radio_item(const filetype *ft);
 
 GtkFileFilter *filetypes_create_file_filter(filetype *ft);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list