mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-02-16 14:30:34 +00:00
Merge pull request #110 from dougg3/windows_key
Add optional ability to intercept Windows key
This commit is contained in:
commit
a3534d2eea
@ -98,11 +98,14 @@ uint8 *ScratchMem = NULL; // Scratch memory for Mac ROM writes
|
|||||||
static bool lm_area_mapped = false; // Flag: Low Memory area mmap()ped
|
static bool lm_area_mapped = false; // Flag: Low Memory area mmap()ped
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static HHOOK keyboard_hook; // Hook for intercepting windows key events
|
||||||
|
|
||||||
|
|
||||||
// Prototypes
|
// Prototypes
|
||||||
static int xpram_func(void *arg);
|
static int xpram_func(void *arg);
|
||||||
static int tick_func(void *arg);
|
static int tick_func(void *arg);
|
||||||
static void one_tick(...);
|
static void one_tick(...);
|
||||||
|
static LRESULT CALLBACK low_level_keyboard_hook(int nCode, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -283,6 +286,12 @@ int main(int argc, char **argv)
|
|||||||
QuitEmulator();
|
QuitEmulator();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Install keyboard hook to block Windows key if enabled in prefs
|
||||||
|
if (PrefsFindBool("reservewindowskey"))
|
||||||
|
{
|
||||||
|
keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, low_level_keyboard_hook, GetModuleHandle(NULL), 0);
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize SDL system
|
// Initialize SDL system
|
||||||
int sdl_flags = 0;
|
int sdl_flags = 0;
|
||||||
#ifdef USE_SDL_VIDEO
|
#ifdef USE_SDL_VIDEO
|
||||||
@ -711,3 +720,42 @@ bool ChoiceAlert(const char *text, const char *pos, const char *neg)
|
|||||||
printf(GetString(STR_SHELL_WARNING_PREFIX), text);
|
printf(GetString(STR_SHELL_WARNING_PREFIX), text);
|
||||||
return false; //!!
|
return false; //!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Low level keyboard hook allowing us to intercept events involving the Windows key
|
||||||
|
*/
|
||||||
|
static LRESULT CALLBACK low_level_keyboard_hook(int nCode, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// Not a relevant event, immediately pass it on
|
||||||
|
if (nCode != HC_ACTION)
|
||||||
|
return CallNextHookEx(keyboard_hook, nCode, wParam, lParam);
|
||||||
|
|
||||||
|
KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;
|
||||||
|
switch (wParam) {
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
// Intercept left/right windows keys when we have keyboard focus so Windows doesn't handle them
|
||||||
|
if (p->vkCode == VK_LWIN || p->vkCode == VK_RWIN) {
|
||||||
|
bool intercept_event = false;
|
||||||
|
#ifdef USE_SDL_VIDEO
|
||||||
|
if (sdl_window && (SDL_GetWindowFlags(sdl_window) & SDL_WINDOW_INPUT_FOCUS)) {
|
||||||
|
intercept_event = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// If we've determined we should intercept the event, intercept it. But pass the event onto SDL so Basilisk handles it.
|
||||||
|
if (intercept_event) {
|
||||||
|
SDL_Event e;
|
||||||
|
memset(&e, 0, sizeof(e));
|
||||||
|
e.type = (wParam == WM_KEYDOWN) ? SDL_KEYDOWN : SDL_KEYUP;
|
||||||
|
e.key.keysym.sym = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI;
|
||||||
|
SDL_PushEvent(&e);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we fall here, we weren't supposed to intercept it.
|
||||||
|
return CallNextHookEx(keyboard_hook, nCode, wParam, lParam);
|
||||||
|
}
|
||||||
|
@ -1298,6 +1298,12 @@ static void tb_keycodes(GtkWidget *widget)
|
|||||||
set_input_sensitive();
|
set_input_sensitive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "Reserve Windows Key" button toggled
|
||||||
|
static void tb_reservewindowskey(GtkWidget *widget)
|
||||||
|
{
|
||||||
|
PrefsReplaceBool("reservewindowskey", GTK_TOGGLE_BUTTON(widget)->active);
|
||||||
|
}
|
||||||
|
|
||||||
// "Mouse Wheel Mode" selected
|
// "Mouse Wheel Mode" selected
|
||||||
static void mn_wheel_page(...) {PrefsReplaceInt32("mousewheelmode", 0); set_input_sensitive();}
|
static void mn_wheel_page(...) {PrefsReplaceInt32("mousewheelmode", 0); set_input_sensitive();}
|
||||||
static void mn_wheel_cursor(...) {PrefsReplaceInt32("mousewheelmode", 1); set_input_sensitive();}
|
static void mn_wheel_cursor(...) {PrefsReplaceInt32("mousewheelmode", 1); set_input_sensitive();}
|
||||||
@ -1345,6 +1351,8 @@ static void create_input_pane(GtkWidget *top)
|
|||||||
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
|
||||||
g_object_set_data(G_OBJECT(w_keycode_file), "chooser_button", button);
|
g_object_set_data(G_OBJECT(w_keycode_file), "chooser_button", button);
|
||||||
|
|
||||||
|
make_checkbox(box, STR_RESERVE_WINDOWS_KEY_CTRL, "reservewindowskey", GTK_SIGNAL_FUNC(tb_reservewindowskey));
|
||||||
|
|
||||||
make_separator(box);
|
make_separator(box);
|
||||||
|
|
||||||
static const opt_desc options[] = {
|
static const opt_desc options[] = {
|
||||||
|
@ -53,6 +53,8 @@ prefs_desc platform_prefs_items[] = {
|
|||||||
{"sdlrender", TYPE_STRING, false, "SDL_Renderer driver (\"auto\", \"software\" (may be faster), etc.)"},
|
{"sdlrender", TYPE_STRING, false, "SDL_Renderer driver (\"auto\", \"software\" (may be faster), etc.)"},
|
||||||
{"sdl_vsync", TYPE_BOOLEAN, false, "Make SDL_Renderer vertical sync frames to host (eg. with software renderer)"},
|
{"sdl_vsync", TYPE_BOOLEAN, false, "Make SDL_Renderer vertical sync frames to host (eg. with software renderer)"},
|
||||||
#endif
|
#endif
|
||||||
|
{"reservewindowskey", TYPE_BOOLEAN, false, "block Windows key from activating start menu"},
|
||||||
|
|
||||||
|
|
||||||
{NULL, TYPE_END, false, NULL} // End of list
|
{NULL, TYPE_END, false, NULL} // End of list
|
||||||
};
|
};
|
||||||
@ -136,4 +138,5 @@ void AddPlatformPrefsDefaults(void)
|
|||||||
PrefsReplaceString("sdlrender", "software");
|
PrefsReplaceString("sdlrender", "software");
|
||||||
PrefsReplaceBool("sdl_vsync", false);
|
PrefsReplaceBool("sdl_vsync", false);
|
||||||
#endif
|
#endif
|
||||||
|
PrefsAddBool("reservewindowskey", false);
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ user_string_def platform_strings[] = {
|
|||||||
{STR_INPUT_PANE_TITLE, "Keyboard/Mouse"},
|
{STR_INPUT_PANE_TITLE, "Keyboard/Mouse"},
|
||||||
{STR_KEYCODES_CTRL, "Use Raw Keycodes"},
|
{STR_KEYCODES_CTRL, "Use Raw Keycodes"},
|
||||||
{STR_KEYCODE_FILE_CTRL, "Keycode Translation File"},
|
{STR_KEYCODE_FILE_CTRL, "Keycode Translation File"},
|
||||||
|
{STR_RESERVE_WINDOWS_KEY_CTRL, "Reserve Windows Key"},
|
||||||
{STR_MOUSEWHEELMODE_CTRL, "Mouse Wheel Function"},
|
{STR_MOUSEWHEELMODE_CTRL, "Mouse Wheel Function"},
|
||||||
{STR_MOUSEWHEELMODE_PAGE_LAB, "Page Up/Down"},
|
{STR_MOUSEWHEELMODE_PAGE_LAB, "Page Up/Down"},
|
||||||
{STR_MOUSEWHEELMODE_CURSOR_LAB, "Cursor Up/Down"},
|
{STR_MOUSEWHEELMODE_CURSOR_LAB, "Cursor Up/Down"},
|
||||||
|
@ -58,6 +58,7 @@ enum {
|
|||||||
STR_INPUT_PANE_TITLE,
|
STR_INPUT_PANE_TITLE,
|
||||||
STR_KEYCODES_CTRL,
|
STR_KEYCODES_CTRL,
|
||||||
STR_KEYCODE_FILE_CTRL,
|
STR_KEYCODE_FILE_CTRL,
|
||||||
|
STR_RESERVE_WINDOWS_KEY_CTRL,
|
||||||
STR_MOUSEWHEELMODE_CTRL,
|
STR_MOUSEWHEELMODE_CTRL,
|
||||||
STR_MOUSEWHEELMODE_PAGE_LAB,
|
STR_MOUSEWHEELMODE_PAGE_LAB,
|
||||||
STR_MOUSEWHEELMODE_CURSOR_LAB,
|
STR_MOUSEWHEELMODE_CURSOR_LAB,
|
||||||
|
@ -105,6 +105,8 @@ uintptr SheepMem::base = 0x60000000; // Address of SheepShaver data
|
|||||||
uintptr SheepMem::proc; // Bottom address of SheepShave procedures
|
uintptr SheepMem::proc; // Bottom address of SheepShave procedures
|
||||||
uintptr SheepMem::data; // Top of SheepShaver data (stack like storage)
|
uintptr SheepMem::data; // Top of SheepShaver data (stack like storage)
|
||||||
|
|
||||||
|
static HHOOK keyboard_hook; // Hook for intercepting windows key events
|
||||||
|
|
||||||
|
|
||||||
// Prototypes
|
// Prototypes
|
||||||
static bool kernel_data_init(void);
|
static bool kernel_data_init(void);
|
||||||
@ -118,6 +120,7 @@ extern void emul_ppc(uint32 start);
|
|||||||
extern void init_emul_ppc(void);
|
extern void init_emul_ppc(void);
|
||||||
extern void exit_emul_ppc(void);
|
extern void exit_emul_ppc(void);
|
||||||
sigsegv_return_t sigsegv_handler(sigsegv_info_t *sip);
|
sigsegv_return_t sigsegv_handler(sigsegv_info_t *sip);
|
||||||
|
static LRESULT CALLBACK low_level_keyboard_hook(int nCode, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -210,6 +213,12 @@ int main(int argc, char **argv)
|
|||||||
// // Load win32 libraries
|
// // Load win32 libraries
|
||||||
// KernelInit();
|
// KernelInit();
|
||||||
|
|
||||||
|
// Install keyboard hook to block Windows key if enabled in prefs
|
||||||
|
if (PrefsFindBool("reservewindowskey"))
|
||||||
|
{
|
||||||
|
keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, low_level_keyboard_hook, GetModuleHandle(NULL), 0);
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize SDL system
|
// Initialize SDL system
|
||||||
int sdl_flags = 0;
|
int sdl_flags = 0;
|
||||||
#ifdef USE_SDL_VIDEO
|
#ifdef USE_SDL_VIDEO
|
||||||
@ -839,3 +848,42 @@ bool ChoiceAlert(const char *text, const char *pos, const char *neg)
|
|||||||
printf(GetString(STR_SHELL_WARNING_PREFIX), text);
|
printf(GetString(STR_SHELL_WARNING_PREFIX), text);
|
||||||
return false; //!!
|
return false; //!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Low level keyboard hook allowing us to intercept events involving the Windows key
|
||||||
|
*/
|
||||||
|
static LRESULT CALLBACK low_level_keyboard_hook(int nCode, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
// Not a relevant event, immediately pass it on
|
||||||
|
if (nCode != HC_ACTION)
|
||||||
|
return CallNextHookEx(keyboard_hook, nCode, wParam, lParam);
|
||||||
|
|
||||||
|
KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *)lParam;
|
||||||
|
switch (wParam) {
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_KEYUP:
|
||||||
|
// Intercept left/right windows keys when we have keyboard focus so Windows doesn't handle them
|
||||||
|
if (p->vkCode == VK_LWIN || p->vkCode == VK_RWIN) {
|
||||||
|
bool intercept_event = false;
|
||||||
|
#ifdef USE_SDL_VIDEO
|
||||||
|
if (sdl_window && (SDL_GetWindowFlags(sdl_window) & SDL_WINDOW_INPUT_FOCUS)) {
|
||||||
|
intercept_event = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// If we've determined we should intercept the event, intercept it. But pass the event onto SDL so SheepShaver handles it.
|
||||||
|
if (intercept_event) {
|
||||||
|
SDL_Event e;
|
||||||
|
memset(&e, 0, sizeof(e));
|
||||||
|
e.type = (wParam == WM_KEYDOWN) ? SDL_KEYDOWN : SDL_KEYUP;
|
||||||
|
e.key.keysym.sym = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI;
|
||||||
|
SDL_PushEvent(&e);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we fall here, we weren't supposed to intercept it.
|
||||||
|
return CallNextHookEx(keyboard_hook, nCode, wParam, lParam);
|
||||||
|
}
|
||||||
|
@ -58,6 +58,7 @@ prefs_desc platform_prefs_items[] = {
|
|||||||
{"sdlrender", TYPE_STRING, false, "SDL_Renderer driver (\"auto\", \"software\" (may be faster), etc.)"},
|
{"sdlrender", TYPE_STRING, false, "SDL_Renderer driver (\"auto\", \"software\" (may be faster), etc.)"},
|
||||||
{"sdl_vsync", TYPE_BOOLEAN, false, "Make SDL_Renderer vertical sync frames to host (eg. with software renderer)"},
|
{"sdl_vsync", TYPE_BOOLEAN, false, "Make SDL_Renderer vertical sync frames to host (eg. with software renderer)"},
|
||||||
#endif
|
#endif
|
||||||
|
{"reservewindowskey", TYPE_BOOLEAN, false, "block Windows key from activating start menu"},
|
||||||
|
|
||||||
{NULL, TYPE_END, false, NULL} // End of list
|
{NULL, TYPE_END, false, NULL} // End of list
|
||||||
};
|
};
|
||||||
@ -145,4 +146,5 @@ void AddPlatformPrefsDefaults(void)
|
|||||||
PrefsReplaceString("sdlrender", "software");
|
PrefsReplaceString("sdlrender", "software");
|
||||||
PrefsReplaceBool("sdl_vsync", false);
|
PrefsReplaceBool("sdl_vsync", false);
|
||||||
#endif
|
#endif
|
||||||
|
PrefsAddBool("reservewindowskey", false);
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,7 @@ user_string_def platform_strings[] = {
|
|||||||
{STR_INPUT_PANE_TITLE, "Keyboard/Mouse"},
|
{STR_INPUT_PANE_TITLE, "Keyboard/Mouse"},
|
||||||
{STR_KEYCODES_CTRL, "Use Raw Keycodes"},
|
{STR_KEYCODES_CTRL, "Use Raw Keycodes"},
|
||||||
{STR_KEYCODE_FILE_CTRL, "Keycode Translation File"},
|
{STR_KEYCODE_FILE_CTRL, "Keycode Translation File"},
|
||||||
|
{STR_RESERVE_WINDOWS_KEY_CTRL, "Reserve Windows Key"},
|
||||||
{STR_MOUSEWHEELMODE_CTRL, "Mouse Wheel Function"},
|
{STR_MOUSEWHEELMODE_CTRL, "Mouse Wheel Function"},
|
||||||
{STR_MOUSEWHEELMODE_PAGE_LAB, "Page Up/Down"},
|
{STR_MOUSEWHEELMODE_PAGE_LAB, "Page Up/Down"},
|
||||||
{STR_MOUSEWHEELMODE_CURSOR_LAB, "Cursor Up/Down"},
|
{STR_MOUSEWHEELMODE_CURSOR_LAB, "Cursor Up/Down"},
|
||||||
|
@ -57,6 +57,7 @@ enum {
|
|||||||
STR_INPUT_PANE_TITLE,
|
STR_INPUT_PANE_TITLE,
|
||||||
STR_KEYCODES_CTRL,
|
STR_KEYCODES_CTRL,
|
||||||
STR_KEYCODE_FILE_CTRL,
|
STR_KEYCODE_FILE_CTRL,
|
||||||
|
STR_RESERVE_WINDOWS_KEY_CTRL,
|
||||||
STR_MOUSEWHEELMODE_CTRL,
|
STR_MOUSEWHEELMODE_CTRL,
|
||||||
STR_MOUSEWHEELMODE_PAGE_LAB,
|
STR_MOUSEWHEELMODE_PAGE_LAB,
|
||||||
STR_MOUSEWHEELMODE_CURSOR_LAB,
|
STR_MOUSEWHEELMODE_CURSOR_LAB,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user