1 #include <stdlib.h>
2 #include <clutter/clutter.h>
3
4 #include "tests/clutter-test-utils.h"
5
6 enum
7 {
8 VERTICAL = 0,
9 HORIZONTAL = 1,
10 BOTH = 2
11 };
12
13 int
14 test_swipe_action_main (int argc, char *argv[]);
15
16 const char *
17 test_swipe_action_describe (void);
18
19 static void
swept_cb(ClutterSwipeAction * action,ClutterActor * actor,ClutterSwipeDirection direction,gpointer data_)20 swept_cb (ClutterSwipeAction *action,
21 ClutterActor *actor,
22 ClutterSwipeDirection direction,
23 gpointer data_)
24 {
25 guint axis = GPOINTER_TO_UINT (data_);
26 gchar *direction_str = g_strdup ("");
27
28 if (axis == HORIZONTAL &&
29 ((direction & CLUTTER_SWIPE_DIRECTION_UP) != 0 ||
30 (direction & CLUTTER_SWIPE_DIRECTION_DOWN) != 0))
31 {
32 g_print ("discarding non-horizontal swipe on '%s'\n",
33 clutter_actor_get_name (actor));
34 return;
35 }
36
37 if (axis == VERTICAL &&
38 ((direction & CLUTTER_SWIPE_DIRECTION_LEFT) != 0 ||
39 (direction & CLUTTER_SWIPE_DIRECTION_RIGHT) != 0))
40 {
41 g_print ("discarding non-vertical swipe on '%s'\n",
42 clutter_actor_get_name (actor));
43 return;
44 }
45
46 if (direction & CLUTTER_SWIPE_DIRECTION_UP)
47 {
48 char *old_str = direction_str;
49
50 direction_str = g_strconcat (direction_str, " up", NULL);
51 g_free (old_str);
52 }
53
54 if (direction & CLUTTER_SWIPE_DIRECTION_DOWN)
55 {
56 char *old_str = direction_str;
57
58 direction_str = g_strconcat (direction_str, " down", NULL);
59 g_free (old_str);
60 }
61
62 if (direction & CLUTTER_SWIPE_DIRECTION_LEFT)
63 {
64 char *old_str = direction_str;
65
66 direction_str = g_strconcat (direction_str, " left", NULL);
67 g_free (old_str);
68 }
69
70 if (direction & CLUTTER_SWIPE_DIRECTION_RIGHT)
71 {
72 char *old_str = direction_str;
73
74 direction_str = g_strconcat (direction_str, " right", NULL);
75 g_free (old_str);
76 }
77
78 g_print ("swept: '%s': %s\n", clutter_actor_get_name (actor), direction_str);
79
80 g_free (direction_str);
81 }
82
83 static void
gesture_cancel_cb(ClutterSwipeAction * action,ClutterActor * actor,gpointer user_data)84 gesture_cancel_cb (ClutterSwipeAction *action,
85 ClutterActor *actor,
86 gpointer user_data)
87 {
88 g_debug ("gesture cancelled: '%s'", clutter_actor_get_name (actor));
89 }
90
91 static void
attach_action(ClutterActor * actor,guint axis)92 attach_action (ClutterActor *actor, guint axis)
93 {
94 ClutterAction *action;
95
96 action = g_object_new (CLUTTER_TYPE_SWIPE_ACTION, NULL);
97 clutter_actor_add_action (actor, action);
98 g_signal_connect (action, "swept", G_CALLBACK (swept_cb), GUINT_TO_POINTER (axis));
99 g_signal_connect (action, "gesture-cancel", G_CALLBACK (gesture_cancel_cb), NULL);
100 }
101
102 static ClutterActor *
create_label(const char * markup)103 create_label (const char *markup)
104 {
105 return CLUTTER_ACTOR (g_object_new (CLUTTER_TYPE_TEXT,
106 "text", markup,
107 "use-markup", TRUE,
108 "x-expand", TRUE,
109 "y-expand", TRUE,
110 "x-align", CLUTTER_ACTOR_ALIGN_START,
111 "y-align", CLUTTER_ACTOR_ALIGN_CENTER,
112 NULL));
113 }
114
115 G_MODULE_EXPORT int
test_swipe_action_main(int argc,char * argv[])116 test_swipe_action_main (int argc, char *argv[])
117 {
118 ClutterActor *stage, *rect;
119
120 clutter_test_init (&argc, &argv);
121
122 stage = clutter_test_get_stage ();
123 clutter_stage_set_title (CLUTTER_STAGE (stage), "Swipe action");
124 clutter_actor_set_size (stage, 640, 480);
125 g_signal_connect (stage, "destroy", G_CALLBACK (clutter_test_quit), NULL);
126
127 rect = clutter_actor_new ();
128 clutter_actor_set_background_color (rect, CLUTTER_COLOR_Red);
129 clutter_actor_set_name (rect, "Vertical swipes");
130 clutter_actor_set_size (rect, 150, 150);
131 clutter_actor_set_position (rect, 10, 100);
132 clutter_actor_set_reactive (rect, TRUE);
133 clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect);
134 attach_action (rect, VERTICAL);
135
136 rect = clutter_actor_new ();
137 clutter_actor_set_background_color (rect, CLUTTER_COLOR_Blue);
138 clutter_actor_set_name (rect, "Horizontal swipes");
139 clutter_actor_set_size (rect, 150, 150);
140 clutter_actor_set_position (rect, 170, 100);
141 clutter_actor_set_reactive (rect, TRUE);
142 clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect);
143 attach_action (rect, HORIZONTAL);
144
145 rect = clutter_actor_new ();
146 clutter_actor_set_background_color (rect, CLUTTER_COLOR_Green);
147 clutter_actor_set_name (rect, "All swipes");
148 clutter_actor_set_size (rect, 150, 150);
149 clutter_actor_set_position (rect, 330, 100);
150 clutter_actor_set_reactive (rect, TRUE);
151 clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect);
152 attach_action (rect, BOTH);
153
154 {
155 ClutterLayoutManager *layout = clutter_box_layout_new ();
156 ClutterActor *box;
157 float offset;
158
159 clutter_box_layout_set_orientation (CLUTTER_BOX_LAYOUT (layout),
160 CLUTTER_ORIENTATION_VERTICAL);
161 clutter_box_layout_set_spacing (CLUTTER_BOX_LAYOUT (layout), 6);
162
163 box = clutter_actor_new ();
164 clutter_actor_set_layout_manager (box, layout);
165
166 clutter_actor_add_child (box,
167 create_label ("<b>Red</b>: vertical swipes only"));
168
169 clutter_actor_add_child (box,
170 create_label ("<b>Blue</b>: horizontal swipes only"));
171
172 clutter_actor_add_child (box,
173 create_label ("<b>Green</b>: both"));
174
175 offset = clutter_actor_get_height (stage)
176 - clutter_actor_get_height (box)
177 - 12.0;
178
179 clutter_container_add_actor (CLUTTER_CONTAINER (stage), box);
180 clutter_actor_add_constraint (box, clutter_bind_constraint_new (stage,
181 CLUTTER_BIND_X,
182 12.0));
183 clutter_actor_add_constraint (box, clutter_bind_constraint_new (stage,
184 CLUTTER_BIND_Y,
185 offset));
186 }
187
188 clutter_actor_show (stage);
189
190 clutter_test_main ();
191
192 return EXIT_SUCCESS;
193 }
194
195 G_MODULE_EXPORT const char *
test_swipe_action_describe(void)196 test_swipe_action_describe (void)
197 {
198 return "Swipe gesture recognizer.";
199 }
200