diff -up mozilla-release/widget/gtk/nsLookAndFeel.cpp.1144745-2 mozilla-release/widget/gtk/nsLookAndFeel.cpp --- mozilla-release/widget/gtk/nsLookAndFeel.cpp.1144745-2 2015-05-13 10:30:08.204367309 +0200 +++ mozilla-release/widget/gtk/nsLookAndFeel.cpp 2015-05-13 10:30:08.208367321 +0200 @@ -18,6 +18,7 @@ #include #include "gfxPlatformGtk.h" +#include "nsScreenGtk.h" #include "gtkdrawing.h" #include "nsStyleConsts.h" @@ -742,12 +743,7 @@ GetSystemFontInfo(GtkWidget *aWidget, // Scale fonts up on HiDPI displays. // This would be done automatically with cairo, but we manually manage // the display scale for platform consistency. - static auto sGdkScreenGetMonitorScaleFactorPtr = (gint (*)(GdkScreen*,gint)) - dlsym(RTLD_DEFAULT, "gdk_screen_get_monitor_scale_factor"); - if (sGdkScreenGetMonitorScaleFactorPtr) { - GdkScreen *screen = gdk_screen_get_default(); - size *= (*sGdkScreenGetMonitorScaleFactorPtr)(screen, 0); - } + size *= nsScreenGtk::GetGtkMonitorScaleFactor(); // |size| is now pixels diff -up mozilla-release/widget/gtk/nsNativeThemeGTK.cpp.1144745-2 mozilla-release/widget/gtk/nsNativeThemeGTK.cpp --- mozilla-release/widget/gtk/nsNativeThemeGTK.cpp.1144745-2 2015-05-13 10:30:08.206367315 +0200 +++ mozilla-release/widget/gtk/nsNativeThemeGTK.cpp 2015-05-13 10:30:46.966488584 +0200 @@ -6,6 +6,7 @@ #include "nsNativeThemeGTK.h" #include "nsThemeConstants.h" #include "gtkdrawing.h" +#include "nsScreenGtk.h" #include "nsIObserverService.h" #include "nsIServiceManager.h" @@ -89,23 +90,6 @@ nsNativeThemeGTK::RefreshWidgetWindow(ns vm->InvalidateAllViews(); } -gint -nsNativeThemeGTK::GdkScaleFactor() -{ -#if (MOZ_WIDGET_GTK >= 3) - // Since GDK 3.10 - static auto sGdkScreenGetMonitorScaleFactorPtr = (gint (*)(GdkScreen*, gint)) - dlsym(RTLD_DEFAULT, "gdk_screen_get_monitor_scale_factor"); - if (sGdkScreenGetMonitorScaleFactorPtr) { - // FIXME: In the future, we'll want to fix this for GTK on Wayland which - // supports a variable scale factor per display. - GdkScreen *screen = gdk_screen_get_default(); - return sGdkScreenGetMonitorScaleFactorPtr(screen, 0); - } -#endif - return 1; -} - static bool IsFrameContentNodeInNamespace(nsIFrame *aFrame, uint32_t aNamespace) { @@ -796,10 +780,11 @@ nsNativeThemeGTK::GetExtraSizeForWidget( default: return false; } - aExtra->top *= GdkScaleFactor(); - aExtra->right *= GdkScaleFactor(); - aExtra->bottom *= GdkScaleFactor(); - aExtra->left *= GdkScaleFactor(); + gint scale = nsScreenGtk::GetGtkMonitorScaleFactor(); + aExtra->top *= scale; + aExtra->right *= scale; + aExtra->bottom *= scale; + aExtra->left *= scale; return true; } @@ -827,7 +812,7 @@ nsNativeThemeGTK::DrawWidgetBackground(n gfxRect rect = presContext->AppUnitsToGfxUnits(aRect); gfxRect dirtyRect = presContext->AppUnitsToGfxUnits(aDirtyRect); - gint scaleFactor = GdkScaleFactor(); + gint scaleFactor = nsScreenGtk::GetGtkMonitorScaleFactor(); // Align to device pixels where sensible // to provide crisper and faster drawing. @@ -1066,10 +1051,11 @@ nsNativeThemeGTK::GetWidgetPadding(nsDev aResult->left += horizontal_padding; aResult->right += horizontal_padding; - aResult->top *= GdkScaleFactor(); - aResult->right *= GdkScaleFactor(); - aResult->bottom *= GdkScaleFactor(); - aResult->left *= GdkScaleFactor(); + gint scale = nsScreenGtk::GetGtkMonitorScaleFactor(); + aResult->top *= scale; + aResult->right *= scale; + aResult->bottom *= scale; + aResult->left *= scale; return true; } @@ -1332,7 +1318,7 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n break; } - *aResult = *aResult * GdkScaleFactor(); + *aResult = *aResult * nsScreenGtk::GetGtkMonitorScaleFactor(); return NS_OK; } diff -up mozilla-release/widget/gtk/nsNativeThemeGTK.h.1144745-2 mozilla-release/widget/gtk/nsNativeThemeGTK.h --- mozilla-release/widget/gtk/nsNativeThemeGTK.h.1144745-2 2015-05-13 10:30:08.206367315 +0200 +++ mozilla-release/widget/gtk/nsNativeThemeGTK.h 2015-05-13 10:30:08.209367325 +0200 @@ -81,7 +81,6 @@ private: nsIntMargin* aExtra); void RefreshWidgetWindow(nsIFrame* aFrame); - gint GdkScaleFactor(); uint8_t mDisabledWidgetTypes[32]; uint8_t mSafeWidgetStates[1024]; // 256 widgets * 32 bits per widget diff -up mozilla-release/widget/gtk/nsScreenGtk.cpp.1144745-2 mozilla-release/widget/gtk/nsScreenGtk.cpp --- mozilla-release/widget/gtk/nsScreenGtk.cpp.1144745-2 2015-05-08 18:55:27.000000000 +0200 +++ mozilla-release/widget/gtk/nsScreenGtk.cpp 2015-05-13 10:30:08.209367325 +0200 @@ -63,6 +63,23 @@ nsScreenGtk :: GetAvailRect(int32_t *out } // GetAvailRect +gint +nsScreenGtk :: GetGtkMonitorScaleFactor() +{ +#if (MOZ_WIDGET_GTK >= 3) + // Since GDK 3.10 + static auto sGdkScreenGetMonitorScaleFactorPtr = (gint (*)(GdkScreen*, gint)) + dlsym(RTLD_DEFAULT, "gdk_screen_get_monitor_scale_factor"); + if (sGdkScreenGetMonitorScaleFactorPtr) { + // FIXME: In the future, we'll want to fix this for GTK on Wayland which + // supports a variable scale factor per display. + GdkScreen *screen = gdk_screen_get_default(); + return sGdkScreenGetMonitorScaleFactorPtr(screen, 0); + } +#endif + return 1; +} + double nsScreenGtk :: GetDPIScale() { @@ -127,20 +144,9 @@ nsScreenGtk :: GetColorDepth(int32_t *aC void nsScreenGtk :: Init (GdkWindow *aRootWindow) { - gint width = gdk_screen_width(); - gint height = gdk_screen_height(); - - // Since GDK 3.10 - static auto sGdkScreenGetMonitorScaleFactorPtr = (gint (*)(GdkScreen*, gint)) - dlsym(RTLD_DEFAULT, "gdk_screen_get_monitor_scale_factor"); - if (sGdkScreenGetMonitorScaleFactorPtr) { - // FIXME: In the future, we'll want to fix this for GTK on Wayland which - // supports a variable scale factor per display. - GdkScreen *screen = gdk_window_get_screen(aRootWindow); - gint scale = sGdkScreenGetMonitorScaleFactorPtr(screen, 0); - width *= scale; - height *= scale; - } + gint scale = nsScreenGtk::GetGtkMonitorScaleFactor(); + gint width = gdk_screen_width()*scale; + gint height = gdk_screen_height()*scale; // We listen for configure events on the root window to pick up // changes to this rect. We could listen for "size_changed" signals diff -up mozilla-release/widget/gtk/nsScreenGtk.h.1144745-2 mozilla-release/widget/gtk/nsScreenGtk.h --- mozilla-release/widget/gtk/nsScreenGtk.h.1144745-2 2015-05-08 18:55:27.000000000 +0200 +++ mozilla-release/widget/gtk/nsScreenGtk.h 2015-05-13 10:30:08.209367325 +0200 @@ -43,7 +43,8 @@ public: void Init(XineramaScreenInfo *aScreenInfo); #endif /* MOZ_X11 */ - static double GetDPIScale(); + static gint GetGtkMonitorScaleFactor(); + static double GetDPIScale(); private: uint32_t mScreenNum;