/* The TdeGtk Theming Engine for Gtk+. * Copyright (C) 2011 Canonical Ltd * * 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 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 St, Fifth Floor, Boston, * MA 02110-1301, USA. * * Authored by Andrea Cimitan * */ #include #include #include #include "tdegtk.h" #include "tdegtk-cairo-support.h" #include "tdegtk-draw.h" #include "tdegtk-engine.h" #include "tdegtk-support.h" #include "tdegtk-types.h" #define TDEGTK_NAMESPACE "tdegtk" #define TDEGTK_CAIRO_INIT \ 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); G_DEFINE_DYNAMIC_TYPE (TdeGtkEngine, tdegtk_engine, GTK_TYPE_THEMING_ENGINE) static void tdegtk_engine_render_activity (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; const GtkWidgetPath *path; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); path = gtk_theming_engine_get_path (engine); if (gtk_widget_path_is_type (path, GTK_TYPE_SCALE)) tdegtk_trim_scale_allocation (engine, &x, &y, &width, &height); if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_SPINNER)) GTK_THEMING_ENGINE_CLASS (tdegtk_engine_parent_class)->render_activity (engine, cr, x, y, width, height); else style_functions->draw_activity (engine, cr, x, y, width, height); } static void tdegtk_engine_render_arrow (GtkThemingEngine *engine, cairo_t *cr, gdouble angle, gdouble x, gdouble y, gdouble size) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); style_functions->draw_arrow (engine, cr, angle, x, y, size); } static void tdegtk_engine_render_background (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; const GtkWidgetPath *path; GtkRegionFlags flags; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); path = gtk_theming_engine_get_path (engine); if (gtk_widget_path_is_type (path, GTK_TYPE_SCALE) && gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_TROUGH)) tdegtk_trim_scale_allocation (engine, &x, &y, &width, &height); if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_BUTTON) && gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_SPINBUTTON)) style_functions->draw_spinbutton_background (engine, cr, x, y, width, height); else if (!gtk_widget_path_is_type (path, GTK_TYPE_ICON_VIEW) && gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_VIEW) && gtk_theming_engine_has_region (engine, GTK_STYLE_REGION_COLUMN, &flags)) style_functions->draw_cell_background (engine, cr, x, y, width, height, flags); else style_functions->draw_common_background (engine, cr, x, y, width, height); } static void tdegtk_engine_render_check (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); if (!gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_MENUITEM)) { if (tdegtk_cairo_draw_from_texture (engine, cr, x, y, width, height)) return; } style_functions->draw_check (engine, cr, x, y, width, height); } static void tdegtk_engine_render_expander (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); style_functions->draw_expander (engine, cr, x, y, width, height); } static void tdegtk_engine_render_extension (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height, GtkPositionType gap_side) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); style_functions->draw_extension (engine, cr, x, y, width, height, gap_side); } static void tdegtk_engine_render_focus (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); style_functions->draw_focus (engine, cr, x, y, width, height); } static void tdegtk_engine_render_frame (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; const GtkWidgetPath *path; GtkRegionFlags flags; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); path = gtk_theming_engine_get_path (engine); if (gtk_widget_path_is_type (path, GTK_TYPE_SCALE) && gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_TROUGH)) tdegtk_trim_scale_allocation (engine, &x, &y, &width, &height); if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_SEPARATOR)) style_functions->draw_separator (engine, cr, x, y, width, height); else if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_BUTTON) && gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_SPINBUTTON)) style_functions->draw_spinbutton_frame (engine, cr, x, y, width, height); else if (!gtk_widget_path_is_type (path, GTK_TYPE_ICON_VIEW) && gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_VIEW) && gtk_theming_engine_has_region (engine, GTK_STYLE_REGION_COLUMN, &flags)) style_functions->draw_cell_frame (engine, cr, x, y, width, height, flags); else style_functions->draw_common_frame (engine, cr, x, y, width, height); } static void tdegtk_engine_render_frame_gap (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height, GtkPositionType gap_side, gdouble xy0_gap, gdouble xy1_gap) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_NOTEBOOK)) style_functions->draw_notebook (engine, cr, x, y, width, height, gap_side, xy0_gap, xy1_gap); else style_functions->draw_frame_gap (engine, cr, x, y, width, height, gap_side, xy0_gap, xy1_gap); } static void tdegtk_engine_render_handle (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_GRIP)) style_functions->draw_grip (engine, cr, x, y, width, height); else style_functions->draw_handle (engine, cr, x, y, width, height); } static void tdegtk_engine_render_line (GtkThemingEngine *engine, cairo_t *cr, gdouble x0, gdouble y0, gdouble x1, gdouble y1) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); style_functions->draw_line (engine, cr, x0, y0, x1, y1); } static void tdegtk_engine_render_option (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); if (!gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_MENUITEM)) { if (tdegtk_cairo_draw_from_texture (engine, cr, x, y, width, height)) return; } style_functions->draw_radio (engine, cr, x, y, width, height); } static void tdegtk_engine_render_slider (GtkThemingEngine *engine, cairo_t *cr, gdouble x, gdouble y, gdouble width, gdouble height, GtkOrientation orientation) { TdeGtkStyleFunctions *style_functions; TDEGTK_CAIRO_INIT tdegtk_lookup_functions (TDEGTK_ENGINE (engine), &style_functions); if (gtk_theming_engine_has_class (engine, GTK_STYLE_CLASS_SCALE)) { if (tdegtk_cairo_draw_from_texture (engine, cr, x, y, width, height)) return; } style_functions->draw_slider (engine, cr, x, y, width, height, orientation); } void tdegtk_engine_register_types (GTypeModule *module) { tdegtk_engine_register_type (module); } static void tdegtk_engine_init (TdeGtkEngine *engine) { tdegtk_register_style_default (&engine->style_functions[TDEGTK_STYLE_DEFAULT]); } static void tdegtk_engine_class_init (TdeGtkEngineClass *klass) { GtkThemingEngineClass *engine_class = GTK_THEMING_ENGINE_CLASS (klass); engine_class->render_activity = tdegtk_engine_render_activity; engine_class->render_arrow = tdegtk_engine_render_arrow; engine_class->render_background = tdegtk_engine_render_background; engine_class->render_check = tdegtk_engine_render_check; engine_class->render_expander = tdegtk_engine_render_expander; engine_class->render_extension = tdegtk_engine_render_extension; engine_class->render_focus = tdegtk_engine_render_focus; engine_class->render_frame = tdegtk_engine_render_frame; engine_class->render_frame_gap = tdegtk_engine_render_frame_gap; engine_class->render_handle = tdegtk_engine_render_handle; engine_class->render_line = tdegtk_engine_render_line; engine_class->render_option = tdegtk_engine_render_option; engine_class->render_slider = tdegtk_engine_render_slider; gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("background-texture", "Background texture", "Background texture", CAIRO_GOBJECT_TYPE_PATTERN, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("border-gradient", "Border gradient", "Border gradient", CAIRO_GOBJECT_TYPE_PATTERN, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("bullet-color", "Bullet color", "Bullet color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("bullet-outline-color", "Bullet outline color", "Bullet outline color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("centroid-texture", "Centroid texture", "Centroid texture", CAIRO_GOBJECT_TYPE_PATTERN, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("focus-border-color", "Focus border color", "Focus border color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_int ("focus-border-radius", "Focus border radius", "Focus border radius", 0, G_MAXINT, 0, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("focus-fill-color", "Focus fill color", "Focus fill color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("focus-outer-stroke-color", "Focus outer stroke color", "Focus outer stroke color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_int ("glow-radius", "Glow radius", "Glow radius", 0, G_MAXINT, 0, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("glow-color", "Glow color", "Glow color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-color", "Inner stroke color", "Inner stroke color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-top-color", "Inner stroke top color", "Inner stroke top color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-right-color", "Inner stroke right color", "Inner stroke right color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-bottom-color", "Inner stroke bottom color", "Inner stroke bottom color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-left-color", "Inner stroke left color", "Inner stroke left color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-gradient", "Inner stroke gradient", "Inner stroke gradient", CAIRO_GOBJECT_TYPE_PATTERN, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("inner-stroke-width", "Inner stroke width", "Inner stroke width", GTK_TYPE_BORDER, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-color", "Outer stroke color", "Outer stroke color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-top-color", "Outer stroke top color", "Outer stroke top color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-right-color", "Outer stroke right color", "Outer stroke right color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-bottom-color", "Outer stroke bottom color", "Outer stroke bottom color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-left-color", "Outer stroke left color", "Outer stroke left color", GDK_TYPE_RGBA, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-gradient", "Outer stroke gradient", "Outer stroke gradient", CAIRO_GOBJECT_TYPE_PATTERN, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("outer-stroke-width", "Outer stroke width", "Outer stroke width", GTK_TYPE_BORDER, 0)); gtk_theming_engine_register_property (TDEGTK_NAMESPACE, NULL, g_param_spec_boxed ("text-shadow-color", "Text shadow color", "Text shadow color", GDK_TYPE_RGBA, 0)); } static void tdegtk_engine_class_finalize (TdeGtkEngineClass *klass) { }