diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-11 21:29:06 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-11 21:29:06 +0000 |
commit | 602e6865dda0510c26520bb5f86787b817d5048c (patch) | |
tree | 2af1cc51bac2f982cdb11081e6a0ba7b41b10635 /chrome/browser/gtk | |
parent | 8ffb57c43c7201487920b159aba123b4a95c9735 (diff) | |
download | chromium_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.cc | 26 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.h | 3 |
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); }; |