내가 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를 반복해서 다시 작성하는 것이 약간 거칠어 보이지만 나에게 가장 유망 해 보입니다.
좋아, 나는 그것을 스스로 알아 냈다. 이것은 그것을하는 완전히 잘못된 방법 일 수 있지만 작동합니다.
모든 버튼에 대한 정보가 포함 된 전역 컨텍스트에서 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] 삭제
몇 마디 만하겠습니다