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

📄 key_class.c

📁 flirt 一款纯c的flash解码程序。
💻 C
字号:
/*
 Flirt, an SWF rendering library
 Copyright (c) 2004-2006 Dave Hayden <dave@opaque.net>
 All rights reserved.
 
 http://www.opaque.net/flirt/

 This code is distributed under the two-clause BSD license.
 Read the LICENSE file or visit the URL above for details
*/

/*
 BACKSPACE
 CAPSLOCK
 CONTROL
 DELETEKEY
 DOWN
 END
 ENTER
 ESCAPE
 HOME
 INSERT
 LEFT
 PGDN
 PGUP
 RIGHT
 SHIFT
 SPACE
 TAB
 UP

 getAscii
 getCode
 isDown
 isToggled
 addListener(obj) - calls back to obj.onKeyDown, obj.onKeyUp
 removeListener(obj)
 */

#include <string.h>

#include "key_class.h"

#ifdef DD_PLATFORM_MAC_OS_X
#include <Carbon/Carbon.h>
#endif

static ddActionValue
Key_isDown(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionValue val = ddActionContext_popValue(context);
	int keycode = ddActionValue_getIntValue(val);
	boolean isDown = DD_FALSE;

#ifdef DD_PLATFORM_MAC_OS_X
	KeyMap map;
	GetKeys(map);

	if ( --keycode < 128 )
	{
		unsigned long mask = map[keycode / 32];
		keycode %= 32;
		isDown = ((mask & (1 << (31 - (keycode % 32)))) != 0);
	}
#endif

	return isDown ? ddTrueValue : ddFalseValue;
}


static ddActionValue
Key_getAscii(ddActionObject* object, ddActionContext* context, int nargs)
{
	UInt8 key = 0;

#ifdef DD_PLATFORM_MAC_OS_X
	key = LMGetKbdLast();
#endif

	return dd_newActionValue_int(key);
}


static ddActionValue
Key_getCode(ddActionObject* object, ddActionContext* context, int nargs)
{
	UInt8 key = 0;

#ifdef DD_PLATFORM_MAC_OS_X
	key = LMGetKbdLast();
#endif
	
	return dd_newActionValue_int(key);
}


static ddActionValue
Key_isToggled(ddActionObject* object, ddActionContext* context, int nargs)
{
	// XXX
	return ddFalseValue;
}


static ddActionValue
Key_addListener(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionKeyObject* key = (ddActionKeyObject*)object;
	ddActionValue val = ddActionContext_popValue(context);
	
	if ( val.type == VALUE_OBJECT )
	{
		// XXX - look for empty slot, also avoid duplicates
		
		key->listeners = dd_realloc(key->listeners, (key->nListeners + 1) * sizeof(ddActionObject*));
		key->listeners[key->nListeners] = ddActionValue_getObjectValue(val);
	}
	
	return ddNullValue;
}


static ddActionValue
Key_removeListener(ddActionObject* object, ddActionContext* context, int nargs)
{
	ddActionKeyObject* key = (ddActionKeyObject*)object;
	ddActionValue val = ddActionContext_popValue(context);
	ddActionObject* obj;
	int i;

	if ( val.type != VALUE_OBJECT )
		return ddNullValue;

	obj = val.data.objectValue;

	for ( i = 0; i < key->nListeners; ++i )
	{
		if ( key->listeners[i] == obj )
			key->listeners[i] = NULL;

		ddActionObject_release(obj);
	}

	return ddNullValue;
}


ddActionKeyObject*
dd_initKeyObject()
{
	ddActionKeyObject* key = dd_malloc(sizeof(ddActionKeyObject));
	ddActionObject* obj = (ddActionObject*)key;

	ddActionObject_init(obj);

	key->nListeners = 0;
	key->listeners = NULL;
	
	ddActionObject_addNativeMethod(obj, strdup("getAscii"), Key_getAscii, 1);
	ddActionObject_addNativeMethod(obj, strdup("getCode"), Key_getCode, 1);
	ddActionObject_addNativeMethod(obj, strdup("isDown"), Key_isDown, 1);
	ddActionObject_addNativeMethod(obj, strdup("isToggled"), Key_isToggled, 1);
	ddActionObject_addNativeMethod(obj, strdup("addListener"), Key_addListener, 1);
	ddActionObject_addNativeMethod(obj, strdup("removeListener"), Key_removeListener, 1);

	ddActionHash_setValue(obj->properties, strdup("BACKSPACE"), dd_newActionValue_int(KEY_BACKSPACE));
	ddActionHash_setValue(obj->properties, strdup("CAPSLOCK"), dd_newActionValue_int(KEY_CAPSLOCK));
	ddActionHash_setValue(obj->properties, strdup("CONTROL"), dd_newActionValue_int(KEY_CONTROL));
	ddActionHash_setValue(obj->properties, strdup("DELETEKEY"), dd_newActionValue_int(KEY_DELETEKEY));
	ddActionHash_setValue(obj->properties, strdup("DOWN"), dd_newActionValue_int(KEY_DOWN));
	ddActionHash_setValue(obj->properties, strdup("END"), dd_newActionValue_int(KEY_END));
	ddActionHash_setValue(obj->properties, strdup("ENTER"), dd_newActionValue_int(KEY_ENTER));
	ddActionHash_setValue(obj->properties, strdup("ESCAPE"), dd_newActionValue_int(KEY_ESCAPE));
	ddActionHash_setValue(obj->properties, strdup("HOME"), dd_newActionValue_int(KEY_HOME));
	ddActionHash_setValue(obj->properties, strdup("INSERT"), dd_newActionValue_int(KEY_INSERT));
	ddActionHash_setValue(obj->properties, strdup("LEFT"), dd_newActionValue_int(KEY_LEFT));
	ddActionHash_setValue(obj->properties, strdup("PGDN"), dd_newActionValue_int(KEY_PGDN));
	ddActionHash_setValue(obj->properties, strdup("PGUP"), dd_newActionValue_int(KEY_PGUP));
	ddActionHash_setValue(obj->properties, strdup("RIGHT"), dd_newActionValue_int(KEY_RIGHT));
	ddActionHash_setValue(obj->properties, strdup("SHIFT"), dd_newActionValue_int(KEY_SHIFT));
	ddActionHash_setValue(obj->properties, strdup("SPACE"), dd_newActionValue_int(KEY_SPACE));
	ddActionHash_setValue(obj->properties, strdup("TAB"), dd_newActionValue_int(KEY_TAB));
	ddActionHash_setValue(obj->properties, strdup("UP"), dd_newActionValue_int(KEY_UP));

	return key;
}

⌨️ 快捷键说明

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