GTK 3에서 사용자 정의 위젯을 만들려고합니다. 다른 모든 테마가 훌륭하게 작동하는 동안 특정 GTK 테마에만 나타나는 그리기 문제를 알아 챘습니다. gtk_render_background()
을 호출하여 배경을 그리는 코드로 문제를 좁혔습니다. 일부 테마의 경우 배경이 단색 검정으로 렌더링되지만 테마의 기본 배경색은 아닙니다. 아래는 내 그리기 기능의 단순화 된 버전입니다.사용자 정의 GTK 위젯의 배경이 단색으로 렌더링됩니다.
static void gtk_databox_ruler_draw_ticks(GtkDataboxRuler *ruler)
{
GtkWidget *widget;
GtkStateFlags state;
cairo_t *cr;
GtkStyleContext *style_context;
gint width, height;
if (!gtk_widget_is_drawable(GTK_WIDGET(ruler))) {
return;
}
widget = GTK_WIDGET(ruler);
state = gtk_widget_get_state_flags(widget);
style_context = gtk_widget_get_style_context(widget);
gtk_style_context_save(style_context);
gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_DEFAULT);
gtk_style_context_set_state(style_context, state);
/* <test-code> */
GdkRGBA test;
gtk_style_context_get_background_color(style_context, gtk_widget_get_state_flags(widget), &test);
/* </test-code> */
width = gtk_widget_get_allocated_width(widget);
height = gtk_widget_get_allocated_height(widget);
cr = cairo_create(ruler->priv->backing_surface);
gtk_render_background(style_context, cr, 0, 0, width, height);
gtk_style_context_restore(style_context);
cairo_destroy(cr);
}
나는 배경색을 조회 할 몇 가지 테스트 코드를 추가 GDB에 중단 점을 설정
우분투의 분위기 테마를 사용하는 경우 :
(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625,
blue = 0.94117647058823528, alpha = 1}
우분투의 고 대비 테마를 사용하여
:(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}
잘못된 방식으로 새 GtkStyleContext를 사용하는지 궁금하거나 테마가 깨졌습니다. 문제의 원인을 어떻게 좁힐 수 있습니까?
GtkStyleContext에 대한 좋은 소개를 가르쳐 주시면 감사하겠습니다. 공식 API 문서는 근본적인 개념을 이해하는 데별로 도움이되지 않습니다.
어디에서 그림을 그리는 지 모르겠지만 그리기 가상 메서드에서 위젯 만 그릴 수 있습니다. 예기치 않은 동작을 일으킬 수있는 코드가 너무 많이 있습니다. – erick2red
' gtk_databox_ruler_draw_ticks' 함수는 위젯의 그리기 함수 ('GtkWidgetClass-> draw')에서 호출됩니다. 위의 코드에서 수정해야 할 사항을 지적 할 수 있습니까? – dasup
도움이 될만한 곳이지만, (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red