Commit 699a470e authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Read ~/.config/feh/keys for keybindings. prev/next are even tested!

parent 2230c2e5
Loading
Loading
Loading
Loading
+151 −0
Original line number Diff line number Diff line
@@ -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) {