1/* OpenGL/Gears
2 *
3 * This is a classic OpenGL demo, running in a GtkGLArea.
4 */
5
6
7#include <stdlib.h>
8#include <gtk/gtk.h>
9
10#include "gtkgears.h"
11
12/************************************************************************
13 * DEMO CODE *
14 ************************************************************************/
15
16static void
17on_axis_value_change (GtkAdjustment *adjustment,
18 gpointer data)
19{
20 GtkGears *gears = GTK_GEARS (data);
21 int axis = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (adjustment), "axis"));
22
23 gtk_gears_set_axis (gears, axis, value: gtk_adjustment_get_value (adjustment));
24}
25
26
27static GtkWidget *
28create_axis_slider (GtkGears *gears,
29 int axis)
30{
31 GtkWidget *box, *label, *slider;
32 GtkAdjustment *adj;
33 const char *text;
34
35 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, FALSE);
36
37 switch (axis)
38 {
39 case GTK_GEARS_X_AXIS:
40 text = "X";
41 break;
42
43 case GTK_GEARS_Y_AXIS:
44 text = "Y";
45 break;
46
47 case GTK_GEARS_Z_AXIS:
48 text = "Z";
49 break;
50
51 default:
52 g_assert_not_reached ();
53 }
54
55 label = gtk_label_new (str: text);
56 gtk_box_append (GTK_BOX (box), child: label);
57 gtk_widget_show (widget: label);
58
59 adj = gtk_adjustment_new (value: gtk_gears_get_axis (gears, axis), lower: 0.0, upper: 360.0, step_increment: 1.0, page_increment: 12.0, page_size: 0.0);
60 g_object_set_data (G_OBJECT (adj), key: "axis", GINT_TO_POINTER (axis));
61 g_signal_connect (adj, "value-changed",
62 G_CALLBACK (on_axis_value_change),
63 gears);
64 slider = gtk_scale_new (orientation: GTK_ORIENTATION_VERTICAL, adjustment: adj);
65 gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
66 gtk_box_append (GTK_BOX (box), child: slider);
67 gtk_widget_set_vexpand (widget: slider, TRUE);
68 gtk_widget_show (widget: slider);
69
70 gtk_widget_show (widget: box);
71
72 return box;
73}
74
75GtkWidget *
76do_gears (GtkWidget *do_widget)
77{
78 static GtkWidget *window = NULL;
79 GtkWidget *box, *hbox, *fps_label, *gears, *overlay, *frame;
80 int i;
81
82 if (!window)
83 {
84 window = gtk_window_new ();
85 gtk_window_set_title (GTK_WINDOW (window), title: "Gears");
86 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
87 gtk_window_set_default_size (GTK_WINDOW (window), width: 640, height: 640);
88 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
89
90 overlay = gtk_overlay_new ();
91 gtk_widget_set_margin_start (widget: overlay, margin: 12);
92 gtk_widget_set_margin_end (widget: overlay, margin: 12);
93 gtk_widget_set_margin_top (widget: overlay, margin: 12);
94 gtk_widget_set_margin_bottom (widget: overlay, margin: 12);
95
96 gtk_window_set_child (GTK_WINDOW (window), child: overlay);
97
98 frame = gtk_frame_new (NULL);
99 gtk_widget_set_halign (widget: frame, align: GTK_ALIGN_START);
100 gtk_widget_set_valign (widget: frame, align: GTK_ALIGN_START);
101 gtk_widget_add_css_class (widget: frame, css_class: "app-notification");
102 gtk_overlay_add_overlay (GTK_OVERLAY (overlay), widget: frame);
103
104 fps_label = gtk_label_new (str: "");
105 gtk_widget_set_halign (widget: fps_label, align: GTK_ALIGN_START);
106 gtk_frame_set_child (GTK_FRAME (frame), child: fps_label);
107
108 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, FALSE);
109 gtk_box_set_spacing (GTK_BOX (box), spacing: 6);
110 gtk_overlay_set_child (GTK_OVERLAY (overlay), child: box);
111
112 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, FALSE);
113 gtk_box_set_spacing (GTK_BOX (box), spacing: 6);
114 gtk_box_append (GTK_BOX (box), child: hbox);
115
116 gears = gtk_gears_new ();
117 gtk_widget_set_hexpand (widget: gears, TRUE);
118 gtk_widget_set_vexpand (widget: gears, TRUE);
119 gtk_box_append (GTK_BOX (hbox), child: gears);
120
121 for (i = 0; i < GTK_GEARS_N_AXIS; i++)
122 gtk_box_append (GTK_BOX (hbox), child: create_axis_slider (GTK_GEARS (gears), axis: i));
123
124 hbox = gtk_box_new (orientation: GTK_ORIENTATION_HORIZONTAL, FALSE);
125 gtk_box_set_spacing (GTK_BOX (hbox), spacing: 6);
126 gtk_box_append (GTK_BOX (box), child: hbox);
127
128 gtk_gears_set_fps_label (GTK_GEARS (gears), GTK_LABEL (fps_label));
129 }
130
131 if (!gtk_widget_get_visible (widget: window))
132 gtk_widget_show (widget: window);
133 else
134 gtk_window_destroy (GTK_WINDOW (window));
135
136 return window;
137}
138

source code of gtk/demos/gtk-demo/gears.c