| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/device/virtual/virtual_device.c')
| -rw-r--r-- | src/device/virtual/virtual_device.c | 93 | 
1 files changed, 70 insertions, 23 deletions
| diff --git a/src/device/virtual/virtual_device.c b/src/device/virtual/virtual_device.c index bd73743..d4be1b8 100644 --- a/src/device/virtual/virtual_device.c +++ b/src/device/virtual/virtual_device.c @@ -39,31 +39,21 @@ static void replace_rel_axes        if (relabsd_axis_is_enabled(axis))        { -         struct input_absinfo absinfo; - -         relabsd_axis_to_absinfo(axis, &absinfo); - -         /* TODO: report failure? 0 on success, -1 otherwise, no cause given. */ -         (void) libevdev_disable_event_code +         (void) relabsd_virtual_device_update_axis_absinfo           ( -            device->libevdev, -            EV_REL, -            relabsd_axis_name_to_evdev_rel(axis_name) -         ); - -         (void) libevdev_enable_event_code -         ( -            device->libevdev, -            EV_ABS, -            relabsd_axis_name_to_evdev_abs(axis_name), -            &absinfo +            axis_name, +            axis, +            device           );        }     } -  } -static int rename_device + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_virtual_device_rename  (     const struct relabsd_parameters parameters [const restrict static 1],     const struct relabsd_virtual_device device [const restrict static 1] @@ -146,9 +136,36 @@ static int rename_device     return 0;  } -/******************************************************************************/ -/**** EXPORTED FUNCTIONS ******************************************************/ -/******************************************************************************/ +int relabsd_virtual_device_update_axis_absinfo +( +   const enum relabsd_axis_name axis_name, +   const struct relabsd_axis axis [const restrict static 1], +   const struct relabsd_virtual_device device [const restrict static 1] +) +{ +   struct input_absinfo absinfo; + +   relabsd_axis_to_absinfo(axis, &absinfo); + +   /* TODO: report failure? 0 on success, -1 otherwise, no cause given. */ +   (void) libevdev_disable_event_code +   ( +      device->libevdev, +      EV_REL, +      relabsd_axis_name_to_evdev_rel(axis_name) +   ); + +   (void) libevdev_enable_event_code +   ( +      device->libevdev, +      EV_ABS, +      relabsd_axis_name_to_evdev_abs(axis_name), +      &absinfo +   ); + +   return 0; +} +  int relabsd_virtual_device_create_from  (     struct relabsd_parameters parameters [const restrict static 1], @@ -202,7 +219,7 @@ int relabsd_virtual_device_create_from     device->libevdev = physical_device_libevdev;     /* Not exactly fatal, is it? */ -   (void) rename_device(parameters, device); +   (void) relabsd_virtual_device_rename(parameters, device);     libevdev_enable_event_type(physical_device_libevdev, EV_ABS); @@ -244,6 +261,36 @@ int relabsd_virtual_device_create_from     return 0;  } +int relabsd_virtual_device_recreate +( +   struct relabsd_virtual_device device [const restrict static 1] +) +{ +   int err; +   RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Recreating virtual device..."); + +   libevdev_uinput_destroy(device->uinput_device); + +   err = +      libevdev_uinput_create_from_device +      ( +         (device->libevdev), +         /* See top of the file. */ +         LIBEVDEV_UINPUT_OPEN_MANAGED, +         &(device->uinput_device) +      ); + +   if (err !=  0) +   { +      RELABSD_FATAL("Could not recreate uinput device: %s.", strerror(-err)); + +      return -1; +   } + +   RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Recreated virtual device."); +   return 0; +} +  void relabsd_virtual_device_destroy  (     const struct relabsd_virtual_device device [const restrict static 1] | 


