aboutsummaryrefslogtreecommitdiff
path: root/src/hotkey.c
diff options
context:
space:
mode:
authorkoekeishiya <aasvi93@hotmail.com>2017-08-08 13:56:57 +0200
committerkoekeishiya <aasvi93@hotmail.com>2017-08-08 13:56:57 +0200
commita58d0c8980560bde4c2ab6635584ed830fd06eed (patch)
treee5ba46f1c93d4e56ae8c6787e053ce0e0dea99fb /src/hotkey.c
parent03b74b16c003137e123032ea70f392533ce87355 (diff)
downloadskhd-a58d0c8980560bde4c2ab6635584ed830fd06eed.tar.gz
skhd-a58d0c8980560bde4c2ab6635584ed830fd06eed.zip
linked list -> hashmap; optimizations
Diffstat (limited to 'src/hotkey.c')
-rw-r--r--src/hotkey.c83
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;
}