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 | |
16 | static void |
17 | on_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 | |
27 | static GtkWidget * |
28 | create_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 | |
75 | GtkWidget * |
76 | do_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 | |