Bug 1351246 - Check gdk_screen_get_default() for X. r=karlt draft
authorKan-Ru Chen <kanru@kanru.info>
Wed, 29 Mar 2017 08:29:58 -0400
changeset 553685 4daa2218f57b86a2fcb9f6b3f582bae7dd65b4a4
parent 551547 8d1ad73ba4f2796a8a69ac28217efdf3395b9e6f
child 622137 48388c04940f03ccb543f4b0961a945a189d4e49
push id51716
push userkchen@mozilla.com
push dateThu, 30 Mar 2017 12:50:10 +0000
reviewerskarlt
bugs1351246
milestone55.0a1
Bug 1351246 - Check gdk_screen_get_default() for X. r=karlt MozReview-Commit-ID: FJr7tdu1Rsp
widget/gtk/ScreenHelperGTK.cpp
--- 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.