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
=== modified file 'libutouch-geis/backend/grail/geis_grail_backend.c'
--- libutouch-geis/backend/grail/geis_grail_backend.c 2012-02-17 23:51:04 +0000
+++ libutouch-geis/backend/grail/geis_grail_backend.c 2012-02-24 11:49:19 +0000
@@ -1232,11 +1232,11 @@
1232 | UGGestureTypeTap1232 | UGGestureTypeTap
1233 | UGGestureTypeTouch;1233 | UGGestureTypeTouch;
1234 UGGestureTypeMask ugmask = 0;1234 UGGestureTypeMask ugmask = 0;
1235 unsigned int start_touches = 0;1235 unsigned int start_touches = 1;
1236 unsigned int min_touches = 1;1236 unsigned int min_touches = 1;
1237 unsigned int max_touches = 5;1237 unsigned int max_touches = 5;
12381238
1239 for (GeisSize i = 0; i < geis_filter_term_count(filter); ++i)1239 for (GeisSize i = 0; filter && i < geis_filter_term_count(filter); ++i)
1240 {1240 {
1241 GeisFilterTerm term = geis_filter_term(filter, i);1241 GeisFilterTerm term = geis_filter_term(filter, i);
1242 if (GEIS_FILTER_CLASS == geis_filter_term_facility(term))1242 if (GEIS_FILTER_CLASS == geis_filter_term_facility(term))
@@ -1419,14 +1419,23 @@
1419 goto final_exit;1419 goto final_exit;
1420 }1420 }
14211421
1422 geis_debug("subscription='%s' filter='%s' device=%d '%s' window=0x%08x "1422 if (filter)
1423 "ugsub=%p atomic=%d",1423 geis_debug("subscription='%s' filter='%s' device=%d '%s' window=0x%08x "
1424 geis_subscription_name(subscription),1424 "ugsub=%p atomic=%d",
1425 geis_filter_name(filter),1425 geis_subscription_name(subscription),
1426 device_id, geis_device_name(device),1426 geis_filter_name(filter),
1427 window_id,1427 device_id, geis_device_name(device),
1428 (void *)ugsub,1428 window_id,
1429 grail_use_atomic_gestures);1429 (void *)ugsub,
1430 grail_use_atomic_gestures);
1431 else
1432 geis_debug("subscription='%s' device=%d '%s' window=0x%08x "
1433 "ugsub=%p atomic=%d",
1434 geis_subscription_name(subscription),
1435 device_id, geis_device_name(device),
1436 window_id,
1437 (void *)ugsub,
1438 grail_use_atomic_gestures);
14301439
1431 geis_grail_window_grab_store_grab(gbe->window_grabs, window_id);1440 geis_grail_window_grab_store_grab(gbe->window_grabs, window_id);
1432 ugstatus = grail_subscription_activate(gbe->grail, ugsub);1441 ugstatus = grail_subscription_activate(gbe->grail, ugsub);
@@ -1455,35 +1464,39 @@
1455 {1464 {
1456 GeisDevice device = geis_device_bag_device(device_bag, d);1465 GeisDevice device = geis_device_bag_device(device_bag, d);
1457 GeisBoolean has_region_term = GEIS_FALSE;1466 GeisBoolean has_region_term = GEIS_FALSE;
1458 for (GeisSize i = 0; i < geis_filter_term_count(filter); ++i)1467 if (filter)
1459 {1468 {
1460 GeisFilterTerm term = geis_filter_term(filter, i);1469 for (GeisSize i = 0; i < geis_filter_term_count(filter); ++i)
1461 if (GEIS_FILTER_REGION == geis_filter_term_facility(term))
1462 {1470 {
1463 GeisInteger window_id = 0;1471 GeisFilterTerm term = geis_filter_term(filter, i);
1464 GeisAttr attr = geis_filter_term_attr(term);1472 if (GEIS_FILTER_REGION == geis_filter_term_facility(term))
1465 GeisString name = geis_attr_name(attr);1473 {
1466 GeisFilterOperation operation = geis_filter_term_operation(term);1474 GeisInteger window_id = 0;
1475 GeisAttr attr = geis_filter_term_attr(term);
1476 GeisString name = geis_attr_name(attr);
1477 GeisFilterOperation operation = geis_filter_term_operation(term);
14671478
1468 if (0 == strcmp(name, GEIS_REGION_ATTRIBUTE_WINDOWID)1479 if (0 == strcmp(name, GEIS_REGION_ATTRIBUTE_WINDOWID)
1469 && operation == GEIS_FILTER_OP_EQ)1480 && operation == GEIS_FILTER_OP_EQ)
1470 {1481 {
1471 window_id = geis_attr_value_to_integer(attr);1482 window_id = geis_attr_value_to_integer(attr);
1472 has_region_term = GEIS_TRUE;1483 has_region_term = GEIS_TRUE;
1473 status = _geis_grail_activate_for_device_region(gbe,1484 status = _geis_grail_activate_for_device_region(gbe,
1474 filter,1485 filter,
1475 device,1486 device,
1476 window_id,1487 window_id,
1477 subscription);1488 subscription);
1478 }1489 }
1479 else1490 else
1480 {1491 {
1481 geis_warning("unhandled region filter term");1492 geis_warning("unhandled region filter term");
1493 }
1482 }1494 }
1483 }1495 }
1484 }1496 }
14851497
1486 /* If no region terms were found, use the root window. */1498 /* If no region terms were found, or there's no filter, use the root
1499 window. */
1487 if (!has_region_term)1500 if (!has_region_term)
1488 {1501 {
1489 status = _geis_grail_activate_for_device_region(gbe,1502 status = _geis_grail_activate_for_device_region(gbe,
@@ -1496,28 +1509,12 @@
1496 return status;1509 return status;
1497}1510}
14981511
14991512static GeisStatus
1500/*1513_geis_grail_activate_with_filters(GeisGrailBackend gbe,
1501 * Activates a GEIS subscription on the back end.1514 GeisSubscription subscription)
1502 */
1503GeisStatus
1504geis_grail_backend_activate_subscription(GeisGrailBackend gbe,
1505 GeisSubscription subscription)
1506{1515{
1507 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;1516 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
15081517
1509 GeisUGSubscriptionStore ugstore = geis_subscription_pdata(subscription);
1510 if (ugstore == NULL)
1511 {
1512 ugstore = geis_ugsubscription_store_new();
1513 if (!ugstore)
1514 {
1515 geis_error("error creating grail subscription store");
1516 goto final_exit;
1517 }
1518 geis_subscription_set_pdata(subscription, ugstore);
1519 }
1520
1521 for (GeisFilterIterator it = geis_subscription_filter_begin(subscription);1518 for (GeisFilterIterator it = geis_subscription_filter_begin(subscription);
1522 it != geis_subscription_filter_end(subscription);1519 it != geis_subscription_filter_end(subscription);
1523 it = geis_subscription_filter_next(subscription, it))1520 it = geis_subscription_filter_next(subscription, it))
@@ -1563,6 +1560,39 @@
1563 geis_device_bag_delete(selected_devices);1560 geis_device_bag_delete(selected_devices);
1564 }1561 }
15651562
1563 return status;
1564}
1565
1566/*
1567 * Activates a GEIS subscription on the back end.
1568 */
1569GeisStatus
1570geis_grail_backend_activate_subscription(GeisGrailBackend gbe,
1571 GeisSubscription subscription)
1572{
1573 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
1574
1575 GeisUGSubscriptionStore ugstore = geis_subscription_pdata(subscription);
1576 if (ugstore == NULL)
1577 {
1578 ugstore = geis_ugsubscription_store_new();
1579 if (!ugstore)
1580 {
1581 geis_error("error creating grail subscription store");
1582 goto final_exit;
1583 }
1584 geis_subscription_set_pdata(subscription, ugstore);
1585 }
1586
1587 if (geis_subscription_filter_count(subscription) > 0) {
1588 status = _geis_grail_activate_with_filters(gbe, subscription);
1589 } else {
1590 status = _geis_grail_activate_for_devices(gbe,
1591 NULL, /* no filter */
1592 geis_devices(gbe->geis),
1593 subscription);
1594 }
1595
1566final_exit:1596final_exit:
1567 return status;1597 return status;
1568}1598}

Subscribers

People subscribed via source and target branches