[client] imgui: add mode to forward mouse input to imgui

This commit is contained in:
Quantum 2021-07-26 17:27:47 -04:00 committed by Geoffrey McRae
parent 6c64965703
commit 065d90c3f7
3 changed files with 59 additions and 6 deletions

View File

@ -68,6 +68,9 @@ void app_updateCursorPos(double x, double y)
g_cursor.pos.x = x; g_cursor.pos.x = x;
g_cursor.pos.y = y; g_cursor.pos.y = y;
g_cursor.valid = true; g_cursor.valid = true;
if (g_state.overlayInput)
g_state.io->MousePos = (ImVec2) { x * g_state.windowScale, y * g_state.windowScale };
} }
void app_handleFocusEvent(bool focused) void app_handleFocusEvent(bool focused)
@ -214,10 +217,34 @@ void spiceClipboardNotice(const SpiceDataType type)
g_state.ds->cbNotice(cb_spiceTypeToLGType(type)); g_state.ds->cbNotice(cb_spiceTypeToLGType(type));
} }
static int mapSpiceToImGuiButton(uint32_t button)
{
switch (button)
{
case 1: // SPICE_MOUSE_BUTTON_LEFT
return ImGuiMouseButton_Left;
case 2: // SPICE_MOUSE_BUTTON_MIDDLE
return ImGuiMouseButton_Middle;
case 3: // SPICE_MOUSE_BUTTON_RIGHT
return ImGuiMouseButton_Right;
}
return -1;
}
void app_handleButtonPress(int button) void app_handleButtonPress(int button)
{ {
g_cursor.buttons |= (1U << button); g_cursor.buttons |= (1U << button);
if (g_state.overlayInput)
{
int igButton = mapSpiceToImGuiButton(button);
if (igButton != -1)
g_state.io->MouseDown[igButton] = true;
if (g_state.io->WantCaptureMouse)
return;
}
if (!core_inputEnabled() || !g_cursor.inView) if (!core_inputEnabled() || !g_cursor.inView)
return; return;
@ -229,6 +256,15 @@ void app_handleButtonRelease(int button)
{ {
g_cursor.buttons &= ~(1U << button); g_cursor.buttons &= ~(1U << button);
if (g_state.overlayInput)
{
int igButton = mapSpiceToImGuiButton(button);
if (igButton != -1)
g_state.io->MouseDown[igButton] = false;
if (g_state.io->WantCaptureMouse)
return;
}
if (!core_inputEnabled()) if (!core_inputEnabled())
return; return;

View File

@ -133,14 +133,30 @@ static void bind_passthrough(int sc, void * opaque)
spice_key_up (sc); spice_key_up (sc);
} }
static void bind_toggleOverlay(int sc, void * opaque)
{
g_state.overlayInput ^= true;
if (g_state.overlayInput)
{
g_state.io->ConfigFlags &= ~ImGuiConfigFlags_NoMouse;
app_alert(LG_ALERT_INFO, "Overlay input enabled");
}
else
{
g_state.io->ConfigFlags |= ImGuiConfigFlags_NoMouse;
app_alert(LG_ALERT_INFO, "Overlay input disabled");
}
}
void keybind_register(void) void keybind_register(void)
{ {
app_registerKeybind(KEY_F, bind_fullscreen, NULL, "Full screen toggle"); app_registerKeybind(KEY_F, bind_fullscreen , NULL, "Full screen toggle");
app_registerKeybind(KEY_V, bind_video , NULL, "Video stream toggle"); app_registerKeybind(KEY_V, bind_video , NULL, "Video stream toggle");
app_registerKeybind(KEY_D, bind_showFPS , NULL, "FPS display toggle"); app_registerKeybind(KEY_D, bind_showFPS , NULL, "FPS display toggle");
app_registerKeybind(KEY_T, bind_showTiming, NULL, "Show frame timing information"); app_registerKeybind(KEY_T, bind_showTiming , NULL, "Show frame timing information");
app_registerKeybind(KEY_R, bind_rotate , NULL, "Rotate the output clockwise by 90° increments"); app_registerKeybind(KEY_R, bind_rotate , NULL, "Rotate the output clockwise by 90° increments");
app_registerKeybind(KEY_Q, bind_quit , NULL, "Quit"); app_registerKeybind(KEY_Q, bind_quit , NULL, "Quit");
app_registerKeybind(KEY_O, bind_toggleOverlay, NULL, "Toggle overlay");
if (g_params.useSpiceInput) if (g_params.useSpiceInput)
{ {

View File

@ -53,6 +53,7 @@ struct AppState
struct ll * overlays; struct ll * overlays;
char * fontName; char * fontName;
ImFont * fontLarge; ImFont * fontLarge;
bool overlayInput;
bool alertShow; bool alertShow;
char * alertMessage; char * alertMessage;