GTK3 GtkCssProvider не работает - PullRequest
0 голосов
/ 30 апреля 2018

Конфигурация: Ubunutu Server 18.04 LTS / Xorg / openbox / GTK3

Я изо всех сил пытался понять, почему я не могу заставить GtkCssProvider работать даже с самым простым элементом. Если работали с разными примерами, но вот один похожий на другой пост.

Вот код приложения, который будет отображать метку.

#include <gtk/gtk.h>

int main(int argc, char *argv[]) 
{
gtk_init(&argc, &argv);

GtkWidget *         window          = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GtkWidget *         label           = gtk_label_new("Label 0123456789");
GtkCssProvider *    cssProvider     = gtk_css_provider_new();

g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

if( gtk_css_provider_load_from_path(cssProvider, "csstest.css", NULL) )
{
     gtk_style_context_add_provider(gtk_widget_get_style_context(label),
                                        GTK_STYLE_PROVIDER(cssProvider),
                                        GTK_STYLE_PROVIDER_PRIORITY_USER);

    gtk_container_add(GTK_CONTAINER(window), label);
    gtk_widget_show_all(window);

    gtk_main();
}

return 0;
}

Файл .CSS прост:

GtkLabel {
    color: green;
}

В одном сообщении указывалось, что gtk_style_context_add_provider () следует заменить вызовом gtk_style_context_add_provider_for_screen (). Ни один из них, кажется, не имеет никакого эффекта. Ярлык отображается в стиле по умолчанию черный на сером. Так в чем же заключается хитрость применения стиля Css к виджету.

Мое требование - иметь разные стили, которые я могу установить для разных виджетов. Я предполагаю, что могу создать некоторый тип конструкции класса в Css, который позволит мне применять разные темы к одному и тому же виджету с помощью вызова gtk_style_context_add_provider (). Однако я также не смог понять это. Я вижу, как я могу установить стиль в Css для определенного именованного виджета (через ID), но это, кажется, только предопределенное определение statc. Любые предложения по этому вопросу будут полезны.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Спасибо ebassi за разъяснения по изменению css. Я не должен был начинать с более старого примера. Вот законченный пример работы в GTK 3.22, на котором я остановился, чтобы продемонстрировать динамическое изменение внешнего вида с помощью стилей CSS:

#include <gtk/gtk.h>

GtkWidget *         label1;
GtkWidget *         label2;
GtkWidget *         label3;

// Handler to change the appearance of the widgets from their original
void button_clicked (GtkButton * button, gpointer   user_data)
{

    // names are defined in the .CSS
    gtk_widget_set_name( GTK_WIDGET(label1) , "" );
    gtk_widget_set_name( GTK_WIDGET(label2) , "white-widget" );
    gtk_widget_set_name( GTK_WIDGET(label3) , "red-widget" );
}

// Set the style provider for the widgets
static void apply_css_provider (GtkWidget * widget, GtkCssProvider * cssstyleProvider)
{
    gtk_style_context_add_provider ( gtk_widget_get_style_context(widget), GTK_STYLE_PROVIDER(cssstyleProvider) , GTK_STYLE_PROVIDER_PRIORITY_USER );

    // For container widgets, apply to every child widget on the container
    if (GTK_IS_CONTAINER (widget))
    {
        gtk_container_forall( GTK_CONTAINER (widget), (GtkCallback)apply_css_provider , cssstyleProvider);
    }
}

int main(int argc, char *argv[]) 
{
    gtk_init(&argc, &argv);

    GtkWidget *         window          = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkCssProvider *    cssProvider     = gtk_css_provider_new();
    GtkWidget *         fixed           = gtk_fixed_new();
    GtkWidget *         button          = gtk_button_new_with_label ("Change");

    //create the labels for this test
    label1  = gtk_label_new("Label 0001");
    label2  = gtk_label_new("Label 23456789");
    label3  = gtk_label_new("Label 3");

    //setup container and add widgets
    gtk_container_add (GTK_CONTAINER (window), fixed);

    gtk_fixed_put( GTK_FIXED(fixed), label1 , 30 , 30 );
    gtk_fixed_put( GTK_FIXED(fixed), label2 , 30 , 50 );
    gtk_fixed_put( GTK_FIXED(fixed), label3 , 30 , 70 );
    gtk_fixed_put( GTK_FIXED(fixed), button , 30 , 110 );

    //register the handlers
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    g_signal_connect(button, "clicked", G_CALLBACK(button_clicked), NULL );


    if( gtk_css_provider_load_from_path(cssProvider, "csstest.css", NULL) )
    {
        apply_css_provider( window , cssProvider );

        // set a default style - name is defined in .CSS file
        gtk_widget_set_name( GTK_WIDGET(label1) , "red-widget" );

        gtk_widget_show_all(window);

        gtk_main();
    }

    return 0;
}

csstest.css:

/* default coloring of widgets */
* {
    background-color: #00ee00;    
}

#red-widget {
    color: white;
    background-color: red;
}

#white-widget {
    color: red;
    background-color: white;
}

button {
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
    border-top-left-radius: 0;
    border-top-right-radius: 0;
    background-image: none;
}
0 голосов
/ 01 мая 2018

CSS-селектор для метки label, а не GtkLabel:

label {
    color: green;
}

См. Справочник GtkLabel API , в котором перечислены действительные селекторы.

Вы также должны использовать GTK Inspector для проверки CSS-фрагментов.

Вы также можете прочитать справку API по обработке CSS в GTK, а также документацию GtkStyleContext .

...