Merge lp:~jpakkane/libgrip/unsubscribering into lp:libgrip
- unsubscribering
- Merge into trunk
Proposed by
Jussi Pakkanen
Status: | Merged |
---|---|
Merged at revision: | 43 |
Proposed branch: | lp:~jpakkane/libgrip/unsubscribering |
Merge into: | lp:libgrip |
Diff against target: |
367 lines (+132/-60) 4 files modified
examples/rectangle-mover/gesture.c (+74/-44) src/gripgesturemanager.c (+49/-16) src/gripgesturemanager.h (+3/-0) src/libgrip-0.1.ver (+6/-0) |
To merge this branch: | bzr merge lp:~jpakkane/libgrip/unsubscribering |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Stephen M. Webb (community) | Approve | ||
Review via email: mp+64851@code.launchpad.net |
Commit message
Description of the change
This branch adds gesture unsubscribe possibility to libgrip. Currently only unsubscribing all gestures on a whole window is supported.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'examples/rectangle-mover/gesture.c' | |||
2 | --- examples/rectangle-mover/gesture.c 2011-05-19 11:31:39 +0000 | |||
3 | +++ examples/rectangle-mover/gesture.c 2011-06-16 15:02:33 +0000 | |||
4 | @@ -9,6 +9,14 @@ | |||
5 | 9 | static gdouble translate[2] = { 200, 200 }; | 9 | static gdouble translate[2] = { 200, 200 }; |
6 | 10 | static gint in_touch = 0; | 10 | static gint in_touch = 0; |
7 | 11 | 11 | ||
8 | 12 | static void subscribe_gestures(GripGestureManager *manager, GtkWidget *window, GtkWidget *da); | ||
9 | 13 | |||
10 | 14 | struct app_data { | ||
11 | 15 | GripGestureManager *manager; | ||
12 | 16 | GtkWidget *main_window; | ||
13 | 17 | GtkWidget *da; | ||
14 | 18 | }; | ||
15 | 19 | |||
16 | 12 | static gboolean | 20 | static gboolean |
17 | 13 | draw_canvas (GtkWidget *widget, | 21 | draw_canvas (GtkWidget *widget, |
18 | 14 | cairo_t *cr, | 22 | cairo_t *cr, |
19 | @@ -84,6 +92,16 @@ | |||
20 | 84 | gtk_widget_queue_draw (GTK_WIDGET (widget)); | 92 | gtk_widget_queue_draw (GTK_WIDGET (widget)); |
21 | 85 | } | 93 | } |
22 | 86 | 94 | ||
23 | 95 | static void | ||
24 | 96 | subscribe_toggled(GtkToggleButton *toggle_button, gpointer user_data) | ||
25 | 97 | { | ||
26 | 98 | struct app_data *app = (struct app_data*)(user_data); | ||
27 | 99 | if (gtk_toggle_button_get_active(toggle_button)) { | ||
28 | 100 | subscribe_gestures(app->manager, app->main_window, app->da); | ||
29 | 101 | } else { | ||
30 | 102 | grip_gesture_manager_unregister_window(app->manager, app->main_window); | ||
31 | 103 | } | ||
32 | 104 | } | ||
33 | 87 | 105 | ||
34 | 88 | static GtkTreeModel * | 106 | static GtkTreeModel * |
35 | 89 | create_model () | 107 | create_model () |
36 | @@ -91,20 +109,54 @@ | |||
37 | 91 | return (GtkTreeModel *)gtk_list_store_new (1, G_TYPE_STRING); | 109 | return (GtkTreeModel *)gtk_list_store_new (1, G_TYPE_STRING); |
38 | 92 | } | 110 | } |
39 | 93 | 111 | ||
40 | 112 | static void | ||
41 | 113 | subscribe_gestures(GripGestureManager *manager, GtkWidget *window, | ||
42 | 114 | GtkWidget *da) | ||
43 | 115 | { | ||
44 | 116 | grip_gesture_manager_register_window (manager, | ||
45 | 117 | da, | ||
46 | 118 | GRIP_GESTURE_PINCH, | ||
47 | 119 | 2, | ||
48 | 120 | gesture_callback, | ||
49 | 121 | NULL, NULL); | ||
50 | 122 | |||
51 | 123 | grip_gesture_manager_register_window (manager, | ||
52 | 124 | da, | ||
53 | 125 | GRIP_GESTURE_ROTATE, | ||
54 | 126 | 2, | ||
55 | 127 | gesture_callback, | ||
56 | 128 | NULL, NULL); | ||
57 | 129 | |||
58 | 130 | grip_gesture_manager_register_window (manager, | ||
59 | 131 | da, | ||
60 | 132 | GRIP_GESTURE_DRAG, | ||
61 | 133 | 2, | ||
62 | 134 | gesture_callback, | ||
63 | 135 | NULL, NULL); | ||
64 | 136 | |||
65 | 137 | grip_gesture_manager_register_window (manager, | ||
66 | 138 | da, | ||
67 | 139 | GRIP_GESTURE_TAP, | ||
68 | 140 | 2, | ||
69 | 141 | gesture_callback, | ||
70 | 142 | NULL, NULL); | ||
71 | 143 | } | ||
72 | 144 | |||
73 | 94 | static GtkWidget * | 145 | static GtkWidget * |
75 | 95 | create_window (GripGestureManager *manager) | 146 | create_window (struct app_data *app) |
76 | 96 | { | 147 | { |
79 | 97 | GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); | 148 | app->main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
80 | 98 | GtkWidget *da; | 149 | GtkWidget *window = app->main_window; |
81 | 99 | GtkWidget *hbox; | 150 | GtkWidget *hbox; |
82 | 100 | GtkWidget *vbox; | 151 | GtkWidget *vbox; |
83 | 101 | GtkWidget *button; | 152 | GtkWidget *button; |
84 | 153 | GtkWidget *subscribed_toggle; | ||
85 | 102 | GtkWidget *tv; | 154 | GtkWidget *tv; |
86 | 103 | GtkTreeModel *model; | 155 | GtkTreeModel *model; |
87 | 104 | GtkWidget *sw; | 156 | GtkWidget *sw; |
88 | 105 | const GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; | 157 | const GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; |
89 | 106 | 158 | ||
91 | 107 | da = gtk_drawing_area_new (); | 159 | app->da = gtk_drawing_area_new (); |
92 | 108 | 160 | ||
93 | 109 | gtk_window_set_title (GTK_WINDOW (window), "Touch Demo"); | 161 | gtk_window_set_title (GTK_WINDOW (window), "Touch Demo"); |
94 | 110 | gtk_window_set_default_size (GTK_WINDOW (window), 600, 600); | 162 | gtk_window_set_default_size (GTK_WINDOW (window), 600, 600); |
95 | @@ -115,7 +167,7 @@ | |||
96 | 115 | vbox = gtk_vbox_new (FALSE, 0); | 167 | vbox = gtk_vbox_new (FALSE, 0); |
97 | 116 | 168 | ||
98 | 117 | gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); | 169 | gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); |
100 | 118 | gtk_box_pack_start (GTK_BOX (hbox), da, TRUE, TRUE, 0); | 170 | gtk_box_pack_start (GTK_BOX (hbox), app->da, TRUE, TRUE, 0); |
101 | 119 | 171 | ||
102 | 120 | model = create_model (); | 172 | model = create_model (); |
103 | 121 | sw = gtk_scrolled_window_new (NULL, NULL); | 173 | sw = gtk_scrolled_window_new (NULL, NULL); |
104 | @@ -131,44 +183,23 @@ | |||
105 | 131 | "clicked", | 183 | "clicked", |
106 | 132 | G_CALLBACK (gtk_main_quit), | 184 | G_CALLBACK (gtk_main_quit), |
107 | 133 | NULL); | 185 | NULL); |
109 | 134 | 186 | subscribed_toggle = gtk_toggle_button_new_with_label ("Gestures"); | |
110 | 187 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(subscribed_toggle), TRUE); | ||
111 | 188 | g_signal_connect (subscribed_toggle, | ||
112 | 189 | "toggled", | ||
113 | 190 | G_CALLBACK (subscribe_toggled), | ||
114 | 191 | app); | ||
115 | 192 | gtk_box_pack_start (GTK_BOX (vbox), subscribed_toggle, FALSE, FALSE, 0); | ||
116 | 135 | gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); | 193 | gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); |
117 | 136 | 194 | ||
118 | 137 | gtk_container_add (GTK_CONTAINER (window), hbox); | 195 | gtk_container_add (GTK_CONTAINER (window), hbox); |
119 | 138 | 196 | ||
121 | 139 | gtk_widget_modify_bg (da, GTK_STATE_NORMAL, &white); | 197 | gtk_widget_modify_bg (app->da, GTK_STATE_NORMAL, &white); |
122 | 140 | 198 | ||
124 | 141 | g_signal_connect (da, "draw", | 199 | g_signal_connect (app->da, "draw", |
125 | 142 | G_CALLBACK (draw_canvas), NULL); | 200 | G_CALLBACK (draw_canvas), NULL); |
126 | 143 | 201 | ||
155 | 144 | grip_gesture_manager_register_window (manager, | 202 | subscribe_gestures(app->manager, window, app->da); |
128 | 145 | da, | ||
129 | 146 | GRIP_GESTURE_PINCH, | ||
130 | 147 | 2, | ||
131 | 148 | gesture_callback, | ||
132 | 149 | NULL, NULL); | ||
133 | 150 | |||
134 | 151 | grip_gesture_manager_register_window (manager, | ||
135 | 152 | da, | ||
136 | 153 | GRIP_GESTURE_ROTATE, | ||
137 | 154 | 2, | ||
138 | 155 | gesture_callback, | ||
139 | 156 | NULL, NULL); | ||
140 | 157 | |||
141 | 158 | grip_gesture_manager_register_window (manager, | ||
142 | 159 | da, | ||
143 | 160 | GRIP_GESTURE_DRAG, | ||
144 | 161 | 2, | ||
145 | 162 | gesture_callback, | ||
146 | 163 | NULL, NULL); | ||
147 | 164 | |||
148 | 165 | grip_gesture_manager_register_window (manager, | ||
149 | 166 | da, | ||
150 | 167 | GRIP_GESTURE_TAP, | ||
151 | 168 | 2, | ||
152 | 169 | gesture_callback, | ||
153 | 170 | NULL, NULL); | ||
154 | 171 | |||
156 | 172 | return window; | 203 | return window; |
157 | 173 | } | 204 | } |
158 | 174 | 205 | ||
159 | @@ -183,8 +214,7 @@ | |||
160 | 183 | int | 214 | int |
161 | 184 | main (int argc, char **argv) | 215 | main (int argc, char **argv) |
162 | 185 | { | 216 | { |
165 | 186 | GtkWidget *window; | 217 | struct app_data app; |
164 | 187 | GripGestureManager *manager; | ||
166 | 188 | 218 | ||
167 | 189 | gtk_init (&argc, &argv); | 219 | gtk_init (&argc, &argv); |
168 | 190 | 220 | ||
169 | @@ -192,12 +222,12 @@ | |||
170 | 192 | * my Dell XT2 has in it. */ | 222 | * my Dell XT2 has in it. */ |
171 | 193 | signal (SIGABRT, abort_handler); | 223 | signal (SIGABRT, abort_handler); |
172 | 194 | 224 | ||
179 | 195 | manager = grip_gesture_manager_get (); | 225 | app.manager = grip_gesture_manager_get (); |
180 | 196 | window = create_window (manager); | 226 | create_window (&app); |
181 | 197 | 227 | ||
182 | 198 | g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); | 228 | g_signal_connect (app.main_window, "destroy", G_CALLBACK (gtk_main_quit), NULL); |
183 | 199 | 229 | ||
184 | 200 | gtk_widget_show_all (GTK_WIDGET (window)); | 230 | gtk_widget_show_all (GTK_WIDGET (app.main_window)); |
185 | 201 | 231 | ||
186 | 202 | gtk_main (); | 232 | gtk_main (); |
187 | 203 | 233 | ||
188 | 204 | 234 | ||
189 | === modified file 'src/gripgesturemanager.c' | |||
190 | --- src/gripgesturemanager.c 2011-06-15 12:51:57 +0000 | |||
191 | +++ src/gripgesturemanager.c 2011-06-16 15:02:33 +0000 | |||
192 | @@ -34,7 +34,7 @@ | |||
193 | 34 | 34 | ||
194 | 35 | struct _GripGestureManagerPrivate | 35 | struct _GripGestureManagerPrivate |
195 | 36 | { | 36 | { |
197 | 37 | GHashTable *hash; | 37 | GHashTable *registered_windows; |
198 | 38 | GList *requests; | 38 | GList *requests; |
199 | 39 | }; | 39 | }; |
200 | 40 | 40 | ||
201 | @@ -143,16 +143,14 @@ | |||
202 | 143 | { | 143 | { |
203 | 144 | } | 144 | } |
204 | 145 | 145 | ||
205 | 146 | |||
206 | 146 | static void | 147 | static void |
210 | 147 | free_registration (gpointer key, | 148 | free_registration(GripGestureRegistration *reg) |
208 | 148 | gpointer value, | ||
209 | 149 | gpointer user_data) | ||
211 | 150 | { | 149 | { |
212 | 151 | GripGestureRegistration *reg = (GripGestureRegistration *)value; | ||
213 | 152 | GList *tmp = NULL; | 150 | GList *tmp = NULL; |
214 | 153 | 151 | ||
215 | 154 | geis_unsubscribe (reg->instance, | 152 | geis_unsubscribe (reg->instance, |
217 | 155 | (GeisGestureType*)reg->gesture_list->pdata); | 153 | (GeisGestureType*)reg->gesture_list->pdata); |
218 | 156 | 154 | ||
219 | 157 | /* We don't need to free the values in the GPtrArray. */ | 155 | /* We don't need to free the values in the GPtrArray. */ |
220 | 158 | g_ptr_array_free (reg->gesture_list, TRUE); | 156 | g_ptr_array_free (reg->gesture_list, TRUE); |
221 | @@ -165,19 +163,30 @@ | |||
222 | 165 | g_list_free (reg->bindings); | 163 | g_list_free (reg->bindings); |
223 | 166 | } | 164 | } |
224 | 167 | 165 | ||
225 | 166 | /* Helper function needed to make things work with GTK. */ | ||
226 | 167 | |||
227 | 168 | static void | ||
228 | 169 | free_registration_adapter (gpointer key, | ||
229 | 170 | gpointer value, | ||
230 | 171 | gpointer user_data) | ||
231 | 172 | { | ||
232 | 173 | GripGestureRegistration *reg = (GripGestureRegistration *)value; | ||
233 | 174 | free_registration(reg); | ||
234 | 175 | } | ||
235 | 176 | |||
236 | 168 | static void | 177 | static void |
237 | 169 | grip_gesture_manager_finalize (GObject *object) | 178 | grip_gesture_manager_finalize (GObject *object) |
238 | 170 | { | 179 | { |
239 | 171 | GripGestureManagerPrivate *priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (object); | 180 | GripGestureManagerPrivate *priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (object); |
240 | 172 | 181 | ||
242 | 173 | if (priv->hash != NULL) | 182 | if (priv->registered_windows != NULL) |
243 | 174 | { | 183 | { |
246 | 175 | g_hash_table_foreach (priv->hash, | 184 | g_hash_table_foreach (priv->registered_windows, |
247 | 176 | free_registration, | 185 | free_registration_adapter, |
248 | 177 | NULL); | 186 | NULL); |
249 | 178 | 187 | ||
252 | 179 | g_hash_table_unref (priv->hash); | 188 | g_hash_table_unref (priv->registered_windows); |
253 | 180 | priv->hash = NULL; | 189 | priv->registered_windows = NULL; |
254 | 181 | } | 190 | } |
255 | 182 | } | 191 | } |
256 | 183 | 192 | ||
257 | @@ -647,7 +656,7 @@ | |||
258 | 647 | 656 | ||
259 | 648 | priv = item->priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (item); | 657 | priv = item->priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (item); |
260 | 649 | 658 | ||
262 | 650 | priv->hash = g_hash_table_new (g_direct_hash, g_direct_equal); | 659 | priv->registered_windows = g_hash_table_new (g_direct_hash, g_direct_equal); |
263 | 651 | } | 660 | } |
264 | 652 | 661 | ||
265 | 653 | static gboolean | 662 | static gboolean |
266 | @@ -668,7 +677,7 @@ | |||
267 | 668 | { | 677 | { |
268 | 669 | GripGestureManager *manager = (GripGestureManager *)user_data; | 678 | GripGestureManager *manager = (GripGestureManager *)user_data; |
269 | 670 | GripGestureManagerPrivate *priv = manager->priv; | 679 | GripGestureManagerPrivate *priv = manager->priv; |
271 | 671 | GripGestureRegistration *reg = g_hash_table_lookup (priv->hash, object); | 680 | GripGestureRegistration *reg = g_hash_table_lookup (priv->registered_windows, object); |
272 | 672 | GList *list; | 681 | GList *list; |
273 | 673 | 682 | ||
274 | 674 | for (list = reg->bindings; list != NULL; list = list->next) | 683 | for (list = reg->bindings; list != NULL; list = list->next) |
275 | @@ -691,7 +700,7 @@ | |||
276 | 691 | 700 | ||
277 | 692 | geis_finish (reg->instance); | 701 | geis_finish (reg->instance); |
278 | 693 | 702 | ||
280 | 694 | g_hash_table_remove (priv->hash, object); | 703 | g_hash_table_remove (priv->registered_windows, object); |
281 | 695 | g_free (reg); | 704 | g_free (reg); |
282 | 696 | } | 705 | } |
283 | 697 | 706 | ||
284 | @@ -737,7 +746,7 @@ | |||
285 | 737 | 746 | ||
286 | 738 | priv = manager->priv; | 747 | priv = manager->priv; |
287 | 739 | 748 | ||
289 | 740 | if (!(reg = g_hash_table_lookup (priv->hash, toplevel))) | 749 | if (!(reg = g_hash_table_lookup (priv->registered_windows, toplevel))) |
290 | 741 | { | 750 | { |
291 | 742 | GeisInstance instance; | 751 | GeisInstance instance; |
292 | 743 | GIOChannel *iochannel; | 752 | GIOChannel *iochannel; |
293 | @@ -826,7 +835,7 @@ | |||
294 | 826 | 835 | ||
295 | 827 | reg->bindings = g_list_append (reg->bindings, binding); | 836 | reg->bindings = g_list_append (reg->bindings, binding); |
296 | 828 | 837 | ||
298 | 829 | g_hash_table_insert (priv->hash, | 838 | g_hash_table_insert (priv->registered_windows, |
299 | 830 | toplevel, | 839 | toplevel, |
300 | 831 | reg); | 840 | reg); |
301 | 832 | } | 841 | } |
302 | @@ -1036,6 +1045,30 @@ | |||
303 | 1036 | } | 1045 | } |
304 | 1037 | } | 1046 | } |
305 | 1038 | 1047 | ||
306 | 1048 | void | ||
307 | 1049 | grip_gesture_manager_unregister_window (GripGestureManager *manager, | ||
308 | 1050 | GtkWidget *toplevel) | ||
309 | 1051 | { | ||
310 | 1052 | GripGestureManagerPrivate *priv = manager->priv; | ||
311 | 1053 | GripGestureRegistration *reg; | ||
312 | 1054 | |||
313 | 1055 | g_return_if_fail (GRIP_IS_GESTURE_MANAGER (manager)); | ||
314 | 1056 | g_return_if_fail (GTK_IS_WINDOW (toplevel)); | ||
315 | 1057 | |||
316 | 1058 | /* Currently only allow unsubscribing after the window has been shown. */ | ||
317 | 1059 | g_return_if_fail (gtk_widget_get_mapped (GTK_WIDGET (toplevel))); | ||
318 | 1060 | reg = g_hash_table_lookup (priv->registered_windows, toplevel); | ||
319 | 1061 | if (!reg) { | ||
320 | 1062 | return; | ||
321 | 1063 | } | ||
322 | 1064 | free_registration(reg); | ||
323 | 1065 | geis_finish(reg->instance); | ||
324 | 1066 | reg->instance = NULL; | ||
325 | 1067 | g_free(reg); | ||
326 | 1068 | g_hash_table_remove(priv->registered_windows, toplevel); | ||
327 | 1069 | |||
328 | 1070 | } | ||
329 | 1071 | |||
330 | 1039 | GType | 1072 | GType |
331 | 1040 | grip_gesture_event_get_type (void) | 1073 | grip_gesture_event_get_type (void) |
332 | 1041 | { | 1074 | { |
333 | 1042 | 1075 | ||
334 | === modified file 'src/gripgesturemanager.h' | |||
335 | --- src/gripgesturemanager.h 2011-05-31 14:00:43 +0000 | |||
336 | +++ src/gripgesturemanager.h 2011-06-16 15:02:33 +0000 | |||
337 | @@ -214,6 +214,9 @@ | |||
338 | 214 | gpointer user_data, | 214 | gpointer user_data, |
339 | 215 | GDestroyNotify destroy); | 215 | GDestroyNotify destroy); |
340 | 216 | 216 | ||
341 | 217 | void grip_gesture_manager_unregister_window (GripGestureManager *manager, | ||
342 | 218 | GtkWidget *widget); | ||
343 | 219 | |||
344 | 217 | GType grip_gesture_event_get_type (void) G_GNUC_CONST; | 220 | GType grip_gesture_event_get_type (void) G_GNUC_CONST; |
345 | 218 | GripGestureEvent *grip_gesture_event_new (GripGestureType gesture_type); | 221 | GripGestureEvent *grip_gesture_event_new (GripGestureType gesture_type); |
346 | 219 | void grip_gesture_event_free (GripGestureEvent *event); | 222 | void grip_gesture_event_free (GripGestureEvent *event); |
347 | 220 | 223 | ||
348 | === modified file 'src/libgrip-0.1.ver' | |||
349 | --- src/libgrip-0.1.ver 2011-03-04 21:48:13 +0000 | |||
350 | +++ src/libgrip-0.1.ver 2011-06-16 15:02:33 +0000 | |||
351 | @@ -30,6 +30,7 @@ | |||
352 | 30 | grip_gesture_manager_get; | 30 | grip_gesture_manager_get; |
353 | 31 | grip_gesture_manager_get_type; | 31 | grip_gesture_manager_get_type; |
354 | 32 | grip_gesture_manager_register_window; | 32 | grip_gesture_manager_register_window; |
355 | 33 | grip_gesture_manager_unregister_window; # Delete once the version number is bumped. | ||
356 | 33 | grip_gesture_type_get_type; | 34 | grip_gesture_type_get_type; |
357 | 34 | grip_time_type_get_type; | 35 | grip_time_type_get_type; |
358 | 35 | 36 | ||
359 | @@ -37,3 +38,8 @@ | |||
360 | 37 | *; | 38 | *; |
361 | 38 | }; | 39 | }; |
362 | 39 | 40 | ||
363 | 41 | # Uncomment once version number is bumped. | ||
364 | 42 | #GRIP_0.2 { | ||
365 | 43 | # global: | ||
366 | 44 | # grip_gesture_manager_unregister_window; | ||
367 | 45 | #} GRIP_0.1; |
OK.
I like the new names better.