[geany/geany-plugins] ca9abb: debugger: Allow to switch active thread
Colomban Wendling
git-noreply at xxxxx
Mon Feb 8 23:50:49 UTC 2016
Branch: refs/heads/master
Author: Colomban Wendling <ban at herbesfolles.org>
Committer: Colomban Wendling <ban at herbesfolles.org>
Date: Mon, 08 Feb 2016 23:50:49 UTC
Commit: ca9abb6cddbce6cb093b7feddd79e0473edeb663
https://github.com/geany/geany-plugins/commit/ca9abb6cddbce6cb093b7feddd79e0473edeb663
Log Message:
-----------
debugger: Allow to switch active thread
Add support for switching to another thread by clicking on it on the
Call Stack tree.
Modified Paths:
--------------
debugger/src/breakpoints.h
debugger/src/debug.c
debugger/src/stree.c
debugger/src/stree.h
Modified: debugger/src/breakpoints.h
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -33,6 +33,7 @@ typedef enum _break_state {
} break_state;
typedef void (*move_to_line_cb)(const char* file, int line);
+typedef void (*select_thread_cb)(int thread_id);
typedef void (*select_frame_cb)(int frame_number);
gboolean breaks_init(move_to_line_cb callback);
Modified: debugger/src/debug.c
31 lines changed, 30 insertions(+), 1 deletions(-)
===================================================================
@@ -960,6 +960,35 @@ static void on_select_frame(int frame_number)
}
/*
+ * called when a thread should been selected
+ */
+static void on_select_thread(int thread_id)
+{
+ gboolean success;
+
+ if (stack)
+ remove_stack_markers();
+
+ if ((success = active_module->set_active_thread(thread_id)))
+ {
+ g_list_free_full(stack, (GDestroyNotify)frame_unref);
+ stack = active_module->get_stack();
+
+ /* update the stack tree */
+ stree_remove_frames();
+ stree_set_active_thread_id(thread_id);
+ stree_add(stack);
+ stree_select_first_frame(TRUE);
+ }
+
+ if (stack)
+ add_stack_markers();
+
+ if (success)
+ on_select_frame(0);
+}
+
+/*
* init debug related GUI (watch tree view)
* arguments:
*/
@@ -1002,7 +1031,7 @@ void debug_init(void)
gtk_container_add(GTK_CONTAINER(tab_autos), atree);
/* create stack trace page */
- stree = stree_init(editor_open_position, on_select_frame);
+ stree = stree_init(editor_open_position, on_select_thread, on_select_frame);
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 ))
Modified: debugger/src/stree.c
31 lines changed, 16 insertions(+), 15 deletions(-)
===================================================================
@@ -54,6 +54,7 @@ static int active_frame_index = 0;
/* callbacks */
static select_frame_cb select_frame = NULL;
+static select_thread_cb select_thread = NULL;
static move_to_line_cb move_to_line = NULL;
/* tree view, model and store handles */
@@ -284,26 +285,20 @@ static gboolean on_msgwin_button_press(GtkWidget *widget, GdkEventButton *event,
static void on_cursor_changed(GtkTreeView *treeview, gpointer user_data)
{
GtkTreePath *path;
+ GtkTreeIter iter;
+ frame *f;
+ int thread_id;
gtk_tree_view_get_cursor(treeview, &path, NULL);
if (! path)
return;
- if (2 == gtk_tree_path_get_depth(path))
- {
- frame *f;
- GtkTreeIter iter;
+ gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_model_get (model, &iter,
+ S_FRAME, &f, S_THREAD_ID, &thread_id, -1);
- gtk_tree_model_get_iter (
- model,
- &iter,
- path);
- gtk_tree_model_get (
- gtk_tree_view_get_model(GTK_TREE_VIEW(tree)),
- &iter,
- S_FRAME, &f,
- -1);
-
+ if (f) /* frame */
+ {
/* check if file name is not empty and we have source files for the frame */
if (f->have_source)
{
@@ -311,6 +306,11 @@ static void on_cursor_changed(GtkTreeView *treeview, gpointer user_data)
}
frame_unref(f);
}
+ else /* thread */
+ {
+ if (thread_id != active_thread_id)
+ select_thread(thread_id);
+ }
gtk_tree_path_free(path);
}
@@ -356,12 +356,13 @@ static void on_render_address (GtkTreeViewColumn *tree_column, GtkCellRenderer *
/*
* inits stack trace tree
*/
-GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf)
+GtkWidget* stree_init(move_to_line_cb ml, select_thread_cb st, select_frame_cb sf)
{
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
move_to_line = ml;
+ select_thread = st;
select_frame = sf;
/* create tree view */
Modified: debugger/src/stree.h
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -28,7 +28,7 @@
#include "breakpoints.h"
#include "debug_module.h"
-GtkWidget* stree_init(move_to_line_cb ml, select_frame_cb sf);
+GtkWidget* stree_init(move_to_line_cb ml, select_thread_cb st, select_frame_cb sf);
void stree_destroy(void);
void stree_add(GList *frames);
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list