diff options
| author | Michał Cichoń <michcic@gmail.com> | 2019-05-03 17:02:47 +0200 | 
|---|---|---|
| committer | Michał Cichoń <michcic@gmail.com> | 2019-05-03 17:02:47 +0200 | 
| commit | eaa10a3950ccd8fa2a5acada4c82d6627b6214f7 (patch) | |
| tree | 3012531b45cfbaba4b4c0c66e157ad20795e54ee /src/hotkey.c | |
| parent | cb6789b17f81d29c6884c27715c705083e09a5db (diff) | |
| parent | c4b80765185944a5b89f3cc76568ba498bf5f3f4 (diff) | |
| download | pianobar-windows-eaa10a3950ccd8fa2a5acada4c82d6627b6214f7.tar.gz pianobar-windows-eaa10a3950ccd8fa2a5acada4c82d6627b6214f7.tar.bz2 pianobar-windows-eaa10a3950ccd8fa2a5acada4c82d6627b6214f7.zip | |
Merge branch 'release/2019.05.03'2019.05.03
Add support for hotkeys. #20
Hotkeys can be assigned to action in configuration file ex:
hk_<action_name> = g + shift + alt + ctrl
Diffstat (limited to 'src/hotkey.c')
| -rw-r--r-- | src/hotkey.c | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/src/hotkey.c b/src/hotkey.c new file mode 100644 index 0000000..b630b88 --- /dev/null +++ b/src/hotkey.c @@ -0,0 +1,113 @@ +/* +Copyright (c) 2019 +    Micha³ Cichoñ <thedmd@interia.pl> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "hotkey.h" +#include <stdio.h> +#include <stdbool.h> +#include <fcntl.h> +#include <io.h> +#include <windows.h> + +static BarHotKey_t* g_HotKeys = NULL; +static int g_HotKeyCapacity = 0; +static int g_HotKeyCount = 0; + +void BarHotKeyInit () +{ +} + +void BarHotKeyDestroy () +{ +} + +void BarHotKeyPool (BarHotKeyHandler handler, void * userData) +{ +    MSG msg = {0}; +    while (PeekMessage(&msg, NULL, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) != 0) +    { +        int id = (int)msg.wParam; +        if (id < 0) +            continue; + +        handler(id, userData); +    } +} + +bool BarHotKeyRegister (BarHotKey_t hk) +{ +    UINT modifiers = 0; +    SHORT mappedVirtualKey = VkKeyScanA(tolower(hk.key)); +    BYTE keyCode = LOBYTE(mappedVirtualKey); +    if (keyCode == 0) +        return false; + +    if (hk.mods & BAR_HK_MOD_SHIFT) +        modifiers |= MOD_SHIFT; +    if (hk.mods & BAR_HK_MOD_ALT) +        modifiers |= MOD_ALT; +    if (hk.mods & BAR_HK_MOD_CTRL) +        modifiers |= MOD_CONTROL; +    if (hk.mods & BAR_HK_MOD_WIN) +        modifiers |= MOD_WIN; + +    modifiers |= /*MOD_NOREPEAT*/0x4000; + +    return RegisterHotKey(NULL, hk.id, modifiers, keyCode); +} + +void BarHotKeyUnregister (int id) +{ +    UnregisterHotKey(NULL, id); +} + +bool BarHotKeyParse (BarHotKey_t* result, const char *value) +{ +    BarHotKey_t parsed = { 0 }; +    const char* p = value; +    size_t s = 0; + +    while ((s = strcspn(p, " +")) > 0) +    { +        if ((s == 4 && strnicmp(p, "ctrl", 4) == 0) || (s == 7 && strnicmp(p, "control", 7) == 0)) +            parsed.mods |= BAR_HK_MOD_CTRL; +        else if ((s == 5 && strnicmp(p, "shift", 5) == 0)) +            parsed.mods |= BAR_HK_MOD_SHIFT; +        else if ((s == 3 && strnicmp(p, "alt", 3) == 0)) +            parsed.mods |= BAR_HK_MOD_ALT; +        else if (s == 1) +            parsed.key = *p; +        else +            return false; + +        p += s; +        p += strspn(p, " +"); +    } + +    if (parsed.key == 0) +        return false; + +    result->key = parsed.key; +    result->mods = parsed.mods; + +    return true; +}
\ No newline at end of file | 
