1#include <gtk/gtk.h>
2
3static GtkWidget *
4create_level_bar (void)
5{
6 GtkWidget *bar;
7
8 bar = gtk_level_bar_new ();
9 gtk_level_bar_set_min_value (GTK_LEVEL_BAR (bar), value: 0.0);
10 gtk_level_bar_set_max_value (GTK_LEVEL_BAR (bar), value: 10.0);
11
12 gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar),
13 GTK_LEVEL_BAR_OFFSET_LOW, value: 1.0);
14
15 gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar),
16 GTK_LEVEL_BAR_OFFSET_HIGH, value: 9.0);
17
18 gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar),
19 name: "full", value: 10.0);
20
21 gtk_level_bar_add_offset_value (GTK_LEVEL_BAR (bar),
22 name: "my-offset", value: 5.0);
23
24 return bar;
25}
26
27static void
28add_custom_css (void)
29{
30 GtkCssProvider *provider;
31 const char data[] =
32 "levelbar block.my-offset {"
33 " background: magenta;"
34 "}";
35
36 provider = gtk_css_provider_new ();
37 gtk_css_provider_load_from_data (css_provider: provider, data, length: -1);
38 gtk_style_context_add_provider_for_display (display: gdk_display_get_default (),
39 GTK_STYLE_PROVIDER (provider),
40 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
41}
42
43static gboolean
44increase_level (gpointer data)
45{
46 GtkLevelBar *bar = data;
47 double value;
48
49 value = gtk_level_bar_get_value (self: bar);
50 value += 0.1;
51 if (value >= gtk_level_bar_get_max_value (self: bar))
52 value = gtk_level_bar_get_min_value (self: bar);
53 gtk_level_bar_set_value (self: bar, value);
54
55 return G_SOURCE_CONTINUE;
56}
57
58static void
59toggle (GtkSwitch *sw, GParamSpec *pspec, GtkLevelBar *bar)
60{
61 if (gtk_switch_get_active (self: sw))
62 gtk_level_bar_set_mode (self: bar, mode: GTK_LEVEL_BAR_MODE_DISCRETE);
63 else
64 gtk_level_bar_set_mode (self: bar, mode: GTK_LEVEL_BAR_MODE_CONTINUOUS);
65}
66
67static void
68quit_cb (GtkWidget *widget,
69 gpointer data)
70{
71 gboolean *done = data;
72
73 *done = TRUE;
74
75 g_main_context_wakeup (NULL);
76}
77
78int
79main (int argc, char *argv[])
80{
81 GtkWidget *window;
82 GtkWidget *box;
83 GtkWidget *bar;
84 GtkWidget *box2;
85 GtkWidget *sw;
86 gboolean done = FALSE;
87
88 gtk_init ();
89
90 add_custom_css ();
91
92 window = gtk_window_new ();
93 gtk_window_set_default_size (GTK_WINDOW (window), width: 500, height: 100);
94 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 10);
95 gtk_widget_set_margin_start (widget: box, margin: 20);
96 gtk_widget_set_margin_end (widget: box, margin: 20);
97 gtk_widget_set_margin_top (widget: box, margin: 20);
98 gtk_widget_set_margin_bottom (widget: box, margin: 20);
99 bar = create_level_bar ();
100 gtk_window_set_child (GTK_WINDOW (window), child: box);
101 gtk_box_append (GTK_BOX (box), child: bar);
102 box2 = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, spacing: 10);
103 gtk_box_append (GTK_BOX (box), child: box2);
104 gtk_box_append (GTK_BOX (box2), child: gtk_label_new (str: "Discrete"));
105 sw = gtk_switch_new ();
106 gtk_box_append (GTK_BOX (box2), child: sw);
107 g_signal_connect (sw, "notify::active", G_CALLBACK (toggle), bar);
108
109 gtk_widget_show (widget: window);
110
111 g_signal_connect (window, "destroy", G_CALLBACK (quit_cb), &done);
112
113 g_timeout_add (interval: 100, function: increase_level, data: bar);
114 while (!done)
115 g_main_context_iteration (NULL, TRUE);
116
117 return 0;
118}
119
120

source code of gtk/tests/testlevelbar.c