2
* Copyright (C) 2001 Kevin Vandersloot
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License
6
* as published by the Free Software Foundation; either version 2
7
* of the License, or (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU Library General Public
15
* License along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
26
#include "procdialogs.h"
27
#include "favorites.h"
28
#include "proctable.h"
29
#include "callbacks.h"
30
#include "prettytable.h"
31
#include "procactions.h"
33
#include "load-graph.h"
35
static GtkWidget *renice_dialog = NULL;
36
static GtkWidget *prefs_dialog = NULL;
37
static gint new_nice_value = 0;
39
/* public */ int kill_signal = SIGTERM;
42
cb_show_hide_message_toggled (GtkToggleButton *button, gpointer data)
44
ProcData *procdata = data;
45
GConfClient *client = procdata->client;
46
gboolean toggle_state;
48
toggle_state = gtk_toggle_button_get_active (button);
50
gconf_client_set_bool (client, "/apps/procman/hide_message", toggle_state, NULL);
55
hide_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
57
ProcData *procdata = data;
60
add_selected_to_blacklist (procdata);
63
gtk_widget_destroy (GTK_WIDGET (dialog));
68
procdialog_create_hide_dialog (ProcData *data)
70
ProcData *procdata = data;
71
GtkWidget *messagebox1;
72
GtkWidget *dialog_vbox1, *vbox;
73
GtkWidget *hbox, *hbox1;
74
GtkWidget *dialog_action_area;
75
GtkWidget *checkbutton1;
81
const gchar *header = _("Are you sure you want to hide this process?");
82
const gchar *message = _("If you hide a process, you can unhide it by "
83
"selecting 'Hidden Processes' in the Edit "
87
messagebox1 = gtk_dialog_new ();
89
gtk_window_set_title (GTK_WINDOW (messagebox1), "");
90
gtk_window_set_resizable (GTK_WINDOW (messagebox1), FALSE);
91
gtk_window_set_modal (GTK_WINDOW (messagebox1), TRUE);
93
gtk_dialog_set_has_separator (GTK_DIALOG (messagebox1), FALSE);
94
gtk_container_set_border_width (GTK_CONTAINER (messagebox1), 5);
96
dialog_vbox1 = GTK_DIALOG (messagebox1)->vbox;
97
gtk_box_set_spacing (GTK_BOX (dialog_vbox1), 14);
99
hbox = gtk_hbox_new (FALSE, 12);
100
gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox, FALSE, FALSE, 0);
101
gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
102
gtk_widget_show (hbox);
104
image = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_DIALOG);
105
gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
106
gtk_widget_show (image);
108
vbox = gtk_vbox_new (FALSE, 12);
109
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
110
gtk_widget_show (vbox);
112
title = g_strdup_printf("<b>%s</b>", header);
113
label = gtk_label_new (title);
114
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
115
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
116
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
117
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
118
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
119
gtk_widget_show (label);
122
label = gtk_label_new (_(message));
123
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
124
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
125
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
126
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
127
gtk_widget_show (label);
129
dialog_action_area = GTK_DIALOG (messagebox1)->action_area;
130
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area), GTK_BUTTONBOX_END);
132
button = gtk_button_new_from_stock ("gtk-cancel");
133
gtk_widget_show (button);
134
gtk_dialog_add_action_widget (GTK_DIALOG (messagebox1), button, GTK_RESPONSE_CANCEL);
135
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
137
hbox1 = gtk_hbox_new (FALSE, 0);
138
gtk_widget_show (hbox1);
139
gtk_box_pack_end (GTK_BOX (vbox), hbox1, TRUE, TRUE, 0);
141
checkbutton1 = gtk_check_button_new_with_mnemonic (_("_Show this dialog next time"));
142
gtk_widget_show (checkbutton1);
143
gtk_box_pack_end (GTK_BOX (hbox1), checkbutton1, FALSE, FALSE, 0);
144
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton1), TRUE);
146
button = gtk_button_new ();
147
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
149
align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
150
gtk_container_add (GTK_CONTAINER (button), align);
152
hbox = gtk_hbox_new (FALSE, 2);
153
gtk_container_add (GTK_CONTAINER (align), hbox);
155
icon = gtk_image_new_from_stock (GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON);
156
gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
158
label = gtk_label_new_with_mnemonic (_("_Hide Process"));
159
gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
160
gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
162
gtk_dialog_add_action_widget (GTK_DIALOG (messagebox1), button, 100);
163
gtk_dialog_set_default_response (GTK_DIALOG (messagebox1), 100);
165
g_signal_connect (G_OBJECT (checkbutton1), "toggled",
166
G_CALLBACK (cb_show_hide_message_toggled), procdata);
167
g_signal_connect (G_OBJECT (messagebox1), "response",
168
G_CALLBACK (hide_dialog_button_pressed), procdata);
170
gtk_widget_show_all (messagebox1);
175
cb_show_kill_warning_toggled (GtkToggleButton *button, gpointer data)
177
ProcData *procdata = data;
178
GConfClient *client = procdata->client;
179
gboolean toggle_state;
181
toggle_state = gtk_toggle_button_get_active (button);
183
gconf_client_set_bool (client, "/apps/procman/kill_dialog", toggle_state, NULL);
188
kill_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
190
ProcData *procdata = data;
192
gtk_widget_destroy (GTK_WIDGET (dialog));
195
kill_process (procdata, kill_signal);
199
procdialog_create_kill_dialog (ProcData *data, int signal)
201
ProcData *procdata = data;
202
GtkWidget *messagebox1;
203
GtkWidget *dialog_vbox1, *vbox;
204
GtkWidget *hbox1, *hbox2;
205
GtkWidget *checkbutton1;
206
GtkWidget *dialog_action_area;
213
gchar *header, *message;
215
kill_signal = signal;
217
if (signal == SIGKILL) {
218
header = _("Are you sure you want to kill this process?");
219
message = _("If you kill a process, unsaved data will be lost.");
220
text = _("_Kill Process");
223
header = _("Are you sure you want to end this process?");
224
message = _("If you end a process, unsaved data will be lost.");
225
text = _("_End Process");
228
messagebox1 = gtk_dialog_new ();
230
gtk_window_set_title (GTK_WINDOW (messagebox1), "");
231
gtk_window_set_modal (GTK_WINDOW (messagebox1), TRUE);
232
gtk_window_set_resizable (GTK_WINDOW (messagebox1), FALSE);
234
gtk_dialog_set_has_separator (GTK_DIALOG (messagebox1), FALSE);
235
gtk_container_set_border_width (GTK_CONTAINER (messagebox1), 5);
237
dialog_vbox1 = GTK_DIALOG (messagebox1)->vbox;
238
gtk_box_set_spacing (GTK_BOX (dialog_vbox1), 14);
240
hbox1 = gtk_hbox_new (FALSE, 12);
241
gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox1, FALSE, FALSE, 0);
242
gtk_container_set_border_width (GTK_CONTAINER (hbox1), 5);
243
gtk_widget_show (hbox1);
245
image = gtk_image_new_from_stock ("gtk-dialog-warning", GTK_ICON_SIZE_DIALOG);
246
gtk_box_pack_start (GTK_BOX (hbox1), image, FALSE, FALSE, 0);
247
gtk_widget_show (image);
249
vbox = gtk_vbox_new (FALSE, 12);
250
gtk_box_pack_start (GTK_BOX (hbox1), vbox, TRUE, TRUE, 0);
251
gtk_widget_show (vbox);
253
title = g_strconcat ("<b>", _(header), "</b>", NULL);
254
label = gtk_label_new (title);
255
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
256
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
257
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
258
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
259
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
260
gtk_widget_show (label);
263
label = gtk_label_new (_(message));
264
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
265
gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
266
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
267
gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
268
gtk_widget_show (label);
270
dialog_action_area = GTK_DIALOG (messagebox1)->action_area;
271
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area), GTK_BUTTONBOX_END);
273
button = gtk_button_new_from_stock ("gtk-cancel");
274
gtk_widget_show (button);
275
gtk_dialog_add_action_widget (GTK_DIALOG (messagebox1), button, GTK_RESPONSE_CANCEL);
276
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
278
hbox2 = gtk_hbox_new (FALSE, 0);
279
gtk_widget_show (hbox2);
280
gtk_box_pack_end (GTK_BOX (vbox), hbox2, TRUE, TRUE, 0);
282
checkbutton1 = gtk_check_button_new_with_mnemonic (_("_Show this dialog next time"));
283
gtk_widget_show (checkbutton1);
284
gtk_box_pack_end (GTK_BOX (hbox2), checkbutton1, FALSE, FALSE, 0);
285
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkbutton1), TRUE);
287
button = gtk_button_new ();
288
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
290
align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
291
gtk_container_add (GTK_CONTAINER (button), align);
293
hbox1 = gtk_hbox_new (FALSE, 2);
294
gtk_container_add (GTK_CONTAINER (align), hbox1);
296
icon = gtk_image_new_from_stock (GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON);
297
gtk_box_pack_start (GTK_BOX (hbox1), icon, FALSE, FALSE, 0);
299
label = gtk_label_new_with_mnemonic (_(text));
300
gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
301
gtk_box_pack_end (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
303
gtk_dialog_add_action_widget (GTK_DIALOG (messagebox1), button, 100);
304
gtk_dialog_set_default_response (GTK_DIALOG (messagebox1), 100);
306
g_signal_connect (G_OBJECT (checkbutton1), "toggled",
307
G_CALLBACK (cb_show_kill_warning_toggled),
309
g_signal_connect (G_OBJECT (messagebox1), "response",
310
G_CALLBACK (kill_dialog_button_pressed), procdata);
312
gtk_widget_show_all (messagebox1);
318
get_nice_level (gint nice)
321
return _("(Very High Priority)");
323
return _("(High Priority)");
325
return _("(Normal Priority)");
327
return _("(Low Priority)");
329
return _("(Very Low Priority)");
333
renice_scale_changed (GtkAdjustment *adj, gpointer data)
335
GtkWidget *label = GTK_WIDGET (data);
337
new_nice_value = adj->value;
338
gtk_label_set_text (GTK_LABEL (label), get_nice_level (new_nice_value));
343
renice_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
345
ProcData *procdata = data;
348
if (new_nice_value == -100)
350
renice (procdata, -2, new_nice_value);
353
gtk_widget_destroy (GTK_WIDGET (dialog));
354
renice_dialog = NULL;
358
procdialog_create_renice_dialog (ProcData *data)
360
ProcData *procdata = data;
361
ProcInfo *info = procdata->selected_process;
362
GtkWidget *dialog = NULL;
363
GtkWidget *dialog_vbox;
367
GtkWidget *priority_label;
369
GtkObject *renice_adj;
382
dialog = gtk_dialog_new_with_buttons (_("Change Priority"), NULL,
383
GTK_DIALOG_DESTROY_WITH_PARENT,
384
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
386
renice_dialog = dialog;
387
gtk_window_set_resizable (GTK_WINDOW (renice_dialog), FALSE);
388
gtk_dialog_set_has_separator (GTK_DIALOG (renice_dialog), FALSE);
389
gtk_container_set_border_width (GTK_CONTAINER (renice_dialog), 5);
391
button = gtk_button_new ();
392
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
394
align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
395
gtk_container_add (GTK_CONTAINER (button), align);
397
hbox = gtk_hbox_new (FALSE, 2);
398
gtk_container_add (GTK_CONTAINER (align), hbox);
400
icon = gtk_image_new_from_stock (GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON);
401
gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
403
label = gtk_label_new_with_mnemonic (_("Change _Priority"));
404
gtk_label_set_mnemonic_widget (GTK_LABEL (label), button);
405
gtk_box_pack_end (GTK_BOX (hbox), label, FALSE, FALSE, 0);
407
gtk_dialog_add_action_widget (GTK_DIALOG (renice_dialog), button, 100);
408
gtk_dialog_set_default_response (GTK_DIALOG (renice_dialog), 100);
409
new_nice_value = -100;
411
dialog_vbox = GTK_DIALOG (dialog)->vbox;
412
gtk_box_set_spacing (GTK_BOX (dialog_vbox), 2);
413
gtk_container_set_border_width (GTK_CONTAINER (dialog_vbox), 5);
415
vbox = gtk_vbox_new (FALSE, 12);
416
gtk_box_pack_start (GTK_BOX (dialog_vbox), vbox, TRUE, TRUE, 0);
417
gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
419
table = gtk_table_new (2, 2, FALSE);
420
gtk_table_set_col_spacings (GTK_TABLE(table), 12);
421
gtk_table_set_row_spacings (GTK_TABLE(table), 6);
422
gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
424
label = gtk_label_new_with_mnemonic (_("_Nice value:"));
425
gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 2,
428
renice_adj = gtk_adjustment_new (info->nice, -20, 20, 1, 1, 0);
430
hscale = gtk_hscale_new (GTK_ADJUSTMENT (renice_adj));
431
gtk_label_set_mnemonic_widget (GTK_LABEL (label), hscale);
432
gtk_scale_set_digits (GTK_SCALE (hscale), 0);
433
gtk_table_attach (GTK_TABLE (table), hscale, 1, 2, 0, 1,
434
GTK_EXPAND | GTK_FILL, 0, 0, 0);
436
priority_label = gtk_label_new (get_nice_level (info->nice));
437
gtk_table_attach (GTK_TABLE (table), priority_label, 1, 2, 1, 2,
440
text = g_strconcat("<small><i><b>", _("Note:"), "</b> ",
441
_("The priority of a process is given by its nice value. A lower nice value corresponds to a higher priority."),
442
"</i></small>", NULL);
443
label = gtk_label_new (_(text));
444
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
445
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
446
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
449
g_signal_connect (G_OBJECT (dialog), "response",
450
G_CALLBACK (renice_dialog_button_pressed), procdata);
451
g_signal_connect (G_OBJECT (renice_adj), "value_changed",
452
G_CALLBACK (renice_scale_changed), priority_label);
454
gtk_widget_show_all (dialog);
460
prefs_dialog_button_pressed (GtkDialog *dialog, gint id, gpointer data)
462
gtk_widget_destroy (GTK_WIDGET (dialog));
468
show_tree_toggled (GtkToggleButton *button, gpointer data)
470
ProcData *procdata = data;
471
GConfClient *client = procdata->client;
474
toggled = gtk_toggle_button_get_active (button);
475
gconf_client_set_bool (client, "/apps/procman/show_tree", toggled, NULL);
480
show_threads_toggled (GtkToggleButton *button, gpointer data)
482
ProcData *procdata = data;
483
GConfClient *client = procdata->client;
487
toggled = gtk_toggle_button_get_active (button);
489
gconf_client_set_bool (client, "/apps/procman/show_threads", toggled, NULL);
494
show_kill_dialog_toggled (GtkToggleButton *button, gpointer data)
496
ProcData *procdata = data;
497
GConfClient *client = procdata->client;
501
toggled = gtk_toggle_button_get_active (button);
503
gconf_client_set_bool (client, "/apps/procman/kill_dialog", toggled, NULL);
508
show_hide_dialog_toggled (GtkToggleButton *button, gpointer data)
510
ProcData *procdata = data;
511
GConfClient *client = procdata->client;
515
toggled = gtk_toggle_button_get_active (button);
517
gconf_client_set_bool (client, "/apps/procman/hide_message", toggled, NULL);
522
update_update_interval (GtkWidget *widget, GdkEventFocus *event, gpointer data)
524
ProcData *procdata = data;
525
GConfClient *client = procdata->client;
526
GtkWidget *spin_button;
529
spin_button = widget;
530
value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin_button));
532
if (1000 * value == procdata->config.update_interval)
535
gconf_client_set_int (client, "/apps/procman/update_interval", value * 1000, NULL);
540
update_graph_update_interval (GtkWidget *widget, GdkEventFocus *event, gpointer data)
542
ProcData *procdata = data;
543
GConfClient *client = procdata->client;
544
GtkWidget *spin_button;
547
spin_button = widget;
548
value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin_button));
550
if (1000 * value == procdata->config.graph_update_interval)
553
gconf_client_set_int (client, "/apps/procman/graph_update_interval", value * 1000, NULL);
558
update_disks_update_interval (GtkWidget *widget, GdkEventFocus *event, gpointer data)
560
ProcData *procdata = data;
561
GConfClient *client = procdata->client;
562
GtkWidget *spin_button;
565
spin_button = widget;
566
value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin_button));
568
if (1000 * value == procdata->config.disks_update_interval)
571
gconf_client_set_int (client, "/apps/procman/disks_interval", value * 1000, NULL);
577
proc_field_toggled (GtkToggleButton *button, gpointer data)
579
GtkTreeViewColumn *column = data;
582
toggled = gtk_toggle_button_get_active (button);
584
gtk_tree_view_column_set_visible (column, toggled);
589
field_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
591
GtkTreeModel *model = data;
592
GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
594
GtkTreeViewColumn *column;
600
gtk_tree_model_get_iter (model, &iter, path);
602
gtk_tree_model_get (model, &iter, 2, &column, -1);
603
toggled = gtk_cell_renderer_toggle_get_active (cell);
605
gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, !toggled, -1);
606
gtk_tree_view_column_set_visible (column, !toggled);
608
gtk_tree_path_free (path);
613
create_proc_field_page (ProcData *procdata)
617
GtkWidget *tree = procdata->tree, *treeview;
618
GList *columns = NULL;
620
GtkTreeViewColumn *column;
621
GtkCellRenderer *cell;
623
vbox = gtk_vbox_new (FALSE, 6);
625
scrolled = gtk_scrolled_window_new (NULL, NULL);
626
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
627
GTK_POLICY_AUTOMATIC,
628
GTK_POLICY_AUTOMATIC);
629
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN);
630
gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0);
632
model = gtk_list_store_new (3, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_POINTER);
634
treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
635
gtk_container_add (GTK_CONTAINER (scrolled), treeview);
636
g_object_unref (G_OBJECT (model));
638
column = gtk_tree_view_column_new ();
640
cell = gtk_cell_renderer_toggle_new ();
641
gtk_tree_view_column_pack_start (column, cell, FALSE);
642
gtk_tree_view_column_set_attributes (column, cell,
645
g_signal_connect (G_OBJECT (cell), "toggled", G_CALLBACK (field_toggled), model);
646
gtk_tree_view_column_set_clickable (column, TRUE);
647
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
649
column = gtk_tree_view_column_new ();
651
cell = gtk_cell_renderer_text_new ();
652
gtk_tree_view_column_pack_start (column, cell, FALSE);
653
gtk_tree_view_column_set_attributes (column, cell,
657
gtk_tree_view_column_set_title (column, "Not Shown");
658
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
659
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
661
columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (tree));
664
GtkTreeViewColumn *column = columns->data;
669
title = gtk_tree_view_column_get_title (column);
673
visible = gtk_tree_view_column_get_visible (column);
675
gtk_list_store_append (model, &iter);
676
gtk_list_store_set (model, &iter, 0, visible, 1, title, 2, column,-1);
679
columns = g_list_next (columns);
687
procdialog_create_preferences_dialog (ProcData *procdata)
689
static GtkWidget *dialog = NULL;
693
GtkWidget *main_vbox;
694
GtkWidget *vbox, *vbox2;
695
GtkWidget *hbox, *hbox2, *hbox3;
697
GtkAdjustment *adjustment;
698
GtkWidget *spin_button;
699
GtkWidget *check_button;
700
GtkWidget *tab_label;
701
GtkWidget *color_picker;
709
size = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
711
dialog = gtk_dialog_new_with_buttons (_("Preferences"), NULL,
712
GTK_DIALOG_DESTROY_WITH_PARENT,
713
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
715
gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 375);
716
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
717
gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
718
prefs_dialog = dialog;
720
main_vbox = GTK_DIALOG (dialog)->vbox;
721
gtk_box_set_spacing (GTK_BOX (main_vbox), 2);
723
notebook = gtk_notebook_new ();
724
gtk_container_set_border_width (GTK_CONTAINER (notebook), 5);
725
gtk_box_pack_start (GTK_BOX (main_vbox), notebook, TRUE, TRUE, 0);
727
proc_box = gtk_vbox_new (FALSE, 18);
728
gtk_container_set_border_width (GTK_CONTAINER (proc_box), 12);
729
tab_label = gtk_label_new (_("Process Listing"));
730
gtk_widget_show (tab_label);
731
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), proc_box, tab_label);
733
vbox = gtk_vbox_new (FALSE, 6);
734
gtk_box_pack_start (GTK_BOX (proc_box), vbox, FALSE, FALSE, 0);
736
tmp = g_strdup_printf ("<b>%s</b>", _("Behavior"));
737
label = gtk_label_new (NULL);
738
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
739
gtk_label_set_markup (GTK_LABEL (label), tmp);
741
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
743
hbox = gtk_hbox_new (FALSE, 0);
744
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
746
label = gtk_label_new (" ");
747
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
749
vbox2 = gtk_vbox_new (FALSE, 6);
750
gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
752
hbox2 = gtk_hbox_new (FALSE, 12);
753
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
755
label = gtk_label_new_with_mnemonic (_("_Update interval:"));
756
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
757
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
759
hbox3 = gtk_hbox_new (FALSE, 6);
760
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, TRUE, TRUE, 0);
762
update = (gfloat) procdata->config.update_interval;
763
adjustment = (GtkAdjustment *) gtk_adjustment_new(update / 1000.0, 1.0,
764
100.0, 0.25, 1.0, 1.0);
765
spin_button = gtk_spin_button_new (adjustment, 1.0, 2);
766
gtk_box_pack_start (GTK_BOX (hbox3), spin_button, TRUE, TRUE, 0);
767
g_signal_connect (G_OBJECT (spin_button), "focus_out_event",
768
G_CALLBACK (update_update_interval), procdata);
769
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin_button);
771
label = gtk_label_new_with_mnemonic (_("seconds"));
772
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
773
gtk_box_pack_start (GTK_BOX (hbox3), label, FALSE, FALSE, 0);
775
hbox2 = gtk_hbox_new (FALSE, 6);
776
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
778
check_button = gtk_check_button_new_with_mnemonic (_("Show warning dialog when ending or _killing processes"));
779
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
780
procdata->config.show_kill_warning);
781
g_signal_connect (G_OBJECT (check_button), "toggled",
782
G_CALLBACK (show_kill_dialog_toggled), procdata);
783
gtk_box_pack_start (GTK_BOX (hbox2), check_button, FALSE, FALSE, 0);
785
hbox2 = gtk_hbox_new (FALSE, 6);
786
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
788
check_button = gtk_check_button_new_with_mnemonic (_("Show warning dialog when _hiding processes"));
789
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
790
procdata->config.show_hide_message);
791
g_signal_connect (G_OBJECT (check_button), "toggled",
792
G_CALLBACK (show_hide_dialog_toggled), procdata);
793
gtk_box_pack_start (GTK_BOX (hbox2), check_button, FALSE, FALSE, 0);
795
vbox = gtk_vbox_new (FALSE, 6);
796
gtk_box_pack_start (GTK_BOX (proc_box), vbox, TRUE, TRUE, 0);
798
tmp = g_strdup_printf ("<b>%s</b>", _("Process Fields"));
799
label = gtk_label_new (NULL);
800
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
801
gtk_label_set_markup (GTK_LABEL (label), tmp);
803
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
805
hbox = gtk_hbox_new (FALSE, 0);
806
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
808
label = gtk_label_new (" ");
809
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
811
vbox2 = create_proc_field_page (procdata);
812
gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
814
sys_box = gtk_vbox_new (FALSE, 12);
815
gtk_container_set_border_width (GTK_CONTAINER (sys_box), 12);
816
tab_label = gtk_label_new (_("Resource Monitor"));
817
gtk_widget_show (tab_label);
818
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), sys_box, tab_label);
820
vbox = gtk_vbox_new (FALSE, 6);
821
gtk_box_pack_start (GTK_BOX (sys_box), vbox, FALSE, FALSE, 0);
823
tmp = g_strdup_printf ("<b>%s</b>", _("Graphs"));
824
label = gtk_label_new (NULL);
825
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
826
gtk_label_set_markup (GTK_LABEL (label), tmp);
828
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
830
hbox = gtk_hbox_new (FALSE, 0);
831
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
833
label = gtk_label_new (" ");
834
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
836
vbox2 = gtk_vbox_new (FALSE, 6);
837
gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
839
hbox2 = gtk_hbox_new (FALSE, 12);
840
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
842
label = gtk_label_new_with_mnemonic (_("_Update interval:"));
843
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
844
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
845
gtk_size_group_add_widget (size, label);
847
hbox3 = gtk_hbox_new (FALSE, 6);
848
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, TRUE, TRUE, 0);
850
update = (gfloat) procdata->config.graph_update_interval;
851
adjustment = (GtkAdjustment *) gtk_adjustment_new(update / 1000.0, 0.25,
852
100.0, 0.25, 1.0, 1.0);
853
spin_button = gtk_spin_button_new (adjustment, 1.0, 2);
854
g_signal_connect (G_OBJECT (spin_button), "focus_out_event",
855
G_CALLBACK (update_graph_update_interval), procdata);
856
gtk_box_pack_start (GTK_BOX (hbox3), spin_button, TRUE, TRUE, 0);
857
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin_button);
859
label = gtk_label_new_with_mnemonic (_("seconds"));
860
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
861
gtk_box_pack_start (GTK_BOX (hbox3), label, FALSE, FALSE, 0);
863
hbox2 = gtk_hbox_new (FALSE, 12);
864
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0);
866
label = gtk_label_new_with_mnemonic (_("_Background color:"));
867
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
868
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
869
gtk_size_group_add_widget (size, label);
871
color_picker = gnome_color_picker_new ();
872
gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (color_picker),
873
procdata->config.bg_color.red,
874
procdata->config.bg_color.green,
875
procdata->config.bg_color.blue, 0);
876
g_signal_connect (G_OBJECT (color_picker), "color_set",
877
G_CALLBACK (cb_bg_color_changed), procdata);
878
gtk_box_pack_start (GTK_BOX (hbox2), color_picker,TRUE, TRUE, 0);
879
gtk_label_set_mnemonic_widget (GTK_LABEL (label), color_picker);
880
gtk_widget_show (color_picker);
882
hbox2 = gtk_hbox_new (FALSE, 12);
883
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0);
885
label = gtk_label_new_with_mnemonic (_("_Grid color:"));
886
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
887
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
888
gtk_size_group_add_widget (size, label);
890
color_picker = gnome_color_picker_new ();
891
gnome_color_picker_set_i16 (GNOME_COLOR_PICKER (color_picker),
892
procdata->config.frame_color.red,
893
procdata->config.frame_color.green,
894
procdata->config.frame_color.blue, 0);
895
g_signal_connect (G_OBJECT (color_picker), "color_set",
896
G_CALLBACK (cb_frame_color_changed), procdata);
897
gtk_box_pack_start (GTK_BOX (hbox2), color_picker, TRUE, TRUE, 0);
898
gtk_label_set_mnemonic_widget (GTK_LABEL (label), color_picker);
899
gtk_widget_show (color_picker);
901
vbox = gtk_vbox_new (FALSE, 6);
902
gtk_box_pack_start (GTK_BOX (sys_box), vbox, FALSE, FALSE, 0);
904
tmp = g_strdup_printf ("<b>%s</b>", _("Devices"));
905
label = gtk_label_new (NULL);
906
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
907
gtk_label_set_markup (GTK_LABEL (label), tmp);
909
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
911
hbox = gtk_hbox_new (FALSE, 0);
912
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
914
label = gtk_label_new (" ");
915
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
917
vbox2 = gtk_vbox_new (FALSE, 6);
918
gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
920
hbox2 = gtk_hbox_new (FALSE, 12);
921
gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
923
label = gtk_label_new_with_mnemonic (_("Update _interval:"));
924
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
925
gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
926
gtk_size_group_add_widget (size, label);
928
hbox3 = gtk_hbox_new (FALSE, 6);
929
gtk_box_pack_start (GTK_BOX (hbox2), hbox3, TRUE, TRUE, 0);
931
update = (gfloat) procdata->config.disks_update_interval;
932
adjustment = (GtkAdjustment *) gtk_adjustment_new (update / 1000.0, 1.0,
933
100.0, 1.0, 1.0, 1.0);
934
spin_button = gtk_spin_button_new (adjustment, 1.0, 0);
935
gtk_box_pack_start (GTK_BOX (hbox3), spin_button, TRUE, TRUE, 0);
936
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spin_button);
937
g_signal_connect (G_OBJECT (spin_button), "focus_out_event",
938
G_CALLBACK (update_disks_update_interval), procdata);
940
label = gtk_label_new_with_mnemonic (_("seconds"));
941
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
942
gtk_box_pack_start (GTK_BOX (hbox3), label, FALSE, FALSE, 0);
944
gtk_widget_show_all (dialog);
945
g_signal_connect (G_OBJECT (dialog), "response",
946
G_CALLBACK (prefs_dialog_button_pressed), procdata);
948
if (procdata->config.current_tab == 0)
949
gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 0);
951
gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 1);
955
entry_activate_cb (GtkEntry *entry, gpointer data)
957
GtkDialog *dialog = GTK_DIALOG (data);
959
gtk_dialog_response (dialog, 100);
964
** type determines whether if dialog is for killing process (type=0) or renice (type=other).
965
** extra_value is not used for killing and is priority for renice
967
void procdialog_create_root_password_dialog (gint type, ProcData *procdata, gint pid,
968
gint extra_value, gchar *text)
971
GtkWidget *error_dialog;
972
GtkWidget *main_vbox;
976
gchar *title = NULL, *button_label;
978
gchar *password, *blank;
982
if (extra_value == SIGKILL) {
983
title = g_strdup (_("Kill Process"));
984
button_label = g_strdup (_("_Kill Process"));
987
title = g_strdup (_("End Process"));
988
button_label = g_strdup (_("_End Process"));
992
title = g_strdup (_("Change Priority"));
993
button_label = g_strdup (_("Change _Priority"));
996
dialog = gtk_dialog_new_with_buttons (title, NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
997
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1001
main_vbox = GTK_DIALOG (dialog)->vbox;
1003
label = gtk_label_new (_(text));
1004
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1005
gtk_misc_set_padding (GTK_MISC (label), GNOME_PAD, 2 * GNOME_PAD);
1006
gtk_box_pack_start (GTK_BOX (main_vbox), label, FALSE, FALSE, 0);
1008
hbox = gtk_hbox_new (FALSE, 0);
1009
gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
1010
gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
1012
label = gtk_label_new (_("Root Password :"));
1013
gtk_misc_set_padding (GTK_MISC (label), GNOME_PAD_SMALL, 0);
1014
gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, FALSE, 0);
1016
entry = gtk_entry_new ();
1017
gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
1018
gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, FALSE, 0);
1019
g_signal_connect (G_OBJECT (entry), "activate",
1020
G_CALLBACK (entry_activate_cb), dialog);
1022
gtk_widget_show_all (main_vbox);
1024
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
1025
gtk_widget_grab_focus (entry);
1028
g_free (button_label);
1030
retval = gtk_dialog_run (GTK_DIALOG (dialog));
1031
gtk_widget_hide (dialog);
1033
if (retval == 100) {
1034
password = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
1038
blank = g_strdup (password);
1040
memset (blank, ' ', strlen (blank));
1042
gtk_entry_set_text (GTK_ENTRY (entry), blank);
1043
gtk_entry_set_text (GTK_ENTRY (entry), "");
1047
command = g_strdup_printf ("kill -s %d %d", extra_value, pid);
1049
command = g_strdup_printf ("renice %d %d", extra_value, pid);
1051
if (su_run_with_password (command, password) == -1) {
1052
error_dialog = gtk_message_dialog_new (NULL,
1053
GTK_DIALOG_DESTROY_WITH_PARENT,
1057
_("Wrong Password."));
1058
gtk_dialog_run (GTK_DIALOG (error_dialog));
1059
gtk_widget_destroy (error_dialog);
1064
gtk_widget_destroy (dialog);