Merge lp:~dandrader/geis/lp939679 into lp:geis

Proposed by Daniel d'Andrada
Status: Merged
Approved by: Daniel d'Andrada
Approved revision: 207
Merged at revision: 208
Proposed branch: lp:~dandrader/geis/lp939679
Merge into: lp:geis
Diff against target: 183 lines (+81/-51)
1 file modified
libutouch-geis/backend/grail/geis_grail_backend.c (+81/-51)
To merge this branch: bzr merge lp:~dandrader/geis/lp939679
Reviewer Review Type Date Requested Status
Stephen M. Webb (community) Approve
Review via email: mp+94525@code.launchpad.net

Description of the change

grail_backend: Properly activate a subscription that has no filters.

Fixes bug https://launchpad.net/bugs/939679

To post a comment you must log in.
Revision history for this message
Stephen M. Webb (bregma) wrote :

In the non-filter debug statement (on or around line 432), could you please make the fact that there is no filter on the subscription explicit? This is important debug information and just leaving it out makes it harder to spot during bug analysis without reading the code.

Other than that, this is good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libutouch-geis/backend/grail/geis_grail_backend.c'
2--- libutouch-geis/backend/grail/geis_grail_backend.c 2012-02-17 23:51:04 +0000
3+++ libutouch-geis/backend/grail/geis_grail_backend.c 2012-02-24 11:49:19 +0000
4@@ -1232,11 +1232,11 @@
5 | UGGestureTypeTap
6 | UGGestureTypeTouch;
7 UGGestureTypeMask ugmask = 0;
8- unsigned int start_touches = 0;
9+ unsigned int start_touches = 1;
10 unsigned int min_touches = 1;
11 unsigned int max_touches = 5;
12
13- for (GeisSize i = 0; i < geis_filter_term_count(filter); ++i)
14+ for (GeisSize i = 0; filter && i < geis_filter_term_count(filter); ++i)
15 {
16 GeisFilterTerm term = geis_filter_term(filter, i);
17 if (GEIS_FILTER_CLASS == geis_filter_term_facility(term))
18@@ -1419,14 +1419,23 @@
19 goto final_exit;
20 }
21
22- geis_debug("subscription='%s' filter='%s' device=%d '%s' window=0x%08x "
23- "ugsub=%p atomic=%d",
24- geis_subscription_name(subscription),
25- geis_filter_name(filter),
26- device_id, geis_device_name(device),
27- window_id,
28- (void *)ugsub,
29- grail_use_atomic_gestures);
30+ if (filter)
31+ geis_debug("subscription='%s' filter='%s' device=%d '%s' window=0x%08x "
32+ "ugsub=%p atomic=%d",
33+ geis_subscription_name(subscription),
34+ geis_filter_name(filter),
35+ device_id, geis_device_name(device),
36+ window_id,
37+ (void *)ugsub,
38+ grail_use_atomic_gestures);
39+ else
40+ geis_debug("subscription='%s' device=%d '%s' window=0x%08x "
41+ "ugsub=%p atomic=%d",
42+ geis_subscription_name(subscription),
43+ device_id, geis_device_name(device),
44+ window_id,
45+ (void *)ugsub,
46+ grail_use_atomic_gestures);
47
48 geis_grail_window_grab_store_grab(gbe->window_grabs, window_id);
49 ugstatus = grail_subscription_activate(gbe->grail, ugsub);
50@@ -1455,35 +1464,39 @@
51 {
52 GeisDevice device = geis_device_bag_device(device_bag, d);
53 GeisBoolean has_region_term = GEIS_FALSE;
54- for (GeisSize i = 0; i < geis_filter_term_count(filter); ++i)
55+ if (filter)
56 {
57- GeisFilterTerm term = geis_filter_term(filter, i);
58- if (GEIS_FILTER_REGION == geis_filter_term_facility(term))
59+ for (GeisSize i = 0; i < geis_filter_term_count(filter); ++i)
60 {
61- GeisInteger window_id = 0;
62- GeisAttr attr = geis_filter_term_attr(term);
63- GeisString name = geis_attr_name(attr);
64- GeisFilterOperation operation = geis_filter_term_operation(term);
65+ GeisFilterTerm term = geis_filter_term(filter, i);
66+ if (GEIS_FILTER_REGION == geis_filter_term_facility(term))
67+ {
68+ GeisInteger window_id = 0;
69+ GeisAttr attr = geis_filter_term_attr(term);
70+ GeisString name = geis_attr_name(attr);
71+ GeisFilterOperation operation = geis_filter_term_operation(term);
72
73- if (0 == strcmp(name, GEIS_REGION_ATTRIBUTE_WINDOWID)
74- && operation == GEIS_FILTER_OP_EQ)
75- {
76- window_id = geis_attr_value_to_integer(attr);
77- has_region_term = GEIS_TRUE;
78- status = _geis_grail_activate_for_device_region(gbe,
79- filter,
80- device,
81- window_id,
82- subscription);
83- }
84- else
85- {
86- geis_warning("unhandled region filter term");
87+ if (0 == strcmp(name, GEIS_REGION_ATTRIBUTE_WINDOWID)
88+ && operation == GEIS_FILTER_OP_EQ)
89+ {
90+ window_id = geis_attr_value_to_integer(attr);
91+ has_region_term = GEIS_TRUE;
92+ status = _geis_grail_activate_for_device_region(gbe,
93+ filter,
94+ device,
95+ window_id,
96+ subscription);
97+ }
98+ else
99+ {
100+ geis_warning("unhandled region filter term");
101+ }
102 }
103 }
104 }
105
106- /* If no region terms were found, use the root window. */
107+ /* If no region terms were found, or there's no filter, use the root
108+ window. */
109 if (!has_region_term)
110 {
111 status = _geis_grail_activate_for_device_region(gbe,
112@@ -1496,28 +1509,12 @@
113 return status;
114 }
115
116-
117-/*
118- * Activates a GEIS subscription on the back end.
119- */
120-GeisStatus
121-geis_grail_backend_activate_subscription(GeisGrailBackend gbe,
122- GeisSubscription subscription)
123+static GeisStatus
124+_geis_grail_activate_with_filters(GeisGrailBackend gbe,
125+ GeisSubscription subscription)
126 {
127 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
128
129- GeisUGSubscriptionStore ugstore = geis_subscription_pdata(subscription);
130- if (ugstore == NULL)
131- {
132- ugstore = geis_ugsubscription_store_new();
133- if (!ugstore)
134- {
135- geis_error("error creating grail subscription store");
136- goto final_exit;
137- }
138- geis_subscription_set_pdata(subscription, ugstore);
139- }
140-
141 for (GeisFilterIterator it = geis_subscription_filter_begin(subscription);
142 it != geis_subscription_filter_end(subscription);
143 it = geis_subscription_filter_next(subscription, it))
144@@ -1563,6 +1560,39 @@
145 geis_device_bag_delete(selected_devices);
146 }
147
148+ return status;
149+}
150+
151+/*
152+ * Activates a GEIS subscription on the back end.
153+ */
154+GeisStatus
155+geis_grail_backend_activate_subscription(GeisGrailBackend gbe,
156+ GeisSubscription subscription)
157+{
158+ GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
159+
160+ GeisUGSubscriptionStore ugstore = geis_subscription_pdata(subscription);
161+ if (ugstore == NULL)
162+ {
163+ ugstore = geis_ugsubscription_store_new();
164+ if (!ugstore)
165+ {
166+ geis_error("error creating grail subscription store");
167+ goto final_exit;
168+ }
169+ geis_subscription_set_pdata(subscription, ugstore);
170+ }
171+
172+ if (geis_subscription_filter_count(subscription) > 0) {
173+ status = _geis_grail_activate_with_filters(gbe, subscription);
174+ } else {
175+ status = _geis_grail_activate_for_devices(gbe,
176+ NULL, /* no filter */
177+ geis_devices(gbe->geis),
178+ subscription);
179+ }
180+
181 final_exit:
182 return status;
183 }

Subscribers

People subscribed via source and target branches