ui: multi touch keyboard support (#35912)

* start

* better

* 2

* dumb
This commit is contained in:
Maxime Desroches
2025-08-03 18:14:48 -07:00
committed by GitHub
parent 623de0e22a
commit 976dfa3982
6 changed files with 44 additions and 30 deletions
+18 -14
View File
@@ -19,6 +19,7 @@ FPS_LOG_INTERVAL = 5 # Seconds between logging FPS drops
FPS_DROP_THRESHOLD = 0.9 # FPS drop threshold for triggering a warning
FPS_CRITICAL_THRESHOLD = 0.5 # Critical threshold for triggering strict actions
MOUSE_THREAD_RATE = 140 # touch controller runs at 140Hz
MAX_TOUCH_SLOT = 2
ENABLE_VSYNC = os.getenv("ENABLE_VSYNC", "0") == "1"
SHOW_FPS = os.getenv("SHOW_FPS") == "1"
@@ -58,6 +59,7 @@ class MousePos(NamedTuple):
class MouseEvent(NamedTuple):
pos: MousePos
slot: int
left_pressed: bool
left_released: bool
left_down: bool
@@ -67,7 +69,7 @@ class MouseEvent(NamedTuple):
class MouseState:
def __init__(self):
self._events: deque[MouseEvent] = deque(maxlen=MOUSE_THREAD_RATE) # bound event list
self._prev_mouse_event: MouseEvent | None = None
self._prev_mouse_event: list[MouseEvent | None] = [None] * MAX_TOUCH_SLOT
self._rk = Ratekeeper(MOUSE_THREAD_RATE)
self._lock = threading.Lock()
@@ -98,19 +100,21 @@ class MouseState:
self._rk.keep_time()
def _handle_mouse_event(self):
mouse_pos = rl.get_mouse_position()
ev = MouseEvent(
MousePos(mouse_pos.x, mouse_pos.y),
rl.is_mouse_button_pressed(rl.MouseButton.MOUSE_BUTTON_LEFT),
rl.is_mouse_button_released(rl.MouseButton.MOUSE_BUTTON_LEFT),
rl.is_mouse_button_down(rl.MouseButton.MOUSE_BUTTON_LEFT),
time.monotonic(),
)
# Only add changes
if self._prev_mouse_event is None or ev[:-1] != self._prev_mouse_event[:-1]:
with self._lock:
self._events.append(ev)
self._prev_mouse_event = ev
for slot in range(MAX_TOUCH_SLOT):
mouse_pos = rl.get_touch_position(slot)
ev = MouseEvent(
MousePos(mouse_pos.x, mouse_pos.y),
slot,
rl.is_mouse_button_pressed(slot),
rl.is_mouse_button_released(slot),
rl.is_mouse_button_down(slot),
time.monotonic(),
)
# Only add changes
if self._prev_mouse_event[slot] is None or ev[:-1] != self._prev_mouse_event[slot][:-1]:
with self._lock:
self._events.append(ev)
self._prev_mouse_event[slot] = ev
class GuiApplication: