1
2#include <gtk/gtk.h>
3
4
5
6struct _GtkBlurBox
7{
8 GtkBox parent_instance;
9
10 double radius;
11};
12typedef struct _GtkBlurBox GtkBlurBox;
13
14struct _GtkBlurBoxClass
15{
16 GtkBoxClass parent_class;
17};
18typedef struct _GtkBlurBoxClass GtkBlurBoxClass;
19
20static GType gtk_blur_box_get_type (void);
21G_DEFINE_TYPE (GtkBlurBox, gtk_blur_box, GTK_TYPE_BOX)
22
23
24static void
25snapshot_blur (GtkWidget *widget,
26 GtkSnapshot *snapshot)
27{
28 GtkBlurBox *box = (GtkBlurBox *) widget;
29
30 gtk_snapshot_push_blur (snapshot, radius: box->radius);
31
32 GTK_WIDGET_CLASS (gtk_blur_box_parent_class)->snapshot (widget, snapshot);
33
34 gtk_snapshot_pop (snapshot);
35}
36
37
38static void
39gtk_blur_box_init (GtkBlurBox *box) {
40 box->radius = 0;
41}
42
43static void
44gtk_blur_box_class_init (GtkBlurBoxClass *klass)
45{
46 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
47
48 widget_class->snapshot = snapshot_blur;
49}
50
51static void
52value_changed_cb (GtkRange *range,
53 gpointer user_data)
54{
55 GtkBlurBox *box = user_data;
56 double value = gtk_range_get_value (range);
57
58 box->radius = value;
59 gtk_widget_queue_draw (GTK_WIDGET (box));
60}
61
62static void
63value_changed_cb2 (GtkRange *range,
64 gpointer user_data)
65{
66 GtkLabel *label = user_data;
67 double value = gtk_range_get_value (range);
68 char *text;
69
70 text = g_strdup_printf (format: "%.2f", value);
71 gtk_label_set_label (self: label, str: text);
72 g_free (mem: text);
73}
74
75static void
76quit_cb (GtkWidget *widget,
77 gpointer data)
78{
79 gboolean *done = data;
80
81 *done = TRUE;
82
83 g_main_context_wakeup (NULL);
84}
85
86int
87main (int argc, char **argv)
88{
89 GtkWidget *window;
90 GtkWidget *blur_box;
91 GtkWidget *scale;
92 GtkWidget *value_label;
93 gboolean done = FALSE;
94
95 gtk_init ();
96
97 window = gtk_window_new ();
98 g_signal_connect (window, "destroy", G_CALLBACK (quit_cb), &done);
99
100 blur_box = g_object_new (object_type: gtk_blur_box_get_type (),
101 first_property_name: "orientation", GTK_ORIENTATION_VERTICAL,
102 "spacing", 32,
103 NULL);
104
105 value_label = gtk_label_new (str: "FF");
106 gtk_widget_set_margin_top (widget: value_label, margin: 32);
107 {
108 PangoAttrList *attrs;
109
110 attrs = pango_attr_list_new ();
111 pango_attr_list_insert (list: attrs, attr: pango_attr_scale_new (scale_factor: 6.0));
112 gtk_label_set_attributes (GTK_LABEL (value_label), attrs);
113 pango_attr_list_unref (list: attrs);
114 }
115 gtk_box_append (GTK_BOX (blur_box), child: value_label);
116
117
118 scale = gtk_scale_new_with_range (orientation: GTK_ORIENTATION_HORIZONTAL, min: 0, max: 10, step: 0.05);
119 gtk_widget_set_size_request (widget: scale, width: 200, height: -1);
120 gtk_widget_set_halign (widget: scale, align: GTK_ALIGN_CENTER);
121 gtk_widget_set_valign (widget: scale, align: GTK_ALIGN_CENTER);
122 gtk_widget_set_hexpand (widget: scale, TRUE);
123 g_signal_connect (scale, "value-changed", G_CALLBACK (value_changed_cb), blur_box);
124 g_signal_connect (scale, "value-changed", G_CALLBACK (value_changed_cb2), value_label);
125
126 gtk_box_append (GTK_BOX (blur_box), child: scale);
127 gtk_window_set_child (GTK_WINDOW (window), child: blur_box);
128
129 gtk_widget_show (widget: window);
130
131 while (!done)
132 g_main_context_iteration (NULL, TRUE);
133
134 return 0;
135}
136

source code of gtk/tests/testblur.c