Bug 1351246 - Check gdk_screen_get_default() for X. r=karlt
MozReview-Commit-ID: FJr7tdu1Rsp
--- a/widget/gtk/ScreenHelperGTK.cpp
+++ b/widget/gtk/ScreenHelperGTK.cpp
@@ -71,49 +71,51 @@ root_window_event_filter(GdkXEvent* aGdk
}
ScreenHelperGTK::ScreenHelperGTK()
: mXineramalib(nullptr)
, mRootWindow(nullptr)
, mNetWorkareaAtom(0)
{
MOZ_LOG(sScreenLog, LogLevel::Debug, ("ScreenHelperGTK created"));
- mRootWindow = gdk_get_default_root_window();
- if (!mRootWindow) {
+ GdkScreen *defaultScreen = gdk_screen_get_default();
+ if (!defaultScreen) {
// Sometimes we don't initial X (e.g., xpcshell)
MOZ_LOG(sScreenLog, LogLevel::Debug, ("mRootWindow is nullptr, running headless"));
return;
}
+ mRootWindow = gdk_get_default_root_window();
+ MOZ_ASSERT(mRootWindow);
g_object_ref(mRootWindow);
// GDK_PROPERTY_CHANGE_MASK ==> PropertyChangeMask, for PropertyNotify
gdk_window_set_events(mRootWindow,
GdkEventMask(gdk_window_get_events(mRootWindow) |
GDK_PROPERTY_CHANGE_MASK));
- g_signal_connect(gdk_screen_get_default(), "monitors-changed",
+ g_signal_connect(defaultScreen, "monitors-changed",
G_CALLBACK(monitors_changed), this);
#ifdef MOZ_X11
gdk_window_add_filter(mRootWindow, root_window_event_filter, this);
if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
mNetWorkareaAtom =
XInternAtom(GDK_WINDOW_XDISPLAY(mRootWindow), "_NET_WORKAREA", False);
}
#endif
RefreshScreens();
}
ScreenHelperGTK::~ScreenHelperGTK()
{
- g_signal_handlers_disconnect_by_func(gdk_screen_get_default(),
- FuncToGpointer(monitors_changed),
- this);
+ if (mRootWindow) {
+ g_signal_handlers_disconnect_by_func(gdk_screen_get_default(),
+ FuncToGpointer(monitors_changed),
+ this);
- if (mRootWindow) {
gdk_window_remove_filter(mRootWindow, root_window_event_filter, this);
g_object_unref(mRootWindow);
mRootWindow = nullptr;
}
/* XineramaIsActive() registers a callback function close_display()
* in X, which is to be called in XCloseDisplay(). This is the case
* if Xinerama is active, even if only with one screen.