⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hotkey.c

📁 一个很有名的浏览器
💻 C
字号:
/* Hotkeys handling. *//* $Id: hotkey.c,v 1.30 2004/08/13 20:54:42 jonas Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <string.h>#include "elinks.h"#include "bfu/hotkey.h"#include "bfu/menu.h"#include "config/kbdbind.h"#include "intl/gettext/libintl.h"#include "terminal/draw.h"#include "terminal/terminal.h"#include "terminal/window.h"#include "util/conv.h"#include "util/memory.h"/* Return position (starting at 1) of the first tilde in text, * or 0 if not found. */static inline intfind_hotkey_pos(unsigned char *text){	if (text && *text) {		unsigned char *p = strchr(text, '~');		if (p) return (int) (p - text) + 1;	}	return 0;}voidinit_hotkeys(struct terminal *term, struct menu *menu){	struct menu_item *mi;#ifdef CONFIG_DEBUG	/* hotkey debugging */	if (menu->hotkeys) {		struct menu_item *used_hotkeys[255];		memset(used_hotkeys, 0, sizeof(used_hotkeys));		foreach_menu_item(mi, menu->items) {			unsigned char *text = mi->text;			if (!mi_has_left_text(mi)) continue;			if (mi_text_translate(mi)) text = _(text, term);			if (!*text) continue;			if (mi->hotkey_state != HKS_CACHED && !mi->hotkey_pos)				mi->hotkey_pos = find_hotkey_pos(text);			/* Negative value for hotkey_pos means the key is already			 * used by another entry. We mark it to be able to highlight			 * this hotkey in menus. --Zas */			if (mi->hotkey_pos) {				struct menu_item **used = &used_hotkeys[toupper(text[mi->hotkey_pos])];				if (*used) {					mi->hotkey_pos = -mi->hotkey_pos;					if ((*used)->hotkey_pos > 0)						(*used)->hotkey_pos = -(*used)->hotkey_pos;				}				*used = mi;				mi->hotkey_state = HKS_CACHED;			}		}	}#endif	foreach_menu_item(mi, menu->items) {		if (!menu->hotkeys) {			mi->hotkey_pos = 0;			mi->hotkey_state = HKS_IGNORE;		} else if (mi->hotkey_state != HKS_CACHED			   && !mi->hotkey_pos) {			unsigned char *text = mi->text;			if (!mi_has_left_text(mi)) continue;			if (mi_text_translate(mi)) text = _(text, term);			if (!*text) continue;			mi->hotkey_pos = find_hotkey_pos(text);			if (mi->hotkey_pos)				mi->hotkey_state = HKS_CACHED;		}	}}#ifdef ENABLE_NLSvoidclear_hotkeys_cache(struct menu *menu){	struct menu_item *item;	foreach_menu_item(item, menu->items) {		item->hotkey_state = menu->hotkeys ? HKS_SHOW : HKS_IGNORE;		item->hotkey_pos = 0;	}}#endifvoidrefresh_hotkeys(struct terminal *term, struct menu *menu){#ifdef ENABLE_NLS 	if (current_language != menu->lang) {		clear_hotkeys_cache(menu);		init_hotkeys(term, menu);		menu->lang = current_language;	}#else	init_hotkeys(term, menu);#endif}/* Returns true if key (upcased) matches one of the hotkeys in menu */static intis_hotkey(struct menu_item *item, unsigned char key, struct terminal *term){	unsigned char *text;	int key_pos;	assert(item);	if_assert_failed return 0;	if (!mi_has_left_text(item)) return 0;	text = item->text;	if (mi_text_translate(item)) text = _(text, term);	if (!text || !*text) return 0;	key_pos = item->hotkey_pos;#ifdef CONFIG_DEBUG	if (key_pos < 0) key_pos = -key_pos;#endif	return (key_pos && (toupper(text[key_pos]) == key));}/* Returns true if key (upcased) matches first letter of menu item left text. */static intis_not_so_hotkey(struct menu_item *item, unsigned char key, struct terminal *term){	unsigned char *text;	assert(item);	if_assert_failed return 0;	if (!mi_has_left_text(item)) return 0;	text = item->text;	if (mi_text_translate(item)) text = _(text, term);	if (!text || !*text) return 0;	return (toupper(*text) == key);}static intcheck_hotkeys_common(struct menu *menu, unsigned char hotkey, struct terminal *term,		     int (*func)(struct menu_item *, unsigned char, struct terminal *)){	unsigned char key = toupper(hotkey);	int i = menu->selected;	int start;	if (menu->size < 1) return 0;	i %= menu->size;	if (i < 0) i += menu->size;	start = i;	do {		if (++i == menu->size) i = 0;		if (func(&menu->items[i], key, term)) {			menu->selected = i;			return 1;		}	} while (i != start);	return 0;}/* Returns true if a hotkey was found in the menu, and set menu->selected. */intcheck_hotkeys(struct menu *menu, unsigned char key, struct terminal *term){	return check_hotkeys_common(menu, key, term, is_hotkey);}/* Search if first letter of an entry in menu matches the key (caseless comp.). * It searchs in all entries, from selected entry to bottom and then from top * to selected entry. * It returns 1 if found and set menu->selected. */intcheck_not_so_hot_keys(struct menu *menu, unsigned char key, struct terminal *term){	return check_hotkeys_common(menu, key, term, is_not_so_hotkey);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -