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

cesspit at users.sourceforge.net cesspit at xxxxx
Sun Sep 18 12:03:58 UTC 2011


Revision: 2201
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2201&view=rev
Author:   cesspit
Date:     2011-09-18 12:03:57 +0000 (Sun, 18 Sep 2011)
Log Message:
-----------
debugger: saving debug panel layout config on a separate thread

Modified Paths:
--------------
    trunk/geany-plugins/debugger/src/Makefile.am
    trunk/geany-plugins/debugger/src/dconfig.c
    trunk/geany-plugins/debugger/src/dpaned.c

Added 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-18 11:31:46 UTC (rev 2200)
+++ trunk/geany-plugins/debugger/src/Makefile.am	2011-09-18 12:03:57 UTC (rev 2201)
@@ -41,6 +41,8 @@
 	ltree.h     \
 	markers.c     \
 	markers.h     \
+	pconfig.c     \
+	pconfig.h     \
 	plugin.c     \
 	stree.c     \
 	stree.h     \

Modified: trunk/geany-plugins/debugger/src/dconfig.c
===================================================================
--- trunk/geany-plugins/debugger/src/dconfig.c	2011-09-18 11:31:46 UTC (rev 2200)
+++ trunk/geany-plugins/debugger/src/dconfig.c	2011-09-18 12:03:57 UTC (rev 2201)
@@ -52,7 +52,7 @@
 /* saving interval */
 #define SAVING_INTERVAL 2000000
 
-/* idle callback staff */
+/* saving thread staff */
 static GMutex *change_config_mutex;
 static GCond *cond;
 static GThread *saving_thread;
@@ -85,7 +85,7 @@
 /*
  * function for a config file background saving if changed 
  */
-gpointer saving_thread_func(gpointer data)
+static gpointer saving_thread_func(gpointer data)
 {
 	GTimeVal interval;
 	GMutex *m = g_mutex_new();
@@ -153,7 +153,7 @@
 /*
  * checks whether a config file is founs in the folder
  */
-gboolean 	dconfig_is_found_at(gchar *folder)
+gboolean dconfig_is_found_at(gchar *folder)
 {
 	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);

Modified: trunk/geany-plugins/debugger/src/dpaned.c
===================================================================
--- trunk/geany-plugins/debugger/src/dpaned.c	2011-09-18 11:31:46 UTC (rev 2200)
+++ trunk/geany-plugins/debugger/src/dpaned.c	2011-09-18 12:03:57 UTC (rev 2201)
@@ -38,13 +38,14 @@
 #include "debug.h"
 #include "btnpanel.h"
 #include "stree.h"
+#include "pconfig.h"
 
 #define NOTEBOOK_GROUP 438948394
 #define HPANED_BORDER_WIDTH 4
 
 #define CONNECT_PAGE_SIGNALS(X) \
-	swicth_left_handler_id = g_signal_connect(G_OBJECT(debug_notebook_left), "switch-page", G_CALLBACK(on_change_current_page), NULL); \
-	swicth_right_handler_id = g_signal_connect(G_OBJECT(debug_notebook_right), "switch-page", G_CALLBACK(on_change_current_page), NULL); \
+	switch_left_handler_id = g_signal_connect(G_OBJECT(debug_notebook_left), "switch-page", G_CALLBACK(on_change_current_page), NULL); \
+	switch_right_handler_id = g_signal_connect(G_OBJECT(debug_notebook_right), "switch-page", G_CALLBACK(on_change_current_page), NULL); \
 	g_signal_connect(G_OBJECT(debug_notebook_left), "page-reordered", G_CALLBACK(on_page_reordered), NULL); \
 	g_signal_connect(G_OBJECT(debug_notebook_right), "page-reordered", G_CALLBACK(on_page_reordered), NULL); \
 	add_left_handler_id = g_signal_connect(G_OBJECT(debug_notebook_left), "page-added", G_CALLBACK(on_page_added), NULL); \
@@ -53,8 +54,8 @@
 	remove_right_handler_id = g_signal_connect(G_OBJECT(debug_notebook_right), "page-removed", G_CALLBACK(on_page_removed), NULL);
 
 #define DISCONNECT_PAGE_SIGNALS(X) \
-	g_signal_handler_disconnect(G_OBJECT(debug_notebook_left), swicth_left_handler_id); \
-	g_signal_handler_disconnect(G_OBJECT(debug_notebook_right), swicth_right_handler_id); \
+	g_signal_handler_disconnect(G_OBJECT(debug_notebook_left), switch_left_handler_id); \
+	g_signal_handler_disconnect(G_OBJECT(debug_notebook_right), switch_right_handler_id); \
 	g_signal_handler_disconnect(G_OBJECT(debug_notebook_left), reorder_left_handler_id); \
 	g_signal_handler_disconnect(G_OBJECT(debug_notebook_right), reorder_right_handler_id); \
 	g_signal_handler_disconnect(G_OBJECT(debug_notebook_left), add_left_handler_id); \
@@ -68,12 +69,6 @@
 #define DISCONNECT_ALLOCATED_PAGE_SIGNALS(X) \
 	g_signal_handler_disconnect(G_OBJECT(hpaned), allocate_handler_id); \
 
-/* config file path */
-static gchar *config_path = NULL;
-
-/* config GKeyFile */
-static GKeyFile *key_file = NULL;
-
 /* pane */
 static GtkWidget *hpaned = NULL;
 
@@ -81,37 +76,18 @@
 static GtkWidget *debug_notebook_left = NULL;
 static GtkWidget *debug_notebook_right = NULL;
 
-
 /* notebook signal handler ids */
-
 static gulong allocate_handler_id;
-
-static gulong swicth_left_handler_id;
-static gulong swicth_right_handler_id;
-
+static gulong switch_left_handler_id;
+static gulong switch_right_handler_id;
 static gulong reorder_left_handler_id;
 static gulong reorder_right_handler_id;
-
 static gulong add_left_handler_id;
 static gulong add_right_handler_id;
-
 static gulong remove_left_handler_id;
 static gulong remove_right_handler_id;
 
-/* keeps current tabbed mode */
-static gboolean is_tabbed; 
-
 /*
- *	save config to a file
- */
-static void save_config()
-{
-	gchar *data = g_key_file_to_data(key_file, NULL, NULL);
-	g_file_set_contents(config_path, data, -1, NULL);
-	g_free(data);
-}
-
-/*
  *	first allocation handler to properly set paned position
  */
 static void on_size_allocate(GtkWidget *widget,GdkRectangle *allocation, gpointer   user_data)
@@ -127,28 +103,42 @@
  */
 static void on_page_added(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
 {
-	gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_tabbed = pconfig_get_tabbed();
 	
-	const gchar *group = is_tabbed ? "two_panels_mode" : "one_panel_mode";
-	const gchar *tabs_key = is_tabbed ? (left ? "left_tabs" : "right_tabs") : "tabs";
-
+	int *tabs = NULL;
 	gsize length;
-	int *tabs = g_key_file_get_integer_list(key_file, group, tabs_key, &length, NULL);
 
-	int *new_tabs = g_malloc((length + 1) * sizeof(int));
+	if (!is_tabbed)
+		tabs = pconfig_get_tabs(&length);
+	else if (is_left)
+		tabs = pconfig_get_left_tabs(&length);
+	else
+		tabs = pconfig_get_right_tabs(&length);
+	
+	int *array = g_malloc((length + 2) * sizeof(int));
+	int *new_tabs = array + 1;
 	memcpy(new_tabs, tabs, length * sizeof(int));
 	memmove(new_tabs + page_num + 1, new_tabs + page_num, (length - page_num) * sizeof(int)); 
 
-	GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(left ? debug_notebook_left : debug_notebook_right), page_num);
+	GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(is_left ? debug_notebook_left : debug_notebook_right), page_num);
 	tab_id id = tabs_get_tab_id(page);
 	new_tabs[page_num] = id;
 	
-	g_key_file_set_integer_list(key_file, group, tabs_key, new_tabs, length + 1);
+	int config_part;
+	if (!is_tabbed)
+		config_part = CP_OT_TABS;
+	else if (is_left)
+		config_part = CP_TT_LTABS;
+	else
+		config_part = CP_TT_RTABS;
 
-	save_config();
+	array[0] = length + 1;
+	memcpy(array + 1, new_tabs, length + 1);
+	pconfig_set(config_part, array, 0);
 
 	g_free(tabs);
-	g_free(new_tabs);
+	g_free(array);
 }
 
 /*
@@ -156,17 +146,21 @@
  */
 static void on_page_reordered(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
 {
-	gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_tabbed = pconfig_get_tabbed();
 
-	const gchar *group = is_tabbed ? "two_panels_mode" : "one_panel_mode";
-	const gchar *tabs_key = is_tabbed ? (left ? "left_tabs" : "right_tabs") : "tabs";
-	const gchar *selected_key = is_tabbed ? (left ? "left_selected_tab_index" : "right_selected_tab_index") : "selected_tab_index";
-
+	int *tabs = NULL;
 	gsize length;
-	int *tabs = g_key_file_get_integer_list(key_file, group, tabs_key, &length, NULL);
 
+	if (!is_tabbed)
+		tabs = pconfig_get_tabs(&length);
+	else if (is_left)
+		tabs = pconfig_get_left_tabs(&length);
+	else
+		tabs = pconfig_get_right_tabs(&length);
+
 	int prev_index;
-	GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(left ? debug_notebook_left : debug_notebook_right), page_num);
+	GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(is_left ? debug_notebook_left : debug_notebook_right), page_num);
 	tab_id id = tabs_get_tab_id(page);
 	for (prev_index = 0; prev_index < length; prev_index++)
 	{
@@ -184,12 +178,36 @@
 		tabs[i + 1] = tmp;
 	}  
 	
-	g_key_file_set_integer_list(key_file, group, tabs_key, tabs, length);
-	g_key_file_set_integer(key_file, group, selected_key, page_num);
-
-	save_config();
-
+	int config_part_tabs;
+	int config_part_selected_index;
+	if (!is_tabbed)
+	{
+		config_part_tabs = CP_OT_TABS;
+		config_part_selected_index = CP_OT_SELECTED;
+	}
+	else if (is_left)
+	{
+		config_part_tabs = CP_TT_LTABS;
+		config_part_selected_index = CP_TT_LSELECTED;
+	}
+	else
+	{
+		config_part_tabs = CP_TT_RTABS;
+		config_part_selected_index = CP_TT_RSELECTED;
+	}
+	
+	int *array = g_malloc((length + 1) * sizeof(int));
+	array[0] = length;
+	memcpy(array + 1, tabs, length * sizeof(int));
+	
+	pconfig_set(
+		config_part_tabs, array,
+		config_part_selected_index, page_num,
+		0
+	);
+	
 	g_free(tabs);
+	g_free(array);
 }
 
 /*
@@ -197,18 +215,32 @@
  */
 static void on_page_removed(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
 {
-	gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_tabbed = pconfig_get_tabbed();
 
-	const gchar *group = is_tabbed ? "two_panels_mode" : "one_panel_mode";
-	const gchar *tabs_key = is_tabbed ? (left ? "left_tabs" : "right_tabs") : "tabs";
-
+	int *tabs = NULL;
 	gsize length;
-	int *tabs = g_key_file_get_integer_list(key_file, group, tabs_key, &length, NULL);
-	memmove(tabs + page_num, tabs + page_num + 1, (length - page_num - 1) * sizeof(int)); 
 
-	g_key_file_set_integer_list(key_file, group, tabs_key, tabs, length - 1);
+	if (!is_tabbed)
+		tabs = pconfig_get_tabs(&length);
+	else if (is_left)
+		tabs = pconfig_get_left_tabs(&length);
+	else
+		tabs = pconfig_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)); 
+	tabs[0] = length - 1;
 	
-	save_config();
+	int config_part;
+	if (!is_tabbed)
+		config_part = CP_OT_TABS;
+	else if (is_left)
+		config_part = CP_TT_LTABS;
+	else
+		config_part = CP_TT_RTABS;
+	
+	pconfig_set(config_part, tabs, 0);
 
 	g_free(tabs);
 }
@@ -218,38 +250,23 @@
  */
 static gboolean on_change_current_page(GtkNotebook *notebook, gpointer arg1, guint arg2, gpointer user_data)
 {
-	gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+	gboolean is_tabbed = pconfig_get_tabbed();
 
-	const gchar *group = is_tabbed ? "two_panels_mode" : "one_panel_mode";
-	const gchar *selected_key = is_tabbed ? (left ? "left_selected_tab_index" : "right_selected_tab_index") : "selected_tab_index";
+	int config_part;
+	if (!is_tabbed)
+		config_part = CP_OT_SELECTED;
+	else if (is_left)
+		config_part = CP_TT_LSELECTED;
+	else
+		config_part = CP_TT_RSELECTED;
+	
+	pconfig_set(config_part, (gpointer)arg2, 0);
 
-	g_key_file_set_integer(key_file, group, selected_key, arg2);
-
-	save_config();
-
 	return TRUE;
 }
 
 /*
- *	set default values in the GKeyFile
- */
-void dpaned_set_defaults(GKeyFile *kf)
-{
-	g_key_file_set_boolean(key_file, "tabbed_mode", "enabled", FALSE);
-
-	int all_tabs[] = { TID_TARGET, TID_BREAKS, TID_LOCALS, 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_LOCALS, 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);
-}
-
-/*
  *	create GUI and check config
  */
 void dpaned_init()
@@ -259,8 +276,8 @@
 	gtk_container_set_border_width(GTK_CONTAINER(hpaned), HPANED_BORDER_WIDTH);
 	
 	/* create notebooks */
-	debug_notebook_left = gtk_notebook_new ();
-	debug_notebook_right = gtk_notebook_new ();
+	debug_notebook_left = gtk_notebook_new();
+	debug_notebook_right = gtk_notebook_new();
 
 	/* setup notebooks */
 	gtk_notebook_set_scrollable(GTK_NOTEBOOK(debug_notebook_left), TRUE);
@@ -274,29 +291,17 @@
 	gtk_paned_add1(GTK_PANED(hpaned), debug_notebook_left);
 	gtk_paned_add2(GTK_PANED(hpaned), debug_notebook_right);
 
-	/* 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);
+	/* load config */
+	pconfig_init();
 
-	key_file = g_key_file_new();
-	if (!g_key_file_load_from_file(key_file, config_path, G_KEY_FILE_NONE, NULL))
-	{
-		dpaned_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);
-	}
-	
-	is_tabbed = g_key_file_get_boolean(key_file, "tabbed_mode", "enabled", NULL);
+	gboolean is_tabbed = pconfig_get_tabbed();
 	if (is_tabbed)
 	{
 		gsize length;
 		int *tab_ids, i;
 
 		/* left */
-		tab_ids = g_key_file_get_integer_list(key_file, "two_panels_mode", "left_tabs", &length, NULL);
+		tab_ids = pconfig_get_left_tabs(&length);
 		for (i = 0; i < length; i++)
 		{
 			GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
@@ -309,7 +314,7 @@
 		g_free(tab_ids);
 
 		/* right */
-		tab_ids = g_key_file_get_integer_list(key_file, "two_panels_mode", "right_tabs", &length, NULL);
+		tab_ids = pconfig_get_right_tabs(&length);
 		for (i = 0; i < length; i++)
 		{
 			GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
@@ -323,10 +328,8 @@
 
 		gtk_widget_show_all(hpaned);
 
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left),
-			g_key_file_get_integer(key_file, "two_panels_mode", "left_selected_tab_index", NULL));
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_right),
-			g_key_file_get_integer(key_file, "two_panels_mode", "right_selected_tab_index", NULL));
+		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());
 	}
 	else
 	{
@@ -334,7 +337,7 @@
 		gtk_container_remove(GTK_CONTAINER(hpaned), debug_notebook_right);
 		
 		gsize length;
-		int *tab_ids = g_key_file_get_integer_list(key_file, "one_panel_mode", "tabs", &length, NULL);
+		int *tab_ids = pconfig_get_tabs(&length);
 		int i;
 		for (i = 0; i < length; i++)
 		{
@@ -347,12 +350,9 @@
 		}
 
 		gtk_widget_show_all(hpaned);
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left),
-			g_key_file_get_integer(key_file, "one_panel_mode", "selected_tab_index", NULL));
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), pconfig_get_selected_tab_index());
 	}
 		
-	g_free(config_dir);
-
 	CONNECT_PAGE_SIGNALS();
 	CONNECT_ALLOCATED_PAGE_SIGNALS();
 }
@@ -362,10 +362,9 @@
  */
 void dpaned_destroy()
 {
-	g_key_file_free(key_file);
-	g_free(config_path);
-	
 	DISCONNECT_PAGE_SIGNALS();
+	
+	pconfig_destroy();
 }
 
 /*
@@ -381,8 +380,6 @@
  */
 void dpaned_set_tabbed(gboolean tabbed)
 {
-	is_tabbed = tabbed;
-	
 	DISCONNECT_PAGE_SIGNALS();
 	
 	if (!tabbed)
@@ -391,7 +388,7 @@
 		gtk_container_remove(GTK_CONTAINER(hpaned), debug_notebook_right);
 		
 		gsize length;
-		int *tab_ids = g_key_file_get_integer_list(key_file, "one_panel_mode", "tabs", &length, NULL);
+		int *tab_ids = pconfig_get_tabs(&length);
 		int i;
 		for (i = 0; i < length; i++)
 		{
@@ -407,8 +404,7 @@
 			}
 		}
 
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left),
-			g_key_file_get_integer(key_file, "one_panel_mode", "selected_tab_index", NULL));
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left), pconfig_get_selected_tab_index());
 
 		gtk_widget_show_all(hpaned);
 	}
@@ -418,7 +414,7 @@
 		g_object_unref(debug_notebook_right);
 
 		gsize length;
-		int *tab_ids = g_key_file_get_integer_list(key_file, "two_panels_mode", "right_tabs", &length, NULL);
+		int *tab_ids = pconfig_get_right_tabs(&length);
 		int i;
 		for (i = 0; i < length; i++)
 		{
@@ -431,19 +427,15 @@
 				gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook_right), tab, TRUE);
 		}
 
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_left),
-			g_key_file_get_integer(key_file, "two_panels_mode", "left_selected_tab_index", NULL));
-		gtk_notebook_set_current_page(GTK_NOTEBOOK(debug_notebook_right),
-			g_key_file_get_integer(key_file, "two_panels_mode", "right_selected_tab_index", NULL));
+		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_widget_show_all(hpaned);
 	}
 	
 	CONNECT_PAGE_SIGNALS();
 
-	g_key_file_set_boolean(key_file, "tabbed_mode", "enabled", is_tabbed);
-
-	save_config();
+	pconfig_set(CP_TABBED_MODE, (gpointer)tabbed, 0);
 }
 
 /*
@@ -451,5 +443,5 @@
  */
 gboolean dpaned_get_tabbed()
 {
-	return is_tabbed;
+	return pconfig_get_tabbed();
 }

Added: trunk/geany-plugins/debugger/src/pconfig.c
===================================================================
--- trunk/geany-plugins/debugger/src/pconfig.c	                        (rev 0)
+++ trunk/geany-plugins/debugger/src/pconfig.c	2011-09-18 12:03:57 UTC (rev 2201)
@@ -0,0 +1,235 @@
+/*
+ *
+ *		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_LOCALS, 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_LOCALS, 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);
+}

Added: trunk/geany-plugins/debugger/src/pconfig.h
===================================================================
--- trunk/geany-plugins/debugger/src/pconfig.h	                        (rev 0)
+++ trunk/geany-plugins/debugger/src/pconfig.h	2011-09-18 12:03:57 UTC (rev 2201)
@@ -0,0 +1,47 @@
+/*
+ *		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();

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