diff --git a/src/Makefile.am b/src/Makefile.am index bcf3db5..5d8a03a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,7 @@ xfce4_taskmanager_SOURCES = \ process-window.c process-window.h \ process-tree-view.c process-tree-view.h \ process-statusbar.c process-statusbar.h \ + task-manager.c task-manager.h \ settings.c settings.h \ $(NULL) diff --git a/src/main.c b/src/main.c index 7f86fc6..36b1403 100644 --- a/src/main.c +++ b/src/main.c @@ -15,10 +15,12 @@ #include #include "process-window.h" +#include "task-manager.h" int main (int argc, char *argv[]) { GtkWidget *window; + XtmTaskManager *task_manager; #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); @@ -31,6 +33,9 @@ int main (int argc, char *argv[]) window = xtm_process_window_new (); gtk_widget_show (window); + task_manager = xtm_task_manager_new (); + g_message ("Running as %s on %s", xtm_task_manager_get_username (task_manager), xtm_task_manager_get_hostname (task_manager)); + g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_main (); diff --git a/src/process-statusbar.c b/src/process-statusbar.c index 6175607..6c14232 100644 --- a/src/process-statusbar.c +++ b/src/process-statusbar.c @@ -23,6 +23,7 @@ enum { PROP_CPU = 1, PROP_MEMORY, + PROP_SWAP, PROP_NUM_PROCESSES, }; typedef struct _XtmProcessStatusbarClass XtmProcessStatusbarClass; @@ -37,9 +38,11 @@ struct _XtmProcessStatusbar GtkWidget * label_num_processes; GtkWidget * label_cpu; GtkWidget * label_memory; + GtkWidget * label_swap; gushort cpu; - guint64 memory; + gushort memory; + gushort swap; guint num_processes; }; G_DEFINE_TYPE (XtmProcessStatusbar, xtm_process_statusbar, GTK_TYPE_STATUSBAR) @@ -57,7 +60,9 @@ xtm_process_statusbar_class_init (XtmProcessStatusbarClass *klass) g_object_class_install_property (class, PROP_CPU, g_param_spec_uint ("cpu", "CPU", "CPU usage", 0, 100, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); g_object_class_install_property (class, PROP_MEMORY, - g_param_spec_uint64 ("memory", "Memory", "Memory usage", 0, G_MAXUINT64, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); + g_param_spec_uint ("memory", "Memory", "Memory usage", 0, 100, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); + g_object_class_install_property (class, PROP_SWAP, + g_param_spec_uint ("swap", "Swap", "Swap usage", 0, 100, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); g_object_class_install_property (class, PROP_NUM_PROCESSES, g_param_spec_uint ("num-processes", "NumProcesses", "Number of processes", 0, G_MAXUINT, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); } @@ -85,7 +90,7 @@ xtm_process_statusbar_init (XtmProcessStatusbar *statusbar) } #endif - hbox = gtk_hbox_new (FALSE, 24); + hbox = gtk_hbox_new (FALSE, 16); gtk_box_pack_start (GTK_BOX (area), hbox, TRUE, TRUE, 0); statusbar->label_num_processes = gtk_label_new (NULL); @@ -97,6 +102,9 @@ xtm_process_statusbar_init (XtmProcessStatusbar *statusbar) statusbar->label_memory = gtk_label_new (NULL); gtk_box_pack_start (GTK_BOX (hbox), statusbar->label_memory, FALSE, FALSE, 0); + statusbar->label_swap = gtk_label_new (NULL); + gtk_box_pack_start (GTK_BOX (hbox), statusbar->label_swap, FALSE, FALSE, 0); + gtk_widget_show_all (hbox); } @@ -116,12 +124,19 @@ xtm_process_statusbar_set_property (GObject *object, guint property_id, const GV break; case PROP_MEMORY: - statusbar->memory = g_value_get_uint64 (value); + statusbar->memory = g_value_get_uint (value); text = g_strdup_printf (_("Memory: %d%%"), statusbar->memory); gtk_label_set_text (GTK_LABEL (statusbar->label_memory), text); g_free (text); break; + case PROP_SWAP: + statusbar->swap = g_value_get_uint (value); + text = g_strdup_printf (_("Swap: %d%%"), statusbar->swap); + gtk_label_set_text (GTK_LABEL (statusbar->label_swap), text); + g_free (text); + break; + case PROP_NUM_PROCESSES: statusbar->num_processes = g_value_get_uint (value); text = g_strdup_printf (_("Processes: %d"), statusbar->num_processes); diff --git a/src/process-window.c b/src/process-window.c index 57155fd..9ffd722 100644 --- a/src/process-window.c +++ b/src/process-window.c @@ -75,12 +75,6 @@ xtm_process_window_class_init (XtmProcessWindowClass *klass) class->get_property = xtm_process_window_get_property; class->set_property = xtm_process_window_set_property; - g_object_class_install_property (class, PROP_CPU, - g_param_spec_uint ("cpu", "CPU", "CPU usage", 0, 100, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); - g_object_class_install_property (class, PROP_MEMORY, - g_param_spec_uint64 ("memory", "Memory", "Memory usage", 0, G_MAXUINT64, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); - g_object_class_install_property (class, PROP_NUM_PROCESSES, - g_param_spec_uint ("num-processes", "NumProcesses", "Number of processes", 0, G_MAXUINT, 0, G_PARAM_CONSTRUCT|G_PARAM_WRITABLE)); } static void @@ -171,23 +165,6 @@ xtm_process_window_set_property (GObject *object, guint property_id, const GValu switch (property_id) { - case PROP_CPU: - priv->cpu = g_value_get_uint (value); - // TODO update_cpu_monitor (); - g_object_set (priv->statusbar, "cpu", priv->cpu, NULL); - break; - - case PROP_MEMORY: - priv->memory = g_value_get_uint64 (value); - // TODO update_memory_monitor (); - g_object_set (priv->statusbar, "memory", priv->memory, NULL); - break; - - case PROP_NUM_PROCESSES: - priv->num_processes = g_value_get_uint (value); - g_object_set (priv->statusbar, "num_processes", priv->num_processes, NULL); - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -225,11 +202,8 @@ execute_command (const gchar *command) static void menu_execute_append_item (GtkMenu *menu, gchar *title, gchar *command, gchar *icon_name) { - GtkWidget *mi; - GtkWidget *image; - - image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); - mi = gtk_image_menu_item_new_with_label (title); + GtkWidget *image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU); + GtkWidget *mi = gtk_image_menu_item_new_with_label (title); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); g_signal_connect_swapped (mi, "activate", G_CALLBACK (execute_command), command); @@ -258,11 +232,8 @@ show_menu_execute_task (XtmProcessWindow *window) static void preferences_toggled (GtkCheckMenuItem *mi, XtmSettings *settings) { - gchar *setting_name; - gboolean active; - - active = gtk_check_menu_item_get_active (mi); - setting_name = g_object_get_data (G_OBJECT (mi), "setting-name"); + gboolean active = gtk_check_menu_item_get_active (mi); + gchar *setting_name = g_object_get_data (G_OBJECT (mi), "setting-name"); g_object_set (settings, setting_name, active, NULL); } @@ -385,14 +356,6 @@ xtm_process_window_hide (GtkWidget *widget) gtk_widget_hide (XTM_PROCESS_WINDOW (widget)->priv->window); } -void -xtm_process_window_set_model (XtmProcessWindow *window, GtkTreeModel *model) -{ - g_return_if_fail (G_LIKELY (XTM_IS_PROCESS_WINDOW (window))); - g_return_if_fail (G_LIKELY (GTK_IS_TREE_VIEW (window->priv->treeview))); - gtk_tree_view_set_model (GTK_TREE_VIEW (window->priv->treeview), model); -} - GtkTreeModel * xtm_process_window_get_model (XtmProcessWindow *window) { @@ -402,10 +365,11 @@ xtm_process_window_get_model (XtmProcessWindow *window) } void -xtm_process_window_set_system_info (XtmProcessWindow *window, guint num_processes, gushort cpu, guint64 memory) +xtm_process_window_set_system_info (XtmProcessWindow *window, guint num_processes, gushort cpu, gushort memory, gushort swap) { g_return_if_fail (G_LIKELY (XTM_IS_PROCESS_WINDOW (window))); g_return_if_fail (G_LIKELY (GTK_IS_STATUSBAR (window->priv->statusbar))); - g_object_set (window, "num-processes", num_processes, "cpu", cpu, "memory", memory, NULL); + g_object_set (window->priv->statusbar, "num-processes", num_processes, "cpu", cpu, "memory", memory, "swap", swap, NULL); + // TODO update cpu/memory monitors } diff --git a/src/process-window.h b/src/process-window.h index 8555d92..4e3cee2 100644 --- a/src/process-window.h +++ b/src/process-window.h @@ -29,6 +29,6 @@ typedef struct _XtmProcessWindow XtmProcessWindow; GType xtm_process_window_get_type (void); GtkWidget * xtm_process_window_new (); GtkTreeModel * xtm_process_window_get_model (XtmProcessWindow *window); -void xtm_process_window_set_system_info (XtmProcessWindow *window, guint num_processes, gushort cpu, guint64 mem); +void xtm_process_window_set_system_info (XtmProcessWindow *window, guint num_processes, gushort cpu, gushort memory, gushort swap); #endif /* !PROCESS_WINDOW_H */ diff --git a/src/task-manager.c b/src/task-manager.c new file mode 100644 index 0000000..36e5474 --- /dev/null +++ b/src/task-manager.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2010 Mike Massonnet, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include + +#include "task-manager.h" + + + +typedef struct _XtmTaskManagerClass XtmTaskManagerClass; +struct _XtmTaskManagerClass +{ + GObjectClass parent_class; +}; +struct _XtmTaskManager +{ + GObject parent; + /**/ + GArray * tasks; + guint owner_uid; + gchar * owner_uid_name; + gchar * hostname; + gushort cpu_count; + gushort cpu_user; + gushort cpu_system; + guint64 memory_total; + guint64 memory_free; + guint64 memory_cache; + guint64 memory_buffers; + guint64 swap_total; + guint64 swap_free; +}; +G_DEFINE_TYPE (XtmTaskManager, xtm_task_manager, G_TYPE_OBJECT) + +static void xtm_task_manager_finalize (GObject *object); + +static void get_owner_uid (guint *owner_uid, gchar **owner_uid_name); +static gchar * get_hostname (); + + + +static void +xtm_task_manager_class_init (XtmTaskManagerClass *klass) +{ + GObjectClass *class = G_OBJECT_CLASS (klass); + xtm_task_manager_parent_class = g_type_class_peek_parent (klass); + class->finalize = xtm_task_manager_finalize; +} + +static void +xtm_task_manager_init (XtmTaskManager *manager) +{ + get_owner_uid (&(manager->owner_uid), &(manager->owner_uid_name)); + manager->hostname = get_hostname (); +} + +static void +xtm_task_manager_finalize (GObject *object) +{ + XtmTaskManager *manager = XTM_TASK_MANAGER (object); + g_free (manager->owner_uid_name); + g_free (manager->hostname); +} + +static void +get_owner_uid (guint *owner_uid, gchar **owner_uid_name) +{ + uid_t uid; + struct passwd *pw; + gchar *username = NULL; + + uid = getuid (); + pw = getpwuid (uid); + + username = g_strdup ((pw != NULL) ? pw->pw_name : "nobody"); + + *owner_uid = (guint) uid; + *owner_uid_name = username; +} + +static gchar * +get_hostname () +{ +#ifndef HOST_NAME_MAX +#define HOST_NAME_MAX 255 +#endif + char hostname[HOST_NAME_MAX]; + if (gethostname (hostname, HOST_NAME_MAX)) + return g_strdup ("(unknown)"); + return g_strdup_printf ("%s", hostname); +} + + + +XtmTaskManager * +xtm_task_manager_new () +{ + return g_object_new (XTM_TYPE_TASK_MANAGER, NULL); +} + +const gchar * +xtm_task_manager_get_username (XtmTaskManager *manager) +{ + g_return_val_if_fail (G_LIKELY (XTM_IS_TASK_MANAGER (manager)), NULL); + return manager->owner_uid_name; +} + +const gchar * +xtm_task_manager_get_hostname (XtmTaskManager *manager) +{ + g_return_val_if_fail (G_LIKELY (XTM_IS_TASK_MANAGER (manager)), NULL); + return manager->hostname; +} + +GArray * +xtm_task_manager_get_tasklist (XtmTaskManager *manager) +{ +} + +void +xtm_task_manager_get_system_info (XtmTaskManager *manager, guint *num_processes, gushort *cpu, gushort *memory, gushort *swap) +{ +} + +void +xtm_task_manager_send_signal_to_pid (XtmTaskManager *manager) +{ +} + +void +xtm_task_manager_set_priority_to_pid (XtmTaskManager *manager) +{ +} + diff --git a/src/task-manager.h b/src/task-manager.h new file mode 100644 index 0000000..df3a14f --- /dev/null +++ b/src/task-manager.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2010 Mike Massonnet, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef TASK_MANAGER_H +#define TASK_MANAGER_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +typedef struct _Task Task; +struct _Task +{ + guint uid; + gchar uid_name[64]; + guint pid; + guint ppid; + gchar program_name[64]; + gchar full_cmdline[255]; + gchar state[16]; + gushort cpu; + guint64 memory_vsz; + guint64 memory_rss; + gushort priority; +}; + +#define XTM_TYPE_TASK_MANAGER (xtm_task_manager_get_type ()) +#define XTM_TASK_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XTM_TYPE_TASK_MANAGER, XtmTaskManager)) +#define XTM_TASK_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XTM_TYPE_TASK_MANAGER, XtmTaskManagerClass)) +#define XTM_IS_TASK_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XTM_TYPE_TASK_MANAGER)) +#define XTM_IS_TASK_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), XTM_TYPE_TASK_MANAGER)) +#define XTM_TASK_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XTM_TYPE_TASK_MANAGER, XtmTaskManagerClass)) + +typedef struct _XtmTaskManager XtmTaskManager; + +GType xtm_task_manager_get_type (void); +XtmTaskManager * xtm_task_manager_new (); +const gchar * xtm_task_manager_get_username (XtmTaskManager *manager); +const gchar * xtm_task_manager_get_hostname (XtmTaskManager *manager); + +#endif /* !TASK_MANAGER_H */