diff gtk-2.0/adwaita_engine.c @ 0:a48477723cfe

Base Adwaita theme for GTK 3.16 https://github.com/GNOME/gnome-themes-standard/tree/gnome-3-14/themes/Adwaita @ 7c9d684 with gtk-3.0 directory replaced with https://github.com/GNOME/gtk/tree/gtk-3-16/gtk/theme/Adwaita @ ff9ee56
author IBBoard <dev@ibboard.co.uk>
date Sat, 09 Apr 2016 20:21:23 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gtk-2.0/adwaita_engine.c	Sat Apr 09 20:21:23 2016 +0100
@@ -0,0 +1,265 @@
+/* Adwaita - a GTK+ engine
+ *
+ * Copyright (C) 2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Authors: Cosimo Cecchi <cosimoc@gnome.org>
+ */
+
+#include <gmodule.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#ifdef GDK_WINDOWING_X11
+#include <gdk/gdkx.h>
+#endif
+
+/***************************************/
+/* Register & Initialize Drawing Style */
+/***************************************/
+#define ADWAITA_TYPE_STYLE              (adwaita_style_get_type ())
+#define ADWAITA_STYLE(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), ADWAITA_TYPE_STYLE, AdwaitaStyle))
+#define ADWAITA_STYLE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), ADWAITA_TYPE_STYLE, AdwaitaStyleClass))
+#define ADWAITA_IS_STYLE(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), ADWAITA_TYPE_STYLE))
+#define ADWAITA_IS_STYLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), ADWAITA_TYPE_STYLE))
+#define ADWAITA_STYLE_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), ADWAITA_TYPE_STYLE, AdwaitaStyleClass))
+ 
+typedef struct
+{
+  GtkStyle parent_instance;
+} AdwaitaStyle;
+ 
+typedef struct
+{
+  GtkStyleClass parent_class;
+} AdwaitaStyleClass;
+
+G_DEFINE_DYNAMIC_TYPE (AdwaitaStyle, adwaita_style, GTK_TYPE_STYLE)
+
+static void
+do_toplevel_hack (GtkWidget   *widget,
+                  const gchar *widget_name)
+{
+  gboolean tried_hack;
+
+  tried_hack = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget), "adwaita-toplevel-hack"));
+
+  if (!tried_hack)
+    {
+      g_object_set_data (G_OBJECT (widget),
+                         "adwaita-toplevel-hack", GINT_TO_POINTER (1));
+      gtk_widget_set_name (widget, widget_name);
+    }
+}
+
+static gboolean
+wm_is_fallback (void)
+{
+#ifdef GDK_WINDOWING_X11
+  const gchar *name;
+  name = gdk_x11_screen_get_window_manager_name (gdk_screen_get_default ());
+  return g_strcmp0 (name, "GNOME Shell") != 0;
+#else
+  return TRUE;
+#endif
+}
+
+static cairo_t * 
+drawable_to_cairo (GdkDrawable  *window,
+                   GdkRectangle *area)
+{
+  cairo_t *cr;
+
+  g_return_val_if_fail (window != NULL, NULL);
+
+  cr = (cairo_t*) gdk_cairo_create (window);
+  cairo_set_line_width (cr, 1.0);
+  cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
+  cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
+
+  if (area)
+    {
+      cairo_rectangle (cr, area->x, area->y, area->width, area->height);
+      cairo_clip_preserve (cr);
+      cairo_new_path (cr);
+    }
+
+  return cr;
+}
+
+static void
+adwaita_draw_box (GtkStyle * style,
+                  GdkWindow * window,
+                  GtkStateType state_type,
+                  GtkShadowType shadow_type,
+                  GdkRectangle * area,
+                  GtkWidget * widget,
+                  const gchar * detail, 
+                  gint x, 
+                  gint y, 
+                  gint width, 
+                  gint height)
+{
+  if (GTK_IS_MENU (widget) &&
+      g_strcmp0 (detail, "menu") == 0 &&
+      wm_is_fallback ())
+    {
+      cairo_t *cr = drawable_to_cairo (window, area);
+      cairo_pattern_t *pattern = cairo_pattern_create_linear (x, y, x, y + height);
+      gdouble stop_1, stop_2, stop_3;
+
+      stop_1 = MIN (1.0, 6.0 / (gdouble) height);
+      stop_2 = MAX (stop_1, 0.33);
+      stop_3 = MAX (stop_2, 0.66);
+
+      cairo_pattern_add_color_stop_rgba (pattern, 0.0, 0.66, 0.66, 0.66, 0.0);
+      cairo_pattern_add_color_stop_rgba (pattern, stop_1, 0.66, 0.66, 0.66, 0.25);
+      cairo_pattern_add_color_stop_rgba (pattern, stop_2, 0.66, 0.66, 0.66, 0.80);
+      cairo_pattern_add_color_stop_rgba (pattern, stop_3, 0.66, 0.66, 0.66, 1.0);
+      cairo_pattern_add_color_stop_rgba (pattern, 1.0, 0.66, 0.66, 0.66, 1.0);
+      cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+
+      cairo_set_source (cr, pattern);
+      cairo_rectangle (cr, x, y, width, height);
+      cairo_stroke (cr);
+
+      cairo_destroy (cr);
+      cairo_pattern_destroy (pattern);
+    }
+  else
+    {
+      GTK_STYLE_CLASS (adwaita_style_parent_class)->draw_box (style, window, state_type, shadow_type,
+                                                              area, widget, detail,
+                                                              x, y, width, height);
+    }
+}
+
+void
+adwaita_draw_flat_box (GtkStyle      *style,
+                       GdkWindow     *window,
+                       GtkStateType   state_type,
+                       GtkShadowType  shadow_type,
+                       GdkRectangle  *area,
+                       GtkWidget     *widget,
+                       const gchar   *detail,
+                       gint           x,
+                       gint	      y,
+                       gint	      width,
+                       gint	      height)
+{
+  const gchar *app_name;
+
+  GTK_STYLE_CLASS (adwaita_style_parent_class)->draw_flat_box (style, window, state_type, shadow_type,
+                                                               area, widget, detail,
+                                                               x, y, width, height);
+
+  /* HACK: this is totally awful, but I don't see a better way to "tag" the OO.o hierarchy */
+  if (!GTK_IS_WINDOW (widget) ||
+      (gtk_window_get_window_type (GTK_WINDOW (widget)) != GTK_WINDOW_TOPLEVEL))
+    return;
+
+  app_name = g_get_application_name ();
+  if (g_str_has_prefix (app_name, "OpenOffice.org"))
+    do_toplevel_hack (widget, "openoffice-toplevel");
+  else if (g_str_has_prefix (app_name, "LibreOffice"))
+    do_toplevel_hack (widget, "libreoffice-toplevel");
+}
+
+static void
+adwaita_style_init (AdwaitaStyle *style)
+{
+}
+
+static void
+adwaita_style_class_init (AdwaitaStyleClass * klass)
+{
+  GtkStyleClass *style_class = GTK_STYLE_CLASS (klass);
+ 
+  style_class->draw_box = adwaita_draw_box;
+  style_class->draw_flat_box = adwaita_draw_flat_box;
+}
+
+static void
+adwaita_style_class_finalize (AdwaitaStyleClass * klass)
+{
+}
+
+/**********************************/ 
+/* Register & Initialize RC Style */ 
+/**********************************/ 
+#define ADWAITA_TYPE_RC_STYLE              (adwaita_rc_style_get_type ())
+#define ADWAITA_RC_STYLE(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), ADWAITA_TYPE_RC_STYLE, AdwaitaRcStyle))
+#define ADWAITA_RC_STYLE_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), ADWAITA_TYPE_RC_STYLE, AdwaitaRcStyleClass))
+#define ADWAITA_IS_RC_STYLE(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), ADWAITA_TYPE_RC_STYLE))
+#define ADWAITA_IS_RC_STYLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), ADWAITA_TYPE_RC_STYLE))
+#define ADWAITA_RC_STYLE_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), ADWAITA_TYPE_RC_STYLE, AdwaitaRcStyleClass))
+ 
+typedef struct
+{
+  GtkRcStyle parent_instance;
+} AdwaitaRcStyle;
+ 
+typedef struct
+{
+  GtkRcStyleClass parent_class;
+} AdwaitaRcStyleClass;
+
+G_DEFINE_DYNAMIC_TYPE (AdwaitaRcStyle, adwaita_rc_style, GTK_TYPE_RC_STYLE)
+
+static GtkStyle *
+adwaita_rc_style_create_style (GtkRcStyle *rc_style)
+{
+  return g_object_new (ADWAITA_TYPE_STYLE, NULL);
+}
+
+static void
+adwaita_rc_style_init (AdwaitaRcStyle *rc_style)
+{
+}
+
+static void
+adwaita_rc_style_class_init (AdwaitaRcStyleClass * klass)
+{
+  GtkRcStyleClass *rc_class = GTK_RC_STYLE_CLASS (klass);
+
+  rc_class->create_style = adwaita_rc_style_create_style;
+}
+
+static void
+adwaita_rc_style_class_finalize (AdwaitaRcStyleClass * klass)
+{
+}
+
+/**************** 
+ * Engine Hooks * 
+ ****************/
+void
+theme_init (GTypeModule * module)
+{
+  adwaita_rc_style_register_type (module);
+  adwaita_style_register_type (module);
+}
+ 
+void
+theme_exit (void)
+{
+}
+ 
+GtkRcStyle *
+theme_create_rc_style (void)
+{
+  return g_object_new (ADWAITA_TYPE_RC_STYLE, NULL);
+}