// shortcuts.c enable/disable accessibility shortcuts
// MG 7/3/06
//

#include <windows.h>
#include <winuser.h>

#define bool int
#define true (-1)
#define false 0

STICKYKEYS g_StartupStickyKeys = {sizeof(STICKYKEYS), 1};
TOGGLEKEYS g_StartupToggleKeys = {sizeof(TOGGLEKEYS), 0};
FILTERKEYS g_StartupFilterKeys = {sizeof(FILTERKEYS), 0};    

void AllowAccessibilityShortcutKeys( bool bAllowKeys )
{
    SystemParametersInfo(SPI_GETSTICKYKEYS, sizeof(STICKYKEYS), &g_StartupStickyKeys, 0);
    SystemParametersInfo(SPI_GETTOGGLEKEYS, sizeof(TOGGLEKEYS), &g_StartupToggleKeys, 0);
    SystemParametersInfo(SPI_GETFILTERKEYS, sizeof(FILTERKEYS), &g_StartupFilterKeys, 0);

    // Disable StickyKeys/etc shortcuts but if the accessibility feature is on, 
    // then leave the settings alone as its probably being usefully used

    STICKYKEYS skOff = g_StartupStickyKeys;
    if( (skOff.dwFlags & SKF_STICKYKEYSON) == 0 ) {
	if( bAllowKeys ) {
	    // Enable the hotkey and the confirmation
	    skOff.dwFlags |= SKF_HOTKEYACTIVE;
	    skOff.dwFlags |= SKF_CONFIRMHOTKEY;
	}
	else {
	    // Disable the hotkey and the confirmation
	    skOff.dwFlags &= ~SKF_HOTKEYACTIVE;
	    skOff.dwFlags &= ~SKF_CONFIRMHOTKEY;
	}
	SystemParametersInfo(SPI_SETSTICKYKEYS, sizeof(STICKYKEYS), &skOff, 0);
    }

    TOGGLEKEYS tkOff = g_StartupToggleKeys;
    if( (tkOff.dwFlags & TKF_TOGGLEKEYSON) == 0 ) {
	if( bAllowKeys ) {
	    // Enable the hotkey and the confirmation
	    tkOff.dwFlags |= TKF_HOTKEYACTIVE;
	    tkOff.dwFlags |= TKF_CONFIRMHOTKEY;
	}
	else {
	    // Disable the hotkey and the confirmation
	    tkOff.dwFlags &= ~TKF_HOTKEYACTIVE;
	    tkOff.dwFlags &= ~TKF_CONFIRMHOTKEY;
	}
	SystemParametersInfo(SPI_SETTOGGLEKEYS, sizeof(TOGGLEKEYS), &tkOff, 0);
    }

    FILTERKEYS fkOff = g_StartupFilterKeys;
    if( (fkOff.dwFlags & FKF_FILTERKEYSON) == 0 ) {
	if( bAllowKeys ) {
	    // Enable the hotkey and the confirmation
	    fkOff.dwFlags |= FKF_HOTKEYACTIVE;
	    fkOff.dwFlags |= FKF_CONFIRMHOTKEY;
	}
	else {
	    // Disable the hotkey and the confirmation
	    fkOff.dwFlags &= ~FKF_HOTKEYACTIVE;
	    fkOff.dwFlags &= ~FKF_CONFIRMHOTKEY;
	}
	SystemParametersInfo(SPI_SETFILTERKEYS, sizeof(FILTERKEYS), &fkOff, 0);
    }
}

int main(int argc, char* argv[])
{
    if((argc == 1) || (argv[1][0]=='0')){
	AllowAccessibilityShortcutKeys( false );
    }
    else AllowAccessibilityShortcutKeys( true );
    return 0;
}



