1 | |
2 | #include <gtk/gtk.h> |
3 | |
4 | |
5 | |
6 | struct _GtkBlurBox |
7 | { |
8 | GtkBox parent_instance; |
9 | |
10 | double radius; |
11 | }; |
12 | typedef struct _GtkBlurBox GtkBlurBox; |
13 | |
14 | struct _GtkBlurBoxClass |
15 | { |
16 | GtkBoxClass parent_class; |
17 | }; |
18 | typedef struct _GtkBlurBoxClass GtkBlurBoxClass; |
19 | |
20 | static GType gtk_blur_box_get_type (void); |
21 | G_DEFINE_TYPE (GtkBlurBox, gtk_blur_box, GTK_TYPE_BOX) |
22 | |
23 | |
24 | static void |
25 | snapshot_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 | |
38 | static void |
39 | gtk_blur_box_init (GtkBlurBox *box) { |
40 | box->radius = 0; |
41 | } |
42 | |
43 | static void |
44 | gtk_blur_box_class_init (GtkBlurBoxClass *klass) |
45 | { |
46 | GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); |
47 | |
48 | widget_class->snapshot = snapshot_blur; |
49 | } |
50 | |
51 | static void |
52 | value_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 | |
62 | static void |
63 | value_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 | |
75 | static void |
76 | quit_cb (GtkWidget *widget, |
77 | gpointer data) |
78 | { |
79 | gboolean *done = data; |
80 | |
81 | *done = TRUE; |
82 | |
83 | g_main_context_wakeup (NULL); |
84 | } |
85 | |
86 | int |
87 | main (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 | |