diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/keyevents.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/keyevents.c b/src/keyevents.c index 4c90a03..8e66521 100644 --- a/src/keyevents.c +++ b/src/keyevents.c @@ -40,7 +40,36 @@ static void feh_set_kb(fehkey *key, int s0, int y0, int s1, int y1, int s2, int key->keysyms[2] = y2; } +static void feh_set_parse_kb_partial(fehkey *key, int index, char *ks) { + char *cur = ks; + int mod = 0; + + if (!*ks) + return; + + if (ks[1] == '-') { + switch (ks[0]) { + case 'C': + mod = ControlMask; + break; + default: + break; + } + cur = ks + 2; + } + + key->keysyms[index] = XStringToKeysym(cur); + key->keystates[index] = mod; +} + void init_keyevents(void) { + char *home, *confpath; + char line[128]; + char action[32], k1[32], k2[32], k3[32]; + fehkb *cur_kb = NULL; + FILE *conf = NULL; + int read = 0; + memset(&keys, 0, sizeof(keys)); feh_set_kb(&keys.move_right, 0, XK_KP_Left , 4, XK_Left , 0, 0); @@ -88,6 +117,128 @@ void init_keyevents(void) { feh_set_kb(&keys.orient_3, 0, XK_less, 0, 0, 0, 0); feh_set_kb(&keys.reload_minus, 0, XK_minus, 0, 0, 0, 0); feh_set_kb(&keys.reload_plus, 0, XK_plus, 0, 0, 0, 0); + + home = getenv("HOME"); + if (!home) + eprintf("No HOME in environment\n"); + + confpath = estrjoin("/", home, ".config/feh/keys", NULL); + conf = fopen(confpath, "r"); + + if (!conf) + return; + + while (fgets(line, sizeof(line), conf)) { + *action = '\0'; + *k1 = '\0'; + *k2 = '\0'; + *k3 = '\0'; + + read = sscanf(line, "%31s %31s %31s %31s\n", + (char *) &action, (char *) &k1, (char* ) &k2, (char *) &k3); + + if ((read == EOF) || (read < 2)) + continue; + + if (!strcmp(action, "move_right")) + cur_kb = &keys.move_right; + else if (!strcmp(action, "move_left")) + cur_kb = &keys.move_left; + else if (!strcmp(action, "move_up")) + cur_kb = &keys.move_up; + else if (!strcmp(action, "move_down")) + cur_kb = &keys.move_down; + else if (!strcmp(action, "prev_img")) + cur_kb = &keys.prev_img; + else if (!strcmp(action, "next_img")) + cur_kb = &keys.next_img; + else if (!strcmp(action, "jump_back")) + cur_kb = &keys.jump_back; + else if (!strcmp(action, "jump_fwd")) + cur_kb = &keys.jump_fwd; + else if (!strcmp(action, "jump_random")) + cur_kb = &keys.jump_random; + else if (!strcmp(action, "quit")) + cur_kb = &keys.quit; + else if (!strcmp(action, "close")) + cur_kb = &keys.close; + else if (!strcmp(action, "remove")) + cur_kb = &keys.remove; + else if (!strcmp(action, "delete")) + cur_kb = &keys.delete; + else if (!strcmp(action, "jump_first")) + cur_kb = &keys.jump_first; + else if (!strcmp(action, "jump_last")) + cur_kb = &keys.jump_last; + else if (!strcmp(action, "action_0")) + cur_kb = &keys.action_0; + else if (!strcmp(action, "action_1")) + cur_kb = &keys.action_1; + else if (!strcmp(action, "action_2")) + cur_kb = &keys.action_2; + else if (!strcmp(action, "action_3")) + cur_kb = &keys.action_3; + else if (!strcmp(action, "action_4")) + cur_kb = &keys.action_4; + else if (!strcmp(action, "action_5")) + cur_kb = &keys.action_5; + else if (!strcmp(action, "action_6")) + cur_kb = &keys.action_6; + else if (!strcmp(action, "action_7")) + cur_kb = &keys.action_7; + else if (!strcmp(action, "action_8")) + cur_kb = &keys.action_8; + else if (!strcmp(action, "action_9")) + cur_kb = &keys.action_9; + else if (!strcmp(action, "zoom_in")) + cur_kb = &keys.zoom_in; + else if (!strcmp(action, "zoom_out")) + cur_kb = &keys.zoom_out; + else if (!strcmp(action, "zoom_default")) + cur_kb = &keys.zoom_default; + else if (!strcmp(action, "zoom_fit")) + cur_kb = &keys.zoom_fit; + else if (!strcmp(action, "size_to_image")) + cur_kb = &keys.size_to_image; + else if (!strcmp(action, "render")) + cur_kb = &keys.render; + else if (!strcmp(action, "toggle_actions")) + cur_kb = &keys.toggle_actions; + else if (!strcmp(action, "toggle_filenames")) + cur_kb = &keys.toggle_filenames; + else if (!strcmp(action, "toggle_pointer")) + cur_kb = &keys.toggle_pointer; + else if (!strcmp(action, "toggle_caption")) + cur_kb = &keys.toggle_caption; + else if (!strcmp(action, "toggle_pause")) + cur_kb = &keys.toggle_pause; + else if (!strcmp(action, "toggle_menu")) + cur_kb = &keys.toggle_menu; + else if (!strcmp(action, "toggle_fullscreen")) + cur_kb = &keys.toggle_fullscreen; + else if (!strcmp(action, "reload_image")) + cur_kb = &keys.reload_image; + else if (!strcmp(action, "save_image")) + cur_kb = &keys.save_image; + else if (!strcmp(action, "save_filelist")) + cur_kb = &keys.save_filelist; + else if (!strcmp(action, "orient_1")) + cur_kb = &keys.orient_1; + else if (!strcmp(action, "orient_3")) + cur_kb = &keys.orient_3; + else if (!strcmp(action, "reload_minus")) + cur_kb = &keys.reload_minus; + else if (!strcmp(action, "reload_plus")) + cur_kb = &keys.reload_plus; + + if (cur_kb) { + feh_set_parse_kb_partial(cur_kb, 0, k1); + feh_set_parse_kb_partial(cur_kb, 1, k2); + feh_set_parse_kb_partial(cur_kb, 2, k3); + } + } + fclose(conf); + free(confpath); } static short feh_is_kp(fehkey *key, int sym, int state) { |