aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--trace-filter.c91
1 files changed, 28 insertions, 63 deletions
diff --git a/trace-filter.c b/trace-filter.c
index 2c6022d..009d92d 100644
--- a/trace-filter.c
+++ b/trace-filter.c
@@ -760,13 +760,6 @@ void trace_adv_filter_dialog(struct tracecmd_input *handle,
760 760
761/* --- task list dialog --- */ 761/* --- task list dialog --- */
762 762
763struct task_helper {
764 trace_task_cb_func func;
765 GtkTreeView *view;
766 gboolean start;
767 gpointer data;
768};
769
770enum { 763enum {
771 TASK_COL_SELECT, 764 TASK_COL_SELECT,
772 TASK_COL_PID, 765 TASK_COL_PID,
@@ -813,35 +806,6 @@ static void get_tasks(GtkTreeView *treeview,
813 *non_selected = non_pids; 806 *non_selected = non_pids;
814} 807}
815 808
816/* Callback for the clicked signal of the task filter button */
817static void
818task_dialog_response (gpointer data, gint response_id)
819{
820 struct dialog_helper *helper = data;
821 struct task_helper *event_helper = helper->data;
822 gint *selected;
823 gint *non_select;
824
825 switch (response_id) {
826 case GTK_RESPONSE_ACCEPT:
827 get_tasks(event_helper->view, &selected, &non_select);
828 event_helper->func(TRUE, selected, non_select, event_helper->data);
829 free(selected);
830 free(non_select);
831 break;
832 case GTK_RESPONSE_REJECT:
833 event_helper->func(FALSE, NULL, NULL, event_helper->data);
834 break;
835 default:
836 break;
837 };
838
839 gtk_widget_destroy(GTK_WIDGET(helper->dialog));
840
841 g_free(event_helper);
842 g_free(helper);
843}
844
845static GtkTreeModel * 809static GtkTreeModel *
846create_task_model(struct tracecmd_input *handle, 810create_task_model(struct tracecmd_input *handle,
847 gint *tasks, 811 gint *tasks,
@@ -923,14 +887,14 @@ create_task_model(struct tracecmd_input *handle,
923 887
924static void task_cursor_changed(gpointer data, GtkTreeView *treeview) 888static void task_cursor_changed(gpointer data, GtkTreeView *treeview)
925{ 889{
926 struct task_helper *event_helper = data; 890 gboolean *start = data;
927 GtkTreeModel *model; 891 GtkTreeModel *model;
928 GtkTreePath *path; 892 GtkTreePath *path;
929 GtkTreeIter iter; 893 GtkTreeIter iter;
930 gboolean active; 894 gboolean active;
931 895
932 if (!event_helper->start) { 896 if (!*start) {
933 event_helper->start = TRUE; 897 *start = TRUE;
934 return; 898 return;
935 } 899 }
936 900
@@ -962,7 +926,7 @@ static void task_cursor_changed(gpointer data, GtkTreeView *treeview)
962static GtkWidget * 926static GtkWidget *
963create_task_view(struct tracecmd_input *handle, 927create_task_view(struct tracecmd_input *handle,
964 gint *tasks, gint *selected, 928 gint *tasks, gint *selected,
965 struct task_helper *event_helper) 929 gboolean *start)
966{ 930{
967 GtkTreeViewColumn *col; 931 GtkTreeViewColumn *col;
968 GtkCellRenderer *renderer; 932 GtkCellRenderer *renderer;
@@ -1024,7 +988,7 @@ create_task_view(struct tracecmd_input *handle,
1024 988
1025 g_signal_connect_swapped (view, "cursor-changed", 989 g_signal_connect_swapped (view, "cursor-changed",
1026 G_CALLBACK (task_cursor_changed), 990 G_CALLBACK (task_cursor_changed),
1027 (gpointer) event_helper); 991 (gpointer)start);
1028 992
1029 return view; 993 return view;
1030} 994}
@@ -1043,14 +1007,12 @@ void trace_task_dialog(struct tracecmd_input *handle,
1043 trace_task_cb_func func, 1007 trace_task_cb_func func,
1044 gpointer data) 1008 gpointer data)
1045{ 1009{
1046 struct dialog_helper *helper;
1047 struct task_helper *event_helper;
1048 GtkWidget *dialog; 1010 GtkWidget *dialog;
1049 GtkWidget *scrollwin; 1011 GtkWidget *scrollwin;
1050 GtkWidget *view; 1012 GtkWidget *view;
1051 1013 gboolean start = FALSE;
1052 helper = g_malloc(sizeof(*helper)); 1014 gint *non_select;
1053 g_assert(helper); 1015 int result;
1054 1016
1055 /* --- Make dialog window --- */ 1017 /* --- Make dialog window --- */
1056 1018
@@ -1063,27 +1025,11 @@ void trace_task_dialog(struct tracecmd_input *handle,
1063 GTK_RESPONSE_REJECT, 1025 GTK_RESPONSE_REJECT,
1064 NULL); 1026 NULL);
1065 1027
1066 event_helper = g_new0(typeof(*event_helper), 1);
1067 g_assert(event_helper);
1068
1069 helper->dialog = dialog;
1070 helper->data = event_helper;
1071
1072 event_helper->func = func;
1073 event_helper->data = data;
1074 event_helper->start = FALSE;
1075
1076 /* We can attach the Quit menu item to our exit function */
1077 g_signal_connect_swapped (dialog, "response",
1078 G_CALLBACK (task_dialog_response),
1079 (gpointer) helper);
1080
1081 scrollwin = gtk_scrolled_window_new(NULL, NULL); 1028 scrollwin = gtk_scrolled_window_new(NULL, NULL);
1082 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), 1029 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
1083 GTK_POLICY_AUTOMATIC, 1030 GTK_POLICY_AUTOMATIC,
1084 GTK_POLICY_AUTOMATIC); 1031 GTK_POLICY_AUTOMATIC);
1085 view = create_task_view(handle, tasks, selected, event_helper); 1032 view = create_task_view(handle, tasks, selected, &start);
1086 event_helper->view = GTK_TREE_VIEW(view);
1087 gtk_container_add(GTK_CONTAINER(scrollwin), view); 1033 gtk_container_add(GTK_CONTAINER(scrollwin), view);
1088 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0); 1034 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrollwin, TRUE, TRUE, 0);
1089 1035
@@ -1091,6 +1037,25 @@ void trace_task_dialog(struct tracecmd_input *handle,
1091 DIALOG_WIDTH, DIALOG_HEIGHT); 1037 DIALOG_WIDTH, DIALOG_HEIGHT);
1092 1038
1093 gtk_widget_show_all(dialog); 1039 gtk_widget_show_all(dialog);
1040
1041 selected = NULL;
1042
1043 result = gtk_dialog_run(GTK_DIALOG(dialog));
1044 switch (result) {
1045 case GTK_RESPONSE_ACCEPT:
1046 get_tasks(GTK_TREE_VIEW(view), &selected, &non_select);
1047 func(TRUE, selected, non_select, data);
1048 free(selected);
1049 free(non_select);
1050 break;
1051 case GTK_RESPONSE_REJECT:
1052 func(FALSE, NULL, NULL, data);
1053 break;
1054 default:
1055 break;
1056 };
1057
1058 gtk_widget_destroy(dialog);
1094} 1059}
1095 1060
1096enum { 1061enum {