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

📄 keybinding.c

📁 elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, elinks也是gentoo安装过程中默认使用的浏览器, 这是elinks源代码
💻 C
字号:
/* "elinks.keymaps" */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "elinks.h"#include "config/kbdbind.h"#include "ecmascript/spidermonkey/util.h"#include "main/event.h"#include "scripting/smjs/core.h"#include "scripting/smjs/elinks_object.h"#include "util/memory.h"static JSBoolkeymap_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){	unsigned char *action_str;	unsigned char *keystroke_str;	int *data = JS_GetPrivate(ctx, obj);	enum keymap_id keymap_id = *data;	keystroke_str = JS_GetStringBytes(JS_ValueToString(ctx, id));	if (!keystroke_str) goto ret_null;	action_str = get_action_name_from_keystroke(keymap_id, keystroke_str);	if (!action_str) goto ret_null;	*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(ctx, action_str));	return JS_TRUE;ret_null:	*vp = JSVAL_NULL;	return JS_TRUE;}static enum evhook_statussmjs_keybinding_action_callback(va_list ap, void *data){	jsval rval;	struct session *ses = va_arg(ap, struct session *);	JSObject *jsobj = data;	JSFunction *func = JS_ValueToFunction(smjs_ctx, OBJECT_TO_JSVAL(jsobj));	evhook_use_params(ses);	assert(func);	smjs_ses = ses;	JS_CallFunction(smjs_ctx, NULL, func, 0, NULL, &rval);	smjs_ses = NULL;	return EVENT_HOOK_STATUS_LAST;}static JSBoolkeymap_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){	int *data = JS_GetPrivate(ctx, obj);	enum keymap_id keymap_id = *data;	unsigned char *keymap_str;	unsigned char *keystroke_str;	/* Ugly fact: we need to get the string from the id to give to bind_do,	 * which will of course then convert the string back to an id... */	keymap_str = get_keymap_name(keymap_id);	if (!keymap_str) return JS_FALSE;	keystroke_str = JS_GetStringBytes(JS_ValueToString(ctx, id));	if (!keystroke_str) return JS_FALSE;	if (JSVAL_IS_STRING(*vp)) {		unsigned char *action_str;		action_str = JS_GetStringBytes(JS_ValueToString(ctx, *vp));		if (!action_str) return JS_FALSE;		if (bind_do(keymap_str, keystroke_str, action_str, 0))			return JS_FALSE;		return JS_TRUE;	} else if (JSVAL_IS_OBJECT(*vp)) {		unsigned char *err = NULL;		int event_id;		struct string event_name = NULL_STRING;		JSObject *jsobj = JSVAL_TO_OBJECT(*vp);				if (JS_FALSE == JS_ObjectIsFunction(ctx, jsobj))			return JS_FALSE;		if (!init_string(&event_name)) return JS_FALSE;		add_format_to_string(&event_name, "smjs-run-func %p", jsobj);		event_id = bind_key_to_event_name(keymap_str,						  keystroke_str,						  event_name.source, &err);		done_string(&event_name);		if (err) {			alert_smjs_error(err);			return JS_FALSE;		}		event_id = register_event_hook(event_id,		                               smjs_keybinding_action_callback,		                               0, (void *) jsobj);		if (event_id == EVENT_NONE) {			alert_smjs_error("error registering event hook"			                 " for keybinding");			return JS_FALSE;		}		return JS_TRUE;	}	return JS_TRUE;}static voidkeymap_finalize(JSContext *ctx, JSObject *obj){	void *data = JS_GetPrivate(ctx, obj);	mem_free(data);}static const JSClass keymap_class = {	"keymap",	JSCLASS_HAS_PRIVATE,	JS_PropertyStub, JS_PropertyStub,	keymap_get_property, keymap_set_property,	JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, keymap_finalize,};static JSObject *smjs_get_keymap_object(enum keymap_id keymap_id){	int *data;	JSObject *keymap_object;			assert(smjs_ctx);	keymap_object = JS_NewObject(smjs_ctx, (JSClass *) &keymap_class,	                             NULL, NULL);	if (!keymap_object) return NULL;	data = intdup(keymap_id);	if (!data) return NULL;	if (JS_TRUE == JS_SetPrivate(smjs_ctx, keymap_object, data))		return keymap_object;	mem_free(data);	return NULL;}static const JSClass keymaps_hash_class = {	"keymaps_hash",	JSCLASS_HAS_PRIVATE,	JS_PropertyStub, JS_PropertyStub,	JS_PropertyStub, JS_PropertyStub,	JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,};static JSObject *smjs_get_keymap_hash_object(void){	jsval val;	enum keymap_id keymap_id;	JSObject *keymaps_hash;		keymaps_hash = JS_NewObject(smjs_ctx, (JSClass *) &keymaps_hash_class,	                            NULL, NULL);	if (!keymaps_hash) return NULL;	for (keymap_id = 0; keymap_id < KEYMAP_MAX; ++keymap_id) {		unsigned char *keymap_str = get_keymap_name(keymap_id);		JSObject *map = smjs_get_keymap_object(keymap_id);		assert(keymap_str);		if (!map) return NULL;		val = OBJECT_TO_JSVAL(map);		JS_SetProperty(smjs_ctx, keymaps_hash, keymap_str, &val);	}	return keymaps_hash;}voidsmjs_init_keybinding_interface(void){	jsval val;	struct JSObject *keymaps_hash;	if (!smjs_ctx || !smjs_elinks_object)		return;	keymaps_hash = smjs_get_keymap_hash_object();	if (!keymaps_hash) return;	val = OBJECT_TO_JSVAL(keymaps_hash);	JS_SetProperty(smjs_ctx, smjs_elinks_object, "keymaps", &val);}

⌨️ 快捷键说明

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