diff options
author | koekeishiya <aasvi93@hotmail.com> | 2017-08-08 13:56:57 +0200 |
---|---|---|
committer | koekeishiya <aasvi93@hotmail.com> | 2017-08-08 13:56:57 +0200 |
commit | a58d0c8980560bde4c2ab6635584ed830fd06eed (patch) | |
tree | e5ba46f1c93d4e56ae8c6787e053ce0e0dea99fb /src/hotkey.c | |
parent | 03b74b16c003137e123032ea70f392533ce87355 (diff) | |
download | skhd-a58d0c8980560bde4c2ab6635584ed830fd06eed.tar.gz skhd-a58d0c8980560bde4c2ab6635584ed830fd06eed.zip |
linked list -> hashmap; optimizations
Diffstat (limited to 'src/hotkey.c')
-rw-r--r-- | src/hotkey.c | 83 |
1 files changed, 35 insertions, 48 deletions
diff --git a/src/hotkey.c b/src/hotkey.c index d34d9a0..1267ea3 100644 --- a/src/hotkey.c +++ b/src/hotkey.c @@ -9,7 +9,7 @@ #define local_persist static internal bool -execute_hotkey(struct hotkey *hotkey) +fork_and_exec(char *command) { local_persist char arg[] = "-c"; local_persist char *shell = NULL; @@ -22,7 +22,7 @@ execute_hotkey(struct hotkey *hotkey) int cpid = fork(); if(cpid == 0) { - char *exec[] = { shell, arg, hotkey->command, NULL}; + char *exec[] = { shell, arg, command, NULL}; int status_code = execvp(exec[0], exec); exit(status_code); } @@ -100,87 +100,74 @@ same_hotkey(struct hotkey *a, struct hotkey *b) return false; } -internal bool -find_hotkey(struct hotkey *seek, struct hotkey **result, struct hotkey *hotkeys) +unsigned long +hash_hotkey(struct hotkey *a) { - struct hotkey *hotkey = hotkeys; - while(hotkey) { - if(same_hotkey(hotkey, seek)) { - *result = hotkey; - return true; - } + return a->key; +} - hotkey = hotkey->next; +bool find_and_exec_hotkey(struct hotkey *eventkey, struct table *hotkey_map) +{ + bool result = false; + struct hotkey *hotkey; + if((hotkey = table_find(hotkey_map, eventkey))) { + if(fork_and_exec(hotkey->command)) { + result = has_flags(hotkey, Hotkey_Flag_Passthrough) ? false : true; + } } - - return false; + return result; } -void free_hotkeys(struct hotkey *hotkeys) +void free_hotkeys(struct table *hotkey_map) { - struct hotkey *next, *hotkey = hotkeys; - while(hotkey) { - next = hotkey->next; + int count; + void **hotkeys = table_reset(hotkey_map, &count); + for(int index = 0; index < count; ++index) { + struct hotkey *hotkey = (struct hotkey *) hotkeys[index]; free(hotkey->command); free(hotkey); - hotkey = next; } -} -bool find_and_exec_hotkey(struct hotkey *eventkey, struct hotkey *hotkeys) -{ - bool result = false; - struct hotkey *hotkey = NULL; - if(find_hotkey(eventkey, &hotkey, hotkeys)) { - if(execute_hotkey(hotkey)) { - result = has_flags(hotkey, Hotkey_Flag_Passthrough) ? false : true; - } + if(count) { + free(hotkeys); } - - return result; } -struct hotkey -cgevent_to_hotkey(CGEventFlags flags, uint32_t key) +void cgeventflags_to_hotkeyflags(CGEventFlags flags, struct hotkey *eventkey) { - struct hotkey eventkey = {}; - eventkey.key = key; - if((flags & Event_Mask_Cmd) == Event_Mask_Cmd) { bool left = (flags & Event_Mask_LCmd) == Event_Mask_LCmd; bool right = (flags & Event_Mask_RCmd) == Event_Mask_RCmd; - if(left) add_flags(&eventkey, Hotkey_Flag_LCmd); - if(right) add_flags(&eventkey, Hotkey_Flag_RCmd); - if(!left && !right) add_flags(&eventkey, Hotkey_Flag_Cmd); + if(left) add_flags(eventkey, Hotkey_Flag_LCmd); + if(right) add_flags(eventkey, Hotkey_Flag_RCmd); + if(!left && !right) add_flags(eventkey, Hotkey_Flag_Cmd); } if((flags & Event_Mask_Shift) == Event_Mask_Shift) { bool left = (flags & Event_Mask_LShift) == Event_Mask_LShift; bool right = (flags & Event_Mask_RShift) == Event_Mask_RShift; - if(left) add_flags(&eventkey, Hotkey_Flag_LShift); - if(right) add_flags(&eventkey, Hotkey_Flag_RShift); - if(!left && !right) add_flags(&eventkey, Hotkey_Flag_Shift); + if(left) add_flags(eventkey, Hotkey_Flag_LShift); + if(right) add_flags(eventkey, Hotkey_Flag_RShift); + if(!left && !right) add_flags(eventkey, Hotkey_Flag_Shift); } if((flags & Event_Mask_Alt) == Event_Mask_Alt) { bool left = (flags & Event_Mask_LAlt) == Event_Mask_LAlt; bool right = (flags & Event_Mask_RAlt) == Event_Mask_RAlt; - if(left) add_flags(&eventkey, Hotkey_Flag_LAlt); - if(right) add_flags(&eventkey, Hotkey_Flag_RAlt); - if(!left && !right) add_flags(&eventkey, Hotkey_Flag_Alt); + if(left) add_flags(eventkey, Hotkey_Flag_LAlt); + if(right) add_flags(eventkey, Hotkey_Flag_RAlt); + if(!left && !right) add_flags(eventkey, Hotkey_Flag_Alt); } if((flags & Event_Mask_Control) == Event_Mask_Control) { bool left = (flags & Event_Mask_LControl) == Event_Mask_LControl; bool right = (flags & Event_Mask_RControl) == Event_Mask_RControl; - if(left) add_flags(&eventkey, Hotkey_Flag_LControl); - if(right) add_flags(&eventkey, Hotkey_Flag_RControl); - if(!left && !right) add_flags(&eventkey, Hotkey_Flag_Control); + if(left) add_flags(eventkey, Hotkey_Flag_LControl); + if(right) add_flags(eventkey, Hotkey_Flag_RControl); + if(!left && !right) add_flags(eventkey, Hotkey_Flag_Control); } - - return eventkey; } |