diff --git a/src/callbacks.c b/src/callbacks.c index 1f53401..9ca0d26 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -22,16 +22,23 @@ #include "callbacks.h" #include "menu-positions.h" -void on_button1_activate(GtkButton *button) +void on_preferences(GtkButton *button) { if(mainmenu == NULL) mainmenu = create_mainmenu(); - gtk_menu_popup(GTK_MENU(mainmenu), NULL, NULL, (GtkMenuPositionFunc)position_mainmenu, button, 0, gtk_get_current_event_time()); + gtk_menu_popup(GTK_MENU(mainmenu), NULL, NULL, (GtkMenuPositionFunc)position_menu_cover_widget, button, 0, gtk_get_current_event_time()); } -void on_button3_toggled_event(GtkButton *button, GdkEventButton *event) +void on_information(GtkButton *button) { - full_view = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)); + if(infomenu == NULL) + infomenu = create_infomenu(); + gtk_menu_popup(GTK_MENU(infomenu), NULL, NULL, (GtkMenuPositionFunc)position_menu_cover_widget, button, 0, gtk_get_current_event_time()); +} + +void on_show_info_toggled(GtkCheckMenuItem *menuitem, gint column_id) +{ + show_col[column_id] = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); change_list_store_view(); } diff --git a/src/callbacks.h b/src/callbacks.h index a501973..5f74ed1 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -34,8 +34,9 @@ #include "xfce-taskmanager-linux.h" -void on_button1_activate(GtkButton *button); -void on_button3_toggled_event(GtkButton *button, GdkEventButton *event); +void on_preferences(GtkButton *button); +void on_information(GtkButton *button); +void on_show_info_toggled(GtkCheckMenuItem *menuitem, gint uid); gboolean on_treeview1_button_press_event(GtkButton *button, GdkEventButton *event); void on_info1_activate (GtkMenuItem *menuitem, gpointer user_data); void handle_task_menu(GtkWidget *widget, gchar *signal); diff --git a/src/functions.c b/src/functions.c index 25958ec..2c31eba 100644 --- a/src/functions.c +++ b/src/functions.c @@ -201,11 +201,20 @@ void load_config(void) sort_column = xfce_rc_read_int_entry(rc_file, "sort_column", COLUMN_PID); sort_type = xfce_rc_read_int_entry(rc_file, "sort_type", GTK_SORT_ASCENDING); - full_view = xfce_rc_read_bool_entry(rc_file, "full_view", FALSE); - win_width = xfce_rc_read_int_entry(rc_file, "win_width", 500); win_height = xfce_rc_read_int_entry(rc_file, "win_height", 400); + xfce_rc_set_group (rc_file, "Information"); + + show_col[COLUMN_PID] = xfce_rc_read_bool_entry(rc_file, "show_col_pid", TRUE); + show_col[COLUMN_PPID] = xfce_rc_read_bool_entry(rc_file, "show_col_ppid", FALSE); + show_col[COLUMN_STATE] = xfce_rc_read_bool_entry(rc_file, "show_col_state", FALSE); + show_col[COLUMN_MEM] = xfce_rc_read_bool_entry(rc_file, "show_col_mem", FALSE); + show_col[COLUMN_RSS] = xfce_rc_read_bool_entry(rc_file, "show_col_rss", TRUE); + show_col[COLUMN_UNAME] = xfce_rc_read_bool_entry(rc_file, "show_col_uname", FALSE); + show_col[COLUMN_TIME] = xfce_rc_read_bool_entry(rc_file, "show_col_time", TRUE); + show_col[COLUMN_PRIO] = xfce_rc_read_bool_entry(rc_file, "show_col_prio", TRUE); + xfce_rc_close(rc_file); } @@ -224,13 +233,22 @@ void save_config(void) xfce_rc_write_int_entry(rc_file, "sort_column", sort_column); xfce_rc_write_int_entry(rc_file, "sort_type", sort_type); - xfce_rc_write_bool_entry(rc_file, "full_view", full_view); - gtk_window_get_size(GTK_WINDOW (main_window), (gint *) &win_width, (gint *) &win_height); xfce_rc_write_int_entry(rc_file, "win_width", win_width); xfce_rc_write_int_entry(rc_file, "win_height", win_height); + xfce_rc_set_group (rc_file, "Information"); + + xfce_rc_write_bool_entry(rc_file, "show_col_pid", show_col[COLUMN_PID]); + xfce_rc_write_bool_entry(rc_file, "show_col_ppid", show_col[COLUMN_PPID]); + xfce_rc_write_bool_entry(rc_file, "show_col_state", show_col[COLUMN_STATE]); + xfce_rc_write_bool_entry(rc_file, "show_col_mem", show_col[COLUMN_MEM]); + xfce_rc_write_bool_entry(rc_file, "show_col_rss", show_col[COLUMN_RSS]); + xfce_rc_write_bool_entry(rc_file, "show_col_uname", show_col[COLUMN_UNAME]); + xfce_rc_write_bool_entry(rc_file, "show_col_time", show_col[COLUMN_TIME]); + xfce_rc_write_bool_entry(rc_file, "show_col_prio", show_col[COLUMN_PRIO]); + xfce_rc_flush(rc_file); xfce_rc_close(rc_file); diff --git a/src/interface.c b/src/interface.c index f311514..9ddc68c 100644 --- a/src/interface.c +++ b/src/interface.c @@ -33,9 +33,9 @@ GtkWidget* create_main_window (void) GtkWidget *vbox1; GtkWidget *bbox1; GtkWidget *scrolledwindow1; - GtkWidget *button1; - GtkWidget *button2; - GtkWidget *button3; + GtkWidget *button_preferences; + GtkWidget *button_information; + GtkWidget *button_quit; GtkWidget *system_info_box; @@ -79,6 +79,7 @@ GtkWidget* create_main_window (void) gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_SHADOW_IN); treeview = gtk_tree_view_new (); + gtk_tree_view_set_show_expanders (GTK_TREE_VIEW (treeview), FALSE); gtk_widget_show (treeview); gtk_container_add (GTK_CONTAINER (scrolledwindow1), treeview); @@ -94,27 +95,25 @@ GtkWidget* create_main_window (void) gtk_box_pack_start(GTK_BOX(vbox1), bbox1, FALSE, TRUE, 0); gtk_widget_show (bbox1); - button2 = gtk_button_new_from_stock ("gtk-preferences"); - gtk_button_set_focus_on_click (GTK_BUTTON (button2), FALSE); - gtk_widget_show (button2); - gtk_box_pack_start (GTK_BOX (bbox1), button2, FALSE, FALSE, 0); + button_preferences = gtk_button_new_from_stock ("gtk-preferences"); + gtk_button_set_focus_on_click (GTK_BUTTON (button_preferences), FALSE); + gtk_widget_show (button_preferences); + gtk_box_pack_start (GTK_BOX (bbox1), button_preferences, FALSE, FALSE, 0); - button3 = gtk_toggle_button_new_with_label ("gtk-info"); - gtk_button_set_focus_on_click (GTK_BUTTON (button3), FALSE); - gtk_button_set_use_stock (GTK_BUTTON(button3), TRUE); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button3), full_view); - gtk_widget_show (button3); - gtk_box_pack_start (GTK_BOX (bbox1), button3, FALSE, FALSE, 0); + button_information = gtk_button_new_from_stock ("gtk-info"); + gtk_button_set_focus_on_click (GTK_BUTTON (button_information), FALSE); + gtk_widget_show (button_information); + gtk_box_pack_start (GTK_BOX (bbox1), button_information, FALSE, FALSE, 0); - button1 = gtk_button_new_from_stock ("gtk-quit"); - gtk_widget_show (button1); - gtk_box_pack_start (GTK_BOX (bbox1), button1, FALSE, FALSE, 0); + button_quit = gtk_button_new_from_stock ("gtk-quit"); + gtk_widget_show (button_quit); + gtk_box_pack_start (GTK_BOX (bbox1), button_quit, FALSE, FALSE, 0); - g_signal_connect ((gpointer) window, "delete-event", G_CALLBACK (on_quit), NULL); - g_signal_connect_swapped ((gpointer) treeview, "button-press-event", G_CALLBACK(on_treeview1_button_press_event), NULL); - g_signal_connect ((gpointer) button1, "clicked", G_CALLBACK (on_quit), NULL); - g_signal_connect ((gpointer) button2, "clicked", G_CALLBACK (on_button1_activate), NULL); - g_signal_connect ((gpointer) button3, "toggled", G_CALLBACK (on_button3_toggled_event), NULL); + g_signal_connect_swapped (treeview, "button-press-event", G_CALLBACK(on_treeview1_button_press_event), NULL); + g_signal_connect (button_preferences, "clicked", G_CALLBACK (on_preferences), NULL); + g_signal_connect (button_information, "clicked", G_CALLBACK (on_information), NULL); + g_signal_connect (button_quit, "clicked", G_CALLBACK (on_quit), NULL); + g_signal_connect (window, "delete-event", G_CALLBACK (on_quit), NULL); return window; } @@ -322,6 +321,50 @@ GtkWidget* create_mainmenu (void) return mainmenu; } +GtkWidget* create_infomenu (void) +{ + GtkWidget *infomenu; + GtkWidget *title; + GtkWidget *separator; + GtkWidget *col_items[N_COLUMNS] = { 0 }; + gint i; + + infomenu = gtk_menu_new (); + + title = gtk_image_menu_item_new_from_stock("gtk-info", NULL); + gtk_widget_show(title); + gtk_menu_shell_append(GTK_MENU_SHELL(infomenu), title); + gtk_widget_set_sensitive(title, FALSE); + + separator = gtk_separator_menu_item_new(); + gtk_widget_show(separator); + gtk_menu_shell_append(GTK_MENU_SHELL(infomenu), separator); + gtk_widget_set_sensitive(separator, FALSE); + + col_items[COLUMN_PID] = gtk_check_menu_item_new_with_label (_("PID")); + col_items[COLUMN_PPID] = gtk_check_menu_item_new_with_label (_("PPID")); + col_items[COLUMN_STATE] = gtk_check_menu_item_new_with_label (_("State")); + col_items[COLUMN_MEM] = gtk_check_menu_item_new_with_label (_("VM-Size")); + col_items[COLUMN_RSS] = gtk_check_menu_item_new_with_label (_("RSS")); + col_items[COLUMN_UNAME] = gtk_check_menu_item_new_with_label (_("User")); + col_items[COLUMN_TIME] = gtk_check_menu_item_new_with_label (_("CPU%")); + col_items[COLUMN_PRIO] = gtk_check_menu_item_new_with_label (_("Priority")); + + for (i = 0; i < N_COLUMNS; i++) + { + if (GTK_IS_WIDGET (col_items[i])) + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (col_items[i]), show_col[i]); + gtk_widget_show(col_items[i]); + gtk_menu_shell_append(GTK_MENU_SHELL(infomenu), col_items[i]); + g_signal_connect (col_items[i], "toggled", + G_CALLBACK (on_show_info_toggled), GINT_TO_POINTER(i)); + } + } + + return infomenu; +} + void show_about_dialog(void) { GtkWidget *about_dialog; @@ -361,12 +404,14 @@ void show_about_dialog(void) void change_list_store_view(void) { - gtk_tree_view_column_set_visible - (gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_PPID), full_view); - gtk_tree_view_column_set_visible - (gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_STATE), full_view); - gtk_tree_view_column_set_visible - (gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_MEM), full_view); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_PID), show_col[COLUMN_PID]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_PPID), show_col[COLUMN_PPID]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_STATE), show_col[COLUMN_STATE]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_MEM), show_col[COLUMN_MEM]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_RSS), show_col[COLUMN_RSS]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_UNAME), show_col[COLUMN_UNAME]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_TIME), show_col[COLUMN_TIME]); + gtk_tree_view_column_set_visible(gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), COLUMN_PRIO), show_col[COLUMN_PRIO]); } void fill_list_item(gint i, GtkTreeIter *iter) diff --git a/src/interface.h b/src/interface.h index fbce7d4..be2984d 100644 --- a/src/interface.h +++ b/src/interface.h @@ -44,6 +44,7 @@ GtkTreeStore *list_store; GtkTreeSelection *selection; GtkWidget *treeview; GtkWidget *mainmenu; +GtkWidget *infomenu; GtkTooltips *tooltips; GtkWidget *taskpopup; GtkWidget *priopopup; @@ -52,16 +53,6 @@ GtkWidget *mem_usage_progress_bar; GtkWidget *cpu_usage_progress_bar_box; GtkWidget *mem_usage_progress_bar_box; -#define COLUMN_NAME 0 -#define COLUMN_PID 1 -#define COLUMN_PPID 2 -#define COLUMN_STATE 3 -#define COLUMN_MEM 4 -#define COLUMN_RSS 5 -#define COLUMN_UNAME 6 -#define COLUMN_TIME 7 -#define COLUMN_PRIO 8 - GtkTreeViewColumn *column; void change_list_store_view(void); @@ -70,7 +61,8 @@ void create_list_store(void); GtkWidget* create_main_window (void); GtkWidget* create_taskpopup (void); GtkWidget* create_mainmenu (void); -GtkWidget *create_prio_submenu(void); +GtkWidget* create_infomenu (void); +GtkWidget* create_prio_submenu(void); void show_about_dialog(void); diff --git a/src/menu-positions.c b/src/menu-positions.c index 9c5323d..16ae4e8 100644 --- a/src/menu-positions.c +++ b/src/menu-positions.c @@ -1,5 +1,5 @@ /* - * xfce4-taskmanager - very simple taskmanger + * xfce4-taskmanager - very simple taskmanager * * Copyright (c) 2008 Mike Massonnet * @@ -20,20 +20,18 @@ #include "menu-positions.h" -void position_mainmenu(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) +void position_menu_cover_widget(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, GtkWidget *widget) { - GtkWidget *widget; GtkRequisition requisition; - widget = user_data; - gtk_widget_size_request(GTK_WIDGET(menu), &requisition); gdk_window_get_origin(widget->window, x, y); - *x += widget->allocation.x; *y += widget->allocation.y; - if(*y + requisition.height > gdk_screen_height ()) - *y = gdk_screen_height () - requisition.height; + gtk_widget_size_request(GTK_WIDGET(menu), &requisition); + if(*y + requisition.height > gdk_screen_height()) + *y = gdk_screen_height() - requisition.height; else if(*y < 0) *y = 0; } + diff --git a/src/menu-positions.h b/src/menu-positions.h index 2dcddc3..5f8019a 100644 --- a/src/menu-positions.h +++ b/src/menu-positions.h @@ -30,6 +30,6 @@ #include "functions.h" #include "interface.h" -void position_mainmenu(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data); +void position_menu_cover_widget(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, GtkWidget *widget); #endif diff --git a/src/types.h b/src/types.h index 422a646..92fec44 100644 --- a/src/types.h +++ b/src/types.h @@ -76,7 +76,21 @@ gboolean show_cached_as_free; /* Show memory used Cache as free memory */ guint sort_column; guint sort_type; -gboolean full_view; +enum +{ + COLUMN_NAME = 0, + COLUMN_PID, + COLUMN_PPID, + COLUMN_STATE, + COLUMN_MEM, + COLUMN_RSS, + COLUMN_UNAME, + COLUMN_TIME, + COLUMN_PRIO, + N_COLUMNS, +}; + +gboolean show_col[N_COLUMNS]; guint win_width; guint win_height;