Files
gotta-scroll-fast/driver/mouse_move.h
T
thomas 5f1254d11a
Tests / test_core_function (push) Failing after 12s
import upstream maccel baseline
2026-03-25 09:32:22 +00:00

94 lines
2.2 KiB
C

#include "dbg.h"
#include "linux/input.h"
#include <linux/stddef.h>
#define NONE_EVENT_VALUE 0
typedef struct {
int *x;
int *y;
} mouse_move;
static mouse_move MOVEMENT = {.x = NULL, .y = NULL};
/*
* Track whether we injected synthetic storage for a missing axis.
* When rotation is active and the mouse only reports one axis (e.g. pure
* horizontal movement -> only REL_X), we need a place for f_accelerate
* to write the rotated cross-axis component. These synthetic values
* are later injected into the event stream by maccel_events().
*/
static bool injected_x = false;
static bool injected_y = false;
static int synthetic_x_val = 0;
static int synthetic_y_val = 0;
static inline void update_mouse_move(struct input_value *value) {
switch (value->code) {
case REL_X:
MOVEMENT.x = &value->value;
break;
case REL_Y:
MOVEMENT.y = &value->value;
break;
default:
dbg("bad movement input_value: (code, value) = (%d, %d)", value->code,
value->value);
}
}
static inline int get_x(mouse_move movement) {
if (movement.x == NULL) {
return NONE_EVENT_VALUE;
}
return *movement.x;
}
static inline int get_y(mouse_move movement) {
if (movement.y == NULL) {
return NONE_EVENT_VALUE;
}
return *movement.y;
}
static inline void set_x_move(int value) {
if (MOVEMENT.x == NULL) {
return;
}
*MOVEMENT.x = value;
}
static inline void set_y_move(int value) {
if (MOVEMENT.y == NULL) {
return;
}
*MOVEMENT.y = value;
}
/*
* When rotation is active and one axis is missing from the frame,
* point the missing axis to synthetic storage so f_accelerate can
* write the rotated component into it.
*/
static inline void ensure_axes_for_rotation(void) {
if (MOVEMENT.x == NULL) {
synthetic_x_val = 0;
MOVEMENT.x = &synthetic_x_val;
injected_x = true;
dbg("rotation: injecting synthetic REL_X storage (x=%d)", 0);
}
if (MOVEMENT.y == NULL) {
synthetic_y_val = 0;
MOVEMENT.y = &synthetic_y_val;
injected_y = true;
dbg("rotation: injecting synthetic REL_Y storage (y=%d)", 0);
}
}
static inline void clear_mouse_move(void) {
MOVEMENT.x = NULL;
MOVEMENT.y = NULL;
injected_x = false;
injected_y = false;
}