static void thinice_rc_style_merge (GtkRcStyle * dest, GtkRcStyle * src) { if (THINICE_IS_RC_STYLE (src)) { ThiniceRcStyle *src_data = THINICE_RC_STYLE (src); ThiniceRcStyle *dest_data = THINICE_RC_STYLE (dest); /* g_print("theme_merge_rc_style(\"%s\", \"%s\")\n", dest->name, src->name); */ dest_data->scrollbar_type = src_data->scrollbar_type; dest_data->scrollbar_marks = src_data->scrollbar_marks; dest_data->scroll_button_marks = src_data->scroll_button_marks; dest_data->handlebox_marks = src_data->handlebox_marks; dest_data->mark_type1 = src_data->mark_type1; dest_data->mark_type2 = src_data->mark_type2; dest_data->paned_dots = src_data->paned_dots; } parent_class->merge (dest, src); }
static void thinice_style_draw_handle(GtkStyle * style, cairo_t * cr, GtkStateType state_type, GtkShadowType shadow_type, GtkWidget * widget, const gchar *detail, gint x, gint y, gint width, gint height, GtkOrientation orientation) { ThiniceStyle *thinice_style = THINICE_STYLE (style); CairoColor *light=NULL, *dark=NULL; GdkRectangle dest; gint modx, mody; CHECK_ARGS #ifdef DEBUG printf("draw_handle(state=%d, shadow=%d, detail=%s, [%d,%d]@[%d,%d]\n", state_type, shadow_type, detail?detail:"nul",width,height,x,y); #endif if (CHECK_DETAIL (detail, "paned")) { int i, w; int start_i, end_i; dest.x = x; dest.y = y; dest.width = width; dest.height = height; light = &thinice_style->color_cube.light[state_type]; dark = &thinice_style->color_cube.dark[state_type]; if (orientation == GTK_ORIENTATION_HORIZONTAL) w = width; else w = height; switch (THINICE_RC_STYLE (style->rc_style)->paned_dots) { default: case PANED_DOTSFULL: start_i = 5; end_i = w - 5; break; case PANED_DOTSSOME: start_i = w/2 - 16; end_i = w/2 + 16; break; case PANED_DOTSNONE: start_i = w; end_i = 0; break; } if (orientation == GTK_ORIENTATION_HORIZONTAL) { for (i=x + start_i; i <= x + end_i; i+=8) { thinice_dot(cr, light, dark, i, y + height / 2); } } else { for (i=y + start_i; i <= y + end_i; i+=8) { thinice_dot(cr, light, dark, x + width / 2, i); } } return; } thinice_style_draw_box(style, cr, state_type, shadow_type, widget, detail, x, y, width, height); ge_cairo_line(cr, &thinice_style->color_cube.light[state_type], x + width, y, x + width, y + height - 2); /* Draw something in the box if so wanted */ if (THINICE_RC_STYLE (style->rc_style)->mark_type1 != MARKS_NOTHING) { light = &thinice_style->color_cube.light[state_type]; dark = &thinice_style->color_cube.dark[state_type]; orientation = GTK_ORIENTATION_HORIZONTAL; if (height > width) orientation = GTK_ORIENTATION_VERTICAL; dest.x = x + style->xthickness; dest.y = y + style->ythickness; dest.width = width - (style->xthickness * 2); dest.height = height - (style->ythickness * 2); if (orientation == GTK_ORIENTATION_HORIZONTAL) { modx = 4; mody = 0; } else { modx = 0; mody = 4; } switch (THINICE_RC_STYLE (style->rc_style)->mark_type1) { case MARKS_INVSLASH: /* Inverse //:es */ thinice_slash_two(cr, dark, light, x, y, width, height); break; case MARKS_DOT: /* Dots */ thinice_dot(cr, light, dark, x + width / 2 - modx, y + height / 2 - mody); thinice_dot(cr, light, dark, x + width / 2, y + height / 2); thinice_dot(cr, light, dark, x + width / 2 + modx, y + height / 2 + mody); break; case MARKS_INVDOT: /* Inverted dots */ thinice_dot(cr, dark, light, x + width / 2 - modx, y + height / 2 - mody); thinice_dot(cr, dark, light, x + width / 2, y + height / 2); thinice_dot(cr, dark, light, x + width / 2 + modx, y + height / 2 + mody); break; case MARKS_SLASH: default: thinice_slash_two(cr, light, dark, x, y, width, height); break; } } }
static void thinice_style_draw_slider(GtkStyle * style, cairo_t * cr, GtkStateType state_type, GtkShadowType shadow_type, GtkWidget * widget, const gchar *detail, gint x, gint y, gint width, gint height, GtkOrientation orientation) { ThiniceStyle *thinice_style = THINICE_STYLE (style); GdkPoint pointsh[7]; gint i, rect = FALSE, midlines = MARKS_SLASH; gint modx, mody; CHECK_ARGS #ifdef DEBUG printf("draw_slider(%s, %d, %d, %d)\n", detail, x, y, orientation); #endif #ifdef DEBUG printf("Slider... x,y=%d,%d width = %d, height = %d (%d)\n",x,y,width,height, state_type); #endif midlines = THINICE_RC_STYLE (style->rc_style)->mark_type1; #ifdef DEBUG printf("Midlines = %d\n", midlines); #endif if (THINICE_RC_STYLE (style->rc_style)->scrollbar_type == SCROLL_RECT) { rect = TRUE; } /* too small, use rect & no midlines */ if ((width <= SMALLEST_HANDLE) && (height <= SMALLEST_HANDLE)) { midlines = MARKS_NOTHING; rect = TRUE; } if (rect) { pointsh[0].x = x; pointsh[0].y = y; pointsh[1].x = x + width - 1; pointsh[1].y = y; pointsh[2].x = x + width - 1; pointsh[2].y = y + height - 1; pointsh[3].x = x; pointsh[3].y = y + height - 1; pointsh[4].x = x; pointsh[4].y = y; } else { int chopoff; if (orientation == GTK_ORIENTATION_HORIZONTAL) { chopoff = CLAMP(width-SMALLEST_HANDLE, 0, 6); } else { chopoff = CLAMP(height-SMALLEST_HANDLE, 0, 6); } pointsh[0].x = x; pointsh[0].y = y+height-1; pointsh[1].x = x; pointsh[1].y = y+chopoff; pointsh[2].x = x+chopoff; pointsh[2].y = y; pointsh[3].x = x+width-1; pointsh[3].y = y; pointsh[4].x = x+width-1; pointsh[4].y = y+height-1-chopoff; pointsh[5].x = x+width-1-chopoff; pointsh[5].y = y+height-1; pointsh[6].x = x; pointsh[6].y = y+height-1; } if (rect) { ge_cairo_set_color(cr, &thinice_style->color_cube.bg[state_type]); cairo_rectangle(cr, x, y, width, height); cairo_fill(cr); thinice_style_draw_shadow(style, cr, state_type, shadow_type, widget, detail, x, y, width, height); } else { /* Fill the polygon */ ge_cairo_polygon(cr, &thinice_style->color_cube.bg[state_type], pointsh, 6); /* Draw the light border */ for (i=0;i<3;i++) { ge_cairo_line(cr, &thinice_style->color_cube.light[state_type], pointsh[i].x,pointsh[i].y, pointsh[i+1].x,pointsh[i+1].y); } /* Draw the dark border */ for (i=3;i<6;i++) { ge_cairo_line(cr, &thinice_style->color_cube.dark[state_type], pointsh[i].x,pointsh[i].y, pointsh[i+1].x,pointsh[i+1].y); } } if (orientation == GTK_ORIENTATION_HORIZONTAL) { modx = 4; mody = 0; } else { modx = 0; mody = 4; } switch (midlines) { case MARKS_NOTHING: break; case MARKS_INVSLASH: /* Inverse //:es */ thinice_slash_two(cr, &thinice_style->color_cube.dark[state_type], &thinice_style->color_cube.light[state_type], x, y, width, height); break; case MARKS_DOT: thinice_dot(cr, &thinice_style->color_cube.light[state_type], &thinice_style->color_cube.dark[state_type], x + width / 2 - modx, y + height / 2 - mody); thinice_dot(cr, &thinice_style->color_cube.light[state_type], &thinice_style->color_cube.dark[state_type], x + width / 2, y + height / 2); thinice_dot(cr, &thinice_style->color_cube.light[state_type], &thinice_style->color_cube.dark[state_type], x + width / 2 + modx, y + height / 2 + mody); break; case MARKS_INVDOT: /* Inverted */ thinice_dot(cr, &thinice_style->color_cube.dark[state_type], &thinice_style->color_cube.light[state_type], x + width / 2 - modx, y + height / 2 - mody); thinice_dot(cr, &thinice_style->color_cube.dark[state_type], &thinice_style->color_cube.light[state_type], x + width / 2, y + height / 2); thinice_dot(cr, &thinice_style->color_cube.dark[state_type], &thinice_style->color_cube.light[state_type], x + width / 2 + modx, y + height / 2 + mody); break; case MARKS_SLASH: default: thinice_slash_two(cr, &thinice_style->color_cube.light[state_type], &thinice_style->color_cube.dark[state_type], x, y, width, height); break; } }
static void thinice_style_draw_arrow(GtkStyle * style, cairo_t * cr, GtkStateType state_type, GtkShadowType shadow_type, GtkWidget * widget, const gchar *detail, GtkArrowType arrow_type, gint fill, gint x, gint y, gint width, gint height) { ThiniceStyle *thinice_style = THINICE_STYLE (style); CairoColor *color1, *color2, *color3=NULL,*color4=NULL; gint half_width, half_height; CHECK_ARGS if (ge_is_combo_box(widget, FALSE) && (!ge_is_combo_box_entry(widget))) return; half_width = width / 2; half_height = height / 2; switch (shadow_type) { case GTK_SHADOW_IN: color1 = &thinice_style->color_cube.bg[state_type]; color2 = &thinice_style->color_cube.dark[state_type]; color3 = &thinice_style->color_cube.light[state_type]; color4 = &thinice_style->color_cube.black; break; case GTK_SHADOW_OUT: color1 = &thinice_style->color_cube.dark[state_type]; color2 = &thinice_style->color_cube.light[state_type]; color3 = &thinice_style->color_cube.black; color4 = &thinice_style->color_cube.bg[state_type]; break; case GTK_SHADOW_ETCHED_IN: color2 = &thinice_style->color_cube.light[state_type]; color1 = &thinice_style->color_cube.dark[state_type]; break; case GTK_SHADOW_ETCHED_OUT: color1 = &thinice_style->color_cube.dark[state_type]; color2 = &thinice_style->color_cube.light[state_type]; break; case GTK_SHADOW_NONE: color1 = &thinice_style->color_cube.bg[state_type]; color2 = &thinice_style->color_cube.bg[state_type]; break; default: return; } if (CHECK_DETAIL (detail, "vscrollbar") || CHECK_DETAIL (detail, "hscrollbar")) { switch (THINICE_RC_STYLE (style->rc_style)->mark_type2) { case MARKS_NOTHING: break; case MARKS_INVSLASH: thinice_slash_one(cr, color2, color1, x, y, width, height); break; case MARKS_DOT: thinice_dot(cr, color2, color1, x + half_width, y + half_height); break; case MARKS_INVDOT: thinice_dot(cr, color1, color2, x + half_width, y + half_height); break; case MARKS_ARROW: if (state_type == GTK_STATE_INSENSITIVE) thinice_arrow (cr, &thinice_style->color_cube.white, arrow_type, TRUE, x+1, y+1, width, height); thinice_arrow (cr, &thinice_style->color_cube.fg[state_type], arrow_type, TRUE, x, y, width, height); break; case MARKS_SLASH: default: thinice_slash_one(cr, color1, color2, x, y, width - 1, height - 1); break; } } else { if (state_type == GTK_STATE_INSENSITIVE) thinice_arrow (cr, &thinice_style->color_cube.white, arrow_type, TRUE, x+1, y+1, width, height); thinice_arrow (cr, &thinice_style->color_cube.fg[state_type], arrow_type, TRUE, x, y, width, height); } }
static guint thinice_rc_style_parse (GtkRcStyle *rc_style, GtkSettings *settings, GScanner *scanner) { static GQuark scope_id = 0; ThiniceRcStyle *theme_data = THINICE_RC_STYLE (rc_style); guint old_scope; guint token; guint i; /* Set up a new scope in this scanner. */ /* g_print("theme_parse_rc_style(\"%s\")\n", rc_style->name); */ if (!scope_id) scope_id = g_quark_from_string("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)) { g_scanner_freeze_symbol_table(scanner); for (i = 0; i < n_theme_symbols; i++) { g_scanner_scope_add_symbol(scanner, scope_id, theme_symbols[i].name, GINT_TO_POINTER(theme_symbols[i].token)); } g_scanner_thaw_symbol_table(scanner); } /* We're ready to go, now parse the top level */ /* theme_data = g_new0(ThiniceRcStyle, 1); */ theme_data->scrollbar_type = DEFAULT_SCROLLSHAPE; theme_data->scrollbar_marks = DEFAULT_SCROLLBARMARKS; theme_data->scroll_button_marks = DEFAULT_SCROLLBUTTONMARKS; theme_data->handlebox_marks = DEFAULT_HANDLEBOXMARKS; theme_data->mark_type1 = DEFAULT_MARKTYPE1; theme_data->mark_type2 = DEFAULT_MARKTYPE2; token = g_scanner_peek_next_token(scanner); while (token != G_TOKEN_RIGHT_CURLY) { switch (token) { case TOKEN_RECTSCROLLBAR: token = theme_parse_boolean(scanner, TOKEN_RECTSCROLLBAR, &i); if (token != G_TOKEN_NONE) break; if (i == FALSE) theme_data->scrollbar_type = SCROLL_SHAPED; else theme_data->scrollbar_type = SCROLL_RECT; break; case TOKEN_SCROLLBUTTONMARKS: token = theme_parse_boolean(scanner, TOKEN_SCROLLBUTTONMARKS, &i); if (token != G_TOKEN_NONE) break; if (i == TRUE) theme_data->mark_type2 = MARKS_SLASH; else theme_data->mark_type2 = MARKS_NOTHING; /* if (i == TRUE) theme_data->scroll_button_marks = MARKS_ON; else theme_data->scroll_button_marks = MARKS_OFF; */ break; case TOKEN_SCROLLBARMARKS: token = theme_parse_boolean(scanner, TOKEN_SCROLLBARMARKS, &i); if (token != G_TOKEN_NONE) break; if (i == TRUE) theme_data->mark_type1 = MARKS_SLASH; else theme_data->mark_type1 = MARKS_NOTHING; /* if (i == TRUE) theme_data->scrollbar_marks = MARKS_ON; else theme_data->scrollbar_marks = MARKS_OFF; */ break; case TOKEN_HANDLEBOXMARKS: token = theme_parse_boolean(scanner, TOKEN_HANDLEBOXMARKS, &i); if (token != G_TOKEN_NONE) break; if (i == TRUE) theme_data->handlebox_marks = MARKS_ON; else theme_data->handlebox_marks = MARKS_OFF; break; case TOKEN_MARKTYPE1: token = theme_parse_marktype(scanner, TOKEN_MARKTYPE1, &i); if (token != G_TOKEN_NONE) break; theme_data->mark_type1 = i; break; case TOKEN_MARKTYPE2: token = theme_parse_marktype(scanner, TOKEN_MARKTYPE2, &i); if (token != G_TOKEN_NONE) break; theme_data->mark_type2 = i; break; case TOKEN_PANEDDOTS: token = theme_parse_paned(scanner, TOKEN_PANEDDOTS, &i); if (token != G_TOKEN_NONE) break; theme_data->paned_dots = i; break; default: g_scanner_get_next_token(scanner); token = G_TOKEN_RIGHT_CURLY; break; } if (token != G_TOKEN_NONE) { g_free(theme_data); return token; } token = g_scanner_peek_next_token(scanner); } g_scanner_get_next_token(scanner); g_scanner_set_scope(scanner, old_scope); return G_TOKEN_NONE; }