コード例 #1
0
ファイル: keys.c プロジェクト: acklinr/tig
/* Looks for a key binding first in the given keymap, then in the generic keymap. */
enum request
get_keybinding(const struct keymap *keymap, const struct key key[], size_t keys, int *matches)
{
	enum request request = get_keybinding_in_keymap(keymap, key, keys, matches);

	if (!is_search_keymap(keymap)) {
		int generic_matches = 0;
		enum request generic_request = get_keybinding_in_keymap(generic_keymap, key, keys, &generic_matches);

		/* Include generic matches iff there are more than one
		 * so unbound keys in the current keymap still override
		 * generic keys while still ensuring that the key combo
		 * handler continues to wait for more keys if there is
		 * another possible match. E.g. while in `main` view:
		 *
		 *   bind generic q  quit  # 'q' will quit
		 *   bind main    q  none  # 'q' will do nothing
		 *   bind generic qa quit  # 'qa' will quit
		 *   bind main    qn next  # 'qn' will move to next entry
		 */
		if (matches && (request == REQ_UNKNOWN || generic_matches > 1))
			(*matches) += generic_matches;
		if (request == REQ_UNKNOWN)
			request = generic_request;
	}

	return request == REQ_NONE ? REQ_UNKNOWN : request;
}
コード例 #2
0
ファイル: keys.c プロジェクト: ChunHungLiu/tig
/* Looks for a key binding first in the given map, then in the generic map, and
 * lastly in the default keybindings. */
enum request
get_keybinding(const struct keymap *keymap, const struct key key[], size_t keys, int *matches)
{
	enum request request = REQ_UNKNOWN;
	size_t i;

	for (i = 0; i < keymap->size; i++)
		if (keybinding_matches(keymap->data[i], key, keys, NULL)) {
			if (matches)
				(*matches)++;
			if (keymap->data[i]->keys == keys)
				request = keymap->data[i]->request;
		}

	if (is_search_keymap(keymap))
		return request;

	for (i = 0; i < generic_keymap->size; i++)
		if (keybinding_matches(generic_keymap->data[i], key, keys, NULL)) {
			if (matches)
				(*matches)++;
			if (request == REQ_UNKNOWN && generic_keymap->data[i]->keys == keys)
				request = generic_keymap->data[i]->request;
		}

	return request;
}