From 519bc54e98a0f69006276773be4f6068db61fd07 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Sep 09 2020 09:21:58 +0000 Subject: key groups and aliases --- diff --git a/demo/src/common.c b/demo/src/common.c index 9740f03..72f5020 100644 --- a/demo/src/common.c +++ b/demo/src/common.c @@ -70,9 +70,6 @@ void commonInit() { void commonDraw() { saveState(); - int shift = keyDown("left shift") || keyDown("right shift"); - int ctrl = keyDown("left ctrl") || keyDown("right ctrl"); - noFill(); textFontDefault(); textSize(16); @@ -86,13 +83,13 @@ void commonDraw() { soundPlay(beep, FALSE); if (mouseWentDown("middle")) - askTextEx("Test\ntext input", buffer, sizeof(buffer), shift, ctrl); + askTextEx("Test\ntext input", buffer, sizeof(buffer), keyDown("any shift"), keyDown("any ctrl")); if (mouseWentDown("right")) { - if (ctrl) { + if (keyDown("any ctrl")) { answer = questionBox3("Test question box3\nwith test message.", "cancel", "no", "yes"); } else - if (shift) { + if (keyDown("any shift")) { answer = questionBox("Test question box\nwith test message.", "no", "yes"); } else { messageBox("Test message box\nwith test message."); diff --git a/src/world.c b/src/world.c index 06f24e7..857b894 100644 --- a/src/world.c +++ b/src/world.c @@ -46,6 +46,56 @@ static double _mouseX; static double _mouseY; +static const char* keyAliases[][2] = { + // as user asked | as internally stored // + { "enter" , "return" }, + { "any enter" , "any return" }, + { "keypad return" , "keypad enter" } }; +static int keyAliasesCount = (int)(sizeof(keyAliases)/sizeof(*keyAliases)); +static const char* keyGroups[][2] = { + // as SDL passed | as internally stored // + { "left shift" , "any shift" }, + { "left ctrl" , "any ctrl" }, + { "left alt" , "any alt" }, + { "left gui" , "any gui" }, + { "right shift" , "any shift" }, + { "right ctrl" , "any ctrl" }, + { "right alt" , "any alt" }, + { "right gui" , "any gui" }, + { "0" , "any 0" }, + { "1" , "any 1" }, + { "2" , "any 2" }, + { "3" , "any 3" }, + { "4" , "any 4" }, + { "5" , "any 5" }, + { "6" , "any 6" }, + { "7" , "any 7" }, + { "8" , "any 8" }, + { "9" , "any 9" }, + { "/" , "any /" }, + { "*" , "any *" }, + { "-" , "any -" }, + { "+" , "any +" }, + { "return" , "any return" }, + { "keypad 0" , "any 0" }, + { "keypad 1" , "any 1" }, + { "keypad 2" , "any 2" }, + { "keypad 3" , "any 3" }, + { "keypad 4" , "any 4" }, + { "keypad 5" , "any 5" }, + { "keypad 6" , "any 6" }, + { "keypad 7" , "any 7" }, + { "keypad 8" , "any 8" }, + { "keypad 9" , "any 9" }, + { "keypad 9" , "any 9" }, + { "keypad /" , "any /" }, + { "keypad *" , "any *" }, + { "keypad -" , "any -" }, + { "keypad +" , "any +" }, + { "keypad enter" , "any return" } }; +static int keyGroupsCount = (int)(sizeof(keyGroups)/sizeof(*keyGroups)); + + int keyEventGetCount(KeyEvent mode) { return (int)mode >= 0 && (int)mode <= keyEventsCount ? keyEvents[mode].count : 0; } @@ -60,25 +110,82 @@ static int keyEventCheck(KeyEvent mode, const char *code) { return FALSE; } -static void keyEventAdd(KeyEvent mode, const char *code) { - if ((int)mode >= 0 && mode <= (int)keyEventsCount && !keyEventCheck(mode, code)) +static int keyEventAliasesCheck(KeyEvent mode, const char *code) { + if (keyEventCheck(mode, code)) return TRUE; + for(int i = 0; i < keyAliasesCount; ++i) + if (strcmp(code, keyAliases[i][0]) == 0) + if (keyEventCheck(mode, keyAliases[i][1])) return TRUE; + return FALSE; +} + +static int keyEventAdd(KeyEvent mode, const char *code) { + if ((int)mode >= 0 && mode <= (int)keyEventsCount && !keyEventCheck(mode, code)) { heliArrayInsert(&keyEvents[mode], -1, heliStringCopy(code), &free); + return TRUE; + } + return FALSE; } -static void keyEventRemove(KeyEvent mode, const char *code) { +static int keyEventRemove(KeyEvent mode, const char *code) { + int removed = FALSE; if ((int)mode >= 0 && mode <= (int)keyEventsCount) for(int i = keyEvents[mode].count-1; i >= 0; --i) if (strcmp(keyEvents[mode].items[i].value, code) == 0) - heliArrayRemove(&keyEvents[mode], i); + { heliArrayRemove(&keyEvents[mode], i); removed = TRUE; } + return removed; +} + +static void pressKey(int mouse, const char *code) { + keyEventAdd(mouse ? KEYEVENT_MOUSE_DOWN : KEYEVENT_KEY_DOWN, code); + keyEventAdd(mouse ? KEYEVENT_MOUSE_WENTDOWN : KEYEVENT_KEY_WENTDOWN, code); + if (!mouse) { + for(int i = 0; i < keyGroupsCount; ++i) { + if (strcmp(code, keyGroups[i][0]) == 0) { + keyEventAdd(KEYEVENT_KEY_DOWN, keyGroups[i][1]); + keyEventAdd(KEYEVENT_KEY_WENTDOWN, keyGroups[i][1]); + } + } + } } +static void releaseKey(int mouse, const char *code) { + if (!keyEventRemove(mouse ? KEYEVENT_MOUSE_DOWN : KEYEVENT_KEY_DOWN, code)) + return; + keyEventAdd(mouse ? KEYEVENT_MOUSE_WENTUP : KEYEVENT_KEY_WENTUP, code); + if (mouse) + return; + for(int i = 0; i < keyGroupsCount; ++i) { + if (strcmp(code, keyGroups[i][0]) != 0) continue; + int allRemoved = TRUE; + for(int j = 0; j < keyGroupsCount; ++j) + if (strcmp(keyGroups[i][1], keyGroups[j][1]) == 0 && keyEventCheck(KEYEVENT_KEY_DOWN, keyGroups[j][0])) + { allRemoved = FALSE; break; } + if (allRemoved) + if (keyEventRemove(KEYEVENT_KEY_DOWN, keyGroups[i][1])) + keyEventAdd(KEYEVENT_KEY_WENTUP, keyGroups[i][1]); + } +} + +static void releaseAllKeys() { + int count = keyEventGetCount(KEYEVENT_KEY_DOWN); + for(int i = count-1; i >= 0; --i) + keyEventAdd(KEYEVENT_KEY_WENTUP, keyEventGet(KEYEVENT_KEY_DOWN, i)); + heliArrayClear(&keyEvents[KEYEVENT_KEY_DOWN]); + count = keyEventGetCount(KEYEVENT_MOUSE_DOWN); + for(int i = count-1; i >= 0; --i) + keyEventAdd(KEYEVENT_MOUSE_WENTUP, keyEventGet(KEYEVENT_MOUSE_DOWN, i)); + heliArrayClear(&keyEvents[KEYEVENT_MOUSE_DOWN]); +} + + + int keyDown(const char *code) - { return keyEventCheck(KEYEVENT_KEY_DOWN, code); } + { return keyEventAliasesCheck(KEYEVENT_KEY_DOWN, code); } int keyWentDown(const char *code) - { return keyEventCheck(KEYEVENT_KEY_WENTDOWN, code); } + { return keyEventAliasesCheck(KEYEVENT_KEY_WENTDOWN, code); } int keyWentUp(const char *code) - { return keyEventCheck(KEYEVENT_KEY_WENTUP, code); } + { return keyEventAliasesCheck(KEYEVENT_KEY_WENTUP, code); } int mouseDidMove() { return mouseMovedInFrame; } @@ -412,15 +519,7 @@ static void handleEvent(SDL_Event *e) { height = e->window.data2; } else if (e->window.event == SDL_WINDOWEVENT_FOCUS_LOST) { - int count = keyEventGetCount(KEYEVENT_KEY_DOWN); - for(int i = 0; i < count; ++i) - keyEventAdd(KEYEVENT_KEY_WENTUP, keyEventGet(KEYEVENT_KEY_DOWN, i)); - heliArrayClear(&keyEvents[KEYEVENT_KEY_DOWN]); - - count = keyEventGetCount(KEYEVENT_MOUSE_DOWN); - for(int i = 0; i < count; ++i) - keyEventAdd(KEYEVENT_MOUSE_WENTUP, keyEventGet(KEYEVENT_MOUSE_DOWN, i)); - heliArrayClear(&keyEvents[KEYEVENT_MOUSE_DOWN]); + releaseAllKeys(); } } else if (e->type == SDL_KEYDOWN || e->type == SDL_KEYUP) { @@ -428,13 +527,8 @@ static void handleEvent(SDL_Event *e) { if (keynameOrig && *keynameOrig) { char *keyname = heliStringCopy(keynameOrig); heliLowercase(keyname); - if (e->type == SDL_KEYDOWN) { - keyEventAdd(KEYEVENT_KEY_DOWN, keyname); - keyEventAdd(KEYEVENT_KEY_WENTDOWN, keyname); - } else { - keyEventRemove(KEYEVENT_KEY_DOWN, keyname); - keyEventAdd(KEYEVENT_KEY_WENTUP, keyname); - } + if (e->type == SDL_KEYDOWN) + pressKey(FALSE, keyname); else releaseKey(FALSE, keyname); free(keyname); } } else @@ -447,13 +541,8 @@ static void handleEvent(SDL_Event *e) { default: break; } if (button) { - if (e->type == SDL_MOUSEBUTTONDOWN) { - keyEventAdd(KEYEVENT_MOUSE_DOWN, button); - keyEventAdd(KEYEVENT_MOUSE_WENTDOWN, button); - } else { - keyEventRemove(KEYEVENT_MOUSE_DOWN, button); - keyEventAdd(KEYEVENT_MOUSE_WENTUP, button); - } + if (e->type == SDL_MOUSEBUTTONDOWN) + pressKey(TRUE, button); else releaseKey(TRUE, button); } _mouseX = e->button.x; _mouseY = e->button.y; diff --git a/src/worldui.c b/src/worldui.c index 5577bf9..faf62a0 100644 --- a/src/worldui.c +++ b/src/worldui.c @@ -188,7 +188,7 @@ static void draw(HeliDialog *dialog) { textAlign(HALIGN_LEFT, VALIGN_TOP); TextLayout layout = createTextLayout(dialog->password ? dialog->passwordText : dialog->answer); - int shift = keyDown("left shift") || keyDown("right shift"); + int shift = keyDown("any shift"); if (keyWentDown("up")) { dialog->pos = textLayoutCursorUp(layout, dialog->pos); if (!shift) dialog->selPos = dialog->pos; @@ -278,8 +278,8 @@ static void draw(HeliDialog *dialog) { void heliDialogDraw(HeliDialog *dialog) { if (dialog->newText[0]) insert(dialog, dialog->newText); - int shift = keyDown("left shift") || keyDown("right shift"); - int ctrl = keyDown("left ctrl") || keyDown("right ctrl"); + int shift = keyDown("any shift"); + int ctrl = keyDown("any ctrl"); if (keyWentDown("backspace")) { if (dialog->pos == dialog->selPos) { diff --git a/win/rebuild-heli-win.sh b/win/rebuild-heli-win.sh index 7031d64..dd0bbfc 100755 --- a/win/rebuild-heli-win.sh +++ b/win/rebuild-heli-win.sh @@ -2,6 +2,9 @@ set -e +ROOT="$(cd `dirname "$0"`; pwd)" +cd "$ROOT" + rm -f build*/helianthus.done build*/demo.done ./build-win.sh