GTK 버튼 스타일 / CSS 수정 및 즉시 업데이트 / 새로 고침

존 U

내가 GTK 멍청이라고 말하면서 다른 사람의 코드를 수정하기 위해 낙하산을 탔다는 말로 시작하겠습니다.

그래서 우리는 색상을 변경하기 위해 즉석에서 수정할 수있는 색상 사각형 인 GTK 버튼 그리드를 가지고 있습니다.

현재 프로그램 흐름은 다음과 같습니다.

다음과 같이 25 개의 버튼 색상 스타일 목록을 포함하는 CSS를 생성합니다.

.btn_colour_id_XX{background: #336699}
.btn_colour_id_XX:active{ background: shade(#336699, 0.5) }

그런 다음 원하는 색상을 기준으로 각 버튼에 스타일을 추가합니다.

GtkStyleContext *context = gtk_widget_get_style_context(button);
snprintf(value, 20, "btn_colour_id_%02d", colour_id); // Apply colour_id to button
gtk_style_context_add_class(context, value);

그리고 버튼으로 가득 찬 창을 표시합니다.

버튼 색상 수정 하라는 호출을 받으면 코드는 해당 버튼의 CSS 스타일을 요청 된 스타일로 전환합니다.

snprintf(desired_class, 10, "btn_colour_id_%02d", color_id); // Style we want for button
for (GList *l = classes; l != NULL; l = l->next)
{
    char *classname = (char *)l->data;
    if (strstr(classname, "btn_colour_id_") == NULL)
    {
        continue;
    }
    if (strlen(classname) != strlen(desired_class) || strstr(classname, desired_class) == NULL)
    {
        g_message("Swapping [%s] colour from %s > %s", name, classname, desired_class);
        gtk_style_context_remove_class(context, (const gchar *)l->data);
        gtk_style_context_add_class(context, desired_class);
    }
}

그러나, 무엇을 설정 할 수있는 일이있다 NEEDS 어떤 버튼을 어떤 RGB 색상 온 - 더 - 플라이 , 나는 2 ^ 24 CSS 스타일을 작성하면 해당위한 최적의 경로입니다 convincted 아니에요;)

내 생각은 대신에 각 버튼에 자체 RGB 색상이 있는 자체 CSS ID 선택기를 제공하고 필요에 따라 CSS의 색상 값을 수정하는 것입니다 ... 그러나 GTK 문서를보고 반쯤 죽을 정도의 Google 검색을 수행했습니다. t 기존 CSS를 수정 하고 표시된 버튼에 해당 변경 사항을 반영 할 수있는 명백한 방법을 확인 합니다.

누구든지 이것에 대해 올바른 방향으로 나를 가리킬 수 있습니까?


편집 : 지금까지 몇 가지 잠재적 인 예를 찾았습니다 .

이 하나...

static GtkCssProvider* provider = NULL;

static void set_label_color(GtkWidget* label, const char* color)
{
    const char* format = "label { color: %s; }";
    size_t length = strlen(format) - 2 + 1;
    char style[length];
    sprintf(style, format, color);

    if (provider == NULL) {
        // only create and add the provider the first time
        provider = gtk_css_provider_new();
        gtk_style_context_add_provider(
            gtk_widget_get_style_context(label),
            GTK_STYLE_PROVIDER(provider),
            GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
        g_object_unref(provider);
    }

    gtk_css_provider_load_from_data(provider, style, -1, NULL);
} 

그리고 이것...

void set_background_color(GtkWidget *w, gchar *color)
{
    GtkCssProvider *gcp;
    GtkStyleContext *gsc;
    gsc = gtk_widget_get_style_context(w);
    const gchar *type = g_type_name (G_TYPE_FROM_INSTANCE (w));
    gchar *str = g_strdup_printf ("%s {background-color: %s;}", type,
color);
    gcp= gtk_css_provider_new();
    gtk_css_provider_load_from_data(gcp, str, -1, 0);
    g_free (str);
    gtk_style_context_add_provider(gsc, GTK_STYLE_PROVIDER(gcp),
    GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
}

// I don't know if there is a memory leak here though...

또한 이들 중 하나에 메모리 누수가 있는지 그리고 공급자가 정적인지 파괴되었는지 / 위젯의 컨텍스트에 추가 된 후 free () 될 수 있는지 확실하지 않습니다 ... 문서 / 예제는 이것에 대해 모호하게 보입니다. , 앱에서 여러 프로 비저를 생성 / 큐레이팅하는 방법에 대한 적절한 자습서가있는 사람이 있습니까?

첫 번째 예는 provier를 반복해서 다시 작성하는 것이 약간 거칠어 보이지만 나에게 가장 유망 해 보입니다.

존 U

좋아, 나는 그것을 스스로 알아 냈다. 이것은 그것을하는 완전히 잘못된 방법 일 수 있지만 작동합니다.

모든 버튼에 대한 정보가 포함 된 전역 컨텍스트에서 CSS 공급자 (사용 후 g_object_deref ()가 아닌)를 유지하는 것이 포함됩니다. 그런 다음 매번 CSS 공급자를 덮어 쓰면 TFM이 완벽하다고 말합니다.

우리는 CSS 제공자와 그에 대한 참조를 유지해야합니다. GTK 는 객체를 생성 한 후에이 정렬 정보를 다시 가져 오기 위해 많은 함수가 누락 된 것 같습니다. 새로 추가, 교체 및 삭제 / 삭제할 수 있지만 기존의 것을 다시 읽고 수정할 수 없습니다. 대부분의 UI는 한 번만 작성하면됩니다.

문맥:

struct dev_button
{
    GtkWidget *btn;
    GtkCssProvider *bp;
};

버튼 만들기 :

dbp = &_context->buttons[i]; // Pointer to a dev_button struct

GtkStyleContext *context = gtk_widget_get_style_context(dbp->btn);
dbp->bp = gtk_css_provider_new();
    
// Create a CSS for this button
snprintf(css, LONG_STR, ".btnid_%02d{background: #%06X}", btnID, colour);
        
// Convert CSS to provider
gtk_css_provider_load_from_data(dbp->bp, tstr, -1, NULL);
        
// Add provider to button
gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER(dbp->bp), GTK_STYLE_PROVIDER_PRIORITY_USER);
        
// Give the button the CSS style/class corresponding to the one we just created for it
snprintf(value, SHORT_STR, "btnid_%02d", buttonId); // Sets default colour from table
gtk_style_context_add_class(context, value);

버튼의 색상을 동적으로 변경 :

// Create new CSS
snprintf(temp_css, LONG_STR, ".btnid_%02d{background: #%06X}", btnID, new_colour);
// Re-load into provider
gtk_css_provider_load_from_data(dbp->bp, tstr, -1, NULL);

그게 다이고 작동하며 메모리 누수도 없습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Gtk3 (pygobject) 및 python3의 위젯 업데이트 / 새로 고침

분류에서Dev

버튼 클릭시 페이지 일부 새로 고침, 새 URL에서 전체 페이지 새로 고침

분류에서Dev

Ajax 및 Rails 4 : 인스턴스 변수 생성 및 새로 고침없이 뷰 업데이트

분류에서Dev

SQL 업데이트 후 PHP 텍스트 영역 새로 고침 및 텍스트 표시

분류에서Dev

파일을 열지 않고 Excel 파일 (데이터 새로 고침 및 수식 업데이트)을 어떻게 업데이트합니까?

분류에서Dev

Datatables 새로 고침 버튼 및 멋진 아이콘 회전

분류에서Dev

입력 필드를 수동으로 편집하고 + 및-버튼을 사용하여 데이터베이스 항목을 즉시 변경

분류에서Dev

Google 어스에서 KML 스타일 시트 새로 고침

분류에서Dev

Kendo 업로드 컨트롤의 새로 고침 버튼 클릭시 사용자 지정 자바 스크립트 기능 실행

분류에서Dev

C # 버튼 업데이트 (새로 고침) xml 값

분류에서Dev

페이지 새로 고침 및 제출 버튼없이 이미지 업로드

분류에서Dev

새로 고침 및 상태 변경시 페이지 업데이트

분류에서Dev

CSS 스타일을 새로 고침 하시겠습니까? (페이지 다시 그리기)

분류에서Dev

CSS 스타일을 새로 고침 하시겠습니까? (페이지 다시 그리기)

분류에서Dev

Android 새로 고침 버튼이 작업 표시 줄에 나타나지 않습니다.

분류에서Dev

Android 앱 작업 표시 줄의 새로 고침 버튼

분류에서Dev

Android : 버튼 클릭시 다른 활동의 조각 새로 고침 / 업데이트

분류에서Dev

데이터베이스에서 textview 새로 고침 / 다시로드 | 버튼 탭 기능

분류에서Dev

새로 고침시 React 후크 및 컨텍스트 API localstorage

분류에서Dev

CKEDITOR-툴바의 '저장'버튼 클릭시 페이지 새로 고침 방지 및 자체 기능 호출

분류에서Dev

Perfom ASP 버튼 클릭, VB 코드 처리 및 페이지 새로 고침없이 Jscript 수행

분류에서Dev

MVVM 업데이트 콤보 상자 항목 소스 및 새로 고침

분류에서Dev

Yii Captcha에 새로 고침 버튼이 표시되지 않음

분류에서Dev

Captcha MVC 4 새로 고침 버튼이 표시되지 않음

분류에서Dev

버튼 클릭시 페이지 새로 고침 방지

분류에서Dev

새로 고침시 버튼이 활성화 됨

분류에서Dev

링크 버튼 클릭시 페이지 새로 고침 방지

분류에서Dev

페이지 새로 고침 또는 버튼 클릭 이벤트시 텍스트 상자를 지우지 않음

분류에서Dev

Struts2 jqGrid 새로 고침 버튼 텍스트

Related 관련 기사

  1. 1

    Gtk3 (pygobject) 및 python3의 위젯 업데이트 / 새로 고침

  2. 2

    버튼 클릭시 페이지 일부 새로 고침, 새 URL에서 전체 페이지 새로 고침

  3. 3

    Ajax 및 Rails 4 : 인스턴스 변수 생성 및 새로 고침없이 뷰 업데이트

  4. 4

    SQL 업데이트 후 PHP 텍스트 영역 새로 고침 및 텍스트 표시

  5. 5

    파일을 열지 않고 Excel 파일 (데이터 새로 고침 및 수식 업데이트)을 어떻게 업데이트합니까?

  6. 6

    Datatables 새로 고침 버튼 및 멋진 아이콘 회전

  7. 7

    입력 필드를 수동으로 편집하고 + 및-버튼을 사용하여 데이터베이스 항목을 즉시 변경

  8. 8

    Google 어스에서 KML 스타일 시트 새로 고침

  9. 9

    Kendo 업로드 컨트롤의 새로 고침 버튼 클릭시 사용자 지정 자바 스크립트 기능 실행

  10. 10

    C # 버튼 업데이트 (새로 고침) xml 값

  11. 11

    페이지 새로 고침 및 제출 버튼없이 이미지 업로드

  12. 12

    새로 고침 및 상태 변경시 페이지 업데이트

  13. 13

    CSS 스타일을 새로 고침 하시겠습니까? (페이지 다시 그리기)

  14. 14

    CSS 스타일을 새로 고침 하시겠습니까? (페이지 다시 그리기)

  15. 15

    Android 새로 고침 버튼이 작업 표시 줄에 나타나지 않습니다.

  16. 16

    Android 앱 작업 표시 줄의 새로 고침 버튼

  17. 17

    Android : 버튼 클릭시 다른 활동의 조각 새로 고침 / 업데이트

  18. 18

    데이터베이스에서 textview 새로 고침 / 다시로드 | 버튼 탭 기능

  19. 19

    새로 고침시 React 후크 및 컨텍스트 API localstorage

  20. 20

    CKEDITOR-툴바의 '저장'버튼 클릭시 페이지 새로 고침 방지 및 자체 기능 호출

  21. 21

    Perfom ASP 버튼 클릭, VB 코드 처리 및 페이지 새로 고침없이 Jscript 수행

  22. 22

    MVVM 업데이트 콤보 상자 항목 소스 및 새로 고침

  23. 23

    Yii Captcha에 새로 고침 버튼이 표시되지 않음

  24. 24

    Captcha MVC 4 새로 고침 버튼이 표시되지 않음

  25. 25

    버튼 클릭시 페이지 새로 고침 방지

  26. 26

    새로 고침시 버튼이 활성화 됨

  27. 27

    링크 버튼 클릭시 페이지 새로 고침 방지

  28. 28

    페이지 새로 고침 또는 버튼 클릭 이벤트시 텍스트 상자를 지우지 않음

  29. 29

    Struts2 jqGrid 새로 고침 버튼 텍스트

뜨겁다태그

보관