diff --git a/src/process-tree-view.c b/src/process-tree-view.c index 5b0bdcc..7fb7374 100644 --- a/src/process-tree-view.c +++ b/src/process-tree-view.c @@ -185,17 +185,20 @@ build_context_menu (guint pid) gtk_container_add (GTK_CONTAINER (menu), mi); g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_TERMINATE)); - // TODO look up task for building menu with either Stop or Continue and in an OS-independent way - // if (pid_is_sleeping (pid)) - mi = gtk_menu_item_new_with_label (_("Stop")); - g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); - gtk_container_add (GTK_CONTAINER (menu), mi); - g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_STOP)); - - mi = gtk_menu_item_new_with_label (_("Continue")); - g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); - gtk_container_add (GTK_CONTAINER (menu), mi); - g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_CONTINUE)); + if (!pid_is_sleeping (pid)) + { + mi = gtk_menu_item_new_with_label (_("Stop")); + g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); + gtk_container_add (GTK_CONTAINER (menu), mi); + g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_STOP)); + } + else + { + mi = gtk_menu_item_new_with_label (_("Continue")); + g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); + gtk_container_add (GTK_CONTAINER (menu), mi); + g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_CONTINUE)); + } mi = gtk_menu_item_new_with_label (_("Kill")); g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); diff --git a/src/task-manager-linux.c b/src/task-manager-linux.c index 3d61ab7..ece59d5 100644 --- a/src/task-manager-linux.c +++ b/src/task-manager-linux.c @@ -310,7 +310,23 @@ get_task_list (GArray *task_list) gboolean pid_is_sleeping (guint pid) { - return TRUE; + FILE *file; + gchar filename[96]; + gchar buffer[1024]; + gchar state[2]; + + snprintf (filename, 96, "/proc/%i/status", pid); + if ((file = fopen (filename, "r")) == NULL) + return FALSE; + + while (fgets (buffer, 1024, file) != NULL) + { + if (sscanf (buffer, "State:\t%1s", state) > 0) + break; + } + fclose (file); + + return (state[0] == 'T') ? TRUE : FALSE; } gboolean