2012-09-03 3 views
5

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 문서는 근본적인 개념을 이해하는 데별로 도움이되지 않습니다.

+0

어디에서 그림을 그리는 지 모르겠지만 그리기 가상 메서드에서 위젯 만 그릴 수 있습니다. 예기치 않은 동작을 일으킬 수있는 코드가 너무 많이 있습니다. – erick2red

+0

' gtk_databox_ruler_draw_ticks' 함수는 위젯의 그리기 함수 ('GtkWidgetClass-> draw')에서 호출됩니다. 위의 코드에서 수정해야 할 사항을 지적 할 수 있습니까? – dasup

+0

도움이 될만한 곳이지만, (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red

답변

4

지난 1 년이 지난 후에도 테마가없는 시스템에서 내 프로그램을 사용할 때 GTK3 기본 (내장) 스타일을 사용할 때도 발생하기 때문에 다시이 문제를 조사해야했습니다. . 설치됨.

문제의 원인은 일부 GTK 테마가 "기본 사례"에 대한 배경색을 정의하고 다른 것들은 그렇지 않다는 것입니다.

GTK3 default theme :

… 
* { 
    color: @fg_color; 
    border-color: shade (@bg_color, 0.6); 
    padding: 2px; 
    -GtkWindow-resize-grip-width: 0; 
    -GtkWindow-resize-grip-height: 0; 
    -GtkWindow-decoration-button-layout: 'icon:minimize,maximize,close'; 
} 

GtkWindow, .button, .slider { 
    background-color: @bg_color; 
} 
… 

Adwaita 테마 :

… 
* { 
    /* inherit the color from parent by default */ 
    color: inherit; 
    background-color: @theme_bg_color; 
} 
… 

는 배경이 그려하려면, 단순히 모든 걸쳐 정의 배경색이있는 위젯 클래스를 선택해야합니다 (대부분의) 테마. 나는 그것을 위해 버튼 클래스를 사용 : 캐치의

gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_BUTTON); 
2

어떤 버전의 우분투 및 GTK3를 사용하고 있습니까?

아마 gtk_style_context_set_junction_sides()으로 전화해야합니다.

GTK 개발자 중 한 사람인 Benjamin Otte가이 정보에 관심이있을 수 있습니다. How GTK styling works도 사용할 수 있습니다. GTK+3 Styling.

+0

우분투 12.04를 사용하고 있습니다. libgtk는 3.4.2-0ubuntu0 버전입니다.'gtk_style_context_set_junction_sides 'GTK_JUNCTION_BOTTOM'을'gtk_style_context_add_class' 다음에 설정했지만 고쳐주지는 않았습니다. 링크를 이용해 주셔서 감사합니다.하지만 CSS 측면에 더 초점을 맞추고 싶습니다. GtkStyl에 대한 더 많은 정보가 필요합니다. eContext면 (즉, 렌더링, 저장/복원 할 작업, 클래스 작동 방법). – dasup

1

일부는 여기에 점점이 될 수 있습니다, 하나의 배경 색상은 더 이상 필요 없다. https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-color의 문서 당

:

".이 기능은 보인다보다 훨씬 덜 유용하고, 새롭게 작성된 코드에서 사용할 수 없습니다 CSS가의 개념이 없다"배경색 "을 배경으로 수 이미지, 그라디언트 또는 단색을 포함한 기타 패턴이 될 수 있습니다."

+0

지적 해 주셔서 감사합니다! 위의 코드에서 테스트/디버깅 목적으로'gtk_style_context_get_background_color'를 사용했습니다. 실제 코드는 모든 종류의 backround 정의를 다루는 것으로 가정하는'gtk_render_background'를 호출합니다. 그러나'gtk_render_background'를 호출하면 특정 테마에 대한 단색 검정색 배경이됩니다. – dasup

관련 문제