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
index de61ac442b74..be15873ee2c4 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -455,11 +455,7 @@ pref("browser.tabs.loadDivertedInBackground", false);
diff -up firefox-57.0b6/browser/app/profile/firefox.js.1399611 firefox-57.0b6/browser/app/profile/firefox.js
--- firefox-57.0b6/browser/app/profile/firefox.js.1399611 2017-10-09 10:58:19.851078873 +0200
+++ firefox-57.0b6/browser/app/profile/firefox.js 2017-10-09 10:58:19.862078833 +0200
@@ -456,11 +456,7 @@ pref("browser.tabs.loadDivertedInBackgro
pref("browser.tabs.loadBookmarksInBackground", false);
pref("browser.tabs.loadBookmarksInTabs", false);
pref("browser.tabs.tabClipWidth", 140);
@ -14,10 +13,9 @@ index de61ac442b74..be15873ee2c4 100644
// Offer additional drag space to the user. The drag space
// 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
index d9509029bbf1..b56f81c0c138 100644
--- 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
--- firefox-57.0b6/browser/base/content/browser-tabsintitlebar.js.1399611 2017-10-02 22:17:19.000000000 +0200
+++ firefox-57.0b6/browser/base/content/browser-tabsintitlebar.js 2017-10-09 10:58:19.862078833 +0200
@@ -14,6 +14,11 @@ var TabsInTitlebar = {
this._readPref();
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
// from the active to the inactive state. We can't, however, rely on
// DOMMenuBarInactive, because the menu fires this event and then removes
diff --git a/browser/base/moz.build b/browser/base/moz.build
index a2bd4bcb4eca..f14553e4ba7f 100644
--- a/browser/base/moz.build
+++ b/browser/base/moz.build
@@ -56,7 +56,7 @@ DEFINES['APP_LICENSE_BLOCK'] = '%s/content/overrides/app-license.html' % SRCDIR
diff -up firefox-57.0b6/browser/base/moz.build.1399611 firefox-57.0b6/browser/base/moz.build
--- firefox-57.0b6/browser/base/moz.build.1399611 2017-09-29 18:16:45.000000000 +0200
+++ firefox-57.0b6/browser/base/moz.build 2017-10-09 10:58:19.862078833 +0200
@@ -57,7 +57,7 @@ DEFINES['APP_LICENSE_BLOCK'] = '%s/conte
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3', 'cocoa'):
DEFINES['CONTEXT_COPY_IMAGE_CONTENTS'] = 1
@ -43,16 +40,12 @@ index a2bd4bcb4eca..f14553e4ba7f 100644
DEFINES['CAN_DRAW_IN_TITLEBAR'] = 1
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'):
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
index 65a3f0cca7b1..7bb448da620b 100644
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -557,8 +557,12 @@ html|span.ac-emphasize-text-url {
color: -moz-menubartext;
}
diff -up firefox-57.0b6/browser/themes/linux/browser.css.1399611 firefox-57.0b6/browser/themes/linux/browser.css
--- firefox-57.0b6/browser/themes/linux/browser.css.1399611 2017-10-05 06:17:37.000000000 +0200
+++ firefox-57.0b6/browser/themes/linux/browser.css 2017-10-09 11:07:21.604073376 +0200
@@ -556,7 +556,9 @@ html|span.ac-emphasize-text-url {
+/* Support dragging the window using the toolbar when drawing our own
+ * decorations, or where the GTK theme allows. */
#nav-bar,
#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),
@ -61,7 +54,7 @@ index 65a3f0cca7b1..7bb448da620b 100644
-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"]) {
padding: 3px;
}
@ -147,10 +140,9 @@ index 65a3f0cca7b1..7bb448da620b 100644
+ }
+ }
+}
diff --git a/dom/base/nsGkAtomList.h b/dom/base/nsGkAtomList.h
index 5d5ec3d405c9..bb2f652c41e0 100644
--- 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
--- firefox-57.0b6/dom/base/nsGkAtomList.h.1399611 2017-09-15 06:15:41.000000000 +0200
+++ firefox-57.0b6/dom/base/nsGkAtomList.h 2017-10-09 10:58:19.863078829 +0200
@@ -2270,6 +2270,10 @@ GK_ATOM(touch_enabled, "touch-enabled")
GK_ATOM(menubar_drag, "menubar-drag")
GK_ATOM(swipe_animation_enabled, "swipe-animation-enabled")
@ -162,7 +154,7 @@ index 5d5ec3d405c9..bb2f652c41e0 100644
// windows theme selector metrics
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_swipe_animation_enabled, "-moz-swipe-animation-enabled")
GK_ATOM(_moz_physical_home_button, "-moz-physical-home-button")
@ -173,10 +165,9 @@ index 5d5ec3d405c9..bb2f652c41e0 100644
// application commands
GK_ATOM(Back, "Back")
diff --git a/gfx/src/nsThemeConstants.h b/gfx/src/nsThemeConstants.h
index d0ced405095d..1cd2361a0026 100644
--- 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
--- firefox-57.0b6/gfx/src/nsThemeConstants.h.1399611 2017-06-12 18:37:10.000000000 +0200
+++ firefox-57.0b6/gfx/src/nsThemeConstants.h 2017-10-09 10:58:19.863078829 +0200
@@ -299,6 +299,7 @@ enum ThemeWidgetType : uint8_t {
NS_THEME_MAC_SOURCE_LIST,
NS_THEME_MAC_SOURCE_LIST_SELECTION,
@ -185,10 +176,9 @@ index d0ced405095d..1cd2361a0026 100644
ThemeWidgetType_COUNT
};
diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp
index cbfb4d0f60aa..263372ca868e 100644
--- 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
--- firefox-57.0b6/layout/style/nsCSSRuleProcessor.cpp.1399611 2017-08-02 14:27:54.000000000 +0200
+++ firefox-57.0b6/layout/style/nsCSSRuleProcessor.cpp 2017-10-09 10:58:19.863078829 +0200
@@ -1180,6 +1180,30 @@ nsCSSRuleProcessor::InitSystemMetrics()
sSystemMetrics->AppendElement(nsGkAtoms::physical_home_button);
}
@ -220,10 +210,9 @@ index cbfb4d0f60aa..263372ca868e 100644
#ifdef XP_WIN
if (NS_SUCCEEDED(
LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsThemeIdentifier,
diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp
index 7cf6a08e46c1..bf955d759e8b 100644
--- 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
--- firefox-57.0b6/layout/style/nsMediaFeatures.cpp.1399611 2017-09-15 06:15:42.000000000 +0200
+++ firefox-57.0b6/layout/style/nsMediaFeatures.cpp 2017-10-09 10:58:19.863078829 +0200
@@ -788,6 +788,42 @@ nsMediaFeatures::features[] = {
GetSystemMetric
},
@ -267,11 +256,10 @@ index 7cf6a08e46c1..bf955d759e8b 100644
// Internal -moz-is-glyph media feature: applies only inside SVG glyphs.
// Internal because it is really only useful in the user agent anyway
// and therefore not worth standardizing.
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index 0b77f1759021..b8dc9aeebfd8 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -4912,6 +4912,7 @@ pref("gfx.apitrace.enabled",false);
diff -up firefox-57.0b6/modules/libpref/init/all.js.1399611 firefox-57.0b6/modules/libpref/init/all.js
--- firefox-57.0b6/modules/libpref/init/all.js.1399611 2017-10-02 22:17:20.000000000 +0200
+++ firefox-57.0b6/modules/libpref/init/all.js 2017-10-09 10:58:19.864078825 +0200
@@ -4911,6 +4911,7 @@ pref("gfx.apitrace.enabled",false);
pref("gfx.xrender.enabled",false);
pref("widget.chrome.allow-gtk-dark-theme", false);
pref("widget.content.allow-gtk-dark-theme", false);
@ -279,10 +267,9 @@ index 0b77f1759021..b8dc9aeebfd8 100644
#endif
#endif
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
index 8b5dc9e25d7e..14fb0fe87e9d 100644
--- 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
--- firefox-57.0b6/toolkit/modules/moz.build.1399611 2017-09-15 06:15:40.000000000 +0200
+++ firefox-57.0b6/toolkit/modules/moz.build 2017-10-09 10:58:19.864078825 +0200
@@ -259,7 +259,7 @@ EXTRA_JS_MODULES.sessionstore += [
]
@ -292,192 +279,9 @@ index 8b5dc9e25d7e..14fb0fe87e9d 100644
DEFINES['CAN_DRAW_IN_TITLEBAR'] = 1
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('windows', 'gtk2', 'gtk3'):
diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h
index ff5da8017621..d31b411a9b1a 100644
--- a/widget/LookAndFeel.h
+++ 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
diff -up firefox-57.0b6/widget/gtk/gtk3drawing.cpp.1399611 firefox-57.0b6/widget/gtk/gtk3drawing.cpp
--- firefox-57.0b6/widget/gtk/gtk3drawing.cpp.1399611 2017-09-15 06:15:40.000000000 +0200
+++ firefox-57.0b6/widget/gtk/gtk3drawing.cpp 2017-10-09 10:58:19.865078822 +0200
@@ -17,6 +17,7 @@
#include "WidgetStyleCache.h"
@ -512,7 +316,7 @@ index 4c562b380095..ee2b8a04f63f 100644
// GetStateFlagsFromGtkWidgetState() can be safely used for the specific
// GtkWidgets that set both prelight and active flags. For other widgets,
// 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;
}
@ -556,7 +360,7 @@ index 4c562b380095..ee2b8a04f63f 100644
static gint
moz_gtk_window_paint(cairo_t *cr, GdkRectangle* rect,
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
@ -581,7 +385,7 @@ index 4c562b380095..ee2b8a04f63f 100644
moz_gtk_toggle_paint(cairo_t *cr, GdkRectangle* rect,
GtkWidgetState* state,
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;
}
@ -620,7 +424,7 @@ index 4c562b380095..ee2b8a04f63f 100644
static void
moz_gtk_add_style_margin(GtkStyleContext* style,
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);
}
@ -635,7 +439,7 @@ index 4c562b380095..ee2b8a04f63f 100644
static GtkBorder
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
// padding in forms.css. See bug 1187385.
*left = *top = *right = *bottom = -1;
@ -645,7 +449,7 @@ index 4c562b380095..ee2b8a04f63f 100644
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 =
gtk_container_get_border_width(GTK_CONTAINER(
GetWidget(MOZ_GTK_TREE_HEADER_CELL)));
@ -657,7 +461,7 @@ index 4c562b380095..ee2b8a04f63f 100644
return MOZ_GTK_SUCCESS;
}
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(
GetWidget(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. */
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);
*left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(w));
@ -680,7 +484,7 @@ index 4c562b380095..ee2b8a04f63f 100644
return MOZ_GTK_SUCCESS;
}
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;
}
@ -702,7 +506,7 @@ index 4c562b380095..ee2b8a04f63f 100644
/* These widgets have no borders, since they are not containers. */
case MOZ_GTK_CHECKBUTTON_LABEL:
@@ -2646,6 +2767,36 @@ GetScrollbarMetrics(GtkOrientation aOrientation)
@@ -2646,6 +2767,36 @@ GetScrollbarMetrics(GtkOrientation aOrie
return metrics;
}
@ -739,7 +543,7 @@ index 4c562b380095..ee2b8a04f63f 100644
/* cairo_t *cr argument has to be a system-cairo. */
gint
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),
direction);
break;
@ -754,7 +558,7 @@ index 4c562b380095..ee2b8a04f63f 100644
case MOZ_GTK_CHECKBUTTON:
case MOZ_GTK_RADIOBUTTON:
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:
return moz_gtk_info_bar_paint(cr, rect, state);
break;
@ -765,10 +569,9 @@ index 4c562b380095..ee2b8a04f63f 100644
default:
g_warning("Unknown widget type: %d", widget);
}
diff --git a/widget/gtk/gtkdrawing.h b/widget/gtk/gtkdrawing.h
index 42dbf8287499..c0a7eba5006a 100644
--- 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
--- firefox-57.0b6/widget/gtk/gtkdrawing.h.1399611 2017-06-12 18:37:20.000000000 +0200
+++ firefox-57.0b6/widget/gtk/gtkdrawing.h 2017-10-09 10:58:19.865078822 +0200
@@ -268,8 +268,14 @@ typedef enum {
MOZ_GTK_SPLITTER_SEPARATOR_VERTICAL,
/* Paints the background of a window, dialog or page. */
@ -799,7 +602,7 @@ index 42dbf8287499..c0a7eba5006a 100644
MOZ_GTK_WIDGET_NODE_COUNT
} 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);
@ -832,10 +635,9 @@ index 42dbf8287499..c0a7eba5006a 100644
/**
* Get the YTHICKNESS of a tab (notebook extension).
*/
diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c
index 7285b7f001ac..6e554c7f628e 100644
--- 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
--- firefox-57.0b6/widget/gtk/mozgtk/mozgtk.c.1399611 2017-10-09 10:58:19.861078836 +0200
+++ firefox-57.0b6/widget/gtk/mozgtk/mozgtk.c 2017-10-09 10:58:19.865078822 +0200
@@ -580,6 +580,8 @@ STUB(gtk_style_context_set_state)
STUB(gtk_style_properties_lookup_property)
STUB(gtk_tree_view_column_get_button)
@ -864,11 +666,10 @@ index 7285b7f001ac..6e554c7f628e 100644
#endif
#ifdef GTK2_SYMBOLS
diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp
index e02bf10fe87f..a5950ac35799 100644
--- a/widget/gtk/nsLookAndFeel.cpp
+++ b/widget/gtk/nsLookAndFeel.cpp
@@ -642,6 +642,22 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
diff -up firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp.1399611 firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp
--- firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp.1399611 2017-09-21 06:10:10.000000000 +0200
+++ firefox-57.0b6/widget/gtk/nsLookAndFeel.cpp 2017-10-09 10:58:19.865078822 +0200
@@ -642,6 +642,22 @@ nsLookAndFeel::GetIntImpl(IntID aID, int
case eIntID_ContextMenuOffsetHorizontal:
aResult = 2;
break;
@ -932,10 +733,9 @@ index e02bf10fe87f..a5950ac35799 100644
}
// virtual
diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h
index 177d069f6567..6e14236e604a 100644
--- 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
--- firefox-57.0b6/widget/gtk/nsLookAndFeel.h.1399611 2017-09-21 06:10:10.000000000 +0200
+++ firefox-57.0b6/widget/gtk/nsLookAndFeel.h 2017-10-09 10:58:19.865078822 +0200
@@ -32,6 +32,8 @@ public:
virtual char16_t GetPasswordCharacterImpl();
virtual bool GetEchoPasswordImpl();
@ -956,10 +756,9 @@ index 177d069f6567..6e14236e604a 100644
bool mInitialized;
void EnsureInit();
diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp
index 211790096a3e..6ed35b97a0d7 100644
--- 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
--- firefox-57.0b6/widget/gtk/nsNativeThemeGTK.cpp.1399611 2017-09-19 06:18:28.000000000 +0200
+++ firefox-57.0b6/widget/gtk/nsNativeThemeGTK.cpp 2017-10-09 10:58:19.865078822 +0200
@@ -23,6 +23,7 @@
#include "nsIDOMHTMLInputElement.h"
#include "nsGkAtoms.h"
@ -968,7 +767,7 @@ index 211790096a3e..6ed35b97a0d7 100644
#include "mozilla/EventStates.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:
aGtkWidgetType = MOZ_GTK_INFO_BAR;
break;
@ -993,7 +792,7 @@ index 211790096a3e..6ed35b97a0d7 100644
default:
return false;
}
@@ -1627,6 +1646,10 @@ nsNativeThemeGTK::GetMinimumWidgetSize(nsPresContext* aPresContext,
@@ -1627,6 +1646,10 @@ nsNativeThemeGTK::GetMinimumWidgetSize(n
case NS_THEME_MENULIST:
case NS_THEME_TOOLBARBUTTON:
case NS_THEME_TREEHEADERCELL:
@ -1004,7 +803,7 @@ index 211790096a3e..6ed35b97a0d7 100644
{
if (aWidgetType == NS_THEME_MENULIST) {
// Include the arrow size.
@@ -1892,9 +1915,21 @@ nsNativeThemeGTK::ThemeSupportsWidget(nsPresContext* aPresContext,
@@ -1892,9 +1915,21 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
case NS_THEME_DIALOG:
#if (MOZ_WIDGET_GTK == 3)
case NS_THEME_GTK_INFO_BAR:
@ -1026,7 +825,7 @@ index 211790096a3e..6ed35b97a0d7 100644
case NS_THEME_MENULIST_BUTTON:
if (aFrame && aFrame->GetWritingMode().IsVertical()) {
return false;
@@ -1978,6 +2013,13 @@ nsNativeThemeGTK::GetWidgetTransparency(nsIFrame* aFrame, uint8_t aWidgetType)
@@ -1978,6 +2013,13 @@ nsNativeThemeGTK::GetWidgetTransparency(
#else
return eTransparent;
#endif
@ -1040,10 +839,9 @@ index 211790096a3e..6ed35b97a0d7 100644
}
return eUnknownTransparency;
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
index 37b6aae4c3d0..f0c3343f20ae 100644
--- 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
--- firefox-57.0b6/widget/gtk/nsWindow.cpp.1399611 2017-10-09 10:58:19.858078848 +0200
+++ firefox-57.0b6/widget/gtk/nsWindow.cpp 2017-10-09 10:58:19.866078818 +0200
@@ -85,6 +85,7 @@
#include "nsIPropertyBag2.h"
#include "GLContext.h"
@ -1061,7 +859,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
using namespace mozilla;
using namespace mozilla::gfx;
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
static gboolean expose_event_cb (GtkWidget *widget,
cairo_t *rect);
@ -1070,7 +868,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
#endif
static gboolean configure_event_cb (GtkWidget *widget,
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);
static void widget_composited_changed_cb (GtkWidget* widget,
gpointer user_data);
@ -1078,7 +876,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
#if (MOZ_WIDGET_GTK == 3)
static void scale_changed_cb (GtkWidget* widget,
GParamSpec* aPSpec,
@@ -439,6 +443,7 @@ nsWindow::nsWindow()
@@ -440,6 +444,7 @@ nsWindow::nsWindow()
mContainer = nullptr;
mGdkWindow = nullptr;
@ -1086,7 +884,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
mShell = nullptr;
mCompositorWidgetDelegate = nullptr;
mHasMappedToplevel = false;
@@ -480,6 +485,9 @@ nsWindow::nsWindow()
@@ -481,6 +486,9 @@ nsWindow::nsWindow()
mLastScrollEventTime = GDK_CURRENT_TIME;
#endif
mPendingConfigures = 0;
@ -1096,7 +894,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
}
nsWindow::~nsWindow()
@@ -1478,8 +1486,8 @@ LayoutDeviceIntRect
@@ -1479,8 +1487,8 @@ LayoutDeviceIntRect
nsWindow::GetScreenBounds()
{
LayoutDeviceIntRect rect;
@ -1107,7 +905,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gint x, y;
gdk_window_get_root_origin(gtk_widget_get_window(GTK_WIDGET(mContainer)), &x, &y);
rect.MoveTo(GdkPointToDevicePixels({ x, y }));
@@ -1605,6 +1613,10 @@ nsWindow::SetCursor(nsCursor aCursor)
@@ -1606,6 +1614,10 @@ nsWindow::SetCursor(nsCursor aCursor)
return;
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 (mContainer) {
gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(mContainer)), cursor);
@ -1129,7 +927,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
rv = NS_OK;
}
#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;
}
@ -1142,7 +940,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
// If this widget uses OMTC...
if (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT ||
GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR) {
@@ -2585,6 +2607,53 @@ nsWindow::OnMotionNotifyEvent(GdkEventMotion *aEvent)
@@ -2586,6 +2608,53 @@ nsWindow::OnMotionNotifyEvent(GdkEventMo
}
}
#endif /* MOZ_X11 */
@ -1196,7 +994,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
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))
return;
@ -1217,7 +1015,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gdouble pressure = 0;
gdk_event_get_axis ((GdkEvent*)aEvent, GDK_AXIS_PRESSURE, &pressure);
mLastMotionPressure = pressure;
@@ -3340,6 +3423,8 @@ nsWindow::OnWindowStateEvent(GtkWidget *aWidget, GdkEventWindowState *aEvent)
@@ -3341,6 +3424,8 @@ nsWindow::OnWindowStateEvent(GtkWidget *
#endif //ACCESSIBILITY
}
@ -1226,7 +1024,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (mWidgetListener) {
mWidgetListener->SizeModeChanged(mSizeState);
if (aEvent->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
@@ -3404,6 +3489,7 @@ nsWindow::OnCompositedChanged()
@@ -3405,6 +3490,7 @@ nsWindow::OnCompositedChanged()
presShell->ThemeChanged();
}
}
@ -1234,7 +1032,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
}
void
@@ -3592,7 +3678,8 @@ nsWindow::Create(nsIWidget* aParent,
@@ -3593,7 +3679,8 @@ nsWindow::Create(nsIWidget* aParent,
GtkWindow *topLevelParent = nullptr;
nsWindow *parentnsWindow = nullptr;
GtkWidget *eventWidget = nullptr;
@ -1244,7 +1042,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (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;
mShell = gtk_window_new(type);
@ -1303,7 +1101,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
}
// 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);
#if (MOZ_WIDGET_GTK == 3)
@ -1321,6 +1119,9 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
- gtk_widget_set_has_window(container, FALSE);
- // Prevent GtkWindow from painting a background to flicker.
- gtk_widget_set_app_paintable(mShell, TRUE);
- }
- // Set up event widget
- eventWidget = shellHasCSD ? container : mShell;
+ /* There are tree possible situations here:
+ *
+ * 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);
+ drawToContainer = gtk_style_context_has_class(style, "csd");
}
- // Set up event widget
- eventWidget = shellHasCSD ? container : mShell;
+ }
+#endif
+ drawWidget = (drawToContainer) ? container : mShell;
+ // 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_widget_realize(container);
@@ -3782,7 +3919,7 @@ nsWindow::Create(nsIWidget* aParent,
@@ -3783,7 +3920,7 @@ nsWindow::Create(nsIWidget* aParent,
gtk_widget_grab_focus(container);
// the drawing window
@ -1385,7 +1184,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (mWindowType == eWindowType_popup) {
// 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
g_object_set_data(G_OBJECT(mGdkWindow), "nsWindow", this);
@ -1397,7 +1196,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
if (mContainer)
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,
"notify::gtk-font-name",
G_CALLBACK(theme_changed_cb), this);
@ -1408,7 +1207,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
}
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);
GtkWidget *widgets[] = { GTK_WIDGET(mContainer),
@ -1417,7 +1216,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
for (size_t i = 0; i < ArrayLength(widgets) && widgets[i]; ++i) {
// Visibility events are sent to the owning widget of the relevant
// 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
GTK_PRIVATE_SET_FLAG(eventWidget, GTK_HAS_SHAPE_MASK);
#endif
@ -1425,7 +1224,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
// 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
// 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));
if (mIsTopLevel) {
@ -1438,7 +1237,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gtk_window_resize(GTK_WINDOW(mShell), size.width, size.height);
}
else if (mContainer) {
@@ -4165,6 +4316,11 @@ nsWindow::NativeMoveResize()
@@ -4166,6 +4317,11 @@ nsWindow::NativeMoveResize()
if (mIsTopLevel) {
// x and y give the position of the window manager frame top-left.
gtk_window_move(GTK_WINDOW(mShell), topLeft.x, topLeft.y);
@ -1450,7 +1249,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
// This sets the client window size.
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;
}
@ -1484,7 +1283,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
#endif //MOZ_WIDGET_GTK == 2
static gboolean
@@ -6575,6 +6758,28 @@ nsWindow::ClearCachedResources()
@@ -6576,6 +6759,28 @@ nsWindow::ClearCachedResources()
}
}
@ -1513,7 +1312,7 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
gint
nsWindow::GdkScaleFactor()
{
@@ -6845,6 +7050,157 @@ nsWindow::SynthesizeNativeTouchPoint(uint32_t aPointerId,
@@ -6846,6 +7051,157 @@ nsWindow::SynthesizeNativeTouchPoint(uin
}
#endif
@ -1671,10 +1470,9 @@ index 37b6aae4c3d0..f0c3343f20ae 100644
int32_t
nsWindow::RoundsWidgetCoordinatesTo()
{
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
index f7c07d57491b..d9a07316a52c 100644
--- 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
--- firefox-57.0b6/widget/gtk/nsWindow.h.1399611 2017-09-15 06:15:40.000000000 +0200
+++ firefox-57.0b6/widget/gtk/nsWindow.h 2017-10-09 10:58:19.867078814 +0200
@@ -123,6 +123,7 @@ public:
double aHeight,
bool aRepaint) override;
@ -1764,3 +1562,183 @@ index f7c07d57491b..d9a07316a52c 100644
};
#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.
*/