// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_UI_GTK_TASK_MANAGER_GTK_H_ #define CHROME_BROWSER_UI_GTK_TASK_MANAGER_GTK_H_ #pragma once #include <gtk/gtk.h> #include <string> #include "base/memory/scoped_ptr.h" #include "chrome/browser/task_manager/task_manager.h" #include "grit/generated_resources.h" #include "ui/base/gtk/gtk_signal.h" namespace gfx { class Point; } class TaskManagerGtk : public TaskManagerModelObserver { public: explicit TaskManagerGtk(bool highlight_background_resources); virtual ~TaskManagerGtk(); // TaskManagerModelObserver virtual void OnModelChanged(); virtual void OnItemsChanged(int start, int length); virtual void OnItemsAdded(int start, int length); virtual void OnItemsRemoved(int start, int length); // Closes the task manager window. void Close(); // Creates the task manager if it doesn't exist; otherwise, it activates the // existing task manager window. If |highlight_background_resources| is true, // background resources are rendered with a yellow highlight (for the // "View Background Pages" menu item). static void Show(bool highlight_background_resources); private: class ContextMenuController; friend class ContextMenuController; // Initializes the task manager dialog. void Init(); // Set |dialog_|'s initial size, using its previous size if that was saved. void SetInitialDialogSize(); // Connects the ctrl-w accelerator to the dialog. void ConnectAccelerators(); // Sets up the treeview widget. void CreateTaskManagerTreeview(); // Returns the model data for a given |row| and |col_id|. std::string GetModelText(int row, int col_id); // Retrieves the resource icon from the model for |row|. GdkPixbuf* GetModelIcon(int row); // Sets the treeview row data. |row| is an index into the model and |iter| // is the current position in the treeview. void SetRowDataFromModel(int row, GtkTreeIter* iter); // Queries the treeview for the selected rows, and kills those processes. void KillSelectedProcesses(); // Opens the context menu used to select the task manager columns. void ShowContextMenu(const gfx::Point& point, guint32 event_time); // Opens about:memory in a new foreground tab. void OnLinkActivated(); // Compare implementation used for sorting columns. gint CompareImpl(GtkTreeModel* tree_model, GtkTreeIter* a, GtkTreeIter* b, int id); // Response signal handler that notifies us of dialog destruction. CHROMEGTK_CALLBACK_0(TaskManagerGtk, void, OnDestroy); // Response signal handler that notifies us of dialog responses. CHROMEGTK_CALLBACK_1(TaskManagerGtk, void, OnResponse, int); // Realize signal handler to set the page column's initial size. CHROMEG_CALLBACK_0(TaskManagerGtk, void, OnTreeViewRealize, GtkTreeView*); // Changed signal handler that is sent when the treeview selection changes. CHROMEG_CALLBACK_0(TaskManagerGtk, void, OnSelectionChanged, GtkTreeSelection*); // row-activated handler that foregrounds a process on activation (e.g., // double-click). CHROMEGTK_CALLBACK_2(TaskManagerGtk, void, OnRowActivated, GtkTreePath*, GtkTreeViewColumn*); // button-event handler that opens the right-click context menu. // Note: GTK does menu on mouse-up while views does menu on mouse-down; // this handler is used for both. CHROMEGTK_CALLBACK_1(TaskManagerGtk, gboolean, OnButtonEvent, GdkEventButton*); // Handles an accelerator being pressed. CHROMEG_CALLBACK_3(TaskManagerGtk, gboolean, OnGtkAccelerator, GtkAccelGroup*, GObject*, guint, GdkModifierType); // Page sorting callback. static gint ComparePage(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_PAGE_COLUMN); } // Shared memory sorting callback. static gint CompareSharedMemory(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_SHARED_MEM_COLUMN); } // Private memory sorting callback. static gint ComparePrivateMemory(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN); } // Javascript memory sorting callback. static gint CompareV8Memory(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN); } // CPU sorting callback. static gint CompareCPU(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_CPU_COLUMN); } // Network sorting callback. static gint CompareNetwork(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_NET_COLUMN); } // Process ID sorting callback. static gint CompareProcessID(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_PROCESS_ID_COLUMN); } // WebCore Image Cache sorting callback. static gint CompareWebCoreImageCache(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN); } // WebCore Scripts Cache sorting callback. static gint CompareWebCoreScriptsCache(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN); } // WebCore CSS Cache sorting callback. static gint CompareWebCoreCssCache(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN); } // Sqlite memory sorting callback. static gint CompareSqliteMemoryUsed(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN); } // Goats Teleported sorting callback. static gint CompareGoatsTeleported(GtkTreeModel* model, GtkTreeIter* a, GtkTreeIter* b, gpointer task_manager) { return reinterpret_cast<TaskManagerGtk*>(task_manager)-> CompareImpl(model, a, b, IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN); } // The task manager. TaskManager* task_manager_; // Our model. TaskManagerModel* model_; // The task manager dialog window. GtkWidget* dialog_; // The treeview that contains the process list. GtkWidget* treeview_; // The list of processes. GtkListStore* process_list_; GtkTreeModel* process_list_sort_; // The number of processes in |process_list_|. int process_count_; // The id of the |dialog_| destroy signal handler. gulong destroy_handler_id_; // The context menu controller. scoped_ptr<ContextMenuController> menu_controller_; GtkAccelGroup* accel_group_; // An open task manager window. There can only be one open at a time. This // is reset to NULL when the window is closed. static TaskManagerGtk* instance_; // We edit the selection in the OnSelectionChanged handler, and we use this // variable to prevent ourselves from handling further changes that we // ourselves caused. bool ignore_selection_changed_; // If true, background resources are rendered with a yellow highlight. bool highlight_background_resources_; DISALLOW_COPY_AND_ASSIGN(TaskManagerGtk); }; #endif // CHROME_BROWSER_UI_GTK_TASK_MANAGER_GTK_H_