From 14c907c37561e8bf362f740137dfbe1b2ff6eeff Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Mon, 30 Apr 2018 12:07:49 +0200 Subject: [PATCH] Added patches for correct popups position at CSD mode (mozilla-1457691) --- ...te-csd-window-offset-mozilla-1457691.patch | 212 ++++++++++++++++++ firefox.spec | 9 +- mozilla-1424422.patch | 188 ++++++++++++++++ 3 files changed, 408 insertions(+), 1 deletion(-) create mode 100644 complete-csd-window-offset-mozilla-1457691.patch create mode 100644 mozilla-1424422.patch diff --git a/complete-csd-window-offset-mozilla-1457691.patch b/complete-csd-window-offset-mozilla-1457691.patch new file mode 100644 index 0000000..85cb981 --- /dev/null +++ b/complete-csd-window-offset-mozilla-1457691.patch @@ -0,0 +1,212 @@ +diff -up firefox-60.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-60.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium +diff -up firefox-60.0/media/webrtc/trunk/Makefile.old firefox-60.0/media/webrtc/trunk/Makefile +diff -up firefox-60.0/widget/gtk/gtk3drawing.cpp.old firefox-60.0/widget/gtk/gtk3drawing.cpp +--- firefox-60.0/widget/gtk/gtk3drawing.cpp.old 2018-04-26 22:07:36.000000000 +0200 ++++ firefox-60.0/widget/gtk/gtk3drawing.cpp 2018-04-30 11:59:06.750866104 +0200 +@@ -38,6 +38,16 @@ static ToolbarGTKMetrics sToolbarMetrics + #define GTK_STATE_FLAG_CHECKED (1 << 11) + #endif + ++static GtkBorder ++operator+=(GtkBorder& first, const GtkBorder& second) ++{ ++ first.left += second.left; ++ first.right += second.right; ++ first.top += second.top; ++ first.bottom += second.bottom; ++ return first; ++} ++ + static gint + moz_gtk_get_tab_thickness(GtkStyleContext *style); + +@@ -3056,6 +3066,76 @@ GetScrollbarMetrics(GtkOrientation aOrie + return metrics; + } + ++/* ++ * get_shadow_width() from gtkwindow.c is not public so we need ++ * to implement it. ++ */ ++bool ++GetCSDDecorationSize(GtkWindow *aGtkWindow, GtkBorder* aDecorationSize) ++{ ++ GtkStyleContext* context = gtk_widget_get_style_context(GTK_WIDGET(aGtkWindow)); ++ bool solidDecorations = gtk_style_context_has_class(context, "solid-csd"); ++ context = GetStyleContext(solidDecorations ? ++ MOZ_GTK_WINDOW_DECORATION_SOLID : ++ MOZ_GTK_WINDOW_DECORATION); ++ ++ /* Always sum border + padding */ ++ GtkBorder padding; ++ GtkStateFlags state = gtk_style_context_get_state(context); ++ gtk_style_context_get_border(context, state, aDecorationSize); ++ gtk_style_context_get_padding(context, state, &padding); ++ *aDecorationSize += padding; ++ ++ // Available on GTK 3.20+. ++ static auto sGtkRenderBackgroundGetClip = ++ (void (*)(GtkStyleContext*, gdouble, gdouble, gdouble, gdouble, GdkRectangle*)) ++ dlsym(RTLD_DEFAULT, "gtk_render_background_get_clip"); ++ ++ GtkBorder margin; ++ gtk_style_context_get_margin(context, state, &margin); ++ ++ GtkBorder extents = {0, 0, 0, 0}; ++ if (sGtkRenderBackgroundGetClip) { ++ /* Get shadow extents but combine with style margin; use the bigger value. ++ */ ++ GdkRectangle clip; ++ sGtkRenderBackgroundGetClip(context, 0, 0, 0, 0, &clip); ++ ++ extents.top = -clip.y; ++ extents.right = clip.width + clip.x; ++ extents.bottom = clip.height + clip.y; ++ extents.left = -clip.x; ++ ++ // Margin is used for resize grip size - it's not present on ++ // popup windows. ++ if (gtk_window_get_window_type(aGtkWindow) != GTK_WINDOW_POPUP) { ++ extents.top = MAX(extents.top, margin.top); ++ extents.right = MAX(extents.right, margin.right); ++ extents.bottom = MAX(extents.bottom, margin.bottom); ++ extents.left = MAX(extents.left, margin.left); ++ } ++ } else { ++ /* If we can't get shadow extents use decoration-resize-handle instead ++ * as a workaround. This is inspired by update_border_windows() ++ * from gtkwindow.c although this is not 100% accurate as we emulate ++ * the extents here. ++ */ ++ gint handle; ++ gtk_widget_style_get(GetWidget(MOZ_GTK_WINDOW), ++ "decoration-resize-handle", &handle, ++ NULL); ++ ++ extents.top = handle + margin.top; ++ extents.right = handle + margin.right; ++ extents.bottom = handle + margin.bottom; ++ extents.left = handle + margin.left; ++ } ++ ++ *aDecorationSize += extents; ++ ++ return (sGtkRenderBackgroundGetClip != nullptr); ++} ++ + /* cairo_t *cr argument has to be a system-cairo. */ + gint + moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr, +diff -up firefox-60.0/widget/gtk/gtkdrawing.h.old firefox-60.0/widget/gtk/gtkdrawing.h +--- firefox-60.0/widget/gtk/gtkdrawing.h.old 2018-04-26 22:07:35.000000000 +0200 ++++ firefox-60.0/widget/gtk/gtkdrawing.h 2018-04-30 11:59:06.750866104 +0200 +@@ -334,6 +334,10 @@ typedef enum { + */ + MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE_RESTORE, + ++ /* Client-side window decoration node. Available on GTK 3.20+. */ ++ MOZ_GTK_WINDOW_DECORATION, ++ MOZ_GTK_WINDOW_DECORATION_SOLID, ++ + MOZ_GTK_WIDGET_NODE_COUNT + } WidgetNodeType; + +@@ -606,4 +610,17 @@ GetToolbarButtonMetrics(WidgetNodeType a + int + GetGtkHeaderBarButtonLayout(WidgetNodeType* aButtonLayout, int aMaxButtonNums); + ++/** ++ * Get size of CSD window extents of given GtkWindow. ++ * ++ * aGtkWindow [IN] Decorated window. ++ * aDecorationSize [OUT] Returns calculated (or estimated) decoration ++ * size of given aGtkWindow. ++ * ++ * returns: True if we have extract decoration size (for GTK 3.20+) ++ * False if we have only an estimation (for GTK+ before 3.20+) ++ */ ++bool ++GetCSDDecorationSize(GtkWindow *aGtkWindow, GtkBorder* aDecorationSize); ++ + #endif +diff -up firefox-60.0/widget/gtk/nsWindow.cpp.old firefox-60.0/widget/gtk/nsWindow.cpp +--- firefox-60.0/widget/gtk/nsWindow.cpp.old 2018-04-30 12:01:38.788343254 +0200 ++++ firefox-60.0/widget/gtk/nsWindow.cpp 2018-04-30 12:00:01.012679502 +0200 +@@ -127,6 +127,7 @@ using namespace mozilla::widget; + #endif + + #include "nsShmImage.h" ++#include "gtkdrawing.h" + + #include "nsIDOMWheelEvent.h" + +@@ -3360,6 +3361,10 @@ nsWindow::OnWindowStateEvent(GtkWidget * + aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN); + } + } ++ ++ if (mDrawInTitlebar && mCSDSupportLevel == CSD_SUPPORT_CLIENT) { ++ UpdateClientOffsetForCSDWindow(); ++ } + } + + void +@@ -6556,6 +6561,32 @@ nsWindow::ClearCachedResources() + } + } + ++/* nsWindow::UpdateClientOffsetForCSDWindow() is designed to be called from ++ * paint code to update mClientOffset any time. It also propagates ++ * the mClientOffset to child tabs. ++ * ++ * It works only for CSD decorated GtkWindow. ++ */ ++void ++nsWindow::UpdateClientOffsetForCSDWindow() ++{ ++ // _NET_FRAME_EXTENTS is not set on client decorated windows, ++ // so we need to read offset between mContainer and toplevel mShell ++ // window. ++ if (mSizeState == nsSizeMode_Normal) { ++ GtkBorder decorationSize; ++ GetCSDDecorationSize(GTK_WINDOW(mShell), &decorationSize); ++ mClientOffset = nsIntPoint(decorationSize.left, decorationSize.top); ++ } else { ++ mClientOffset = nsIntPoint(0, 0); ++ } ++ ++ // Send a WindowMoved notification. This ensures that TabParent ++ // picks up the new client offset and sends it to the child process ++ // if appropriate. ++ NotifyWindowMoved(mBounds.x, mBounds.y); ++} ++ + nsresult + nsWindow::SetNonClientMargins(LayoutDeviceIntMargin &aMargins) + { +@@ -6628,6 +6659,13 @@ nsWindow::SetDrawsInTitlebar(bool aState + mNeedsShow = true; + NativeResize(); + ++ // When we use system titlebar setup managed by Gtk+ we also get ++ // _NET_FRAME_EXTENTS property for our toplevel window so we can't ++ // update the client offset it here. ++ if (aState) { ++ UpdateClientOffsetForCSDWindow(); ++ } ++ + gtk_widget_destroy(tmpWindow); + } + } +diff -up firefox-60.0/widget/gtk/nsWindow.h.old firefox-60.0/widget/gtk/nsWindow.h +--- firefox-60.0/widget/gtk/nsWindow.h.old 2018-04-26 22:07:35.000000000 +0200 ++++ firefox-60.0/widget/gtk/nsWindow.h 2018-04-30 11:57:33.656146337 +0200 +@@ -456,6 +456,8 @@ private: + nsIWidgetListener* GetListener(); + bool IsComposited() const; + ++ void UpdateClientOffsetForCSDWindow(); ++ + GtkWidget *mShell; + MozContainer *mContainer; + GdkWindow *mGdkWindow; diff --git a/firefox.spec b/firefox.spec index f776f6b..01d81a9 100644 --- a/firefox.spec +++ b/firefox.spec @@ -96,7 +96,7 @@ Summary: Mozilla Firefox Web browser Name: firefox Version: 60.0 -Release: 0.2%{?pre_tag}%{?dist} +Release: 0.3%{?pre_tag}%{?dist} URL: https://www.mozilla.org/firefox/ License: MPLv1.1 or GPLv2+ or LGPLv2+ Source0: https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%{version}%{?pre_version}.source.tar.xz @@ -153,6 +153,8 @@ Patch412: mozilla-1337988.patch Patch413: mozilla-1353817.patch Patch414: mozilla-1435212-ffmpeg-4.0.patch Patch415: Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch +Patch416: mozilla-1424422.patch +Patch417: complete-csd-window-offset-mozilla-1457691.patch # Debian patches Patch500: mozilla-440908.patch @@ -321,6 +323,8 @@ This package contains results of tests executed during build. %ifarch %{arm} %patch415 -p1 -b .mozilla-1238661 %endif +%patch416 -p1 -b .1424422 +%patch417 -p1 -b .complete-csd-1457691 # Patch for big endian platforms only %if 0%{?big_endian} @@ -846,6 +850,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : #--------------------------------------------------------------------- %changelog +* Mon Apr 30 2018 Martin Stransky - 60.0-0.3 +- Added patches for correct popups position at CSD mode (mozilla-1457691). + * Fri Apr 27 2018 Martin Stransky - 60.0-0.2 - Update to 60.0 Beta 16 diff --git a/mozilla-1424422.patch b/mozilla-1424422.patch new file mode 100644 index 0000000..cc8b31f --- /dev/null +++ b/mozilla-1424422.patch @@ -0,0 +1,188 @@ +diff -up firefox-60.0/browser/base/content/browser.js.1424422 firefox-60.0/browser/base/content/browser.js +--- firefox-60.0/browser/base/content/browser.js.1424422 2018-04-26 22:07:20.000000000 +0200 ++++ firefox-60.0/browser/base/content/browser.js 2018-04-30 11:49:51.609458857 +0200 +@@ -1259,6 +1259,9 @@ var gBrowserInit = { + + if (AppConstants.CAN_DRAW_IN_TITLEBAR) { + gDragSpaceObserver.init(); ++ if (AppConstants.platform == "linux") { ++ gLightThemeObserver.init(); ++ } + } + + BrowserSearch.initPlaceHolder(); +@@ -1826,6 +1829,9 @@ var gBrowserInit = { + + if (AppConstants.CAN_DRAW_IN_TITLEBAR) { + gDragSpaceObserver.uninit(); ++ if (AppConstants.platform == "linux") { ++ gLightThemeObserver.uninit(); ++ } + } + + TabsInTitlebar.uninit(); +@@ -5781,6 +5787,24 @@ var gDragSpaceObserver = { + }, + }; + ++var gLightThemeObserver = { ++ init() { ++ Services.obs.addObserver(this, "lightweight-theme-styling-update"); ++ }, ++ ++ uninit() { ++ Services.obs.removeObserver(this, "lightweight-theme-styling-update"); ++ }, ++ ++ observe(aSubject, aTopic, aData) { ++ switch (aTopic) { ++ case "lightweight-theme-styling-update": ++ TabsInTitlebar.updateAppearance(true); ++ break; ++ } ++ }, ++}; ++ + // Updates the UI density (for touch and compact mode) based on the uidensity pref. + var gUIDensity = { + MODE_NORMAL: 0, +diff -up firefox-60.0/browser/themes/linux/browser.css.1424422 firefox-60.0/browser/themes/linux/browser.css +--- firefox-60.0/browser/themes/linux/browser.css.1424422 2018-04-26 22:07:21.000000000 +0200 ++++ firefox-60.0/browser/themes/linux/browser.css 2018-04-30 11:45:40.388172492 +0200 +@@ -691,12 +691,34 @@ notification[value="translation"] menuli + padding-bottom: 2px; + } + ++ /* When default theme is used render titlebar command buttons ++ * according to system config. ++ * ++ * When -moz-lwtheme is enabled use similar approach as on Windows platform. ++ */ ++ .titlebar-button:-moz-lwtheme { ++ border: none; ++ margin: 0 !important; ++ padding: 8px 17px; ++ } ++ .titlebar-button:-moz-lwtheme > .toolbarbutton-icon { ++ width: 12px; ++ height: 12px; ++ } ++ .titlebar-button:hover:-moz-lwtheme { ++ background-color: Highlight; ++ } ++ + /* Render titlebar command buttons according to system config. + * Use full scale icons here as the Gtk+ does. + */ + @media (-moz-gtk-csd-minimize-button) { +- #titlebar-min { +- -moz-appearance: -moz-window-button-minimize; ++ #titlebar-min:not(:-moz-lwtheme) { ++ -moz-appearance: -moz-window-button-minimize; ++ } ++ #titlebar-min:-moz-lwtheme { ++ -moz-appearance: none !important; ++ list-style-image: url(chrome://browser/skin/window-controls/minimize-themes.svg); + } + } + @media (-moz-gtk-csd-minimize-button: 0) { +@@ -706,12 +728,20 @@ notification[value="translation"] menuli + } + + @media (-moz-gtk-csd-maximize-button) { +- #titlebar-max { ++ #titlebar-max:not(:-moz-lwtheme) { + -moz-appearance: -moz-window-button-maximize; + } +- :root[sizemode="maximized"] #titlebar-max { ++ #titlebar-max:-moz-lwtheme { ++ -moz-appearance: none !important; ++ list-style-image: url(chrome://browser/skin/window-controls/maximize-themes.svg); ++ } ++ :root[sizemode="maximized"] #titlebar-max:not(:-moz-lwtheme) { + -moz-appearance: -moz-window-button-restore; + } ++ :root[sizemode="maximized"] #titlebar-max:-moz-lwtheme { ++ -moz-appearance: none !important; ++ list-style-image: url(chrome://browser/skin/window-controls/restore-themes.svg); ++ } + } + @media (-moz-gtk-csd-maximize-button: 0) { + #titlebar-max { +@@ -720,9 +750,13 @@ notification[value="translation"] menuli + } + + @media (-moz-gtk-csd-close-button) { +- #titlebar-close { ++ #titlebar-close:not(:-moz-lwtheme) { + -moz-appearance: -moz-window-button-close; + } ++ #titlebar-close:-moz-lwtheme { ++ -moz-appearance: none !important; ++ list-style-image: url(chrome://browser/skin/window-controls/close-themes.svg); ++ } + } + @media (-moz-gtk-csd-close-button: 0) { + #titlebar-close { +diff -up firefox-60.0/browser/themes/linux/jar.mn.1424422 firefox-60.0/browser/themes/linux/jar.mn +--- firefox-60.0/browser/themes/linux/jar.mn.1424422 2018-04-26 22:07:20.000000000 +0200 ++++ firefox-60.0/browser/themes/linux/jar.mn 2018-04-30 11:45:40.388172492 +0200 +@@ -49,9 +49,12 @@ browser.jar: + * skin/classic/browser/preferences/in-content/dialog.css (preferences/in-content/dialog.css) + skin/classic/browser/preferences/applications.css (preferences/applications.css) + skin/classic/browser/tabbrowser/tabDragIndicator.png (tabbrowser/tabDragIndicator.png) +- + skin/classic/browser/sync-desktopIcon.svg (../shared/sync-desktopIcon.svg) + skin/classic/browser/sync-mobileIcon.svg (../shared/sync-mobileIcon.svg) ++ skin/classic/browser/window-controls/close-themes.svg (window-controls/close-themes.svg) ++ skin/classic/browser/window-controls/maximize-themes.svg (window-controls/maximize-themes.svg) ++ skin/classic/browser/window-controls/minimize-themes.svg (window-controls/minimize-themes.svg) ++ skin/classic/browser/window-controls/restore-themes.svg (window-controls/restore-themes.svg) + skin/classic/browser/e10s-64@2x.png (../shared/e10s-64@2x.png) + + [extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}] chrome.jar: +diff -up firefox-60.0/browser/themes/linux/window-controls/close-themes.svg.1424422 firefox-60.0/browser/themes/linux/window-controls/close-themes.svg +--- firefox-60.0/browser/themes/linux/window-controls/close-themes.svg.1424422 2018-04-30 11:45:40.388172492 +0200 ++++ firefox-60.0/browser/themes/linux/window-controls/close-themes.svg 2018-04-30 11:45:40.388172492 +0200 +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ +diff -up firefox-60.0/browser/themes/linux/window-controls/maximize-themes.svg.1424422 firefox-60.0/browser/themes/linux/window-controls/maximize-themes.svg +--- firefox-60.0/browser/themes/linux/window-controls/maximize-themes.svg.1424422 2018-04-30 11:45:40.388172492 +0200 ++++ firefox-60.0/browser/themes/linux/window-controls/maximize-themes.svg 2018-04-30 11:45:40.388172492 +0200 +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ +diff -up firefox-60.0/browser/themes/linux/window-controls/minimize-themes.svg.1424422 firefox-60.0/browser/themes/linux/window-controls/minimize-themes.svg +--- firefox-60.0/browser/themes/linux/window-controls/minimize-themes.svg.1424422 2018-04-30 11:45:40.388172492 +0200 ++++ firefox-60.0/browser/themes/linux/window-controls/minimize-themes.svg 2018-04-30 11:45:40.388172492 +0200 +@@ -0,0 +1,7 @@ ++ ++ ++ ++ ++ +diff -up firefox-60.0/browser/themes/linux/window-controls/restore-themes.svg.1424422 firefox-60.0/browser/themes/linux/window-controls/restore-themes.svg +--- firefox-60.0/browser/themes/linux/window-controls/restore-themes.svg.1424422 2018-04-30 11:45:40.388172492 +0200 ++++ firefox-60.0/browser/themes/linux/window-controls/restore-themes.svg 2018-04-30 11:45:40.388172492 +0200 +@@ -0,0 +1,8 @@ ++ ++ ++ ++ ++ ++