Home | History | Annotate | Download | only in gtk
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_UI_GTK_TASK_MANAGER_GTK_H_
      6 #define CHROME_BROWSER_UI_GTK_TASK_MANAGER_GTK_H_
      7 
      8 #include <gtk/gtk.h>
      9 
     10 #include <string>
     11 
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "chrome/browser/task_manager/task_manager.h"
     15 #include "grit/generated_resources.h"
     16 #include "ui/base/gtk/gtk_signal.h"
     17 
     18 namespace gfx {
     19 class Point;
     20 }
     21 
     22 class TaskManagerGtk : public TaskManagerModelObserver {
     23  public:
     24   TaskManagerGtk();
     25   virtual ~TaskManagerGtk();
     26 
     27   // TaskManagerModelObserver
     28   virtual void OnModelChanged() OVERRIDE;
     29   virtual void OnItemsChanged(int start, int length) OVERRIDE;
     30   virtual void OnItemsAdded(int start, int length) OVERRIDE;
     31   virtual void OnItemsRemoved(int start, int length) OVERRIDE;
     32 
     33   // Closes the task manager window.
     34   void Close();
     35 
     36   // Creates the task manager if it doesn't exist; otherwise, it activates the
     37   // existing task manager window.
     38   static void Show();
     39 
     40  private:
     41   class ContextMenuController;
     42   friend class ContextMenuController;
     43 
     44   // Initializes the task manager dialog.
     45   void Init();
     46 
     47   // Set |dialog_|'s initial size, using its previous size if that was saved.
     48   void SetInitialDialogSize();
     49 
     50   // Connects the ctrl-w accelerator to the dialog.
     51   void ConnectAccelerators();
     52 
     53   // Sets up the treeview widget.
     54   void CreateTaskManagerTreeview();
     55 
     56   // Returns the model data for a given |row| and |col_id|.
     57   std::string GetModelText(int row, int col_id);
     58 
     59   // Retrieves the resource icon from the model for |row|.
     60   GdkPixbuf* GetModelIcon(int row);
     61 
     62   // Sets the treeview row data.  |row| is an index into the model and |iter|
     63   // is the current position in the treeview.
     64   void SetRowDataFromModel(int row, GtkTreeIter* iter);
     65 
     66   // Queries the treeview for the selected rows, and kills those processes.
     67   void KillSelectedProcesses();
     68 
     69   // Opens the context menu used to select the task manager columns.
     70   void ShowContextMenu(const gfx::Point& point, guint32 event_time);
     71 
     72   // Opens about:memory in a new foreground tab.
     73   void OnLinkActivated();
     74 
     75   // Compare implementation used for sorting columns.
     76   gint CompareImpl(GtkTreeModel* tree_model, GtkTreeIter* a,
     77                    GtkTreeIter* b, int id);
     78 
     79   // Response signal handler that notifies us of dialog destruction.
     80   CHROMEGTK_CALLBACK_0(TaskManagerGtk, void, OnDestroy);
     81 
     82   // Response signal handler that notifies us of dialog responses.
     83   CHROMEGTK_CALLBACK_1(TaskManagerGtk, void, OnResponse, int);
     84 
     85   // Realize signal handler to set the task column's initial size.
     86   CHROMEG_CALLBACK_0(TaskManagerGtk, void, OnTreeViewRealize, GtkTreeView*);
     87 
     88   // Changed signal handler that is sent when the treeview selection changes.
     89   CHROMEG_CALLBACK_0(TaskManagerGtk, void, OnSelectionChanged,
     90                      GtkTreeSelection*);
     91 
     92   // row-activated handler that foregrounds a process on activation (e.g.,
     93   // double-click).
     94   CHROMEGTK_CALLBACK_2(TaskManagerGtk, void, OnRowActivated,
     95                        GtkTreePath*, GtkTreeViewColumn*);
     96 
     97   // button-event handler that opens the right-click context menu.
     98   // Note: GTK does menu on mouse-up while views does menu on mouse-down;
     99   // this handler is used for both.
    100   CHROMEGTK_CALLBACK_1(TaskManagerGtk, gboolean, OnButtonEvent,
    101                        GdkEventButton*);
    102 
    103   // Handles an accelerator being pressed.
    104   CHROMEG_CALLBACK_3(TaskManagerGtk, gboolean, OnGtkAccelerator,
    105                      GtkAccelGroup*, GObject*, guint, GdkModifierType);
    106 
    107   // Page sorting callback.
    108   static gint ComparePage(GtkTreeModel* model, GtkTreeIter* a,
    109                           GtkTreeIter* b, gpointer task_manager) {
    110     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    111         CompareImpl(model, a, b, IDS_TASK_MANAGER_TASK_COLUMN);
    112   }
    113 
    114   // Profile name sorting callback.
    115   static gint CompareProfileName(GtkTreeModel* model, GtkTreeIter* a,
    116                                  GtkTreeIter* b, gpointer task_manager) {
    117     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    118         CompareImpl(model, a, b, IDS_TASK_MANAGER_PROFILE_NAME_COLUMN);
    119   }
    120 
    121   // Shared memory sorting callback.
    122   static gint CompareSharedMemory(GtkTreeModel* model, GtkTreeIter* a,
    123                                   GtkTreeIter* b, gpointer task_manager) {
    124     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    125         CompareImpl(model, a, b, IDS_TASK_MANAGER_SHARED_MEM_COLUMN);
    126   }
    127 
    128   // Private memory sorting callback.
    129   static gint ComparePrivateMemory(GtkTreeModel* model, GtkTreeIter* a,
    130                                    GtkTreeIter* b, gpointer task_manager) {
    131     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    132         CompareImpl(model, a, b, IDS_TASK_MANAGER_PRIVATE_MEM_COLUMN);
    133   }
    134 
    135   // Javascript memory sorting callback.
    136   static gint CompareV8Memory(GtkTreeModel* model, GtkTreeIter* a,
    137                               GtkTreeIter* b, gpointer task_manager) {
    138     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    139         CompareImpl(model, a, b,
    140                     IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN);
    141   }
    142 
    143   // CPU sorting callback.
    144   static gint CompareCPU(GtkTreeModel* model, GtkTreeIter* a,
    145                          GtkTreeIter* b, gpointer task_manager) {
    146     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    147         CompareImpl(model, a, b, IDS_TASK_MANAGER_CPU_COLUMN);
    148   }
    149 
    150   // Network sorting callback.
    151   static gint CompareNetwork(GtkTreeModel* model, GtkTreeIter* a,
    152                              GtkTreeIter* b, gpointer task_manager) {
    153     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    154         CompareImpl(model, a, b, IDS_TASK_MANAGER_NET_COLUMN);
    155   }
    156 
    157   // Process ID sorting callback.
    158   static gint CompareProcessID(GtkTreeModel* model, GtkTreeIter* a,
    159                                GtkTreeIter* b, gpointer task_manager) {
    160     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    161         CompareImpl(model, a, b, IDS_TASK_MANAGER_PROCESS_ID_COLUMN);
    162   }
    163 
    164   // WebCore Image Cache sorting callback.
    165   static gint CompareWebCoreImageCache(GtkTreeModel* model, GtkTreeIter* a,
    166                                        GtkTreeIter* b, gpointer task_manager) {
    167     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    168         CompareImpl(model, a, b, IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN);
    169   }
    170 
    171   // WebCore Scripts Cache sorting callback.
    172   static gint CompareWebCoreScriptsCache(GtkTreeModel* model, GtkTreeIter* a,
    173                                          GtkTreeIter* b,
    174                                          gpointer task_manager) {
    175     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    176         CompareImpl(model, a, b, IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN);
    177   }
    178 
    179   // WebCore CSS Cache sorting callback.
    180   static gint CompareWebCoreCssCache(GtkTreeModel* model, GtkTreeIter* a,
    181                                      GtkTreeIter* b, gpointer task_manager) {
    182     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    183         CompareImpl(model, a, b, IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN);
    184   }
    185 
    186   // Video memory sorting callback.
    187   static gint CompareVideoMemory(GtkTreeModel* model, GtkTreeIter* a,
    188                                  GtkTreeIter* b, gpointer task_manager) {
    189     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    190         CompareImpl(model, a, b, IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN);
    191   }
    192 
    193   // FPS sorting callback.
    194   static gint CompareFPS(GtkTreeModel* model, GtkTreeIter* a,
    195                          GtkTreeIter* b, gpointer task_manager) {
    196     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    197         CompareImpl(model, a, b, IDS_TASK_MANAGER_FPS_COLUMN);
    198   }
    199 
    200   // Sqlite memory sorting callback.
    201   static gint CompareSqliteMemoryUsed(GtkTreeModel* model, GtkTreeIter* a,
    202                                       GtkTreeIter* b, gpointer task_manager) {
    203     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    204         CompareImpl(model, a, b, IDS_TASK_MANAGER_SQLITE_MEMORY_USED_COLUMN);
    205   }
    206 
    207   // Goats Teleported sorting callback.
    208   static gint CompareGoatsTeleported(GtkTreeModel* model, GtkTreeIter* a,
    209                                      GtkTreeIter* b, gpointer task_manager) {
    210     return reinterpret_cast<TaskManagerGtk*>(task_manager)->
    211         CompareImpl(model, a, b, IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN);
    212   }
    213 
    214   // The task manager.
    215   TaskManager* task_manager_;
    216 
    217   // Our model.
    218   TaskManagerModel* model_;
    219 
    220   // The task manager dialog window.
    221   GtkWidget* dialog_;
    222 
    223   // The treeview that contains the process list.
    224   GtkWidget* treeview_;
    225 
    226   // The list of processes.
    227   GtkListStore* process_list_;
    228   GtkTreeModel* process_list_sort_;
    229 
    230   // The number of processes in |process_list_|.
    231   int process_count_;
    232 
    233   // The id of the |dialog_| destroy signal handler.
    234   gulong destroy_handler_id_;
    235 
    236   // The context menu controller.
    237   scoped_ptr<ContextMenuController> menu_controller_;
    238 
    239   GtkAccelGroup* accel_group_;
    240 
    241   // An open task manager window. There can only be one open at a time. This
    242   // is reset to NULL when the window is closed.
    243   static TaskManagerGtk* instance_;
    244 
    245   // We edit the selection in the OnSelectionChanged handler, and we use this
    246   // variable to prevent ourselves from handling further changes that we
    247   // ourselves caused.
    248   bool ignore_selection_changed_;
    249 
    250   DISALLOW_COPY_AND_ASSIGN(TaskManagerGtk);
    251 };
    252 
    253 #endif  // CHROME_BROWSER_UI_GTK_TASK_MANAGER_GTK_H_
    254