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