Bug 1364843 - Implement GtkHeaderBar widgets at WidgetCache, r?jhorak
Based on patch by Andrew Comminos [:acomminos] <andrew@comminos.com>
MozReview-Commit-ID: HzzXDqE0s5n
--- a/widget/gtk/WidgetStyleCache.cpp
+++ b/widget/gtk/WidgetStyleCache.cpp
@@ -524,16 +524,78 @@ static GtkWidget*
CreateNotebookWidget()
{
GtkWidget* widget = gtk_notebook_new();
AddToWindowContainer(widget);
return widget;
}
static GtkWidget*
+CreateHeaderBar(WidgetNodeType aWidgetType)
+{
+ MOZ_ASSERT(gtk_check_version(3, 10, 0) == nullptr,
+ "GtkHeaderBar is only available on GTK 3.10+.");
+
+ static auto sGtkHeaderBarNewPtr = (GtkWidget* (*)())
+ dlsym(RTLD_DEFAULT, "gtk_header_bar_new");
+
+ GtkWidget* headerbar = sGtkHeaderBarNewPtr();
+ if (aWidgetType == MOZ_GTK_HEADER_BAR_MAXIMIZED) {
+ 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, "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+.");
+
+ 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, "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_CONTAINER:
return CreateWindowContainerWidget();
case MOZ_GTK_CHECKBUTTON_CONTAINER:
@@ -1209,16 +1271,18 @@ ResetWidgetCache(void)
if (sStyleStorage[i])
g_object_unref(sStyleStorage[i]);
}
mozilla::PodArrayZero(sStyleStorage);
/* 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);
}
GtkStyleContext*
GetStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection,
GtkStateFlags aStateFlags, StyleFlags aFlags)