You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
526 lines
23 KiB
526 lines
23 KiB
/* 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 <andrea.cimitan@canonical.com>
|
|
*
|
|
*/
|
|
|
|
#include <cairo.h>
|
|
#include <cairo-gobject.h>
|
|
#include <gtk/gtk.h>
|
|
|
|
#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)
|
|
{
|
|
}
|