Implement new function pid_is_sleeping()

The function pid_is_sleeping() is implement by the different OS
implementations and returns TRUE or FALSE. It is used in the tree view
context menu to show either the signal Stop or Continue.
This commit is contained in:
Mike Massonnet
2010-05-09 01:34:56 +02:00
parent 07131a81b3
commit 1788e3c220
2 changed files with 31 additions and 12 deletions

View File

@@ -185,17 +185,20 @@ build_context_menu (guint pid)
gtk_container_add (GTK_CONTAINER (menu), mi); gtk_container_add (GTK_CONTAINER (menu), mi);
g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_TERMINATE)); 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))
// if (pid_is_sleeping (pid)) {
mi = gtk_menu_item_new_with_label (_("Stop")); mi = gtk_menu_item_new_with_label (_("Stop"));
g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid));
gtk_container_add (GTK_CONTAINER (menu), mi); gtk_container_add (GTK_CONTAINER (menu), mi);
g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_STOP)); g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_STOP));
}
mi = gtk_menu_item_new_with_label (_("Continue")); else
g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); {
gtk_container_add (GTK_CONTAINER (menu), mi); mi = gtk_menu_item_new_with_label (_("Continue"));
g_signal_connect (mi, "activate", G_CALLBACK (cb_send_signal), GINT_TO_POINTER (XTM_SIGNAL_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")); mi = gtk_menu_item_new_with_label (_("Kill"));
g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid)); g_object_set_data (G_OBJECT (mi), "pid", GUINT_TO_POINTER (pid));

View File

@@ -310,7 +310,23 @@ get_task_list (GArray *task_list)
gboolean gboolean
pid_is_sleeping (guint pid) 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 gboolean