From 32efbc9bbea5fd37ae4099ed3420d91eea9b1f49 Mon Sep 17 00:00:00 2001 From: Johannes Zellner Date: Fri, 11 Feb 2005 10:26:29 +0000 Subject: [PATCH] *** empty log message *** (Old svn revision: 535) --- src/functions.c | 144 ++++++++++++++++++++++++++---- src/functions.h | 18 +++- src/gui.c | 226 +++++++++++++++++++++++++++++++++++++----------- src/gui.h | 7 +- src/main.c | 3 +- 5 files changed, 328 insertions(+), 70 deletions(-) diff --git a/src/functions.c b/src/functions.c index 0e2a206..a3032a4 100644 --- a/src/functions.c +++ b/src/functions.c @@ -37,7 +37,7 @@ void send_signal_to_task(gchar *task_id, gchar *signal) } } -void refresh_task_list() +void refresh_task_list(gboolean first_time) { /* markes all tasks to "not checked" */ gint i; @@ -73,13 +73,14 @@ void refresh_task_list() if(line_count == 0) strcpy(task.name,g_strstrip(g_strsplit(buffer, ":", 2)[1])); else if(line_count == 3) - strcpy(task.pid,g_strstrip(g_strsplit(buffer, ":", 2)[1])); + task.pid = atoi(g_strstrip(g_strsplit(buffer, ":", 2)[1])); else if(line_count == 5) - strcpy(task.ppid,g_strstrip(g_strsplit(buffer, ":", 2)[1])); + task.ppid = atoi(g_strstrip(g_strsplit(buffer, ":", 2)[1])); else if(line_count == 7) { - passwdp = getpwuid(atoi(g_strsplit(g_strstrip(g_strsplit(buffer, ":", 2)[1]), "\t", 2)[0])); - strcpy(task.uid, passwdp->pw_name); + task.uid = atoi(g_strsplit(g_strstrip(g_strsplit(buffer, ":", 2)[1]), "\t", 2)[0]); + passwdp = getpwuid(task.uid); + strcpy(task.uname, passwdp->pw_name); } line_count++; @@ -93,7 +94,7 @@ void refresh_task_list() for(i = 0; i < task_count; i++) { - if(strcmp(all_tasks[i].pid,task.pid) == 0) + if(all_tasks[i].pid == task.pid) { all_tasks[i].checked = TRUE; new_task = FALSE; @@ -105,27 +106,33 @@ void refresh_task_list() task.checked = TRUE; all_tasks[task_count] = task; task_count++; - add_new_list_item(task); + + if(!first_time) + add_tree_item(task); } } } } closedir(dir); - /* removing all tasks which are not marked */ - i = 0; - - while(i < task_count) + if(!first_time) { - if(!all_tasks[i].checked) + /* removing all tasks which are not marked */ + i = 0; + + while(i < task_count) { - remove_list_item(all_tasks[i]); - remove_task_from_array(i); + if(!all_tasks[i].checked) + { + remove_tree_item(all_tasks[i]); + remove_task_from_array(i); + } + i++; } - i++; } } +/* removes a task from the taskarray */ void remove_task_from_array(gint count) { gint i; @@ -136,3 +143,110 @@ void remove_task_from_array(gint count) } task_count--; } + +/* checks if there is a parent task (ppid) */ +struct task *get_parent_task(struct task task) +{ + gint i; + + for(i = 0; i < task_count; i++) + { + if(task.ppid == all_tasks[i].pid && all_tasks[i].pid != task.pid) + return(&all_tasks[i]); + } + + return(NULL); +} + +void show_user_tasks(void) +{ + gint i; + gint user_id = getuid(); + + for(i = 0; i < task_count; i++) + { + if(all_tasks[i].uid == user_id) + add_tree_item(all_tasks[i]); + } +} + +void hide_user_tasks(void) +{ + gint i; + gint user_id = getuid(); + + for(i = 0; i < task_count; i++) + { + if(all_tasks[i].uid == user_id) + remove_tree_item(all_tasks[i]); + } +} + +void show_root_tasks(void) +{ + gint i; + + for(i = 0; i < task_count; i++) + { + if(all_tasks[i].uid == 0) + add_tree_item(all_tasks[i]); + } +} + +void hide_root_tasks(void) +{ + gint i; + + for(i = 0; i < task_count; i++) + { + if(all_tasks[i].uid == 0) + remove_tree_item(all_tasks[i]); + } +} + +void show_other_tasks(void) +{ + gint i; + gint user_id = getuid(); + + for(i = 0; i < task_count; i++) + { + if(all_tasks[i].uid != user_id && all_tasks[i].uid != 0) + add_tree_item(all_tasks[i]); + } +} + +void hide_other_tasks(void) +{ + gint i; + gint user_id = getuid(); + + for(i = 0; i < task_count; i++) + { + if(all_tasks[i].uid != user_id && all_tasks[i].uid != 0) + remove_tree_item(all_tasks[i]); + } +} + +void load_config(void) +{ + gchar * homedir; + + homedir = xfce_resource_save_location(XFCE_RESOURCE_CONFIG, "xfce4", FALSE); + XfceRc *config_obj = xfce_rc_simple_open(g_build_filename(homedir, "taskmanager.rc", NULL), TRUE); + g_free(homedir); + + if(config_obj == NULL) + { + config_show_user_tasks = TRUE; + config_show_root_tasks = FALSE; + config_show_other_tasks = FALSE; + printf("Could not open configfile\n"); + } + else + { + config_show_user_tasks = xfce_rc_read_bool_entry(config_obj, "show_user_tasks", TRUE); + config_show_root_tasks = xfce_rc_read_bool_entry(config_obj, "show_root_tasks", FALSE); + config_show_other_tasks = xfce_rc_read_bool_entry(config_obj, "show_other_tasks", FALSE); + } +} diff --git a/src/functions.h b/src/functions.h index 7e17b8a..712559d 100644 --- a/src/functions.h +++ b/src/functions.h @@ -23,13 +23,29 @@ #include #include #include +#include +#include +#include #include "types.h" +/* config vars */ +gboolean config_show_user_tasks; +gboolean config_show_root_tasks; +gboolean config_show_other_tasks; + struct task all_tasks[512]; struct task task_list; -void refresh_task_list(void); +void refresh_task_list(gboolean first_time); void send_signal_to_task(gchar *task_id, gchar *signal); void remove_task_from_array(gint count); +struct task *get_parent_task(struct task task); +void show_user_tasks(void); +void hide_user_tasks(void); +void show_root_tasks(void); +void hide_root_tasks(void); +void show_other_tasks(void); +void hide_other_tasks(void); +void load_config(void); diff --git a/src/gui.c b/src/gui.c index 499738e..2e6aea3 100644 --- a/src/gui.c +++ b/src/gui.c @@ -57,16 +57,17 @@ void create_gui(void) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(box), scrolled_window, TRUE, TRUE, 0); gtk_widget_show(scrolled_window); - + tree_view = gtk_tree_view_new(); + g_signal_connect_swapped(G_OBJECT(tree_view), "button-press-event", G_CALLBACK(handle_mouse_events), G_OBJECT(task_popup_menu)); gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(tree_view)); gtk_widget_show(tree_view); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); - list_store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(list_store)); + tree_store = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(tree_store)); cell_renderer = gtk_cell_renderer_text_new(); @@ -83,10 +84,17 @@ void create_gui(void) gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); /* load the tasklist */ - refresh_task_list(); - + refresh_task_list(TRUE); + if(config_show_root_tasks) + show_root_tasks(); + if(config_show_user_tasks) + show_user_tasks(); + if(config_show_other_tasks) + show_other_tasks(); + /* Quit-button */ button = gtk_button_new_from_stock(GTK_STOCK_QUIT); + g_signal_connect_swapped(G_OBJECT(button), "button-press-event", G_CALLBACK(handle_mouse_events), G_OBJECT(main_popup_menu)); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), NULL); gtk_box_pack_start(GTK_BOX(box), button, FALSE, TRUE, 0); gtk_widget_show(button); @@ -94,55 +102,122 @@ void create_gui(void) gtk_widget_show(window); } + +GtkTreeIter get_iter_by_task(struct task *task) +{ + gboolean valid; + GtkTreeIter iter; + GtkTreeIter parent_iter; + parent_iter.stamp = -1; + gint count = 0; + + valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(tree_store), &iter); + + while(valid) + { + gchar *str_data; + gtk_tree_model_get(GTK_TREE_MODEL(tree_store), &iter, 1, &str_data, -1); + + if(task->ppid == atoi(str_data)) + { + g_free(str_data); + return(iter); + } + g_free(str_data); + + if(gtk_tree_model_iter_has_child(GTK_TREE_MODEL(tree_store), &iter)) + { + parent_iter = *gtk_tree_iter_copy(&iter); + valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(tree_store), &iter, &parent_iter); + } + else + { + valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(tree_store), &iter); + while(!valid) + { + if(parent_iter.stamp != -1) + { + iter = *gtk_tree_iter_copy(&parent_iter); + + if(!gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree_store), &parent_iter, &iter)) + parent_iter.stamp = -1; + + valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(tree_store), &iter); + } + else + break; + } + } + } + + iter.stamp = -1; + return(iter); +} + /* add new tasks to the list */ -gboolean add_new_list_item(struct task task) +gboolean add_tree_item(struct task task) { GtkTreeIter iter; + /* check if there is a parent task */ + struct task *parent_task = get_parent_task(task); + /* Append new line in the list */ - gtk_list_store_append(GTK_LIST_STORE(list_store), &iter); + if(parent_task == NULL) + { + gtk_tree_store_append(GTK_TREE_STORE(tree_store), &iter, NULL); + } + else + { + GtkTreeIter parent_iter = get_iter_by_task(&task); + + if(parent_iter.stamp == -1) + gtk_tree_store_append(GTK_TREE_STORE(tree_store), &iter, NULL); + else + gtk_tree_store_append(GTK_TREE_STORE(tree_store), &iter, &parent_iter); + } /* Fill the appended line with data */ - gchar *list_value_1 = g_strdup_printf("%s", task.uid); - gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 0, list_value_1, -1); + gchar *list_value_1 = g_strdup_printf("%s", task.uname); + gtk_tree_store_set(GTK_TREE_STORE(tree_store), &iter, 0, list_value_1, -1); g_free(list_value_1); - gchar *list_value_2 = g_strdup_printf("%s", task.pid); - gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 1, list_value_2, -1); + gchar *list_value_2 = g_strdup_printf("%i", task.pid); + gtk_tree_store_set(GTK_TREE_STORE(tree_store), &iter, 1, list_value_2, -1); g_free(list_value_2); - gchar *list_value_3 = g_strdup_printf("%s", task.ppid); - gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 2, list_value_3, -1); + gchar *list_value_3 = g_strdup_printf("%i", task.ppid); + gtk_tree_store_set(GTK_TREE_STORE(tree_store), &iter, 2, list_value_3, -1); g_free(list_value_3); gchar *list_value_4 = g_strdup_printf("%s", task.name); - gtk_list_store_set(GTK_LIST_STORE(list_store), &iter, 3, list_value_4, -1); + gtk_tree_store_set(GTK_TREE_STORE(tree_store), &iter, 3, list_value_4, -1); g_free(list_value_4); return(TRUE); } -void remove_list_item(struct task task) +void remove_tree_item(struct task task) { gboolean valid; GtkTreeIter iter; - valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list_store), &iter); + valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(tree_store), &iter); while(valid) { gchar *str_data; - gtk_tree_model_get(GTK_TREE_MODEL(list_store), &iter, 1, &str_data, -1); + gtk_tree_model_get(GTK_TREE_MODEL(tree_store), &iter, 1, &str_data, -1); - if(strcmp(task.pid,str_data) == 0) + if(task.pid == atoi(str_data)) { - gtk_list_store_remove(GTK_LIST_STORE(list_store), &iter); + gtk_tree_store_remove(GTK_TREE_STORE(tree_store), &iter); g_free(str_data); break; } g_free(str_data); - valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter); + valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(tree_store), &iter); } } @@ -190,6 +265,31 @@ GtkWidget *create_main_popup_menu() gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show(menuitem); + menuitem = gtk_check_menu_item_new_with_label("Show user tasks"); + if(config_show_user_tasks) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); + g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(handle_toggled_checkbox), "show_user_task"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); + + menuitem = gtk_check_menu_item_new_with_label("Show root tasks"); + if(config_show_root_tasks) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); + g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(handle_toggled_checkbox), "show_root_task"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); + + menuitem = gtk_check_menu_item_new_with_label("Show other tasks"); + if(config_show_other_tasks) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); + g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(handle_toggled_checkbox), "show_other_task"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); + + menuitem = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); + menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(gtk_main_quit), NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); @@ -211,55 +311,81 @@ gboolean handle_mouse_events(GtkWidget *widget, GdkEventButton *event) void handle_task_menu(GtkWidget *widget, gchar *signal) { - if(signal != NULL) + gchar *task_id = ""; + GtkTreeModel *model; + GtkTreeIter iter; + + if(signal != NULL && gtk_tree_selection_get_selected(selection, &model, &iter)) { if(strcmp(signal, "TERM") == 0) { if(xfce_confirm("Really TERM the Task?", GTK_STOCK_YES, NULL)) { - gchar *task_id = ""; - GtkTreeModel *model; - GtkTreeIter iter; - - if(gtk_tree_selection_get_selected(selection, &model, &iter)) - { - gtk_tree_model_get(model, &iter, 1, &task_id, -1); - send_signal_to_task(task_id, signal); - refresh_task_list(); - } + gtk_tree_model_get(model, &iter, 1, &task_id, -1); + send_signal_to_task(task_id, signal); + refresh_task_list(FALSE); } } else if(strcmp(signal, "KILL") == 0) { if(xfce_confirm("Really KILL the Task?", GTK_STOCK_YES, NULL)) { - gchar *task_id = ""; - GtkTreeModel *model; - GtkTreeIter iter; - - if(gtk_tree_selection_get_selected(selection, &model, &iter)) - { - gtk_tree_model_get(model, &iter, 1, &task_id, -1); - send_signal_to_task(task_id, signal); - refresh_task_list(); - } + gtk_tree_model_get(model, &iter, 1, &task_id, -1); + send_signal_to_task(task_id, signal); + refresh_task_list(FALSE); } } else { - gchar *task_id = ""; - GtkTreeModel *model; - GtkTreeIter iter; - - if(gtk_tree_selection_get_selected(selection, &model, &iter)) - { - gtk_tree_model_get(model, &iter, 1, &task_id, -1); - send_signal_to_task(task_id, signal); - } + gtk_tree_model_get(model, &iter, 1, &task_id, -1); + send_signal_to_task(task_id, signal); } } } +void handle_toggled_checkbox(GtkCheckMenuItem *widget, gchar *checkbox_id) +{ + if(strcmp(checkbox_id, "show_user_task") == 0) + { + if(widget->active) + { + config_show_user_tasks = TRUE; + show_user_tasks(); + } + else + { + config_show_user_tasks = FALSE; + hide_user_tasks(); + } + } + else if(strcmp(checkbox_id, "show_root_task") == 0) + { + if(widget->active) + { + config_show_root_tasks = TRUE; + show_root_tasks(); + } + else + { + config_show_root_tasks = FALSE; + hide_root_tasks(); + } + } + else if(strcmp(checkbox_id, "show_other_task") == 0) + { + if(widget->active) + { + config_show_other_tasks = TRUE; + show_other_tasks(); + } + else + { + config_show_other_tasks = FALSE; + hide_other_tasks(); + } + } +} + void show_about_dialog() { GtkWidget *about_dialog; diff --git a/src/gui.h b/src/gui.h index ef09362..fc506f0 100644 --- a/src/gui.h +++ b/src/gui.h @@ -26,13 +26,14 @@ GtkWidget *window; GtkTreeSelection *selection; -GtkListStore *list_store; +GtkTreeStore *tree_store; void gui_create(void); -gboolean add_new_list_item(struct task task); -void remove_list_item(struct task task); +gboolean add_tree_item(struct task task); +void remove_tree_item(struct task task); GtkWidget *create_task_popup_menu(void); GtkWidget *create_main_popup_menu(void); gboolean handle_mouse_events(GtkWidget *widget, GdkEventButton *event); void handle_task_menu(GtkWidget *widget, gchar *signal); +void handle_toggled_checkbox(GtkCheckMenuItem *widget, gchar *signal); void show_about_dialog(void); diff --git a/src/main.c b/src/main.c index dfd1fea..cc37765 100644 --- a/src/main.c +++ b/src/main.c @@ -33,7 +33,7 @@ /* handler for SIGALRM to refresh the list */ void refresh_handler(void) { - refresh_task_list(); + refresh_task_list(FALSE); alarm(REFRESH_INTERVAL); } @@ -42,6 +42,7 @@ int main(int argc, char *argv[]) { gtk_init(&argc, &argv); + load_config(); create_gui(); signal(SIGALRM, refresh_handler);