diff --git a/client/include/app.h b/client/include/app.h index 128fecc7..7ac0fa75 100644 --- a/client/include/app.h +++ b/client/include/app.h @@ -162,4 +162,11 @@ void app_releaseKeybind(KeybindHandle * handle); */ void app_releaseAllKeybinds(void); +bool app_guestIsLinux(void); +bool app_guestIsWindows(void); +bool app_guestIsOSX(void); +bool app_guestIsBSD(void); +bool app_guestIsOther(void); + + #endif diff --git a/client/src/app.c b/client/src/app.c index 6826e1c6..19a85add 100644 --- a/client/src/app.c +++ b/client/src/app.c @@ -948,3 +948,28 @@ void app_invalidateOverlay(bool renderTwice) g_state.renderImGuiTwice = true; app_invalidateWindow(false); } + +bool app_guestIsLinux(void) +{ + return g_state.guestOS == KVMFR_OS_LINUX; +} + +bool app_guestIsWindows(void) +{ + return g_state.guestOS == KVMFR_OS_WINDOWS; +} + +bool app_guestIsOSX(void) +{ + return g_state.guestOS == KVMFR_OS_OSX; +} + +bool app_guestIsBSD(void) +{ + return g_state.guestOS == KVMFR_OS_BSD; +} + +bool app_guestIsOther(void) +{ + return g_state.guestOS == KVMFR_OS_OTHER; +} diff --git a/client/src/keybind.c b/client/src/keybind.c index cfa85828..37569bc9 100644 --- a/client/src/keybind.c +++ b/client/src/keybind.c @@ -139,38 +139,83 @@ static void bind_toggleKey(int sc, void * opaque) purespice_keyUp((uintptr_t) opaque); } -void keybind_register(void) +void keybind_commonRegister(void) { - app_registerKeybind(KEY_F, bind_fullscreen , NULL, "Full screen toggle"); - app_registerKeybind(KEY_V, bind_video , NULL, "Video stream toggle"); - 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_O, bind_toggleOverlay, NULL, "Toggle overlay"); + app_registerKeybind(KEY_F, bind_fullscreen , NULL, + "Full screen toggle"); + app_registerKeybind(KEY_V, bind_video , NULL, + "Video stream toggle"); + 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_O, bind_toggleOverlay, NULL, + "Toggle overlay"); +} - if (g_params.useSpiceInput) +void keybind_spiceRegister(void) +{ + /* register the common keybinds for spice */ + static bool firstTime = true; + if (firstTime) { - app_registerKeybind(KEY_I , bind_input , NULL , "Spice keyboard & mouse toggle"); - app_registerKeybind(KEY_INSERT, bind_mouseSens, (void*)true , "Increase mouse sensitivity in capture mode"); - app_registerKeybind(KEY_DELETE, bind_mouseSens, (void*)false, "Descrease mouse sensitivity in capture mode"); + app_registerKeybind(KEY_I, bind_input, NULL, + "Spice keyboard & mouse toggle"); - app_registerKeybind(KEY_F1 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F1 to the guest"); - app_registerKeybind(KEY_F2 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F2 to the guest"); - app_registerKeybind(KEY_F3 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F3 to the guest"); - app_registerKeybind(KEY_F4 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F4 to the guest"); - app_registerKeybind(KEY_F5 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F5 to the guest"); - app_registerKeybind(KEY_F6 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F6 to the guest"); - app_registerKeybind(KEY_F7 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F7 to the guest"); - app_registerKeybind(KEY_F8 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F8 to the guest"); - app_registerKeybind(KEY_F9 , bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F9 to the guest"); - app_registerKeybind(KEY_F10, bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F10 to the guest"); - app_registerKeybind(KEY_F11, bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F11 to the guest"); - app_registerKeybind(KEY_F12, bind_ctrlAltFn, NULL, "Send Ctrl+Alt+F12 to the guest"); + app_registerKeybind(KEY_INSERT, bind_mouseSens, (void *) true , + "Increase mouse sensitivity in capture mode"); + app_registerKeybind(KEY_DELETE, bind_mouseSens, (void *) false, + "Descrease mouse sensitivity in capture mode"); - app_registerKeybind(KEY_LEFTMETA , bind_passthrough, NULL, "Send LWin to the guest"); - app_registerKeybind(KEY_RIGHTMETA, bind_passthrough, NULL, "Send RWin to the guest"); + app_registerKeybind(KEY_UP , bind_toggleKey, (void *) PS2_VOLUME_UP , + "Send volume up to the guest"); + app_registerKeybind(KEY_DOWN, bind_toggleKey, (void *) PS2_VOLUME_DOWN, + "Send volume down to the guest"); + app_registerKeybind(KEY_M , bind_toggleKey, (void *) PS2_MUTE , + "Send mute to the guest"); - app_registerKeybind(KEY_UP , bind_toggleKey, (void *) PS2_VOLUME_UP , "Send volume up to the guest"); - app_registerKeybind(KEY_DOWN, bind_toggleKey, (void *) PS2_VOLUME_DOWN, "Send volume down to the guest"); - app_registerKeybind(KEY_M , bind_toggleKey, (void *) PS2_MUTE , "Send mute to the guest"); + app_registerKeybind(KEY_LEFTMETA , bind_passthrough, NULL, + "Send LWin to the guest"); + app_registerKeybind(KEY_RIGHTMETA, bind_passthrough, NULL, + "Send RWin to the guest"); + + firstTime = false; + } + + /* release any OS based keybinds that have been bound */ + static KeybindHandle handles[32] = { 0 }; // increase size as needed + static int handleCount = 0; + for(int i = 0; i < handleCount; ++i) + app_releaseKeybind(&handles[i]); + handleCount = 0; + + + /* register OS based keybinds */ + if (app_guestIsLinux()) + { + handles[handleCount++] = app_registerKeybind(KEY_F1 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F1 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F2 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F2 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F3 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F3 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F4 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F4 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F5 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F5 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F6 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F6 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F7 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F7 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F8 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F8 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F9 , bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F9 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F10, bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F10 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F11, bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F11 to the guest"); + handles[handleCount++] = app_registerKeybind(KEY_F12, bind_ctrlAltFn, NULL, + "Send Ctrl+Alt+F12 to the guest"); } } diff --git a/client/src/keybind.h b/client/src/keybind.h index 830cb446..600486d7 100644 --- a/client/src/keybind.h +++ b/client/src/keybind.h @@ -21,6 +21,7 @@ #ifndef _H_LG_KEYBIND_ #define _H_LG_KEYBIND_ -void keybind_register(void); +void keybind_commonRegister(void); +void keybind_spiceRegister(void); #endif diff --git a/client/src/main.c b/client/src/main.c index 55092789..7bec06b9 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -798,7 +798,7 @@ int main_frameThread(void * unused) static void checkUUID(void) { - if (!g_state.spiceUUIDValid || !g_state.guestUUIDValid) + if (!g_state.spiceReady || !g_state.guestUUIDValid) return; if (memcmp(g_state.spiceUUID, g_state.guestUUID, @@ -836,9 +836,12 @@ void spiceReady(void) return; memcpy(g_state.spiceUUID, info.uuid, sizeof(g_state.spiceUUID)); - g_state.spiceUUIDValid = true; + g_state.spiceReady = true; checkUUID(); + if (g_params.useSpiceInput) + keybind_spiceRegister(); + purespice_freeServerInfo(&info); } @@ -1034,6 +1037,9 @@ static int lg_run(void) initImGuiKeyMap(g_state.io->KeyMap); + // unknown guest OS at this time + g_state.guestOS = KVMFR_OS_OTHER; + // search for the best displayserver ops to use for(int i = 0; i < LG_DISPLAYSERVER_COUNT; ++i) if (LG_DisplayServers[i]->probe()) @@ -1179,7 +1185,7 @@ static int lg_run(void) // interactivity. g_state.overlayFrameTime = min(g_state.frameTime, 1000000000ULL / 60ULL); - keybind_register(); + keybind_commonRegister(); // setup the startup condition if (!(e_startup = lgCreateEvent(false, 0))) @@ -1449,6 +1455,11 @@ restart: DEBUG_INFO("OS : %s", type); if (osInfo->name[0]) DEBUG_INFO("OS Name : %s", osInfo->name); + + g_state.guestOS = osInfo->os; + + if (g_state.spiceReady && g_params.useSpiceInput) + keybind_spiceRegister(); break; } diff --git a/client/src/main.h b/client/src/main.h index 59d323c7..a1715b7c 100644 --- a/client/src/main.h +++ b/client/src/main.h @@ -70,9 +70,10 @@ struct AppState bool jitRender; uint8_t spiceUUID[16]; - bool spiceUUIDValid; + bool spiceReady; uint8_t guestUUID[16]; bool guestUUIDValid; + KVMFROS guestOS; bool stopVideo; bool ignoreInput;