Add mouse update thread

This change adds a thread to translate thumbstick events to a virtual
mouse.
reverse-scroll
nirenjan 2021-09-14 17:08:01 -07:00
parent 42850bc4cd
commit 7f29f5f5fe
6 changed files with 279 additions and 65 deletions

View File

@ -14,6 +14,7 @@
#include "x52d_const.h" #include "x52d_const.h"
#include "x52d_config.h" #include "x52d_config.h"
#include "x52d_io.h" #include "x52d_io.h"
#include "x52d_mouse.h"
#include "libx52io.h" #include "libx52io.h"
#include "pinelog.h" #include "pinelog.h"
@ -24,6 +25,7 @@ static pthread_t io_thr;
static void process_report(libx52io_report *report, libx52io_report *prev) static void process_report(libx52io_report *report, libx52io_report *prev)
{ {
// TODO: Process changes // TODO: Process changes
x52d_mouse_report_event(report);
memcpy(prev, report, sizeof(*prev)); memcpy(prev, report, sizeof(*prev));
} }

View File

@ -21,6 +21,7 @@
#include "x52d_config.h" #include "x52d_config.h"
#include "x52d_device.h" #include "x52d_device.h"
#include "x52d_io.h" #include "x52d_io.h"
#include "x52d_mouse.h"
#include "pinelog.h" #include "pinelog.h"
static volatile int flag_quit; static volatile int flag_quit;
@ -296,6 +297,7 @@ int main(int argc, char **argv)
x52d_clock_init(); x52d_clock_init();
#if defined(HAVE_EVDEV) #if defined(HAVE_EVDEV)
x52d_io_init(); x52d_io_init();
x52d_mouse_evdev_init();
#endif #endif
// Apply configuration // Apply configuration
@ -328,6 +330,7 @@ int main(int argc, char **argv)
x52d_clock_exit(); x52d_clock_exit();
x52d_dev_exit(); x52d_dev_exit();
#if defined(HAVE_EVDEV) #if defined(HAVE_EVDEV)
x52d_mouse_evdev_exit();
x52d_io_exit(); x52d_io_exit();
#endif #endif

View File

@ -10,10 +10,14 @@
#define X52D_MOUSE_H #define X52D_MOUSE_H
#include <stdbool.h> #include <stdbool.h>
#include "libx52io.h"
extern volatile bool mouse_enabled; extern volatile bool mouse_enabled;
extern volatile int mouse_delay; extern volatile int mouse_delay;
void x52d_mouse_evdev_thread_control(bool enabled); void x52d_mouse_evdev_thread_control(bool enabled);
void x52d_mouse_evdev_init(void);
void x52d_mouse_evdev_exit(void);
void x52d_mouse_report_event(libx52io_report *report);
#endif // !defined X52D_MOUSE_H #endif // !defined X52D_MOUSE_H

View File

@ -12,6 +12,10 @@
#include <pthread.h> #include <pthread.h>
#include <unistd.h> #include <unistd.h>
#include "libevdev/libevdev.h"
#include "libevdev/libevdev-uinput.h"
#include "libx52io.h"
#include "pinelog.h" #include "pinelog.h"
#include "x52d_config.h" #include "x52d_config.h"
#include "x52d_const.h" #include "x52d_const.h"
@ -20,17 +24,115 @@
static pthread_t mouse_thr; static pthread_t mouse_thr;
static bool mouse_thr_enabled = false; static bool mouse_thr_enabled = false;
static struct libevdev_uinput *mouse_uidev;
static bool mouse_uidev_created = false;
static volatile libx52io_report old_report;
static volatile libx52io_report new_report;
static int report_button_change(int button, int index)
{
int rc = 1;
bool old_button = old_report.button[index];
bool new_button = new_report.button[index];
if (old_button != new_button) {
rc = libevdev_uinput_write_event(mouse_uidev, EV_KEY, button,
(int)new_button);
if (rc != 0) {
PINELOG_ERROR(_("Error writing mouse button event (button %d, state %d)"),
button, (int)new_button);
}
}
return rc;
}
#define btn_change(btn) new_report.button[btn] != old_report.button[btn]
static int report_wheel(void)
{
int rc = 1;
int wheel = 0;
bool scroll_up = (btn_change(LIBX52IO_BTN_MOUSE_SCROLL_UP));
bool scroll_dn = (btn_change(LIBX52IO_BTN_MOUSE_SCROLL_DN));
if (scroll_up) {
// Scroll up event
if (new_report.button[LIBX52IO_BTN_MOUSE_SCROLL_UP]) {
wheel = 1;
}
} else if (scroll_dn) {
// Scroll down event
if (new_report.button[LIBX52IO_BTN_MOUSE_SCROLL_DN]) {
wheel = -1;
}
}
if (wheel != 0) {
rc = libevdev_uinput_write_event(mouse_uidev, EV_REL, REL_WHEEL, 1);
if (rc != 0) {
PINELOG_ERROR(_("Error writing mouse wheel event %d"), wheel);
}
}
return rc;
}
static int report_axis(int axis, int index)
{
int rc = 1;
int axis_val = new_report.axis[index];
/*
* Axis value ranges from 0 to 15, with the default midpoint at 8.
* We need to translate this to a range of -7 to +7. Since the midpoint
* is slightly off-center, we will shift the values left, and subtract
* 15, effectively, giving us a range of -15 to +15. Shifting right again
* will reduce the range to -7 to +7, and effectively ignore the reported
* values of 7 and 8.
*/
axis_val = ((axis_val << 1) - 15) >> 1;
if (axis_val) {
rc = libevdev_uinput_write_event(mouse_uidev, EV_REL, axis, axis_val);
if (rc != 0) {
PINELOG_ERROR(_("Error writing mouse axis event (axis %d, value %d)"),
axis, axis_val);
}
}
return rc;
}
static void * x52_mouse_thr(void *param) static void * x52_mouse_thr(void *param)
{ {
bool state_changed;
int rc;
PINELOG_INFO(_("Starting X52 virtual mouse driver thread")); PINELOG_INFO(_("Starting X52 virtual mouse driver thread"));
for (;;) { for (;;) {
usleep(mouse_delay); /* Check if there are any changes in button state */
if (!mouse_enabled) { state_changed = false;
/* Mouse thread is disabled, check again next time */ state_changed |= (0 == report_button_change(BTN_LEFT, LIBX52IO_BTN_MOUSE_PRIMARY));
continue; state_changed |= (0 == report_button_change(BTN_RIGHT, LIBX52IO_BTN_MOUSE_SECONDARY));
state_changed |= (0 == report_wheel());
state_changed |= (0 == report_axis(REL_X, LIBX52IO_AXIS_THUMBX));
state_changed |= (0 == report_axis(REL_Y, LIBX52IO_AXIS_THUMBY));
if (state_changed) {
rc = libevdev_uinput_write_event(mouse_uidev, EV_SYN, SYN_REPORT, 0);
if (rc != 0) {
PINELOG_ERROR(_("Error writing mouse sync event"));
} else {
memcpy((void *)&old_report, (void *)&new_report, sizeof(old_report));
} }
} }
usleep(mouse_delay);
}
return NULL; return NULL;
} }
@ -54,11 +156,21 @@ static void x52d_mouse_thr_exit(void)
void x52d_mouse_evdev_thread_control(bool enabled) void x52d_mouse_evdev_thread_control(bool enabled)
{ {
if (!mouse_uidev_created) {
PINELOG_INFO(_("Virtual mouse not created. Ignoring thread state change"));
return;
}
if (enabled) { if (enabled) {
if (mouse_thr_enabled) { if (mouse_thr_enabled) {
PINELOG_TRACE("Ignoring re-enable mouse thread"); PINELOG_TRACE("Ignoring re-enable mouse thread");
return; return;
} else { } else {
memset((void *)&old_report, 0, sizeof(old_report));
/* Set the default thumbstick values to the mid-point */
old_report.axis[LIBX52IO_AXIS_THUMBX] = 8;
old_report.axis[LIBX52IO_AXIS_THUMBY] = 8;
memcpy((void *)&new_report, (void *)&old_report, sizeof(new_report));
x52d_mouse_thr_init(); x52d_mouse_thr_init();
} }
} else { } else {
@ -71,3 +183,40 @@ void x52d_mouse_evdev_thread_control(bool enabled)
} }
mouse_thr_enabled = enabled; mouse_thr_enabled = enabled;
} }
void x52d_mouse_report_event(libx52io_report *report)
{
memcpy((void *)&new_report, report, sizeof(new_report));
}
void x52d_mouse_evdev_init(void)
{
int rc;
struct libevdev *dev;
/* Create a new mouse device */
dev = libevdev_new();
libevdev_set_name(dev, "X52 virtual mouse");
libevdev_enable_event_type(dev, EV_REL);
libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
libevdev_enable_event_code(dev, EV_REL, REL_WHEEL, NULL);
libevdev_enable_event_type(dev, EV_KEY);
libevdev_enable_event_code(dev, EV_KEY, BTN_LEFT, NULL);
libevdev_enable_event_code(dev, EV_KEY, BTN_RIGHT, NULL);
rc = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED,
&mouse_uidev);
if (rc != 0) {
PINELOG_ERROR(_("Error %d creating X52 virtual mouse: %s"),
-rc, strerror(-rc));
} else {
mouse_uidev_created = true;
}
}
void x52d_mouse_evdev_exit(void)
{
mouse_uidev_created = false;
libevdev_uinput_destroy(mouse_uidev);
}

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: x52pro-linux 0.2.2\n" "Project-Id-Version: x52pro-linux 0.2.2\n"
"Report-Msgid-Bugs-To: https://github.com/nirenjan/x52pro-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/nirenjan/x52pro-linux/issues\n"
"POT-Creation-Date: 2021-09-14 13:28-0700\n" "POT-Creation-Date: 2021-09-14 17:04-0700\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -491,17 +491,17 @@ msgstr ""
msgid "OK" msgid "OK"
msgstr "" msgstr ""
#: daemon/x52d_main.c:59 #: daemon/x52d_main.c:60
#, c-format #, c-format
msgid "Error %d setting log file: %s\n" msgid "Error %d setting log file: %s\n"
msgstr "" msgstr ""
#: daemon/x52d_main.c:75 #: daemon/x52d_main.c:76
#, c-format #, c-format
msgid "Error %d installing handler for signal %d: %s" msgid "Error %d installing handler for signal %d: %s"
msgstr "" msgstr ""
#: daemon/x52d_main.c:86 #: daemon/x52d_main.c:87
#, c-format #, c-format
msgid "" msgid ""
"Usage: %s [-f] [-v] [-q]\n" "Usage: %s [-f] [-v] [-q]\n"
@ -509,63 +509,63 @@ msgid ""
"\t[-c config-file] [-p pid-file]\n" "\t[-c config-file] [-p pid-file]\n"
msgstr "" msgstr ""
#: daemon/x52d_main.c:116 #: daemon/x52d_main.c:117
#, c-format #, c-format
msgid "Daemon is already running as PID %u" msgid "Daemon is already running as PID %u"
msgstr "" msgstr ""
#: daemon/x52d_main.c:254 #: daemon/x52d_main.c:255
#, c-format #, c-format
msgid "Unable to parse configuration override '%s'\n" msgid "Unable to parse configuration override '%s'\n"
msgstr "" msgstr ""
#: daemon/x52d_main.c:278 #: daemon/x52d_main.c:279
#, c-format #, c-format
msgid "Foreground = %s" msgid "Foreground = %s"
msgstr "" msgstr ""
#: daemon/x52d_main.c:278 daemon/x52d_main.c:279 #: daemon/x52d_main.c:279 daemon/x52d_main.c:280
msgid "true" msgid "true"
msgstr "" msgstr ""
#: daemon/x52d_main.c:278 daemon/x52d_main.c:279 #: daemon/x52d_main.c:279 daemon/x52d_main.c:280
msgid "false" msgid "false"
msgstr "" msgstr ""
#: daemon/x52d_main.c:279
#, c-format
msgid "Quiet = %s"
msgstr ""
#: daemon/x52d_main.c:280 #: daemon/x52d_main.c:280
#, c-format #, c-format
msgid "Verbosity = %d" msgid "Quiet = %s"
msgstr "" msgstr ""
#: daemon/x52d_main.c:281 #: daemon/x52d_main.c:281
#, c-format #, c-format
msgid "Log file = %s" msgid "Verbosity = %d"
msgstr "" msgstr ""
#: daemon/x52d_main.c:282 #: daemon/x52d_main.c:282
#, c-format #, c-format
msgid "Log file = %s"
msgstr ""
#: daemon/x52d_main.c:283
#, c-format
msgid "Config file = %s" msgid "Config file = %s"
msgstr "" msgstr ""
#: daemon/x52d_main.c:312 #: daemon/x52d_main.c:314
msgid "Reloading X52 configuration" msgid "Reloading X52 configuration"
msgstr "" msgstr ""
#: daemon/x52d_main.c:319 #: daemon/x52d_main.c:321
msgid "Saving X52 configuration to disk" msgid "Saving X52 configuration to disk"
msgstr "" msgstr ""
#: daemon/x52d_main.c:325 #: daemon/x52d_main.c:327
#, c-format #, c-format
msgid "Received termination signal %s" msgid "Received termination signal %s"
msgstr "" msgstr ""
#: daemon/x52d_main.c:338 #: daemon/x52d_main.c:341
msgid "Shutting down X52 daemon" msgid "Shutting down X52 daemon"
msgstr "" msgstr ""
@ -715,31 +715,31 @@ msgstr ""
msgid "Error %d when updating X52 device: %s" msgid "Error %d when updating X52 device: %s"
msgstr "" msgstr ""
#: daemon/x52d_io.c:39 #: daemon/x52d_io.c:41
msgid "Starting X52 I/O thread" msgid "Starting X52 I/O thread"
msgstr "" msgstr ""
#: daemon/x52d_io.c:51 #: daemon/x52d_io.c:53
#, c-format #, c-format
msgid "Error %d opening X52 I/O device: %s" msgid "Error %d opening X52 I/O device: %s"
msgstr "" msgstr ""
#: daemon/x52d_io.c:76 #: daemon/x52d_io.c:78
#, c-format #, c-format
msgid "Error %d reading from X52 I/O device: %s" msgid "Error %d reading from X52 I/O device: %s"
msgstr "" msgstr ""
#: daemon/x52d_io.c:95 #: daemon/x52d_io.c:97
#, c-format #, c-format
msgid "Error %d initializing X52 I/O library: %s" msgid "Error %d initializing X52 I/O library: %s"
msgstr "" msgstr ""
#: daemon/x52d_io.c:101 #: daemon/x52d_io.c:103
#, c-format #, c-format
msgid "Error %d initializing I/O driver thread: %s" msgid "Error %d initializing I/O driver thread: %s"
msgstr "" msgstr ""
#: daemon/x52d_io.c:108 #: daemon/x52d_io.c:110
msgid "Shutting down X52 I/O driver thread" msgid "Shutting down X52 I/O driver thread"
msgstr "" msgstr ""
@ -758,15 +758,43 @@ msgstr ""
msgid "Ignoring mouse speed %d outside supported range (0-%d)" msgid "Ignoring mouse speed %d outside supported range (0-%d)"
msgstr "" msgstr ""
#: daemon/x52d_mouse_evdev.c:25 #: daemon/x52d_mouse_evdev.c:43
#, c-format
msgid "Error writing mouse button event (button %d, state %d)"
msgstr ""
#: daemon/x52d_mouse_evdev.c:75
#, c-format
msgid "Error writing mouse wheel event %d"
msgstr ""
#: daemon/x52d_mouse_evdev.c:101
#, c-format
msgid "Error writing mouse axis event (axis %d, value %d)"
msgstr ""
#: daemon/x52d_mouse_evdev.c:114
msgid "Starting X52 virtual mouse driver thread" msgid "Starting X52 virtual mouse driver thread"
msgstr "" msgstr ""
#: daemon/x52d_mouse_evdev.c:44 #: daemon/x52d_mouse_evdev.c:127
msgid "Error writing mouse sync event"
msgstr ""
#: daemon/x52d_mouse_evdev.c:146
#, c-format #, c-format
msgid "Error %d initializing mouse thread: %s" msgid "Error %d initializing mouse thread: %s"
msgstr "" msgstr ""
#: daemon/x52d_mouse_evdev.c:51 #: daemon/x52d_mouse_evdev.c:153
msgid "Shutting down X52 virtual mouse driver thread" msgid "Shutting down X52 virtual mouse driver thread"
msgstr "" msgstr ""
#: daemon/x52d_mouse_evdev.c:160
msgid "Virtual mouse not created. Ignoring thread state change"
msgstr ""
#: daemon/x52d_mouse_evdev.c:211
#, c-format
msgid "Error %d creating X52 virtual mouse: %s"
msgstr ""

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: x52pro-linux 0.2.1\n" "Project-Id-Version: x52pro-linux 0.2.1\n"
"Report-Msgid-Bugs-To: https://github.com/nirenjan/x52pro-linux/issues\n" "Report-Msgid-Bugs-To: https://github.com/nirenjan/x52pro-linux/issues\n"
"POT-Creation-Date: 2021-09-14 13:28-0700\n" "POT-Creation-Date: 2021-09-14 17:04-0700\n"
"PO-Revision-Date: 2021-09-14 13:28-0700\n" "PO-Revision-Date: 2021-09-14 17:07-0700\n"
"Last-Translator: Nirenjan Krishnan <nirenjan@gmail.com>\n" "Last-Translator: Nirenjan Krishnan <nirenjan@gmail.com>\n"
"Language-Team: Dummy Language for testing i18n\n" "Language-Team: Dummy Language for testing i18n\n"
"Language: xx_PL\n" "Language: xx_PL\n"
@ -534,17 +534,17 @@ msgstr "Estingtay aracterchay 0x%02x..."
msgid "OK" msgid "OK"
msgstr "OKay" msgstr "OKay"
#: daemon/x52d_main.c:59 #: daemon/x52d_main.c:60
#, c-format #, c-format
msgid "Error %d setting log file: %s\n" msgid "Error %d setting log file: %s\n"
msgstr "Erroray %d ettingsay oglay ilefay: %s\n" msgstr "Erroray %d ettingsay oglay ilefay: %s\n"
#: daemon/x52d_main.c:75 #: daemon/x52d_main.c:76
#, c-format #, c-format
msgid "Error %d installing handler for signal %d: %s" msgid "Error %d installing handler for signal %d: %s"
msgstr "Erroray %d installingay andlerhay orfay ignalsay %d: %s" msgstr "Erroray %d installingay andlerhay orfay ignalsay %d: %s"
#: daemon/x52d_main.c:86 #: daemon/x52d_main.c:87
#, c-format #, c-format
msgid "" msgid ""
"Usage: %s [-f] [-v] [-q]\n" "Usage: %s [-f] [-v] [-q]\n"
@ -555,63 +555,63 @@ msgstr ""
"\t[-l oglay-ilefay] [-o overrideay]\n" "\t[-l oglay-ilefay] [-o overrideay]\n"
"\t[-c onfigcay-ilefay] [-p idpay-ilefay]\n" "\t[-c onfigcay-ilefay] [-p idpay-ilefay]\n"
#: daemon/x52d_main.c:116 #: daemon/x52d_main.c:117
#, c-format #, c-format
msgid "Daemon is already running as PID %u" msgid "Daemon is already running as PID %u"
msgstr "Aemonday isay alreadyay unningray asay IDPay %u" msgstr "Aemonday isay alreadyay unningray asay IDPay %u"
#: daemon/x52d_main.c:254 #: daemon/x52d_main.c:255
#, c-format #, c-format
msgid "Unable to parse configuration override '%s'\n" msgid "Unable to parse configuration override '%s'\n"
msgstr "Unableay otay arsepay onfigurationcay overrideay '%s'\n" msgstr "Unableay otay arsepay onfigurationcay overrideay '%s'\n"
#: daemon/x52d_main.c:278 #: daemon/x52d_main.c:279
#, c-format #, c-format
msgid "Foreground = %s" msgid "Foreground = %s"
msgstr "Oregroundfay = %s" msgstr "Oregroundfay = %s"
#: daemon/x52d_main.c:278 daemon/x52d_main.c:279 #: daemon/x52d_main.c:279 daemon/x52d_main.c:280
msgid "true" msgid "true"
msgstr "uetray" msgstr "uetray"
#: daemon/x52d_main.c:278 daemon/x52d_main.c:279 #: daemon/x52d_main.c:279 daemon/x52d_main.c:280
msgid "false" msgid "false"
msgstr "alsefay" msgstr "alsefay"
#: daemon/x52d_main.c:279 #: daemon/x52d_main.c:280
#, c-format #, c-format
msgid "Quiet = %s" msgid "Quiet = %s"
msgstr "Uietqay = %s" msgstr "Uietqay = %s"
#: daemon/x52d_main.c:280 #: daemon/x52d_main.c:281
#, c-format #, c-format
msgid "Verbosity = %d" msgid "Verbosity = %d"
msgstr "Erbosityvay = %d" msgstr "Erbosityvay = %d"
#: daemon/x52d_main.c:281 #: daemon/x52d_main.c:282
#, c-format #, c-format
msgid "Log file = %s" msgid "Log file = %s"
msgstr "Oglay ilefay = %s" msgstr "Oglay ilefay = %s"
#: daemon/x52d_main.c:282 #: daemon/x52d_main.c:283
#, c-format #, c-format
msgid "Config file = %s" msgid "Config file = %s"
msgstr "Onfigcay ilefay = %s" msgstr "Onfigcay ilefay = %s"
#: daemon/x52d_main.c:312 #: daemon/x52d_main.c:314
msgid "Reloading X52 configuration" msgid "Reloading X52 configuration"
msgstr "Eloadingray X52 onfigurationcay" msgstr "Eloadingray X52 onfigurationcay"
#: daemon/x52d_main.c:319 #: daemon/x52d_main.c:321
msgid "Saving X52 configuration to disk" msgid "Saving X52 configuration to disk"
msgstr "Avingsay X52 onfigurationcay otay iskday" msgstr "Avingsay X52 onfigurationcay otay iskday"
#: daemon/x52d_main.c:325 #: daemon/x52d_main.c:327
#, c-format #, c-format
msgid "Received termination signal %s" msgid "Received termination signal %s"
msgstr "Eceivedray erminationtay ignalsay %s" msgstr "Eceivedray erminationtay ignalsay %s"
#: daemon/x52d_main.c:338 #: daemon/x52d_main.c:341
msgid "Shutting down X52 daemon" msgid "Shutting down X52 daemon"
msgstr "Uttingshay ownday X52 aemonday" msgstr "Uttingshay ownday X52 aemonday"
@ -764,31 +764,31 @@ msgstr "Erroray %d enwhay updatingay X52 arameterpay: %s"
msgid "Error %d when updating X52 device: %s" msgid "Error %d when updating X52 device: %s"
msgstr "Erroray %d enwhay updatingay X52 eviceday: %s" msgstr "Erroray %d enwhay updatingay X52 eviceday: %s"
#: daemon/x52d_io.c:39 #: daemon/x52d_io.c:41
msgid "Starting X52 I/O thread" msgid "Starting X52 I/O thread"
msgstr "Artingstay X52 I/O eadthray" msgstr "Artingstay X52 I/O eadthray"
#: daemon/x52d_io.c:51 #: daemon/x52d_io.c:53
#, c-format #, c-format
msgid "Error %d opening X52 I/O device: %s" msgid "Error %d opening X52 I/O device: %s"
msgstr "Erroray %d openingay X52 I/O eviceday: %s" msgstr "Erroray %d openingay X52 I/O eviceday: %s"
#: daemon/x52d_io.c:76 #: daemon/x52d_io.c:78
#, c-format #, c-format
msgid "Error %d reading from X52 I/O device: %s" msgid "Error %d reading from X52 I/O device: %s"
msgstr "Erroray %d eadingray omfray X52 I/O eviceday: %s" msgstr "Erroray %d eadingray omfray X52 I/O eviceday: %s"
#: daemon/x52d_io.c:95 #: daemon/x52d_io.c:97
#, c-format #, c-format
msgid "Error %d initializing X52 I/O library: %s" msgid "Error %d initializing X52 I/O library: %s"
msgstr "Erroray %d initializingay X52 ibrarylay: %s" msgstr "Erroray %d initializingay X52 ibrarylay: %s"
#: daemon/x52d_io.c:101 #: daemon/x52d_io.c:103
#, c-format #, c-format
msgid "Error %d initializing I/O driver thread: %s" msgid "Error %d initializing I/O driver thread: %s"
msgstr "Erroray %d initializingay I/O iverdray eadthray: %s" msgstr "Erroray %d initializingay I/O iverdray eadthray: %s"
#: daemon/x52d_io.c:108 #: daemon/x52d_io.c:110
msgid "Shutting down X52 I/O driver thread" msgid "Shutting down X52 I/O driver thread"
msgstr "Uttingshay ownday X52 I/O iverdray eadthray" msgstr "Uttingshay ownday X52 I/O iverdray eadthray"
@ -807,19 +807,47 @@ msgstr "Ettingsay ousemay eedspay otay %d (elayday %d ms)"
msgid "Ignoring mouse speed %d outside supported range (0-%d)" msgid "Ignoring mouse speed %d outside supported range (0-%d)"
msgstr "Ignoringay ousemay eedspay %d outsideay upportedsay angeray (0-%d)" msgstr "Ignoringay ousemay eedspay %d outsideay upportedsay angeray (0-%d)"
#: daemon/x52d_mouse_evdev.c:25 #: daemon/x52d_mouse_evdev.c:43
#, c-format
msgid "Error writing mouse button event (button %d, state %d)"
msgstr "Erroray itingwray ousemay uttonbay eventay (uttonbay %d, atestay %d)"
#: daemon/x52d_mouse_evdev.c:75
#, c-format
msgid "Error writing mouse wheel event %d"
msgstr "Erroray itingwray ousemay eelwhay eventay %d"
#: daemon/x52d_mouse_evdev.c:101
#, c-format
msgid "Error writing mouse axis event (axis %d, value %d)"
msgstr "Erroray itingwray ousemay axisay eventay (axisay %d, aluevay %d)"
#: daemon/x52d_mouse_evdev.c:114
msgid "Starting X52 virtual mouse driver thread" msgid "Starting X52 virtual mouse driver thread"
msgstr "Artingstay X52 irtualvay ousemay iverdray eadthray" msgstr "Artingstay X52 irtualvay ousemay iverdray eadthray"
#: daemon/x52d_mouse_evdev.c:44 #: daemon/x52d_mouse_evdev.c:127
msgid "Error writing mouse sync event"
msgstr "Erroray itingwray ousemay yncsay eventay"
#: daemon/x52d_mouse_evdev.c:146
#, c-format #, c-format
msgid "Error %d initializing mouse thread: %s" msgid "Error %d initializing mouse thread: %s"
msgstr "Erroray %d initializingay ousemay eadthray: %s" msgstr "Erroray %d initializingay ousemay eadthray: %s"
#: daemon/x52d_mouse_evdev.c:51 #: daemon/x52d_mouse_evdev.c:153
msgid "Shutting down X52 virtual mouse driver thread" msgid "Shutting down X52 virtual mouse driver thread"
msgstr "Uttingshay ownday X52 irtualvay ousemay iverdray eadthray" msgstr "Uttingshay ownday X52 irtualvay ousemay iverdray eadthray"
#: daemon/x52d_mouse_evdev.c:160
msgid "Virtual mouse not created. Ignoring thread state change"
msgstr "Irtualvay ousemay otnay eatedcray. Ignoringa eadthray atestay angechay"
#: daemon/x52d_mouse_evdev.c:211
#, c-format
msgid "Error %d creating X52 virtual mouse: %s"
msgstr "Erroray %d eatingcray X52 irtualvay ousemay: %s"
#, fuzzy #, fuzzy
#~ msgid "Starting X52 mouse manager thread" #~ msgid "Starting X52 mouse manager thread"
#~ msgstr "Artingstay X52 ockclay anagermay eadthray" #~ msgstr "Artingstay X52 ockclay anagermay eadthray"