From 47ff438b2009ea7ce95c019ae680b4f3395b8bf3 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 24 Aug 2023 17:53:02 -0700 Subject: [PATCH] sysprof: add hooks to track selection changes --- src/sysprof/sysprof-flame-graph.c | 52 +++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/sysprof/sysprof-flame-graph.c b/src/sysprof/sysprof-flame-graph.c index b64a2cae..54756e77 100644 --- a/src/sysprof/sysprof-flame-graph.c +++ b/src/sysprof/sysprof-flame-graph.c @@ -41,14 +41,15 @@ typedef struct struct _SysprofFlameGraph { - GtkWidget parent_instance; + GtkWidget parent_instance; - SysprofCallgraph *callgraph; - GskRenderNode *rendered; - GArray *nodes; + SysprofCallgraph *callgraph; + GskRenderNode *rendered; + GArray *nodes; + SysprofCallgraphNode *root; - double motion_x; - double motion_y; + double motion_x; + double motion_y; }; enum { @@ -320,6 +321,32 @@ sysprof_flame_graph_query_tooltip (GtkWidget *widget, return FALSE; } +static void +sysprof_flame_graph_click_pressed_cb (SysprofFlameGraph *self, + int n_press, + double x, + double y, + GtkGestureClick *click) +{ + SysprofCallgraphNode *root = NULL; + FlameRectangle *rect; + + if (n_press != 1) + return; + + if ((rect = find_node_at_coord (self, x, y))) + root = rect->node; + else if (self->callgraph) + root = &self->callgraph->root; + + if (root != self->root) + { + self->root = root; + + g_print ("Regenerate graph\n"); + } +} + static void sysprof_flame_graph_dispose (GObject *object) { @@ -399,6 +426,7 @@ static void sysprof_flame_graph_init (SysprofFlameGraph *self) { GtkEventController *motion; + GtkGesture *click; gtk_widget_add_css_class (GTK_WIDGET (self), "view"); gtk_widget_set_has_tooltip (GTK_WIDGET (self), TRUE); @@ -420,6 +448,14 @@ sysprof_flame_graph_init (SysprofFlameGraph *self) self, G_CONNECT_SWAPPED); gtk_widget_add_controller (GTK_WIDGET (self), motion); + + click = gtk_gesture_click_new (); + g_signal_connect_object (click, + "pressed", + G_CALLBACK (sysprof_flame_graph_click_pressed_cb), + self, + G_CONNECT_SWAPPED); + gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (click)); } GtkWidget * @@ -561,10 +597,14 @@ sysprof_flame_graph_set_callgraph (SysprofFlameGraph *self, g_clear_pointer (&self->rendered, gsk_render_node_unref); g_clear_pointer (&self->nodes, g_array_unref); + self->root = NULL; + if (callgraph != NULL) { g_autoptr(GTask) task = NULL; + self->root = &callgraph->root; + task = g_task_new (NULL, NULL, sysprof_flame_graph_generate_cb, g_object_ref (self)); g_task_set_task_data (task, g_object_ref (callgraph), g_object_unref); g_task_run_in_thread (task, sysprof_flame_graph_generate_worker);