[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