gtk2/tests/testboxcss.c
Benjamin Otte a938c14d11 build: Add gtk-css static library
This library is meant to be the new CSS library that gets used from GDK,
GSK and GTK for string printing and parsing.

As a first step, move GtkCssProviderError into it.

While doing so, split it into GtkCssParserError (for critical problems)
and GtkCssParserWarning (for non-critical problems).
2019-04-12 19:34:28 +02:00

238 lines
7.8 KiB
C

/* testbox.c
*
* Copyright (C) 2010 Benjamin Otte <otte@gnome.ogr>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <gtk/gtk.h>
/* This is exactly the style information you've been looking for */
#define GTK_STYLE_PROVIDER_PRIORITY_FORCE G_MAXUINT
#define DEFAULT_CSS \
".play {\n" \
" background-image: none;\n" \
" background-color: red;\n" \
" border-color: black;\n" \
" border-radius: 0px;\n" \
"}\n" \
"\n" \
".play:nth-child(even) {\n" \
" background-color: yellow;\n" \
" color: green;\n" \
"}\n" \
"\n" \
".play:nth-child(first) {\n" \
" border-radius: 5px 0px 0px 5px;\n" \
"}\n" \
"\n" \
".play:nth-child(last) {\n" \
" border-radius: 0px 5px 5px 0px;\n" \
"}\n" \
"\n"
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 (error->domain == GTK_CSS_PARSER_WARNING)
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);
g_free (text);
}
static void
remove_widget (GtkWidget *widget)
{
gtk_container_remove (GTK_CONTAINER (gtk_widget_get_parent (widget)), widget);
}
static int count = 0;
static void
add_button (GtkBox *box)
{
GtkWidget* button;
char *text;
text = g_strdup_printf ("Remove %d", ++count);
button = (GtkWidget *)gtk_button_new_with_label (text);
g_free (text);
gtk_style_context_add_class (gtk_widget_get_style_context (button), "play");
g_signal_connect_swapped (button,
"clicked",
G_CALLBACK (remove_widget),
button);
gtk_widget_show (button);
gtk_container_add (GTK_CONTAINER (box), button);
}
static void
add_toolbutton (GtkToolbar *toolbar)
{
GtkWidget* button;
char *text;
text = g_strdup_printf ("Remove %d", ++count);
button = (GtkWidget *)gtk_tool_button_new (NULL, text);
g_free (text);
gtk_style_context_add_class (gtk_widget_get_style_context (button), "play");
g_signal_connect_swapped (button,
"clicked",
G_CALLBACK (remove_widget),
button);
gtk_widget_show (button);
gtk_container_add (GTK_CONTAINER (toolbar), button);
}
static void
set_orientation (GtkSwitch *switch_)
{
gtk_widget_set_default_direction (gtk_switch_get_active (switch_) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL);
}
gint
main (gint argc, gchar **argv)
{
GtkWidget *window, *main_box, *container, *child;
GtkWidget *box, *toolbar;
GtkStyleProvider *provider;
GtkTextBuffer *css;
gtk_init ();
css = gtk_text_buffer_new (NULL);
gtk_text_buffer_create_tag (css,
"warning",
"background", "rgba(255,255,0,0.3)",
NULL);
gtk_text_buffer_create_tag (css,
"error",
"background", "rgba(255,0,0,0.3)",
NULL);
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
provider,
GTK_STYLE_PROVIDER_PRIORITY_FORCE);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
main_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_container_add (GTK_CONTAINER (window), main_box);
toolbar = gtk_toolbar_new ();
gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_TEXT);
gtk_container_add (GTK_CONTAINER (main_box), toolbar);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add (GTK_CONTAINER (main_box), box);
container = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_min_content_width (GTK_SCROLLED_WINDOW (container), 200);
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (container), 200);
gtk_widget_set_vexpand (container, TRUE);
gtk_container_add (GTK_CONTAINER (main_box), container);
child = gtk_text_view_new_with_buffer (css);
gtk_container_add (GTK_CONTAINER (container), child);
g_signal_connect (css,
"changed",
G_CALLBACK (css_text_changed),
provider);
gtk_text_buffer_set_text (css,
DEFAULT_CSS,
-1);
g_signal_connect (provider,
"parsing-error",
G_CALLBACK (show_parsing_error),
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_container_add (GTK_CONTAINER (main_box), container);
child = gtk_switch_new ();
gtk_switch_set_active (GTK_SWITCH (child), gtk_widget_get_default_direction () == GTK_TEXT_DIR_LTR);
g_signal_connect (child,
"notify::active",
G_CALLBACK (set_orientation),
NULL);
gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_label_new ("left-to-right");
gtk_widget_set_hexpand (child, TRUE);
gtk_widget_set_halign (child, GTK_ALIGN_START);
gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label ("Add toolbutton");
g_signal_connect_swapped (child,
"clicked",
G_CALLBACK (add_toolbutton),
toolbar);
gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label ("Add button");
g_signal_connect_swapped (child,
"clicked",
G_CALLBACK (add_button),
box);
gtk_container_add (GTK_CONTAINER (container), child);
add_toolbutton (GTK_TOOLBAR (toolbar));
add_toolbutton (GTK_TOOLBAR (toolbar));
add_toolbutton (GTK_TOOLBAR (toolbar));
add_toolbutton (GTK_TOOLBAR (toolbar));
add_button (GTK_BOX (box));
add_button (GTK_BOX (box));
add_button (GTK_BOX (box));
add_button (GTK_BOX (box));
gtk_widget_show (window);
gtk_main ();
return 0;
}