From 90cecec048ee29a4971b8bda571da2a2b9613024 Mon Sep 17 00:00:00 2001 From: Javier Date: Sat, 9 Apr 2022 00:04:39 +0200 Subject: support generating a keystroke on wheel movement --- dosmain.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 17 deletions(-) (limited to 'dosmain.c') diff --git a/dosmain.c b/dosmain.c index 18120a8..a95908a 100644 --- a/dosmain.c +++ b/dosmain.c @@ -31,6 +31,7 @@ #include "vmware.h" #include "dostsr.h" +#if USE_WHEEL static void detect_wheel(LPTSRDATA data) { // Do a quick check for a mouse wheel here. @@ -54,6 +55,34 @@ static int set_wheel(LPTSRDATA data, bool enable) return 0; } +static int set_wheel_key(LPTSRDATA data, const char *keyname) +{ + if (!data->usewheel || !data->haswheel) { + fprintf(stderr, "Wheel not detected or support not enabled\n"); + return EXIT_FAILURE; + } + if (keyname) { + if (stricmp(keyname, "updn") == 0) { + data->wheel_up_key = 0x4800; + data->wheel_down_key = 0x5000; + printf("Generate Up Arrow / Down Arrow key presses on wheel movement"); + } else if (stricmp(keyname, "pageupdn") == 0) { + data->wheel_up_key = 0x4900; + data->wheel_down_key = 0x5100; + printf("Generate PageUp / PageDown key presses on wheel movement"); + } else { + fprintf(stderr, "Unknown key '%s'\n", keyname); + return EXIT_FAILURE; + } + } else { + printf("Disabling wheel keystroke generation\n"); + data->wheel_up_key = 0; + data->wheel_down_key = 0; + } + return EXIT_SUCCESS; +} +#endif /* USE_WHEEL */ + #if USE_VIRTUALBOX static int set_virtualbox_integration(LPTSRDATA data, bool enable) { @@ -224,9 +253,9 @@ static int configure_driver(LPTSRDATA data) #if USE_WHEEL // Let's utilize the wheel by default data->usewheel = true; + data->wheel_up_key = 0; + data->wheel_down_key = 0; detect_wheel(data); -#else - data->usewheel = false; #endif #if USE_INTEGRATION @@ -383,21 +412,21 @@ static __declspec(aborts) int install_driver(LPTSRDATA data, bool high) static bool check_if_driver_uninstallable(LPTSRDATA data) { void (__interrupt __far *cur_int33_handler)() = _dos_getvect(0x33); - void (__interrupt __far *our_int33_handler)() = data:>int33_isr; - if (cur_int33_handler != our_int33_handler) { - fprintf(stderr, "INT33 has been hooked by someone else, removing anyway\n"); - return true; + // Compare the segment of the installed handler to see if its ours + // or someone else's + if (FP_SEG(cur_int33_handler) != FP_SEG(data)) { + fprintf(stderr, "INT33 has been hooked by someone else, cannot safely remove\n"); + return false; } #if USE_WIN386 { void (__interrupt __far *cur_int2f_handler)() = _dos_getvect(0x2f); - void (__interrupt __far *our_int2f_handler)() = data:>int2f_isr; - if (cur_int2f_handler != our_int2f_handler) { - fprintf(stderr, "INT2F has been hooked by someone else, removing anyway\n"); - return true; + if (FP_SEG(cur_int2f_handler) != FP_SEG(data)) { + fprintf(stderr, "INT2F has been hooked by someone else, cannot safely remove\n"); + return false; } } #endif @@ -452,17 +481,19 @@ static void print_help(void) "Usage: \n" " VBMOUSE \n\n" "Supported actions:\n" - " install install the driver (default)\n" - " low install in conventional memory (otherwise UMB)\n" - " uninstall uninstall the driver from memory\n" + " install install the driver (default)\n" + " low install in conventional memory (otherwise UMB)\n" + " uninstall uninstall the driver from memory\n" #if USE_WHEEL - " wheel enable/disable wheel API support\n" + " wheel enable/disable wheel API support\n" + " wheelkey emulate a specific keystroke on wheel scroll\n" + " supported keys: updn, pageupdn\n" #endif #if USE_INTEGRATION - " integ enable/disable virtualbox integration\n" - " hostcur enable/disable mouse cursor rendering in host\n" + " integ enable/disable virtualbox integration\n" + " hostcur enable/disable mouse cursor rendering in host\n" #endif - " reset reset mouse driver settings\n" + " reset reset mouse driver settings\n" ); } @@ -473,6 +504,13 @@ static int invalid_arg(const char *s) return EXIT_FAILURE; } +static int arg_required(const char *s) +{ + fprintf(stderr, "Argument required for '%s'", s); + print_help(); + return EXIT_FAILURE; +} + static bool is_true(const char *s) { return stricmp(s, "yes") == 0 @@ -553,6 +591,24 @@ int main(int argc, const char *argv[]) } return set_wheel(data, enable); + } else if (stricmp(argv[argi], "wheelkey") == 0) { + bool enable = true; + const char *key = 0; + + if (!data) return driver_not_found(); + + argi++; + if (argi < argc) { + if (is_false(argv[argi])) enable = false; + else key = argv[argi]; + } + + if (enable) { + if (!key) return arg_required("wheelkey"); + return set_wheel_key(data, key); + } else { + return set_wheel_key(data, 0); + } #endif #if USE_INTEGRATION } else if (stricmp(argv[argi], "integ") == 0) { -- cgit v1.2.3