Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2793)

Unified Diff: chrome/browser/gtk/task_manager_gtk.cc

Issue 155027: Add a context menu to the gtk task manager. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/gtk/task_manager_gtk.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/gtk/task_manager_gtk.cc
===================================================================
--- chrome/browser/gtk/task_manager_gtk.cc (revision 19850)
+++ chrome/browser/gtk/task_manager_gtk.cc (working copy)
@@ -9,6 +9,7 @@
#include "app/l10n_util.h"
#include "base/gfx/gtk_util.h"
#include "base/logging.h"
+#include "chrome/browser/gtk/menu_gtk.h"
#include "chrome/common/gtk_util.h"
#include "grit/chromium_strings.h"
#include "grit/generated_resources.h"
@@ -57,6 +58,29 @@
}
}
+int TaskManagerColumnIDToResourceID(int id) {
+ printf("id: %d\n", id);
+ switch (id) {
+ case kTaskManagerPage:
+ return IDS_TASK_MANAGER_PAGE_COLUMN;
+ case kTaskManagerPhysicalMem:
+ return IDS_TASK_MANAGER_PHYSICAL_MEM_COLUMN;
+ case kTaskManagerSharedMem:
+ return IDS_TASK_MANAGER_SHARED_MEM_COLUMN;
+ case kTaskManagerPrivateMem:
+ return IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN;
+ case kTaskManagerCPU:
+ return IDS_TASK_MANAGER_CPU_COLUMN;
+ case kTaskManagerNetwork:
+ return IDS_TASK_MANAGER_NET_COLUMN;
+ case kTaskManagerProcessID:
+ return IDS_TASK_MANAGER_PROCESS_ID_COLUMN;
+ default:
+ NOTREACHED();
+ return -1;
+ }
+}
+
// Should be used for all gtk_tree_view functions that require a column index on
// input.
//
@@ -76,6 +100,12 @@
gtk_tree_view_column_set_visible(column, visible);
}
+bool TreeViewColumnIsVisible(GtkWidget* treeview, TaskManagerColumn colid) {
+ GtkTreeViewColumn* column = gtk_tree_view_get_column(
+ GTK_TREE_VIEW(treeview), TreeViewColumnIndexFromID(colid));
+ return gtk_tree_view_column_get_visible(column);
+}
+
void TreeViewInsertColumnWithPixbuf(GtkWidget* treeview, int resid) {
int colid = TaskManagerResourceIDToColumnID(resid);
GtkTreeViewColumn* column = gtk_tree_view_column_new();
@@ -124,6 +154,67 @@
} // namespace
+class TaskManagerGtk::ContextMenuController : public MenuGtk::Delegate {
+ public:
+ explicit ContextMenuController(TaskManagerGtk* task_manager)
+ : task_manager_(task_manager) {
+ menu_.reset(new MenuGtk(this, false));
+ for (int i = kTaskManagerPage; i < kTaskManagerColumnCount - 1; i++) {
+ menu_->AppendCheckMenuItemWithLabel(
+ i, l10n_util::GetStringUTF8(TaskManagerColumnIDToResourceID(i)));
+ }
+
+ menu_->AppendCheckMenuItemWithLabel(kTaskManagerGoatsTeleported,
+ "Goats Teleported");
+ }
+
+ virtual ~ContextMenuController() {}
+
+ void RunMenu() {
+ menu_->PopupAsContext(gtk_get_current_event_time());
+ }
+
+ void Cancel() {
+ task_manager_ = NULL;
+ menu_->Cancel();
+ }
+
+ private:
+ // MenuGtk::Delegate implementation:
+ virtual bool IsCommandEnabled(int command_id) const {
+ if (!task_manager_)
+ return false;
+
+ return true;
+ }
+
+ virtual bool IsItemChecked(int command_id) const {
+ if (!task_manager_)
+ return false;
+
+ TaskManagerColumn colid = static_cast<TaskManagerColumn>(command_id);
+ return TreeViewColumnIsVisible(task_manager_->treeview_, colid);
+ }
+
+ virtual void ExecuteCommand(int command_id) {
+ if (!task_manager_)
+ return;
+
+ TaskManagerColumn colid = static_cast<TaskManagerColumn>(command_id);
+ bool visible = !TreeViewColumnIsVisible(task_manager_->treeview_, colid);
+ TreeViewColumnSetVisible(task_manager_->treeview_, colid, visible);
+ }
+
+ // The context menu.
+ scoped_ptr<MenuGtk> menu_;
+
+ // The TaskManager the context menu was brought up for. Set to NULL when the
+ // menu is canceled.
+ TaskManagerGtk* task_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(ContextMenuController);
+};
+
TaskManagerGtk::TaskManagerGtk()
: task_manager_(TaskManager::GetInstance()),
model_(TaskManager::GetInstance()->model()),
@@ -226,11 +317,19 @@
gtk_util::kContentAreaSpacing);
g_signal_connect(G_OBJECT(dialog_), "response", G_CALLBACK(OnResponse), this);
+ g_signal_connect(G_OBJECT(dialog_), "button-release-event",
+ G_CALLBACK(OnButtonReleaseEvent), this);
+ gtk_widget_add_events(dialog_,
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
CreateTaskManagerTreeview();
gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(treeview_), TRUE);
gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview_),
GTK_TREE_VIEW_GRID_LINES_HORIZONTAL);
+ g_signal_connect(G_OBJECT(treeview_), "button-release-event",
+ G_CALLBACK(OnButtonReleaseEvent), this);
+ gtk_widget_add_events(treeview_,
+ GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
// Hide some columns by default
TreeViewColumnSetVisible(treeview_, kTaskManagerSharedMem, false);
@@ -362,6 +461,13 @@
g_list_free(paths);
}
+void TaskManagerGtk::ShowContextMenu() {
+ if (!menu_controller_.get())
+ menu_controller_.reset(new ContextMenuController(this));
+
+ menu_controller_->RunMenu();
+}
+
// static
void TaskManagerGtk::OnResponse(GtkDialog* dialog, gint response_id,
TaskManagerGtk* task_manager) {
@@ -393,3 +499,17 @@
gtk_dialog_set_response_sensitive(GTK_DIALOG(task_manager->dialog_),
kTaskManagerResponseKill, sensitive);
}
+
+// static
+gboolean TaskManagerGtk::OnButtonReleaseEvent(GtkWidget* widget,
+ GdkEventButton* event,
+ TaskManagerGtk* task_manager) {
+ // We don't want to open the context menu in the treeview.
+ if (widget == task_manager->treeview_)
+ return TRUE;
+
+ if (event->button == 3)
+ task_manager->ShowContextMenu();
+
+ return FALSE;
+}
« no previous file with comments | « chrome/browser/gtk/task_manager_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698