~fginther/+junk/geis-2.2.9.1-take2

« back to all changes in this revision

Viewing changes to libutouch-geis/geis_v1.c

  • Committer: Stephen M. Webb
  • Date: 2012-04-12 15:53:17 UTC
  • mfrom: (247.1.2 lp-979855)
  • Revision ID: stephen.webb@canonical.com-20120412155317-wtqaskun0gr4ir53
Restored the reporting of existing devices on registering a device callback in GEISv1 (lp: #979855).

Show diffs side-by-side

added added

removed removed

Lines of Context:
768
768
}
769
769
 
770
770
 
 
771
/*
 
772
 * Translates a GEISv2 device into a GEISv1 device and invokes the appropriate
 
773
 * callback.
 
774
 */
771
775
static void
772
 
_v1_input_callback(Geis       geis GEIS_UNUSED,
773
 
                   GeisEvent  event,
774
 
                   void      *context)
 
776
_v1_report_device(GeisInstance instance,
 
777
                  GeisDevice   device,
 
778
                  GeisBoolean  is_added)
775
779
{
776
 
  GeisInstance v1_instance = (GeisInstance)context;
777
 
  GeisDevice device;
778
 
  GeisAttr attr;
779
 
  GeisSize i;
780
780
  GeisInputDeviceId device_id = 0;
781
 
 
782
 
  attr = geis_event_attr_by_name(event, GEIS_EVENT_ATTRIBUTE_DEVICE);
783
 
  if (!attr)
784
 
  {
785
 
    geis_error("no touchset for gesture event");
786
 
    goto final_exit;
787
 
  }
788
 
 
789
 
  device = geis_attr_value_to_pointer(attr);
790
 
  if (!device)
791
 
  {
792
 
    geis_warning("can not convert attr to device");
793
 
    goto final_exit;
794
 
  }
795
 
 
796
781
  GeisGestureAttr *attrs = calloc(geis_device_attr_count(device) + 1,
797
782
                                  sizeof(GeisGestureAttr));
798
783
  if (!attrs)
799
784
  {
800
785
    geis_error("can not allocate device attrs");
801
 
    goto final_exit;
 
786
    return;
802
787
  }
803
788
 
804
 
  for (i = 0; i < geis_device_attr_count(device); ++i)
 
789
  for (GeisSize i = 0; i < geis_device_attr_count(device); ++i)
805
790
  {
806
 
    attr = geis_device_attr(device, i);
 
791
    GeisAttr attr = geis_device_attr(device, i);
807
792
    if (0 == strcmp(geis_attr_name(attr), GEIS_DEVICE_ATTRIBUTE_ID))
808
793
    {
809
794
      device_id = geis_attr_value_to_integer(attr);
829
814
    }
830
815
  }
831
816
 
 
817
  if (is_added)
 
818
  {
 
819
    instance->input_funcs.added(instance->input_context, device_id, attrs);
 
820
  }
 
821
  else
 
822
  {
 
823
    instance->input_funcs.removed(instance->input_context, device_id, attrs);
 
824
  }
 
825
 
 
826
  free(attrs);
 
827
}
 
828
 
 
829
 
 
830
/*
 
831
 * Handler for device events.
 
832
 *
 
833
 * Converts GEISv2 device-add and device-removed events into similar GEISv1
 
834
 * callbacks.
 
835
 */
 
836
static void
 
837
_v1_input_callback(Geis       geis GEIS_UNUSED,
 
838
                   GeisEvent  event,
 
839
                   void      *context)
 
840
{
 
841
  GeisInstance instance = (GeisInstance)context;
 
842
 
 
843
  GeisAttr attr = geis_event_attr_by_name(event, GEIS_EVENT_ATTRIBUTE_DEVICE);
 
844
  if (!attr)
 
845
  {
 
846
    geis_error("no touchset for gesture event");
 
847
    goto final_exit;
 
848
  }
 
849
 
 
850
  GeisDevice device = geis_attr_value_to_pointer(attr);
 
851
  if (!device)
 
852
  {
 
853
    geis_warning("can not convert attr to device");
 
854
    goto final_exit;
 
855
  }
 
856
 
832
857
  switch (geis_event_type(event))
833
858
  {
834
859
    case GEIS_EVENT_DEVICE_AVAILABLE:
835
 
      v1_instance->input_funcs.added(v1_instance->input_context,
836
 
                                      device_id,
837
 
                                      attrs);
 
860
      _v1_report_device(instance, device, GEIS_TRUE);
838
861
      break;
839
862
    case GEIS_EVENT_DEVICE_UNAVAILABLE:
840
 
      v1_instance->input_funcs.removed(v1_instance->input_context,
841
 
                                        device_id,
842
 
                                        attrs);
 
863
      _v1_report_device(instance, device, GEIS_FALSE);
843
864
      break;
844
865
    default:
845
866
      geis_debug("-- event ignored --");
846
867
      break;
847
868
  }
848
869
 
849
 
  free(attrs);
850
 
 
851
870
final_exit:
852
871
  geis_event_delete(event);
853
872
}
865
884
 
866
885
  geis_register_device_callback(instance->geis, _v1_input_callback, instance);
867
886
 
 
887
  /* report pre-existing devices */
 
888
  GeisDeviceBag device_bag = geis_devices(instance->geis);
 
889
  for (GeisSize d = 0; d != geis_device_bag_count(device_bag); ++d)
 
890
  {
 
891
    GeisDevice device = geis_device_bag_device(device_bag, d);
 
892
    _v1_report_device(instance, device, GEIS_TRUE);
 
893
  }
 
894
 
868
895
  return result;
869
896
}
870
897