mirror of
https://github.com/DeeJanuz/frametop.git
synced 2026-10-06 07:00:14 +02:00
Frametop kept using the headset during games: with gaze mode off, our eye tracker still took about 60% of a core, remote desktop about 2 cores while on, and KWin kept drawing hidden screens because ft-screens sent their frame callbacks at 90 Hz. Pausing gives that back, and resuming brings back only what pausing stopped. It's also a way to keep the gaze service and our eye tracker off during games, which PR #13 asked for. Paused (input/game_pause.py, run by the input relay): - frametop-gaze stops (ft-eyegrab then idles by itself), and hand tracking and remote desktop stop if they run - the desktop hides and slows down: ft-screens "pause on" hides every panel and sends KWin a frame callback once a second; or, with pause_desktop "close", the desktop closes and starts again on resume - the relay lets go of the 3D mouse, typing goes to Steam, and mapped buttons and key combinations do only pause_toggle, steam_menu and commands Toggled by both thumbsticks clicked together twice (configurable), read passively from vrserver's web socket (input/vrws.py) so it works in games and takes nothing from them; by the new pause_toggle action; by input/ft-pause; and, with pause_auto (default on), by a VR game starting and ending, which the pointer helper now reports ("vrgame 1|0"). Frametop Input Settings has a Games page for it. update-check.py checks the web socket, and doesn't count a paused gaze service as failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
67 lines
2.7 KiB
C
67 lines
2.7 KiB
C
// The OpenVR side of ft-screens (vr.cpp), called from the wlroots compositor (compositor.c).
|
|
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct ft_dmabuf {
|
|
int width, height;
|
|
uint32_t format; // DRM_FORMAT_*
|
|
uint64_t modifier; // DRM_FORMAT_MOD_*
|
|
int n_planes;
|
|
uint32_t offset[4], stride[4];
|
|
int fd[4];
|
|
};
|
|
|
|
enum ft_event_type { FT_MOTION, FT_BUTTON, FT_SCROLL, FT_LEAVE, FT_QUIT, FT_KEY, FT_KEYBOARD_CLOSED };
|
|
|
|
struct ft_event {
|
|
enum ft_event_type type;
|
|
int screen;
|
|
double x, y; // FT_MOTION: buffer pixels from the top left
|
|
uint32_t button; // FT_BUTTON: linux BTN_*
|
|
bool pressed;
|
|
bool controller; // FT_BUTTON: from a hand controller's laser (not the 3D mouse's)
|
|
double dx, dy; // FT_SCROLL: notches (positive dy: scroll down)
|
|
uint32_t key; // FT_KEY: linux KEY_* from our keyboard (pressed: down or up)
|
|
};
|
|
|
|
bool ft_vr_init(void);
|
|
void ft_vr_shutdown(void);
|
|
// Modifiers SteamVR can import for a DRM format. Returns the count (at most max).
|
|
int ft_vr_modifiers(uint32_t format, uint64_t *out, int max);
|
|
// The screens are showing (by the visibility mode; not counting a wrist-pinned screen).
|
|
bool ft_vr_screens_shown(void);
|
|
// Frametop is paused for a VR game ("pause on"): everything is hidden, and KWin slows down.
|
|
bool ft_vr_paused(void);
|
|
// A panel for screen `index`, width in metres, placed in a row in front of the head.
|
|
void ft_vr_screen_create(int index, double metres, int count);
|
|
void ft_vr_screen_destroy(int index);
|
|
// A spare output's panel, for floating windows (slot numbers from 1): hidden until
|
|
// ft-floatd floats a window on it and KWin has the output turned on.
|
|
void ft_vr_float_create(int index, int slot);
|
|
void ft_vr_float_output(int index, bool on);
|
|
// Show a client buffer (identified by `key`) on the screen's panel. False if SteamVR
|
|
// can't import it.
|
|
bool ft_vr_screen_present(int index, const void *key, const struct ft_dmabuf *buf);
|
|
// A buffer is going away: drop its import.
|
|
void ft_vr_forget(const void *key);
|
|
// Poll panel input and SteamVR events.
|
|
void ft_vr_poll(void (*handle)(const struct ft_event *, void *), void *data);
|
|
// Our keyboard (keyboard.cpp), for typing on screen `index`: its keys arrive as FT_KEY
|
|
// events, and FT_KEYBOARD_CLOSED when its Close key is pressed or the screens hide. False if
|
|
// it can't be shown or there's no head pose. With the Steam menu or Steam's own keyboard
|
|
// up, it waits and appears when they're gone.
|
|
bool ft_vr_keyboard_show(int index);
|
|
void ft_vr_keyboard_hide(void);
|
|
// A command from the control socket (@ft_screens); writes the reply (see vr.cpp).
|
|
void ft_vr_command(const char *command, char *reply, int reply_size);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|