From 92ebef22abe058e37325e488907fb7b5110b3843 Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Wed, 13 May 2015 10:33:21 +0200 Subject: Added patch for mozilla#1144745 - HiDPI Gtk3 fixes --- mozilla-1144745-1.patch | 150 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 mozilla-1144745-1.patch (limited to 'mozilla-1144745-1.patch') diff --git a/mozilla-1144745-1.patch b/mozilla-1144745-1.patch new file mode 100644 index 0000000..82d55e7 --- /dev/null +++ b/mozilla-1144745-1.patch @@ -0,0 +1,150 @@ +diff -up mozilla-release/widget/gtk/nsNativeThemeGTK.cpp.1144745-1 mozilla-release/widget/gtk/nsNativeThemeGTK.cpp +--- mozilla-release/widget/gtk/nsNativeThemeGTK.cpp.1144745-1 2015-05-13 10:25:28.638492635 +0200 ++++ mozilla-release/widget/gtk/nsNativeThemeGTK.cpp 2015-05-13 10:28:41.438095846 +0200 +@@ -32,6 +32,7 @@ + #include "gfxPlatformGtk.h" + #include "gfxGdkNativeRenderer.h" + #include ++#include + + using namespace mozilla; + using namespace mozilla::gfx; +@@ -88,6 +89,24 @@ 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) + { + nsIContent *content = aFrame ? aFrame->GetContent() : nullptr; +@@ -711,10 +730,10 @@ nsNativeThemeGTK::GetExtraSizeForWidget( + switch (aWidgetType) { + case NS_THEME_SCROLLBAR_THUMB_VERTICAL: + aExtra->top = aExtra->bottom = 1; +- return true; ++ break; + case NS_THEME_SCROLLBAR_THUMB_HORIZONTAL: + aExtra->left = aExtra->right = 1; +- return true; ++ break; + + // Include the indicator spacing (the padding around the control). + case NS_THEME_CHECKBOX: +@@ -732,7 +751,7 @@ nsNativeThemeGTK::GetExtraSizeForWidget( + aExtra->right = indicator_spacing; + aExtra->bottom = indicator_spacing; + aExtra->left = indicator_spacing; +- return true; ++ break; + } + case NS_THEME_BUTTON : + { +@@ -745,7 +764,7 @@ nsNativeThemeGTK::GetExtraSizeForWidget( + aExtra->right = right; + aExtra->bottom = bottom; + aExtra->left = left; +- return true; ++ break; + } + } + case NS_THEME_FOCUS_OUTLINE: +@@ -753,7 +772,7 @@ nsNativeThemeGTK::GetExtraSizeForWidget( + moz_gtk_get_focus_outline_size(&aExtra->left, &aExtra->top); + aExtra->right = aExtra->left; + aExtra->bottom = aExtra->top; +- return true; ++ break; + } + case NS_THEME_TAB : + { +@@ -777,6 +796,11 @@ nsNativeThemeGTK::GetExtraSizeForWidget( + default: + return false; + } ++ aExtra->top *= GdkScaleFactor(); ++ aExtra->right *= GdkScaleFactor(); ++ aExtra->bottom *= GdkScaleFactor(); ++ aExtra->left *= GdkScaleFactor(); ++ return true; + } + + NS_IMETHODIMP +@@ -803,6 +827,7 @@ nsNativeThemeGTK::DrawWidgetBackground(n + + gfxRect rect = presContext->AppUnitsToGfxUnits(aRect); + gfxRect dirtyRect = presContext->AppUnitsToGfxUnits(aDirtyRect); ++ gint scaleFactor = GdkScaleFactor(); + + // Align to device pixels where sensible + // to provide crisper and faster drawing. +@@ -840,8 +865,10 @@ nsNativeThemeGTK::DrawWidgetBackground(n + + // gdk rectangles are wrt the drawing rect. + +- GdkRectangle gdk_rect = {-drawingRect.x, -drawingRect.y, +- widgetRect.width, widgetRect.height}; ++ GdkRectangle gdk_rect = {-drawingRect.x/scaleFactor, ++ -drawingRect.y/scaleFactor, ++ widgetRect.width/scaleFactor, ++ widgetRect.height/scaleFactor}; + + // translate everything so (0,0) is the top left of the drawingRect + gfxContextAutoSaveRestore autoSR(ctx); +@@ -850,6 +877,7 @@ nsNativeThemeGTK::DrawWidgetBackground(n + tm = ctx->CurrentMatrix(); + } + tm.Translate(rect.TopLeft() + gfxPoint(drawingRect.x, drawingRect.y)); ++ tm.Scale(scaleFactor, scaleFactor); // Draw in GDK coords + ctx->SetMatrix(tm); + + NS_ASSERTION(!IsWidgetTypeDisabled(mDisabledWidgetTypes, aWidgetType), +@@ -1038,6 +1066,11 @@ nsNativeThemeGTK::GetWidgetPadding(nsDev + aResult->left += horizontal_padding; + aResult->right += horizontal_padding; + ++ aResult->top *= GdkScaleFactor(); ++ aResult->right *= GdkScaleFactor(); ++ aResult->bottom *= GdkScaleFactor(); ++ aResult->left *= GdkScaleFactor(); ++ + return true; + } + } +@@ -1298,6 +1331,9 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n + } + break; + } ++ ++ *aResult = *aResult * GdkScaleFactor(); ++ + return NS_OK; + } + +diff -up mozilla-release/widget/gtk/nsNativeThemeGTK.h.1144745-1 mozilla-release/widget/gtk/nsNativeThemeGTK.h +--- mozilla-release/widget/gtk/nsNativeThemeGTK.h.1144745-1 2015-05-08 18:55:27.000000000 +0200 ++++ mozilla-release/widget/gtk/nsNativeThemeGTK.h 2015-05-13 10:25:28.642492647 +0200 +@@ -81,6 +81,7 @@ private: + nsIntMargin* aExtra); + + void RefreshWidgetWindow(nsIFrame* aFrame); ++ gint GdkScaleFactor(); + + uint8_t mDisabledWidgetTypes[32]; + uint8_t mSafeWidgetStates[1024]; // 256 widgets * 32 bits per widget -- cgit