From 03d58c62e8ce116ba0ce525c4f1f2168dd319dae Mon Sep 17 00:00:00 2001 From: nirenjan Date: Wed, 1 Apr 2026 21:01:48 -0700 Subject: [PATCH] feat: Improve virtual mouse speed calculations Prior to this change, the mouse speed was controlled by an opaque numeric value, that controlled both the speed and the delay between updates. This caused a lot of choppy behavior with lower speeds, and the really low speeds had as little as 1% speed difference between them in the practical pixels/second speed, while there was effectively a 50% jump in the speed between speed settings 11 and 12, due to the hyperbolic relationship between steps. Post that, it was an even 25% increase in sensitivity for every step. This change modifies it so that the old Speed option is deprecated, it is now replaced by the Sensitivity option, which is a direct percentage scale from 10% to 500%. In addition, there is a CurveFactor option to let it have fine control when there is little deflection, and move faster when further away from the center. This also adds an IsometricMode option which computes the speed as a function of the cartesian distance from the center (`sqrt(dx^2 + dy^2)`). The default behavior uses the existing linear speed which controls the speed of the X and Y axes independently, but now uses the sensitivity and curve factors to get better behavior. Also, the mouse events are consistently reported every 10ms. This should make it a lot smoother. Finally, this change also adds a Deadzone factor, which allows the user to ignore small changes near the center of the joystick that can cause mouse drift. This deadzone uses the total distance, so if just the X or Y axis has moved, it will still allow suppressing any play in the thumb stick. Issue: #44 --- ChangeLog.md | 1 + daemon/meson.build | 5 +- daemon/x52d.conf | 36 ++++++++++- daemon/x52d_comm_internal.c | 2 +- daemon/x52d_config.def | 17 +++++- daemon/x52d_config.h | 8 +++ daemon/x52d_mouse.c | 81 ++++++++++++++++++++---- daemon/x52d_mouse.h | 8 +-- daemon/x52d_mouse_handler.c | 119 ++++++++++++++++++++++++++++-------- daemon/x52d_mouse_test.c | 32 +++------- meson.build | 3 + po/libx52.pot | 84 ++++++++++++++++++------- po/xx_PL.po | 118 +++++++++++++++++++++++++---------- 13 files changed, 388 insertions(+), 126 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 88ea806..a8861c2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,7 @@ The format is based upon [Keep a Changelog]. ### Changed - Migrated CI builds to run in multiple distro containers. +- Improved virtual mouse motion to use a smoother approach, as well as allow an isometric speed calculation. This change deprecates the old `Mouse.Speed` configuration option and replaces it with a Sensitivity percentage option. ### Fixed - Addressed meson build bugs found in v0.3.3 diff --git a/daemon/meson.build b/daemon/meson.build index 3f0b00a..ae8ac36 100644 --- a/daemon/meson.build +++ b/daemon/meson.build @@ -32,9 +32,10 @@ x52d_sources = [ ] dep_threads = dependency('threads') + # Comm sources are compiled into x52d (same as Autotools); libx52dcomm is only for x52ctl. x52d_linkwith = [lib_libx52, lib_vkm, lib_libx52io] -x52d_deps = [dep_pinelog, dep_inih, dep_threads, dep_intl] +x52d_deps = [dep_pinelog, dep_inih, dep_threads, dep_math, dep_intl] x52d_cflags = [] exe_x52d = executable('x52d', x52d_sources + libx52dcomm_sources, @@ -59,7 +60,7 @@ test('daemon-communication', files('test_daemon_comm.py')[0], x52d_mouse_test_sources = ['x52d_mouse_test.c', 'x52d_mouse.c'] x52d_mouse_test = executable('x52d-mouse-test', x52d_mouse_test_sources, include_directories: includes, - dependencies: [dep_pinelog, dep_cmocka, dep_intl]) + dependencies: [dep_pinelog, dep_cmocka, dep_intl, dep_math]) test('x52d-mouse-test', x52d_mouse_test, protocol: 'tap') diff --git a/daemon/x52d.conf b/daemon/x52d.conf index b6a11cb..bf6e464 100644 --- a/daemon/x52d.conf +++ b/daemon/x52d.conf @@ -82,12 +82,44 @@ LED=128 # Enabled controls whether the virtual mouse is enabled or not. Enabled=yes -# Speed is proportional to the speed of updates to the virtual mouse +# Sensitivity is the sensitivity percentage of the virtual mouse. This +# replaces the old Speed option, and is a percentage value by which to +# scale the input. The sensitivity can vary from 10% to 500%. +Sensitivity=100 + +# DEPRECATED: Speed is proportional to the speed of updates to the virtual mouse +# This used a calculation with delays and multiplication factors to simulate +# the mouse moves, but it felt choppy at lower speeds. Speed=0 # ReverseScroll reverses the direction of the virtual scroll wheel ReverseScroll=no +# Isometric mode controls if the mouse movement is computed based on +# both X and Y movements. If enabled, the behavior is similar to the +# mouse nubs found on some laptops. Otherwise, the X and Y movements +# are independent of each other. +IsometricMode=no + +# Curve factor controls the speed curve in an exponential manner, so +# that the user can get finer control at the lower end of motion, while +# increasing speeds at the upper end. Values range from 1-5, with the +# following descriptions. Values are clamped in this range. +# 1: Linear motion - no curve +# 2: Soft curve: slight dampening in the lower ranges +# 3: Standard: Feels like a Thinkpad +# 4: Precision: heavy dampening in lower ranges, high speed elsewhere +# 5: Aggressive: "sniper" mode in the lower rnages, "flick" elsewhere +CurveFactor=3 + +# Deadzone is a configurable value from 0-11, with 0 being no deadzone +# and the deadzone size increasing with increasing values. This is useful +# when there is a loose thumbstick and you want to restrict the motion +# when there's no user input. A deadzone of 0 is perfectly fine for a +# new joystick, but keep in mind that the higher values will require +# you to push more to get any motion out of the virtual mouse. +Deadzone=0 + ###################################################################### # Profiles - only valid on Linux ###################################################################### @@ -109,6 +141,6 @@ ClutchLatched=no ################## #X52 Input Servic# -#Version 0.2.2 # +#Version 0.3.3 # #OS: Linux # ################## diff --git a/daemon/x52d_comm_internal.c b/daemon/x52d_comm_internal.c index 3d67c33..6c06de4 100644 --- a/daemon/x52d_comm_internal.c +++ b/daemon/x52d_comm_internal.c @@ -54,7 +54,7 @@ static int _setup_sockaddr(struct sockaddr_un *remote, const char *sock_path) remote->sun_family = AF_UNIX; /* We've already verified that sock_path will fit, so we don't need strncpy */ strcpy(remote->sun_path, sock_path); - len += sizeof(remote->sun_family); + len += sizeof(*remote) - sizeof(remote->sun_path); return len; } diff --git a/daemon/x52d_config.def b/daemon/x52d_config.def index 3ba713b..7517e2a 100644 --- a/daemon/x52d_config.def +++ b/daemon/x52d_config.def @@ -71,13 +71,26 @@ CFG(Brightness, LED, brightness[1], int, 128) // Enabled controls whether the virtual mouse is enabled or not. CFG(Mouse, Enabled, mouse_enabled, bool, true) -// Speed is a value that is proportional to the speed of updates to the -// virtual mouse +// DEPRECATED: Speed is a value that is proportional to the speed of updates to +// the virtual mouse CFG(Mouse, Speed, mouse_speed, int, 0) +// Sensitivity is a percentage that is used to scale the speed of the virtual +// mouse. This replaces the old speed value. +CFG(Mouse, Sensitivity, mouse_sensitivity, int, 0) + // ReverseScroll controls the scrolling direction CFG(Mouse, ReverseScroll, mouse_reverse_scroll, bool, false) +// IsometricMode controls whether to use linear or isometric speed calculations +CFG(Mouse, IsometricMode, mouse_isometric_mode, bool, false) + +// CurveFactor controls the speed curve +CFG(Mouse, CurveFactor, mouse_curve_factor, int, 3) + +// Deadzone controls the deadzone range for the thumbstick +CFG(Mouse, Deadzone, mouse_deadzone_factor, int, 0) + /********************************************************************** * Profiles - only valid on Linux *********************************************************************/ diff --git a/daemon/x52d_config.h b/daemon/x52d_config.h index 4ba7f3d..930f16c 100644 --- a/daemon/x52d_config.h +++ b/daemon/x52d_config.h @@ -39,7 +39,11 @@ struct x52d_config { bool mouse_enabled; int mouse_speed; + int mouse_sensitivity; bool mouse_reverse_scroll; + bool mouse_isometric_mode; + int mouse_curve_factor; + int mouse_deadzone_factor; bool clutch_enabled; bool clutch_latched; @@ -72,7 +76,11 @@ void x52d_cfg_set_Brightness_MFD(uint16_t param); void x52d_cfg_set_Brightness_LED(uint16_t param); void x52d_cfg_set_Mouse_Enabled(bool param); void x52d_cfg_set_Mouse_Speed(int param); +void x52d_cfg_set_Mouse_Sensitivity(int param); void x52d_cfg_set_Mouse_ReverseScroll(bool param); +void x52d_cfg_set_Mouse_IsometricMode(bool param); +void x52d_cfg_set_Mouse_CurveFactor(int param); +void x52d_cfg_set_Mouse_Deadzone(int param); void x52d_cfg_set_Profiles_Directory(char* param); void x52d_cfg_set_Profiles_ClutchEnabled(bool param); void x52d_cfg_set_Profiles_ClutchLatched(bool param); diff --git a/daemon/x52d_mouse.c b/daemon/x52d_mouse.c index 4ad0c52..3dd0628 100644 --- a/daemon/x52d_mouse.c +++ b/daemon/x52d_mouse.c @@ -9,6 +9,7 @@ #include "config.h" #include #include +#include #define PINELOG_MODULE X52D_MOD_MOUSE #include "pinelog.h" @@ -20,11 +21,33 @@ #define DEFAULT_MOUSE_DELAY 70000 #define MOUSE_DELAY_DELTA 5000 #define MOUSE_DELAY_MIN 10000 +#define MOUSE_MULT_FACTOR 4 #define MAX_MOUSE_MULT 5 +#define MIN_SENSITIVITY 10 +#define MAX_SENSITIVITY 500 -volatile int mouse_delay = DEFAULT_MOUSE_DELAY; -volatile int mouse_mult = MOUSE_MULT_FACTOR; volatile int mouse_scroll_dir = 1; +volatile bool mouse_isometric_mode = false; +volatile int mouse_curve_factor = 3; +volatile int mouse_deadzone_factor = 0; +volatile int mouse_sensitivity = 0; + +static int clamp_int(const char *description, int value, int min, int max) +{ + if (value < min) { + PINELOG_DEBUG(_("Clamping %s value %d to range [%d..%d]"), + description, value, min, max); + return min; + } + + if (value > max) { + PINELOG_DEBUG(_("Clamping %s value %d to range [%d..%d]"), + description, value, min, max); + return max; + } + + return value; +} void x52d_cfg_set_Mouse_Enabled(bool enabled) { @@ -35,17 +58,21 @@ void x52d_cfg_set_Mouse_Enabled(bool enabled) void x52d_cfg_set_Mouse_Speed(int speed) { + // DEPRECATED, calculate the sensitivity instead int new_delay; int new_mult; int max_base_speed = (DEFAULT_MOUSE_DELAY - MOUSE_DELAY_MIN) / MOUSE_DELAY_DELTA; int max_speed = max_base_speed + MAX_MOUSE_MULT * MOUSE_MULT_FACTOR; - if (speed < 0 || speed > max_speed) { - PINELOG_INFO(_("Ignoring mouse speed %d outside supported range (0-%d)"), - speed, max_speed); - return; - } else if (speed <= max_base_speed) { + double sensitivity; + + if (mouse_sensitivity == 0) { + PINELOG_WARN(_("Config option 'mouse.speed' is DEPRECATED. Please use 'mouse.sensitivity' instead")); + } + + speed = clamp_int("mouse speed", speed, 0, max_speed); + if (speed <= max_base_speed) { new_delay = DEFAULT_MOUSE_DELAY - speed * MOUSE_DELAY_DELTA; new_mult = MOUSE_MULT_FACTOR; } else { @@ -54,10 +81,12 @@ void x52d_cfg_set_Mouse_Speed(int speed) new_mult = MOUSE_MULT_FACTOR + (speed - max_base_speed); } - PINELOG_DEBUG(_("Setting mouse speed to %d (delay %d ms, multiplier %f)"), - speed, new_delay / 1000, new_mult / (double)MOUSE_MULT_FACTOR); - mouse_delay = new_delay; - mouse_mult = new_mult; + sensitivity = round(1e6 / new_delay * new_mult / (double)MOUSE_MULT_FACTOR); + + PINELOG_INFO(_("Migrating legacy mouse speed '%d' to sensitivity '%d' (percentage)"), + speed, (int)sensitivity); + mouse_sensitivity = clamp_int(_("speed -> sensitivity"), (int)sensitivity, + MIN_SENSITIVITY, MAX_SENSITIVITY); } void x52d_cfg_set_Mouse_ReverseScroll(bool enabled) @@ -71,3 +100,33 @@ void x52d_cfg_set_Mouse_ReverseScroll(bool enabled) mouse_scroll_dir = 1; } } + +void x52d_cfg_set_Mouse_IsometricMode(bool enabled) +{ + PINELOG_DEBUG(_("Setting mouse isometric mode to %s"), + enabled ? _("on") : _("off")); + mouse_isometric_mode = enabled; +} + +void x52d_cfg_set_Mouse_Sensitivity(int factor) +{ + mouse_sensitivity = clamp_int(_("sensitivity"), factor, + MIN_SENSITIVITY, MAX_SENSITIVITY); + + PINELOG_DEBUG(_("Setting mouse sensitivity to %d%%"), mouse_sensitivity); +} + +void x52d_cfg_set_Mouse_CurveFactor(int factor) +{ + // Factor ranges from 1-5, clamp it in this range + // Shift by 1 so it uses the correct index + mouse_curve_factor = clamp_int(_("curve factor"), factor, 1, 5) - 1; + PINELOG_DEBUG(_("Setting mouse curve factor to %d"), mouse_curve_factor); +} + +void x52d_cfg_set_Mouse_Deadzone(int factor) +{ + // Factor ranges from 0-12, clamp it in this range + mouse_deadzone_factor = clamp_int(_("deadzone factor"), factor, 0, 11); + PINELOG_DEBUG(_("Setting mouse deadzone to %d"), mouse_deadzone_factor); +} diff --git a/daemon/x52d_mouse.h b/daemon/x52d_mouse.h index d201a12..d0f733c 100644 --- a/daemon/x52d_mouse.h +++ b/daemon/x52d_mouse.h @@ -12,11 +12,11 @@ #include #include "libx52io.h" -extern volatile int mouse_delay; -extern volatile int mouse_mult; +extern volatile bool mouse_isometric_mode; extern volatile int mouse_scroll_dir; - -#define MOUSE_MULT_FACTOR 4 +extern volatile int mouse_curve_factor; +extern volatile int mouse_deadzone_factor; +extern volatile int mouse_sensitivity; void x52d_mouse_thread_control(bool enabled); void x52d_mouse_handler_init(void); diff --git a/daemon/x52d_mouse_handler.c b/daemon/x52d_mouse_handler.c index 96d01eb..b91c6ce 100644 --- a/daemon/x52d_mouse_handler.c +++ b/daemon/x52d_mouse_handler.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "libx52io.h" #include "vkm.h" @@ -85,40 +86,104 @@ static int report_wheel(void) return (rc == VKM_SUCCESS); } -static int get_axis_val(int index) +static inline int fsgn(double f) { - 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; - - /* - * Factor in the multiplicative factor for the axis. This deliberately - * uses integer division, since the uinput event only accepts integers. - * For the speed purposes, this should be good enough. - */ - axis_val = (axis_val * mouse_mult) / MOUSE_MULT_FACTOR; - - return axis_val; + return (f >= 0 ? 1 : -1); } +static const double MOUSE_CURVE_FACTORS[5] = { + 1.0, 1.2, 1.5, 1.8, 2.0 +}; + +static const double MOUSE_DEADZONES[12] = { + 0.0, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5 +}; + static int report_axis(void) { - vkm_result rc; - int dx = get_axis_val(LIBX52IO_AXIS_THUMBX); - int dy = get_axis_val(LIBX52IO_AXIS_THUMBY); + #define MAX_TICK_SPEED 250.0 - rc = vkm_mouse_move(mouse_context, dx, dy); + static double accum_x = 0.0; + static double accum_y = 0.0; + + /* Center raw HID values (0,15) => (-8, 7) */ + int dx = new_report.axis[LIBX52IO_AXIS_THUMBX] - 8; + int dy = new_report.axis[LIBX52IO_AXIS_THUMBY] - 8; + + /* Calculate radial magnitude */ + double mag = sqrt((double)(dx * dx + dy * dy)); + double cfg_deadzone = MOUSE_DEADZONES[mouse_deadzone_factor]; + + /* Radial deadzone check */ + if (mag <= cfg_deadzone) { + accum_x = 0.0; + accum_y = 0.0; + return 0; + } + + /* Calculate gain */ + double gain = (double)mouse_sensitivity / 100.0; + double exponent = MOUSE_CURVE_FACTORS[mouse_curve_factor]; + + /* Normalize magnitude */ + double adj_mag = mag - cfg_deadzone; + double out_x = 0.0; + double out_y = 0.0; + + if (mouse_isometric_mode) { + /* Isometric mode: speed is a function of total distance */ + double speed = gain * pow(adj_mag, exponent); + + /* Clamp total speed before breaking into components */ + if (speed > MAX_TICK_SPEED) { + speed = MAX_TICK_SPEED; + } + + /* Unit vector * speed */ + out_x = (dx / mag) * speed; + out_y = (dy / mag) * speed; + } else { + /* Linear mode: speed is independently calculated for X & Y axes */ + double ratio = adj_mag / mag; + double cur_x = dx * ratio; + double cur_y = dy * ratio; + + out_x = fsgn(cur_x) * gain * pow(fabs(cur_x), exponent); + out_y = fsgn(cur_y) * gain * pow(fabs(cur_y), exponent); + + /* Clamp individual axis speeds */ + if (fabs(out_x) > MAX_TICK_SPEED) { + out_x = fsgn(out_x) * MAX_TICK_SPEED; + } + + if (fabs(out_y) > MAX_TICK_SPEED) { + out_y = fsgn(out_y) * MAX_TICK_SPEED; + } + } + + /* Accumulate movement and independent resets */ + accum_x += out_x; + accum_y += out_y; + + if (dx == 0) { + accum_x = 0.0; + } + if (dy == 0) { + accum_y = 0.0; + } + + /* Extract integer values for VKM injection */ + int move_x = (int)accum_x; + int move_y = (int)accum_y; + + accum_x -= move_x; + accum_y -= move_y; + + vkm_result rc; + rc = vkm_mouse_move(mouse_context, move_x, move_y); if (rc != VKM_SUCCESS && rc != VKM_ERROR_NO_CHANGE) { PINELOG_ERROR(_("Error %d writing mouse axis event (dx %d, dy %d)"), - rc, dx, dy); + rc, move_x, move_y); } return (rc == VKM_SUCCESS); @@ -154,7 +219,7 @@ static void * x52_mouse_thr(void *param) report_sync(); } - usleep(mouse_delay); + usleep(10000); } return NULL; diff --git a/daemon/x52d_mouse_test.c b/daemon/x52d_mouse_test.c index 2b7fe84..71c031c 100644 --- a/daemon/x52d_mouse_test.c +++ b/daemon/x52d_mouse_test.c @@ -44,75 +44,61 @@ static void test_mouse_thread_disabled(void **state) x52d_cfg_set_Mouse_Enabled(false); } +/* The following tests are dependent on the values in x52d_mouse.c */ static void test_mouse_speed_negative(void **state) { (void)state; - int orig_mouse_delay = mouse_delay; - int orig_mouse_mult = mouse_mult; - x52d_cfg_set_Mouse_Speed(-1); - assert_int_equal(mouse_delay, orig_mouse_delay); - assert_int_equal(mouse_mult, orig_mouse_mult); + assert_int_equal(mouse_sensitivity, 14); } -/* The following tests are dependent on the values in x52d_mouse.c */ static void test_mouse_speed_0(void **state) { (void)state; x52d_cfg_set_Mouse_Speed(0); - assert_int_equal(mouse_delay, 70000); - assert_int_equal(mouse_mult, 4); + assert_int_equal(mouse_sensitivity, 14); } static void test_mouse_speed_mid_base(void **state) { (void)state; x52d_cfg_set_Mouse_Speed(6); - assert_int_equal(mouse_delay, 40000); - assert_int_equal(mouse_mult, 4); + assert_int_equal(mouse_sensitivity, 25); } static void test_mouse_speed_max_base(void **state) { (void)state; x52d_cfg_set_Mouse_Speed(12); - assert_int_equal(mouse_delay, 10000); - assert_int_equal(mouse_mult, 4); + assert_int_equal(mouse_sensitivity, 100); } static void test_mouse_speed_min_hyper(void **state) { (void)state; x52d_cfg_set_Mouse_Speed(13); - assert_int_equal(mouse_delay, 10000); - assert_int_equal(mouse_mult, 5); + assert_int_equal(mouse_sensitivity, 125); } static void test_mouse_speed_mid_hyper(void **state) { (void)state; x52d_cfg_set_Mouse_Speed(22); - assert_int_equal(mouse_delay, 10000); - assert_int_equal(mouse_mult, 14); + assert_int_equal(mouse_sensitivity, 350); } static void test_mouse_speed_max_hyper(void **state) { (void)state; x52d_cfg_set_Mouse_Speed(32); - assert_int_equal(mouse_delay, 10000); - assert_int_equal(mouse_mult, 24); + assert_int_equal(mouse_sensitivity, 500); } static void test_mouse_speed_above_max(void **state) { - int orig_mouse_delay = mouse_delay; - int orig_mouse_mult = mouse_mult; (void)state; - x52d_cfg_set_Mouse_Speed(33); - assert_int_equal(mouse_delay, orig_mouse_delay); - assert_int_equal(mouse_mult, orig_mouse_mult); + assert_int_equal(mouse_sensitivity, 500); } static void test_mouse_reverse_scroll_enabled(void **state) diff --git a/meson.build b/meson.build index 4c83d49..7124f00 100644 --- a/meson.build +++ b/meson.build @@ -93,6 +93,9 @@ endif add_project_arguments('-isystem', meson.current_source_dir() / 'sys', language: 'C') +# Sometimes libm is in standard library +dep_math = compiler.find_library('m', required: false) + ####################################################################### # Internal dependencies ####################################################################### diff --git a/po/libx52.pot b/po/libx52.pot index d326f6b..9cae6ce 100644 --- a/po/libx52.pot +++ b/po/libx52.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: libx52 0.3.3\n" "Report-Msgid-Bugs-To: https://github.com/nirenjan/libx52/issues\n" -"POT-Creation-Date: 2026-03-27 20:52-0700\n" +"POT-Creation-Date: 2026-04-01 20:47-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -142,13 +142,13 @@ msgstr "" msgid "Unknown LED state %d" msgstr "" -#: libx52/x52_stringify.c:47 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:32 -#: daemon/x52d_mouse.c:66 +#: libx52/x52_stringify.c:47 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:55 +#: daemon/x52d_mouse.c:95 daemon/x52d_mouse.c:107 msgid "off" msgstr "" -#: libx52/x52_stringify.c:48 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:32 -#: daemon/x52d_mouse.c:66 +#: libx52/x52_stringify.c:48 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:55 +#: daemon/x52d_mouse.c:95 daemon/x52d_mouse.c:107 msgid "on" msgstr "" @@ -864,63 +864,105 @@ msgstr "" msgid "Shutting down X52 I/O driver thread" msgstr "" -#: daemon/x52d_mouse.c:31 +#: daemon/x52d_mouse.c:38 daemon/x52d_mouse.c:44 +#, c-format +msgid "Clamping %s value %d to range [%d..%d]" +msgstr "" + +#: daemon/x52d_mouse.c:54 #, c-format msgid "Setting mouse enable to %s" msgstr "" -#: daemon/x52d_mouse.c:45 -#, c-format -msgid "Ignoring mouse speed %d outside supported range (0-%d)" +#: daemon/x52d_mouse.c:71 +msgid "" +"Config option 'mouse.speed' is DEPRECATED. Please use 'mouse.sensitivity' " +"instead" msgstr "" -#: daemon/x52d_mouse.c:57 +#: daemon/x52d_mouse.c:86 #, c-format -msgid "Setting mouse speed to %d (delay %d ms, multiplier %f)" +msgid "Migrating legacy mouse speed '%d' to sensitivity '%d' (percentage)" msgstr "" -#: daemon/x52d_mouse.c:65 +#: daemon/x52d_mouse.c:88 +msgid "speed -> sensitivity" +msgstr "" + +#: daemon/x52d_mouse.c:94 #, c-format msgid "Setting mouse reverse scroll to %s" msgstr "" -#: daemon/x52d_mouse_handler.c:43 +#: daemon/x52d_mouse.c:106 +#, c-format +msgid "Setting mouse isometric mode to %s" +msgstr "" + +#: daemon/x52d_mouse.c:113 +msgid "sensitivity" +msgstr "" + +#: daemon/x52d_mouse.c:116 +#, c-format +msgid "Setting mouse sensitivity to %d%%" +msgstr "" + +#: daemon/x52d_mouse.c:123 +msgid "curve factor" +msgstr "" + +#: daemon/x52d_mouse.c:124 +#, c-format +msgid "Setting mouse curve factor to %d" +msgstr "" + +#: daemon/x52d_mouse.c:130 +msgid "deadzone factor" +msgstr "" + +#: daemon/x52d_mouse.c:131 +#, c-format +msgid "Setting mouse deadzone to %d" +msgstr "" + +#: daemon/x52d_mouse_handler.c:44 #, c-format msgid "Error %d writing mouse button event (button %d, state %d)" msgstr "" -#: daemon/x52d_mouse_handler.c:81 +#: daemon/x52d_mouse_handler.c:82 #, c-format msgid "Error writing mouse wheel event %d" msgstr "" -#: daemon/x52d_mouse_handler.c:120 +#: daemon/x52d_mouse_handler.c:185 #, c-format msgid "Error %d writing mouse axis event (dx %d, dy %d)" msgstr "" -#: daemon/x52d_mouse_handler.c:132 +#: daemon/x52d_mouse_handler.c:197 msgid "Error writing mouse sync event" msgstr "" -#: daemon/x52d_mouse_handler.c:151 +#: daemon/x52d_mouse_handler.c:216 msgid "Starting X52 virtual mouse driver thread" msgstr "" -#: daemon/x52d_mouse_handler.c:170 +#: daemon/x52d_mouse_handler.c:235 #, c-format msgid "Error %d initializing mouse thread: %s" msgstr "" -#: daemon/x52d_mouse_handler.c:177 +#: daemon/x52d_mouse_handler.c:242 msgid "Shutting down X52 virtual mouse driver thread" msgstr "" -#: daemon/x52d_mouse_handler.c:184 +#: daemon/x52d_mouse_handler.c:249 msgid "Virtual mouse not created. Ignoring thread state change" msgstr "" -#: daemon/x52d_mouse_handler.c:236 daemon/x52d_mouse_handler.c:244 +#: daemon/x52d_mouse_handler.c:301 daemon/x52d_mouse_handler.c:309 #, c-format msgid "Error %d creating X52 virtual mouse" msgstr "" diff --git a/po/xx_PL.po b/po/xx_PL.po index b21cf17..eae89f6 100644 --- a/po/xx_PL.po +++ b/po/xx_PL.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: libx52 0.2.3\n" "Report-Msgid-Bugs-To: https://github.com/nirenjan/libx52/issues\n" -"POT-Creation-Date: 2026-03-27 20:52-0700\n" -"PO-Revision-Date: 2026-03-27 08:33-0700\n" +"POT-Creation-Date: 2026-04-01 20:47-0700\n" +"PO-Revision-Date: 2026-04-01 20:50-0700\n" "Last-Translator: Nirenjan Krishnan \n" "Language-Team: Dummy Language for testing i18n\n" "Language: xx_PL\n" @@ -142,13 +142,13 @@ msgstr "YYay-MMay-DDay" msgid "Unknown LED state %d" msgstr "Unknownay EDLay atestay %d" -#: libx52/x52_stringify.c:47 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:32 -#: daemon/x52d_mouse.c:66 +#: libx52/x52_stringify.c:47 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:55 +#: daemon/x52d_mouse.c:95 daemon/x52d_mouse.c:107 msgid "off" msgstr "offay" -#: libx52/x52_stringify.c:48 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:32 -#: daemon/x52d_mouse.c:66 +#: libx52/x52_stringify.c:48 daemon/x52d_clock.c:29 daemon/x52d_mouse.c:55 +#: daemon/x52d_mouse.c:95 daemon/x52d_mouse.c:107 msgid "on" msgstr "onay" @@ -234,34 +234,32 @@ msgid "Read timeout" msgstr "Eadray imeouttay" #: vkm/vkm_common.c:26 -#, fuzzy msgid "Unknown error" -msgstr "Unknownay erroray %d" +msgstr "Unknownay erroray" #: vkm/vkm_common.c:27 msgid "Not ready" -msgstr "" +msgstr "Otnay eadyray" #: vkm/vkm_common.c:28 msgid "Out of memory" -msgstr "" +msgstr "Outay ofay emorymay" #: vkm/vkm_common.c:30 -#, fuzzy msgid "Not supported" -msgstr "Operationay otnay upportedsay" +msgstr "Otnay upportedsay" #: vkm/vkm_common.c:31 msgid "Virtual device failure" -msgstr "" +msgstr "Irtualvay eviceday ailurefay" #: vkm/vkm_common.c:32 msgid "Unable to write event" -msgstr "" +msgstr "Unableay otay itewray eventay" #: vkm/vkm_common.c:33 msgid "No state change" -msgstr "" +msgstr "Onay atestay angechay" #: evtest/ev_test.c:110 #, c-format @@ -919,64 +917,110 @@ msgstr "Erroray %d initializingay I/O iverdray eadthray: %s" msgid "Shutting down X52 I/O driver thread" msgstr "Uttingshay ownday X52 I/O iverdray eadthray" -#: daemon/x52d_mouse.c:31 +#: daemon/x52d_mouse.c:38 daemon/x52d_mouse.c:44 +#, c-format +msgid "Clamping %s value %d to range [%d..%d]" +msgstr "Ampingclay %s aluevay %d otay angeray [%d..%d]" + +#: daemon/x52d_mouse.c:54 #, c-format msgid "Setting mouse enable to %s" msgstr "Ettingsay ousemay enableay otay %s" -#: daemon/x52d_mouse.c:45 -#, c-format -msgid "Ignoring mouse speed %d outside supported range (0-%d)" -msgstr "Ignoringay ousemay eedspay %d outsideay upportedsay angeray (0-%d)" +#: daemon/x52d_mouse.c:71 +msgid "" +"Config option 'mouse.speed' is DEPRECATED. Please use 'mouse.sensitivity' " +"instead" +msgstr "" +"Onfigcay optionay 'mouse.speed' isay EPRECATEDDAY. Easeplay useay 'mouse." +"sensitivity' insteaday" -#: daemon/x52d_mouse.c:57 +#: daemon/x52d_mouse.c:86 #, c-format -msgid "Setting mouse speed to %d (delay %d ms, multiplier %f)" -msgstr "Ettingsay ousemay eedspay otay %d (elayday %d ms, ultipliermay %f)" +msgid "Migrating legacy mouse speed '%d' to sensitivity '%d' (percentage)" +msgstr "" +"Igratingmay egacylay ousemay eedspay '%d' otay ensitivitysay " +"'%d' (ercentagepay)" -#: daemon/x52d_mouse.c:65 +#: daemon/x52d_mouse.c:88 +msgid "speed -> sensitivity" +msgstr "eedspay -> ensitivitysay" + +#: daemon/x52d_mouse.c:94 #, c-format msgid "Setting mouse reverse scroll to %s" msgstr "Ettingsay ousemay everseray ollscray otay %s" -#: daemon/x52d_mouse_handler.c:43 +#: daemon/x52d_mouse.c:106 +#, c-format +msgid "Setting mouse isometric mode to %s" +msgstr "Ettingsay ousemay isometricay odemay otay %s" + +#: daemon/x52d_mouse.c:113 +msgid "sensitivity" +msgstr "ensitivitysay" + +#: daemon/x52d_mouse.c:116 +#, c-format +msgid "Setting mouse sensitivity to %d%%" +msgstr "Ettingsay ousemay ensitivitysay otay %d" + +#: daemon/x52d_mouse.c:123 +msgid "curve factor" +msgstr "urvecay actorfay" + +#: daemon/x52d_mouse.c:124 +#, c-format +msgid "Setting mouse curve factor to %d" +msgstr "Ettingsay ousemay urvecay actorfay otay %d" + +#: daemon/x52d_mouse.c:130 +msgid "deadzone factor" +msgstr "eadzoneday actorfay" + +#: daemon/x52d_mouse.c:131 +#, c-format +msgid "Setting mouse deadzone to %d" +msgstr "Ettingsay ousemay eadzoneday otay %d" + +#: daemon/x52d_mouse_handler.c:44 #, c-format msgid "Error %d writing mouse button event (button %d, state %d)" msgstr "" "Erroray %d itingwray ousemay uttonbay eventay (uttonbay %d, atestay %d)" -#: daemon/x52d_mouse_handler.c:81 +#: daemon/x52d_mouse_handler.c:82 #, c-format msgid "Error writing mouse wheel event %d" msgstr "Erroray itingwray ousemay eelwhay eventay %d" -#: daemon/x52d_mouse_handler.c:120 +#: daemon/x52d_mouse_handler.c:185 #, c-format msgid "Error %d writing mouse axis event (dx %d, dy %d)" msgstr "Erroray %d itingwray ousemay axisay eventay (xday %d, yday %d)" -#: daemon/x52d_mouse_handler.c:132 +#: daemon/x52d_mouse_handler.c:197 msgid "Error writing mouse sync event" msgstr "Erroray itingwray ousemay yncsay eventay" -#: daemon/x52d_mouse_handler.c:151 +#: daemon/x52d_mouse_handler.c:216 msgid "Starting X52 virtual mouse driver thread" msgstr "Artingstay X52 irtualvay ousemay iverdray eadthray" -#: daemon/x52d_mouse_handler.c:170 +#: daemon/x52d_mouse_handler.c:235 #, c-format msgid "Error %d initializing mouse thread: %s" msgstr "Erroray %d initializingay ousemay eadthray: %s" -#: daemon/x52d_mouse_handler.c:177 +#: daemon/x52d_mouse_handler.c:242 msgid "Shutting down X52 virtual mouse driver thread" msgstr "Uttingshay ownday X52 irtualvay ousemay iverdray eadthray" -#: daemon/x52d_mouse_handler.c:184 +#: daemon/x52d_mouse_handler.c:249 msgid "Virtual mouse not created. Ignoring thread state change" msgstr "Irtualvay ousemay otnay eatedcray. Ignoringa eadthray atestay angechay" -#: daemon/x52d_mouse_handler.c:236 daemon/x52d_mouse_handler.c:244 +#: daemon/x52d_mouse_handler.c:301 daemon/x52d_mouse_handler.c:309 #, c-format msgid "Error %d creating X52 virtual mouse" msgstr "Erroray %d eatingcray X52 irtualvay ousemay" @@ -1039,3 +1083,11 @@ msgstr "Argumentay engthlay ootay onglay\n" #, c-format msgid "Running in interactive mode, ignoring extra arguments\n" msgstr "Unningray inay interactiveay odemay, ignoringay extraay argumentsay\n" + +#, c-format +#~ msgid "Ignoring mouse speed %d outside supported range (0-%d)" +#~ msgstr "Ignoringay ousemay eedspay %d outsideay upportedsay angeray (0-%d)" + +#, c-format +#~ msgid "Setting mouse speed to %d (delay %d ms, multiplier %f)" +#~ msgstr "Ettingsay ousemay eedspay otay %d (elayday %d ms, ultipliermay %f)"