summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-18 01:27:56 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-18 01:27:56 +0000
commit40cb03f17438c5844617c3bc2bfb99187ec6e601 (patch)
treee68c08ac0bfd623d1c1d4b210f74bba6109eedaf /chrome/browser
parentb91df5427e86efb0fe15e40422e33cb42f85de11 (diff)
downloadchromium_src-40cb03f17438c5844617c3bc2bfb99187ec6e601.zip
chromium_src-40cb03f17438c5844617c3bc2bfb99187ec6e601.tar.gz
chromium_src-40cb03f17438c5844617c3bc2bfb99187ec6e601.tar.bz2
GTK: make selections in task manager apply to all members of resource group
BUG=33087 TEST=manual Review URL: http://codereview.chromium.org/614008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39308 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/gtk/task_manager_gtk.cc36
-rw-r--r--chrome/browser/gtk/task_manager_gtk.h12
2 files changed, 36 insertions, 12 deletions
diff --git a/chrome/browser/gtk/task_manager_gtk.cc b/chrome/browser/gtk/task_manager_gtk.cc
index a50ab75..361b4fa 100644
--- a/chrome/browser/gtk/task_manager_gtk.cc
+++ b/chrome/browser/gtk/task_manager_gtk.cc
@@ -13,6 +13,7 @@
#include "app/l10n_util.h"
#include "app/menus/simple_menu_model.h"
#include "app/resource_bundle.h"
+#include "base/auto_reset.h"
#include "base/logging.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/gtk/gtk_chrome_link_button.h"
@@ -265,7 +266,8 @@ TaskManagerGtk::TaskManagerGtk()
dialog_(NULL),
treeview_(NULL),
process_list_(NULL),
- process_count_(0) {
+ process_count_(0),
+ handling_selection_changed_(false) {
Init();
}
@@ -420,7 +422,7 @@ void TaskManagerGtk::Init() {
GTK_TREE_VIEW(treeview_));
gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
g_signal_connect(selection, "changed",
- G_CALLBACK(OnSelectionChanged), this);
+ G_CALLBACK(OnSelectionChangedThunk), this);
gtk_container_add(GTK_CONTAINER(scrolled), treeview_);
@@ -808,29 +810,43 @@ void TaskManagerGtk::OnTreeViewRealize(GtkTreeView* treeview,
TreeViewColumnSetWidth(column, width);
}
-// static
-void TaskManagerGtk::OnSelectionChanged(GtkTreeSelection* selection,
- TaskManagerGtk* task_manager) {
+void TaskManagerGtk::OnSelectionChanged(GtkTreeSelection* selection) {
+ if (handling_selection_changed_)
+ return;
+ AutoReset autoreset(&handling_selection_changed_, true);
+
+ // The set of groups that should be selected.
+ std::set<std::pair<int, int> > ranges;
bool selection_contains_browser_process = false;
GtkTreeModel* model;
GList* paths = gtk_tree_selection_get_selected_rows(selection, &model);
for (GList* item = paths; item; item = item->next) {
GtkTreePath* path = gtk_tree_model_sort_convert_path_to_child_path(
- GTK_TREE_MODEL_SORT(task_manager->process_list_sort_),
+ GTK_TREE_MODEL_SORT(process_list_sort_),
reinterpret_cast<GtkTreePath*>(item->data));
int row = gtk_tree::GetRowNumForPath(path);
gtk_tree_path_free(path);
- if (task_manager->task_manager_->IsBrowserProcess(row)) {
+ if (task_manager_->IsBrowserProcess(row))
selection_contains_browser_process = true;
- break;
- }
+ ranges.insert(model_->GetGroupRangeForResource(row));
}
g_list_foreach(paths, reinterpret_cast<GFunc>(gtk_tree_path_free), NULL);
g_list_free(paths);
+ for (std::set<std::pair<int, int> >::iterator iter = ranges.begin();
+ iter != ranges.end(); ++iter) {
+ GtkTreePath* start_path =
+ gtk_tree_path_new_from_indices(iter->first, -1);
+ GtkTreePath* end_path =
+ gtk_tree_path_new_from_indices(iter->first + iter->second - 1, -1);
+ gtk_tree_selection_select_range(selection, start_path, end_path);
+ gtk_tree_path_free(start_path);
+ gtk_tree_path_free(end_path);
+ }
+
bool sensitive = (paths != NULL) && !selection_contains_browser_process;
- gtk_dialog_set_response_sensitive(GTK_DIALOG(task_manager->dialog_),
+ gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog_),
kTaskManagerResponseKill, sensitive);
}
diff --git a/chrome/browser/gtk/task_manager_gtk.h b/chrome/browser/gtk/task_manager_gtk.h
index 30d3958..2a887fa 100644
--- a/chrome/browser/gtk/task_manager_gtk.h
+++ b/chrome/browser/gtk/task_manager_gtk.h
@@ -82,8 +82,11 @@ class TaskManagerGtk : public TaskManagerModelObserver {
TaskManagerGtk* task_manager);
// changed signal handler that is sent when the treeview selection changes.
- static void OnSelectionChanged(GtkTreeSelection* selection,
- TaskManagerGtk* task_manager);
+ static void OnSelectionChangedThunk(GtkTreeSelection* selection,
+ TaskManagerGtk* task_manager) {
+ task_manager->OnSelectionChanged(selection);
+ }
+ void OnSelectionChanged(GtkTreeSelection* selection);
// button-press-event handler that activates a process on double-click.
static gboolean OnButtonPressEvent(GtkWidget* widget, GdkEventButton* event,
@@ -209,6 +212,11 @@ class TaskManagerGtk : public TaskManagerModelObserver {
// 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 handling_selection_changed_;
+
DISALLOW_COPY_AND_ASSIGN(TaskManagerGtk);
};