diff options
-rw-r--r-- | trace-filter.c | 91 |
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 | ||
763 | struct task_helper { | ||
764 | trace_task_cb_func func; | ||
765 | GtkTreeView *view; | ||
766 | gboolean start; | ||
767 | gpointer data; | ||
768 | }; | ||
769 | |||
770 | enum { | 763 | enum { |
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 */ | ||
817 | static void | ||
818 | task_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 | |||
845 | static GtkTreeModel * | 809 | static GtkTreeModel * |
846 | create_task_model(struct tracecmd_input *handle, | 810 | create_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 | ||
924 | static void task_cursor_changed(gpointer data, GtkTreeView *treeview) | 888 | static 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) | |||
962 | static GtkWidget * | 926 | static GtkWidget * |
963 | create_task_view(struct tracecmd_input *handle, | 927 | create_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 | ||
1096 | enum { | 1061 | enum { |