SF.net SVN: geany-plugins:[2217] trunk/geany-plugins/debugger/src

cesspit at users.sourceforge.net cesspit at xxxxx
Thu Sep 29 11:05:33 UTC 2011


Revision: 2217
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2217&view=rev
Author:   cesspit
Date:     2011-09-29 11:05:32 +0000 (Thu, 29 Sep 2011)
Log Message:
-----------
debugger: debug session is stored in a debugger config, added option to store debug session in a project file

Modified Paths:
--------------
    trunk/geany-plugins/debugger/src/Makefile.am
    trunk/geany-plugins/debugger/src/breakpoints.c
    trunk/geany-plugins/debugger/src/btnpanel.c
    trunk/geany-plugins/debugger/src/btnpanel.h
    trunk/geany-plugins/debugger/src/callbacks.c
    trunk/geany-plugins/debugger/src/callbacks.h
    trunk/geany-plugins/debugger/src/dconfig.c
    trunk/geany-plugins/debugger/src/dconfig.h
    trunk/geany-plugins/debugger/src/debug.c
    trunk/geany-plugins/debugger/src/debug.h
    trunk/geany-plugins/debugger/src/dpaned.c
    trunk/geany-plugins/debugger/src/dpaned.h
    trunk/geany-plugins/debugger/src/envtree.c
    trunk/geany-plugins/debugger/src/plugin.c
    trunk/geany-plugins/debugger/src/tpage.c

Removed Paths:
-------------
    trunk/geany-plugins/debugger/src/pconfig.c
    trunk/geany-plugins/debugger/src/pconfig.h

Modified: trunk/geany-plugins/debugger/src/Makefile.am
===================================================================
--- trunk/geany-plugins/debugger/src/Makefile.am	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/Makefile.am	2011-09-29 11:05:32 UTC (rev 2217)
@@ -25,8 +25,8 @@
 	calltip.c     \
 	calltip.h     \
 	dbm_gdb.c     \
-	dconfig.h     \
 	dconfig.c     \
+	dconfig.h     \
 	debug.c     \
 	debug.h     \
 	debug_module.c     \
@@ -45,8 +45,6 @@
 	markers.h     \
 	pixbuf.c     \
 	pixbuf.h     \
-	pconfig.c     \
-	pconfig.h     \
 	plugin.c     \
 	stree.c     \
 	stree.h     \

Modified: trunk/geany-plugins/debugger/src/breakpoints.c
===================================================================
--- trunk/geany-plugins/debugger/src/breakpoints.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/breakpoints.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -185,7 +185,7 @@
 		/* add markers, update treeview */
 		on_add(bp);
 		/* mark config for saving */
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	else
 		dialogs_show_msgbox(GTK_MESSAGE_ERROR, "%s", debug_error_message());
@@ -197,7 +197,7 @@
 		/* remove markers, update treeview */
 		on_remove(bp);
 		/* mark config for saving */
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	else
 		dialogs_show_msgbox(GTK_MESSAGE_ERROR, "%s", debug_error_message());
@@ -208,7 +208,7 @@
 	{
 		on_set_hits_count(bp);
 		/* mark config for saving */
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	else
 		dialogs_show_msgbox(GTK_MESSAGE_ERROR, "%s", debug_error_message());
@@ -219,7 +219,7 @@
 	{
 		on_set_condition(bp);
 		/* mark config for saving */
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	else
 	{
@@ -237,7 +237,7 @@
 	{
 		on_switch(bp);
 		/* mark config for saving */
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	else
 	{
@@ -266,7 +266,7 @@
 	}
 	g_list_free(list);
 
-	dconfig_set_changed(TRUE);
+	config_set_debug_changed();
 }
 static void breaks_set_enabled_list_debug(GList *list)
 {
@@ -289,7 +289,7 @@
 	}
 	g_list_free(list);
 
-	dconfig_set_changed(TRUE);
+	config_set_debug_changed();
 }
 static void breaks_remove_list_debug(GList *list)
 {
@@ -304,7 +304,7 @@
 	}
 	g_list_free(list);
 
-	dconfig_set_changed(TRUE);
+	config_set_debug_changed();
 }
 
 /*
@@ -386,7 +386,7 @@
 	if (DBS_IDLE == state)
 	{
 		on_add(bp);
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if (DBS_STOPPED == state)
 		breaks_add_debug(bp);
@@ -418,7 +418,7 @@
 	if (DBS_IDLE == state)
 	{
 		on_remove(bp);
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if (DBS_STOPPED == state)
 		breaks_remove_debug(bp);
@@ -446,7 +446,7 @@
 		on_remove_list(list);
 		g_list_free(list);
 		
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if (DBS_STOPPED == state)
 		breaks_remove_list_debug(list);
@@ -486,7 +486,7 @@
 	{
 		on_set_enabled_list(breaks, enabled);
 		g_list_free(breaks);
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if (DBS_STOPPED == state)
 		enabled ? breaks_set_enabled_list_debug(breaks) : breaks_set_disabled_list_debug(breaks);
@@ -521,7 +521,7 @@
 	if (DBS_IDLE == state)
 	{
 		on_switch(bp);
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if (DBS_STOPPED == state)
 		breaks_switch_debug(bp);
@@ -557,7 +557,7 @@
 	if (state == DBS_IDLE)
 	{
 		on_set_hits_count(bp);
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if(state == DBS_STOPPED)
 		breaks_set_hits_count_debug(bp);
@@ -593,7 +593,7 @@
 	if (state == DBS_IDLE)
 	{
 		on_set_condition(bp);
-		dconfig_set_changed(TRUE);
+		config_set_debug_changed();
 	}
 	else if (state == DBS_STOPPED)
 		breaks_set_condition_debug(bp);
@@ -623,7 +623,7 @@
 			g_tree_insert(tree, GINT_TO_POINTER(line_to), bp);
 
 			/* mark config for saving */
-			dconfig_set_changed();
+			config_set_debug_changed();
 		}
 	}
 }

Modified: trunk/geany-plugins/debugger/src/btnpanel.c
===================================================================
--- trunk/geany-plugins/debugger/src/btnpanel.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/btnpanel.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -40,10 +40,7 @@
 #include "btnpanel.h"
 
 #define CP_BUTTONS_PAD 5
-#define CONFIG_NAME ".debugger"
 
-static GtkWidget *loadbtn = NULL;
-
 static GtkWidget *runbtn = NULL;
 static GtkWidget *restartbtn = NULL;
 static GtkWidget *stopbtn = NULL;
@@ -56,45 +53,7 @@
 static GtkWidget *tabbtn = NULL;
 static GtkWidget *optbtn = NULL;
 
-static gboolean debugging = FALSE;
-
 /*
- * load config button handler
- */
-void on_config_load(GtkButton *button, gpointer user_data)
-{
-	GeanyDocument *doc = document_get_current();
-	if (!doc && !doc->real_path)
-	{
-		dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Error reading config file"));
-	}
-	else
-	{
-		gchar *folder = g_path_get_dirname(DOC_FILENAME(doc));
-		if (!dconfig_load(folder))
-		{
-			dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Error reading config file"));
-		}
-		g_free(folder);
-	}
-}
-
-/*
- * clear config values button handler
- */
-void on_config_clear(GtkButton *button, gpointer user_data)
-{
-	/* target page */
-	tpage_clear();
-
-	/* breakpoints */
-	breaks_remove_all();
-
-	/* watches */
-	wtree_remove_all();
-}
-
-/*
  * calls settings dialog
  */
 void on_settings(GtkButton *button, gpointer user_data)
@@ -121,7 +80,6 @@
 GtkWidget* btnpanel_create(on_toggle cb)
 {
 	GtkWidget *vbox = gtk_vbox_new(FALSE, CP_BUTTONS_PAD);
-	gtk_container_set_border_width (GTK_CONTAINER (vbox), 7);
 
 	GtkWidget *hbutton_box = gtk_hbox_new(FALSE, CP_BUTTONS_PAD);
 
@@ -167,78 +125,25 @@
 	gtk_box_pack_start(GTK_BOX(hbutton_box), runcursorbtn, FALSE, TRUE, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), hbutton_box, FALSE, TRUE, 0);
 
-	GtkWidget *vbox_panels_buttons = gtk_vbox_new(FALSE, 0);
-	GtkWidget *vbutton_box = gtk_vbox_new(TRUE, CP_BUTTONS_PAD);
+	optbtn = create_stock_button(GTK_STOCK_PREFERENCES, _("Settings"));
+	g_signal_connect(G_OBJECT(optbtn), "clicked", G_CALLBACK (on_settings), NULL);
+	gtk_box_pack_end(GTK_BOX(vbox), optbtn, FALSE, FALSE, 0);
 
-	loadbtn = create_stock_button(GTK_STOCK_OPEN, _("Load settings"));
-	g_signal_connect(G_OBJECT(loadbtn), "clicked", G_CALLBACK (on_config_load), (gpointer)TRUE);
-	gtk_box_pack_start(GTK_BOX(vbutton_box), loadbtn, FALSE, TRUE, 0);
-
-	gtk_box_pack_start(GTK_BOX(vbox_panels_buttons), vbutton_box, TRUE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), vbox_panels_buttons, TRUE, FALSE, 0);
-
-	vbutton_box = gtk_vbox_new(TRUE, CP_BUTTONS_PAD);
-	tabbtn = create_toggle_button("tabs.gif", _("Tabs"));
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tabbtn), dpaned_get_tabbed());
+	tabbtn = create_toggle_button("tabs.gif", _("Two panel mode"));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tabbtn), config_get_tabbed());
 	g_signal_connect(G_OBJECT(tabbtn), "toggled", G_CALLBACK(cb), NULL);
-	gtk_box_pack_start(GTK_BOX(vbox), tabbtn, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(vbox), tabbtn, FALSE, FALSE, 0);
 
-	optbtn = create_stock_button(GTK_STOCK_PREFERENCES, "Настройки");
-	g_signal_connect(G_OBJECT(optbtn), "clicked", G_CALLBACK (on_settings), NULL);
-	gtk_box_pack_start(GTK_BOX(vbox), optbtn, FALSE, FALSE, 0);
-
 	btnpanel_set_debug_state(DBS_IDLE);
 
 	return vbox;
 }
 
 /*
- * disable load/save config buttons on document close
- */
-void btnpanel_on_document_close()
-{
-	gtk_widget_set_sensitive(loadbtn, FALSE);
-}
-
-/*
- * enable load/save config buttons on document activate
- * if page is not readonly and have config
- */
-void btnpanel_on_document_activate(GeanyDocument *doc)
-{
-	if (debugging)
-		return;
-	
-	if (!doc || !doc->real_path)
-	{
-		btnpanel_on_document_close();
-		return;
-	}
-
-	gchar *dirname = g_path_get_dirname(DOC_FILENAME(doc));
-	gchar *config = g_build_path(G_DIR_SEPARATOR_S, dirname, CONFIG_NAME, NULL);
-	struct stat st;
-	gtk_widget_set_sensitive(loadbtn, !stat(config, &st));
-	
-	g_free(config);
-}
-
-/*
- * set buttons sensitive based on whether it is a config file
- * in the current folder
- */
-void btnpanel_set_have_config(gboolean haveconfig)
-{
-	gtk_widget_set_sensitive(loadbtn, haveconfig);
-}
-
-/*
  * set buttons sensitive based on debugger state
  */
 void btnpanel_set_debug_state(enum dbs state)
 {
-	debugging = (DBS_IDLE != state);
-
 	if (DBS_STOPPED == state)
 	{
 		set_button_image(runbtn, "continue.png");
@@ -258,13 +163,4 @@
 	gtk_widget_set_sensitive(stepinbtn, DBS_STOPPED == state);
 	gtk_widget_set_sensitive(stepoutbtn, DBS_STOPPED == state);
 	gtk_widget_set_sensitive(runcursorbtn, DBS_STOPPED == state);
-
-	if (DBS_IDLE == state)
-	{
-		btnpanel_on_document_activate(document_get_current());
-	}
-	else
-	{
-		gtk_widget_set_sensitive(loadbtn, FALSE);
-	}
 }

Modified: trunk/geany-plugins/debugger/src/btnpanel.h
===================================================================
--- trunk/geany-plugins/debugger/src/btnpanel.h	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/btnpanel.h	2011-09-29 11:05:32 UTC (rev 2217)
@@ -22,8 +22,4 @@
 typedef void (*on_toggle)(GtkToggleButton *button, gpointer user_data);
 
 GtkWidget*		btnpanel_create(on_toggle cb);
-void 			btnpanel_on_document_close();
-void			btnpanel_on_document_activate(GeanyDocument *doc);
-
-void			btnpanel_set_have_config(gboolean haveconfig);
 void			btnpanel_set_debug_state(enum dbs state);

Modified: trunk/geany-plugins/debugger/src/callbacks.c
===================================================================
--- trunk/geany-plugins/debugger/src/callbacks.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/callbacks.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -108,14 +108,6 @@
 }
 
 /*
- * 	Occures on closing document
- */
-void on_document_close(GObject *obj, GeanyDocument *doc, gpointer user_data)
-{
-	btnpanel_on_document_close();
-}
-
-/*
  * 	Occures on saving document
  */
 void on_document_save(GObject *obj, GeanyDocument *doc, gpointer user_data)
@@ -134,8 +126,6 @@
 		
 		_unexisting_file = FALSE;
 	}
-
-	btnpanel_on_document_activate(doc);
 }
 
 /*
@@ -146,14 +136,6 @@
 }
 
 /*
- * 	Occures on document activating
- */
-void on_document_activate(GObject *obj, GeanyDocument *doc, gpointer user_data)
-{
-	btnpanel_on_document_activate(doc);
-}
-
-/*
  * 	Occures on document opening.
  * 	Used to set breaks markers 
  */
@@ -172,11 +154,6 @@
 	/* set breakpoint and frame markers */
 	set_markers_for_file(file);
 
-	/* check if current path contains config file */
-	gchar *folder = g_path_get_dirname(DOC_FILENAME(doc));
-	btnpanel_set_have_config(dconfig_is_found_at(folder));
-	g_free(folder);
-
 	/* if debug is active - tell the debug module that a file was opened */
 	if (DBS_IDLE != debug_get_state())
 		debug_on_file_open(doc);
@@ -286,7 +263,7 @@
 						iter = iter->next;
 					}
 					
-					dconfig_set_changed();
+					config_set_debug_changed();
 
 					g_list_free(breaks);
 				}

Modified: trunk/geany-plugins/debugger/src/callbacks.h
===================================================================
--- trunk/geany-plugins/debugger/src/callbacks.h	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/callbacks.h	2011-09-29 11:05:32 UTC (rev 2217)
@@ -20,8 +20,6 @@
  */
 
 void on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_data);
-void on_document_activate(GObject *obj, GeanyDocument *doc, gpointer user_data);
-void on_document_close(GObject *obj, GeanyDocument *doc, gpointer user_data);
 void on_document_save(GObject *obj, GeanyDocument *doc, gpointer user_data);
 void on_document_before_save(GObject *obj, GeanyDocument *doc, gpointer user_data);
 void on_document_new(GObject *obj, GeanyDocument *doc, gpointer user_data);

Modified: trunk/geany-plugins/debugger/src/dconfig.c
===================================================================
--- trunk/geany-plugins/debugger/src/dconfig.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/dconfig.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -2,7 +2,7 @@
  *
  *		dconfig.c
  *      
- *      Copyright 2010 Alexander Petukhov <devel(at)apetukhov.ru>
+ *      Copyright 2011 Alexander Petukhov <devel(at)apetukhov.ru>
  *      
  *      This program is free software; you can redistribute it and/or modify
  *      it under the terms of the GNU General Public License as published by
@@ -20,18 +20,20 @@
  *      MA 02110-1301, USA.
  */
 
- /*
- *		Working with debugger configs.
+/*
+ *		Plugin panel and debug session configs
  */
-
+ 
+#include <unistd.h>
 #include <sys/stat.h>
-#include <memory.h>
 
+#include <glib/gstdio.h>
+
 #include "geanyplugin.h"
-extern GeanyFunctions	*geany_functions;
-extern GeanyPlugin		*geany_plugin;
+extern GeanyData *geany_data;
 
 #include "dconfig.h"
+#include "tabs.h"
 #include "breakpoints.h"
 #include "debug.h"
 #include "watch_model.h"
@@ -39,52 +41,233 @@
 #include "tpage.h"
 #include "bptree.h"
 
-#define CONFIG_NAME ".debugger"
+/* keyfile debug group name */
+#define DEBUGGER_GROUP "debugger"
+/* saving interval */
+#define SAVING_INTERVAL 2000000
 
-/* config file markers */
-#define ENVIRONMENT_MARKER	"[ENV]"
-#define BREAKPOINTS_MARKER	"[BREAK]"
-#define WATCH_MARKER		"[WATCH]"
+/* check button for a configure dialog */
+static GtkWidget *save_to_project_btn = NULL;
 
-/* maximus config file line length */
-#define MAXLINE 1000
+/* plugin config file path */
+static gchar *plugin_config_path = NULL;
 
-/* saving interval */
-#define SAVING_INTERVAL 2000000
+/* current debug session store */
+static debug_store dstore = DEBUG_STORE_PLUGIN;
 
+/* GKeyFile's for a project and plugin config */
+static GKeyFile *keyfile_plugin = NULL;
+static GKeyFile *keyfile_project = NULL;
+
+/* flag that indicates that debug session is being loaded to controls
+ * to prevent change state to modified from GUI callbacks */
+static gboolean debug_config_loading = FALSE;
+
 /* saving thread staff */
 static GMutex *change_config_mutex;
 static GCond *cond;
 static GThread *saving_thread;
-static gboolean config_changed = FALSE;
-static gboolean modifyable = FALSE;
 
-/* the folder, config has been loaded from */
-static gchar *current_folder = NULL;
+/* flags that indicate that part of a config has been changed and
+ * is going to be saved on the savng thread */
+static gboolean debug_config_changed = FALSE;
+static gboolean panel_config_changed = FALSE;
 
-/* forward declaration */
-gboolean	dconfig_save(gchar *folder);
+/*
+ *	creates a copy of a specified keyfile
+ */
+GKeyFile *create_copy_keyfile(GKeyFile *keyfile)
+{
+	gchar *path;
+	close(g_file_open_tmp(NULL, &path, NULL));
+	
+	gchar *config_data = g_key_file_to_data(keyfile, NULL, NULL);
+	g_file_set_contents(path, config_data, -1, NULL);
+	g_free(config_data);
+	
+	GKeyFile *copy = g_key_file_new();
+	g_key_file_load_from_file(copy, path, G_KEY_FILE_NONE, NULL);
 
+	g_remove(path);
+	g_free(path);
+
+	return copy;
+}
+
 /*
- * reads line from a file
+ * loads debug session from a keyfile and updates GUI 
  */
-int readline(FILE *file, gchar *buffer, int buffersize)
+void debug_load_from_keyfile(GKeyFile *keyfile)
 {
-	gchar c;
-	int read_count = 0;
-	while (buffersize && fread(&c, 1, 1, file) && '\n' != c)
+	debug_config_loading = TRUE;
+	
+	gchar *value;
+	/* target */
+	tpage_set_target(value = g_key_file_get_string(keyfile, DEBUGGER_GROUP, "target", NULL));
+	g_free(value);
+	/* debugger */
+	tpage_set_debugger(value = g_key_file_get_string(keyfile, DEBUGGER_GROUP, "debugger", NULL));
+	g_free(value);
+	/* arguments */
+	tpage_set_commandline(value = g_key_file_get_string(keyfile, DEBUGGER_GROUP, "arguments", NULL));
+	g_free(value);
+
+	int i;
+
+	/* environment */
+	int envcount = g_key_file_get_integer(keyfile, DEBUGGER_GROUP, "envvar_count", NULL);
+	for (i = 0; i < envcount; i++)
 	{
-		buffer[read_count++] = c;
-		buffersize--;
+		gchar *env_name_id = g_strdup_printf("envvar_%i_name", i);
+		gchar *env_value_id = g_strdup_printf("envvar_%i_value", i);
+
+		gchar *name = g_key_file_get_string(keyfile, DEBUGGER_GROUP, env_name_id, NULL);
+		value = g_key_file_get_string(keyfile, DEBUGGER_GROUP, env_value_id, NULL);
+
+		tpage_add_environment(name, value);
+
+		g_free(name);
+		g_free(value);
+
+		g_free(env_name_id);
+		g_free(env_value_id);
 	}
-	buffer[read_count] = '\0';
 
-	return read_count;
+	/* watches */
+	int wcount = g_key_file_get_integer(keyfile, DEBUGGER_GROUP, "watches_count", NULL);
+	for (i = 0; i < wcount; i++)
+	{
+		gchar *watch_id = g_strdup_printf("watch_%i", i);
+		wtree_add_watch(value = g_key_file_get_string(keyfile, DEBUGGER_GROUP, watch_id, NULL));
+		g_free(value);
+		g_free(watch_id);
+	}
+
+	/* breakpoints */
+	int bcount = g_key_file_get_integer(keyfile, DEBUGGER_GROUP, "breaks_count", NULL);
+	for (i = 0; i < bcount; i++)
+	{
+		gchar *break_file_id = g_strdup_printf("break_%i_file", i);
+		gchar *break_line_id = g_strdup_printf("break_%i_line", i);
+		gchar *break_condition_id = g_strdup_printf("break_%i_condition", i);
+		gchar *break_hits_id = g_strdup_printf("break_%i_hits_count", i);
+		gchar *break_enabled_id = g_strdup_printf("break_%i_enabled", i);
+		
+		gchar *file = g_key_file_get_string(keyfile, DEBUGGER_GROUP, break_file_id, NULL);
+		int line = g_key_file_get_integer(keyfile, DEBUGGER_GROUP, break_line_id, NULL);
+		gchar *condition = g_key_file_get_string(keyfile, DEBUGGER_GROUP, break_condition_id, NULL);
+		int hits_count = g_key_file_get_integer(keyfile, DEBUGGER_GROUP, break_hits_id, NULL);
+		gboolean enabled = g_key_file_get_boolean(keyfile, DEBUGGER_GROUP, break_enabled_id, NULL);
+		
+		breaks_add(file, line, condition, enabled, hits_count);
+
+		g_free(break_file_id);
+		g_free(break_line_id);
+		g_free(break_condition_id);
+		g_free(break_hits_id);
+		g_free(break_enabled_id);
+		
+		g_free(file);
+		g_free(condition);
+	}
+	bptree_update_file_nodes();
+
+	debug_config_loading = FALSE;
 }
 
 /*
- * function for a config file background saving if changed 
+ * saves debug session to a keyfile using values from GUI 
  */
+void save_to_keyfile(GKeyFile *keyfile)
+{
+	g_key_file_remove_group(keyfile, DEBUGGER_GROUP, NULL);
+	
+	g_key_file_set_string(keyfile, DEBUGGER_GROUP, "target", tpage_get_target());
+	g_key_file_set_string(keyfile, DEBUGGER_GROUP, "debugger", tpage_get_debugger());
+	g_key_file_set_string(keyfile, DEBUGGER_GROUP, "arguments", tpage_get_commandline());
+	
+	/* environment */
+	GList *_env = tpage_get_environment();
+	g_key_file_set_integer(keyfile, DEBUGGER_GROUP, "envvar_count", g_list_length(_env) / 2);
+	GList *iter = _env;
+	int env_index = 0;
+	while(iter)
+	{
+		gchar *name = (gchar*)iter->data;
+		iter = iter->next;
+		gchar *value = (gchar*)iter->data;
+
+		gchar *env_name_id = g_strdup_printf("envvar_%i_name", env_index);
+		gchar *env_value_id = g_strdup_printf("envvar_%i_value", env_index);
+		
+		g_key_file_set_string(keyfile, DEBUGGER_GROUP, env_name_id, name);
+		g_key_file_set_string(keyfile, DEBUGGER_GROUP, env_value_id, value);
+
+		g_free(env_name_id);
+		g_free(env_value_id);
+
+		env_index++;
+		iter = iter->next;
+	}
+	g_list_foreach(_env, (GFunc)g_free, NULL);
+	g_list_free(_env);
+	
+	/* watches */
+	GList *watches = wtree_get_watches();
+	g_key_file_set_integer(keyfile, DEBUGGER_GROUP, "watches_count", g_list_length(watches));
+	int watch_index = 0;
+	GList *biter = watches;
+	while (biter)
+	{
+		gchar *watch = (gchar*)biter->data;
+		gchar *watch_id = g_strdup_printf("watch_%i", watch_index);
+		
+		g_key_file_set_string(keyfile, DEBUGGER_GROUP, watch_id, watch);
+
+		g_free(watch_id);
+
+		watch_index++;
+		biter = biter->next;
+	}
+	g_list_foreach(watches, (GFunc)g_free, NULL);
+	g_list_free(watches);
+
+	/* breakpoints */
+	GList *_breaks = breaks_get_all();
+	g_key_file_set_integer(keyfile, DEBUGGER_GROUP, "breaks_count", g_list_length(_breaks));
+	int bp_index = 0;
+	biter = _breaks;
+	while (biter)
+	{
+		breakpoint *bp = (breakpoint*)biter->data;
+		
+		gchar *break_file_id = g_strdup_printf("break_%i_file", bp_index);
+		gchar *break_line_id = g_strdup_printf("break_%i_line", bp_index);
+		gchar *break_condition_id = g_strdup_printf("break_%i_condition", bp_index);
+		gchar *break_hits_id = g_strdup_printf("break_%i_hits_count", bp_index);
+		gchar *break_enabled_id = g_strdup_printf("break_%i_enabled", bp_index);
+		
+		g_key_file_set_string(keyfile, DEBUGGER_GROUP, break_file_id, bp->file);
+		g_key_file_set_integer(keyfile, DEBUGGER_GROUP, break_line_id, bp->line);
+		g_key_file_set_string(keyfile, DEBUGGER_GROUP, break_condition_id, bp->condition);
+		g_key_file_set_integer(keyfile, DEBUGGER_GROUP, break_hits_id, bp->hitscount);
+		g_key_file_set_boolean(keyfile, DEBUGGER_GROUP, break_enabled_id, bp->enabled);
+		
+		g_free(break_file_id);
+		g_free(break_line_id);
+		g_free(break_condition_id);
+		g_free(break_hits_id);
+		g_free(break_enabled_id);
+				
+		bp_index++;
+		biter = biter->next;
+	}
+	g_list_free(_breaks);
+}
+
+/*
+ * function for config files background saving
+ */
 static gpointer saving_thread_func(gpointer data)
 {
 	GTimeVal interval;
@@ -92,11 +275,38 @@
 	do
 	{
 		g_mutex_lock(change_config_mutex);
-		if (config_changed && current_folder)
+		
+		if (
+			panel_config_changed ||
+			(debug_config_changed && DEBUG_STORE_PLUGIN == dstore)
+		)
 		{
-			dconfig_save(current_folder);
-			config_changed = FALSE;
+			/* if all saving is going to be done to a plugin keyfile */
+			if (debug_config_changed)
+			{
+				save_to_keyfile(keyfile_plugin);
+				debug_config_changed = FALSE;
+			}
+			
+			gchar *config_data = g_key_file_to_data(keyfile_plugin, NULL, NULL);
+			g_file_set_contents(plugin_config_path, config_data, -1, NULL);
+			g_free(config_data);
+
+			panel_config_changed = FALSE;
 		}
+		
+		if (debug_config_changed && DEBUG_STORE_PROJECT == dstore)
+		{
+			/* if debug is saved into a project and has been changed */
+			save_to_keyfile(keyfile_project);
+
+			gchar *config_data = g_key_file_to_data(keyfile_project, NULL, NULL);
+			g_file_set_contents(geany_data->app->project->file_name, config_data, -1, NULL);
+			g_free(config_data);
+		
+			debug_config_changed = FALSE;
+		}
+		
 		g_mutex_unlock(change_config_mutex);
 
 		g_get_current_time(&interval);
@@ -109,249 +319,357 @@
 }
 
 /*
- * set "changed" flag to save it on "saving_thread" thread
+ * set "debug changed" flag to save it on "saving_thread" thread
  */
-void dconfig_set_changed()
+void config_set_debug_changed()
 {
-	if (!modifyable)
+	if (!debug_config_loading)
 	{
 		g_mutex_lock(change_config_mutex);
-		config_changed = TRUE;
+		debug_config_changed = TRUE;
 		g_mutex_unlock(change_config_mutex);
 	}
 }
 
 /*
- * init config
+ *	set one or several panel config values
  */
-void dconfig_init()
+void config_set_panel(int config_part, gpointer config_value, ...)
 {
+	g_mutex_lock(change_config_mutex);
+	
+	va_list ap;
+	va_start(ap, config_value);
+	
+	while(config_part)
+	{
+		switch (config_part)
+		{
+			case CP_TABBED_MODE:
+			{
+				g_key_file_set_boolean(keyfile_plugin, "tabbed_mode", "enabled", (gboolean)config_value);
+				break;
+			}
+			case CP_OT_TABS:
+			{
+				int *array = (int*)config_value;
+				g_key_file_set_integer_list(keyfile_plugin, "one_panel_mode", "tabs", array + 1, array[0]);
+				break;
+			}
+			case CP_OT_SELECTED:
+			{
+				g_key_file_set_integer(keyfile_plugin, "one_panel_mode", "selected_tab_index", (int)config_value);
+				break;
+			}
+			case CP_TT_LTABS:
+			{
+				int *array = (int*)config_value;
+				g_key_file_set_integer_list(keyfile_plugin, "two_panels_mode", "left_tabs", array + 1, array[0]);
+				break;
+			}
+			case CP_TT_LSELECTED:
+			{
+				g_key_file_set_integer(keyfile_plugin, "two_panels_mode", "left_selected_tab_index", (int)config_value);
+				break;
+			}
+			case CP_TT_RTABS:
+			{
+				int *array = (int*)config_value;
+				g_key_file_set_integer_list(keyfile_plugin, "two_panels_mode", "right_tabs", array + 1, array[0]);
+				break;
+			}
+			case CP_TT_RSELECTED:
+			{
+				g_key_file_set_integer(keyfile_plugin, "two_panels_mode", "right_selected_tab_index", (int)config_value);
+				break;
+			}
+		}
+		
+		config_part = va_arg(ap, int);
+		if (config_part)
+		{
+			config_value = va_arg(ap, gpointer);
+		}
+	}
+	
+	panel_config_changed = TRUE;
+	g_mutex_unlock(change_config_mutex);
+}
+
+/*
+ *	set default debug session values to a keyfile
+ */
+void config_set_debug_defaults(GKeyFile *keyfile)
+{
+	g_key_file_set_string(keyfile, DEBUGGER_GROUP, "target", "");
+	g_key_file_set_string(keyfile, DEBUGGER_GROUP, "debugger", "");
+	g_key_file_set_string(keyfile, DEBUGGER_GROUP, "arguments", "");
+
+	g_key_file_set_integer(keyfile, DEBUGGER_GROUP, "envvar_count", 0);
+	g_key_file_set_integer(keyfile, DEBUGGER_GROUP, "watches_count", 0);
+	g_key_file_set_integer(keyfile, DEBUGGER_GROUP, "breaks_count", 0);
+}
+
+/*
+ *	set default panel config values in a GKeyFile
+ */
+void config_set_panel_defaults(GKeyFile *keyfile)
+{
+	g_key_file_set_boolean(keyfile_plugin, "tabbed_mode", "enabled", FALSE);
+
+	int all_tabs[] = { TID_TARGET, TID_BREAKS, TID_AUTOS, TID_WATCH, TID_STACK, TID_TERMINAL, TID_MESSAGES };
+	g_key_file_set_integer_list(keyfile, "one_panel_mode", "tabs", all_tabs, sizeof(all_tabs) / sizeof(int));
+	g_key_file_set_integer(keyfile, "one_panel_mode", "selected_tab_index", 0);
+
+	int left_tabs[] = { TID_TARGET, TID_BREAKS, TID_AUTOS, TID_WATCH };
+	g_key_file_set_integer_list(keyfile, "two_panels_mode", "left_tabs", left_tabs, sizeof(left_tabs) / sizeof(int));
+	g_key_file_set_integer(keyfile, "two_panels_mode", "left_selected_tab_index", 0);
+	int right_tabs[] = { TID_STACK, TID_TERMINAL, TID_MESSAGES };
+	g_key_file_set_integer_list(keyfile, "two_panels_mode", "right_tabs", right_tabs, sizeof(right_tabs) / sizeof(int));
+	g_key_file_set_integer(keyfile, "two_panels_mode", "right_selected_tab_index", 0);
+
+	g_key_file_set_boolean(keyfile, "saving_settings", "save_to_project", FALSE);
+}
+
+/*
+ *	initialize
+ */
+void config_init()
+{
+	/* read config */
+	gchar *config_dir = g_build_path(G_DIR_SEPARATOR_S, geany_data->app->configdir, "plugins", "debugger", NULL);
+	plugin_config_path = g_build_path(G_DIR_SEPARATOR_S, config_dir, "debugger.conf", NULL);
+	
+	g_mkdir_with_parents(config_dir, S_IRUSR | S_IWUSR | S_IXUSR);
+	g_free(config_dir);
+
+	keyfile_plugin = g_key_file_new();
+	if (!g_key_file_load_from_file(keyfile_plugin, plugin_config_path, G_KEY_FILE_NONE, NULL))
+	{
+		config_set_panel_defaults(keyfile_plugin);
+		gchar *data = g_key_file_to_data(keyfile_plugin, NULL, NULL);
+		g_file_set_contents(plugin_config_path, data, -1, NULL);
+		g_free(data);
+	}
+
 	change_config_mutex = g_mutex_new();
 	cond = g_cond_new();
-
 	saving_thread = g_thread_create(saving_thread_func, NULL, TRUE, NULL);
-}
+}	
 
 /*
- * destroys config
+ *	destroy
  */
-void dconfig_destroy()
+void config_destroy()
 {
 	g_cond_signal(cond);
 	/* ??? g_thread_join(saving_thread); */	
 	
 	g_mutex_free(change_config_mutex);
 	g_cond_free(cond);
+
+	g_free(plugin_config_path);
 	
-	if (current_folder)
+	g_key_file_free(keyfile_plugin);
+	if(keyfile_project)
 	{
-		g_free(current_folder);
-		current_folder = NULL;
+		g_key_file_free(keyfile_project);
 	}
 }
 
 /*
- * checks whether a config file is founs in the folder
+ *	config parts getters
  */
-gboolean dconfig_is_found_at(gchar *folder)
+/* saving option */
+gboolean config_get_save_to_project()
 {
-	gchar *config = g_build_path(G_DIR_SEPARATOR_S, folder, CONFIG_NAME, NULL);
-	gboolean res = g_file_test(config, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR);
-	g_free(config);
-
-	return res;
+	return g_key_file_get_boolean(keyfile_plugin, "saving_settings", "save_to_project", NULL);
 }
+/* panel config */
+gboolean config_get_tabbed()
+{
+	return g_key_file_get_boolean(keyfile_plugin, "tabbed_mode", "enabled", NULL);
+}
+int* config_get_tabs(gsize *length)
+{
+	return g_key_file_get_integer_list(keyfile_plugin, "one_panel_mode", "tabs", length, NULL);
+}
+int config_get_selected_tab_index()
+{
+	return g_key_file_get_integer(keyfile_plugin, "one_panel_mode", "selected_tab_index", NULL);
+}
+int* config_get_left_tabs(gsize *length)
+{
+	return g_key_file_get_integer_list(keyfile_plugin, "two_panels_mode", "left_tabs", length, NULL);
+}
+int config_get_left_selected_tab_index()
+{
+	return g_key_file_get_integer(keyfile_plugin, "two_panels_mode", "left_selected_tab_index", NULL);
+}
+int* config_get_right_tabs(gsize *length)
+{
+	return g_key_file_get_integer_list(keyfile_plugin, "two_panels_mode", "right_tabs", length, NULL);
+}
+int	config_get_right_selected_tab_index()
+{
+	return g_key_file_get_integer(keyfile_plugin, "two_panels_mode", "right_selected_tab_index", NULL);
+}
 
 /*
- * loads config from a folder
+ *	update GUI fron the store specified
+ *  also handles default values insertion in a keyfile if debug section doesn't exist 
  */
-gboolean dconfig_load(gchar *folder)
+void config_set_debug_store(debug_store store)
 {
-	modifyable = TRUE;
-	g_mutex_lock(change_config_mutex);
+	dstore = store;
 
 	tpage_clear();
 	wtree_remove_all();
 	breaks_remove_all();
+
+	GKeyFile *keyfile = DEBUG_STORE_PROJECT == dstore ? keyfile_project : keyfile_plugin;
 	
-	if (current_folder)
+	if (!g_key_file_has_group(keyfile, DEBUGGER_GROUP))
 	{
-		g_free(current_folder);
-	}
-	current_folder = g_strdup(folder);
-	
-	gchar *path = g_build_path(G_DIR_SEPARATOR_S, folder, CONFIG_NAME, NULL);
-	FILE *file = fopen(path, "r");
-	if (!file)
-	{
-		config_changed = FALSE;
+		config_set_debug_defaults(keyfile);
+		gchar *data = g_key_file_to_data(keyfile, NULL, NULL);
 
-		modifyable = FALSE;
-		g_mutex_unlock(change_config_mutex);
+		gchar *file = DEBUG_STORE_PROJECT == dstore ? geany_data->app->project->file_name : plugin_config_path;
+		g_file_set_contents(file, data, -1, NULL);
 
-		return FALSE;
+		g_free(data);
 	}
+	
+	debug_load_from_keyfile(keyfile);
+}
 
-	/* target */
-	gchar buffer[FILENAME_MAX];
-	if(readline(file, buffer, FILENAME_MAX - 1))
+/*
+ *	updates keyfile_project from a current geany project path
+ */
+void config_update_project_keyfile()
+{
+	if (keyfile_project)
 	{
-		tpage_set_target(buffer);
+		g_key_file_free(keyfile_project);
 	}
+	keyfile_project = g_key_file_new();
+	g_key_file_load_from_file(keyfile_project, geany_data->app->project->file_name, G_KEY_FILE_NONE, NULL);
+}
 
-	/* debugger */
-	gchar debugger[FILENAME_MAX];
-	if(readline(file, debugger, FILENAME_MAX - 1))
+/*
+ *	project open handler
+ */
+void config_on_project_open(GObject *obj, GKeyFile *config, gpointer user_data)
+{
+	config_update_project_keyfile();
+
+	if (config_get_save_to_project())
 	{
-		tpage_set_debugger(debugger);
+		config_set_debug_store(DEBUG_STORE_PROJECT);
 	}
-		
-	/* arguments */
-	if(readline(file, buffer, FILENAME_MAX - 1))
-	{
-		tpage_set_commandline(buffer);
-	}
+}
 
-	/* breakpoints and environment variables */
-	gchar line[MAXLINE];
-	while (readline(file, line, MAXLINE))
+/*
+ *	project close handler
+ */
+void config_on_project_close(GObject *obj, gpointer user_data)
+{
+	if (config_get_save_to_project())
 	{
-		if (!strcmp(line, BREAKPOINTS_MARKER))
+		if (DBS_IDLE != debug_get_state())
 		{
-			/* file */
-			gchar _path[FILENAME_MAX];
-			readline(file, _path, MAXLINE);
+			/* stop a debugger and ait for it to be stopped */
+			debug_stop();
 			
-			/* line */
-			int nline;
-			readline(file, line, MAXLINE);
-			sscanf(line, "%i", &nline);
-			
-			/* hitscount */
-			int hitscount;
-			readline(file, line, MAXLINE);
-			sscanf(line, "%d", &hitscount);
-
-			/* condition */
-			gchar condition[MAXLINE];
-			readline(file, condition, MAXLINE);
-
-			/* enabled */
-			gboolean enabled;
-			readline(file, line, MAXLINE);
-			sscanf(line, "%d", &enabled);
-			
-			/* check whether file is available */
-			struct stat st;
-			if(!stat(_path, &st))
+			while (DBS_IDLE != debug_get_state())
 			{
-				breaks_add(_path, nline, condition, enabled, hitscount);
+				g_main_context_iteration(NULL, FALSE);
 			}
 		}
-		else if (!strcmp(line, ENVIRONMENT_MARKER))
+
+		config_set_debug_store(DEBUG_STORE_PLUGIN);
+	}
+}
+
+/*
+ *	project save handler
+ * 	handles ne project creation and updatng a project using project properties dialog 
+ */
+void config_on_project_save(GObject *obj, GKeyFile *config, gpointer user_data)
+{
+	if (config_get_save_to_project())
+	{
+		if (!g_key_file_has_group(config, DEBUGGER_GROUP))
 		{
-			gchar name[MAXLINE], value[1000];
-			if(readline(file, name, MAXLINE) && readline(file, value, MAXLINE))
-			{
-				tpage_add_environment(name, value);
-			}
+			/* no debug group, creating a new project */
+			dstore = DEBUG_STORE_PROJECT;
+
+			/* clear values taken from a plugin */
+			tpage_clear();
+			wtree_remove_all();
+			breaks_remove_all();
+
+			/* set default debug values */
+			config_set_debug_defaults(config);
 		}
-		else if (!strcmp(line, WATCH_MARKER))
+
+		/* update local keyfile */
+		if (keyfile_project)
 		{
-			gchar watch[MAXLINE];
-			if(readline(file, watch, MAXLINE))
-			{
-				wtree_add_watch(watch);
-			}
+			g_key_file_free(keyfile_project);
 		}
+		keyfile_project = create_copy_keyfile(config);
 	}
-	
-	bptree_update_file_nodes();
-
-	config_changed = FALSE;
-
-	modifyable = FALSE;
-	g_mutex_unlock(change_config_mutex);
-	
-	return TRUE;
 }
 
 /*
- * saves config to a folder
+ *	a configure dialog has been closed
  */
-gboolean dconfig_save(gchar *folder)
+static void on_configure_response(GtkDialog* dialog, gint response, gpointer user_data)
 {
-	/* open config file */
-	gchar *config_file = g_build_path(G_DIR_SEPARATOR_S, folder, CONFIG_NAME, NULL);		
-
-	FILE *config = fopen(config_file, "w");
-	if (config)
+	gboolean newvalue = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(save_to_project_btn));
+	if (newvalue ^ config_get_save_to_project())
 	{
-		/* get target */
-		const gchar *_target = tpage_get_target();
-		fprintf(config, "%s\n", _target);
-		
-		/* debugger type */
-		gchar *debugger = tpage_get_debugger();
-		fprintf(config, "%s\n", debugger);
-		
-		/* get command line arguments */
-		gchar *_args = tpage_get_commandline();
-		fprintf(config, "%s\n", _args);
-		g_free(_args);
+		g_key_file_set_boolean(keyfile_plugin, "saving_settings", "save_to_project", newvalue);
 
-		/* environment */
-		GList *_env = tpage_get_environment();
-		GList *iter = _env;
-		
-		while(iter)
+		g_mutex_lock(change_config_mutex);
+		panel_config_changed = TRUE;
+		g_mutex_unlock(change_config_mutex);
+
+		if (geany_data->app->project)
 		{
-			gchar *name = (gchar*)iter->data;
-			iter = iter->next;
-			gchar *value = (gchar*)iter->data;
+			if (DBS_IDLE != debug_get_state())
+			{
+				debug_stop();
+				
+				while (DBS_IDLE != debug_get_state())
+				{
+					g_main_context_iteration(NULL, FALSE);
+				}
+			}
 
-			fprintf(config, "%s\n", ENVIRONMENT_MARKER);
-			fprintf(config, "%s\n%s\n", name, value);
-
-			iter = iter->next;
+			config_set_debug_store(newvalue ? DEBUG_STORE_PROJECT : DEBUG_STORE_PLUGIN);
 		}
-		
-		/* breakpoints */
-		GList *_breaks = breaks_get_all();
-		GList *biter = _breaks;
-		while (biter)
-		{
-			breakpoint *bp = (breakpoint*)biter->data;
-			
-			fprintf(config, "%s\n", BREAKPOINTS_MARKER);
-			fprintf(config, "%s\n%i\n%i\n%s\n%i\n",
-				bp->file, bp->line, bp->hitscount, bp->condition, bp->enabled);
-					
-			biter = biter->next;
-		}
-		g_list_free(_breaks);
-		_breaks = NULL;
-		
-		/* watches */
-		GList *cur_watches = wtree_get_watches();
-		biter = cur_watches;
-		while (biter)
-		{
-			gchar *watch = (gchar*)biter->data;
-			
-			fprintf(config, "%s\n", WATCH_MARKER);
-			fprintf(config, "%s\n", watch);
-					
-			biter = biter->next;
-		}
-		g_list_foreach(cur_watches, (GFunc)g_free, NULL);
-		g_list_free(cur_watches);
-		cur_watches = NULL;
-
-		fclose(config);
 	}
+}
 
-	g_free(config_file);
+/*
+ *	"plugin_configure" signal handler
+ */
+GtkWidget *config_plugin_configure(GtkDialog *dialog)
+{
+	GtkWidget *vbox = gtk_vbox_new(FALSE, 6);
+	GtkWidget *_hbox = gtk_hbox_new(FALSE, 6);
+	
+	save_to_project_btn = gtk_check_button_new_with_label(_("Save debug session data to a project"));
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(save_to_project_btn), config_get_save_to_project());
 
-	return config ? TRUE : FALSE;
+	gtk_box_pack_start(GTK_BOX(_hbox), save_to_project_btn, TRUE, TRUE, 0);
+	gtk_box_pack_start(GTK_BOX(vbox), _hbox, FALSE, FALSE, 0);
+
+	gtk_widget_show_all(vbox);
+
+	g_signal_connect(dialog, "response", G_CALLBACK(on_configure_response), NULL);
+
+	return vbox;
 }

Modified: trunk/geany-plugins/debugger/src/dconfig.h
===================================================================
--- trunk/geany-plugins/debugger/src/dconfig.h	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/dconfig.h	2011-09-29 11:05:32 UTC (rev 2217)
@@ -1,7 +1,7 @@
 /*
  *		dconfig.h
  *      
- *      Copyright 2010 Alexander Petukhov <devel(at)apetukhov.ru>
+ *      Copyright 2011 Alexander Petukhov <devel(at)apetukhov.ru>
  *      
  *      This program is free software; you can redistribute it and/or modify
  *      it under the terms of the GNU General Public License as published by
@@ -19,12 +19,49 @@
  *      MA 02110-1301, USA.
  */
 
-void		dconfig_init();
-void		dconfig_destroy();
+#include <stdarg.h>
 
-gboolean 	dconfig_is_found_at(gchar *folder);
-gboolean 	dconfig_load(gchar *folder);
+/* panel config parts */
+#define CP_TABBED_MODE 1
+#define CP_OT_TABS 2
+#define CP_OT_SELECTED 3
+#define CP_TT_LTABS 4
+#define CP_TT_LSELECTED 5
+#define CP_TT_RTABS 6
+#define CP_TT_RSELECTED 7
 
-void		dconfig_set_changed();
 
+typedef enum _debug_store {
+	DEBUG_STORE_PLUGIN,
+	DEBUG_STORE_PROJECT
+} debug_store;
 
+
+void		config_init();
+void		config_destroy();
+
+void		config_set_panel(int config_part, gpointer config_value, ...);
+
+gboolean	config_get_save_to_project();
+
+gboolean	config_get_tabbed();
+
+int*		config_get_tabs(gsize *length);
+int			config_get_selected_tab_index();
+
+int*		config_get_left_tabs(gsize *length);
+int			config_get_left_selected_tab_index();
+
+int*		config_get_right_tabs(gsize *length);
+int			config_get_right_selected_tab_index();
+
+void		config_set_debug_changed();
+void		config_set_debug_store(debug_store store);
+
+void		config_on_project_open(GObject *obj, GKeyFile *config, gpointer user_data);
+void		config_on_project_close(GObject *obj, gpointer user_data);
+void		config_on_project_save(GObject *obj, GKeyFile *config, gpointer user_data);
+
+void		config_update_project_keyfile();
+
+GtkWidget	*config_plugin_configure(GtkDialog *dialog);

Modified: trunk/geany-plugins/debugger/src/debug.c
===================================================================
--- trunk/geany-plugins/debugger/src/debug.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/debug.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -242,7 +242,7 @@
 		if (DBS_STOPPED == debug_state)
 			active_module->remove_watch(internal);
 
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	else if (strcmp(oldvalue, striped))
     {
@@ -274,7 +274,7 @@
 			gtk_tree_path_free(_path);
 		}
 
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	
 	/* free resources */
@@ -341,7 +341,7 @@
 	else
 		variable_set_name_only(wstore, &newvar, expression);
 
-	dconfig_set_changed();
+	config_set_debug_changed();
 }
 
 /* 
@@ -457,7 +457,7 @@
 		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
 		g_list_free (references);
 
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 
 	/* free rows list */
@@ -504,7 +504,7 @@
 				else
 					variable_set_name_only(wstore, &newvar, expression);
 
-				dconfig_set_changed();
+				config_set_debug_changed();
 			}
 
 			g_free(expression);
@@ -804,11 +804,11 @@
 	/* enable widgets */
 	enable_sensitive_widgets(TRUE);
 
+	/* update buttons panel state */
+	btnpanel_set_debug_state(DBS_IDLE);
+	
 	/* update debug state */
 	debug_state = DBS_IDLE;
-
-	/* update buttons panel state */
-	btnpanel_set_debug_state(debug_state);
 }
 
 /* 

Modified: trunk/geany-plugins/debugger/src/debug.h
===================================================================
--- trunk/geany-plugins/debugger/src/debug.h	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/debug.h	2011-09-29 11:05:32 UTC (rev 2217)
@@ -50,11 +50,11 @@
 int				debug_get_module_index(const gchar *modulename);
 gboolean		debug_supports_async_breaks();
 void			debug_destroy();
-gchar*		debug_evaluate_expression(gchar *expression);
+gchar*			debug_evaluate_expression(gchar *expression);
 gboolean		debug_current_instruction_have_sources();
 void			debug_jump_to_current_instruction();
 void			debug_on_file_open(GeanyDocument *doc);
-gchar*		debug_get_calltip_for_expression(gchar* expression);
+gchar*			debug_get_calltip_for_expression(gchar* expression);
 GList*			debug_get_stack();
 void			debug_restart();
 

Modified: trunk/geany-plugins/debugger/src/dpaned.c
===================================================================
--- trunk/geany-plugins/debugger/src/dpaned.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/dpaned.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -38,7 +38,7 @@
 #include "debug.h"
 #include "btnpanel.h"
 #include "stree.h"
-#include "pconfig.h"
+#include "dconfig.h"
 
 #define NOTEBOOK_GROUP 438948394
 #define HPANED_BORDER_WIDTH 4
@@ -104,17 +104,17 @@
 static void on_page_added(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
 {
 	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
-	gboolean is_tabbed = pconfig_get_tabbed();
+	gboolean is_tabbed = config_get_tabbed();
 	
 	int *tabs = NULL;
 	gsize length;
 
 	if (!is_tabbed)
-		tabs = pconfig_get_tabs(&length);
+		tabs = config_get_tabs(&length);
 	else if (is_left)
-		tabs = pconfig_get_left_tabs(&length);
+		tabs = config_get_left_tabs(&length);
 	else
-		tabs = pconfig_get_right_tabs(&length);
+		tabs = config_get_right_tabs(&length);
 	
 	int *array = g_malloc((length + 2) * sizeof(int));
 	int *new_tabs = array + 1;
@@ -135,7 +135,7 @@
 
 	array[0] = length + 1;
 	memcpy(array + 1, new_tabs, length + 1);
-	pconfig_set(config_part, array, 0);
+	config_set_panel(config_part, array, 0);
 
 	g_free(tabs);
 	g_free(array);
@@ -147,17 +147,17 @@
 static void on_page_reordered(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
 {
 	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
-	gboolean is_tabbed = pconfig_get_tabbed();
+	gboolean is_tabbed = config_get_tabbed();
 
 	int *tabs = NULL;
 	gsize length;
 
 	if (!is_tabbed)
-		tabs = pconfig_get_tabs(&length);
+		tabs = config_get_tabs(&length);
 	else if (is_left)
-		tabs = pconfig_get_left_tabs(&length);
+		tabs = config_get_left_tabs(&length);
 	else
-		tabs = pconfig_get_right_tabs(&length);
+		tabs = config_get_right_tabs(&length);
 
 	int prev_index;
 	GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(is_left ? debug_notebook_left : debug_notebook_right), page_num);
@@ -200,7 +200,7 @@
 	array[0] = length;
 	memcpy(array + 1, tabs, length * sizeof(int));
 	
-	pconfig_set(
+	config_set_panel(
 		config_part_tabs, array,
 		config_part_selected_index, page_num,
 		0
@@ -216,17 +216,17 @@
 static void on_page_removed(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
 {
 	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
-	gboolean is_tabbed = pconfig_get_tabbed();
+	gboolean is_tabbed = config_get_tabbed();
 
 	int *tabs = NULL;
 	gsize length;
 
 	if (!is_tabbed)
-		tabs = pconfig_get_tabs(&length);
+		tabs = config_get_tabs(&length);
 	else if (is_left)
-		tabs = pconfig_get_left_tabs(&length);
+		tabs = config_get_left_tabs(&length);
 	else
-		tabs = pconfig_get_right_tabs(&length);
+		tabs = config_get_right_tabs(&length);
 
 	memmove(tabs + page_num, tabs + page_num + 1, (length - page_num - 1) * sizeof(int)); 
 	memmove(tabs + 1, tabs, (length - 1) * sizeof(int)); 
@@ -240,7 +240,7 @@
 	else
 		config_part = CP_TT_RTABS;
 	
-	pconfig_set(config_part, tabs, 0);
+	config_set_panel(config_part, tabs, 0);
 
 	g_free(tabs);
 }
@@ -251,7 +251,7 @@
 static gboolean on_change_current_page(GtkNotebook *notebook, gpointer arg1, guint arg2, gpointer user_data)
 {
 	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
-	gboolean is_tabbed = pconfig_get_tabbed();
+	gboolean is_tabbed = config_get_tabbed();
 
 	int config_part;
 	if (!is_tabbed)
@@ -261,7 +261,7 @@
 	else
 		config_part = CP_TT_RSELECTED;
 	
-	pconfig_set(config_part, (gpointer)arg2, 0);
+	config_set_panel(config_part, (gpointer)arg2, 0);
 
 	return TRUE;
 }
@@ -273,7 +273,6 @@
 {
 	/* create paned */
 	hpaned = gtk_hpaned_new();
-	gtk_container_set_border_width(GTK_CONTAINER(hpaned), HPANED_BORDER_WIDTH);
 	
 	/* create notebooks */
 	debug_notebook_left = gtk_notebook_new();
@@ -291,17 +290,14 @@
 	gtk_paned_add1(GTK_PANED(hpaned), debug_notebook_left);
 	gtk_paned_add2(GTK_PANED(hpaned), debug_notebook_right);
 
-	/* load config */
-	pconfig_init();
-
-	gboolean is_tabbed = pconfig_get_tabbed();
+	gboolean is_tabbed = config_get_tabbed();
 	if (is_tabbed)
 	{
 		gsize length;
 		int *tab_ids, i;
 
 		/* left */
-		tab_ids = pconfig_get_left_tabs(&length);
+		tab_ids = config_get_left_tabs(&length);
 		for (i = 0; i < length; i++)
 		{
 			GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
@@ -314,7 +310,7 @@
 		g_free(tab_ids);
 
 		/* right */
-		tab_ids = pconfig_get_right_tabs(&length);
+		tab_ids = config_get_right_tabs(&length);
 		for (i = 0; i < length; i++)
 		{
 			GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
@@ -328,8 +324,8 @@
 
 		gtk_widget_show_all(hpaned);
 
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), pconfig_get_left_selected_tab_index());
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_right),pconfig_get_right_selected_tab_index());
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), config_get_left_selected_tab_index());
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_right),config_get_right_selected_tab_index());
 	}
 	else
 	{
@@ -337,7 +333,7 @@
 		gtk_container_remove(GTK_CONTAINER(hpaned), debug_notebook_right);
 		
 		gsize length;
-		int *tab_ids = pconfig_get_tabs(&length);
+		int *tab_ids = config_get_tabs(&length);
 		int i;
 		for (i = 0; i < length; i++)
 		{
@@ -350,7 +346,7 @@
 		}
 
 		gtk_widget_show_all(hpaned);
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), pconfig_get_selected_tab_index());
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), config_get_selected_tab_index());
 	}
 		
 	CONNECT_PAGE_SIGNALS();
@@ -363,8 +359,6 @@
 void dpaned_destroy()
 {
 	DISCONNECT_PAGE_SIGNALS();
-	
-	pconfig_destroy();
 }
 
 /*
@@ -388,7 +382,7 @@
 		gtk_container_remove(GTK_CONTAINER(hpaned), debug_notebook_right);
 		
 		gsize length;
-		int *tab_ids = pconfig_get_tabs(&length);
+		int *tab_ids = config_get_tabs(&length);
 		int i;
 		for (i = 0; i < length; i++)
 		{
@@ -404,7 +398,7 @@
 			}
 		}
 
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), pconfig_get_selected_tab_index());
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), config_get_selected_tab_index());
 
 		gtk_widget_show_all(hpaned);
 	}
@@ -414,7 +408,7 @@
 		g_object_unref(debug_notebook_right);
 
 		gsize length;
-		int *tab_ids = pconfig_get_right_tabs(&length);
+		int *tab_ids = config_get_right_tabs(&length);
 		int i;
 		for (i = 0; i < length; i++)
 		{
@@ -427,21 +421,13 @@
 				gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook_right), tab, TRUE);
 		}
 
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), pconfig_get_left_selected_tab_index());
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_right), pconfig_get_right_selected_tab_index());
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), config_get_left_selected_tab_index());
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_right), config_get_right_selected_tab_index());
 
 		gtk_widget_show_all(hpaned);
 	}
 	
 	CONNECT_PAGE_SIGNALS();
 
-	pconfig_set(CP_TABBED_MODE, (gpointer)tabbed, 0);
+	config_set_panel(CP_TABBED_MODE, (gpointer)tabbed, 0);
 }
-
-/*
- *	gets tabbed mode state
- */
-gboolean dpaned_get_tabbed()
-{
-	return pconfig_get_tabbed();
-}

Modified: trunk/geany-plugins/debugger/src/dpaned.h
===================================================================
--- trunk/geany-plugins/debugger/src/dpaned.h	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/dpaned.h	2011-09-29 11:05:32 UTC (rev 2217)
@@ -24,4 +24,3 @@
 void		dpaned_destroy();
 GtkWidget*	dpaned_get_paned();
 void		dpaned_set_tabbed(gboolean paned);
-gboolean	dpaned_get_tabbed();

Modified: trunk/geany-plugins/debugger/src/envtree.c
===================================================================
--- trunk/geany-plugins/debugger/src/envtree.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/envtree.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -185,7 +185,7 @@
 	if (GDK_Delete == keyval)
 	{
 		delete_selected_rows();
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 
 	return GDK_Tab == keyval;
@@ -243,7 +243,7 @@
 			if (dialogs_show_question(_("Delete variable?")))
 			{
 				delete_selected_rows();
-				dconfig_set_changed();
+				config_set_debug_changed();
 
 				gtk_widget_grab_focus(tree);
 			}
@@ -266,7 +266,7 @@
 				add_empty_row();
 			
 			g_object_set (renderer_value, "editable", FALSE, NULL);
-			dconfig_set_changed();
+			config_set_debug_changed();
 		}
 		
 		g_free(oldvalue);
@@ -346,7 +346,7 @@
 		if (!empty && dialogs_show_question(_("Delete variable?")))
 		{
 			delete_selected_rows();
-			dconfig_set_changed();
+			config_set_debug_changed();
 
 			gtk_widget_grab_focus(tree);
 		}
@@ -362,7 +362,7 @@
 		}
 		if (!empty)
 		{
-			dconfig_set_changed();
+			config_set_debug_changed();
 		}
 	}
 	

Deleted: trunk/geany-plugins/debugger/src/pconfig.c
===================================================================
--- trunk/geany-plugins/debugger/src/pconfig.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/pconfig.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -1,235 +0,0 @@
-/*
- *
- *		pconfig.c
- *      
- *      Copyright 2011 Alexander Petukhov <devel(at)apetukhov.ru>
- *      
- *      This program is free software; you can redistribute it and/or modify
- *      it under the terms of the GNU General Public License as published by
- *      the Free Software Foundation; either version 2 of the License, or
- *      (at your option) any later version.
- *      
- *      This program is distributed in the hope that it will be useful,
- *      but WITHOUT ANY WARRANTY; without even the implied warranty of
- *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *      GNU General Public License for more details.
- *      
- *      You should have received a copy of the GNU General Public License
- *      along with this program; if not, write to the Free Software
- *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- *      MA 02110-1301, USA.
- */
-
-/*
- *		Debug paned config.
- */
- 
-#include <sys/stat.h>
-
-#include "geanyplugin.h"
-extern GeanyFunctions	*geany_functions;
-extern GeanyData		*geany_data;
-
-#include "pconfig.h"
-#include "tabs.h"
-
-/* config file path */
-static gchar *config_path = NULL;
-
-/* config GKeyFile */
-static GKeyFile *key_file = NULL;
-
-/* saving interval */
-#define SAVING_INTERVAL 2000000
-
-/* saving thread staff */
-static GMutex *change_config_mutex;
-static GCond *cond;
-static GThread *saving_thread;
-static gboolean config_changed = FALSE;
-
-/*
- * function for a config file background saving if changed 
- */
-static gpointer saving_thread_func(gpointer data)
-{
-	GTimeVal interval;
-	GMutex *m = g_mutex_new();
-	do
-	{
-		g_mutex_lock(change_config_mutex);
-		if (config_changed)
-		{
-			gchar *config_data = g_key_file_to_data(key_file, NULL, NULL);
-			g_file_set_contents(config_path, config_data, -1, NULL);
-			g_free(config_data);
-
-			config_changed = FALSE;
-		}
-		g_mutex_unlock(change_config_mutex);
-
-		g_get_current_time(&interval);
-		g_time_val_add(&interval, SAVING_INTERVAL);
-	}
-	while (!g_cond_timed_wait(cond, m, &interval));
-	g_mutex_free(m);
-	
-	return NULL;
-}
-
-/*
- *	set default values in the GKeyFile
- */
-void pconfig_set_defaults(GKeyFile *kf)
-{
-	g_key_file_set_boolean(key_file, "tabbed_mode", "enabled", FALSE);
-
-	int all_tabs[] = { TID_TARGET, TID_BREAKS, TID_AUTOS, TID_WATCH, TID_STACK, TID_TERMINAL, TID_MESSAGES };
-	g_key_file_set_integer_list(key_file, "one_panel_mode", "tabs", all_tabs, sizeof(all_tabs) / sizeof(int));
-	g_key_file_set_integer(key_file, "one_panel_mode", "selected_tab_index", 0);
-
-	int left_tabs[] = { TID_TARGET, TID_BREAKS, TID_AUTOS, TID_WATCH };
-	g_key_file_set_integer_list(key_file, "two_panels_mode", "left_tabs", left_tabs, sizeof(left_tabs) / sizeof(int));
-	g_key_file_set_integer(key_file, "two_panels_mode", "left_selected_tab_index", 0);
-	int right_tabs[] = { TID_STACK, TID_TERMINAL, TID_MESSAGES };
-	g_key_file_set_integer_list(key_file, "two_panels_mode", "right_tabs", right_tabs, sizeof(right_tabs) / sizeof(int));
-	g_key_file_set_integer(key_file, "two_panels_mode", "right_selected_tab_index", 0);
-}
-
-/*
- *	initialize
- */
-void pconfig_init()
-{
-	/* read config */
-	gchar *config_dir = g_build_path(G_DIR_SEPARATOR_S, geany_data->app->configdir, "plugins", "debugger", NULL);
-	config_path = g_build_path(G_DIR_SEPARATOR_S, config_dir, "debugger.conf", NULL);
-	
-	g_mkdir_with_parents(config_dir, S_IRUSR | S_IWUSR | S_IXUSR);
-	g_free(config_dir);
-
-	key_file = g_key_file_new();
-	if (!g_key_file_load_from_file(key_file, config_path, G_KEY_FILE_NONE, NULL))
-	{
-		pconfig_set_defaults(key_file);
-		gchar *data = g_key_file_to_data(key_file, NULL, NULL);
-		g_file_set_contents(config_path, data, -1, NULL);
-		g_free(data);
-	}
-
-	change_config_mutex = g_mutex_new();
-	cond = g_cond_new();
-	saving_thread = g_thread_create(saving_thread_func, NULL, TRUE, NULL);
-}	
-
-/*
- *	destroy
- */
-void pconfig_destroy()
-{
-	g_cond_signal(cond);
-	/* ??? g_thread_join(saving_thread); */	
-	
-	g_mutex_free(change_config_mutex);
-	g_cond_free(cond);
-
-	g_free(config_path);
-}
-
-/*
- *	set one or several config values
- */
-void pconfig_set(int config_part, gpointer config_value, ...)
-{
-	g_mutex_lock(change_config_mutex);
-	
-	va_list ap;
-	va_start(ap, config_value);
-	
-	while(config_part)
-	{
-		switch (config_part)
-		{
-			case CP_TABBED_MODE:
-			{
-				g_key_file_set_boolean(key_file, "tabbed_mode", "enabled", (gboolean)config_value);
-				break;
-			}
-			case CP_OT_TABS:
-			{
-				int *array = (int*)config_value;
-				g_key_file_set_integer_list(key_file, "one_panel_mode", "tabs", array + 1, array[0]);
-				break;
-			}
-			case CP_OT_SELECTED:
-			{
-				g_key_file_set_integer(key_file, "one_panel_mode", "selected_tab_index", (int)config_value);
-				break;
-			}
-			case CP_TT_LTABS:
-			{
-				int *array = (int*)config_value;
-				g_key_file_set_integer_list(key_file, "two_panels_mode", "left_tabs", array + 1, array[0]);
-				break;
-			}
-			case CP_TT_LSELECTED:
-			{
-				g_key_file_set_integer(key_file, "two_panels_mode", "left_selected_tab_index", (int)config_value);
-				break;
-			}
-			case CP_TT_RTABS:
-			{
-				int *array = (int*)config_value;
-				g_key_file_set_integer_list(key_file, "two_panels_mode", "right_tabs", array + 1, array[0]);
-				break;
-			}
-			case CP_TT_RSELECTED:
-			{
-				g_key_file_set_integer(key_file, "two_panels_mode", "right_selected_tab_index", (int)config_value);
-				break;
-			}
-		}
-		
-		config_part = va_arg(ap, int);
-		if (config_part)
-		{
-			config_value = va_arg(ap, gpointer);
-		}
-	}
-	
-	config_changed = TRUE;
-	g_mutex_unlock(change_config_mutex);
-}
-
-/*
- *	config parts getters
- */
-
-gboolean pconfig_get_tabbed()
-{
-	return g_key_file_get_boolean(key_file, "tabbed_mode", "enabled", NULL);
-}
-int* pconfig_get_tabs(gsize *length)
-{
-	return g_key_file_get_integer_list(key_file, "one_panel_mode", "tabs", length, NULL);
-}
-int pconfig_get_selected_tab_index()
-{
-	return g_key_file_get_integer(key_file, "one_panel_mode", "selected_tab_index", NULL);
-}
-int* pconfig_get_left_tabs(gsize *length)
-{
-	return g_key_file_get_integer_list(key_file, "two_panels_mode", "left_tabs", length, NULL);
-}
-int pconfig_get_left_selected_tab_index()
-{
-	return g_key_file_get_integer(key_file, "two_panels_mode", "left_selected_tab_index", NULL);
-}
-int* pconfig_get_right_tabs(gsize *length)
-{
-	return g_key_file_get_integer_list(key_file, "two_panels_mode", "right_tabs", length, NULL);
-}
-int	pconfig_get_right_selected_tab_index()
-{
-	return g_key_file_get_integer(key_file, "two_panels_mode", "right_selected_tab_index", NULL);
-}

Deleted: trunk/geany-plugins/debugger/src/pconfig.h
===================================================================
--- trunk/geany-plugins/debugger/src/pconfig.h	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/pconfig.h	2011-09-29 11:05:32 UTC (rev 2217)
@@ -1,47 +0,0 @@
-/*
- *		pconfig.h
- *      
- *      Copyright 2011 Alexander Petukhov <devel(at)apetukhov.ru>
- *      
- *      This program is free software; you can redistribute it and/or modify
- *      it under the terms of the GNU General Public License as published by
- *      the Free Software Foundation; either version 2 of the License, or
- *      (at your option) any later version.
- *      
- *      This program is distributed in the hope that it will be useful,
- *      but WITHOUT ANY WARRANTY; without even the implied warranty of
- *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *      GNU General Public License for more details.
- *      
- *      You should have received a copy of the GNU General Public License
- *      along with this program; if not, write to the Free Software
- *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- *      MA 02110-1301, USA.
- */
-
-#include <stdarg.h>
-
-/* config parts */
-#define CP_TABBED_MODE 1
-#define CP_OT_TABS 2
-#define CP_OT_SELECTED 3
-#define CP_TT_LTABS 4
-#define CP_TT_LSELECTED 5
-#define CP_TT_RTABS 6
-#define CP_TT_RSELECTED 7
-
-void		pconfig_init();
-void		pconfig_destroy();
-
-void		pconfig_set(int config_part, gpointer config_value, ...);
-
-gboolean	pconfig_get_tabbed();
-
-int*		pconfig_get_tabs(gsize *length);
-int			pconfig_get_selected_tab_index();
-
-int*		pconfig_get_left_tabs(gsize *length);
-int			pconfig_get_left_selected_tab_index();
-
-int*		pconfig_get_right_tabs(gsize *length);
-int			pconfig_get_right_selected_tab_index();

Modified: trunk/geany-plugins/debugger/src/plugin.c
===================================================================
--- trunk/geany-plugins/debugger/src/plugin.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/plugin.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -68,11 +68,12 @@
 	 * can prevent Geany from processing the notification. Use this with care. */
 	{ "editor-notify", (GCallback) &on_editor_notify, FALSE, NULL },
 	{ "document_open", (GCallback) &on_document_open, FALSE, NULL },
-	{ "document_activate", (GCallback) &on_document_activate, FALSE, NULL },
-	{ "document_close", (GCallback) &on_document_close, FALSE, NULL },
 	{ "document_save", (GCallback) &on_document_save, FALSE, NULL },
 	{ "document_before_save", (GCallback) &on_document_before_save, FALSE, NULL },
 	{ "document_new", (GCallback) &on_document_new, FALSE, NULL },
+	{ "project_open", (GCallback) &config_on_project_open, FALSE, NULL },
+	{ "project_close", (GCallback) &config_on_project_close, FALSE, NULL },
+	{ "project_save", (GCallback) &config_on_project_save, FALSE, NULL },
 	
 	{ NULL, NULL, FALSE, NULL }
 };
@@ -84,6 +85,7 @@
 	tpage_pack_widgets(state);
 }
 
+extern void config_on_project_open(GObject *obj, GKeyFile *config, gpointer user_data);
 /* Called by Geany to initialize the plugin.
  * Note: data is the same as geany_data. */
 void plugin_init(GeanyData *data)
@@ -95,7 +97,8 @@
 	pixbufs_init();
 
 	/* main box */
-	hbox = gtk_hbox_new(FALSE, 0);
+	hbox = gtk_hbox_new(FALSE, 7);
+	gtk_container_set_border_width(GTK_CONTAINER(hbox), 6);
 
 	/* add target page */
 	tpage_init();
@@ -109,9 +112,12 @@
 	/* init debug */
 	debug_init();
 
+	/* load config */
+	config_init();
+
 	/* init paned */
 	dpaned_init();
-	tpage_pack_widgets(dpaned_get_tabbed());
+	tpage_pack_widgets(config_get_tabbed());
 
 	GtkWidget* vbox = btnpanel_create(on_paned_mode_changed);
 
@@ -125,11 +131,15 @@
 		hbox,
 		gtk_label_new(_("Debug")));
 
-	/* init config */
-	dconfig_init();
+	if (geany_data->app->project)
+	{
+		config_update_project_keyfile();
+	}
+	config_set_debug_store(
+		config_get_save_to_project() && geany_data->app->project ? DEBUG_STORE_PROJECT : DEBUG_STORE_PLUGIN
+	);
 }
 
-
 /* Called by Geany to show the plugin's configure dialog. This function is always called after
  * plugin_init() was called.
  * You can omit this function if the plugin doesn't need to be configured.
@@ -137,11 +147,7 @@
  *       dialog. */
 GtkWidget *plugin_configure(GtkDialog *dialog)
 {
-	/* configuration dialog */
-	GtkWidget *vbox = gtk_vbox_new(FALSE, 6);
-
-	gtk_widget_show_all(vbox);
-	return vbox;
+	return config_plugin_configure(dialog);
 }
 
 
@@ -158,21 +164,11 @@
 			g_main_context_iteration(NULL,FALSE);
 	}
 
+	config_destroy();
 	pixbufs_destroy();
-
-	/* destroy debug-related stuff */
 	debug_destroy();
-
-	/* destroy breaks */
 	breaks_destroy();
-
-	/* clears config */
-	dconfig_destroy();
-
-	/* clears debug paned data */
 	dpaned_destroy();
-
-	/* clears anv tree data */
 	envtree_destroy();
 	
 	/* release other allocated strings and objects */

Modified: trunk/geany-plugins/debugger/src/tpage.c
===================================================================
--- trunk/geany-plugins/debugger/src/tpage.c	2011-09-25 20:08:05 UTC (rev 2216)
+++ trunk/geany-plugins/debugger/src/tpage.c	2011-09-29 11:05:32 UTC (rev 2217)
@@ -85,7 +85,7 @@
  */
 static void on_arguments_changed(GtkTextBuffer *textbuffer, gpointer user_data)
 {
-	dconfig_set_changed();
+	config_set_debug_changed();
 }
 
 /*
@@ -120,7 +120,7 @@
 		gtk_entry_set_text(GTK_ENTRY(target_name), filename);
 		g_free (filename);
 		
-		dconfig_set_changed();
+		config_set_debug_changed();
 	}
 	gtk_widget_destroy (dialog);
 }

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




More information about the Plugins-Commits mailing list