summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-11 21:29:06 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-08-11 21:29:06 +0000
commit602e6865dda0510c26520bb5f86787b817d5048c (patch)
tree2af1cc51bac2f982cdb11081e6a0ba7b41b10635 /chrome/browser/gtk
parent8ffb57c43c7201487920b159aba123b4a95c9735 (diff)
downloadchromium_src-602e6865dda0510c26520bb5f86787b817d5048c.zip
chromium_src-602e6865dda0510c26520bb5f86787b817d5048c.tar.gz
chromium_src-602e6865dda0510c26520bb5f86787b817d5048c.tar.bz2
gtk: Disconnect the accelerator group keys when closing the browser window.
BUG=10737 TEST=Watch the valgrind bot stay green. Review URL: http://codereview.chromium.org/164294 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@23078 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc26
-rw-r--r--chrome/browser/gtk/browser_window_gtk.h3
2 files changed, 23 insertions, 6 deletions
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index c760d11..bfea291 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -7,6 +7,8 @@
#include <gdk/gdkkeysyms.h>
#include <X11/XF86keysym.h>
+#include <string>
+
#include "app/resource_bundle.h"
#include "app/theme_provider.h"
#include "base/base_paths_linux.h"
@@ -420,7 +422,8 @@ BrowserWindowGtk::BrowserWindowGtk(Browser* browser)
frame_cursor_(NULL),
is_active_(true),
last_click_time_(0),
- maximize_after_show_(false) {
+ maximize_after_show_(false),
+ accel_group_(NULL) {
use_custom_frame_.Init(prefs::kUseCustomChromeFrame,
browser_->profile()->GetPrefs(), this);
@@ -697,6 +700,19 @@ void BrowserWindowGtk::Close() {
SaveWindowPosition();
+ if (accel_group_) {
+ // Disconnecting the keys we connected to our accelerator group frees the
+ // closures allocated in ConnectAccelerators.
+ for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) {
+ gtk_accel_group_disconnect_key(accel_group_,
+ kAcceleratorMap[i].keyval,
+ kAcceleratorMap[i].modifier_type);
+ }
+ gtk_window_remove_accel_group(window_, accel_group_);
+ g_object_unref(accel_group_);
+ accel_group_ = NULL;
+ }
+
GtkWidget* window = GTK_WIDGET(window_);
// To help catch bugs in any event handlers that might get fired during the
// destruction, set window_ to NULL before any handlers will run.
@@ -1534,14 +1550,12 @@ void BrowserWindowGtk::UpdateWindowShape(int width, int height) {
}
void BrowserWindowGtk::ConnectAccelerators() {
- GtkAccelGroup* accel_group = gtk_accel_group_new();
- gtk_window_add_accel_group(window_, accel_group);
- // Drop the initial ref on |accel_group| so |window_| will own it.
- g_object_unref(accel_group);
+ accel_group_ = gtk_accel_group_new();
+ gtk_window_add_accel_group(window_, accel_group_);
for (size_t i = 0; i < arraysize(kAcceleratorMap); ++i) {
gtk_accel_group_connect(
- accel_group,
+ accel_group_,
kAcceleratorMap[i].keyval,
kAcceleratorMap[i].modifier_type,
GtkAccelFlags(0),
diff --git a/chrome/browser/gtk/browser_window_gtk.h b/chrome/browser/gtk/browser_window_gtk.h
index 5808f4c..73edad3 100644
--- a/chrome/browser/gtk/browser_window_gtk.h
+++ b/chrome/browser/gtk/browser_window_gtk.h
@@ -369,6 +369,9 @@ class BrowserWindowGtk : public BrowserWindow,
// first time. This is to work around a compiz bug.
bool maximize_after_show_;
+ // The accelerator group used to handle accelerators, owned by this object.
+ GtkAccelGroup* accel_group_;
+
DISALLOW_COPY_AND_ASSIGN(BrowserWindowGtk);
};