Bug 1175171 - Deallocate GTK's KeymapWrapper on shutdown. r=karlt

--HG--
extra : rebase_source : 5ff0e22c28e8349902d4ca0146b63d604a0abd58
This commit is contained in:
Andrew Comminos 2015-06-26 11:28:00 -04:00
parent 4f1073592a
commit 69949017a1
3 changed files with 20 additions and 19 deletions

View File

@ -149,6 +149,15 @@ KeymapWrapper::GetInstance()
return sInstance;
}
/* static */ void
KeymapWrapper::Shutdown()
{
if (sInstance) {
delete sInstance;
sInstance = nullptr;
}
}
KeymapWrapper::KeymapWrapper() :
mInitialized(false), mGdkKeymap(gdk_keymap_get_default()),
mXKBBaseEventCode(0)
@ -160,13 +169,10 @@ KeymapWrapper::KeymapWrapper() :
("KeymapWrapper(%p): Constructor, mGdkKeymap=%p",
this, mGdkKeymap));
g_object_ref(mGdkKeymap);
g_signal_connect(mGdkKeymap, "keys-changed",
(GCallback)OnKeysChanged, this);
// This is necessary for catching the destroying timing.
g_object_weak_ref(G_OBJECT(mGdkKeymap),
(GWeakNotify)OnDestroyKeymap, this);
if (GDK_IS_X11_DISPLAY(gdk_display_get_default()))
InitXKBExtension();
@ -436,6 +442,9 @@ KeymapWrapper::InitBySystemSettings()
KeymapWrapper::~KeymapWrapper()
{
gdk_window_remove_filter(nullptr, FilterEvents, this);
g_signal_handlers_disconnect_by_func(mGdkKeymap,
FuncToGpointer(OnKeysChanged), this);
g_object_unref(mGdkKeymap);
NS_IF_RELEASE(sBidiKeyboard);
MOZ_LOG(gKeymapWrapperLog, LogLevel::Info,
("KeymapWrapper(%p): Destructor", this));
@ -512,19 +521,6 @@ KeymapWrapper::FilterEvents(GdkXEvent* aXEvent,
return GDK_FILTER_CONTINUE;
}
/* static */ void
KeymapWrapper::OnDestroyKeymap(KeymapWrapper* aKeymapWrapper,
GdkKeymap *aGdkKeymap)
{
MOZ_LOG(gKeymapWrapperLog, LogLevel::Info,
("KeymapWrapper: OnDestroyKeymap, aGdkKeymap=%p, aKeymapWrapper=%p",
aGdkKeymap, aKeymapWrapper));
MOZ_ASSERT(aKeymapWrapper == sInstance,
"Desroying unexpected instance");
delete sInstance;
sInstance = nullptr;
}
/* static */ void
KeymapWrapper::OnKeysChanged(GdkKeymap *aGdkKeymap,
KeymapWrapper* aKeymapWrapper)

View File

@ -129,6 +129,11 @@ public:
*/
static bool IsKeyPressEventNecessary(GdkEventKey* aGdkKeyEvent);
/**
* Destroys the singleton KeymapWrapper instance, if it exists.
*/
static void Shutdown();
protected:
/**
@ -245,8 +250,6 @@ protected:
* Signal handlers.
*/
static void OnKeysChanged(GdkKeymap* aKeymap, KeymapWrapper* aKeymapWrapper);
static void OnDestroyKeymap(KeymapWrapper* aKeymapWrapper,
GdkKeymap *aGdkKeymap);
/**
* GetCharCodeFor() Computes what character is inputted by the key event

View File

@ -12,6 +12,7 @@
#include "nsAppShell.h"
#include "nsAppShellSingleton.h"
#include "nsBaseWidget.h"
#include "nsGtkKeyUtils.h"
#include "nsLookAndFeel.h"
#include "nsWindow.h"
#include "nsTransferable.h"
@ -308,6 +309,7 @@ nsWidgetGtk2ModuleDtor()
nsFilePicker::Shutdown();
nsSound::Shutdown();
nsWindow::ReleaseGlobals();
KeymapWrapper::Shutdown();
nsGTKToolkit::Shutdown();
nsAppShellShutdown();
#ifdef MOZ_ENABLE_DBUS