В документации GTK + вы можете прочитать, что:
CSS определяет механизм, с помощью которого изменения в значениях свойств CSS могут вступать в силу постепенно, а не все сразу. GTK + также поддерживает эти переходы.
Итак, я со вчерашнего дня пытался запускать переходы в приложении, написанном на GTK. К сожалению, я не сделал даже go ни на шаг, потому что в документации нет разумного примера. Может ли кто-нибудь сказать мне, как запускать CSS переходы и анимацию в приложении GTK?
EDIT: это системная проблема. Я запустил программу на openSUSE Leap на виртуальной машине, и все работает. Теперь возникает вопрос, почему это не работает в openSUSE Tumbleweed? Вот примеры, которые я пытаюсь запустить, но безуспешно.
@keyframes spin {
to { -gtk-icon-transform: rotate(1turn); }
}
spinner {
animation-name: spin;
animation-duration: 1s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
button {
transition-property: width;
transition-duration: 2s;
transition-timing-function: linear;
transition-delay: 1s;
}
button:hover {
width: 300px;
}
вот файл поляны:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.36.0 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkWindow" id="main_window">
<property name="name">main_window</property>
<property name="can_focus">False</property>
<child>
<object class="GtkFixed" id="fixed">
<property name="name">fixed</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button">
<property name="label" translatable="yes">button</property>
<property name="name">button</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">107</property>
<property name="y">104</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label">
<property name="name">label</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="x">107</property>
<property name="y">17</property>
</packing>
</child>
<child>
<object class="GtkSpinner" id="spinner">
<property name="name">spinner</property>
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">True</property>
</object>
<packing>
<property name="x">107</property>
<property name="y">196</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<placeholder/>
</child>
</object>
</interface>
и основной. c
#include <gtk/gtk.h>
#include <stdlib.h>
GtkBuilder *builder;
// The highest level
GObject *main_window;
GObject *fixed;
// fixed level
GObject *label;
GObject *button;
GObject *spinner;
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
builder = gtk_builder_new_from_file("../glade.glade");
main_window = gtk_builder_get_object(builder, "main_window");
fixed = gtk_builder_get_object(builder, "fixed");
label = gtk_builder_get_object(builder, "label");
button = gtk_builder_get_object(builder, "button");
spinner = gtk_builder_get_object(builder, "spinner");
// Build signal structure
gtk_builder_connect_signals(builder, NULL);
g_signal_connect(main_window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// Prepare css file
GtkCssProvider *provider = gtk_css_provider_new();
gtk_css_provider_load_from_path(
provider, "../css.css", NULL);
gtk_style_context_add_provider_for_screen(
gdk_display_get_default_screen(gdk_display_get_default()),
GTK_STYLE_PROVIDER(provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
// Create window
gtk_widget_show(GTK_WIDGET(main_window));
gtk_main();
return (EXIT_SUCCESS);
}