source: trunk/third/gnome-system-monitor/src/procman.c @ 18394

Revision 18394, 16.1 KB checked in by ghudson, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r18393, which included commits to RCS files with non-trunk default branches.
Line 
1/* Procman
2 * Copyright (C) 2001 Kevin Vandersloot
3 *
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.
8 *
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.
13 *
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.
17 *
18 */
19
20#include <config.h>
21
22#include <gnome.h>
23#include <libgnomeui/gnome-window-icon.h>
24#include <gconf/gconf-client.h>
25#include <glibtop.h>
26#include <pthread.h>
27#include "procman.h"
28#include "interface.h"
29#include "proctable.h"
30#include "prettytable.h"
31#include "favorites.h"
32#include "callbacks.h"
33
34GtkWidget *app;
35static int simple_view = FALSE;
36pthread_t thread;
37
38
39struct poptOption options[] = {
40  {
41    "simple",
42    's',
43    POPT_ARG_NONE,
44    &simple_view,
45    0,
46    N_("show simple dialog to end processes and logout"),
47    NULL,
48  },
49  {
50    NULL,
51    '\0',
52    0,
53    NULL,
54    0,
55    NULL,
56    NULL
57  }
58};
59
60static void
61load_desktop_files (ProcData *pd)
62{
63        pd->pretty_table = pretty_table_new (pd);
64}
65
66static void
67tree_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
68{
69        ProcData *procdata = data;
70        GConfValue *value = gconf_entry_get_value (entry);
71       
72        procdata->config.show_tree = gconf_value_get_bool (value);
73        proctable_clear_tree (procdata);
74        proctable_update_all (procdata);
75       
76}
77
78static void
79threads_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
80{
81        ProcData *procdata = data;
82        GConfValue *value = gconf_entry_get_value (entry);
83       
84        procdata->config.show_threads = gconf_value_get_bool (value);
85        proctable_clear_tree (procdata);
86        proctable_update_all (procdata);
87       
88}
89
90static void
91view_as_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
92{
93        ProcData *procdata = data;
94        GConfValue *value = gconf_entry_get_value (entry);
95       
96        procdata->config.whose_process = gconf_value_get_int (value);
97        procdata->config.whose_process = CLAMP (procdata->config.whose_process, 0, 2);
98        proctable_clear_tree (procdata);
99        proctable_update_all (procdata);
100       
101}
102
103static void
104warning_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
105{
106        ProcData *procdata = data;
107        const gchar *key = gconf_entry_get_key (entry);
108        GConfValue *value = gconf_entry_get_value (entry);
109       
110        if (!g_strcasecmp (key, "/apps/procman/kill_dialog")) {
111                procdata->config.show_kill_warning = gconf_value_get_bool (value);
112        }
113        else {
114                procdata->config.show_hide_message = gconf_value_get_bool (value);
115        }
116}
117
118static void
119timeouts_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
120{
121        ProcData *procdata = data;
122        const gchar *key = gconf_entry_get_key (entry);
123        GConfValue *value = gconf_entry_get_value (entry);
124
125        if (!g_strcasecmp (key, "/apps/procman/update_interval")) {
126                procdata->config.update_interval = gconf_value_get_int (value);
127                procdata->config.update_interval =
128                        MAX (procdata->config.update_interval, 1000);
129                gtk_timeout_remove (procdata->timeout);
130                procdata->timeout = gtk_timeout_add (procdata->config.update_interval,
131                                                     cb_timeout, procdata);
132        }
133        else if (!g_strcasecmp (key, "/apps/procman/graph_update_interval")){
134                procdata->config.graph_update_interval = gconf_value_get_int (value);
135                procdata->config.graph_update_interval =
136                        MAX (procdata->config.graph_update_interval,
137                             250);
138                gtk_timeout_remove (procdata->cpu_graph->timer_index);
139                procdata->cpu_graph->timer_index = -1;
140                procdata->cpu_graph->speed = procdata->config.graph_update_interval;
141               
142       
143                gtk_timeout_remove (procdata->mem_graph->timer_index);
144                procdata->mem_graph->timer_index = -1;
145                procdata->mem_graph->speed = procdata->config.graph_update_interval;
146       
147                load_graph_start (procdata->cpu_graph);
148                load_graph_start (procdata->mem_graph);
149        }
150        else {
151               
152                procdata->config.disks_update_interval = gconf_value_get_int (value);
153                procdata->config.disks_update_interval =
154                        MAX (procdata->config.disks_update_interval, 1000);     
155                gtk_timeout_remove (procdata->disk_timeout);
156                procdata->disk_timeout =
157                        gtk_timeout_add (procdata->config.disks_update_interval,
158                                         cb_update_disks, procdata);   
159               
160        }
161}
162
163static void
164color_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data)
165{
166        ProcData *procdata = data;
167        const gchar *key = gconf_entry_get_key (entry);
168        GConfValue *value = gconf_entry_get_value (entry);
169        const gchar *color = gconf_value_get_string (value);
170
171        if (!g_strcasecmp (key, "/apps/procman/bg_color")) {
172                gdk_color_parse (color, &procdata->config.bg_color);
173                procdata->cpu_graph->colors[0] = procdata->config.bg_color;
174                procdata->mem_graph->colors[0] = procdata->config.bg_color;
175        }
176        else if (!g_strcasecmp (key, "/apps/procman/frame_color")) {
177                gdk_color_parse (color, &procdata->config.frame_color);
178                procdata->cpu_graph->colors[1] = procdata->config.frame_color;
179                procdata->mem_graph->colors[1] = procdata->config.frame_color;
180        }
181        else if (!g_strcasecmp (key, "/apps/procman/cpu_color")) {
182                gdk_color_parse (color, &procdata->config.cpu_color);
183                procdata->cpu_graph->colors[2] = procdata->config.cpu_color;
184        }
185        else if (!g_strcasecmp (key, "/apps/procman/mem_color")) {
186                gdk_color_parse (color, &procdata->config.mem_color);
187                procdata->mem_graph->colors[2] = procdata->config.mem_color;
188        }
189        else if (!g_strcasecmp (key, "/apps/procman/swap_color")) {
190                gdk_color_parse (color, &procdata->config.swap_color);
191                procdata->mem_graph->colors[3] = procdata->config.swap_color;
192        }
193               
194        procdata->cpu_graph->colors_allocated = FALSE;
195        procdata->mem_graph->colors_allocated = FALSE;
196               
197}
198
199static ProcData *
200procman_data_new (GConfClient *client)
201{
202
203        ProcData *pd;
204        gchar *color;
205        gint swidth, sheight;
206       
207        pd = g_new0 (ProcData, 1);
208       
209        pd->tree = NULL;
210        pd->infobox = NULL;
211        pd->info = NULL;
212        pd->selected_process = NULL;
213        pd->timeout = -1;
214        pd->blacklist = NULL;
215        pd->cpu_graph = NULL;
216        pd->mem_graph = NULL;
217        pd->disk_timeout = -1;
218
219        pd->config.width = gconf_client_get_int (client, "/apps/procman/width", NULL);
220        pd->config.height = gconf_client_get_int (client, "/apps/procman/height", NULL);
221        pd->config.show_more_info = gconf_client_get_bool (client, "/apps/procman/more_info", NULL);
222        pd->config.show_tree = gconf_client_get_bool (client, "/apps/procman/show_tree", NULL);
223        gconf_client_notify_add (client, "/apps/procman/show_tree", tree_changed_cb,
224                                 pd, NULL, NULL);
225        pd->config.show_kill_warning = gconf_client_get_bool (client, "/apps/procman/kill_dialog",
226                                                              NULL);
227        gconf_client_notify_add (client, "/apps/procman/kill_dialog", warning_changed_cb,
228                                 pd, NULL, NULL);
229        pd->config.show_hide_message = gconf_client_get_bool (client, "/apps/procman/hide_message",
230                                                              NULL);
231        gconf_client_notify_add (client, "/apps/procman/hide_message", warning_changed_cb,
232                                 pd, NULL, NULL);
233        pd->config.show_threads = gconf_client_get_bool (client, "/apps/procman/show_threads", NULL);
234        gconf_client_notify_add (client, "/apps/procman/show_threads", threads_changed_cb,
235                                 pd, NULL, NULL);
236        pd->config.update_interval = gconf_client_get_int (client, "/apps/procman/update_interval",
237                                                           NULL);
238        gconf_client_notify_add (client, "/apps/procman/update_interval", timeouts_changed_cb,
239                                 pd, NULL, NULL);
240        pd->config.graph_update_interval = gconf_client_get_int (client,
241                                                "/apps/procman/graph_update_interval",
242                                                NULL);
243        gconf_client_notify_add (client, "/apps/procman/graph_update_interval", timeouts_changed_cb,
244                                 pd, NULL, NULL);
245        pd->config.disks_update_interval = gconf_client_get_int (client,
246                                                                 "/apps/procman/disks_interval",
247                                                                 NULL);
248        gconf_client_notify_add (client, "/apps/procman/disks_interval", timeouts_changed_cb,
249                                 pd, NULL, NULL);
250        pd->config.whose_process = gconf_client_get_int (client, "/apps/procman/view_as", NULL);
251        gconf_client_notify_add (client, "/apps/procman/view_as", view_as_changed_cb,
252                                 pd, NULL, NULL);
253        pd->config.current_tab = gconf_client_get_int (client, "/apps/procman/current_tab", NULL);
254        pd->config.pane_pos = gconf_client_get_int (client, "/apps/procman/pane_pos", NULL);
255
256        color = gconf_client_get_string (client, "/apps/procman/bg_color", NULL);
257        if (!color)
258                color = g_strdup ("#000000");
259        gconf_client_notify_add (client, "/apps/procman/bg_color",
260                                 color_changed_cb, pd, NULL, NULL);
261        gdk_color_parse(color, &pd->config.bg_color);
262        g_free (color);
263       
264        color = gconf_client_get_string (client, "/apps/procman/frame_color", NULL);
265        if (!color)
266                color = g_strdup ("#231e89aa2805");
267        gconf_client_notify_add (client, "/apps/procman/frame_color",
268                                 color_changed_cb, pd, NULL, NULL);
269        gdk_color_parse(color, &pd->config.frame_color);
270        g_free (color);
271       
272        color = gconf_client_get_string (client, "/apps/procman/cpu_color", NULL);
273        if (!color)
274                color = g_strdup ("#f25915e815e8");
275        gconf_client_notify_add (client, "/apps/procman/cpu_color",
276                                 color_changed_cb, pd, NULL, NULL);
277        gdk_color_parse(color, &pd->config.cpu_color);
278        g_free (color);
279       
280        color = gconf_client_get_string (client, "/apps/procman/mem_color", NULL);
281        if (!color)
282                color = g_strdup ("#f25915e815e8");
283        gconf_client_notify_add (client, "/apps/procman/mem_color",
284                                 color_changed_cb, pd, NULL, NULL);
285        gdk_color_parse(color, &pd->config.mem_color);
286       
287        g_free (color);
288       
289        color = gconf_client_get_string (client, "/apps/procman/swap_color", NULL);
290        if (!color)
291                color = g_strdup ("#212fe32b212f");
292        gconf_client_notify_add (client, "/apps/procman/swap_color",
293                                 color_changed_cb, pd, NULL, NULL);
294        gdk_color_parse(color, &pd->config.swap_color);
295        g_free (color);
296       
297        get_blacklist (pd, client);
298
299        pd->config.simple_view = FALSE;
300        if (pd->config.simple_view) {
301                pd->config.width = 325;
302                pd->config.height = 400;
303                pd->config.whose_process = 1;
304                pd->config.show_more_info = FALSE;
305                pd->config.show_tree = FALSE;
306                pd->config.show_kill_warning = TRUE;
307                pd->config.show_threads = FALSE;
308                pd->config.current_tab = 0;
309        }       
310       
311        /* Sanity checks */
312        swidth = gdk_screen_width ();
313        sheight = gdk_screen_height ();
314        pd->config.width = CLAMP (pd->config.width, 50, swidth);
315        pd->config.height = CLAMP (pd->config.height, 50, sheight);
316        pd->config.update_interval = MAX (pd->config.update_interval, 1000);
317        pd->config.graph_update_interval = MAX (pd->config.graph_update_interval, 250);
318        pd->config.disks_update_interval = MAX (pd->config.disks_update_interval, 1000);
319        pd->config.whose_process = CLAMP (pd->config.whose_process, 0, 2);
320        pd->config.current_tab = CLAMP (pd->config.current_tab, 0, 1);
321        if (pd->config.pane_pos == 0)
322                pd->config.pane_pos = 300;
323       
324
325        return pd;
326
327}
328
329static void
330procman_free_data (ProcData *procdata)
331{
332
333        proctable_free_table (procdata);
334       
335        //pretty_table_free (procdata->pretty_table);
336       
337        g_free (procdata);
338       
339}
340
341
342gboolean
343procman_get_tree_state (GConfClient *client, GtkWidget *tree, gchar *prefix)
344{
345        GtkTreeModel *model;
346        gint sort_col;
347        GtkSortType order;
348        gchar *key;
349        gint i = 0;
350        gboolean done = FALSE;
351       
352        g_return_val_if_fail (tree, FALSE);
353        g_return_val_if_fail (prefix, FALSE);
354       
355        if (!gconf_client_dir_exists (client, prefix, NULL))
356                return FALSE;
357       
358        model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
359       
360        key = g_strdup_printf ("%s/sort_col", prefix);
361        sort_col = gconf_client_get_int (client, key, NULL);
362        g_free (key);
363       
364        key = g_strdup_printf ("%s/sort_order", prefix);
365        order = gconf_client_get_int (client, key, NULL);
366        g_free (key);
367       
368        if (sort_col != -1)
369                gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
370                                                      sort_col,
371                                                      order);
372       
373        while (!done) {
374                GtkTreeViewColumn *column;
375                GConfValue *value = NULL;
376                gint width;
377                gboolean visible;
378               
379               
380                key = g_strdup_printf ("%s/col_%d_width", prefix, i);
381                value = gconf_client_get (client, key, NULL);
382                g_free (key);
383               
384                if (value != NULL) {
385                        width = gconf_value_get_int(value);
386                        gconf_value_free (value);
387               
388                        key = g_strdup_printf ("%s/col_%d_visible", prefix, i);
389                        visible = gconf_client_get_bool (client, key, NULL);
390                        g_free (key);
391               
392                        column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree), i);
393                        gtk_tree_view_column_set_visible (column, visible);
394                        if (width > 0)
395                                gtk_tree_view_column_set_fixed_width (column, width);
396                }
397                else
398                        done = TRUE;
399               
400                i++;
401        }
402       
403        return TRUE;
404}
405
406void
407procman_save_tree_state (GConfClient *client, GtkWidget *tree, gchar *prefix)
408{
409        GtkTreeModel *model;
410        GList *columns;
411        gint sort_col;
412        GtkSortType order;
413        gint i = 0;
414       
415        g_return_if_fail (tree);
416        g_return_if_fail (prefix);
417       
418        model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
419        if (gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model), &sort_col,
420                                                  &order)) {
421                gchar *key;
422               
423                key = g_strdup_printf ("%s/sort_col", prefix);
424                gconf_client_set_int (client, key, sort_col, NULL);
425                g_free (key);
426               
427                key = g_strdup_printf ("%s/sort_order", prefix);
428                gconf_client_set_int (client, key, order, NULL);
429                g_free (key);
430        }                             
431       
432        columns = gtk_tree_view_get_columns (GTK_TREE_VIEW (tree));
433       
434        while (columns) {
435                GtkTreeViewColumn *column = columns->data;
436                gboolean visible;
437                gint width;
438                gchar *key;
439               
440                visible = gtk_tree_view_column_get_visible (column);
441                width = gtk_tree_view_column_get_width (column);
442               
443                key = g_strdup_printf ("%s/col_%d_width", prefix, i);
444                gconf_client_set_int (client, key, width, NULL);
445                g_free (key);
446               
447                key = g_strdup_printf ("%s/col_%d_visible", prefix, i);
448                gconf_client_set_bool (client, key, visible, NULL);
449                g_free (key);
450               
451                columns = g_list_next (columns);
452                i++;
453        }
454       
455}
456
457void
458procman_save_config (ProcData *data)
459{
460        GConfClient *client = data->client;
461        gint width, height, pane_pos;
462
463        if (!data)
464                return;
465               
466        if (data->config.simple_view)
467                return;
468               
469        procman_save_tree_state (data->client, data->tree, "/apps/procman/proctree");
470        procman_save_tree_state (data->client, data->disk_list, "/apps/procman/disktree");
471               
472        gdk_window_get_size (app->window, &width, &height);
473        data->config.width = width;
474        data->config.height = height;
475       
476        pane_pos = get_sys_pane_pos ();
477        data->config.pane_pos = pane_pos;
478       
479        gconf_client_set_int (client, "/apps/procman/width", data->config.width, NULL);
480        gconf_client_set_int (client, "/apps/procman/height", data->config.height, NULL);       
481        gconf_client_set_bool (client, "/apps/procman/more_info", data->config.show_more_info, NULL);
482        gconf_client_set_int (client, "/apps/procman/current_tab", data->config.current_tab, NULL);
483        gconf_client_set_int (client, "/apps/procman/pane_pos", data->config.pane_pos, NULL);
484       
485        save_blacklist (data, client);
486
487        gconf_client_suggest_sync (client, NULL);
488       
489
490       
491}
492
493
494int
495main (int argc, char *argv[])
496{
497        GnomeProgram *procman;
498        GConfClient *client;
499        ProcData *procdata;
500        GValue value = {0,};
501        poptContext pctx;
502        char **args;
503       
504        bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
505        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
506        textdomain (GETTEXT_PACKAGE);
507
508        procman = gnome_program_init ("gnome-system-monitor", VERSION,
509                                      LIBGNOMEUI_MODULE, argc, argv,
510                                      GNOME_PARAM_POPT_TABLE, options,
511                                      GNOME_PARAM_APP_DATADIR,DATADIR, NULL);
512        gnome_window_icon_set_default_from_file (GNOME_ICONDIR"/procman.png");
513                   
514        gconf_init (argc, argv, NULL);
515                           
516        client = gconf_client_get_default ();
517        gconf_client_add_dir(client, "/apps/procman", GCONF_CLIENT_PRELOAD_NONE, NULL);
518                           
519        /*g_value_init (&value, G_TYPE_POINTER);
520        g_object_get_property (G_OBJECT(procman),
521                               GNOME_PARAM_POPT_CONTEXT, &value);
522        (poptContext)pctx = g_value_get_pointer (&value);
523                               
524        args = (char**) poptGetArgs (pctx);
525        poptFreeContext(pctx);*/
526       
527        glibtop_init ();
528       
529        procdata = procman_data_new (client);
530        procdata->client = client;
531       
532        if (procdata->config.simple_view)
533                app = create_simple_view_dialog (procdata);
534        else
535                app = create_main_window (procdata);
536       
537        load_desktop_files (procdata);
538       
539        proctable_update_all (procdata);
540                 
541       
542        if (!app)
543                return 0; 
544                       
545        gtk_widget_show (app); 
546       
547        gtk_main ();
548       
549        procman_free_data (procdata);
550
551        return 0;
552}
553
Note: See TracBrowser for help on using the repository browser.