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
=== modified file 'examples/rectangle-mover/gesture.c'
--- examples/rectangle-mover/gesture.c 2011-05-19 11:31:39 +0000
+++ examples/rectangle-mover/gesture.c 2011-06-16 15:02:33 +0000
@@ -9,6 +9,14 @@
9static gdouble translate[2] = { 200, 200 };9static gdouble translate[2] = { 200, 200 };
10static gint in_touch = 0;10static gint in_touch = 0;
1111
12static void subscribe_gestures(GripGestureManager *manager, GtkWidget *window, GtkWidget *da);
13
14struct app_data {
15 GripGestureManager *manager;
16 GtkWidget *main_window;
17 GtkWidget *da;
18};
19
12static gboolean20static gboolean
13draw_canvas (GtkWidget *widget,21draw_canvas (GtkWidget *widget,
14 cairo_t *cr,22 cairo_t *cr,
@@ -84,6 +92,16 @@
84 gtk_widget_queue_draw (GTK_WIDGET (widget));92 gtk_widget_queue_draw (GTK_WIDGET (widget));
85}93}
8694
95static void
96subscribe_toggled(GtkToggleButton *toggle_button, gpointer user_data)
97{
98 struct app_data *app = (struct app_data*)(user_data);
99 if (gtk_toggle_button_get_active(toggle_button)) {
100 subscribe_gestures(app->manager, app->main_window, app->da);
101 } else {
102 grip_gesture_manager_unregister_window(app->manager, app->main_window);
103 }
104}
87105
88static GtkTreeModel *106static GtkTreeModel *
89create_model ()107create_model ()
@@ -91,20 +109,54 @@
91 return (GtkTreeModel *)gtk_list_store_new (1, G_TYPE_STRING);109 return (GtkTreeModel *)gtk_list_store_new (1, G_TYPE_STRING);
92}110}
93111
112static void
113subscribe_gestures(GripGestureManager *manager, GtkWidget *window,
114 GtkWidget *da)
115{
116 grip_gesture_manager_register_window (manager,
117 da,
118 GRIP_GESTURE_PINCH,
119 2,
120 gesture_callback,
121 NULL, NULL);
122
123 grip_gesture_manager_register_window (manager,
124 da,
125 GRIP_GESTURE_ROTATE,
126 2,
127 gesture_callback,
128 NULL, NULL);
129
130 grip_gesture_manager_register_window (manager,
131 da,
132 GRIP_GESTURE_DRAG,
133 2,
134 gesture_callback,
135 NULL, NULL);
136
137 grip_gesture_manager_register_window (manager,
138 da,
139 GRIP_GESTURE_TAP,
140 2,
141 gesture_callback,
142 NULL, NULL);
143}
144
94static GtkWidget *145static GtkWidget *
95create_window (GripGestureManager *manager)146create_window (struct app_data *app)
96{147{
97 GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);148 app->main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
98 GtkWidget *da;149 GtkWidget *window = app->main_window;
99 GtkWidget *hbox;150 GtkWidget *hbox;
100 GtkWidget *vbox;151 GtkWidget *vbox;
101 GtkWidget *button;152 GtkWidget *button;
153 GtkWidget *subscribed_toggle;
102 GtkWidget *tv;154 GtkWidget *tv;
103 GtkTreeModel *model;155 GtkTreeModel *model;
104 GtkWidget *sw;156 GtkWidget *sw;
105 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };157 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
106158
107 da = gtk_drawing_area_new ();159 app->da = gtk_drawing_area_new ();
108160
109 gtk_window_set_title (GTK_WINDOW (window), "Touch Demo");161 gtk_window_set_title (GTK_WINDOW (window), "Touch Demo");
110 gtk_window_set_default_size (GTK_WINDOW (window), 600, 600);162 gtk_window_set_default_size (GTK_WINDOW (window), 600, 600);
@@ -115,7 +167,7 @@
115 vbox = gtk_vbox_new (FALSE, 0);167 vbox = gtk_vbox_new (FALSE, 0);
116168
117 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);169 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
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);
119171
120 model = create_model ();172 model = create_model ();
121 sw = gtk_scrolled_window_new (NULL, NULL);173 sw = gtk_scrolled_window_new (NULL, NULL);
@@ -131,44 +183,23 @@
131 "clicked",183 "clicked",
132 G_CALLBACK (gtk_main_quit),184 G_CALLBACK (gtk_main_quit),
133 NULL);185 NULL);
134186 subscribed_toggle = gtk_toggle_button_new_with_label ("Gestures");
187 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(subscribed_toggle), TRUE);
188 g_signal_connect (subscribed_toggle,
189 "toggled",
190 G_CALLBACK (subscribe_toggled),
191 app);
192 gtk_box_pack_start (GTK_BOX (vbox), subscribed_toggle, FALSE, FALSE, 0);
135 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);193 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
136194
137 gtk_container_add (GTK_CONTAINER (window), hbox);195 gtk_container_add (GTK_CONTAINER (window), hbox);
138196
139 gtk_widget_modify_bg (da, GTK_STATE_NORMAL, &white);197 gtk_widget_modify_bg (app->da, GTK_STATE_NORMAL, &white);
140198
141 g_signal_connect (da, "draw",199 g_signal_connect (app->da, "draw",
142 G_CALLBACK (draw_canvas), NULL);200 G_CALLBACK (draw_canvas), NULL);
143201
144 grip_gesture_manager_register_window (manager,202 subscribe_gestures(app->manager, window, app->da);
145 da,
146 GRIP_GESTURE_PINCH,
147 2,
148 gesture_callback,
149 NULL, NULL);
150
151 grip_gesture_manager_register_window (manager,
152 da,
153 GRIP_GESTURE_ROTATE,
154 2,
155 gesture_callback,
156 NULL, NULL);
157
158 grip_gesture_manager_register_window (manager,
159 da,
160 GRIP_GESTURE_DRAG,
161 2,
162 gesture_callback,
163 NULL, NULL);
164
165 grip_gesture_manager_register_window (manager,
166 da,
167 GRIP_GESTURE_TAP,
168 2,
169 gesture_callback,
170 NULL, NULL);
171
172 return window;203 return window;
173}204}
174205
@@ -183,8 +214,7 @@
183int214int
184main (int argc, char **argv)215main (int argc, char **argv)
185{216{
186 GtkWidget *window;217 struct app_data app;
187 GripGestureManager *manager;
188218
189 gtk_init (&argc, &argv);219 gtk_init (&argc, &argv);
190220
@@ -192,12 +222,12 @@
192 * my Dell XT2 has in it. */222 * my Dell XT2 has in it. */
193 signal (SIGABRT, abort_handler);223 signal (SIGABRT, abort_handler);
194224
195 manager = grip_gesture_manager_get ();225 app.manager = grip_gesture_manager_get ();
196 window = create_window (manager);226 create_window (&app);
197227
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);
199229
200 gtk_widget_show_all (GTK_WIDGET (window));230 gtk_widget_show_all (GTK_WIDGET (app.main_window));
201231
202 gtk_main ();232 gtk_main ();
203233
204234
=== modified file 'src/gripgesturemanager.c'
--- src/gripgesturemanager.c 2011-06-15 12:51:57 +0000
+++ src/gripgesturemanager.c 2011-06-16 15:02:33 +0000
@@ -34,7 +34,7 @@
3434
35struct _GripGestureManagerPrivate35struct _GripGestureManagerPrivate
36{36{
37 GHashTable *hash;37 GHashTable *registered_windows;
38 GList *requests;38 GList *requests;
39};39};
4040
@@ -143,16 +143,14 @@
143{143{
144}144}
145145
146
146static void147static void
147free_registration (gpointer key,148free_registration(GripGestureRegistration *reg)
148 gpointer value,
149 gpointer user_data)
150{149{
151 GripGestureRegistration *reg = (GripGestureRegistration *)value;
152 GList *tmp = NULL;150 GList *tmp = NULL;
153151
154 geis_unsubscribe (reg->instance,152 geis_unsubscribe (reg->instance,
155 (GeisGestureType*)reg->gesture_list->pdata);153 (GeisGestureType*)reg->gesture_list->pdata);
156154
157 /* We don't need to free the values in the GPtrArray. */155 /* We don't need to free the values in the GPtrArray. */
158 g_ptr_array_free (reg->gesture_list, TRUE);156 g_ptr_array_free (reg->gesture_list, TRUE);
@@ -165,19 +163,30 @@
165 g_list_free (reg->bindings);163 g_list_free (reg->bindings);
166}164}
167165
166/* Helper function needed to make things work with GTK. */
167
168static void
169free_registration_adapter (gpointer key,
170 gpointer value,
171 gpointer user_data)
172{
173 GripGestureRegistration *reg = (GripGestureRegistration *)value;
174 free_registration(reg);
175}
176
168static void177static void
169grip_gesture_manager_finalize (GObject *object)178grip_gesture_manager_finalize (GObject *object)
170{179{
171 GripGestureManagerPrivate *priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (object);180 GripGestureManagerPrivate *priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (object);
172181
173 if (priv->hash != NULL)182 if (priv->registered_windows != NULL)
174 {183 {
175 g_hash_table_foreach (priv->hash,184 g_hash_table_foreach (priv->registered_windows,
176 free_registration,185 free_registration_adapter,
177 NULL);186 NULL);
178187
179 g_hash_table_unref (priv->hash);188 g_hash_table_unref (priv->registered_windows);
180 priv->hash = NULL;189 priv->registered_windows = NULL;
181 }190 }
182}191}
183192
@@ -647,7 +656,7 @@
647656
648 priv = item->priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (item);657 priv = item->priv = GRIP_GESTURE_MANAGER_GET_PRIVATE (item);
649658
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);
651}660}
652661
653static gboolean662static gboolean
@@ -668,7 +677,7 @@
668{677{
669 GripGestureManager *manager = (GripGestureManager *)user_data;678 GripGestureManager *manager = (GripGestureManager *)user_data;
670 GripGestureManagerPrivate *priv = manager->priv;679 GripGestureManagerPrivate *priv = manager->priv;
671 GripGestureRegistration *reg = g_hash_table_lookup (priv->hash, object);680 GripGestureRegistration *reg = g_hash_table_lookup (priv->registered_windows, object);
672 GList *list;681 GList *list;
673682
674 for (list = reg->bindings; list != NULL; list = list->next)683 for (list = reg->bindings; list != NULL; list = list->next)
@@ -691,7 +700,7 @@
691700
692 geis_finish (reg->instance);701 geis_finish (reg->instance);
693702
694 g_hash_table_remove (priv->hash, object);703 g_hash_table_remove (priv->registered_windows, object);
695 g_free (reg);704 g_free (reg);
696}705}
697706
@@ -737,7 +746,7 @@
737746
738 priv = manager->priv;747 priv = manager->priv;
739748
740 if (!(reg = g_hash_table_lookup (priv->hash, toplevel)))749 if (!(reg = g_hash_table_lookup (priv->registered_windows, toplevel)))
741 {750 {
742 GeisInstance instance;751 GeisInstance instance;
743 GIOChannel *iochannel;752 GIOChannel *iochannel;
@@ -826,7 +835,7 @@
826835
827 reg->bindings = g_list_append (reg->bindings, binding);836 reg->bindings = g_list_append (reg->bindings, binding);
828837
829 g_hash_table_insert (priv->hash,838 g_hash_table_insert (priv->registered_windows,
830 toplevel,839 toplevel,
831 reg);840 reg);
832}841}
@@ -1036,6 +1045,30 @@
1036 }1045 }
1037}1046}
10381047
1048void
1049grip_gesture_manager_unregister_window (GripGestureManager *manager,
1050 GtkWidget *toplevel)
1051{
1052 GripGestureManagerPrivate *priv = manager->priv;
1053 GripGestureRegistration *reg;
1054
1055 g_return_if_fail (GRIP_IS_GESTURE_MANAGER (manager));
1056 g_return_if_fail (GTK_IS_WINDOW (toplevel));
1057
1058 /* Currently only allow unsubscribing after the window has been shown. */
1059 g_return_if_fail (gtk_widget_get_mapped (GTK_WIDGET (toplevel)));
1060 reg = g_hash_table_lookup (priv->registered_windows, toplevel);
1061 if (!reg) {
1062 return;
1063 }
1064 free_registration(reg);
1065 geis_finish(reg->instance);
1066 reg->instance = NULL;
1067 g_free(reg);
1068 g_hash_table_remove(priv->registered_windows, toplevel);
1069
1070}
1071
1039GType1072GType
1040grip_gesture_event_get_type (void)1073grip_gesture_event_get_type (void)
1041{1074{
10421075
=== modified file 'src/gripgesturemanager.h'
--- src/gripgesturemanager.h 2011-05-31 14:00:43 +0000
+++ src/gripgesturemanager.h 2011-06-16 15:02:33 +0000
@@ -214,6 +214,9 @@
214 gpointer user_data,214 gpointer user_data,
215 GDestroyNotify destroy);215 GDestroyNotify destroy);
216216
217void grip_gesture_manager_unregister_window (GripGestureManager *manager,
218 GtkWidget *widget);
219
217GType grip_gesture_event_get_type (void) G_GNUC_CONST;220GType grip_gesture_event_get_type (void) G_GNUC_CONST;
218GripGestureEvent *grip_gesture_event_new (GripGestureType gesture_type);221GripGestureEvent *grip_gesture_event_new (GripGestureType gesture_type);
219void grip_gesture_event_free (GripGestureEvent *event);222void grip_gesture_event_free (GripGestureEvent *event);
220223
=== modified file 'src/libgrip-0.1.ver'
--- src/libgrip-0.1.ver 2011-03-04 21:48:13 +0000
+++ src/libgrip-0.1.ver 2011-06-16 15:02:33 +0000
@@ -30,6 +30,7 @@
30 grip_gesture_manager_get;30 grip_gesture_manager_get;
31 grip_gesture_manager_get_type;31 grip_gesture_manager_get_type;
32 grip_gesture_manager_register_window;32 grip_gesture_manager_register_window;
33 grip_gesture_manager_unregister_window; # Delete once the version number is bumped.
33 grip_gesture_type_get_type;34 grip_gesture_type_get_type;
34 grip_time_type_get_type;35 grip_time_type_get_type;
3536
@@ -37,3 +38,8 @@
37 *;38 *;
38};39};
3940
41# Uncomment once version number is bumped.
42#GRIP_0.2 {
43# global:
44# grip_gesture_manager_unregister_window;
45#} GRIP_0.1;

Subscribers

People subscribed via source and target branches