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 | static gdouble translate[2] = { 200, 200 }; |
6 | static gint in_touch = 0; |
7 | |
8 | +static void subscribe_gestures(GripGestureManager *manager, GtkWidget *window, GtkWidget *da); |
9 | + |
10 | +struct app_data { |
11 | + GripGestureManager *manager; |
12 | + GtkWidget *main_window; |
13 | + GtkWidget *da; |
14 | +}; |
15 | + |
16 | static gboolean |
17 | draw_canvas (GtkWidget *widget, |
18 | cairo_t *cr, |
19 | @@ -84,6 +92,16 @@ |
20 | gtk_widget_queue_draw (GTK_WIDGET (widget)); |
21 | } |
22 | |
23 | +static void |
24 | +subscribe_toggled(GtkToggleButton *toggle_button, gpointer user_data) |
25 | +{ |
26 | + struct app_data *app = (struct app_data*)(user_data); |
27 | + if (gtk_toggle_button_get_active(toggle_button)) { |
28 | + subscribe_gestures(app->manager, app->main_window, app->da); |
29 | + } else { |
30 | + grip_gesture_manager_unregister_window(app->manager, app->main_window); |
31 | + } |
32 | +} |
33 | |
34 | static GtkTreeModel * |
35 | create_model () |
36 | @@ -91,20 +109,54 @@ |
37 | return (GtkTreeModel *)gtk_list_store_new (1, G_TYPE_STRING); |
38 | } |
39 | |
40 | +static void |
41 | +subscribe_gestures(GripGestureManager *manager, GtkWidget *window, |
42 | + GtkWidget *da) |
43 | +{ |
44 | + grip_gesture_manager_register_window (manager, |
45 | + da, |
46 | + GRIP_GESTURE_PINCH, |
47 | + 2, |
48 | + gesture_callback, |
49 | + NULL, NULL); |
50 | + |
51 | + grip_gesture_manager_register_window (manager, |
52 | + da, |
53 | + GRIP_GESTURE_ROTATE, |
54 | + 2, |
55 | + gesture_callback, |
56 | + NULL, NULL); |
57 | + |
58 | + grip_gesture_manager_register_window (manager, |
59 | + da, |
60 | + GRIP_GESTURE_DRAG, |
61 | + 2, |
62 | + gesture_callback, |
63 | + NULL, NULL); |
64 | + |
65 | + grip_gesture_manager_register_window (manager, |
66 | + da, |
67 | + GRIP_GESTURE_TAP, |
68 | + 2, |
69 | + gesture_callback, |
70 | + NULL, NULL); |
71 | +} |
72 | + |
73 | static GtkWidget * |
74 | -create_window (GripGestureManager *manager) |
75 | +create_window (struct app_data *app) |
76 | { |
77 | - GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
78 | - GtkWidget *da; |
79 | + app->main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
80 | + GtkWidget *window = app->main_window; |
81 | GtkWidget *hbox; |
82 | GtkWidget *vbox; |
83 | GtkWidget *button; |
84 | + GtkWidget *subscribed_toggle; |
85 | GtkWidget *tv; |
86 | GtkTreeModel *model; |
87 | GtkWidget *sw; |
88 | const GdkColor white = { 0, 0xffff, 0xffff, 0xffff }; |
89 | |
90 | - da = gtk_drawing_area_new (); |
91 | + app->da = gtk_drawing_area_new (); |
92 | |
93 | gtk_window_set_title (GTK_WINDOW (window), "Touch Demo"); |
94 | gtk_window_set_default_size (GTK_WINDOW (window), 600, 600); |
95 | @@ -115,7 +167,7 @@ |
96 | vbox = gtk_vbox_new (FALSE, 0); |
97 | |
98 | gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); |
99 | - gtk_box_pack_start (GTK_BOX (hbox), da, TRUE, TRUE, 0); |
100 | + gtk_box_pack_start (GTK_BOX (hbox), app->da, TRUE, TRUE, 0); |
101 | |
102 | model = create_model (); |
103 | sw = gtk_scrolled_window_new (NULL, NULL); |
104 | @@ -131,44 +183,23 @@ |
105 | "clicked", |
106 | G_CALLBACK (gtk_main_quit), |
107 | NULL); |
108 | - |
109 | + subscribed_toggle = gtk_toggle_button_new_with_label ("Gestures"); |
110 | + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(subscribed_toggle), TRUE); |
111 | + g_signal_connect (subscribed_toggle, |
112 | + "toggled", |
113 | + G_CALLBACK (subscribe_toggled), |
114 | + app); |
115 | + gtk_box_pack_start (GTK_BOX (vbox), subscribed_toggle, FALSE, FALSE, 0); |
116 | gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); |
117 | |
118 | gtk_container_add (GTK_CONTAINER (window), hbox); |
119 | |
120 | - gtk_widget_modify_bg (da, GTK_STATE_NORMAL, &white); |
121 | + gtk_widget_modify_bg (app->da, GTK_STATE_NORMAL, &white); |
122 | |
123 | - g_signal_connect (da, "draw", |
124 | + g_signal_connect (app->da, "draw", |
125 | G_CALLBACK (draw_canvas), NULL); |
126 | |
127 | - grip_gesture_manager_register_window (manager, |
128 | - da, |
129 | - GRIP_GESTURE_PINCH, |
130 | - 2, |
131 | - gesture_callback, |
132 | - NULL, NULL); |
133 | - |
134 | - grip_gesture_manager_register_window (manager, |
135 | - da, |
136 | - GRIP_GESTURE_ROTATE, |
137 | - 2, |
138 | - gesture_callback, |
139 | - NULL, NULL); |
140 | - |
141 | - grip_gesture_manager_register_window (manager, |
142 | - da, |
143 | - GRIP_GESTURE_DRAG, |
144 | - 2, |
145 | - gesture_callback, |
146 | - NULL, NULL); |
147 | - |
148 | - grip_gesture_manager_register_window (manager, |
149 | - da, |
150 | - GRIP_GESTURE_TAP, |
151 | - 2, |
152 | - gesture_callback, |
153 | - NULL, NULL); |
154 | - |
155 | + subscribe_gestures(app->manager, window, app->da); |
156 | return window; |
157 | } |
158 | |
159 | @@ -183,8 +214,7 @@ |
160 | int |
161 | main (int argc, char **argv) |
162 | { |
163 | - GtkWidget *window; |
164 | - GripGestureManager *manager; |
165 | + struct app_data app; |
166 | |
167 | gtk_init (&argc, &argv); |
168 | |
169 | @@ -192,12 +222,12 @@ |
170 | * my Dell XT2 has in it. */ |
171 | signal (SIGABRT, abort_handler); |
172 | |
173 | - manager = grip_gesture_manager_get (); |
174 | - window = create_window (manager); |
175 | - |
176 | - g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); |
177 | - |
178 | - gtk_widget_show_all (GTK_WIDGET (window)); |
179 | + app.manager = grip_gesture_manager_get (); |
180 | + create_window (&app); |
181 | + |
182 | + g_signal_connect (app.main_window, "destroy", G_CALLBACK (gtk_main_quit), NULL); |
183 | + |
184 | + gtk_widget_show_all (GTK_WIDGET (app.main_window)); |
185 | |
186 | gtk_main (); |
187 | |
188 | |
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 | |
194 | struct _GripGestureManagerPrivate |
195 | { |
196 | - GHashTable *hash; |
197 | + GHashTable *registered_windows; |
198 | GList *requests; |
199 | }; |
200 | |
201 | @@ -143,16 +143,14 @@ |
202 | { |
203 | } |
204 | |
205 | + |
206 | static void |
207 | -free_registration (gpointer key, |
208 | - gpointer value, |
209 | - gpointer user_data) |
210 | +free_registration(GripGestureRegistration *reg) |
211 | { |
212 | - GripGestureRegistration *reg = (GripGestureRegistration *)value; |
213 | GList *tmp = NULL; |
214 | |
215 | geis_unsubscribe (reg->instance, |
216 | - (GeisGestureType*)reg->gesture_list->pdata); |
217 | + (GeisGestureType*)reg->gesture_list->pdata); |
218 | |
219 | /* We don't need to free the values in the GPtrArray. */ |
220 | g_ptr_array_free (reg->gesture_list, TRUE); |
221 | @@ -165,19 +163,30 @@ |
222 | g_list_free (reg->bindings); |
223 | } |
224 | |
225 | +/* Helper function needed to make things work with GTK. */ |
226 | + |
227 | +static void |
228 | +free_registration_adapter (gpointer key, |
229 | + gpointer value, |
230 | + gpointer user_data) |
231 | +{ |
232 | + GripGestureRegistration *reg = (GripGestureRegistration *)value; |
233 | + free_registration(reg); |
234 | +} |
235 | + |
236 | static void |
237 | grip_gesture_manager_finalize (GObject *object) |
238 | { |
239 | GripGestureManagerPrivate *priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (object); |
240 | |
241 | - if (priv->hash != NULL) |
242 | + if (priv->registered_windows != NULL) |
243 | { |
244 | - g_hash_table_foreach (priv->hash, |
245 | - free_registration, |
246 | + g_hash_table_foreach (priv->registered_windows, |
247 | + free_registration_adapter, |
248 | NULL); |
249 | |
250 | - g_hash_table_unref (priv->hash); |
251 | - priv->hash = NULL; |
252 | + g_hash_table_unref (priv->registered_windows); |
253 | + priv->registered_windows = NULL; |
254 | } |
255 | } |
256 | |
257 | @@ -647,7 +656,7 @@ |
258 | |
259 | priv = item->priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (item); |
260 | |
261 | - priv->hash = g_hash_table_new (g_direct_hash, g_direct_equal); |
262 | + priv->registered_windows = g_hash_table_new (g_direct_hash, g_direct_equal); |
263 | } |
264 | |
265 | static gboolean |
266 | @@ -668,7 +677,7 @@ |
267 | { |
268 | GripGestureManager *manager = (GripGestureManager *)user_data; |
269 | GripGestureManagerPrivate *priv = manager->priv; |
270 | - GripGestureRegistration *reg = g_hash_table_lookup (priv->hash, object); |
271 | + GripGestureRegistration *reg = g_hash_table_lookup (priv->registered_windows, object); |
272 | GList *list; |
273 | |
274 | for (list = reg->bindings; list != NULL; list = list->next) |
275 | @@ -691,7 +700,7 @@ |
276 | |
277 | geis_finish (reg->instance); |
278 | |
279 | - g_hash_table_remove (priv->hash, object); |
280 | + g_hash_table_remove (priv->registered_windows, object); |
281 | g_free (reg); |
282 | } |
283 | |
284 | @@ -737,7 +746,7 @@ |
285 | |
286 | priv = manager->priv; |
287 | |
288 | - if (!(reg = g_hash_table_lookup (priv->hash, toplevel))) |
289 | + if (!(reg = g_hash_table_lookup (priv->registered_windows, toplevel))) |
290 | { |
291 | GeisInstance instance; |
292 | GIOChannel *iochannel; |
293 | @@ -826,7 +835,7 @@ |
294 | |
295 | reg->bindings = g_list_append (reg->bindings, binding); |
296 | |
297 | - g_hash_table_insert (priv->hash, |
298 | + g_hash_table_insert (priv->registered_windows, |
299 | toplevel, |
300 | reg); |
301 | } |
302 | @@ -1036,6 +1045,30 @@ |
303 | } |
304 | } |
305 | |
306 | +void |
307 | +grip_gesture_manager_unregister_window (GripGestureManager *manager, |
308 | + GtkWidget *toplevel) |
309 | +{ |
310 | + GripGestureManagerPrivate *priv = manager->priv; |
311 | + GripGestureRegistration *reg; |
312 | + |
313 | + g_return_if_fail (GRIP_IS_GESTURE_MANAGER (manager)); |
314 | + g_return_if_fail (GTK_IS_WINDOW (toplevel)); |
315 | + |
316 | + /* Currently only allow unsubscribing after the window has been shown. */ |
317 | + g_return_if_fail (gtk_widget_get_mapped (GTK_WIDGET (toplevel))); |
318 | + reg = g_hash_table_lookup (priv->registered_windows, toplevel); |
319 | + if (!reg) { |
320 | + return; |
321 | + } |
322 | + free_registration(reg); |
323 | + geis_finish(reg->instance); |
324 | + reg->instance = NULL; |
325 | + g_free(reg); |
326 | + g_hash_table_remove(priv->registered_windows, toplevel); |
327 | + |
328 | +} |
329 | + |
330 | GType |
331 | grip_gesture_event_get_type (void) |
332 | { |
333 | |
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 | gpointer user_data, |
339 | GDestroyNotify destroy); |
340 | |
341 | +void grip_gesture_manager_unregister_window (GripGestureManager *manager, |
342 | + GtkWidget *widget); |
343 | + |
344 | GType grip_gesture_event_get_type (void) G_GNUC_CONST; |
345 | GripGestureEvent *grip_gesture_event_new (GripGestureType gesture_type); |
346 | void grip_gesture_event_free (GripGestureEvent *event); |
347 | |
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 | grip_gesture_manager_get; |
353 | grip_gesture_manager_get_type; |
354 | grip_gesture_manager_register_window; |
355 | + grip_gesture_manager_unregister_window; # Delete once the version number is bumped. |
356 | grip_gesture_type_get_type; |
357 | grip_time_type_get_type; |
358 | |
359 | @@ -37,3 +38,8 @@ |
360 | *; |
361 | }; |
362 | |
363 | +# Uncomment once version number is bumped. |
364 | +#GRIP_0.2 { |
365 | +# global: |
366 | +# grip_gesture_manager_unregister_window; |
367 | +#} GRIP_0.1; |
OK.
I like the new names better.