From 677941dc4898ce2d4c374a7da4236bc00341e62b Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 22 May 2012 13:41:05 +0200 Subject: [PATCH] gtk-demo: Add animated pixbufs example --- demos/gtk-demo/Makefile.am | 2 + demos/gtk-demo/css_pixbufs.c | 127 ++++++++++++++++++++++++++++++ demos/gtk-demo/css_pixbufs.css | 10 +++ demos/gtk-demo/demo.gresource.xml | 12 +++ 4 files changed, 151 insertions(+) create mode 100644 demos/gtk-demo/css_pixbufs.c diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index 0ff892ed70..1b7fa052cc 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -18,6 +18,7 @@ demos = \ css_accordion.c \ css_basics.c \ css_multiplebgs.c \ + css_pixbufs.c \ dialog.c \ drawingarea.c \ editable_cells.c \ @@ -118,6 +119,7 @@ RESOURCES= application.ui \ css_accordion.css \ css_basics.css \ css_multiplebgs.css \ + css_pixbufs.css \ cssview.css \ fancy.css \ reset.css diff --git a/demos/gtk-demo/css_pixbufs.c b/demos/gtk-demo/css_pixbufs.c new file mode 100644 index 0000000000..c2b32b51cb --- /dev/null +++ b/demos/gtk-demo/css_pixbufs.c @@ -0,0 +1,127 @@ +/* CSS Theming/Animated backgrounds + * + * This demo is done in honour of the Pixbufs demo further down. It is done exclusively + * with CSS as the background of the window. + */ + +#include + +static GtkWidget *window = NULL; + +static void +show_parsing_error (GtkCssProvider *provider, + GtkCssSection *section, + const GError *error, + GtkTextBuffer *buffer) +{ + GtkTextIter start, end; + const char *tag_name; + + gtk_text_buffer_get_iter_at_line_index (buffer, + &start, + gtk_css_section_get_start_line (section), + gtk_css_section_get_start_position (section)); + gtk_text_buffer_get_iter_at_line_index (buffer, + &end, + gtk_css_section_get_end_line (section), + gtk_css_section_get_end_position (section)); + + if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED)) + tag_name = "warning"; + else + tag_name = "error"; + + gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end); +} + +static void +css_text_changed (GtkTextBuffer *buffer, + GtkCssProvider *provider) +{ + GtkTextIter start, end; + char *text; + + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_get_end_iter (buffer, &end); + gtk_text_buffer_remove_all_tags (buffer, &start, &end); + + text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); + gtk_css_provider_load_from_data (provider, text, -1, NULL); + g_free (text); + + gtk_style_context_reset_widgets (gdk_screen_get_default ()); +} + +static void +apply_css (GtkWidget *widget, GtkStyleProvider *provider) +{ + gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT); + if (GTK_IS_CONTAINER (widget)) + gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider); +} + +GtkWidget * +do_css_pixbufs (GtkWidget *do_widget) +{ + if (!window) + { + GtkWidget *paned, *container, *child; + GtkStyleProvider *provider; + GtkTextBuffer *text; + GBytes *bytes; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); + gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_widget_destroyed), &window); + + paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); + gtk_container_add (GTK_CONTAINER (window), paned); + + /* Need a filler so we get a handle */ + child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_container_add (GTK_CONTAINER (paned), child); + + text = gtk_text_buffer_new (NULL); + gtk_text_buffer_create_tag (text, + "warning", + "underline", PANGO_UNDERLINE_SINGLE, + NULL); + gtk_text_buffer_create_tag (text, + "error", + "underline", PANGO_UNDERLINE_ERROR, + NULL); + + provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); + + container = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (paned), container); + child = gtk_text_view_new_with_buffer (text); + gtk_container_add (GTK_CONTAINER (container), child); + g_signal_connect (text, + "changed", + G_CALLBACK (css_text_changed), + provider); + + bytes = g_resources_lookup_data ("/css_pixbufs/gtk.css", 0, NULL); + gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes)); + + g_signal_connect (provider, + "parsing-error", + G_CALLBACK (show_parsing_error), + gtk_text_view_get_buffer (GTK_TEXT_VIEW (child))); + + apply_css (window, provider); + } + + if (!gtk_widget_get_visible (window)) + gtk_widget_show_all (window); + else + { + gtk_widget_destroy (window); + window = NULL; + } + + return window; +} diff --git a/demos/gtk-demo/css_pixbufs.css b/demos/gtk-demo/css_pixbufs.css index c6440b3187..73d0a16662 100644 --- a/demos/gtk-demo/css_pixbufs.css +++ b/demos/gtk-demo/css_pixbufs.css @@ -64,3 +64,13 @@ GtkWindow { background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat; animation: move-the-image infinite linear 3s, size-the-image infinite alternate ease-in-out 0.75s; } + +/* Make the text editor has a nice style */ +.view, .scrollbar, .pane-separator { + color: black; + background-color: rgba(255,255,255,0.5); +} + +.view:selected { + background-color: rgba(127,127,255,0.5); +} diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index 12c7c73637..8931545d35 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -27,4 +27,16 @@ theming.ui + + css_pixbufs.css + background.jpg + apple-red.png + gnome-applets.png + gnome-calendar.png + gnome-foot.png + gnome-gmush.png + gnome-gimp.png + gnome-gsame.png + gnu-keys.png +