Updated CSD patch

This commit is contained in:
Martin Stransky 2017-10-09 11:08:34 +02:00
parent b58833c2c8
commit 92eee6224e

View File

@ -1,8 +1,7 @@
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js diff -up firefox-57.0b6/browser/app/profile/firefox.js.1399611 firefox-57.0b6/browser/app/profile/firefox.js
index de61ac442b74..be15873ee2c4 100644 --- firefox-57.0b6/browser/app/profile/firefox.js.1399611 2017-10-09 10:58:19.851078873 +0200
--- a/browser/app/profile/firefox.js +++ firefox-57.0b6/browser/app/profile/firefox.js 2017-10-09 10:58:19.862078833 +0200
+++ b/browser/app/profile/firefox.js @@ -456,11 +456,7 @@ pref("browser.tabs.loadDivertedInBackgro
@@ -455,11 +455,7 @@ pref("browser.tabs.loadDivertedInBackground", false);
pref("browser.tabs.loadBookmarksInBackground", false); pref("browser.tabs.loadBookmarksInBackground", false);
pref("browser.tabs.loadBookmarksInTabs", false); pref("browser.tabs.loadBookmarksInTabs", false);
pref("browser.tabs.tabClipWidth", 140); pref("browser.tabs.tabClipWidth", 140);
@ -14,10 +13,9 @@ index de61ac442b74..be15873ee2c4 100644
// Offer additional drag space to the user. The drag space // Offer additional drag space to the user. The drag space
// will only be shown if browser.tabs.drawInTitlebar is true. // will only be shown if browser.tabs.drawInTitlebar is true.
diff --git a/browser/base/content/browser-tabsintitlebar.js b/browser/base/content/browser-tabsintitlebar.js diff -up firefox-57.0b6/browser/base/content/browser-tabsintitlebar.js.1399611 firefox-57.0b6/browser/base/content/browser-tabsintitlebar.js
index d9509029bbf1..b56f81c0c138 100644 --- firefox-57.0b6/browser/base/content/browser-tabsintitlebar.js.1399611 2017-10-02 22:17:19.000000000 +0200
--- a/browser/base/content/browser-tabsintitlebar.js +++ firefox-57.0b6/browser/base/content/browser-tabsintitlebar.js 2017-10-09 10:58:19.862078833 +0200
+++ b/browser/base/content/browser-tabsintitlebar.js
@@ -14,6 +14,11 @@ var TabsInTitlebar = { @@ -14,6 +14,11 @@ var TabsInTitlebar = {
this._readPref(); this._readPref();
Services.prefs.addObserver(this._prefName, this); Services.prefs.addObserver(this._prefName, this);
@ -30,11 +28,10 @@ index d9509029bbf1..b56f81c0c138 100644
// We need to update the appearance of the titlebar when the menu changes // We need to update the appearance of the titlebar when the menu changes
// from the active to the inactive state. We can't, however, rely on // from the active to the inactive state. We can't, however, rely on
// DOMMenuBarInactive, because the menu fires this event and then removes // DOMMenuBarInactive, because the menu fires this event and then removes
diff --git a/browser/base/moz.build b/browser/base/moz.build diff -up firefox-57.0b6/browser/base/moz.build.1399611 firefox-57.0b6/browser/base/moz.build
index a2bd4bcb4eca..f14553e4ba7f 100644 --- firefox-57.0b6/browser/base/moz.build.1399611 2017-09-29 18:16:45.000000000 +0200
--- a/browser/base/moz.build +++ firefox-57.0b6/browser/base/moz.build 2017-10-09 10:58:19.862078833 +0200
+++ b/browser/base/moz.build @@ -57,7 +57,7 @@ DEFINES['APP_LICENSE_BLOCK'] = '%s/conte
@@ -56,7 +56,7 @@ DEFINES['APP_LICENSE_BLOCK'] = '%s/content/overrides/app-license.html' % SRCDIR
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3', 'cocoa'): if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3', 'cocoa'):
DEFINES['CONTEXT_COPY_IMAGE_CONTENTS'] = 1 DEFINES['CONTEXT_COPY_IMAGE_CONTENTS'] = 1
@ -43,16 +40,12 @@ index a2bd4bcb4eca..f14553e4ba7f 100644
DEFINES['CAN_DRAW_IN_TITLEBAR'] = 1 DEFINES['CAN_DRAW_IN_TITLEBAR'] = 1
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'): if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'):
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css diff -up firefox-57.0b6/browser/themes/linux/browser.css.1399611 firefox-57.0b6/browser/themes/linux/browser.css
index 65a3f0cca7b1..7bb448da620b 100644 --- firefox-57.0b6/browser/themes/linux/browser.css.1399611 2017-10-05 06:17:37.000000000 +0200
--- a/browser/themes/linux/browser.css +++ firefox-57.0b6/browser/themes/linux/browser.css 2017-10-09 11:07:21.604073376 +0200
+++ b/browser/themes/linux/browser.css @@ -556,7 +556,9 @@ html|span.ac-emphasize-text-url {
@@ -557,8 +557,12 @@ html|span.ac-emphasize-text-url {
color: -moz-menubartext;
}
+/* Support dragging the window using the toolbar when drawing our own #nav-bar,
+ * decorations, or where the GTK theme allows. */
#toolbar-menubar:not([autohide="true"]):not(:-moz-lwtheme):-moz-system-metric(menubar-drag), #toolbar-menubar:not([autohide="true"]):not(:-moz-lwtheme):-moz-system-metric(menubar-drag),
-#TabsToolbar:not(:-moz-lwtheme):-moz-system-metric(menubar-drag) { -#TabsToolbar:not(:-moz-lwtheme):-moz-system-metric(menubar-drag) {
+#TabsToolbar:not(:-moz-lwtheme):-moz-system-metric(menubar-drag), +#TabsToolbar:not(:-moz-lwtheme):-moz-system-metric(menubar-drag),
@ -61,7 +54,7 @@ index 65a3f0cca7b1..7bb448da620b 100644
-moz-binding: url("chrome://browser/content/customizableui/toolbar.xml#toolbar-drag"); -moz-binding: url("chrome://browser/content/customizableui/toolbar.xml#toolbar-drag");
} }
@@ -715,3 +719,85 @@ html|span.ac-emphasize-text-url { @@ -713,3 +715,85 @@ html|span.ac-emphasize-text-url {
.restore-tabs-button:hover:active:not([disabled="true"]) { .restore-tabs-button:hover:active:not([disabled="true"]) {
padding: 3px; padding: 3px;
} }
@ -147,10 +140,9 @@ index 65a3f0cca7b1..7bb448da620b 100644
+ } + }
+ } + }
+} +}
diff --git a/dom/base/nsGkAtomList.h b/dom/base/nsGkAtomList.h diff -up firefox-57.0b6/dom/base/nsGkAtomList.h.1399611 firefox-57.0b6/dom/base/nsGkAtomList.h
index 5d5ec3d405c9..bb2f652c41e0 100644 --- firefox-57.0b6/dom/base/nsGkAtomList.h.1399611 2017-09-15 06:15:41.000000000 +0200
--- a/dom/base/nsGkAtomList.h +++ firefox-57.0b6/dom/base/nsGkAtomList.h 2017-10-09 10:58:19.863078829 +0200
+++ b/dom/base/nsGkAtomList.h
@@ -2270,6 +2270,10 @@ GK_ATOM(touch_enabled, "touch-enabled") @@ -2270,6 +2270,10 @@ GK_ATOM(touch_enabled, "touch-enabled")
GK_ATOM(menubar_drag, "menubar-drag") GK_ATOM(menubar_drag, "menubar-drag")
GK_ATOM(swipe_animation_enabled, "swipe-animation-enabled") GK_ATOM(swipe_animation_enabled, "swipe-animation-enabled")
@ -162,7 +154,7 @@ index 5d5ec3d405c9..bb2f652c41e0 100644
// windows theme selector metrics // windows theme selector metrics
GK_ATOM(windows_classic, "windows-classic") GK_ATOM(windows_classic, "windows-classic")
@@ -2306,6 +2310,10 @@ GK_ATOM(_moz_device_orientation, "-moz-device-orientation") @@ -2306,6 +2310,10 @@ GK_ATOM(_moz_device_orientation, "-moz-d
GK_ATOM(_moz_is_resource_document, "-moz-is-resource-document") GK_ATOM(_moz_is_resource_document, "-moz-is-resource-document")
GK_ATOM(_moz_swipe_animation_enabled, "-moz-swipe-animation-enabled") GK_ATOM(_moz_swipe_animation_enabled, "-moz-swipe-animation-enabled")
GK_ATOM(_moz_physical_home_button, "-moz-physical-home-button") GK_ATOM(_moz_physical_home_button, "-moz-physical-home-button")
@ -173,10 +165,9 @@ index 5d5ec3d405c9..bb2f652c41e0 100644
// application commands // application commands
GK_ATOM(Back, "Back") GK_ATOM(Back, "Back")
diff --git a/gfx/src/nsThemeConstants.h b/gfx/src/nsThemeConstants.h diff -up firefox-57.0b6/gfx/src/nsThemeConstants.h.1399611 firefox-57.0b6/gfx/src/nsThemeConstants.h
index d0ced405095d..1cd2361a0026 100644 --- firefox-57.0b6/gfx/src/nsThemeConstants.h.1399611 2017-06-12 18:37:10.000000000 +0200
--- a/gfx/src/nsThemeConstants.h +++ firefox-57.0b6/gfx/src/nsThemeConstants.h 2017-10-09 10:58:19.863078829 +0200
+++ b/gfx/src/nsThemeConstants.h
@@ -299,6 +299,7 @@ enum ThemeWidgetType : uint8_t { @@ -299,6 +299,7 @@ enum ThemeWidgetType : uint8_t {
NS_THEME_MAC_SOURCE_LIST, NS_THEME_MAC_SOURCE_LIST,
NS_THEME_MAC_SOURCE_LIST_SELECTION, NS_THEME_MAC_SOURCE_LIST_SELECTION,
@ -185,10 +176,9 @@ index d0ced405095d..1cd2361a0026 100644
ThemeWidgetType_COUNT ThemeWidgetType_COUNT
}; };
diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp diff -up firefox-57.0b6/layout/style/nsCSSRuleProcessor.cpp.1399611 firefox-57.0b6/layout/style/nsCSSRuleProcessor.cpp
index cbfb4d0f60aa..263372ca868e 100644 --- firefox-57.0b6/layout/style/nsCSSRuleProcessor.cpp.1399611 2017-08-02 14:27:54.000000000 +0200
--- a/layout/style/nsCSSRuleProcessor.cpp +++ firefox-57.0b6/layout/style/nsCSSRuleProcessor.cpp 2017-10-09 10:58:19.863078829 +0200
+++ b/layout/style/nsCSSRuleProcessor.cpp
@@ -1180,6 +1180,30 @@ nsCSSRuleProcessor::InitSystemMetrics() @@ -1180,6 +1180,30 @@ nsCSSRuleProcessor::InitSystemMetrics()
sSystemMetrics->AppendElement(nsGkAtoms::physical_home_button); sSystemMetrics->AppendElement(nsGkAtoms::physical_home_button);
} }
@ -220,10 +210,9 @@ index cbfb4d0f60aa..263372ca868e 100644
#ifdef XP_WIN #ifdef XP_WIN
if (NS_SUCCEEDED( if (NS_SUCCEEDED(
LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsThemeIdentifier, LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsThemeIdentifier,
diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp diff -up firefox-57.0b6/layout/style/nsMediaFeatures.cpp.1399611 firefox-57.0b6/layout/style/nsMediaFeatures.cpp
index 7cf6a08e46c1..bf955d759e8b 100644 --- firefox-57.0b6/layout/style/nsMediaFeatures.cpp.1399611 2017-09-15 06:15:42.000000000 +0200
--- a/layout/style/nsMediaFeatures.cpp +++ firefox-57.0b6/layout/style/nsMediaFeatures.cpp 2017-10-09 10:58:19.863078829 +0200
+++ b/layout/style/nsMediaFeatures.cpp
@@ -788,6 +788,42 @@ nsMediaFeatures::features[] = { @@ -788,6 +788,42 @@ nsMediaFeatures::features[] = {
GetSystemMetric GetSystemMetric
}, },
@ -267,11 +256,10 @@ index 7cf6a08e46c1..bf955d759e8b 100644
// Internal -moz-is-glyph media feature: applies only inside SVG glyphs. // Internal -moz-is-glyph media feature: applies only inside SVG glyphs.
// Internal because it is really only useful in the user agent anyway // Internal because it is really only useful in the user agent anyway
// and therefore not worth standardizing. // and therefore not worth standardizing.
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js diff -up firefox-57.0b6/modules/libpref/init/all.js.1399611 firefox-57.0b6/modules/libpref/init/all.js
index 0b77f1759021..b8dc9aeebfd8 100644 --- firefox-57.0b6/modules/libpref/init/all.js.1399611 2017-10-02 22:17:20.000000000 +0200
--- a/modules/libpref/init/all.js +++ firefox-57.0b6/modules/libpref/init/all.js 2017-10-09 10:58:19.864078825 +0200
+++ b/modules/libpref/init/all.js @@ -4911,6 +4911,7 @@ pref("gfx.apitrace.enabled",false);
@@ -4912,6 +4912,7 @@ pref("gfx.apitrace.enabled",false);
pref("gfx.xrender.enabled",false); pref("gfx.xrender.enabled",false);
pref("widget.chrome.allow-gtk-dark-theme", false); pref("widget.chrome.allow-gtk-dark-theme", false);
pref("widget.content.allow-gtk-dark-theme", false); pref("widget.content.allow-gtk-dark-theme", false);
@ -279,10 +267,9 @@ index 0b77f1759021..b8dc9aeebfd8 100644
#endif #endif
#endif #endif
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build diff -up firefox-57.0b6/toolkit/modules/moz.build.1399611 firefox-57.0b6/toolkit/modules/moz.build
index 8b5dc9e25d7e..14fb0fe87e9d 100644 --- firefox-57.0b6/toolkit/modules/moz.build.1399611 2017-09-15 06:15:40.000000000 +0200
--- a/toolkit/modules/moz.build +++ firefox-57.0b6/toolkit/modules/moz.build 2017-10-09 10:58:19.864078825 +0200
+++ b/toolkit/modules/moz.build
@@ -259,7 +259,7 @@ EXTRA_JS_MODULES.sessionstore += [ @@ -259,7 +259,7 @@ EXTRA_JS_MODULES.sessionstore += [
] ]
@ -292,192 +279,9 @@ index 8b5dc9e25d7e..14fb0fe87e9d 100644
DEFINES['CAN_DRAW_IN_TITLEBAR'] = 1 DEFINES['CAN_DRAW_IN_TITLEBAR'] = 1
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'): if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'):
diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h diff -up firefox-57.0b6/widget/gtk/gtk3drawing.cpp.1399611 firefox-57.0b6/widget/gtk/gtk3drawing.cpp
index ff5da8017621..d31b411a9b1a 100644 --- firefox-57.0b6/widget/gtk/gtk3drawing.cpp.1399611 2017-09-15 06:15:40.000000000 +0200
--- a/widget/LookAndFeel.h +++ firefox-57.0b6/widget/gtk/gtk3drawing.cpp 2017-10-09 10:58:19.865078822 +0200
+++ b/widget/LookAndFeel.h
@@ -405,6 +405,30 @@ public:
eIntID_PhysicalHomeButton,
/*
+ * A boolean value indicating whether client-side decorations are
+ * supported by the user's GTK version.
+ */
+ eIntID_GTKCSDAvailable,
+
+ /*
+ * A boolean value indicating whether client-side decorations should
+ * contain a minimize button.
+ */
+ eIntID_GTKCSDMinimizeButton,
+
+ /*
+ * A boolean value indicating whether client-side decorations should
+ * contain a maximize button.
+ */
+ eIntID_GTKCSDMaximizeButton,
+
+ /*
+ * A boolean value indicating whether client-side decorations should
+ * contain a close button.
+ */
+ eIntID_GTKCSDCloseButton,
+
+ /*
* Controls whether overlay scrollbars display when the user moves
* the mouse in a scrollable frame.
*/
diff --git a/widget/gtk/WidgetStyleCache.cpp b/widget/gtk/WidgetStyleCache.cpp
index 39b7893df3bd..4c9e8523b5bf 100644
--- a/widget/gtk/WidgetStyleCache.cpp
+++ b/widget/gtk/WidgetStyleCache.cpp
@@ -26,10 +26,14 @@ static GtkStyleContext*
GetCssNodeStyleInternal(WidgetNodeType aNodeType);
static GtkWidget*
-CreateWindowWidget()
+CreateWindowWidget(WidgetNodeType type)
{
GtkWidget *widget = gtk_window_new(GTK_WINDOW_POPUP);
gtk_widget_set_name(widget, "MozillaGtkWidget");
+ if (type == MOZ_GTK_WINDOW_CSD) {
+ GtkStyleContext* style = gtk_widget_get_style_context(widget);
+ gtk_style_context_add_class(style, "csd");
+ }
return widget;
}
@@ -101,7 +105,7 @@ CreateTooltipWidget()
{
MOZ_ASSERT(gtk_check_version(3, 20, 0) != nullptr,
"CreateTooltipWidget should be used for Gtk < 3.20 only.");
- GtkWidget* widget = CreateWindowWidget();
+ GtkWidget* widget = CreateWindowWidget(MOZ_GTK_WINDOW);
GtkStyleContext* style = gtk_widget_get_style_context(widget);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP);
return widget;
@@ -529,11 +533,82 @@ CreateNotebookWidget()
}
static GtkWidget*
+CreateHeaderBar(bool aMaximized)
+{
+ MOZ_ASSERT(gtk_check_version(3, 10, 0) == nullptr,
+ "GtkHeaderBar is only available on GTK 3.10+.");
+ if (gtk_check_version(3, 10, 0) != nullptr)
+ return nullptr;
+
+ static auto sGtkHeaderBarNewPtr = (GtkWidget* (*)())
+ dlsym(RTLD_DEFAULT, "gtk_header_bar_new");
+ static const char* MOZ_GTK_STYLE_CLASS_TITLEBAR = "titlebar";
+
+ GtkWidget* headerbar = sGtkHeaderBarNewPtr();
+ if (aMaximized) {
+ GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+ gtk_widget_set_name(window, "MozillaMaximizedGtkWidget");
+ GtkStyleContext* style = gtk_widget_get_style_context(window);
+ gtk_style_context_add_class(style, "maximized");
+ GtkWidget *fixed = gtk_fixed_new();
+ gtk_container_add(GTK_CONTAINER(window), fixed);
+ gtk_container_add(GTK_CONTAINER(fixed), headerbar);
+ // Save the window container so we don't leak it.
+ sWidgetStorage[MOZ_GTK_WINDOW_MAXIMIZED] = window;
+ } else {
+ AddToWindowContainer(headerbar);
+ }
+
+ // Emulate what create_titlebar() at gtkwindow.c does.
+ GtkStyleContext* style = gtk_widget_get_style_context(headerbar);
+ gtk_style_context_add_class(style, MOZ_GTK_STYLE_CLASS_TITLEBAR);
+ gtk_style_context_add_class(style, "default-decoration");
+
+ return headerbar;
+}
+
+// TODO - Also return style for buttons located at Maximized toolbar.
+static GtkWidget*
+CreateHeaderBarButton(WidgetNodeType aWidgetType)
+{
+ MOZ_ASSERT(gtk_check_version(3, 10, 0) == nullptr,
+ "GtkHeaderBar is only available on GTK 3.10+.");
+
+ if (gtk_check_version(3, 10, 0) != nullptr)
+ return nullptr;
+
+ static const char* MOZ_GTK_STYLE_CLASS_TITLEBUTTON = "titlebutton";
+
+ GtkWidget* widget = gtk_button_new();
+ gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_HEADER_BAR)), widget);
+
+ GtkStyleContext* style = gtk_widget_get_style_context(widget);
+ gtk_style_context_add_class(style, MOZ_GTK_STYLE_CLASS_TITLEBUTTON);
+
+ switch (aWidgetType) {
+ case MOZ_GTK_HEADER_BAR_BUTTON_CLOSE:
+ gtk_style_context_add_class(style, "close");
+ break;
+ case MOZ_GTK_HEADER_BAR_BUTTON_MINIMIZE:
+ gtk_style_context_add_class(style, "minimize");
+ break;
+ case MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE:
+ gtk_style_context_add_class(style, "maximize");
+ break;
+ default:
+ break;
+ }
+
+ return widget;
+}
+
+static GtkWidget*
CreateWidget(WidgetNodeType aWidgetType)
{
switch (aWidgetType) {
case MOZ_GTK_WINDOW:
- return CreateWindowWidget();
+ case MOZ_GTK_WINDOW_CSD:
+ return CreateWindowWidget(aWidgetType);
case MOZ_GTK_WINDOW_CONTAINER:
return CreateWindowContainerWidget();
case MOZ_GTK_CHECKBUTTON_CONTAINER:
@@ -610,6 +685,13 @@ CreateWidget(WidgetNodeType aWidgetType)
return CreateComboBoxEntryButtonWidget();
case MOZ_GTK_COMBOBOX_ENTRY_ARROW:
return CreateComboBoxEntryArrowWidget();
+ case MOZ_GTK_HEADER_BAR:
+ case MOZ_GTK_HEADER_BAR_MAXIMIZED:
+ return CreateHeaderBar(aWidgetType == MOZ_GTK_HEADER_BAR_MAXIMIZED);
+ case MOZ_GTK_HEADER_BAR_BUTTON_CLOSE:
+ case MOZ_GTK_HEADER_BAR_BUTTON_MINIMIZE:
+ case MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE:
+ return CreateHeaderBarButton(aWidgetType);
default:
/* Not implemented */
return nullptr;
@@ -1049,6 +1131,10 @@ GetCssNodeStyleInternal(WidgetNodeType aNodeType)
GtkWidget* widget = GetWidget(MOZ_GTK_NOTEBOOK);
return gtk_widget_get_style_context(widget);
}
+ case MOZ_GTK_WINDOW_DECORATION:
+ style = CreateChildCSSNode("decoration",
+ MOZ_GTK_WINDOW_CSD);
+ break;
default:
return GetWidgetRootStyle(aNodeType);
}
@@ -1214,6 +1300,8 @@ ResetWidgetCache(void)
/* This will destroy all of our widgets */
if (sWidgetStorage[MOZ_GTK_WINDOW])
gtk_widget_destroy(sWidgetStorage[MOZ_GTK_WINDOW]);
+ if (sWidgetStorage[MOZ_GTK_WINDOW_MAXIMIZED])
+ gtk_widget_destroy(sWidgetStorage[MOZ_GTK_WINDOW_MAXIMIZED]);
/* Clear already freed arrays */
mozilla::PodArrayZero(sWidgetStorage);
diff --git a/widget/gtk/gtk3drawing.cpp b/widget/gtk/gtk3drawing.cpp
index 4c562b380095..ee2b8a04f63f 100644
--- a/widget/gtk/gtk3drawing.cpp
+++ b/widget/gtk/gtk3drawing.cpp
@@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
#include "WidgetStyleCache.h" #include "WidgetStyleCache.h"
@ -512,7 +316,7 @@ index 4c562b380095..ee2b8a04f63f 100644
// GetStateFlagsFromGtkWidgetState() can be safely used for the specific // GetStateFlagsFromGtkWidgetState() can be safely used for the specific
// GtkWidgets that set both prelight and active flags. For other widgets, // GtkWidgets that set both prelight and active flags. For other widgets,
// either the GtkStateFlags or Gecko's GtkWidgetState need to be carefully // either the GtkStateFlags or Gecko's GtkWidgetState need to be carefully
@@ -233,6 +250,43 @@ moz_gtk_splitter_get_metrics(gint orientation, gint* size) @@ -233,6 +250,43 @@ moz_gtk_splitter_get_metrics(gint orient
return MOZ_GTK_SUCCESS; return MOZ_GTK_SUCCESS;
} }
@ -556,7 +360,7 @@ index 4c562b380095..ee2b8a04f63f 100644
static gint static gint
moz_gtk_window_paint(cairo_t *cr, GdkRectangle* rect, moz_gtk_window_paint(cairo_t *cr, GdkRectangle* rect,
GtkTextDirection direction) GtkTextDirection direction)
@@ -302,6 +356,24 @@ moz_gtk_button_paint(cairo_t *cr, GdkRectangle* rect, @@ -302,6 +356,24 @@ moz_gtk_button_paint(cairo_t *cr, GdkRec
} }
static gint static gint
@ -581,7 +385,7 @@ index 4c562b380095..ee2b8a04f63f 100644
moz_gtk_toggle_paint(cairo_t *cr, GdkRectangle* rect, moz_gtk_toggle_paint(cairo_t *cr, GdkRectangle* rect,
GtkWidgetState* state, GtkWidgetState* state,
gboolean selected, gboolean inconsistent, gboolean selected, gboolean inconsistent,
@@ -1948,6 +2020,38 @@ moz_gtk_info_bar_paint(cairo_t *cr, GdkRectangle* rect, @@ -1948,6 +2020,38 @@ moz_gtk_info_bar_paint(cairo_t *cr, GdkR
return MOZ_GTK_SUCCESS; return MOZ_GTK_SUCCESS;
} }
@ -620,7 +424,7 @@ index 4c562b380095..ee2b8a04f63f 100644
static void static void
moz_gtk_add_style_margin(GtkStyleContext* style, moz_gtk_add_style_margin(GtkStyleContext* style,
gint* left, gint* top, gint* right, gint* bottom) gint* left, gint* top, gint* right, gint* bottom)
@@ -1999,6 +2103,14 @@ static void moz_gtk_add_margin_border_padding(GtkStyleContext *style, @@ -1999,6 +2103,14 @@ static void moz_gtk_add_margin_border_pa
moz_gtk_add_style_padding(style, left, top, right, bottom); moz_gtk_add_style_padding(style, left, top, right, bottom);
} }
@ -635,7 +439,7 @@ index 4c562b380095..ee2b8a04f63f 100644
static GtkBorder static GtkBorder
GetMarginBorderPadding(GtkStyleContext* aStyle) GetMarginBorderPadding(GtkStyleContext* aStyle)
{ {
@@ -2054,8 +2166,7 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top, @@ -2054,8 +2166,7 @@ moz_gtk_get_widget_border(WidgetNodeType
// XXX: Subtract 1 pixel from the padding to account for the default // XXX: Subtract 1 pixel from the padding to account for the default
// padding in forms.css. See bug 1187385. // padding in forms.css. See bug 1187385.
*left = *top = *right = *bottom = -1; *left = *top = *right = *bottom = -1;
@ -645,7 +449,7 @@ index 4c562b380095..ee2b8a04f63f 100644
return MOZ_GTK_SUCCESS; return MOZ_GTK_SUCCESS;
} }
@@ -2076,10 +2187,8 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top, @@ -2076,10 +2187,8 @@ moz_gtk_get_widget_border(WidgetNodeType
*left = *top = *right = *bottom = *left = *top = *right = *bottom =
gtk_container_get_border_width(GTK_CONTAINER( gtk_container_get_border_width(GTK_CONTAINER(
GetWidget(MOZ_GTK_TREE_HEADER_CELL))); GetWidget(MOZ_GTK_TREE_HEADER_CELL)));
@ -657,7 +461,7 @@ index 4c562b380095..ee2b8a04f63f 100644
return MOZ_GTK_SUCCESS; return MOZ_GTK_SUCCESS;
} }
case MOZ_GTK_TREE_HEADER_SORTARROW: case MOZ_GTK_TREE_HEADER_SORTARROW:
@@ -2105,8 +2214,7 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top, @@ -2105,8 +2214,7 @@ moz_gtk_get_widget_border(WidgetNodeType
gtk_container_get_border_width(GTK_CONTAINER( gtk_container_get_border_width(GTK_CONTAINER(
GetWidget(MOZ_GTK_COMBOBOX_BUTTON))); GetWidget(MOZ_GTK_COMBOBOX_BUTTON)));
style = GetStyleContext(MOZ_GTK_COMBOBOX_BUTTON); style = GetStyleContext(MOZ_GTK_COMBOBOX_BUTTON);
@ -667,7 +471,7 @@ index 4c562b380095..ee2b8a04f63f 100644
/* If there is no separator, don't try to count its width. */ /* If there is no separator, don't try to count its width. */
separator_width = 0; separator_width = 0;
@@ -2160,10 +2268,8 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top, @@ -2160,10 +2268,8 @@ moz_gtk_get_widget_border(WidgetNodeType
style = gtk_widget_get_style_context(w); style = gtk_widget_get_style_context(w);
*left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w)); *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w));
@ -680,7 +484,7 @@ index 4c562b380095..ee2b8a04f63f 100644
return MOZ_GTK_SUCCESS; return MOZ_GTK_SUCCESS;
} }
case MOZ_GTK_MENUPOPUP: case MOZ_GTK_MENUPOPUP:
@@ -2210,6 +2316,21 @@ moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top, @@ -2210,6 +2316,21 @@ moz_gtk_get_widget_border(WidgetNodeType
return MOZ_GTK_SUCCESS; return MOZ_GTK_SUCCESS;
} }
@ -702,7 +506,7 @@ index 4c562b380095..ee2b8a04f63f 100644
/* These widgets have no borders, since they are not containers. */ /* These widgets have no borders, since they are not containers. */
case MOZ_GTK_CHECKBUTTON_LABEL: case MOZ_GTK_CHECKBUTTON_LABEL:
@@ -2646,6 +2767,36 @@ GetScrollbarMetrics(GtkOrientation aOrientation) @@ -2646,6 +2767,36 @@ GetScrollbarMetrics(GtkOrientation aOrie
return metrics; return metrics;
} }
@ -739,7 +543,7 @@ index 4c562b380095..ee2b8a04f63f 100644
/* cairo_t *cr argument has to be a system-cairo. */ /* cairo_t *cr argument has to be a system-cairo. */
gint gint
moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr, moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr,
@@ -2671,6 +2822,14 @@ moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr, @@ -2671,6 +2822,14 @@ moz_gtk_widget_paint(WidgetNodeType widg
GetWidget(MOZ_GTK_BUTTON), GetWidget(MOZ_GTK_BUTTON),
direction); direction);
break; break;
@ -754,7 +558,7 @@ index 4c562b380095..ee2b8a04f63f 100644
case MOZ_GTK_CHECKBUTTON: case MOZ_GTK_CHECKBUTTON:
case MOZ_GTK_RADIOBUTTON: case MOZ_GTK_RADIOBUTTON:
return moz_gtk_toggle_paint(cr, rect, state, return moz_gtk_toggle_paint(cr, rect, state,
@@ -2877,6 +3036,10 @@ moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr, @@ -2877,6 +3036,10 @@ moz_gtk_widget_paint(WidgetNodeType widg
case MOZ_GTK_INFO_BAR: case MOZ_GTK_INFO_BAR:
return moz_gtk_info_bar_paint(cr, rect, state); return moz_gtk_info_bar_paint(cr, rect, state);
break; break;
@ -765,10 +569,9 @@ index 4c562b380095..ee2b8a04f63f 100644
default: default:
g_warning("Unknown widget type: %d", widget); g_warning("Unknown widget type: %d", widget);
} }
diff --git a/widget/gtk/gtkdrawing.h b/widget/gtk/gtkdrawing.h diff -up firefox-57.0b6/widget/gtk/gtkdrawing.h.1399611 firefox-57.0b6/widget/gtk/gtkdrawing.h
index 42dbf8287499..c0a7eba5006a 100644 --- firefox-57.0b6/widget/gtk/gtkdrawing.h.1399611 2017-06-12 18:37:20.000000000 +0200
--- a/widget/gtk/gtkdrawing.h +++ firefox-57.0b6/widget/gtk/gtkdrawing.h 2017-10-09 10:58:19.865078822 +0200
+++ b/widget/gtk/gtkdrawing.h
@@ -268,8 +268,14 @@ typedef enum { @@ -268,8 +268,14 @@ typedef enum {
MOZ_GTK_SPLITTER_SEPARATOR_VERTICAL, MOZ_GTK_SPLITTER_SEPARATOR_VERTICAL,
/* Paints the background of a window, dialog or page. */ /* Paints the background of a window, dialog or page. */
@ -799,7 +602,7 @@ index 42dbf8287499..c0a7eba5006a 100644
MOZ_GTK_WIDGET_NODE_COUNT MOZ_GTK_WIDGET_NODE_COUNT
} WidgetNodeType; } WidgetNodeType;
@@ -542,6 +556,32 @@ gint moz_gtk_get_menu_separator_height(gint* size); @@ -542,6 +556,32 @@ gint moz_gtk_get_menu_separator_height(g
*/ */
gint moz_gtk_splitter_get_metrics(gint orientation, gint* size); gint moz_gtk_splitter_get_metrics(gint orientation, gint* size);
@ -832,10 +635,9 @@ index 42dbf8287499..c0a7eba5006a 100644
/** /**
* Get the YTHICKNESS of a tab (notebook extension). * Get the YTHICKNESS of a tab (notebook extension).
*/ */
diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c diff -up firefox-57.0b6/widget/gtk/mozgtk/mozgtk.c.1399611 firefox-57.0b6/widget/gtk/mozgtk/mozgtk.c
index 7285b7f001ac..6e554c7f628e 100644 --- firefox-57.0b6/widget/gtk/mozgtk/mozgtk.c.1399611 2017-10-09 10:58:19.861078836 +0200
--- a/widget/gtk/mozgtk/mozgtk.c +++ firefox-57.0b6/widget/gtk/mozgtk/mozgtk.c 2017-10-09 10:58:19.865078822 +0200
+++ b/widget/gtk/mozgtk/mozgtk.c
@@ -580,6 +580,8 @@ STUB(gtk_style_context_set_state) @@ -580,6 +580,8 @@ STUB(gtk_style_context_set_state)
STUB(gtk_style_properties_lookup_property) STUB(gtk_style_properties_lookup_property)
STUB(gtk_tree_view_column_get_button) STUB(gtk_tree_view_column_get_button)
@ -864,11 +666,10 @@ index 7285b7f001ac..6e554c7f628e 100644
#endif #endif
#ifdef GTK2_SYMBOLS #ifdef GTK2_SYMBOLS
diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp diff -up firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp.1399611 firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp
index e02bf10fe87f..a5950ac35799 100644 --- firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp.1399611 2017-09-21 06:10:10.000000000 +0200
--- a/widget/gtk/nsLookAndFeel.cpp +++ firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp 2017-10-09 10:58:19.865078822 +0200
+++ b/widget/gtk/nsLookAndFeel.cpp @@ -642,6 +642,22 @@ nsLookAndFeel::GetIntImpl(IntID aID, int
@@ -642,6 +642,22 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
case eIntID_ContextMenuOffsetHorizontal: case eIntID_ContextMenuOffsetHorizontal:
aResult = 2; aResult = 2;
break; break;
@ -932,10 +733,9 @@ index e02bf10fe87f..a5950ac35799 100644
} }
// virtual // virtual
diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h diff -up firefox-57.0b6/widget/gtk/nsLookAndFeel.h.1399611 firefox-57.0b6/widget/gtk/nsLookAndFeel.h
index 177d069f6567..6e14236e604a 100644 --- firefox-57.0b6/widget/gtk/nsLookAndFeel.h.1399611 2017-09-21 06:10:10.000000000 +0200
--- a/widget/gtk/nsLookAndFeel.h +++ firefox-57.0b6/widget/gtk/nsLookAndFeel.h 2017-10-09 10:58:19.865078822 +0200
+++ b/widget/gtk/nsLookAndFeel.h
@@ -32,6 +32,8 @@ public: @@ -32,6 +32,8 @@ public:
virtual char16_t GetPasswordCharacterImpl(); virtual char16_t GetPasswordCharacterImpl();
virtual bool GetEchoPasswordImpl(); virtual bool GetEchoPasswordImpl();
@ -956,10 +756,9 @@ index 177d069f6567..6e14236e604a 100644
bool mInitialized; bool mInitialized;
void EnsureInit(); void EnsureInit();
diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp diff -up firefox-57.0b6/widget/gtk/nsNativeThemeGTK.cpp.1399611 firefox-57.0b6/widget/gtk/nsNativeThemeGTK.cpp
index 211790096a3e..6ed35b97a0d7 100644 --- firefox-57.0b6/widget/gtk/nsNativeThemeGTK.cpp.1399611 2017-09-19 06:18:28.000000000 +0200
--- a/widget/gtk/nsNativeThemeGTK.cpp +++ firefox-57.0b6/widget/gtk/nsNativeThemeGTK.cpp 2017-10-09 10:58:19.865078822 +0200
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -23,6 +23,7 @@ @@ -23,6 +23,7 @@
#include "nsIDOMHTMLInputElement.h" #include "nsIDOMHTMLInputElement.h"
#include "nsGkAtoms.h" #include "nsGkAtoms.h"
@ -968,7 +767,7 @@ index 211790096a3e..6ed35b97a0d7 100644
#include "mozilla/EventStates.h" #include "mozilla/EventStates.h"
#include "mozilla/Services.h" #include "mozilla/Services.h"
@@ -703,6 +704,24 @@ nsNativeThemeGTK::GetGtkWidgetAndState(uint8_t aWidgetType, nsIFrame* aFrame, @@ -703,6 +704,24 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
case NS_THEME_GTK_INFO_BAR: case NS_THEME_GTK_INFO_BAR:
aGtkWidgetType = MOZ_GTK_INFO_BAR; aGtkWidgetType = MOZ_GTK_INFO_BAR;
break; break;
@ -993,7 +792,7 @@ index 211790096a3e..6ed35b97a0d7 100644
default: default:
return false; return false;
} }
@@ -1627,6 +1646,10 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext, @@ -1627,6 +1646,10 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n
case NS_THEME_MENULIST: case NS_THEME_MENULIST:
case NS_THEME_TOOLBARBUTTON: case NS_THEME_TOOLBARBUTTON:
case NS_THEME_TREEHEADERCELL: case NS_THEME_TREEHEADERCELL:
@ -1004,7 +803,7 @@ index 211790096a3e..6ed35b97a0d7 100644
{ {
if (aWidgetType == NS_THEME_MENULIST) { if (aWidgetType == NS_THEME_MENULIST) {
// Include the arrow size. // Include the arrow size.
@@ -1892,9 +1915,21 @@ nsNativeThemeGTK::ThemeSupportsWidget(nsPresContext* aPresContext, @@ -1892,9 +1915,21 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
case NS_THEME_DIALOG: case NS_THEME_DIALOG:
#if (MOZ_WIDGET_GTK == 3) #if (MOZ_WIDGET_GTK == 3)
case NS_THEME_GTK_INFO_BAR: case NS_THEME_GTK_INFO_BAR:
@ -1026,7 +825,7 @@ index 211790096a3e..6ed35b97a0d7 100644
case NS_THEME_MENULIST_BUTTON: case NS_THEME_MENULIST_BUTTON:
if (aFrame && aFrame->GetWritingMode().IsVertical()) { if (aFrame && aFrame->GetWritingMode().IsVertical()) {
return false; return false;
@@ -1978,6 +2013,13 @@ nsNativeThemeGTK::GetWidgetTransparency(nsIFrame* aFrame, uint8_t aWidgetType) @@ -1978,6 +2013,13 @@ nsNativeThemeGTK::GetWidgetTransparency(
#else #else
return eTransparent; return eTransparent;
#endif #endif
@ -1040,10 +839,9 @@ index 211790096a3e..6ed35b97a0d7 100644
} }
return eUnknownTransparency; return eUnknownTransparency;
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp diff -up firefox-57.0b6/widget/gtk/nsWindow.cpp.1399611 firefox-57.0b6/widget/gtk/nsWindow.cpp
index 37b6aae4c3d0..f0c3343f20ae 100644 --- firefox-57.0b6/widget/gtk/nsWindow.cpp.1399611 2017-10-09 10:58:19.858078848 +0200
--- a/widget/gtk/nsWindow.cpp +++ firefox-57.0b6/widget/gtk/nsWindow.cpp 2017-10-09 10:58:19.866078818 +0200
+++ b/widget/gtk/nsWindow.cpp
@@ -85,6 +85,7 @@ @@ -85,6 +85,7 @@
#include "nsIPropertyBag2.h" #include "nsIPropertyBag2.h"
#include "GLContext.h" #include "GLContext.h"
@ -1061,7 +859,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
using namespace mozilla; using namespace mozilla;
using namespace mozilla::gfx; using namespace mozilla::gfx;
using namespace mozilla::widget; using namespace mozilla::widget;
@@ -185,6 +188,8 @@ static gboolean expose_event_cb (GtkWidget *widget, @@ -186,6 +189,8 @@ static gboolean expose_event_cb
#else #else
static gboolean expose_event_cb (GtkWidget *widget, static gboolean expose_event_cb (GtkWidget *widget,
cairo_t *rect); cairo_t *rect);
@ -1070,7 +868,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
#endif #endif
static gboolean configure_event_cb (GtkWidget *widget, static gboolean configure_event_cb (GtkWidget *widget,
GdkEventConfigure *event); GdkEventConfigure *event);
@@ -230,7 +235,6 @@ static void screen_composited_changed_cb (GdkScreen* screen, @@ -231,7 +236,6 @@ static void screen_composited_change
gpointer user_data); gpointer user_data);
static void widget_composited_changed_cb (GtkWidget* widget, static void widget_composited_changed_cb (GtkWidget* widget,
gpointer user_data); gpointer user_data);
@ -1078,7 +876,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
#if (MOZ_WIDGET_GTK == 3) #if (MOZ_WIDGET_GTK == 3)
static void scale_changed_cb (GtkWidget* widget, static void scale_changed_cb (GtkWidget* widget,
GParamSpec* aPSpec, GParamSpec* aPSpec,
@@ -439,6 +443,7 @@ nsWindow::nsWindow() @@ -440,6 +444,7 @@ nsWindow::nsWindow()
mContainer = nullptr; mContainer = nullptr;
mGdkWindow = nullptr; mGdkWindow = nullptr;
@ -1086,7 +884,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
mShell = nullptr; mShell = nullptr;
mCompositorWidgetDelegate = nullptr; mCompositorWidgetDelegate = nullptr;
mHasMappedToplevel = false; mHasMappedToplevel = false;
@@ -480,6 +485,9 @@ nsWindow::nsWindow() @@ -481,6 +486,9 @@ nsWindow::nsWindow()
mLastScrollEventTime = GDK_CURRENT_TIME; mLastScrollEventTime = GDK_CURRENT_TIME;
#endif #endif
mPendingConfigures = 0; mPendingConfigures = 0;
@ -1096,7 +894,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
} }
nsWindow::~nsWindow() nsWindow::~nsWindow()
@@ -1478,8 +1486,8 @@ LayoutDeviceIntRect @@ -1479,8 +1487,8 @@ LayoutDeviceIntRect
nsWindow::GetScreenBounds() nsWindow::GetScreenBounds()
{ {
LayoutDeviceIntRect rect; LayoutDeviceIntRect rect;
@ -1107,7 +905,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gint x, y; gint x, y;
gdk_window_get_root_origin(gtk_widget_get_window(GTK_WIDGET(mContainer)), &x, &y); gdk_window_get_root_origin(gtk_widget_get_window(GTK_WIDGET(mContainer)), &x, &y);
rect.MoveTo(GdkPointToDevicePixels({ x, y })); rect.MoveTo(GdkPointToDevicePixels({ x, y }));
@@ -1605,6 +1613,10 @@ nsWindow::SetCursor(nsCursor aCursor) @@ -1606,6 +1614,10 @@ nsWindow::SetCursor(nsCursor aCursor)
return; return;
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(mContainer)), newCursor); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(mContainer)), newCursor);
@ -1118,7 +916,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
} }
} }
} }
@@ -1661,6 +1673,10 @@ nsWindow::SetCursor(imgIContainer* aCursor, @@ -1662,6 +1674,10 @@ nsWindow::SetCursor(imgIContainer* aCurs
if (cursor) { if (cursor) {
if (mContainer) { if (mContainer) {
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(mContainer)), cursor); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(mContainer)), cursor);
@ -1129,7 +927,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
rv = NS_OK; rv = NS_OK;
} }
#if (MOZ_WIDGET_GTK == 3) #if (MOZ_WIDGET_GTK == 3)
@@ -2175,6 +2191,12 @@ nsWindow::OnExposeEvent(cairo_t *cr) @@ -2176,6 +2192,12 @@ nsWindow::OnExposeEvent(cairo_t *cr)
return TRUE; return TRUE;
} }
@ -1142,7 +940,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
// If this widget uses OMTC... // If this widget uses OMTC...
if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT || if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT ||
GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR) { GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR) {
@@ -2585,6 +2607,53 @@ nsWindow::OnMotionNotifyEvent(GdkEventMotion *aEvent) @@ -2586,6 +2608,53 @@ nsWindow::OnMotionNotifyEvent(GdkEventMo
} }
} }
#endif /* MOZ_X11 */ #endif /* MOZ_X11 */
@ -1196,7 +994,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
WidgetMouseEvent event(true, eMouseMove, this, WidgetMouseEvent::eReal); WidgetMouseEvent event(true, eMouseMove, this, WidgetMouseEvent::eReal);
@@ -2755,6 +2824,20 @@ nsWindow::OnButtonPressEvent(GdkEventButton *aEvent) @@ -2756,6 +2825,20 @@ nsWindow::OnButtonPressEvent(GdkEventBut
if (CheckForRollup(aEvent->x_root, aEvent->y_root, false, false)) if (CheckForRollup(aEvent->x_root, aEvent->y_root, false, false))
return; return;
@ -1217,7 +1015,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gdouble pressure = 0; gdouble pressure = 0;
gdk_event_get_axis ((GdkEvent*)aEvent, GDK_AXIS_PRESSURE, &pressure); gdk_event_get_axis ((GdkEvent*)aEvent, GDK_AXIS_PRESSURE, &pressure);
mLastMotionPressure = pressure; mLastMotionPressure = pressure;
@@ -3340,6 +3423,8 @@ nsWindow::OnWindowStateEvent(GtkWidget *aWidget, GdkEventWindowState *aEvent) @@ -3341,6 +3424,8 @@ nsWindow::OnWindowStateEvent(GtkWidget *
#endif //ACCESSIBILITY #endif //ACCESSIBILITY
} }
@ -1226,7 +1024,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (mWidgetListener) { if (mWidgetListener) {
mWidgetListener->SizeModeChanged(mSizeState); mWidgetListener->SizeModeChanged(mSizeState);
if (aEvent->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { if (aEvent->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
@@ -3404,6 +3489,7 @@ nsWindow::OnCompositedChanged() @@ -3405,6 +3490,7 @@ nsWindow::OnCompositedChanged()
presShell->ThemeChanged(); presShell->ThemeChanged();
} }
} }
@ -1234,7 +1032,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
} }
void void
@@ -3592,7 +3678,8 @@ nsWindow::Create(nsIWidget* aParent, @@ -3593,7 +3679,8 @@ nsWindow::Create(nsIWidget* aParent,
GtkWindow *topLevelParent = nullptr; GtkWindow *topLevelParent = nullptr;
nsWindow *parentnsWindow = nullptr; nsWindow *parentnsWindow = nullptr;
GtkWidget *eventWidget = nullptr; GtkWidget *eventWidget = nullptr;
@ -1244,7 +1042,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (aParent) { if (aParent) {
parentnsWindow = static_cast<nsWindow*>(aParent); parentnsWindow = static_cast<nsWindow*>(aParent);
@@ -3639,29 +3726,47 @@ nsWindow::Create(nsIWidget* aParent, @@ -3640,29 +3727,47 @@ nsWindow::Create(nsIWidget* aParent,
GTK_WINDOW_TOPLEVEL : GTK_WINDOW_POPUP; GTK_WINDOW_TOPLEVEL : GTK_WINDOW_POPUP;
mShell = gtk_window_new(type); mShell = gtk_window_new(type);
@ -1303,7 +1101,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
} }
// We only move a general managed toplevel window if someone has // We only move a general managed toplevel window if someone has
@@ -3755,24 +3860,56 @@ nsWindow::Create(nsIWidget* aParent, @@ -3756,24 +3861,56 @@ nsWindow::Create(nsIWidget* aParent,
mContainer = MOZ_CONTAINER(container); mContainer = MOZ_CONTAINER(container);
#if (MOZ_WIDGET_GTK == 3) #if (MOZ_WIDGET_GTK == 3)
@ -1321,6 +1119,9 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
- gtk_widget_set_has_window(container, FALSE); - gtk_widget_set_has_window(container, FALSE);
- // Prevent GtkWindow from painting a background to flicker. - // Prevent GtkWindow from painting a background to flicker.
- gtk_widget_set_app_paintable(mShell, TRUE); - gtk_widget_set_app_paintable(mShell, TRUE);
- }
- // Set up event widget
- eventWidget = shellHasCSD ? container : mShell;
+ /* There are tree possible situations here: + /* There are tree possible situations here:
+ * + *
+ * 1) We're running on Gtk+ < 3.20 without any decorations. Content + * 1) We're running on Gtk+ < 3.20 without any decorations. Content
@ -1349,9 +1150,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
+ +
+ GtkStyleContext* style = gtk_widget_get_style_context(mShell); + GtkStyleContext* style = gtk_widget_get_style_context(mShell);
+ drawToContainer = gtk_style_context_has_class(style, "csd"); + drawToContainer = gtk_style_context_has_class(style, "csd");
} + }
- // Set up event widget
- eventWidget = shellHasCSD ? container : mShell;
+#endif +#endif
+ drawWidget = (drawToContainer) ? container : mShell; + drawWidget = (drawToContainer) ? container : mShell;
+ // When we draw decorations on our own we need to handle resize events + // When we draw decorations on our own we need to handle resize events
@ -1376,7 +1175,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gtk_container_add(GTK_CONTAINER(mShell), container); gtk_container_add(GTK_CONTAINER(mShell), container);
gtk_widget_realize(container); gtk_widget_realize(container);
@@ -3782,7 +3919,7 @@ nsWindow::Create(nsIWidget* aParent, @@ -3783,7 +3920,7 @@ nsWindow::Create(nsIWidget* aParent,
gtk_widget_grab_focus(container); gtk_widget_grab_focus(container);
// the drawing window // the drawing window
@ -1385,7 +1184,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (mWindowType == eWindowType_popup) { if (mWindowType == eWindowType_popup) {
// gdk does not automatically set the cursor for "temporary" // gdk does not automatically set the cursor for "temporary"
@@ -3855,6 +3992,11 @@ nsWindow::Create(nsIWidget* aParent, @@ -3856,6 +3993,11 @@ nsWindow::Create(nsIWidget* aParent,
// label the drawing window with this object so we can find our way home // label the drawing window with this object so we can find our way home
g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this); g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this);
@ -1397,7 +1196,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (mContainer) if (mContainer)
g_object_set_data(G_OBJECT(mContainer), "nsWindow", this); g_object_set_data(G_OBJECT(mContainer), "nsWindow", this);
@@ -3892,6 +4034,10 @@ nsWindow::Create(nsIWidget* aParent, @@ -3893,6 +4035,10 @@ nsWindow::Create(nsIWidget* aParent,
g_signal_connect_after(default_settings, g_signal_connect_after(default_settings,
"notify::gtk-font-name", "notify::gtk-font-name",
G_CALLBACK(theme_changed_cb), this); G_CALLBACK(theme_changed_cb), this);
@ -1408,7 +1207,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
} }
if (mContainer) { if (mContainer) {
@@ -3942,7 +4088,7 @@ nsWindow::Create(nsIWidget* aParent, @@ -3943,7 +4089,7 @@ nsWindow::Create(nsIWidget* aParent,
G_CALLBACK(drag_data_received_event_cb), nullptr); G_CALLBACK(drag_data_received_event_cb), nullptr);
GtkWidget *widgets[] = { GTK_WIDGET(mContainer), GtkWidget *widgets[] = { GTK_WIDGET(mContainer),
@ -1417,7 +1216,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
for (size_t i = 0; i < ArrayLength(widgets) && widgets[i]; ++i) { for (size_t i = 0; i < ArrayLength(widgets) && widgets[i]; ++i) {
// Visibility events are sent to the owning widget of the relevant // Visibility events are sent to the owning widget of the relevant
// window but do not propagate to parent widgets so connect on // window but do not propagate to parent widgets so connect on
@@ -3972,7 +4118,6 @@ nsWindow::Create(nsIWidget* aParent, @@ -3973,7 +4119,6 @@ nsWindow::Create(nsIWidget* aParent,
// Don't let GTK mess with the shapes of our GdkWindows // Don't let GTK mess with the shapes of our GdkWindows
GTK_PRIVATE_SET_FLAG(eventWidget, GTK_HAS_SHAPE_MASK); GTK_PRIVATE_SET_FLAG(eventWidget, GTK_HAS_SHAPE_MASK);
#endif #endif
@ -1425,7 +1224,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
// These events are sent to the owning widget of the relevant window // These events are sent to the owning widget of the relevant window
// and propagate up to the first widget that handles the events, so we // and propagate up to the first widget that handles the events, so we
// need only connect on mShell, if it exists, to catch events on its // need only connect on mShell, if it exists, to catch events on its
@@ -4109,6 +4254,12 @@ nsWindow::NativeResize() @@ -4110,6 +4255,12 @@ nsWindow::NativeResize()
size.width, size.height)); size.width, size.height));
if (mIsTopLevel) { if (mIsTopLevel) {
@ -1438,7 +1237,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gtk_window_resize(GTK_WINDOW(mShell), size.width, size.height); gtk_window_resize(GTK_WINDOW(mShell), size.width, size.height);
} }
else if (mContainer) { else if (mContainer) {
@@ -4165,6 +4316,11 @@ nsWindow::NativeMoveResize() @@ -4166,6 +4317,11 @@ nsWindow::NativeMoveResize()
if (mIsTopLevel) { if (mIsTopLevel) {
// x and y give the position of the window manager frame top-left. // x and y give the position of the window manager frame top-left.
gtk_window_move(GTK_WINDOW(mShell), topLeft.x, topLeft.y); gtk_window_move(GTK_WINDOW(mShell), topLeft.x, topLeft.y);
@ -1450,7 +1249,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
// This sets the client window size. // This sets the client window size.
gtk_window_resize(GTK_WINDOW(mShell), size.width, size.height); gtk_window_resize(GTK_WINDOW(mShell), size.width, size.height);
} }
@@ -5523,6 +5679,33 @@ expose_event_cb(GtkWidget *widget, cairo_t *cr) @@ -5524,6 +5680,33 @@ expose_event_cb(GtkWidget *widget, cairo
return FALSE; return FALSE;
} }
@ -1484,7 +1283,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
#endif //MOZ_WIDGET_GTK == 2 #endif //MOZ_WIDGET_GTK == 2
static gboolean static gboolean
@@ -6575,6 +6758,28 @@ nsWindow::ClearCachedResources() @@ -6576,6 +6759,28 @@ nsWindow::ClearCachedResources()
} }
} }
@ -1513,7 +1312,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gint gint
nsWindow::GdkScaleFactor() nsWindow::GdkScaleFactor()
{ {
@@ -6845,6 +7050,157 @@ nsWindow::SynthesizeNativeTouchPoint(uint32_t aPointerId, @@ -6846,6 +7051,157 @@ nsWindow::SynthesizeNativeTouchPoint(uin
} }
#endif #endif
@ -1671,10 +1470,9 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
int32_t int32_t
nsWindow::RoundsWidgetCoordinatesTo() nsWindow::RoundsWidgetCoordinatesTo()
{ {
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h diff -up firefox-57.0b6/widget/gtk/nsWindow.h.1399611 firefox-57.0b6/widget/gtk/nsWindow.h
index f7c07d57491b..d9a07316a52c 100644 --- firefox-57.0b6/widget/gtk/nsWindow.h.1399611 2017-09-15 06:15:40.000000000 +0200
--- a/widget/gtk/nsWindow.h +++ firefox-57.0b6/widget/gtk/nsWindow.h 2017-10-09 10:58:19.867078814 +0200
+++ b/widget/gtk/nsWindow.h
@@ -123,6 +123,7 @@ public: @@ -123,6 +123,7 @@ public:
double aHeight, double aHeight,
bool aRepaint) override; bool aRepaint) override;
@ -1764,3 +1562,183 @@ index f7c07d57491b..d9a07316a52c 100644
}; };
#endif /* __nsWindow_h__ */ #endif /* __nsWindow_h__ */
diff -up firefox-57.0b6/widget/gtk/WidgetStyleCache.cpp.1399611 firefox-57.0b6/widget/gtk/WidgetStyleCache.cpp
--- firefox-57.0b6/widget/gtk/WidgetStyleCache.cpp.1399611 2017-09-15 06:15:40.000000000 +0200
+++ firefox-57.0b6/widget/gtk/WidgetStyleCache.cpp 2017-10-09 10:58:19.864078825 +0200
@@ -26,10 +26,14 @@ static GtkStyleContext*
GetCssNodeStyleInternal(WidgetNodeType aNodeType);
static GtkWidget*
-CreateWindowWidget()
+CreateWindowWidget(WidgetNodeType type)
{
GtkWidget *widget = gtk_window_new(GTK_WINDOW_POPUP);
gtk_widget_set_name(widget, "MozillaGtkWidget");
+ if (type == MOZ_GTK_WINDOW_CSD) {
+ GtkStyleContext* style = gtk_widget_get_style_context(widget);
+ gtk_style_context_add_class(style, "csd");
+ }
return widget;
}
@@ -101,7 +105,7 @@ CreateTooltipWidget()
{
MOZ_ASSERT(gtk_check_version(3, 20, 0) != nullptr,
"CreateTooltipWidget should be used for Gtk < 3.20 only.");
- GtkWidget* widget = CreateWindowWidget();
+ GtkWidget* widget = CreateWindowWidget(MOZ_GTK_WINDOW);
GtkStyleContext* style = gtk_widget_get_style_context(widget);
gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP);
return widget;
@@ -529,11 +533,82 @@ CreateNotebookWidget()
}
static GtkWidget*
+CreateHeaderBar(bool aMaximized)
+{
+ MOZ_ASSERT(gtk_check_version(3, 10, 0) == nullptr,
+ "GtkHeaderBar is only available on GTK 3.10+.");
+ if (gtk_check_version(3, 10, 0) != nullptr)
+ return nullptr;
+
+ static auto sGtkHeaderBarNewPtr = (GtkWidget* (*)())
+ dlsym(RTLD_DEFAULT, "gtk_header_bar_new");
+ static const char* MOZ_GTK_STYLE_CLASS_TITLEBAR = "titlebar";
+
+ GtkWidget* headerbar = sGtkHeaderBarNewPtr();
+ if (aMaximized) {
+ GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+ gtk_widget_set_name(window, "MozillaMaximizedGtkWidget");
+ GtkStyleContext* style = gtk_widget_get_style_context(window);
+ gtk_style_context_add_class(style, "maximized");
+ GtkWidget *fixed = gtk_fixed_new();
+ gtk_container_add(GTK_CONTAINER(window), fixed);
+ gtk_container_add(GTK_CONTAINER(fixed), headerbar);
+ // Save the window container so we don't leak it.
+ sWidgetStorage[MOZ_GTK_WINDOW_MAXIMIZED] = window;
+ } else {
+ AddToWindowContainer(headerbar);
+ }
+
+ // Emulate what create_titlebar() at gtkwindow.c does.
+ GtkStyleContext* style = gtk_widget_get_style_context(headerbar);
+ gtk_style_context_add_class(style, MOZ_GTK_STYLE_CLASS_TITLEBAR);
+ gtk_style_context_add_class(style, "default-decoration");
+
+ return headerbar;
+}
+
+// TODO - Also return style for buttons located at Maximized toolbar.
+static GtkWidget*
+CreateHeaderBarButton(WidgetNodeType aWidgetType)
+{
+ MOZ_ASSERT(gtk_check_version(3, 10, 0) == nullptr,
+ "GtkHeaderBar is only available on GTK 3.10+.");
+
+ if (gtk_check_version(3, 10, 0) != nullptr)
+ return nullptr;
+
+ static const char* MOZ_GTK_STYLE_CLASS_TITLEBUTTON = "titlebutton";
+
+ GtkWidget* widget = gtk_button_new();
+ gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_HEADER_BAR)), widget);
+
+ GtkStyleContext* style = gtk_widget_get_style_context(widget);
+ gtk_style_context_add_class(style, MOZ_GTK_STYLE_CLASS_TITLEBUTTON);
+
+ switch (aWidgetType) {
+ case MOZ_GTK_HEADER_BAR_BUTTON_CLOSE:
+ gtk_style_context_add_class(style, "close");
+ break;
+ case MOZ_GTK_HEADER_BAR_BUTTON_MINIMIZE:
+ gtk_style_context_add_class(style, "minimize");
+ break;
+ case MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE:
+ gtk_style_context_add_class(style, "maximize");
+ break;
+ default:
+ break;
+ }
+
+ return widget;
+}
+
+static GtkWidget*
CreateWidget(WidgetNodeType aWidgetType)
{
switch (aWidgetType) {
case MOZ_GTK_WINDOW:
- return CreateWindowWidget();
+ case MOZ_GTK_WINDOW_CSD:
+ return CreateWindowWidget(aWidgetType);
case MOZ_GTK_WINDOW_CONTAINER:
return CreateWindowContainerWidget();
case MOZ_GTK_CHECKBUTTON_CONTAINER:
@@ -610,6 +685,13 @@ CreateWidget(WidgetNodeType aWidgetType)
return CreateComboBoxEntryButtonWidget();
case MOZ_GTK_COMBOBOX_ENTRY_ARROW:
return CreateComboBoxEntryArrowWidget();
+ case MOZ_GTK_HEADER_BAR:
+ case MOZ_GTK_HEADER_BAR_MAXIMIZED:
+ return CreateHeaderBar(aWidgetType == MOZ_GTK_HEADER_BAR_MAXIMIZED);
+ case MOZ_GTK_HEADER_BAR_BUTTON_CLOSE:
+ case MOZ_GTK_HEADER_BAR_BUTTON_MINIMIZE:
+ case MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE:
+ return CreateHeaderBarButton(aWidgetType);
default:
/* Not implemented */
return nullptr;
@@ -1049,6 +1131,10 @@ GetCssNodeStyleInternal(WidgetNodeType a
GtkWidget* widget = GetWidget(MOZ_GTK_NOTEBOOK);
return gtk_widget_get_style_context(widget);
}
+ case MOZ_GTK_WINDOW_DECORATION:
+ style = CreateChildCSSNode("decoration",
+ MOZ_GTK_WINDOW_CSD);
+ break;
default:
return GetWidgetRootStyle(aNodeType);
}
@@ -1214,6 +1300,8 @@ ResetWidgetCache(void)
/* This will destroy all of our widgets */
if (sWidgetStorage[MOZ_GTK_WINDOW])
gtk_widget_destroy(sWidgetStorage[MOZ_GTK_WINDOW]);
+ if (sWidgetStorage[MOZ_GTK_WINDOW_MAXIMIZED])
+ gtk_widget_destroy(sWidgetStorage[MOZ_GTK_WINDOW_MAXIMIZED]);
/* Clear already freed arrays */
mozilla::PodArrayZero(sWidgetStorage);
diff -up firefox-57.0b6/widget/LookAndFeel.h.1399611 firefox-57.0b6/widget/LookAndFeel.h
--- firefox-57.0b6/widget/LookAndFeel.h.1399611 2017-09-16 18:22:54.000000000 +0200
+++ firefox-57.0b6/widget/LookAndFeel.h 2017-10-09 10:58:19.864078825 +0200
@@ -405,6 +405,30 @@ public:
eIntID_PhysicalHomeButton,
/*
+ * A boolean value indicating whether client-side decorations are
+ * supported by the user's GTK version.
+ */
+ eIntID_GTKCSDAvailable,
+
+ /*
+ * A boolean value indicating whether client-side decorations should
+ * contain a minimize button.
+ */
+ eIntID_GTKCSDMinimizeButton,
+
+ /*
+ * A boolean value indicating whether client-side decorations should
+ * contain a maximize button.
+ */
+ eIntID_GTKCSDMaximizeButton,
+
+ /*
+ * A boolean value indicating whether client-side decorations should
+ * contain a close button.
+ */
+ eIntID_GTKCSDCloseButton,
+
+ /*
* Controls whether overlay scrollbars display when the user moves
* the mouse in a scrollable frame.
*/