From 92ebef22abe058e37325e488907fb7b5110b3843 Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Wed, 13 May 2015 10:33:21 +0200 Subject: [PATCH] Added patch for mozilla#1144745 - HiDPI Gtk3 fixes --- firefox-baseline-disable.patch | 12 --- firefox.spec | 11 +- mozilla-1144745-1.patch | 150 ++++++++++++++++++++++++++ mozilla-1144745-2.patch | 185 +++++++++++++++++++++++++++++++++ mozilla-1144745-3.patch | 31 ++++++ 5 files changed, 376 insertions(+), 13 deletions(-) delete mode 100644 firefox-baseline-disable.patch create mode 100644 mozilla-1144745-1.patch create mode 100644 mozilla-1144745-2.patch create mode 100644 mozilla-1144745-3.patch diff --git a/firefox-baseline-disable.patch b/firefox-baseline-disable.patch deleted file mode 100644 index 8052119..0000000 --- a/firefox-baseline-disable.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up firefox-32.0.1/mozilla-release/modules/libpref/src/init/all.js.old firefox-32.0.1/mozilla-release/modules/libpref/src/init/all.js ---- firefox-32.0.1/mozilla-release/modules/libpref/init/all.js.old 2014-09-12 00:25:45.000000000 +0200 -+++ firefox-32.0.1/mozilla-release/modules/libpref/init/all.js 2014-09-16 14:27:52.447743192 +0200 -@@ -844,7 +844,7 @@ pref("javascript.options.strict", - #ifdef DEBUG - pref("javascript.options.strict.debug", true); - #endif --pref("javascript.options.baselinejit", true); -+pref("javascript.options.baselinejit", false); - pref("javascript.options.ion", true); - pref("javascript.options.asmjs", true); - pref("javascript.options.native_regexp", true); diff --git a/firefox.spec b/firefox.spec index 3b89f22..6e4ea96 100644 --- a/firefox.spec +++ b/firefox.spec @@ -107,7 +107,7 @@ Summary: Mozilla Firefox Web browser Name: firefox Version: 38.0 -Release: 4%{?pre_tag}%{?dist} +Release: 5%{?pre_tag}%{?dist} URL: http://www.mozilla.org/projects/firefox/ License: MPLv1.1 or GPLv2+ or LGPLv2+ Group: Applications/Internet @@ -155,6 +155,9 @@ Patch412: mozilla-1073117-no-gap-tab.patch Patch414: mozilla-1143686.patch Patch415: mozilla-1144643.patch Patch416: mozilla-1161056.patch +Patch417: mozilla-1144745-1.patch +Patch418: mozilla-1144745-2.patch +Patch419: mozilla-1144745-3.patch # Fix Skia Neon stuff on AArch64 Patch500: aarch64-fix-skia.patch @@ -311,6 +314,9 @@ cd %{tarballdir} %patch414 -p1 -b .1143686 %patch415 -p1 -b .1144643 %patch416 -p1 -b .1161056 +%patch417 -p1 -b .1144745-1 +%patch418 -p1 -b .1144745-2 +%patch419 -p1 -b .1144745-3 %endif %patch500 -p1 @@ -808,6 +814,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : #--------------------------------------------------------------------- %changelog +* Wed May 13 2015 Martin Stransky - 38.0-5 +- Added patch for mozilla#1144745 - HiDPI Gtk3 fixes + * Mon May 11 2015 Martin Stransky - 38.0-4 - Update to 38.0 Build 3 - Added fix for rhbz#1219542 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 diff --git a/mozilla-1144745-2.patch b/mozilla-1144745-2.patch new file mode 100644 index 0000000..e3b9cdf --- /dev/null +++ b/mozilla-1144745-2.patch @@ -0,0 +1,185 @@ +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; diff --git a/mozilla-1144745-3.patch b/mozilla-1144745-3.patch new file mode 100644 index 0000000..3f4d9c7 --- /dev/null +++ b/mozilla-1144745-3.patch @@ -0,0 +1,31 @@ +# HG changeset patch +# User Martin Stransky +# Parent e0299ad29b855f798ee5db8257cbb459894c1b29 +Bug 1144745 - scale border returned by GetWidgetBorder(), r=?karlt + +diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp +--- a/widget/gtk/nsNativeThemeGTK.cpp ++++ b/widget/gtk/nsNativeThemeGTK.cpp +@@ -990,16 +990,22 @@ nsNativeThemeGTK::GetWidgetBorder(nsDevi + if (GetGtkWidgetAndState(aWidgetType, aFrame, gtkWidgetType, nullptr, + nullptr)) { + moz_gtk_get_widget_border(gtkWidgetType, &aResult->left, &aResult->top, + &aResult->right, &aResult->bottom, direction, + IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XHTML)); + } + } + } ++ ++ gint scale = nsScreenGtk::GetGtkMonitorScaleFactor(); ++ aResult->top *= scale; ++ aResult->right *= scale; ++ aResult->bottom *= scale; ++ aResult->left *= scale; + return NS_OK; + } + + bool + nsNativeThemeGTK::GetWidgetPadding(nsDeviceContext* aContext, + nsIFrame* aFrame, uint8_t aWidgetType, + nsIntMargin* aResult) + {