Merge lp:~jpakkane/libgrip/unsubscribering into lp:libgrip

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
Reviewer Review Type Date Requested Status
Stephen M. Webb (community) Approve
Review via email: mp+64851@code.launchpad.net

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.
Revision history for this message
Stephen M. Webb (bregma) wrote :

OK.

I like the new names better.

review: Approve

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;

Subscribers

People subscribed via source and target branches