/* This function is a home-grown (probably flawed) function * inspired by the metal, ThinIce, & Wonderland GTK2 engines */ void reverse_engineer_arrow_box (GtkWidget *widget, const gchar * detail, GtkArrowType arrow_type, gint *x, gint *y, gint *width, gint *height) { if (DETAIL ("hscrollbar") || DETAIL ("vscrollbar")) { reverse_engineer_stepper_box (widget, arrow_type, x, y, width, height); } else if (DETAIL("spinbutton")) { reverse_engineer_spin_button (widget, arrow_type, x, y, width, height); } #if GTK2 else if (DETAIL("menuitem")) { *width += 2; *height += 2; *x -= 1; } else if (DETAIL("arrow")) { *width += 2; *height += 2; *x -= 1; *y -= 1; } #endif #if GTK1 else if (DETAIL("menuitem")) { *width += 2; *height += 2; *x -= 1; *y += 0; } else if (DETAIL("arrow")) { *y += 1; } #endif }
static void draw_arrow (GtkStyle *style, GdkWindow *window, GtkStateType state, GtkShadowType shadow, GdkRectangle *area, GtkWidget *widget, const gchar *detail, GtkArrowType arrow_direction, gint fill, gint x, gint y, gint width, gint height) { ThemeMatchData match_data; g_return_if_fail (style != NULL); g_return_if_fail (window != NULL); /* FIXME: memory leak */ LOG ("widget=%s, primitive=arrow, state=%s, shadow=%s, detail='%s', name='%s'", G_OBJECT_TYPE_NAME (widget), enum_value_to_string (gtk_state_type_get_type (), state), enum_value_to_string (gtk_state_type_get_type (), state), detail, gtk_widget_get_name (widget)); 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, window, area, widget, &match_data, 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, window, area, widget, &match_data, TRUE, box_x, box_y, box_width, box_height)) GTK_STYLE_CLASS (sapwood_style_parent_class)->draw_box ( style, window, state, shadow, area, widget, detail, box_x, box_y, box_width, box_height); } #if GTK_CHECK_VERSION(2,9,2) if (arrow_direction == GTK_ARROW_NONE) return; #endif 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, window, area, widget, &match_data, TRUE, x, y, width, height)) GTK_STYLE_CLASS (sapwood_style_parent_class)->draw_arrow ( style, window, state, shadow, area, widget, detail, arrow_direction, fill, x, y, width, 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); }