mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-25 13:11:13 +00:00
modules: remove the pixbuf engine directory
This is not used anywhere, and is commented out of the build because it doesn't compile. Time for some spring cleaning...
This commit is contained in:
parent
4101adb7ac
commit
67981b1831
@ -1890,8 +1890,6 @@ gtk/a11y/Makefile
|
||||
gtk/native/Makefile
|
||||
libgail-util/Makefile
|
||||
modules/Makefile
|
||||
modules/engines/Makefile
|
||||
modules/engines/pixbuf/Makefile
|
||||
modules/input/Makefile
|
||||
modules/printbackends/Makefile
|
||||
modules/printbackends/cups/Makefile
|
||||
|
@ -1,6 +1,6 @@
|
||||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
SUBDIRS = input engines
|
||||
SUBDIRS = input
|
||||
|
||||
if OS_UNIX
|
||||
SUBDIRS += printbackends
|
||||
|
@ -1,9 +0,0 @@
|
||||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
# the pixbuf engine needs to be ported to GtkThemingEngine
|
||||
SUBDIRS = # pixbuf
|
||||
|
||||
DIST_SUBDIRS = pixbuf
|
||||
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
@ -1,36 +0,0 @@
|
||||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
if PLATFORM_WIN32
|
||||
no_undefined = -no-undefined
|
||||
endif
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/gdk \
|
||||
-I$(top_builddir)/gdk \
|
||||
-DGDK_DISABLE_DEPRECATED \
|
||||
$(GTK_DEP_CFLAGS)
|
||||
|
||||
LDADDS = \
|
||||
$(GTK_DEP_LIBS) \
|
||||
$(top_builddir)/gdk/libgdk-3.la \
|
||||
$(top_builddir)/gtk/libgtk-3.la
|
||||
|
||||
enginedir = $(libdir)/gtk-3.0/$(GTK_BINARY_VERSION)/engines
|
||||
|
||||
engine_LTLIBRARIES = libpixmap.la
|
||||
|
||||
libpixmap_la_SOURCES = \
|
||||
pixbuf-draw.c \
|
||||
pixbuf-main.c \
|
||||
pixbuf-render.c \
|
||||
pixbuf-rc-style.c \
|
||||
pixbuf-rc-style.h \
|
||||
pixbuf-style.h \
|
||||
pixbuf.h
|
||||
|
||||
libpixmap_la_LDFLAGS = -avoid-version -module $(no_undefined)
|
||||
libpixmap_la_LIBADD = $(LDADDS)
|
||||
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
@ -1,17 +0,0 @@
|
||||
The code in this directory is a GTK+ theme engine based on the earlier
|
||||
pixmap theme engine.
|
||||
|
||||
The config files are meant to be compatible, but instead of rendering
|
||||
using Imlib, it renders using GdkPixbuf. This makes the memory
|
||||
management much more understandable, and also allows us to use
|
||||
GdkPixbuf's high quality scaling.
|
||||
|
||||
Most of the code was reworked/rewritten in the process to make it more
|
||||
understandable and maintainable.
|
||||
|
||||
There are lots of bugs here, a considersable number of bugs. But it's
|
||||
cleaned up a great deal from the older pixmap engine. Please don't
|
||||
make it uglier again.
|
||||
|
||||
Owen Taylor <otaylor@redhat.com>
|
||||
6 February 2000
|
@ -1,985 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "pixbuf.h"
|
||||
#include "pixbuf-rc-style.h"
|
||||
#include "pixbuf-style.h"
|
||||
|
||||
static void pixbuf_style_init (PixbufStyle *style);
|
||||
static void pixbuf_style_class_init (PixbufStyleClass *klass);
|
||||
|
||||
static GtkStyleClass *parent_class = NULL;
|
||||
|
||||
static ThemeImage *
|
||||
match_theme_image (GtkStyle *style,
|
||||
ThemeMatchData *match_data)
|
||||
{
|
||||
GList *tmp_list;
|
||||
|
||||
tmp_list = PIXBUF_RC_STYLE (style->rc_style)->img_list;
|
||||
|
||||
while (tmp_list)
|
||||
{
|
||||
guint flags;
|
||||
ThemeImage *image = tmp_list->data;
|
||||
tmp_list = tmp_list->next;
|
||||
|
||||
if (match_data->function != image->match_data.function)
|
||||
continue;
|
||||
|
||||
flags = match_data->flags & image->match_data.flags;
|
||||
|
||||
if (flags != image->match_data.flags) /* Required components not present */
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_STATE) &&
|
||||
match_data->state != image->match_data.state)
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_SHADOW) &&
|
||||
match_data->shadow != image->match_data.shadow)
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_ARROW_DIRECTION) &&
|
||||
match_data->arrow_direction != image->match_data.arrow_direction)
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_ORIENTATION) &&
|
||||
match_data->orientation != image->match_data.orientation)
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_GAP_SIDE) &&
|
||||
match_data->gap_side != image->match_data.gap_side)
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_EXPANDER_STYLE) &&
|
||||
match_data->expander_style != image->match_data.expander_style)
|
||||
continue;
|
||||
|
||||
if ((flags & THEME_MATCH_WINDOW_EDGE) &&
|
||||
match_data->window_edge != image->match_data.window_edge)
|
||||
continue;
|
||||
|
||||
if (image->match_data.detail &&
|
||||
(!match_data->detail ||
|
||||
strcmp (match_data->detail, image->match_data.detail) != 0))
|
||||
continue;
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
draw_simple_image(GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkWidget *widget,
|
||||
ThemeMatchData *match_data,
|
||||
gboolean draw_center,
|
||||
gboolean allow_setbg,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
|
||||
ThemeImage *image;
|
||||
|
||||
if (!(match_data->flags & THEME_MATCH_ORIENTATION))
|
||||
{
|
||||
match_data->flags |= THEME_MATCH_ORIENTATION;
|
||||
|
||||
if (height > width)
|
||||
match_data->orientation = GTK_ORIENTATION_VERTICAL;
|
||||
else
|
||||
match_data->orientation = GTK_ORIENTATION_HORIZONTAL;
|
||||
}
|
||||
|
||||
image = match_theme_image (style, match_data);
|
||||
if (image)
|
||||
{
|
||||
if (image->background)
|
||||
{
|
||||
theme_pixbuf_render (image->background, cr,
|
||||
draw_center ? COMPONENT_ALL : COMPONENT_ALL | COMPONENT_CENTER,
|
||||
FALSE,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
if (image->overlay && draw_center)
|
||||
theme_pixbuf_render (image->overlay, cr, COMPONENT_ALL,
|
||||
TRUE,
|
||||
x, y, width, height);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
draw_gap_image(GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkWidget *widget,
|
||||
ThemeMatchData *match_data,
|
||||
gboolean draw_center,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height,
|
||||
GtkPositionType gap_side,
|
||||
gint gap_x,
|
||||
gint gap_width)
|
||||
{
|
||||
ThemeImage *image;
|
||||
|
||||
if (!(match_data->flags & THEME_MATCH_ORIENTATION))
|
||||
{
|
||||
match_data->flags |= THEME_MATCH_ORIENTATION;
|
||||
|
||||
if (height > width)
|
||||
match_data->orientation = GTK_ORIENTATION_VERTICAL;
|
||||
else
|
||||
match_data->orientation = GTK_ORIENTATION_HORIZONTAL;
|
||||
}
|
||||
|
||||
match_data->flags |= THEME_MATCH_GAP_SIDE;
|
||||
match_data->gap_side = gap_side;
|
||||
|
||||
image = match_theme_image (style, match_data);
|
||||
if (image)
|
||||
{
|
||||
gint thickness;
|
||||
GdkRectangle r1, r2, r3;
|
||||
GdkPixbuf *pixbuf = NULL;
|
||||
guint components = COMPONENT_ALL;
|
||||
|
||||
if (!draw_center)
|
||||
components |= COMPONENT_CENTER;
|
||||
|
||||
if (image->gap_start)
|
||||
pixbuf = theme_pixbuf_get_pixbuf (image->gap_start);
|
||||
|
||||
switch (gap_side)
|
||||
{
|
||||
case GTK_POS_TOP:
|
||||
if (pixbuf)
|
||||
thickness = gdk_pixbuf_get_height (pixbuf);
|
||||
else
|
||||
thickness = style->ythickness;
|
||||
|
||||
if (!draw_center)
|
||||
components |= COMPONENT_NORTH_WEST | COMPONENT_NORTH | COMPONENT_NORTH_EAST;
|
||||
|
||||
r1.x = x;
|
||||
r1.y = y;
|
||||
r1.width = gap_x;
|
||||
r1.height = thickness;
|
||||
r2.x = x + gap_x;
|
||||
r2.y = y;
|
||||
r2.width = gap_width;
|
||||
r2.height = thickness;
|
||||
r3.x = x + gap_x + gap_width;
|
||||
r3.y = y;
|
||||
r3.width = width - (gap_x + gap_width);
|
||||
r3.height = thickness;
|
||||
break;
|
||||
|
||||
case GTK_POS_BOTTOM:
|
||||
if (pixbuf)
|
||||
thickness = gdk_pixbuf_get_height (pixbuf);
|
||||
else
|
||||
thickness = style->ythickness;
|
||||
|
||||
if (!draw_center)
|
||||
components |= COMPONENT_SOUTH_WEST | COMPONENT_SOUTH | COMPONENT_SOUTH_EAST;
|
||||
|
||||
r1.x = x;
|
||||
r1.y = y + height - thickness;
|
||||
r1.width = gap_x;
|
||||
r1.height = thickness;
|
||||
r2.x = x + gap_x;
|
||||
r2.y = y + height - thickness;
|
||||
r2.width = gap_width;
|
||||
r2.height = thickness;
|
||||
r3.x = x + gap_x + gap_width;
|
||||
r3.y = y + height - thickness;
|
||||
r3.width = width - (gap_x + gap_width);
|
||||
r3.height = thickness;
|
||||
break;
|
||||
|
||||
case GTK_POS_LEFT:
|
||||
if (pixbuf)
|
||||
thickness = gdk_pixbuf_get_width (pixbuf);
|
||||
else
|
||||
thickness = style->xthickness;
|
||||
|
||||
if (!draw_center)
|
||||
components |= COMPONENT_NORTH_WEST | COMPONENT_WEST | COMPONENT_SOUTH_WEST;
|
||||
|
||||
r1.x = x;
|
||||
r1.y = y;
|
||||
r1.width = thickness;
|
||||
r1.height = gap_x;
|
||||
r2.x = x;
|
||||
r2.y = y + gap_x;
|
||||
r2.width = thickness;
|
||||
r2.height = gap_width;
|
||||
r3.x = x;
|
||||
r3.y = y + gap_x + gap_width;
|
||||
r3.width = thickness;
|
||||
r3.height = height - (gap_x + gap_width);
|
||||
break;
|
||||
|
||||
case GTK_POS_RIGHT:
|
||||
if (pixbuf)
|
||||
thickness = gdk_pixbuf_get_width (pixbuf);
|
||||
else
|
||||
thickness = style->xthickness;
|
||||
|
||||
if (!draw_center)
|
||||
components |= COMPONENT_NORTH_EAST | COMPONENT_EAST | COMPONENT_SOUTH_EAST;
|
||||
|
||||
r1.x = x + width - thickness;
|
||||
r1.y = y;
|
||||
r1.width = thickness;
|
||||
r1.height = gap_x;
|
||||
r2.x = x + width - thickness;
|
||||
r2.y = y + gap_x;
|
||||
r2.width = thickness;
|
||||
r2.height = gap_width;
|
||||
r3.x = x + width - thickness;
|
||||
r3.y = y + gap_x + gap_width;
|
||||
r3.width = thickness;
|
||||
r3.height = height - (gap_x + gap_width);
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
if (image->background)
|
||||
theme_pixbuf_render (image->background,
|
||||
cr, components, FALSE,
|
||||
x, y, width, height);
|
||||
if (image->gap_start)
|
||||
theme_pixbuf_render (image->gap_start,
|
||||
cr, COMPONENT_ALL, FALSE,
|
||||
r1.x, r1.y, r1.width, r1.height);
|
||||
if (image->gap)
|
||||
theme_pixbuf_render (image->gap,
|
||||
cr, COMPONENT_ALL, FALSE,
|
||||
r2.x, r2.y, r2.width, r2.height);
|
||||
if (image->gap_end)
|
||||
theme_pixbuf_render (image->gap_end,
|
||||
cr, COMPONENT_ALL, FALSE,
|
||||
r3.x, r3.y, r3.width, r3.height);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
draw_hline (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x1,
|
||||
gint x2,
|
||||
gint y)
|
||||
{
|
||||
ThemeImage *image;
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_HLINE;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_ORIENTATION | THEME_MATCH_STATE;
|
||||
match_data.state = state;
|
||||
match_data.orientation = GTK_ORIENTATION_HORIZONTAL;
|
||||
|
||||
image = match_theme_image (style, &match_data);
|
||||
if (image)
|
||||
{
|
||||
if (image->background)
|
||||
theme_pixbuf_render (image->background,
|
||||
cr, COMPONENT_ALL, FALSE,
|
||||
x1, y, (x2 - x1) + 1, 2);
|
||||
}
|
||||
else
|
||||
parent_class->draw_hline (style, cr, state, widget, detail,
|
||||
x1, x2, y);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_vline (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint y1,
|
||||
gint y2,
|
||||
gint x)
|
||||
{
|
||||
ThemeImage *image;
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_VLINE;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_ORIENTATION | THEME_MATCH_STATE;
|
||||
match_data.state = state;
|
||||
match_data.orientation = GTK_ORIENTATION_VERTICAL;
|
||||
|
||||
image = match_theme_image (style, &match_data);
|
||||
if (image)
|
||||
{
|
||||
if (image->background)
|
||||
theme_pixbuf_render (image->background,
|
||||
cr, COMPONENT_ALL, FALSE,
|
||||
x, y1, 2, (y2 - y1) + 1);
|
||||
}
|
||||
else
|
||||
parent_class->draw_vline (style, cr, state, widget, detail,
|
||||
y1, y2, x);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_shadow(GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_SHADOW;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, FALSE, FALSE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_shadow (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
/* This function makes up for some brokeness in gtkrange.c
|
||||
* where we never get the full arrow of the stepper button
|
||||
* and the type of button in a single drawing function.
|
||||
*
|
||||
* It doesn't work correctly when the scrollbar is squished
|
||||
* to the point we don't have room for full-sized steppers.
|
||||
*/
|
||||
static void
|
||||
reverse_engineer_stepper_box (GtkWidget *range,
|
||||
GtkArrowType arrow_type,
|
||||
gint *x,
|
||||
gint *y,
|
||||
gint *width,
|
||||
gint *height)
|
||||
{
|
||||
gint slider_width = 14, stepper_size = 14;
|
||||
gint box_width;
|
||||
gint box_height;
|
||||
|
||||
if (range && GTK_IS_RANGE (range))
|
||||
{
|
||||
gtk_widget_style_get (range,
|
||||
"slider_width", &slider_width,
|
||||
"stepper_size", &stepper_size,
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (arrow_type == GTK_ARROW_UP || arrow_type == GTK_ARROW_DOWN)
|
||||
{
|
||||
box_width = slider_width;
|
||||
box_height = stepper_size;
|
||||
}
|
||||
else
|
||||
{
|
||||
box_width = stepper_size;
|
||||
box_height = slider_width;
|
||||
}
|
||||
|
||||
*x = *x - (box_width - *width) / 2;
|
||||
*y = *y - (box_height - *height) / 2;
|
||||
*width = box_width;
|
||||
*height = box_height;
|
||||
}
|
||||
|
||||
static void
|
||||
draw_arrow (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
GtkArrowType arrow_direction,
|
||||
gint fill,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
if (detail &&
|
||||
(strcmp (detail, "hscrollbar") == 0 || strcmp (detail, "vscrollbar") == 0))
|
||||
{
|
||||
/* This is a hack to work around the fact that scrollbar steppers are drawn
|
||||
* as a box + arrow, so we never have
|
||||
*
|
||||
* The full bounding box of the scrollbar
|
||||
* The arrow direction
|
||||
*
|
||||
* At the same time. We simulate an extra paint function, "STEPPER", by doing
|
||||
* nothing for the box, and then here, reverse engineering the box that
|
||||
* was passed to draw box and using that
|
||||
*/
|
||||
gint box_x = x;
|
||||
gint box_y = y;
|
||||
gint box_width = width;
|
||||
gint box_height = height;
|
||||
|
||||
reverse_engineer_stepper_box (widget, arrow_direction,
|
||||
&box_x, &box_y, &box_width, &box_height);
|
||||
|
||||
match_data.function = TOKEN_D_STEPPER;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = (THEME_MATCH_SHADOW |
|
||||
THEME_MATCH_STATE |
|
||||
THEME_MATCH_ARROW_DIRECTION);
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
match_data.arrow_direction = arrow_direction;
|
||||
|
||||
if (draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
box_x, box_y, box_width, box_height))
|
||||
{
|
||||
/* The theme included stepper images, we're done */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Otherwise, draw the full box, and fall through to draw the arrow
|
||||
*/
|
||||
match_data.function = TOKEN_D_BOX;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
box_x, box_y, box_width, box_height))
|
||||
parent_class->draw_box (style, cr, state, shadow, widget, detail,
|
||||
box_x, box_y, box_width, box_height);
|
||||
}
|
||||
|
||||
|
||||
match_data.function = TOKEN_D_ARROW;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = (THEME_MATCH_SHADOW |
|
||||
THEME_MATCH_STATE |
|
||||
THEME_MATCH_ARROW_DIRECTION);
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
match_data.arrow_direction = arrow_direction;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_arrow (style, cr, state, shadow, widget, detail,
|
||||
arrow_direction, fill, x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_diamond (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_DIAMOND;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_diamond (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_box (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
if (detail &&
|
||||
(strcmp (detail, "hscrollbar") == 0 || strcmp (detail, "vscrollbar") == 0))
|
||||
{
|
||||
/* We handle this in draw_arrow */
|
||||
return;
|
||||
}
|
||||
|
||||
match_data.function = TOKEN_D_BOX;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height)) {
|
||||
parent_class->draw_box (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
draw_flat_box (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_FLAT_BOX;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_flat_box (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_check (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_CHECK;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_check (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_option (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_OPTION;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_option (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_tab (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_TAB;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_tab (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_shadow_gap (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height,
|
||||
GtkPositionType gap_side,
|
||||
gint gap_x,
|
||||
gint gap_width)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_SHADOW_GAP;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.flags = (THEME_MATCH_SHADOW |
|
||||
THEME_MATCH_STATE |
|
||||
THEME_MATCH_ORIENTATION);
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_gap_image (style, cr, widget, &match_data, FALSE,
|
||||
x, y, width, height, gap_side, gap_x, gap_width))
|
||||
parent_class->draw_shadow_gap (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height, gap_side, gap_x, gap_width);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_box_gap (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height,
|
||||
GtkPositionType gap_side,
|
||||
gint gap_x,
|
||||
gint gap_width)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_BOX_GAP;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE;
|
||||
match_data.flags = (THEME_MATCH_SHADOW |
|
||||
THEME_MATCH_STATE |
|
||||
THEME_MATCH_ORIENTATION);
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
|
||||
if (!draw_gap_image (style, cr, widget, &match_data, TRUE,
|
||||
x, y, width, height, gap_side, gap_x, gap_width))
|
||||
parent_class->draw_box_gap (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height, gap_side, gap_x, gap_width);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_extension (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height,
|
||||
GtkPositionType gap_side)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_EXTENSION;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = THEME_MATCH_SHADOW | THEME_MATCH_STATE | THEME_MATCH_GAP_SIDE;
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
match_data.gap_side = gap_side;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_extension (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height, gap_side);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_focus (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state_type,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_FOCUS;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = 0;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, FALSE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_focus (style, cr, state_type, widget, detail,
|
||||
x, y, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_slider (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height,
|
||||
GtkOrientation orientation)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_SLIDER;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = (THEME_MATCH_SHADOW |
|
||||
THEME_MATCH_STATE |
|
||||
THEME_MATCH_ORIENTATION);
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
match_data.orientation = orientation;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_slider (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height, orientation);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
draw_handle (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkShadowType shadow,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height,
|
||||
GtkOrientation orientation)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_HANDLE;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = (THEME_MATCH_SHADOW |
|
||||
THEME_MATCH_STATE |
|
||||
THEME_MATCH_ORIENTATION);
|
||||
match_data.shadow = shadow;
|
||||
match_data.state = state;
|
||||
match_data.orientation = orientation;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_handle (style, cr, state, shadow, widget, detail,
|
||||
x, y, width, height, orientation);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_expander (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
gint x,
|
||||
gint y,
|
||||
GtkExpanderStyle expander_style)
|
||||
{
|
||||
#define DEFAULT_EXPANDER_SIZE 12
|
||||
|
||||
ThemeMatchData match_data;
|
||||
gint expander_size;
|
||||
gint radius;
|
||||
|
||||
if (widget &&
|
||||
gtk_widget_class_find_style_property (GTK_WIDGET_GET_CLASS (widget),
|
||||
"expander-size"))
|
||||
{
|
||||
gtk_widget_style_get (widget,
|
||||
"expander-size", &expander_size,
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
expander_size = DEFAULT_EXPANDER_SIZE;
|
||||
|
||||
radius = expander_size/2;
|
||||
|
||||
match_data.function = TOKEN_D_EXPANDER;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = (THEME_MATCH_STATE |
|
||||
THEME_MATCH_EXPANDER_STYLE);
|
||||
match_data.state = state;
|
||||
match_data.expander_style = expander_style;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x - radius, y - radius, expander_size, expander_size))
|
||||
parent_class->draw_expander (style, cr, state, widget, detail,
|
||||
x, y, expander_style);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_resize_grip (GtkStyle *style,
|
||||
cairo_t *cr,
|
||||
GtkStateType state,
|
||||
GtkWidget *widget,
|
||||
const gchar *detail,
|
||||
GdkWindowEdge edge,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
ThemeMatchData match_data;
|
||||
|
||||
match_data.function = TOKEN_D_RESIZE_GRIP;
|
||||
match_data.detail = (gchar *)detail;
|
||||
match_data.flags = (THEME_MATCH_STATE |
|
||||
THEME_MATCH_WINDOW_EDGE);
|
||||
match_data.state = state;
|
||||
match_data.window_edge = edge;
|
||||
|
||||
if (!draw_simple_image (style, cr, widget, &match_data, TRUE, TRUE,
|
||||
x, y, width, height))
|
||||
parent_class->draw_resize_grip (style, cr, state, widget, detail,
|
||||
edge, x, y, width, height);
|
||||
}
|
||||
|
||||
GType pixbuf_type_style = 0;
|
||||
|
||||
void
|
||||
pixbuf_style_register_type (GTypeModule *module)
|
||||
{
|
||||
const GTypeInfo object_info =
|
||||
{
|
||||
sizeof (PixbufStyleClass),
|
||||
(GBaseInitFunc) NULL,
|
||||
(GBaseFinalizeFunc) NULL,
|
||||
(GClassInitFunc) pixbuf_style_class_init,
|
||||
NULL, /* class_finalize */
|
||||
NULL, /* class_data */
|
||||
sizeof (PixbufStyle),
|
||||
0, /* n_preallocs */
|
||||
(GInstanceInitFunc) pixbuf_style_init,
|
||||
};
|
||||
|
||||
pixbuf_type_style = g_type_module_register_type (module,
|
||||
GTK_TYPE_STYLE,
|
||||
"PixbufStyle",
|
||||
&object_info, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
pixbuf_style_init (PixbufStyle *style)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
pixbuf_style_class_init (PixbufStyleClass *klass)
|
||||
{
|
||||
GtkStyleClass *style_class = GTK_STYLE_CLASS (klass);
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
style_class->draw_hline = draw_hline;
|
||||
style_class->draw_vline = draw_vline;
|
||||
style_class->draw_shadow = draw_shadow;
|
||||
style_class->draw_arrow = draw_arrow;
|
||||
style_class->draw_diamond = draw_diamond;
|
||||
style_class->draw_box = draw_box;
|
||||
style_class->draw_flat_box = draw_flat_box;
|
||||
style_class->draw_check = draw_check;
|
||||
style_class->draw_option = draw_option;
|
||||
style_class->draw_tab = draw_tab;
|
||||
style_class->draw_shadow_gap = draw_shadow_gap;
|
||||
style_class->draw_box_gap = draw_box_gap;
|
||||
style_class->draw_extension = draw_extension;
|
||||
style_class->draw_focus = draw_focus;
|
||||
style_class->draw_slider = draw_slider;
|
||||
style_class->draw_handle = draw_handle;
|
||||
style_class->draw_expander = draw_expander;
|
||||
style_class->draw_resize_grip = draw_resize_grip;
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include "pixbuf.h"
|
||||
#include "pixbuf-style.h"
|
||||
#include "pixbuf-rc-style.h"
|
||||
#include <gmodule.h>
|
||||
|
||||
G_MODULE_EXPORT void
|
||||
theme_init (GTypeModule *module)
|
||||
{
|
||||
pixbuf_rc_style_register_type (module);
|
||||
pixbuf_style_register_type (module);
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT void
|
||||
theme_exit (void)
|
||||
{
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT GtkRcStyle *
|
||||
theme_create_rc_style (void)
|
||||
{
|
||||
return g_object_new (PIXBUF_TYPE_RC_STYLE, NULL);
|
||||
}
|
||||
|
||||
/* The following function will be called by GTK+ when the module
|
||||
* is loaded and checks to see if we are compatible with the
|
||||
* version of GTK+ that loads us.
|
||||
*/
|
||||
G_MODULE_EXPORT const gchar* g_module_check_init (GModule *module);
|
||||
const gchar*
|
||||
g_module_check_init (GModule *module)
|
||||
{
|
||||
return gtk_check_version (GTK_MAJOR_VERSION,
|
||||
GTK_MINOR_VERSION,
|
||||
GTK_MICRO_VERSION - GTK_INTERFACE_AGE);
|
||||
}
|
@ -1,908 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include "pixbuf.h"
|
||||
#include "pixbuf-style.h"
|
||||
#include "pixbuf-rc-style.h"
|
||||
|
||||
static void pixbuf_rc_style_init (PixbufRcStyle *style);
|
||||
static void pixbuf_rc_style_class_init (PixbufRcStyleClass *klass);
|
||||
static void pixbuf_rc_style_finalize (GObject *object);
|
||||
static guint pixbuf_rc_style_parse (GtkRcStyle *rc_style,
|
||||
GtkSettings *settings,
|
||||
GScanner *scanner);
|
||||
static void pixbuf_rc_style_merge (GtkRcStyle *dest,
|
||||
GtkRcStyle *src);
|
||||
static GtkStyle *pixbuf_rc_style_create_style (GtkRcStyle *rc_style);
|
||||
|
||||
static void theme_image_unref (ThemeImage *data);
|
||||
|
||||
static const struct
|
||||
{
|
||||
gchar *name;
|
||||
guint token;
|
||||
}
|
||||
theme_symbols[] =
|
||||
{
|
||||
{ "image", TOKEN_IMAGE },
|
||||
{ "function", TOKEN_FUNCTION },
|
||||
{ "file", TOKEN_FILE },
|
||||
{ "stretch", TOKEN_STRETCH },
|
||||
{ "recolorable", TOKEN_RECOLORABLE },
|
||||
{ "border", TOKEN_BORDER },
|
||||
{ "detail", TOKEN_DETAIL },
|
||||
{ "state", TOKEN_STATE },
|
||||
{ "shadow", TOKEN_SHADOW },
|
||||
{ "gap_side", TOKEN_GAP_SIDE },
|
||||
{ "gap_file", TOKEN_GAP_FILE },
|
||||
{ "gap_border", TOKEN_GAP_BORDER },
|
||||
{ "gap_start_file", TOKEN_GAP_START_FILE },
|
||||
{ "gap_start_border", TOKEN_GAP_START_BORDER },
|
||||
{ "gap_end_file", TOKEN_GAP_END_FILE },
|
||||
{ "gap_end_border", TOKEN_GAP_END_BORDER },
|
||||
{ "overlay_file", TOKEN_OVERLAY_FILE },
|
||||
{ "overlay_border", TOKEN_OVERLAY_BORDER },
|
||||
{ "overlay_stretch", TOKEN_OVERLAY_STRETCH },
|
||||
{ "arrow_direction", TOKEN_ARROW_DIRECTION },
|
||||
{ "orientation", TOKEN_ORIENTATION },
|
||||
{ "expander_style", TOKEN_EXPANDER_STYLE },
|
||||
{ "window_edge", TOKEN_WINDOW_EDGE },
|
||||
|
||||
{ "HLINE", TOKEN_D_HLINE },
|
||||
{ "VLINE", TOKEN_D_VLINE },
|
||||
{ "SHADOW", TOKEN_D_SHADOW },
|
||||
{ "POLYGON", TOKEN_D_POLYGON },
|
||||
{ "ARROW", TOKEN_D_ARROW },
|
||||
{ "DIAMOND", TOKEN_D_DIAMOND },
|
||||
{ "OVAL", TOKEN_D_OVAL },
|
||||
{ "STRING", TOKEN_D_STRING },
|
||||
{ "BOX", TOKEN_D_BOX },
|
||||
{ "FLAT_BOX", TOKEN_D_FLAT_BOX },
|
||||
{ "CHECK", TOKEN_D_CHECK },
|
||||
{ "OPTION", TOKEN_D_OPTION },
|
||||
{ "CROSS", TOKEN_D_CROSS },
|
||||
{ "RAMP", TOKEN_D_RAMP },
|
||||
{ "TAB", TOKEN_D_TAB },
|
||||
{ "SHADOW_GAP", TOKEN_D_SHADOW_GAP },
|
||||
{ "BOX_GAP", TOKEN_D_BOX_GAP },
|
||||
{ "EXTENSION", TOKEN_D_EXTENSION },
|
||||
{ "FOCUS", TOKEN_D_FOCUS },
|
||||
{ "SLIDER", TOKEN_D_SLIDER },
|
||||
{ "ENTRY", TOKEN_D_ENTRY },
|
||||
{ "HANDLE", TOKEN_D_HANDLE },
|
||||
{ "STEPPER", TOKEN_D_STEPPER },
|
||||
{ "EXPANDER", TOKEN_D_EXPANDER },
|
||||
{ "RESIZE_GRIP", TOKEN_D_RESIZE_GRIP },
|
||||
|
||||
{ "TRUE", TOKEN_TRUE },
|
||||
{ "FALSE", TOKEN_FALSE },
|
||||
|
||||
{ "TOP", TOKEN_TOP },
|
||||
{ "UP", TOKEN_UP },
|
||||
{ "BOTTOM", TOKEN_BOTTOM },
|
||||
{ "DOWN", TOKEN_DOWN },
|
||||
{ "LEFT", TOKEN_LEFT },
|
||||
{ "RIGHT", TOKEN_RIGHT },
|
||||
|
||||
{ "NORMAL", TOKEN_NORMAL },
|
||||
{ "ACTIVE", TOKEN_ACTIVE },
|
||||
{ "PRELIGHT", TOKEN_PRELIGHT },
|
||||
{ "SELECTED", TOKEN_SELECTED },
|
||||
{ "INSENSITIVE", TOKEN_INSENSITIVE },
|
||||
|
||||
{ "NONE", TOKEN_NONE },
|
||||
{ "IN", TOKEN_IN },
|
||||
{ "OUT", TOKEN_OUT },
|
||||
{ "ETCHED_IN", TOKEN_ETCHED_IN },
|
||||
{ "ETCHED_OUT", TOKEN_ETCHED_OUT },
|
||||
|
||||
{ "HORIZONTAL", TOKEN_HORIZONTAL },
|
||||
{ "VERTICAL", TOKEN_VERTICAL },
|
||||
|
||||
{ "COLLAPSED", TOKEN_COLLAPSED },
|
||||
{ "SEMI_COLLAPSED", TOKEN_SEMI_COLLAPSED },
|
||||
{ "SEMI_EXPANDED", TOKEN_SEMI_EXPANDED },
|
||||
{ "EXPANDED", TOKEN_EXPANDED },
|
||||
|
||||
{ "NORTH_WEST", TOKEN_NORTH_WEST },
|
||||
{ "NORTH", TOKEN_NORTH },
|
||||
{ "NORTH_EAST", TOKEN_NORTH_EAST },
|
||||
{ "WEST", TOKEN_WEST },
|
||||
{ "EAST", TOKEN_EAST },
|
||||
{ "SOUTH_WEST", TOKEN_SOUTH_WEST },
|
||||
{ "SOUTH", TOKEN_SOUTH },
|
||||
{ "SOUTH_EAST", TOKEN_SOUTH_EAST }
|
||||
};
|
||||
|
||||
static GtkRcStyleClass *parent_class;
|
||||
|
||||
GType pixbuf_type_rc_style = 0;
|
||||
|
||||
void
|
||||
pixbuf_rc_style_register_type (GTypeModule *module)
|
||||
{
|
||||
const GTypeInfo object_info =
|
||||
{
|
||||
sizeof (PixbufRcStyleClass),
|
||||
(GBaseInitFunc) NULL,
|
||||
(GBaseFinalizeFunc) NULL,
|
||||
(GClassInitFunc) pixbuf_rc_style_class_init,
|
||||
NULL, /* class_finalize */
|
||||
NULL, /* class_data */
|
||||
sizeof (PixbufRcStyle),
|
||||
0, /* n_preallocs */
|
||||
(GInstanceInitFunc) pixbuf_rc_style_init,
|
||||
};
|
||||
|
||||
pixbuf_type_rc_style = g_type_module_register_type (module,
|
||||
GTK_TYPE_RC_STYLE,
|
||||
"PixbufRcStyle",
|
||||
&object_info, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
pixbuf_rc_style_init (PixbufRcStyle *style)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
pixbuf_rc_style_class_init (PixbufRcStyleClass *klass)
|
||||
{
|
||||
GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
rc_style_class->parse = pixbuf_rc_style_parse;
|
||||
rc_style_class->merge = pixbuf_rc_style_merge;
|
||||
rc_style_class->create_style = pixbuf_rc_style_create_style;
|
||||
|
||||
object_class->finalize = pixbuf_rc_style_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
pixbuf_rc_style_finalize (GObject *object)
|
||||
{
|
||||
PixbufRcStyle *rc_style = PIXBUF_RC_STYLE (object);
|
||||
|
||||
g_list_free_full (rc_style->img_list, theme_image_unref);
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_file(GtkSettings *settings,
|
||||
GScanner *scanner,
|
||||
ThemePixbuf **theme_pb)
|
||||
{
|
||||
guint token;
|
||||
gchar *pixmap;
|
||||
|
||||
/* Skip 'blah_file' */
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_STRING)
|
||||
return G_TOKEN_STRING;
|
||||
|
||||
if (!*theme_pb)
|
||||
*theme_pb = theme_pixbuf_new ();
|
||||
|
||||
pixmap = gtk_rc_find_pixmap_in_path(settings, scanner, scanner->value.v_string);
|
||||
if (pixmap)
|
||||
{
|
||||
theme_pixbuf_set_filename (*theme_pb, pixmap);
|
||||
g_free (pixmap);
|
||||
}
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_border (GScanner *scanner,
|
||||
ThemePixbuf **theme_pb)
|
||||
{
|
||||
guint token;
|
||||
gint left, right, top, bottom;
|
||||
|
||||
/* Skip 'blah_border' */
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_LEFT_CURLY)
|
||||
return G_TOKEN_LEFT_CURLY;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_INT)
|
||||
return G_TOKEN_INT;
|
||||
left = scanner->value.v_int;
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_COMMA)
|
||||
return G_TOKEN_COMMA;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_INT)
|
||||
return G_TOKEN_INT;
|
||||
right = scanner->value.v_int;
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_COMMA)
|
||||
return G_TOKEN_COMMA;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_INT)
|
||||
return G_TOKEN_INT;
|
||||
top = scanner->value.v_int;
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_COMMA)
|
||||
return G_TOKEN_COMMA;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_INT)
|
||||
return G_TOKEN_INT;
|
||||
bottom = scanner->value.v_int;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_RIGHT_CURLY)
|
||||
return G_TOKEN_RIGHT_CURLY;
|
||||
|
||||
if (!*theme_pb)
|
||||
*theme_pb = theme_pixbuf_new ();
|
||||
|
||||
theme_pixbuf_set_border (*theme_pb, left, right, top, bottom);
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_stretch(GScanner *scanner,
|
||||
ThemePixbuf **theme_pb)
|
||||
{
|
||||
guint token;
|
||||
gboolean stretch;
|
||||
|
||||
/* Skip 'blah_stretch' */
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_TRUE)
|
||||
stretch = TRUE;
|
||||
else if (token == TOKEN_FALSE)
|
||||
stretch = FALSE;
|
||||
else
|
||||
return TOKEN_TRUE;
|
||||
|
||||
if (!*theme_pb)
|
||||
*theme_pb = theme_pixbuf_new ();
|
||||
|
||||
theme_pixbuf_set_stretch (*theme_pb, stretch);
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_recolorable(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_RECOLORABLE)
|
||||
return TOKEN_RECOLORABLE;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_TRUE)
|
||||
data->recolorable = 1;
|
||||
else if (token == TOKEN_FALSE)
|
||||
data->recolorable = 0;
|
||||
else
|
||||
return TOKEN_TRUE;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_function(GScanner * scanner,
|
||||
ThemeImage *data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_FUNCTION)
|
||||
return TOKEN_FUNCTION;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if ((token >= TOKEN_D_HLINE) && (token <= TOKEN_D_RESIZE_GRIP))
|
||||
data->match_data.function = token;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_detail(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_DETAIL)
|
||||
return TOKEN_DETAIL;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_STRING)
|
||||
return G_TOKEN_STRING;
|
||||
|
||||
g_free (data->match_data.detail);
|
||||
|
||||
data->match_data.detail = g_strdup(scanner->value.v_string);
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_state(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_STATE)
|
||||
return TOKEN_STATE;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_NORMAL)
|
||||
data->match_data.state = GTK_STATE_NORMAL;
|
||||
else if (token == TOKEN_ACTIVE)
|
||||
data->match_data.state = GTK_STATE_ACTIVE;
|
||||
else if (token == TOKEN_PRELIGHT)
|
||||
data->match_data.state = GTK_STATE_PRELIGHT;
|
||||
else if (token == TOKEN_SELECTED)
|
||||
data->match_data.state = GTK_STATE_SELECTED;
|
||||
else if (token == TOKEN_INSENSITIVE)
|
||||
data->match_data.state = GTK_STATE_INSENSITIVE;
|
||||
else
|
||||
return TOKEN_NORMAL;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_STATE;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_shadow(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_SHADOW)
|
||||
return TOKEN_SHADOW;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_NONE)
|
||||
data->match_data.shadow = GTK_SHADOW_NONE;
|
||||
else if (token == TOKEN_IN)
|
||||
data->match_data.shadow = GTK_SHADOW_IN;
|
||||
else if (token == TOKEN_OUT)
|
||||
data->match_data.shadow = GTK_SHADOW_OUT;
|
||||
else if (token == TOKEN_ETCHED_IN)
|
||||
data->match_data.shadow = GTK_SHADOW_ETCHED_IN;
|
||||
else if (token == TOKEN_ETCHED_OUT)
|
||||
data->match_data.shadow = GTK_SHADOW_ETCHED_OUT;
|
||||
else
|
||||
return TOKEN_NONE;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_SHADOW;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_arrow_direction(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_ARROW_DIRECTION)
|
||||
return TOKEN_ARROW_DIRECTION;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_UP)
|
||||
data->match_data.arrow_direction = GTK_ARROW_UP;
|
||||
else if (token == TOKEN_DOWN)
|
||||
data->match_data.arrow_direction = GTK_ARROW_DOWN;
|
||||
else if (token == TOKEN_LEFT)
|
||||
data->match_data.arrow_direction = GTK_ARROW_LEFT;
|
||||
else if (token == TOKEN_RIGHT)
|
||||
data->match_data.arrow_direction = GTK_ARROW_RIGHT;
|
||||
else
|
||||
return TOKEN_UP;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_ARROW_DIRECTION;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_gap_side(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_GAP_SIDE)
|
||||
return TOKEN_GAP_SIDE;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
|
||||
if (token == TOKEN_TOP)
|
||||
data->match_data.gap_side = GTK_POS_TOP;
|
||||
else if (token == TOKEN_BOTTOM)
|
||||
data->match_data.gap_side = GTK_POS_BOTTOM;
|
||||
else if (token == TOKEN_LEFT)
|
||||
data->match_data.gap_side = GTK_POS_LEFT;
|
||||
else if (token == TOKEN_RIGHT)
|
||||
data->match_data.gap_side = GTK_POS_RIGHT;
|
||||
else
|
||||
return TOKEN_TOP;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_GAP_SIDE;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_orientation(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_ORIENTATION)
|
||||
return TOKEN_ORIENTATION;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
|
||||
if (token == TOKEN_HORIZONTAL)
|
||||
data->match_data.orientation = GTK_ORIENTATION_HORIZONTAL;
|
||||
else if (token == TOKEN_VERTICAL)
|
||||
data->match_data.orientation = GTK_ORIENTATION_VERTICAL;
|
||||
else
|
||||
return TOKEN_HORIZONTAL;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_ORIENTATION;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_expander_style(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_EXPANDER_STYLE)
|
||||
return TOKEN_EXPANDER_STYLE;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_COLLAPSED)
|
||||
data->match_data.expander_style = GTK_EXPANDER_COLLAPSED;
|
||||
else if (token == TOKEN_SEMI_COLLAPSED)
|
||||
data->match_data.expander_style = GTK_EXPANDER_SEMI_COLLAPSED;
|
||||
else if (token == TOKEN_SEMI_EXPANDED)
|
||||
data->match_data.expander_style = GTK_EXPANDER_SEMI_EXPANDED;
|
||||
else if (token == TOKEN_EXPANDED)
|
||||
data->match_data.expander_style = GTK_EXPANDER_EXPANDED;
|
||||
else
|
||||
return TOKEN_COLLAPSED;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_EXPANDER_STYLE;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_window_edge(GScanner * scanner,
|
||||
ThemeImage * data)
|
||||
{
|
||||
guint token;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_WINDOW_EDGE)
|
||||
return TOKEN_WINDOW_EDGE;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_EQUAL_SIGN)
|
||||
return G_TOKEN_EQUAL_SIGN;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token == TOKEN_NORTH_WEST)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH_WEST;
|
||||
else if (token == TOKEN_NORTH)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH;
|
||||
else if (token == TOKEN_NORTH_EAST)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_NORTH_EAST;
|
||||
else if (token == TOKEN_WEST)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_WEST;
|
||||
else if (token == TOKEN_EAST)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_EAST;
|
||||
else if (token == TOKEN_SOUTH_WEST)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH_WEST;
|
||||
else if (token == TOKEN_SOUTH)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH;
|
||||
else if (token == TOKEN_SOUTH_EAST)
|
||||
data->match_data.window_edge = GDK_WINDOW_EDGE_SOUTH_EAST;
|
||||
else
|
||||
return TOKEN_NORTH_WEST;
|
||||
|
||||
data->match_data.flags |= THEME_MATCH_WINDOW_EDGE;
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
theme_image_ref (ThemeImage *data)
|
||||
{
|
||||
data->refcount++;
|
||||
}
|
||||
|
||||
static void
|
||||
theme_image_unref (ThemeImage *data)
|
||||
{
|
||||
data->refcount--;
|
||||
if (data->refcount == 0)
|
||||
{
|
||||
g_free (data->match_data.detail);
|
||||
theme_pixbuf_destroy (data->background);
|
||||
theme_pixbuf_destroy (data->overlay);
|
||||
theme_pixbuf_destroy (data->gap_start);
|
||||
theme_pixbuf_destroy (data->gap_end);
|
||||
theme_pixbuf_destroy (data->gap);
|
||||
g_free (data);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
clear_theme_pixbuf_and_warn (ThemePixbuf **theme_pb,
|
||||
GScanner *scanner,
|
||||
const char *message)
|
||||
{
|
||||
theme_clear_pixbuf (theme_pb);
|
||||
g_scanner_warn (scanner, message);
|
||||
}
|
||||
|
||||
static guint
|
||||
theme_parse_image(GtkSettings *settings,
|
||||
GScanner *scanner,
|
||||
PixbufRcStyle *pixbuf_style,
|
||||
ThemeImage **data_return)
|
||||
{
|
||||
guint token;
|
||||
ThemeImage *data;
|
||||
|
||||
data = NULL;
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != TOKEN_IMAGE)
|
||||
return TOKEN_IMAGE;
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
if (token != G_TOKEN_LEFT_CURLY)
|
||||
return G_TOKEN_LEFT_CURLY;
|
||||
|
||||
data = g_malloc(sizeof(ThemeImage));
|
||||
|
||||
data->refcount = 1;
|
||||
|
||||
data->background = NULL;
|
||||
data->overlay = NULL;
|
||||
data->gap_start = NULL;
|
||||
data->gap = NULL;
|
||||
data->gap_end = NULL;
|
||||
|
||||
data->recolorable = FALSE;
|
||||
|
||||
data->match_data.function = 0;
|
||||
data->match_data.detail = NULL;
|
||||
data->match_data.flags = 0;
|
||||
|
||||
token = g_scanner_peek_next_token(scanner);
|
||||
while (token != G_TOKEN_RIGHT_CURLY)
|
||||
{
|
||||
switch (token)
|
||||
{
|
||||
case TOKEN_FUNCTION:
|
||||
token = theme_parse_function(scanner, data);
|
||||
break;
|
||||
case TOKEN_RECOLORABLE:
|
||||
token = theme_parse_recolorable(scanner, data);
|
||||
break;
|
||||
case TOKEN_DETAIL:
|
||||
token = theme_parse_detail(scanner, data);
|
||||
break;
|
||||
case TOKEN_STATE:
|
||||
token = theme_parse_state(scanner, data);
|
||||
break;
|
||||
case TOKEN_SHADOW:
|
||||
token = theme_parse_shadow(scanner, data);
|
||||
break;
|
||||
case TOKEN_GAP_SIDE:
|
||||
token = theme_parse_gap_side(scanner, data);
|
||||
break;
|
||||
case TOKEN_ARROW_DIRECTION:
|
||||
token = theme_parse_arrow_direction(scanner, data);
|
||||
break;
|
||||
case TOKEN_ORIENTATION:
|
||||
token = theme_parse_orientation(scanner, data);
|
||||
break;
|
||||
case TOKEN_FILE:
|
||||
token = theme_parse_file(settings, scanner, &data->background);
|
||||
break;
|
||||
case TOKEN_BORDER:
|
||||
token = theme_parse_border(scanner, &data->background);
|
||||
break;
|
||||
case TOKEN_STRETCH:
|
||||
token = theme_parse_stretch(scanner, &data->background);
|
||||
break;
|
||||
case TOKEN_GAP_FILE:
|
||||
token = theme_parse_file(settings, scanner, &data->gap);
|
||||
break;
|
||||
case TOKEN_GAP_BORDER:
|
||||
token = theme_parse_border(scanner, &data->gap);
|
||||
break;
|
||||
case TOKEN_GAP_START_FILE:
|
||||
token = theme_parse_file(settings, scanner, &data->gap_start);
|
||||
break;
|
||||
case TOKEN_GAP_START_BORDER:
|
||||
token = theme_parse_border(scanner, &data->gap_start);
|
||||
break;
|
||||
case TOKEN_GAP_END_FILE:
|
||||
token = theme_parse_file(settings, scanner, &data->gap_end);
|
||||
break;
|
||||
case TOKEN_GAP_END_BORDER:
|
||||
token = theme_parse_border(scanner, &data->gap_end);
|
||||
break;
|
||||
case TOKEN_OVERLAY_FILE:
|
||||
token = theme_parse_file(settings, scanner, &data->overlay);
|
||||
break;
|
||||
case TOKEN_OVERLAY_BORDER:
|
||||
token = theme_parse_border(scanner, &data->overlay);
|
||||
break;
|
||||
case TOKEN_OVERLAY_STRETCH:
|
||||
token = theme_parse_stretch(scanner, &data->overlay);
|
||||
break;
|
||||
case TOKEN_EXPANDER_STYLE:
|
||||
token = theme_parse_expander_style(scanner, data);
|
||||
break;
|
||||
case TOKEN_WINDOW_EDGE:
|
||||
token = theme_parse_window_edge(scanner, data);
|
||||
break;
|
||||
default:
|
||||
g_scanner_get_next_token(scanner);
|
||||
token = G_TOKEN_RIGHT_CURLY;
|
||||
break;
|
||||
}
|
||||
if (token != G_TOKEN_NONE)
|
||||
{
|
||||
/* error - cleanup for exit */
|
||||
theme_image_unref (data);
|
||||
*data_return = NULL;
|
||||
return token;
|
||||
}
|
||||
token = g_scanner_peek_next_token(scanner);
|
||||
}
|
||||
|
||||
token = g_scanner_get_next_token(scanner);
|
||||
|
||||
if (data->background && !data->background->filename)
|
||||
clear_theme_pixbuf_and_warn (&data->background, scanner, "Background image options specified without filename");
|
||||
|
||||
if (data->overlay && !data->overlay->filename)
|
||||
clear_theme_pixbuf_and_warn (&data->overlay, scanner, "Overlay image options specified without filename");
|
||||
|
||||
if (data->gap && !data->gap->filename)
|
||||
clear_theme_pixbuf_and_warn (&data->gap, scanner, "Gap image options specified without filename");
|
||||
|
||||
if (data->gap_start && !data->gap_start->filename)
|
||||
clear_theme_pixbuf_and_warn (&data->gap_start, scanner, "Gap start image options specified without filename");
|
||||
|
||||
if (data->gap_end && !data->gap_end->filename)
|
||||
clear_theme_pixbuf_and_warn (&data->gap_end, scanner, "Gap end image options specified without filename");
|
||||
|
||||
if (token != G_TOKEN_RIGHT_CURLY)
|
||||
{
|
||||
/* error - cleanup for exit */
|
||||
theme_image_unref (data);
|
||||
*data_return = NULL;
|
||||
return G_TOKEN_RIGHT_CURLY;
|
||||
}
|
||||
|
||||
/* everything is fine now - insert yer cruft */
|
||||
*data_return = data;
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static guint
|
||||
pixbuf_rc_style_parse (GtkRcStyle *rc_style,
|
||||
GtkSettings *settings,
|
||||
GScanner *scanner)
|
||||
|
||||
{
|
||||
static GQuark scope_id = 0;
|
||||
PixbufRcStyle *pixbuf_style = PIXBUF_RC_STYLE (rc_style);
|
||||
|
||||
guint old_scope;
|
||||
guint token;
|
||||
gint i;
|
||||
ThemeImage *img;
|
||||
|
||||
/* Set up a new scope in this scanner. */
|
||||
|
||||
if (!scope_id)
|
||||
scope_id = g_quark_from_string("pixbuf_theme_engine");
|
||||
|
||||
/* If we bail out due to errors, we *don't* reset the scope, so the
|
||||
* error messaging code can make sense of our tokens.
|
||||
*/
|
||||
old_scope = g_scanner_set_scope(scanner, scope_id);
|
||||
|
||||
/* Now check if we already added our symbols to this scope
|
||||
* (in some previous call to theme_parse_rc_style for the
|
||||
* same scanner.
|
||||
*/
|
||||
|
||||
if (!g_scanner_lookup_symbol(scanner, theme_symbols[0].name))
|
||||
{
|
||||
for (i = 0; i < G_N_ELEMENTS (theme_symbols); i++)
|
||||
g_scanner_scope_add_symbol(scanner, scope_id,
|
||||
theme_symbols[i].name,
|
||||
GINT_TO_POINTER(theme_symbols[i].token));
|
||||
}
|
||||
|
||||
/* We're ready to go, now parse the top level */
|
||||
|
||||
token = g_scanner_peek_next_token(scanner);
|
||||
while (token != G_TOKEN_RIGHT_CURLY)
|
||||
{
|
||||
switch (token)
|
||||
{
|
||||
case TOKEN_IMAGE:
|
||||
img = NULL;
|
||||
token = theme_parse_image(settings, scanner, pixbuf_style, &img);
|
||||
break;
|
||||
default:
|
||||
g_scanner_get_next_token(scanner);
|
||||
token = G_TOKEN_RIGHT_CURLY;
|
||||
break;
|
||||
}
|
||||
|
||||
if (token != G_TOKEN_NONE)
|
||||
return token;
|
||||
else
|
||||
pixbuf_style->img_list = g_list_append(pixbuf_style->img_list, img);
|
||||
|
||||
token = g_scanner_peek_next_token(scanner);
|
||||
}
|
||||
|
||||
g_scanner_get_next_token(scanner);
|
||||
|
||||
g_scanner_set_scope(scanner, old_scope);
|
||||
|
||||
return G_TOKEN_NONE;
|
||||
}
|
||||
|
||||
static void
|
||||
pixbuf_rc_style_merge (GtkRcStyle *dest,
|
||||
GtkRcStyle *src)
|
||||
{
|
||||
if (PIXBUF_IS_RC_STYLE (src))
|
||||
{
|
||||
PixbufRcStyle *pixbuf_dest = PIXBUF_RC_STYLE (dest);
|
||||
PixbufRcStyle *pixbuf_src = PIXBUF_RC_STYLE (src);
|
||||
GList *tmp_list1, *tmp_list2;
|
||||
|
||||
if (pixbuf_src->img_list)
|
||||
{
|
||||
/* Copy src image list and append to dest image list */
|
||||
|
||||
tmp_list2 = g_list_last (pixbuf_dest->img_list);
|
||||
tmp_list1 = pixbuf_src->img_list;
|
||||
|
||||
while (tmp_list1)
|
||||
{
|
||||
if (tmp_list2)
|
||||
{
|
||||
tmp_list2->next = g_list_alloc();
|
||||
tmp_list2->next->data = tmp_list1->data;
|
||||
tmp_list2->next->prev = tmp_list2;
|
||||
|
||||
tmp_list2 = tmp_list2->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
pixbuf_dest->img_list = g_list_append (NULL, tmp_list1->data);
|
||||
tmp_list2 = pixbuf_dest->img_list;
|
||||
}
|
||||
|
||||
theme_image_ref (tmp_list1->data);
|
||||
tmp_list1 = tmp_list1->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
parent_class->merge (dest, src);
|
||||
}
|
||||
|
||||
/* Create an empty style suitable to this RC style
|
||||
*/
|
||||
static GtkStyle *
|
||||
pixbuf_rc_style_create_style (GtkRcStyle *rc_style)
|
||||
{
|
||||
return g_object_new (PIXBUF_TYPE_STYLE, NULL);
|
||||
}
|
||||
|
@ -1,47 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
typedef struct _PixbufRcStyle PixbufRcStyle;
|
||||
typedef struct _PixbufRcStyleClass PixbufRcStyleClass;
|
||||
|
||||
extern G_GNUC_INTERNAL GType pixbuf_type_rc_style;
|
||||
|
||||
#define PIXBUF_TYPE_RC_STYLE pixbuf_type_rc_style
|
||||
#define PIXBUF_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PIXBUF_TYPE_RC_STYLE, PixbufRcStyle))
|
||||
#define PIXBUF_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIXBUF_TYPE_RC_STYLE, PixbufRcStyleClass))
|
||||
#define PIXBUF_IS_RC_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PIXBUF_TYPE_RC_STYLE))
|
||||
#define PIXBUF_IS_RC_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIXBUF_TYPE_RC_STYLE))
|
||||
#define PIXBUF_RC_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIXBUF_TYPE_RC_STYLE, PixbufRcStyleClass))
|
||||
|
||||
struct _PixbufRcStyle
|
||||
{
|
||||
GtkRcStyle parent_instance;
|
||||
|
||||
GList *img_list;
|
||||
};
|
||||
|
||||
struct _PixbufRcStyleClass
|
||||
{
|
||||
GtkRcStyleClass parent_class;
|
||||
};
|
||||
|
||||
G_GNUC_INTERNAL void pixbuf_rc_style_register_type (GTypeModule *module);
|
@ -1,870 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "pixbuf.h"
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
static GHashTable *pixbuf_cache = NULL;
|
||||
|
||||
static GdkPixbuf *
|
||||
bilinear_gradient (GdkPixbuf *src,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
guint n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
|
||||
guchar *src_pixels = gdk_pixbuf_get_pixels (src);
|
||||
guchar *p1, *p2, *p3, *p4;
|
||||
guint dest_rowstride;
|
||||
guchar *dest_pixels;
|
||||
GdkPixbuf *result;
|
||||
int i, j, k;
|
||||
|
||||
if (src_x == 0 || src_y == 0)
|
||||
{
|
||||
g_warning ("invalid source position for bilinear gradient");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
p1 = src_pixels + (src_y - 1) * src_rowstride + (src_x - 1) * n_channels;
|
||||
p2 = p1 + n_channels;
|
||||
p3 = src_pixels + src_y * src_rowstride + (src_x - 1) * n_channels;
|
||||
p4 = p3 + n_channels;
|
||||
|
||||
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
|
||||
width, height);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
g_warning ("failed to create a %dx%d pixbuf", width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dest_rowstride = gdk_pixbuf_get_rowstride (result);
|
||||
dest_pixels = gdk_pixbuf_get_pixels (result);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
guchar *p = dest_pixels + dest_rowstride *i;
|
||||
guint v[4];
|
||||
gint dv[4];
|
||||
|
||||
for (k = 0; k < n_channels; k++)
|
||||
{
|
||||
guint start = ((height - i) * p1[k] + (1 + i) * p3[k]) / (height + 1);
|
||||
guint end = ((height - i) * p2[k] + (1 + i) * p4[k]) / (height + 1);
|
||||
|
||||
dv[k] = (((gint)end - (gint)start) << 16) / (width + 1);
|
||||
v[k] = (start << 16) + dv[k] + 0x8000;
|
||||
}
|
||||
|
||||
for (j = width; j; j--)
|
||||
{
|
||||
for (k = 0; k < n_channels; k++)
|
||||
{
|
||||
*(p++) = v[k] >> 16;
|
||||
v[k] += dv[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
horizontal_gradient (GdkPixbuf *src,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
guint n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
|
||||
guchar *src_pixels = gdk_pixbuf_get_pixels (src);
|
||||
guint dest_rowstride;
|
||||
guchar *dest_pixels;
|
||||
GdkPixbuf *result;
|
||||
int i, j, k;
|
||||
|
||||
if (src_x == 0)
|
||||
{
|
||||
g_warning ("invalid source position for horizontal gradient");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
|
||||
width, height);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
g_warning ("failed to create a %dx%d pixbuf", width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dest_rowstride = gdk_pixbuf_get_rowstride (result);
|
||||
dest_pixels = gdk_pixbuf_get_pixels (result);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
guchar *p = dest_pixels + dest_rowstride *i;
|
||||
guchar *p1 = src_pixels + (src_y + i) * src_rowstride + (src_x - 1) * n_channels;
|
||||
guchar *p2 = p1 + n_channels;
|
||||
|
||||
guint v[4];
|
||||
gint dv[4];
|
||||
|
||||
for (k = 0; k < n_channels; k++)
|
||||
{
|
||||
dv[k] = (((gint)p2[k] - (gint)p1[k]) << 16) / (width + 1);
|
||||
v[k] = (p1[k] << 16) + dv[k] + 0x8000;
|
||||
}
|
||||
|
||||
for (j = width; j; j--)
|
||||
{
|
||||
for (k = 0; k < n_channels; k++)
|
||||
{
|
||||
*(p++) = v[k] >> 16;
|
||||
v[k] += dv[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
vertical_gradient (GdkPixbuf *src,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
guint n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
|
||||
guchar *src_pixels = gdk_pixbuf_get_pixels (src);
|
||||
guchar *top_pixels, *bottom_pixels;
|
||||
guint dest_rowstride;
|
||||
guchar *dest_pixels;
|
||||
GdkPixbuf *result;
|
||||
int i, j;
|
||||
|
||||
if (src_y == 0)
|
||||
{
|
||||
g_warning ("invalid source position for vertical gradient");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
top_pixels = src_pixels + (src_y - 1) * src_rowstride + (src_x) * n_channels;
|
||||
bottom_pixels = top_pixels + src_rowstride;
|
||||
|
||||
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
|
||||
width, height);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
g_warning ("failed to create a %dx%d pixbuf", width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dest_rowstride = gdk_pixbuf_get_rowstride (result);
|
||||
dest_pixels = gdk_pixbuf_get_pixels (result);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
guchar *p = dest_pixels + dest_rowstride *i;
|
||||
guchar *p1 = top_pixels;
|
||||
guchar *p2 = bottom_pixels;
|
||||
|
||||
for (j = width * n_channels; j; j--)
|
||||
*(p++) = ((height - i) * *(p1++) + (1 + i) * *(p2++)) / (height + 1);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
replicate_single (GdkPixbuf *src,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
guint n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
guchar *pixels = (gdk_pixbuf_get_pixels (src) +
|
||||
src_y * gdk_pixbuf_get_rowstride (src) +
|
||||
src_x * n_channels);
|
||||
guchar r = *(pixels++);
|
||||
guchar g = *(pixels++);
|
||||
guchar b = *(pixels++);
|
||||
guint dest_rowstride;
|
||||
guchar *dest_pixels;
|
||||
guchar a = 0;
|
||||
GdkPixbuf *result;
|
||||
int i, j;
|
||||
|
||||
if (n_channels == 4)
|
||||
a = *(pixels++);
|
||||
|
||||
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
|
||||
width, height);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
g_warning ("failed to create a %dx%d pixbuf", width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dest_rowstride = gdk_pixbuf_get_rowstride (result);
|
||||
dest_pixels = gdk_pixbuf_get_pixels (result);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
guchar *p = dest_pixels + dest_rowstride *i;
|
||||
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
*(p++) = r;
|
||||
*(p++) = g;
|
||||
*(p++) = b;
|
||||
|
||||
if (n_channels == 4)
|
||||
*(p++) = a;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
replicate_rows (GdkPixbuf *src,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
guint n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
|
||||
guchar *pixels = (gdk_pixbuf_get_pixels (src) + src_y * src_rowstride + src_x * n_channels);
|
||||
guchar *dest_pixels;
|
||||
GdkPixbuf *result;
|
||||
guint dest_rowstride;
|
||||
int i;
|
||||
|
||||
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
|
||||
width, height);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
g_warning ("failed to create a %dx%d pixbuf", width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dest_rowstride = gdk_pixbuf_get_rowstride (result);
|
||||
dest_pixels = gdk_pixbuf_get_pixels (result);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
memcpy (dest_pixels + dest_rowstride * i, pixels, n_channels * width);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static GdkPixbuf *
|
||||
replicate_cols (GdkPixbuf *src,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
guint n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
guint src_rowstride = gdk_pixbuf_get_rowstride (src);
|
||||
guchar *pixels = (gdk_pixbuf_get_pixels (src) + src_y * src_rowstride + src_x * n_channels);
|
||||
guchar *dest_pixels;
|
||||
GdkPixbuf *result;
|
||||
guint dest_rowstride;
|
||||
int i, j;
|
||||
|
||||
result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, n_channels == 4, 8,
|
||||
width, height);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
g_warning ("failed to create a %dx%d pixbuf", width, height);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dest_rowstride = gdk_pixbuf_get_rowstride (result);
|
||||
dest_pixels = gdk_pixbuf_get_pixels (result);
|
||||
|
||||
for (i = 0; i < height; i++)
|
||||
{
|
||||
guchar *p = dest_pixels + dest_rowstride * i;
|
||||
guchar *q = pixels + src_rowstride * i;
|
||||
|
||||
guchar r = *(q++);
|
||||
guchar g = *(q++);
|
||||
guchar b = *(q++);
|
||||
guchar a = 0;
|
||||
|
||||
if (n_channels == 4)
|
||||
a = *(q++);
|
||||
|
||||
for (j = 0; j < width; j++)
|
||||
{
|
||||
*(p++) = r;
|
||||
*(p++) = g;
|
||||
*(p++) = b;
|
||||
|
||||
if (n_channels == 4)
|
||||
*(p++) = a;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Scale the rectangle (src_x, src_y, src_width, src_height)
|
||||
* onto the rectangle (dest_x, dest_y, dest_width, dest_height)
|
||||
* of the destination, clip by clip_rect and render
|
||||
*/
|
||||
static void
|
||||
pixbuf_render (GdkPixbuf *src,
|
||||
guint hints,
|
||||
cairo_t *cr,
|
||||
gint src_x,
|
||||
gint src_y,
|
||||
gint src_width,
|
||||
gint src_height,
|
||||
gint dest_x,
|
||||
gint dest_y,
|
||||
gint dest_width,
|
||||
gint dest_height)
|
||||
{
|
||||
GdkPixbuf *tmp_pixbuf = NULL;
|
||||
GdkRectangle rect;
|
||||
int x_offset, y_offset;
|
||||
gboolean has_alpha = gdk_pixbuf_get_has_alpha (src);
|
||||
gint src_rowstride = gdk_pixbuf_get_rowstride (src);
|
||||
gint src_n_channels = gdk_pixbuf_get_n_channels (src);
|
||||
|
||||
if (dest_width <= 0 || dest_height <= 0)
|
||||
return;
|
||||
|
||||
rect.x = dest_x;
|
||||
rect.y = dest_y;
|
||||
rect.width = dest_width;
|
||||
rect.height = dest_height;
|
||||
|
||||
if (hints & THEME_MISSING)
|
||||
return;
|
||||
|
||||
if (dest_width == src_width && dest_height == src_height)
|
||||
{
|
||||
tmp_pixbuf = g_object_ref (src);
|
||||
|
||||
x_offset = src_x + rect.x - dest_x;
|
||||
y_offset = src_y + rect.y - dest_y;
|
||||
}
|
||||
else if (src_width == 0 && src_height == 0)
|
||||
{
|
||||
tmp_pixbuf = bilinear_gradient (src, src_x, src_y, dest_width, dest_height);
|
||||
|
||||
x_offset = rect.x - dest_x;
|
||||
y_offset = rect.y - dest_y;
|
||||
}
|
||||
else if (src_width == 0 && dest_height == src_height)
|
||||
{
|
||||
tmp_pixbuf = horizontal_gradient (src, src_x, src_y, dest_width, dest_height);
|
||||
|
||||
x_offset = rect.x - dest_x;
|
||||
y_offset = rect.y - dest_y;
|
||||
}
|
||||
else if (src_height == 0 && dest_width == src_width)
|
||||
{
|
||||
tmp_pixbuf = vertical_gradient (src, src_x, src_y, dest_width, dest_height);
|
||||
|
||||
x_offset = rect.x - dest_x;
|
||||
y_offset = rect.y - dest_y;
|
||||
}
|
||||
else if ((hints & THEME_CONSTANT_COLS) && (hints & THEME_CONSTANT_ROWS))
|
||||
{
|
||||
tmp_pixbuf = replicate_single (src, src_x, src_y, dest_width, dest_height);
|
||||
|
||||
x_offset = rect.x - dest_x;
|
||||
y_offset = rect.y - dest_y;
|
||||
}
|
||||
else if (dest_width == src_width && (hints & THEME_CONSTANT_COLS))
|
||||
{
|
||||
tmp_pixbuf = replicate_rows (src, src_x, src_y, dest_width, dest_height);
|
||||
|
||||
x_offset = rect.x - dest_x;
|
||||
y_offset = rect.y - dest_y;
|
||||
}
|
||||
else if (dest_height == src_height && (hints & THEME_CONSTANT_ROWS))
|
||||
{
|
||||
tmp_pixbuf = replicate_cols (src, src_x, src_y, dest_width, dest_height);
|
||||
|
||||
x_offset = rect.x - dest_x;
|
||||
y_offset = rect.y - dest_y;
|
||||
}
|
||||
else if (src_width > 0 && src_height > 0)
|
||||
{
|
||||
double x_scale = (double)dest_width / src_width;
|
||||
double y_scale = (double)dest_height / src_height;
|
||||
guchar *pixels;
|
||||
GdkPixbuf *partial_src;
|
||||
|
||||
pixels = (gdk_pixbuf_get_pixels (src)
|
||||
+ src_y * src_rowstride
|
||||
+ src_x * src_n_channels);
|
||||
|
||||
partial_src = gdk_pixbuf_new_from_data (pixels, GDK_COLORSPACE_RGB,
|
||||
has_alpha,
|
||||
8, src_width, src_height,
|
||||
src_rowstride,
|
||||
NULL, NULL);
|
||||
|
||||
tmp_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
|
||||
has_alpha, 8,
|
||||
rect.width, rect.height);
|
||||
|
||||
gdk_pixbuf_scale (partial_src, tmp_pixbuf,
|
||||
0, 0, rect.width, rect.height,
|
||||
dest_x - rect.x, dest_y - rect.y,
|
||||
x_scale, y_scale,
|
||||
GDK_INTERP_BILINEAR);
|
||||
|
||||
g_object_unref (partial_src);
|
||||
|
||||
x_offset = 0;
|
||||
y_offset = 0;
|
||||
}
|
||||
|
||||
if (tmp_pixbuf)
|
||||
{
|
||||
gdk_cairo_set_source_pixbuf (cr,
|
||||
tmp_pixbuf,
|
||||
-x_offset + rect.x,
|
||||
-y_offset + rect.y);
|
||||
gdk_cairo_rectangle (cr, &rect);
|
||||
cairo_fill (cr);
|
||||
|
||||
g_object_unref (tmp_pixbuf);
|
||||
}
|
||||
}
|
||||
|
||||
ThemePixbuf *
|
||||
theme_pixbuf_new (void)
|
||||
{
|
||||
ThemePixbuf *result = g_new0 (ThemePixbuf, 1);
|
||||
result->filename = NULL;
|
||||
result->pixbuf = NULL;
|
||||
|
||||
result->stretch = TRUE;
|
||||
result->border_left = 0;
|
||||
result->border_right = 0;
|
||||
result->border_bottom = 0;
|
||||
result->border_top = 0;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
theme_pixbuf_destroy (ThemePixbuf *theme_pb)
|
||||
{
|
||||
if (G_LIKELY (theme_pb))
|
||||
{
|
||||
theme_pixbuf_set_filename (theme_pb, NULL);
|
||||
g_free (theme_pb);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
theme_clear_pixbuf (ThemePixbuf **theme_pb)
|
||||
{
|
||||
#if GLIB_CHECK_VERSION (2, 34, 0)
|
||||
g_clear_pointer (theme_pb, theme_pixbuf_destroy);
|
||||
#else
|
||||
if (*theme_pb)
|
||||
{
|
||||
theme_pixbuf_destroy (*theme_pb);
|
||||
*theme_pb = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
theme_pixbuf_set_filename (ThemePixbuf *theme_pb,
|
||||
const char *filename)
|
||||
{
|
||||
if (theme_pb->pixbuf)
|
||||
{
|
||||
g_object_unref (theme_pb->pixbuf);
|
||||
theme_pb->pixbuf = NULL;
|
||||
}
|
||||
|
||||
g_free (theme_pb->filename);
|
||||
|
||||
if (filename)
|
||||
theme_pb->filename = g_strdup (filename);
|
||||
else
|
||||
theme_pb->filename = NULL;
|
||||
}
|
||||
|
||||
static guint
|
||||
compute_hint (GdkPixbuf *pixbuf,
|
||||
gint x0,
|
||||
gint x1,
|
||||
gint y0,
|
||||
gint y1)
|
||||
{
|
||||
int i, j;
|
||||
int hints = THEME_CONSTANT_ROWS | THEME_CONSTANT_COLS | THEME_MISSING;
|
||||
int n_channels = gdk_pixbuf_get_n_channels (pixbuf);
|
||||
|
||||
guchar *data = gdk_pixbuf_get_pixels (pixbuf);
|
||||
int rowstride = gdk_pixbuf_get_rowstride (pixbuf);
|
||||
|
||||
if (x0 == x1 || y0 == y1)
|
||||
return 0;
|
||||
|
||||
for (i = y0; i < y1; i++)
|
||||
{
|
||||
guchar *p = data + i * rowstride + x0 * n_channels;
|
||||
guchar r = p[0];
|
||||
guchar g = p[1];
|
||||
guchar b = p[2];
|
||||
guchar a = 0;
|
||||
|
||||
if (n_channels == 4)
|
||||
a = p[3];
|
||||
|
||||
for (j = x0; j < x1 ; j++)
|
||||
{
|
||||
if (n_channels != 4 || p[3] != 0)
|
||||
{
|
||||
hints &= ~THEME_MISSING;
|
||||
if (!(hints & THEME_CONSTANT_ROWS))
|
||||
goto cols;
|
||||
}
|
||||
|
||||
if (r != *(p++) ||
|
||||
g != *(p++) ||
|
||||
b != *(p++) ||
|
||||
(n_channels != 4 && a != *(p++)))
|
||||
{
|
||||
hints &= ~THEME_CONSTANT_ROWS;
|
||||
if (!(hints & THEME_MISSING))
|
||||
goto cols;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cols:
|
||||
for (i = y0 + 1; i < y1; i++)
|
||||
{
|
||||
guchar *base = data + y0 * rowstride + x0 * n_channels;
|
||||
guchar *p = data + i * rowstride + x0 * n_channels;
|
||||
|
||||
if (memcmp (p, base, n_channels * (x1 - x0)) != 0)
|
||||
{
|
||||
hints &= ~THEME_CONSTANT_COLS;
|
||||
return hints;
|
||||
}
|
||||
}
|
||||
|
||||
return hints;
|
||||
}
|
||||
|
||||
static void
|
||||
theme_pixbuf_compute_hints (ThemePixbuf *theme_pb)
|
||||
{
|
||||
int i, j;
|
||||
gint width = gdk_pixbuf_get_width (theme_pb->pixbuf);
|
||||
gint height = gdk_pixbuf_get_height (theme_pb->pixbuf);
|
||||
|
||||
if (theme_pb->border_left + theme_pb->border_right > width ||
|
||||
theme_pb->border_top + theme_pb->border_bottom > height)
|
||||
{
|
||||
g_warning ("Invalid borders specified for theme pixmap:\n"
|
||||
" %s,\n"
|
||||
"borders don't fit within the image", theme_pb->filename);
|
||||
if (theme_pb->border_left + theme_pb->border_right > width)
|
||||
{
|
||||
theme_pb->border_left = width / 2;
|
||||
theme_pb->border_right = (width + 1) / 2;
|
||||
}
|
||||
if (theme_pb->border_bottom + theme_pb->border_top > height)
|
||||
{
|
||||
theme_pb->border_top = height / 2;
|
||||
theme_pb->border_bottom = (height + 1) / 2;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
gint y0, y1;
|
||||
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
y0 = 0;
|
||||
y1 = theme_pb->border_top;
|
||||
break;
|
||||
case 1:
|
||||
y0 = theme_pb->border_top;
|
||||
y1 = height - theme_pb->border_bottom;
|
||||
break;
|
||||
default:
|
||||
y0 = height - theme_pb->border_bottom;
|
||||
y1 = height;
|
||||
break;
|
||||
}
|
||||
|
||||
for (j = 0; j < 3; j++)
|
||||
{
|
||||
gint x0, x1;
|
||||
|
||||
switch (j)
|
||||
{
|
||||
case 0:
|
||||
x0 = 0;
|
||||
x1 = theme_pb->border_left;
|
||||
break;
|
||||
case 1:
|
||||
x0 = theme_pb->border_left;
|
||||
x1 = width - theme_pb->border_right;
|
||||
break;
|
||||
default:
|
||||
x0 = width - theme_pb->border_right;
|
||||
x1 = width;
|
||||
break;
|
||||
}
|
||||
|
||||
theme_pb->hints[i][j] = compute_hint (theme_pb->pixbuf, x0, x1, y0, y1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
theme_pixbuf_set_border (ThemePixbuf *theme_pb,
|
||||
gint left,
|
||||
gint right,
|
||||
gint top,
|
||||
gint bottom)
|
||||
{
|
||||
theme_pb->border_left = left;
|
||||
theme_pb->border_right = right;
|
||||
theme_pb->border_top = top;
|
||||
theme_pb->border_bottom = bottom;
|
||||
|
||||
if (theme_pb->pixbuf)
|
||||
theme_pixbuf_compute_hints (theme_pb);
|
||||
}
|
||||
|
||||
void
|
||||
theme_pixbuf_set_stretch (ThemePixbuf *theme_pb,
|
||||
gboolean stretch)
|
||||
{
|
||||
theme_pb->stretch = stretch;
|
||||
|
||||
if (theme_pb->pixbuf)
|
||||
theme_pixbuf_compute_hints (theme_pb);
|
||||
}
|
||||
|
||||
void
|
||||
theme_pixbuf_uncache (gpointer data,
|
||||
GObject *where_the_object_was)
|
||||
{
|
||||
g_hash_table_remove (pixbuf_cache, data);
|
||||
}
|
||||
|
||||
GdkPixbuf *
|
||||
theme_pixbuf_get_pixbuf (ThemePixbuf *theme_pb)
|
||||
{
|
||||
if (!theme_pb->pixbuf)
|
||||
{
|
||||
gpointer pixbuf;
|
||||
|
||||
if (!pixbuf_cache)
|
||||
/* Hash table does not hold its own reference to the GdkPixbuf */
|
||||
pixbuf_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
g_free, NULL);
|
||||
|
||||
/* Do an extended lookup because we store NULL in the hash table
|
||||
* (below) to indicate that we failed to load the given filename.
|
||||
*/
|
||||
if (!g_hash_table_lookup_extended (pixbuf_cache, theme_pb->filename,
|
||||
NULL, &pixbuf))
|
||||
/* Not in the cache. Add it and take the first ref. */
|
||||
{
|
||||
gchar *key = g_strdup (theme_pb->filename);
|
||||
GError *error = NULL;
|
||||
|
||||
pixbuf = gdk_pixbuf_new_from_file (key, &error);
|
||||
|
||||
if (pixbuf != NULL)
|
||||
{
|
||||
/* Drop the pixbuf from the cache when we lose the last ref. */
|
||||
g_object_weak_ref (G_OBJECT (pixbuf), theme_pixbuf_uncache, key);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Never drop a negative from the cache. */
|
||||
g_warning ("Pixbuf theme: Cannot load pixmap file %s: %s\n",
|
||||
theme_pb->filename, error->message);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
/* Always insert, even if we failed to create the pixbuf. */
|
||||
g_hash_table_insert (pixbuf_cache, key, pixbuf);
|
||||
theme_pb->pixbuf = pixbuf;
|
||||
}
|
||||
|
||||
else
|
||||
/* In the cache. Take an additional ref. */
|
||||
theme_pb->pixbuf = g_object_ref (pixbuf);
|
||||
|
||||
if (theme_pb->stretch)
|
||||
theme_pixbuf_compute_hints (theme_pb);
|
||||
}
|
||||
|
||||
return theme_pb->pixbuf;
|
||||
}
|
||||
|
||||
void
|
||||
theme_pixbuf_render (ThemePixbuf *theme_pb,
|
||||
cairo_t *cr,
|
||||
guint component_mask,
|
||||
gboolean center,
|
||||
gint x,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
GdkPixbuf *pixbuf = theme_pixbuf_get_pixbuf (theme_pb);
|
||||
gint src_x[4], src_y[4], dest_x[4], dest_y[4];
|
||||
gint pixbuf_width = gdk_pixbuf_get_width (pixbuf);
|
||||
gint pixbuf_height = gdk_pixbuf_get_height (pixbuf);
|
||||
|
||||
if (!pixbuf)
|
||||
return;
|
||||
|
||||
if (theme_pb->stretch)
|
||||
{
|
||||
if (component_mask & COMPONENT_ALL)
|
||||
component_mask = (COMPONENT_ALL - 1) & ~component_mask;
|
||||
|
||||
src_x[0] = 0;
|
||||
src_x[1] = theme_pb->border_left;
|
||||
src_x[2] = pixbuf_width - theme_pb->border_right;
|
||||
src_x[3] = pixbuf_width;
|
||||
|
||||
src_y[0] = 0;
|
||||
src_y[1] = theme_pb->border_top;
|
||||
src_y[2] = pixbuf_height - theme_pb->border_bottom;
|
||||
src_y[3] = pixbuf_height;
|
||||
|
||||
dest_x[0] = x;
|
||||
dest_x[1] = x + theme_pb->border_left;
|
||||
dest_x[2] = x + width - theme_pb->border_right;
|
||||
dest_x[3] = x + width;
|
||||
|
||||
if (dest_x[1] > dest_x[2])
|
||||
{
|
||||
component_mask &= ~(COMPONENT_NORTH | COMPONENT_SOUTH | COMPONENT_CENTER);
|
||||
dest_x[1] = dest_x[2] = (dest_x[1] + dest_x[2]) / 2;
|
||||
}
|
||||
|
||||
dest_y[0] = y;
|
||||
dest_y[1] = y + theme_pb->border_top;
|
||||
dest_y[2] = y + height - theme_pb->border_bottom;
|
||||
dest_y[3] = y + height;
|
||||
|
||||
if (dest_y[1] > dest_y[2])
|
||||
{
|
||||
component_mask &= ~(COMPONENT_EAST | COMPONENT_WEST | COMPONENT_CENTER);
|
||||
dest_y[1] = dest_y[2] = (dest_y[1] + dest_y[2]) / 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define RENDER_COMPONENT(X1,X2,Y1,Y2) \
|
||||
pixbuf_render (pixbuf, theme_pb->hints[Y1][X1], cr, \
|
||||
src_x[X1], src_y[Y1], \
|
||||
src_x[X2] - src_x[X1], src_y[Y2] - src_y[Y1], \
|
||||
dest_x[X1], dest_y[Y1], \
|
||||
dest_x[X2] - dest_x[X1], dest_y[Y2] - dest_y[Y1]);
|
||||
|
||||
if (component_mask & COMPONENT_NORTH_WEST)
|
||||
RENDER_COMPONENT (0, 1, 0, 1);
|
||||
|
||||
if (component_mask & COMPONENT_NORTH)
|
||||
RENDER_COMPONENT (1, 2, 0, 1);
|
||||
|
||||
if (component_mask & COMPONENT_NORTH_EAST)
|
||||
RENDER_COMPONENT (2, 3, 0, 1);
|
||||
|
||||
if (component_mask & COMPONENT_WEST)
|
||||
RENDER_COMPONENT (0, 1, 1, 2);
|
||||
|
||||
if (component_mask & COMPONENT_CENTER)
|
||||
RENDER_COMPONENT (1, 2, 1, 2);
|
||||
|
||||
if (component_mask & COMPONENT_EAST)
|
||||
RENDER_COMPONENT (2, 3, 1, 2);
|
||||
|
||||
if (component_mask & COMPONENT_SOUTH_WEST)
|
||||
RENDER_COMPONENT (0, 1, 2, 3);
|
||||
|
||||
if (component_mask & COMPONENT_SOUTH)
|
||||
RENDER_COMPONENT (1, 2, 2, 3);
|
||||
|
||||
if (component_mask & COMPONENT_SOUTH_EAST)
|
||||
RENDER_COMPONENT (2, 3, 2, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (center)
|
||||
{
|
||||
x += (width - pixbuf_width) / 2;
|
||||
y += (height - pixbuf_height) / 2;
|
||||
|
||||
pixbuf_render (pixbuf, 0, cr,
|
||||
0, 0,
|
||||
pixbuf_width, pixbuf_height,
|
||||
x, y,
|
||||
pixbuf_width, pixbuf_height);
|
||||
}
|
||||
else
|
||||
{
|
||||
gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
|
||||
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
|
||||
|
||||
cairo_rectangle (cr, x, y, width, height);
|
||||
|
||||
cairo_fill (cr);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
typedef struct _PixbufStyle PixbufStyle;
|
||||
typedef struct _PixbufStyleClass PixbufStyleClass;
|
||||
|
||||
extern G_GNUC_INTERNAL GType pixbuf_type_style;
|
||||
|
||||
#define PIXBUF_TYPE_STYLE pixbuf_type_style
|
||||
#define PIXBUF_STYLE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PIXBUF_TYPE_STYLE, PixbufStyle))
|
||||
#define PIXBUF_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PIXBUF_TYPE_STYLE, PixbufStyleClass))
|
||||
#define PIXBUF_IS_STYLE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PIXBUF_TYPE_STYLE))
|
||||
#define PIXBUF_IS_STYLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PIXBUF_TYPE_STYLE))
|
||||
#define PIXBUF_STYLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PIXBUF_TYPE_STYLE, PixbufStyleClass))
|
||||
|
||||
struct _PixbufStyle
|
||||
{
|
||||
GtkStyle parent_instance;
|
||||
};
|
||||
|
||||
struct _PixbufStyleClass
|
||||
{
|
||||
GtkStyleClass parent_class;
|
||||
};
|
||||
|
||||
G_GNUC_INTERNAL void pixbuf_style_register_type (GTypeModule *module);
|
||||
|
||||
|
@ -1,213 +0,0 @@
|
||||
/* GTK+ Pixbuf Engine
|
||||
* Copyright (C) 1998-2000 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Written by Owen Taylor <otaylor@redhat.com>, based on code by
|
||||
* Carsten Haitzler <raster@rasterman.com>
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
/* internals */
|
||||
|
||||
typedef struct _ThemeData ThemeData;
|
||||
typedef struct _ThemeImage ThemeImage;
|
||||
typedef struct _ThemeMatchData ThemeMatchData;
|
||||
typedef struct _ThemePixbuf ThemePixbuf;
|
||||
|
||||
enum
|
||||
{
|
||||
TOKEN_IMAGE = G_TOKEN_LAST + 1,
|
||||
TOKEN_FUNCTION,
|
||||
TOKEN_FILE,
|
||||
TOKEN_STRETCH,
|
||||
TOKEN_RECOLORABLE,
|
||||
TOKEN_BORDER,
|
||||
TOKEN_DETAIL,
|
||||
TOKEN_STATE,
|
||||
TOKEN_SHADOW,
|
||||
TOKEN_GAP_SIDE,
|
||||
TOKEN_GAP_FILE,
|
||||
TOKEN_GAP_BORDER,
|
||||
TOKEN_GAP_START_FILE,
|
||||
TOKEN_GAP_START_BORDER,
|
||||
TOKEN_GAP_END_FILE,
|
||||
TOKEN_GAP_END_BORDER,
|
||||
TOKEN_OVERLAY_FILE,
|
||||
TOKEN_OVERLAY_BORDER,
|
||||
TOKEN_OVERLAY_STRETCH,
|
||||
TOKEN_ARROW_DIRECTION,
|
||||
TOKEN_EXPANDER_STYLE,
|
||||
TOKEN_WINDOW_EDGE,
|
||||
TOKEN_D_HLINE,
|
||||
TOKEN_D_VLINE,
|
||||
TOKEN_D_SHADOW,
|
||||
TOKEN_D_POLYGON,
|
||||
TOKEN_D_ARROW,
|
||||
TOKEN_D_DIAMOND,
|
||||
TOKEN_D_OVAL,
|
||||
TOKEN_D_STRING,
|
||||
TOKEN_D_BOX,
|
||||
TOKEN_D_FLAT_BOX,
|
||||
TOKEN_D_CHECK,
|
||||
TOKEN_D_OPTION,
|
||||
TOKEN_D_CROSS,
|
||||
TOKEN_D_RAMP,
|
||||
TOKEN_D_TAB,
|
||||
TOKEN_D_SHADOW_GAP,
|
||||
TOKEN_D_BOX_GAP,
|
||||
TOKEN_D_EXTENSION,
|
||||
TOKEN_D_FOCUS,
|
||||
TOKEN_D_SLIDER,
|
||||
TOKEN_D_ENTRY,
|
||||
TOKEN_D_HANDLE,
|
||||
TOKEN_D_STEPPER,
|
||||
TOKEN_D_EXPANDER,
|
||||
TOKEN_D_RESIZE_GRIP,
|
||||
TOKEN_TRUE,
|
||||
TOKEN_FALSE,
|
||||
TOKEN_TOP,
|
||||
TOKEN_UP,
|
||||
TOKEN_BOTTOM,
|
||||
TOKEN_DOWN,
|
||||
TOKEN_LEFT,
|
||||
TOKEN_RIGHT,
|
||||
TOKEN_NORMAL,
|
||||
TOKEN_ACTIVE,
|
||||
TOKEN_PRELIGHT,
|
||||
TOKEN_SELECTED,
|
||||
TOKEN_INSENSITIVE,
|
||||
TOKEN_NONE,
|
||||
TOKEN_IN,
|
||||
TOKEN_OUT,
|
||||
TOKEN_ETCHED_IN,
|
||||
TOKEN_ETCHED_OUT,
|
||||
TOKEN_ORIENTATION,
|
||||
TOKEN_HORIZONTAL,
|
||||
TOKEN_VERTICAL,
|
||||
TOKEN_COLLAPSED,
|
||||
TOKEN_SEMI_COLLAPSED,
|
||||
TOKEN_SEMI_EXPANDED,
|
||||
TOKEN_EXPANDED,
|
||||
TOKEN_NORTH_WEST,
|
||||
TOKEN_NORTH,
|
||||
TOKEN_NORTH_EAST,
|
||||
TOKEN_WEST,
|
||||
TOKEN_EAST,
|
||||
TOKEN_SOUTH_WEST,
|
||||
TOKEN_SOUTH,
|
||||
TOKEN_SOUTH_EAST
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
COMPONENT_NORTH_WEST = 1 << 0,
|
||||
COMPONENT_NORTH = 1 << 1,
|
||||
COMPONENT_NORTH_EAST = 1 << 2,
|
||||
COMPONENT_WEST = 1 << 3,
|
||||
COMPONENT_CENTER = 1 << 4,
|
||||
COMPONENT_EAST = 1 << 5,
|
||||
COMPONENT_SOUTH_EAST = 1 << 6,
|
||||
COMPONENT_SOUTH = 1 << 7,
|
||||
COMPONENT_SOUTH_WEST = 1 << 8,
|
||||
COMPONENT_ALL = 1 << 9
|
||||
} ThemePixbufComponent;
|
||||
|
||||
typedef enum {
|
||||
THEME_MATCH_GAP_SIDE = 1 << 0,
|
||||
THEME_MATCH_ORIENTATION = 1 << 1,
|
||||
THEME_MATCH_STATE = 1 << 2,
|
||||
THEME_MATCH_SHADOW = 1 << 3,
|
||||
THEME_MATCH_ARROW_DIRECTION = 1 << 4,
|
||||
THEME_MATCH_EXPANDER_STYLE = 1 << 5,
|
||||
THEME_MATCH_WINDOW_EDGE = 1 << 6
|
||||
} ThemeMatchFlags;
|
||||
|
||||
typedef enum {
|
||||
THEME_CONSTANT_ROWS = 1 << 0,
|
||||
THEME_CONSTANT_COLS = 1 << 1,
|
||||
THEME_MISSING = 1 << 2
|
||||
} ThemeRenderHints;
|
||||
|
||||
struct _ThemePixbuf
|
||||
{
|
||||
gchar *filename;
|
||||
GdkPixbuf *pixbuf;
|
||||
gboolean stretch;
|
||||
gint border_left;
|
||||
gint border_right;
|
||||
gint border_bottom;
|
||||
gint border_top;
|
||||
guint hints[3][3];
|
||||
};
|
||||
|
||||
struct _ThemeMatchData
|
||||
{
|
||||
guint function; /* Mandatory */
|
||||
gchar *detail;
|
||||
|
||||
ThemeMatchFlags flags;
|
||||
|
||||
GtkPositionType gap_side;
|
||||
GtkOrientation orientation;
|
||||
GtkStateType state;
|
||||
GtkShadowType shadow;
|
||||
GtkArrowType arrow_direction;
|
||||
GtkExpanderStyle expander_style;
|
||||
GdkWindowEdge window_edge;
|
||||
};
|
||||
|
||||
struct _ThemeImage
|
||||
{
|
||||
guint refcount;
|
||||
|
||||
ThemePixbuf *background;
|
||||
ThemePixbuf *overlay;
|
||||
ThemePixbuf *gap_start;
|
||||
ThemePixbuf *gap;
|
||||
ThemePixbuf *gap_end;
|
||||
|
||||
gchar recolorable;
|
||||
|
||||
ThemeMatchData match_data;
|
||||
};
|
||||
|
||||
|
||||
G_GNUC_INTERNAL ThemePixbuf *theme_pixbuf_new (void);
|
||||
G_GNUC_INTERNAL void theme_pixbuf_destroy (ThemePixbuf *theme_pb);
|
||||
G_GNUC_INTERNAL void theme_clear_pixbuf (ThemePixbuf **theme_pb);
|
||||
G_GNUC_INTERNAL void theme_pixbuf_set_filename (ThemePixbuf *theme_pb,
|
||||
const char *filename);
|
||||
G_GNUC_INTERNAL GdkPixbuf * theme_pixbuf_get_pixbuf (ThemePixbuf *theme_pb);
|
||||
G_GNUC_INTERNAL void theme_pixbuf_set_border (ThemePixbuf *theme_pb,
|
||||
gint left,
|
||||
gint right,
|
||||
gint top,
|
||||
gint bottom);
|
||||
G_GNUC_INTERNAL void theme_pixbuf_set_stretch (ThemePixbuf *theme_pb,
|
||||
gboolean stretch);
|
||||
G_GNUC_INTERNAL void theme_pixbuf_render (ThemePixbuf *theme_pb,
|
||||
cairo_t *cr,
|
||||
guint component_mask,
|
||||
gboolean center,
|
||||
gint dest_x,
|
||||
gint dest_y,
|
||||
gint dest_width,
|
||||
gint dest_height);
|
||||
|
||||
|
||||
|
||||
extern GtkStyleClass pixmap_default_class;
|
Loading…
Reference in New Issue
Block a user