Commit 697b87dd authored by tony@chromium.org's avatar tony@chromium.org

Fix accel leak in task manager and bookmark manager by using

the same cleanup code as browser_window_gtk.

Also fix a leak of the gtk widgets when the accelerator was
not used for the task manager.  If the user closed by using the
window manager destroy, then we never called gtk_widget_destroy
on the window and leaked the widgets.

Review URL: http://codereview.chromium.org/202035


git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25897 0039d316-1c4b-4281-b951-d872f2087c98
parent e9923cb7
......@@ -322,6 +322,10 @@ BookmarkManagerGtk::~BookmarkManagerGtk() {
gtk_paned_get_position(GTK_PANED(paned_)));
SaveColumnConfiguration();
model_->RemoveObserver(this);
gtk_accel_group_disconnect_key(accel_group_, GDK_w, GDK_CONTROL_MASK);
gtk_window_remove_accel_group(GTK_WINDOW(window_), accel_group_);
g_object_unref(accel_group_);
}
void BookmarkManagerGtk::InitWidgets() {
......@@ -416,13 +420,10 @@ void BookmarkManagerGtk::InitWidgets() {
}
void BookmarkManagerGtk::ConnectAccelerators() {
GtkAccelGroup* accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(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(GTK_WINDOW(window_), accel_group_);
gtk_accel_group_connect(accel_group,
gtk_accel_group_connect(accel_group_,
GDK_w, GDK_CONTROL_MASK, GtkAccelFlags(0),
g_cclosure_new(G_CALLBACK(OnGtkAccelerator),
this, NULL));
......
......@@ -340,6 +340,8 @@ class BookmarkManagerGtk : public BookmarkModelObserver,
// This is used to avoid recursively calling our right click handler. It is
// only true when a right click is already being handled.
bool ignore_rightclicks_;
GtkAccelGroup* accel_group_;
};
#endif // CHROME_BROWSER_GTK_BOOKMARK_MANAGER_GTK_H_
......@@ -249,6 +249,13 @@ TaskManagerGtk* TaskManagerGtk::instance_ = NULL;
TaskManagerGtk::~TaskManagerGtk() {
task_manager_->OnWindowClosed();
model_->RemoveObserver(this);
gtk_accel_group_disconnect_key(accel_group_, GDK_w, GDK_CONTROL_MASK);
gtk_window_remove_accel_group(GTK_WINDOW(dialog_), accel_group_);
g_object_unref(accel_group_);
accel_group_ = NULL;
gtk_widget_destroy(dialog_);
}
////////////////////////////////////////////////////////////////////////////////
......@@ -431,13 +438,10 @@ void TaskManagerGtk::SetInitialDialogSize() {
}
void TaskManagerGtk::ConnectAccelerators() {
GtkAccelGroup* accel_group = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(dialog_), accel_group);
// Drop the initial ref on |accel_group| so |dialog_| will own it.
g_object_unref(accel_group);
accel_group_ = gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(dialog_), accel_group_);
gtk_accel_group_connect(accel_group,
gtk_accel_group_connect(accel_group_,
GDK_w, GDK_CONTROL_MASK, GtkAccelFlags(0),
g_cclosure_new(G_CALLBACK(OnGtkAccelerator),
this, NULL));
......@@ -717,7 +721,6 @@ gboolean TaskManagerGtk::OnGtkAccelerator(GtkAccelGroup* accel_group,
// is destroyed. The deleted object will receive gtk signals otherwise.
gtk_dialog_response(GTK_DIALOG(task_manager->dialog_),
GTK_RESPONSE_DELETE_EVENT);
gtk_widget_destroy(task_manager->dialog_);
}
return TRUE;
......
......@@ -112,6 +112,8 @@ class TaskManagerGtk : public TaskManagerModelObserver {
// 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_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment