SF.net SVN: geany-plugins:[2194] trunk/geany-plugins
cesspit at users.sourceforge.net
cesspit at xxxxx
Sat Sep 10 18:27:50 UTC 2011
Revision: 2194
http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2194&view=rev
Author: cesspit
Date: 2011-09-10 18:27:49 +0000 (Sat, 10 Sep 2011)
Log Message:
-----------
debugger: two panels mode
Modified Paths:
--------------
trunk/geany-plugins/debugger/src/Makefile.am
trunk/geany-plugins/debugger/src/bptree.c
trunk/geany-plugins/debugger/src/bptree.h
trunk/geany-plugins/debugger/src/breakpoints.c
trunk/geany-plugins/debugger/src/breakpoints.h
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/debug.c
trunk/geany-plugins/debugger/src/debug.h
trunk/geany-plugins/debugger/src/plugin.c
trunk/geany-plugins/debugger/src/stree.c
trunk/geany-plugins/debugger/src/stree.h
trunk/geany-plugins/debugger/src/tpage.c
trunk/geany-plugins/debugger/src/tpage.h
trunk/geany-plugins/debugger/src/utils.c
trunk/geany-plugins/debugger/src/utils.h
trunk/geany-plugins/debugger/src/vtree.c
trunk/geany-plugins/po/POTFILES.in
Added Paths:
-----------
trunk/geany-plugins/debugger/src/dpaned.c
trunk/geany-plugins/debugger/src/dpaned.h
trunk/geany-plugins/debugger/src/tabs.c
trunk/geany-plugins/debugger/src/tabs.h
Modified: trunk/geany-plugins/debugger/src/Makefile.am
===================================================================
--- trunk/geany-plugins/debugger/src/Makefile.am 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/Makefile.am 2011-09-10 18:27:49 UTC (rev 2194)
@@ -29,6 +29,8 @@
debug.h \
debug_module.c \
debug_module.h \
+ dpaned.c \
+ dpaned.h \
gui.h \
gui.c \
keys.c \
@@ -40,6 +42,8 @@
plugin.c \
stree.c \
stree.h \
+ tabs.c \
+ tabs.h \
tpage.c \
tpage.h \
utils.c \
Modified: trunk/geany-plugins/debugger/src/bptree.c
===================================================================
--- trunk/geany-plugins/debugger/src/bptree.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/bptree.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -40,17 +40,12 @@
#include "bptree.h"
#include "utils.h"
#include "dconfig.h"
+#include "tabs.h"
#include "xpm/breakpoint.xpm"
#include "xpm/breakpoint_disabled.xpm"
#include "xpm/breakpoint_condition.xpm"
-/* columns minumum width in characters */
-#define MW_CONDITION 20
-#define MW_FILE 20
-
-#define ICON_PADDING 10
-
/* Tree view columns */
enum
{
@@ -60,11 +55,11 @@
HITSCOUNT,
LINE,
ENABLED,
+ LAST_VISIBLE,
N_COLUMNS
};
/* tree view and store handles */
-static GtkWidget *scrolled_window = NULL;
static GtkWidget *tree = NULL;
static GtkTreeModel *model = NULL;
static GtkTreeStore *store = NULL;
@@ -655,7 +650,8 @@
G_TYPE_STRING,
G_TYPE_INT,
G_TYPE_INT,
- G_TYPE_BOOLEAN);
+ G_TYPE_BOOLEAN,
+ G_TYPE_STRING);
model = GTK_TREE_MODEL(store);
tree = gtk_tree_view_new_with_model (model);
@@ -671,81 +667,66 @@
/* creating columns */
GtkTreeViewColumn *column;
- const gchar *header;
-
- int char_width = get_char_width(tree);
/* icon, file */
- header = _("File");
GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
column = gtk_tree_view_column_new();
-
gtk_tree_view_column_pack_end(column, renderer, TRUE);
gtk_tree_view_column_set_attributes(column, renderer, "text", FILEPATH, NULL);
-
GtkCellRenderer *icon_renderer = gtk_cell_renderer_pixbuf_new ();
g_object_set(icon_renderer, "follow-state", TRUE, NULL);
gtk_tree_view_column_pack_end(column, icon_renderer, FALSE);
gtk_tree_view_column_set_attributes(column, icon_renderer, "pixbuf", ICON, NULL);
+ gtk_tree_view_column_set_title(column, _("Location"));
gtk_tree_view_column_set_cell_data_func(column, icon_renderer, on_render, NULL, NULL);
-
- gtk_tree_view_column_set_spacing(column, char_width);
- gtk_tree_view_column_set_expand(column, TRUE);
-
+ gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* condition */
- header = _("Condition");
condition_renderer = gtk_cell_renderer_text_new ();
g_object_set (condition_renderer, "editable", TRUE, NULL);
g_object_set (condition_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
g_signal_connect (G_OBJECT (condition_renderer), "edited", G_CALLBACK (on_condition_changed), NULL);
- column = create_column(header, condition_renderer, TRUE,
- get_header_string_width(header, MW_CONDITION, char_width),
- "text", CONDITION);
+ column = gtk_tree_view_column_new_with_attributes (_("Condition"), condition_renderer, "text", CONDITION, NULL);
gtk_tree_view_column_set_cell_data_func(column, condition_renderer, on_render, (gpointer)TRUE, NULL);
+ gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* hits count */
- header = _("Hit count");
hcount_renderer = gtk_cell_renderer_spin_new ();
GtkAdjustment* adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 100000.0, 1.0, 2.0, 2.0));
g_object_set (hcount_renderer,
"adjustment", adj,
"digits", 0, NULL);
g_signal_connect (G_OBJECT (hcount_renderer), "edited", G_CALLBACK (on_hitscount_changed), NULL);
- column = create_column(header, hcount_renderer, FALSE,
- 0,
- "text", HITSCOUNT);
+ column = gtk_tree_view_column_new_with_attributes (_("Hit count"), hcount_renderer, "text", HITSCOUNT, NULL);
gtk_tree_view_column_set_cell_data_func(column, hcount_renderer, on_render, (gpointer)TRUE, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* line */
- header = _("Line");
renderer = gtk_cell_renderer_text_new ();
- column = create_column(header, renderer, FALSE,
- 0,
- "text", LINE);
+ column = gtk_tree_view_column_new_with_attributes (_("Line"), renderer, "text", LINE, NULL);
gtk_tree_view_column_set_visible(column, FALSE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* enabled */
- header = _("Enabled");
enable_renderer = gtk_cell_renderer_toggle_new ();
g_signal_connect (G_OBJECT(enable_renderer), "toggled", G_CALLBACK(on_activeness_changed), NULL);
- column = create_column(header, enable_renderer, FALSE,
- 0,
- "active", ENABLED);
+ column = gtk_tree_view_column_new_with_attributes (_("Enabled"), enable_renderer, "active", ENABLED, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolled_window);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_NONE);
+ /* Last invisible column */
+ renderer = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", LAST_VISIBLE, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
- gtk_container_add (GTK_CONTAINER (scrolled_window), tree);
+ tab_breaks = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (tab_breaks);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (tab_breaks), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (tab_breaks), GTK_SHADOW_NONE);
+ gtk_container_add (GTK_CONTAINER (tab_breaks), tree);
+
return TRUE;
}
@@ -831,15 +812,6 @@
}
/*
- * get tree view widget
- * return value - tree view widget
- */
-GtkWidget* bptree_get_widget()
-{
- return scrolled_window;
-}
-
-/*
* add new breakpoint to the tree view
* arguments:
* bp - breakpoint to add
Modified: trunk/geany-plugins/debugger/src/bptree.h
===================================================================
--- trunk/geany-plugins/debugger/src/bptree.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/bptree.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -21,7 +21,6 @@
gboolean bptree_init(move_to_line_cb callback);
void bptree_destroy();
-GtkWidget* bptree_get_widget();
void bptree_add_breakpoint(breakpoint* bp);
void bptree_update_breakpoint(breakpoint* bp);
void bptree_remove_breakpoint(breakpoint* bp);
Modified: trunk/geany-plugins/debugger/src/breakpoints.c
===================================================================
--- trunk/geany-plugins/debugger/src/breakpoints.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/breakpoints.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -567,11 +567,3 @@
g_hash_table_foreach(files, hash_table_foreach_add_to_list, &breaks);
return breaks;
}
-
-/*
- * Get breakpoints widget
- */
-GtkWidget* breaks_get_widget()
-{
- return bptree_get_widget();
-}
Modified: trunk/geany-plugins/debugger/src/breakpoints.h
===================================================================
--- trunk/geany-plugins/debugger/src/breakpoints.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/breakpoints.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -37,7 +37,6 @@
void breaks_set_condition(char* file, int line, char* condition);
void breaks_move_to_line(char* file, int line_from, int line_to);
break_state breaks_get_state(const char* file, int line);
-GtkWidget* breaks_get_widget();
GList* breaks_get_for_document(const char* file);
GList* breaks_get_all();
Modified: trunk/geany-plugins/debugger/src/btnpanel.c
===================================================================
--- trunk/geany-plugins/debugger/src/btnpanel.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/btnpanel.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -37,6 +37,7 @@
#include "breakpoints.h"
#include "watch_model.h"
#include "wtree.h"
+#include "dpaned.h"
#include "btnpanel.h"
#define CP_BUTTONS_PAD 5
@@ -118,7 +119,7 @@
/*
* create and initialize buttons panel
*/
-GtkWidget* btnpanel_create()
+GtkWidget* btnpanel_create(on_toggle cb)
{
GtkWidget *vbox = gtk_vbox_new(FALSE, CP_BUTTONS_PAD);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 7);
@@ -179,6 +180,8 @@
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());
+ g_signal_connect(G_OBJECT(tabbtn), "toggled", G_CALLBACK(cb), NULL);
gtk_box_pack_start(GTK_BOX(vbox), tabbtn, FALSE, FALSE, 0);
optbtn = create_stock_button(GTK_STOCK_PREFERENCES, "Настройки");
Modified: trunk/geany-plugins/debugger/src/btnpanel.h
===================================================================
--- trunk/geany-plugins/debugger/src/btnpanel.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/btnpanel.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -19,7 +19,9 @@
* MA 02110-1301, USA.
*/
-GtkWidget* btnpanel_create();
+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);
Modified: trunk/geany-plugins/debugger/src/callbacks.c
===================================================================
--- trunk/geany-plugins/debugger/src/callbacks.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/callbacks.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -38,6 +38,7 @@
#include "bptree.h"
#include "btnpanel.h"
#include "dconfig.h"
+#include "tabs.h"
extern GeanyFunctions *geany_functions;
@@ -358,9 +359,9 @@
if (DBS_STOPPED == debug_get_state() && debug_current_instruction_have_sources())
{
debug_jump_to_current_instruction();
- gtk_widget_set_sensitive(stree_get_widget(), FALSE);
+ gtk_widget_set_sensitive(tab_call_stack, FALSE);
stree_select_first();
- gtk_widget_set_sensitive(stree_get_widget(), TRUE);
+ gtk_widget_set_sensitive(tab_call_stack, TRUE);
}
}
}
Modified: trunk/geany-plugins/debugger/src/debug.c
===================================================================
--- trunk/geany-plugins/debugger/src/debug.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/debug.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -60,6 +60,7 @@
#include "bptree.h"
#include "btnpanel.h"
#include "dconfig.h"
+#include "tabs.h"
/*
* calltip size
@@ -110,9 +111,6 @@
/* debug terminal widget */
GtkWidget *terminal = NULL;
-/* pointer to the debug notebook widget */
-static GtkWidget* debug_notebook = NULL;
-
/* GtkTextView to put debugger messages */
static GtkWidget *debugger_messages_textview = NULL;
@@ -867,12 +865,9 @@
/*
* init debug related GUI (watch tree view)
* arguments:
- * nb - GtkNotebook to add watch page
*/
-void debug_init(GtkWidget* nb)
+void debug_init()
{
- debug_notebook = nb;
-
/* create watch page */
wtree = wtree_init(on_watch_expanded_callback,
on_watch_dragged_callback,
@@ -882,47 +877,37 @@
wmodel = gtk_tree_view_get_model(GTK_TREE_VIEW(wtree));
wstore = GTK_TREE_STORE(wmodel);
- GtkWidget *sview = gtk_scrolled_window_new(
+ tab_watch = gtk_scrolled_window_new(
gtk_tree_view_get_hadjustment(GTK_TREE_VIEW(wtree)),
gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(wtree))
);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sview),
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tab_watch),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(sview), wtree);
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- sview,
- gtk_label_new(_("Watch")));
+ gtk_container_add(GTK_CONTAINER(tab_watch), wtree);
/* create locals page */
ltree = ltree_init(on_watch_expanded_callback, on_watch_button_pressed_callback);
- sview = gtk_scrolled_window_new(
+ tab_locals = gtk_scrolled_window_new(
gtk_tree_view_get_hadjustment(GTK_TREE_VIEW(ltree)),
gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(ltree))
);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sview),
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tab_locals),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(sview), ltree);
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- sview,
- gtk_label_new(_("Locals")));
-
+ gtk_container_add(GTK_CONTAINER(tab_locals), ltree);
+
/* create stack trace page */
- stree_init(editor_open_position);
- stree = stree_get_widget();
- sview = gtk_scrolled_window_new(
+ stree = stree_init(editor_open_position);
+ tab_call_stack = gtk_scrolled_window_new(
gtk_tree_view_get_hadjustment(GTK_TREE_VIEW(stree )),
gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(stree ))
);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sview),
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tab_call_stack),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(sview), stree);
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- sview,
- gtk_label_new(_("Call Stack")));
-
+ gtk_container_add(GTK_CONTAINER(tab_call_stack), stree);
+
/* create debug terminal page */
terminal = vte_terminal_new();
/* create PTY */
@@ -934,10 +919,10 @@
vte_terminal_set_pty(VTE_TERMINAL(terminal), pty_master);
GtkWidget *scrollbar = gtk_vscrollbar_new(GTK_ADJUSTMENT(VTE_TERMINAL(terminal)->adjustment));
GTK_WIDGET_UNSET_FLAGS(scrollbar, GTK_CAN_FOCUS);
- GtkWidget *_frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type (GTK_FRAME(_frame), GTK_SHADOW_NONE);
+ tab_terminal = gtk_frame_new(NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME(tab_terminal), GTK_SHADOW_NONE);
GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(_frame), hbox);
+ gtk_container_add(GTK_CONTAINER(tab_terminal), hbox);
gtk_box_pack_start(GTK_BOX(hbox), terminal, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), scrollbar, FALSE, FALSE, 0);
/* set the default widget size first to prevent VTE expanding too much,
@@ -950,26 +935,20 @@
g_key_file_load_from_file(config, configfile, G_KEY_FILE_NONE, NULL);
gchar *font = utils_get_setting_string(config, "VTE", "font", "Monospace 10");
vte_terminal_set_font_from_string (VTE_TERMINAL(terminal), font);
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- _frame,
- gtk_label_new(_("Debug terminal")));
/* debug messages page */
- sview = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sview),
+ tab_messages = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tab_messages),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
- hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(sview));
- vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(sview));
+ hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(tab_messages));
+ vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(tab_messages));
debugger_messages_textview = gtk_text_view_new();
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(debugger_messages_textview), GTK_WRAP_CHAR);
gtk_text_view_set_editable (GTK_TEXT_VIEW (debugger_messages_textview), FALSE);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sview), debugger_messages_textview);
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- sview,
- gtk_label_new(_("Debugger messages")));
-
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tab_messages), debugger_messages_textview);
+
/* create tex tags */
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(debugger_messages_textview));
gtk_text_buffer_create_tag(buffer, "black", "foreground", "#000000", NULL);
@@ -980,8 +959,6 @@
gtk_text_buffer_create_tag(buffer, "yellow", "foreground", "#FFFF00", NULL);
gtk_text_buffer_create_tag(buffer, "brown", "foreground", "#BB8915", NULL);
gtk_text_buffer_create_tag(buffer, "rose", "foreground", "#BA92B7", NULL);
-
- gtk_widget_show_all(debug_notebook);
}
/*
Modified: trunk/geany-plugins/debugger/src/debug.h
===================================================================
--- trunk/geany-plugins/debugger/src/debug.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/debug.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -34,8 +34,8 @@
/* function type to execute on interrupt */
typedef void (*bs_callback)(breakpoint*, break_set_activity);
-void debug_init(GtkWidget* nb);
-enum dbs debug_get_state();
+void debug_init();
+enum dbs debug_get_state();
void debug_run();
void debug_stop();
void debug_step_over();
Added: trunk/geany-plugins/debugger/src/dpaned.c
===================================================================
--- trunk/geany-plugins/debugger/src/dpaned.c (rev 0)
+++ trunk/geany-plugins/debugger/src/dpaned.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -0,0 +1,456 @@
+/*
+ *
+ * dpaned.c
+ *
+ * Copyright 2010 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.
+ */
+
+/*
+ * Working with debug paned.
+ */
+
+#include <sys/stat.h>
+
+#include <memory.h>
+#include <string.h>
+
+#include "geanyplugin.h"
+extern GeanyFunctions *geany_functions;
+extern GeanyData *geany_data;
+
+#include "tabs.h"
+#include "breakpoint.h"
+#include "breakpoints.h"
+#include "debug.h"
+#include "btnpanel.h"
+#include "stree.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); \
+ 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); \
+ add_right_handler_id = g_signal_connect(G_OBJECT(debug_notebook_right), "page-added", G_CALLBACK(on_page_added), NULL); \
+ remove_left_handler_id = g_signal_connect(G_OBJECT(debug_notebook_left), "page-removed", G_CALLBACK(on_page_removed), NULL); \
+ 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), 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); \
+ g_signal_handler_disconnect(G_OBJECT(debug_notebook_right), add_right_handler_id); \
+ g_signal_handler_disconnect(G_OBJECT(debug_notebook_left), remove_left_handler_id); \
+ g_signal_handler_disconnect(G_OBJECT(debug_notebook_right), remove_right_handler_id);
+
+#define CONNECT_ALLOCATED_PAGE_SIGNALS(X) \
+ allocate_handler_id = g_signal_connect(G_OBJECT(hpaned), "size-allocate", G_CALLBACK(on_size_allocate), NULL);
+
+#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;
+
+/* left and right notebooks */
+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 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
+ */
+void on_size_allocate(GtkWidget *widget,GdkRectangle *allocation, gpointer user_data)
+{
+ DISCONNECT_ALLOCATED_PAGE_SIGNALS();
+
+ int position = (allocation->width - 2 * HPANED_BORDER_WIDTH) * 0.5;
+ gtk_paned_set_position(GTK_PANED(hpaned), position);
+}
+
+/*
+ * page added event handler
+ */
+static void on_page_added(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
+{
+ gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+
+ const gchar *group = is_tabbed ? "two_panels_mode" : "one_panel_mode";
+ const gchar *tabs_key = is_tabbed ? (left ? "left_tabs" : "right_tabs") : "tabs";
+
+ 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));
+ 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);
+ 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);
+
+ save_config();
+
+ g_free(tabs);
+ g_free(new_tabs);
+}
+
+/*
+ * page reordered event handler
+ */
+static void on_page_reordered(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
+{
+ gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+
+ 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";
+
+ gsize length;
+ int *tabs = g_key_file_get_integer_list(key_file, group, tabs_key, &length, NULL);
+
+ int prev_index;
+ GtkWidget *page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(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++)
+ {
+ if (id == tabs[prev_index])
+ {
+ break;
+ }
+ }
+
+ int i, min = MIN(prev_index, page_num), max = MAX(prev_index, page_num);
+ for (i = min; i < max; i++)
+ {
+ int tmp = tabs[i];
+ tabs[i] = tabs[i + 1];
+ 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();
+
+ g_free(tabs);
+}
+
+/*
+ * page removed event handler
+ */
+static void on_page_removed(GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
+{
+ gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+
+ const gchar *group = is_tabbed ? "two_panels_mode" : "one_panel_mode";
+ const gchar *tabs_key = is_tabbed ? (left ? "left_tabs" : "right_tabs") : "tabs";
+
+ 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);
+
+ save_config();
+
+ g_free(tabs);
+}
+
+/*
+ * active page changed event handler
+ */
+static gboolean on_change_current_page(GtkNotebook *notebook, gpointer arg1, guint arg2, gpointer user_data)
+{
+ gboolean left = (GTK_NOTEBOOK(debug_notebook_left) == notebook);
+
+ 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";
+
+ 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()
+{
+ /* 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 ();
+ debug_notebook_right = gtk_notebook_new ();
+
+ /* setup notebooks */
+ gtk_notebook_set_scrollable(GTK_NOTEBOOK(debug_notebook_left), TRUE);
+ gtk_notebook_set_scrollable(GTK_NOTEBOOK(debug_notebook_right), TRUE);
+ gtk_notebook_set_group_id(GTK_NOTEBOOK(debug_notebook_left), NOTEBOOK_GROUP);
+ gtk_notebook_set_group_id (GTK_NOTEBOOK(debug_notebook_right), NOTEBOOK_GROUP);
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK(debug_notebook_left), GTK_POS_TOP);
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK(debug_notebook_right), GTK_POS_TOP);
+
+ /* add notebooks */
+ 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);
+
+ 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);
+ 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);
+ for (i = 0; i < length; i++)
+ {
+ GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
+ gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook_left),
+ tab,
+ gtk_label_new(tabs_get_label(tab_ids[i])));
+ gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(debug_notebook_left), tab, TRUE);
+ gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook_left), tab, TRUE);
+ }
+ g_free(tab_ids);
+
+ /* right */
+ tab_ids = g_key_file_get_integer_list(key_file, "two_panels_mode", "right_tabs", &length, NULL);
+ for (i = 0; i < length; i++)
+ {
+ GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
+ gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook_right),
+ tab,
+ gtk_label_new(tabs_get_label(tab_ids[i])));
+ gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(debug_notebook_right), tab, TRUE);
+ gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook_right), tab, TRUE);
+ }
+ g_free(tab_ids);
+
+ 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));
+ }
+ else
+ {
+ g_object_ref(debug_notebook_right);
+ 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 i;
+ for (i = 0; i < length; i++)
+ {
+ GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
+ gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook_left),
+ tab,
+ gtk_label_new(tabs_get_label(tab_ids[i])));
+ gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(debug_notebook_left), tab, TRUE);
+ gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook_left), tab, TRUE);
+ }
+
+ 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));
+ }
+
+ g_free(config_dir);
+
+ CONNECT_PAGE_SIGNALS();
+ CONNECT_ALLOCATED_PAGE_SIGNALS();
+}
+
+/*
+ * free local data, disconnect signals
+ */
+void dpaned_destroy()
+{
+ g_key_file_free(key_file);
+ g_free(config_path);
+
+ DISCONNECT_PAGE_SIGNALS();
+}
+
+/*
+ * gets widget
+ */
+GtkWidget* dpaned_get_paned()
+{
+ return hpaned;
+}
+
+/*
+ * sets tabs mode
+ */
+void dpaned_set_tabbed(gboolean tabbed)
+{
+ is_tabbed = tabbed;
+
+ DISCONNECT_PAGE_SIGNALS();
+
+ if (!tabbed)
+ {
+ g_object_ref(debug_notebook_right);
+ 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 i;
+ for (i = 0; i < length; i++)
+ {
+ GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
+ if (-1 == gtk_notebook_page_num(GTK_NOTEBOOK(debug_notebook_left), tab))
+ {
+ g_object_ref(tab);
+ gtk_container_remove(GTK_CONTAINER(debug_notebook_right), tab);
+ gtk_notebook_insert_page(GTK_NOTEBOOK(debug_notebook_left), tab, gtk_label_new(tabs_get_label(tab_ids[i])), i);
+ g_object_unref(tab);
+ gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(debug_notebook_left), tab, TRUE);
+ gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook_left), tab, TRUE);
+ }
+ }
+
+ 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_widget_show_all(hpaned);
+ }
+ else
+ {
+ gtk_paned_add2(GTK_PANED(hpaned), debug_notebook_right);
+ 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 i;
+ for (i = 0; i < length; i++)
+ {
+ GtkWidget *tab = tabs_get_tab((tab_id)tab_ids[i]);
+ g_object_ref(tab);
+ gtk_container_remove(GTK_CONTAINER(debug_notebook_left), tab);
+ gtk_notebook_insert_page(GTK_NOTEBOOK(debug_notebook_right), tab, gtk_label_new(tabs_get_label(tab_ids[i])), i);
+ g_object_unref(tab);
+ gtk_notebook_set_tab_detachable(GTK_NOTEBOOK(debug_notebook_right), tab, TRUE);
+ 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_widget_show_all(hpaned);
+ }
+
+ CONNECT_PAGE_SIGNALS();
+
+ g_key_file_set_boolean(key_file, "tabbed_mode", "enabled", is_tabbed);
+
+ save_config();
+}
+
+/*
+ * gets tabbed mode state
+ */
+gboolean dpaned_get_tabbed()
+{
+ return is_tabbed;
+}
Added: trunk/geany-plugins/debugger/src/dpaned.h
===================================================================
--- trunk/geany-plugins/debugger/src/dpaned.h (rev 0)
+++ trunk/geany-plugins/debugger/src/dpaned.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -0,0 +1,27 @@
+/*
+ *
+ * dpaned.c
+ *
+ * Copyright 2010 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.
+ */
+
+void dpaned_init();
+void dpaned_destroy();
+GtkWidget* dpaned_get_paned();
+void dpaned_set_tabbed(gboolean paned);
+gboolean dpaned_get_tabbed();
Modified: trunk/geany-plugins/debugger/src/plugin.c
===================================================================
--- trunk/geany-plugins/debugger/src/plugin.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/plugin.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -37,6 +37,8 @@
#include "btnpanel.h"
#include "keys.h"
#include "dconfig.h"
+#include "dpaned.h"
+#include "tabs.h"
/* These items are set by Geany before plugin_init() is called. */
GeanyPlugin *geany_plugin;
@@ -74,6 +76,12 @@
{ NULL, NULL, FALSE, NULL }
};
+void on_paned_mode_changed(GtkToggleButton *button, gpointer user_data)
+{
+ gboolean state = gtk_toggle_button_get_active(button);
+ dpaned_set_tabbed(state);
+}
+
/* Called by Geany to initialize the plugin.
* Note: data is the same as geany_data. */
void plugin_init(GeanyData *data)
@@ -84,37 +92,27 @@
/* main box */
hbox = gtk_hbox_new(FALSE, 0);
-
- GtkWidget *debug_notebook = gtk_notebook_new ();
- gtk_notebook_set_tab_pos(GTK_NOTEBOOK(debug_notebook), GTK_POS_TOP);
/* add target page */
tpage_init();
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- tpage_get_widget(),
- gtk_label_new(_("Target")));
- gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook), tpage_get_widget(), TRUE);
/* init brekpoints */
breaks_init(editor_open_position);
- gtk_notebook_append_page(GTK_NOTEBOOK(debug_notebook),
- breaks_get_widget(),
- gtk_label_new(_("Breakpoints")));
- gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(debug_notebook), breaks_get_widget(), TRUE);
-
+
/* init markers */
markers_init();
/* init debug */
- debug_init(debug_notebook);
+ debug_init();
- gtk_widget_show_all(debug_notebook);
+ /* init paned */
+ dpaned_init();
- GtkWidget* vbox = btnpanel_create();
+ GtkWidget* vbox = btnpanel_create(on_paned_mode_changed);
- gtk_box_pack_start(GTK_BOX(hbox), debug_notebook, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), dpaned_get_paned(), TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
-
+
gtk_widget_show_all(hbox);
gtk_notebook_append_page(
@@ -164,6 +162,9 @@
/* clears config */
dconfig_destroy();
+ /* clears debug paned data */
+ dpaned_destroy();
+
/* release other allocated strings and objects */
gtk_widget_destroy(hbox);
}
Modified: trunk/geany-plugins/debugger/src/stree.c
===================================================================
--- trunk/geany-plugins/debugger/src/stree.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/stree.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -36,14 +36,8 @@
#include "xpm/frame_current.xpm"
-/* columns minumum width in characters */
-#define MW_ADRESS 10
-#define MW_FUNCTION 10
-#define MW_FILE 0
-#define MW_LINE 4
+#define ARROW_PADDING 7
-#define ARROW_PADDING 10
-
/* Tree view columns */
enum
{
@@ -52,6 +46,7 @@
S_FUNCTION,
S_FILEPATH,
S_LINE,
+ S_LAST_VISIBLE,
S_N_COLUMNS
};
@@ -66,6 +61,8 @@
static GtkTreeModel* model = NULL;
static GtkListStore* store = NULL;
+static GtkCellRenderer *renderer_arrow, *renderer_address, *renderer_funtion, *renderer_file, *renderer_line, *renderer_last;
+
/* flag to indicate whether to handle selection change */
static gboolean handle_selection = TRUE;
@@ -160,7 +157,7 @@
* arguments:
* cb - callback to call on double click
*/
-gboolean stree_init(move_to_line_cb cb)
+GtkWidget* stree_init(move_to_line_cb cb)
{
callback = cb;
@@ -173,7 +170,9 @@
G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_STRING,
- G_TYPE_INT);
+ G_TYPE_INT,
+ G_TYPE_STRING);
+
model = GTK_TREE_MODEL(store);
tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
@@ -190,51 +189,43 @@
G_CALLBACK(on_msgwin_button_press), NULL);
/* creating columns */
- GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
- const gchar *header;
-
- int char_width = get_char_width(tree);
/* arrow */
- renderer = gtk_cell_renderer_pixbuf_new ();
- column = create_column("", renderer, FALSE,
- gdk_pixbuf_get_width(arrow_pixbuf) + 2 * ARROW_PADDING,
- "pixbuf", S_ARROW);
+ renderer_arrow = gtk_cell_renderer_pixbuf_new ();
+ column = gtk_tree_view_column_new_with_attributes ("", renderer_arrow, "pixbuf", S_ARROW, NULL);
+ gtk_tree_view_column_set_min_width(column, gdk_pixbuf_get_width(arrow_pixbuf) + 2 * ARROW_PADDING);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
- /* adress */
- header = _("Address");
- renderer = gtk_cell_renderer_text_new ();
- column = create_column(header, renderer, FALSE,
- get_header_string_width(header, MW_ADRESS, char_width),
- "text", S_ADRESS);
+ /* address */
+ renderer_address = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (_("Address"), renderer_address, "text", S_ADRESS, NULL);
+ gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* function */
- header = _("Function");
- renderer = gtk_cell_renderer_text_new ();
- column = create_column(header, renderer, FALSE,
- get_header_string_width(header, MW_FUNCTION, char_width),
- "text", S_FUNCTION);
+ renderer_funtion = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (_("Function"), renderer_funtion, "text", S_FUNCTION, NULL);
+ gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* file */
- header = _("File");
- renderer = gtk_cell_renderer_text_new ();
- column = create_column(header, renderer, TRUE,
- get_header_string_width(header, MW_FILE, char_width),
- "text", S_FILEPATH);
+ renderer_file = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (_("File"), renderer_file, "text", S_FILEPATH, NULL);
+ gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* line */
- header = _("Line");
- renderer = gtk_cell_renderer_text_new ();
- column = create_column(header, renderer, FALSE,
- get_header_string_width(header, MW_LINE, char_width),
- "text", S_LINE);
+ renderer_line = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes (_("Line"), renderer_line, "text", S_LINE, NULL);
+ gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+ /* Last invisible column */
+ renderer_last = gtk_cell_renderer_text_new ();
+ column = gtk_tree_view_column_new_with_attributes ("", renderer_last, "text", S_LAST_VISIBLE, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+
/* create frames hash table */
frames = g_hash_table_new_full(
g_str_hash,
@@ -242,14 +233,6 @@
(GDestroyNotify)g_free,
NULL);
- return TRUE;
-}
-
-/*
- * get stack trace tree view
- */
-GtkWidget* stree_get_widget()
-{
return tree;
}
Modified: trunk/geany-plugins/debugger/src/stree.h
===================================================================
--- trunk/geany-plugins/debugger/src/stree.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/stree.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -19,10 +19,9 @@
* MA 02110-1301, USA.
*/
-gboolean stree_init(move_to_line_cb cb);
-void stree_destroy();
-GtkWidget* stree_get_widget();
-void stree_add(frame *f, gboolean first);
-void stree_clear();
-void stree_select_first();
+GtkWidget* stree_init(move_to_line_cb cb);
+void stree_destroy();
+void stree_add(frame *f, gboolean first);
+void stree_clear();
+void stree_select_first();
Added: trunk/geany-plugins/debugger/src/tabs.c
===================================================================
--- trunk/geany-plugins/debugger/src/tabs.c (rev 0)
+++ trunk/geany-plugins/debugger/src/tabs.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -0,0 +1,150 @@
+/*
+ *
+ * tabs.c
+ *
+ * Copyright 2010 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.
+ */
+
+/*
+ * tabs widgets
+ */
+
+#include "geanyplugin.h"
+extern GeanyFunctions *geany_functions;
+extern GeanyData *geany_data;
+
+#include "tabs.h"
+
+/* tab widgets */
+GtkWidget *tab_target = NULL;
+GtkWidget *tab_breaks = NULL;
+GtkWidget *tab_watch = NULL;
+GtkWidget *tab_locals = NULL;
+GtkWidget *tab_call_stack = NULL;
+GtkWidget *tab_terminal = NULL;
+GtkWidget *tab_messages = NULL;
+
+/*
+ * searches ID for a given widget
+ * arguments:
+ * tab - widget to search an id for
+ */
+tab_id tabs_get_tab_id(GtkWidget* tab)
+{
+ tab_id id;
+ if (tab_target == tab)
+ {
+ id = TID_TARGET;
+ }
+ else if (tab_breaks == tab)
+ {
+ id = TID_BREAKS;
+ }
+ else if (tab_watch == tab)
+ {
+ id = TID_WATCH;
+ }
+ else if (tab_locals == tab)
+ {
+ id = TID_LOCALS;
+ }
+ else if (tab_call_stack == tab)
+ {
+ id = TID_STACK;
+ }
+ else if (tab_terminal == tab)
+ {
+ id = TID_TERMINAL;
+ }
+ else if (tab_messages == tab)
+ {
+ id = TID_MESSAGES;
+ }
+
+ return id;
+}
+
+/*
+ * searches a widget for a given ID
+ * arguments:
+ * id - ID to search a widget for
+ */
+GtkWidget* tabs_get_tab(tab_id id)
+{
+ GtkWidget *tab = NULL;
+ switch(id)
+ {
+ case TID_TARGET:
+ tab = tab_target;
+ break;
+ case TID_BREAKS:
+ tab = tab_breaks;
+ break;
+ case TID_WATCH:
+ tab = tab_watch;
+ break;
+ case TID_LOCALS:
+ tab = tab_locals;
+ break;
+ case TID_STACK:
+ tab = tab_call_stack;
+ break;
+ case TID_TERMINAL:
+ tab = tab_terminal;
+ break;
+ case TID_MESSAGES:
+ tab = tab_messages;
+ break;
+ }
+ return tab;
+}
+
+/*
+ * searches a label for a given ID
+ * arguments:
+ * id - ID to search a label for
+ */
+const gchar* tabs_get_label(tab_id id)
+{
+ const gchar *label = NULL;
+ switch(id)
+ {
+ case TID_TARGET:
+ label = _("Target");
+ break;
+ case TID_BREAKS:
+ label = _("Breakpoints");
+ break;
+ case TID_WATCH:
+ label = _("Watch");
+ break;
+ case TID_LOCALS:
+ label = _("Locals");
+ break;
+ case TID_STACK:
+ label = _("Call Stack");
+ break;
+ case TID_TERMINAL:
+ label = _("Debug terminal");
+ break;
+ case TID_MESSAGES:
+ label = _("Debugger messages");
+ break;
+ }
+ return label;
+}
Added: trunk/geany-plugins/debugger/src/tabs.h
===================================================================
--- trunk/geany-plugins/debugger/src/tabs.h (rev 0)
+++ trunk/geany-plugins/debugger/src/tabs.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -0,0 +1,45 @@
+/*
+ *
+ * tabs.c
+ *
+ * Copyright 2010 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.
+ */
+
+typedef enum _tab_id
+{
+ TID_TARGET,
+ TID_BREAKS,
+ TID_WATCH,
+ TID_LOCALS,
+ TID_STACK,
+ TID_TERMINAL,
+ TID_MESSAGES
+} tab_id;
+
+extern GtkWidget *tab_target;
+extern GtkWidget *tab_breaks;
+extern GtkWidget *tab_watch;
+extern GtkWidget *tab_locals;
+extern GtkWidget *tab_call_stack;
+extern GtkWidget *tab_terminal;
+extern GtkWidget *tab_messages;
+
+GtkWidget* tabs_get_tab(tab_id id);
+tab_id tabs_get_tab_id(GtkWidget* tab);
+const gchar* tabs_get_label(tab_id id);
+
Modified: trunk/geany-plugins/debugger/src/tpage.c
===================================================================
--- trunk/geany-plugins/debugger/src/tpage.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/tpage.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -41,6 +41,7 @@
#include "debug.h"
#include "dconfig.h"
#include "tpage.h"
+#include "tabs.h"
/* boxes margins */
#define SPACING 5
@@ -54,6 +55,7 @@
{
NAME,
VALUE,
+ LAST_VISIBLE,
N_COLUMNS
};
@@ -66,9 +68,6 @@
/* reference to the env tree view empty row */
static GtkTreeRowReference *empty_row = NULL;
-/* page widget */
-static GtkWidget *page = NULL;
-
/* target name textentry */
static GtkWidget *targetname = NULL;
@@ -585,7 +584,7 @@
*/
void tpage_init()
{
- page = gtk_hbox_new(FALSE, 0);
+ tab_target = gtk_hbox_new(FALSE, 0);
GtkWidget *lbox = gtk_vbox_new(FALSE, SPACING);
GtkWidget *mbox = gtk_vbox_new(FALSE, SPACING);
@@ -667,36 +666,34 @@
store = gtk_list_store_new (
N_COLUMNS,
G_TYPE_STRING,
+ G_TYPE_STRING,
G_TYPE_STRING);
+
model = GTK_TREE_MODEL(store);
envtree = gtk_tree_view_new_with_model (model);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(envtree), TRUE);
g_object_set(envtree, "rules-hint", TRUE, NULL);
g_signal_connect(G_OBJECT(envtree), "key-press-event", G_CALLBACK (on_envtree_keypressed), NULL);
- const gchar *header;
- int char_width = get_char_width(envtree);
-
- header = _("Name");
renderer_name = gtk_cell_renderer_text_new ();
g_object_set (renderer_name, "editable", TRUE, NULL);
g_signal_connect (G_OBJECT (renderer_name), "edited", G_CALLBACK (on_name_changed), NULL);
- column_name = create_column(header, renderer_name, FALSE,
- get_header_string_width(header, MW_NAME, char_width),
- "text", NAME);
+ column_name = gtk_tree_view_column_new_with_attributes (_("Name"), renderer_name, "text", NAME, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (envtree), column_name);
- header = _("Value");
renderer_value = gtk_cell_renderer_text_new ();
- column_value = create_column(header, renderer_value, TRUE,
- get_header_string_width(header, MW_VALUE, char_width),
- "text", VALUE);
+ column_name = gtk_tree_view_column_new_with_attributes (_("Value"), renderer_name, "text", VALUE, NULL);
g_signal_connect (G_OBJECT (renderer_value), "edited", G_CALLBACK (on_value_changed), NULL);
g_signal_connect (G_OBJECT (renderer_value), "editing-started", G_CALLBACK (on_value_editing_started), NULL);
g_signal_connect (G_OBJECT (renderer_value), "editing-canceled", G_CALLBACK (on_value_editing_cancelled), NULL);
gtk_tree_view_column_set_cell_data_func(column_value, renderer_value, on_render_value, NULL, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (envtree), column_value);
+ /* Last invisible column */
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+ GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", LAST_VISIBLE, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (envtree), column);
+
/* add empty row */
add_empty_row();
@@ -711,18 +708,10 @@
gtk_box_pack_start(GTK_BOX(hombox), lbox, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hombox), mbox, TRUE, TRUE, 0);
- gtk_box_pack_start(GTK_BOX(page), hombox, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(tab_target), hombox, TRUE, TRUE, 0);
}
/*
- * get page widget
- */
-GtkWidget* tpage_get_widget()
-{
- return page;
-}
-
-/*
* set the page readonly
*/
void tpage_set_readonly(gboolean readonly)
Modified: trunk/geany-plugins/debugger/src/tpage.h
===================================================================
--- trunk/geany-plugins/debugger/src/tpage.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/tpage.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -20,7 +20,6 @@
*/
void tpage_init();
-GtkWidget* tpage_get_widget();
gchar* tpage_get_target();
void tpage_set_target(const gchar *newvalue);
Modified: trunk/geany-plugins/debugger/src/utils.c
===================================================================
--- trunk/geany-plugins/debugger/src/utils.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/utils.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -35,53 +35,7 @@
#include "geanyplugin.h"
extern GeanyFunctions *geany_functions;
-/* character to calculate width */
-#define CHAR_TESTED "W"
-
/*
- * get character width in a widget
- */
-int get_char_width(GtkWidget *widget)
-{
- PangoLayout *playout = pango_layout_new(gtk_widget_get_pango_context(widget));
-
- int width, height;
-
- pango_layout_set_text(playout, CHAR_TESTED, -1);
- pango_layout_get_pixel_size (playout, &width, &height);
-
- g_object_unref(playout);
-
- return width;
-}
-
-/*
- * get string width if string length is bigger than minwidth or minwidth * char_width
- */
-int get_header_string_width(const gchar *header, int minchars, int char_width)
-{
- int header_length = strlen(header);
- int width = (header_length > minchars ? header_length : minchars) * char_width;
- return width;
-}
-
-/*
- * create tree view column
- */
-GtkTreeViewColumn *create_column(const gchar *name, GtkCellRenderer *renderer, gboolean expandable, gint minwidth, const char *arg, int value)
-{
- GtkTreeViewColumn *column =
- gtk_tree_view_column_new_with_attributes (name, renderer, arg, value, NULL);
-
- if (expandable)
- gtk_tree_view_column_set_expand(column, expandable);
- else if (minwidth)
- gtk_tree_view_column_set_min_width(column, minwidth);
-
- return column;
-}
-
-/*
* opens position in a editor
*/
void editor_open_position(char* file, int line)
Modified: trunk/geany-plugins/debugger/src/utils.h
===================================================================
--- trunk/geany-plugins/debugger/src/utils.h 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/utils.h 2011-09-10 18:27:49 UTC (rev 2194)
@@ -20,7 +20,4 @@
*/
void editor_open_position(char* file, int line);
-int get_char_width(GtkWidget *widget);
-int get_header_string_width(const gchar *header, int minchars, int char_width);
-GtkTreeViewColumn* create_column(const gchar *name, GtkCellRenderer *renderer, gboolean expandable, gint minwidth, const char *arg, int value);
GString* get_word_at_position(ScintillaObject *sci, int position);
Modified: trunk/geany-plugins/debugger/src/vtree.c
===================================================================
--- trunk/geany-plugins/debugger/src/vtree.c 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/debugger/src/vtree.c 2011-09-10 18:27:49 UTC (rev 2194)
@@ -116,17 +116,10 @@
/* create columns */
GtkCellRenderer *renderer;
GtkTreeViewColumn *column;
- const gchar *header;
- int min_column_with = MIN_COLUMN_CHARS * get_char_width(tree);
-
/* Name */
- header = _("Name");
renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- column = create_column(header, renderer, FALSE,
- min_column_with,
- "text", W_NAME);
+ column = gtk_tree_view_column_new_with_attributes (_("Name"), renderer, "text", W_NAME, NULL);
gtk_tree_view_column_set_resizable (column, TRUE);
if (on_render_name)
gtk_tree_view_column_set_cell_data_func(column, renderer, on_render_name, NULL, NULL);
@@ -138,33 +131,22 @@
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* Value */
- header = _("Value");
renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- column = create_column(header, renderer, TRUE,
- min_column_with,
- "text", W_VALUE);
+ column = gtk_tree_view_column_new_with_attributes (_("Value"), renderer, "text", W_VALUE, NULL);
gtk_tree_view_column_set_cell_data_func(column, renderer, render_value, NULL, NULL);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* Type */
- header = _("Type");
renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
- column = create_column(header, renderer, FALSE,
- min_column_with,
- "text", W_TYPE);
+ column = gtk_tree_view_column_new_with_attributes (_("Type"), renderer, "text", W_TYPE, NULL);
gtk_tree_view_column_set_resizable (column, TRUE);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* Last invisible column */
- header = _("");
renderer = gtk_cell_renderer_text_new ();
- column = create_column(header, renderer, FALSE,
- 0,
- "text", W_LAST_VISIBLE);
+ column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", W_LAST_VISIBLE, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
/* Internal (unvisible column) */
Modified: trunk/geany-plugins/po/POTFILES.in
===================================================================
--- trunk/geany-plugins/po/POTFILES.in 2011-09-04 11:16:10 UTC (rev 2193)
+++ trunk/geany-plugins/po/POTFILES.in 2011-09-10 18:27:49 UTC (rev 2194)
@@ -30,6 +30,7 @@
debugger/src/ltree.c
debugger/src/utils.c
debugger/src/stree.c
+debugger/src/tabs.c
debugger/src/keys.c
debugger/src/markers.c
debugger/src/watch_model.c
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