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 gboolean draw_simple_image(GtkStyle *style, GdkWindow *window, GdkRectangle *area, GtkWidget *widget, ThemeMatchData *match_data, gboolean draw_center, gboolean allow_setbg, gint x, gint y, gint width, gint height) { ThemeImage *image; gboolean setbg = FALSE; if ((width == -1) && (height == -1)) { gdk_drawable_get_size(window, &width, &height); if (allow_setbg) setbg = TRUE; } else if (width == -1) gdk_drawable_get_size(window, &width, NULL); else if (height == -1) gdk_drawable_get_size(window, NULL, &height); 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, window, NULL, area, draw_center ? COMPONENT_ALL : COMPONENT_ALL | COMPONENT_CENTER, FALSE, x, y, width, height); } if (image->overlay && draw_center) theme_pixbuf_render (image->overlay, window, NULL, area, COMPONENT_ALL, TRUE, x, y, width, height); return TRUE; } else return FALSE; }
static void draw_hline (GtkStyle *style, GdkWindow *window, GtkStateType state, GdkRectangle *area, GtkWidget *widget, const gchar *detail, gint x1, gint x2, gint y) { ThemeImage *image; ThemeMatchData match_data; g_return_if_fail(style != NULL); g_return_if_fail(window != NULL); 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, window, NULL, area, COMPONENT_ALL, FALSE, x1, y, (x2 - x1) + 1, 2); } else parent_class->draw_hline (style, window, state, area, widget, detail, x1, x2, y); }
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 void draw_vline (GtkStyle *style, GdkWindow *window, GtkStateType state, GdkRectangle *area, GtkWidget *widget, const gchar *detail, gint y1, gint y2, gint x) { ThemeImage *image; ThemeMatchData match_data; g_return_if_fail (style != NULL); g_return_if_fail (window != NULL); /* FIXME: memory leak */ LOG ("widget=%s, primitive=vline, state=%s, detail='%s', name='%s'", G_OBJECT_TYPE_NAME (widget), enum_value_to_string (gtk_state_type_get_type (), state), detail, gtk_widget_get_name (widget)); 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, G_OBJECT_TYPE (widget), window, NULL, area, COMPONENT_ALL, FALSE, x, y1, 2, (y2 - y1) + 1); } else GTK_STYLE_CLASS (sapwood_style_parent_class)->draw_vline ( style, window, state, area, widget, detail, y1, y2, x); }
static gboolean draw_gap_image (GtkStyle *style, GdkWindow *window, GdkRectangle *area, 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 ((width == -1) && (height == -1)) gdk_drawable_get_size (window, &width, &height); else if (width == -1) gdk_drawable_get_size (window, &width, NULL); else if (height == -1) gdk_drawable_get_size (window, NULL, &height); 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 xthickness, ythickness; GdkRectangle r1, r2, r3; guint components = COMPONENT_ALL; if (!draw_center) components |= COMPONENT_CENTER; if (!theme_pixbuf_get_geometry (image->gap_start, &xthickness, &ythickness)) { xthickness = style->xthickness; ythickness = style->ythickness; } switch (gap_side) { case GTK_POS_TOP: if (!draw_center) components |= COMPONENT_NORTH_WEST | COMPONENT_NORTH | COMPONENT_NORTH_EAST; r1.x = x; r1.y = y; r1.width = gap_x; r1.height = ythickness; r2.x = x + gap_x; r2.y = y; r2.width = gap_width; r2.height = ythickness; r3.x = x + gap_x + gap_width; r3.y = y; r3.width = width - (gap_x + gap_width); r3.height = ythickness; break; case GTK_POS_BOTTOM: if (!draw_center) components |= COMPONENT_SOUTH_WEST | COMPONENT_SOUTH | COMPONENT_SOUTH_EAST; r1.x = x; r1.y = y + height - ythickness; r1.width = gap_x; r1.height = ythickness; r2.x = x + gap_x; r2.y = y + height - ythickness; r2.width = gap_width; r2.height = ythickness; r3.x = x + gap_x + gap_width; r3.y = y + height - ythickness; r3.width = width - (gap_x + gap_width); r3.height = ythickness; break; case GTK_POS_LEFT: if (!draw_center) components |= COMPONENT_NORTH_WEST | COMPONENT_WEST | COMPONENT_SOUTH_WEST; r1.x = x; r1.y = y; r1.width = xthickness; r1.height = gap_x; r2.x = x; r2.y = y + gap_x; r2.width = xthickness; r2.height = gap_width; r3.x = x; r3.y = y + gap_x + gap_width; r3.width = xthickness; r3.height = height - (gap_x + gap_width); break; case GTK_POS_RIGHT: if (!draw_center) components |= COMPONENT_NORTH_EAST | COMPONENT_EAST | COMPONENT_SOUTH_EAST; r1.x = x + width - xthickness; r1.y = y; r1.width = xthickness; r1.height = gap_x; r2.x = x + width - xthickness; r2.y = y + gap_x; r2.width = xthickness; r2.height = gap_width; r3.x = x + width - xthickness; r3.y = y + gap_x + gap_width; r3.width = xthickness; r3.height = height - (gap_x + gap_width); break; default: g_assert_not_reached (); break; } if (image->background) theme_pixbuf_render (image->background, G_OBJECT_TYPE (widget), window, NULL, area, components, FALSE, x, y, width, height); if (image->gap_start) theme_pixbuf_render (image->gap_start, G_OBJECT_TYPE (widget), window, NULL, area, COMPONENT_ALL, FALSE, r1.x, r1.y, r1.width, r1.height); if (image->gap) theme_pixbuf_render (image->gap, G_OBJECT_TYPE (widget), window, NULL, area, COMPONENT_ALL, FALSE, r2.x, r2.y, r2.width, r2.height); if (image->gap_end) theme_pixbuf_render (image->gap_end, G_OBJECT_TYPE (widget), window, NULL, area, COMPONENT_ALL, FALSE, r3.x, r3.y, r3.width, r3.height); return TRUE; } else return FALSE; }
static gboolean draw_simple_image (GtkStyle *style, GdkWindow *window, GdkRectangle *area, GtkWidget *widget, ThemeMatchData *match_data, gboolean draw_center, gint x, gint y, gint width, gint height) { gboolean maemo_position_theming; ThemeImage *image; if ((width == -1) && (height == -1)) gdk_drawable_get_size (window, &width, &height); else if (width == -1) gdk_drawable_get_size (window, &width, NULL); else if (height == -1) gdk_drawable_get_size (window, NULL, &height); 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; } /* Check for maemo-position-theming to update the position data */ if (widget && widget->parent && gtk_widget_class_find_style_property (GTK_WIDGET_GET_CLASS (widget->parent), "maemo-position-theming")) { gtk_widget_style_get (widget->parent, "maemo-position-theming", &maemo_position_theming, NULL); if (maemo_position_theming) { if (GTK_IS_BUTTON_BOX (widget->parent)) check_buttonbox_child_position (widget, match_data); else { /* Generic code for other kinds of containers */ GList *children; children = gtk_container_get_children (GTK_CONTAINER (widget->parent)); check_child_position (widget, children, match_data); g_list_free (children); } } } image = match_theme_image (style, match_data); if (image) { if (image->background) { GdkWindow *maskwin; GdkBitmap *mask = NULL; gboolean valid; maskwin = get_window_for_shape (image, window, widget, x, y, width, height); if (maskwin) mask = gdk_pixmap_new (maskwin, width, height, 1); valid = theme_pixbuf_render (image->background, G_OBJECT_TYPE (widget), window, mask, area, draw_center ? COMPONENT_ALL : COMPONENT_ALL | COMPONENT_CENTER, FALSE, x, y, width, height); if (mask) { if (valid) gdk_window_shape_combine_mask (maskwin, mask, 0, 0); g_object_unref (mask); } } if (image->overlay && draw_center) theme_pixbuf_render (image->overlay, G_OBJECT_TYPE (widget), window, NULL, area, 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; }