#define mgfd_set int
extern mgfd_set mg_rfdset; extern mgfd_set* mg_wfdset; extern mgfd_set* mg_efdset; extern int mg_maxfd; extern LISTEN_FD mg_listen_fds [];
13、listenfd.c
(1)定义文件描述符的相关变量
LISTEN_FD mg_listen_fds [MAX_NR_LISTEN_FD]; static mgfd_set _wfdset, _efdset; mgfd_set mg_rfdset;
mgfd_set* mg_wfdset = NULL; mgfd_set* mg_efdset = NULL; int mg_maxfd;
(2)BOOL GUIAPI RegisterListenFD (int fd, int type, HWND hwnd, void* context)
函数作用:注册文件描述符
BOOL GUIAPI RegisterListenFD (int fd, int type, HWND hwnd, void* context)
{ }
return TRUE;
(3)BOOL GUIAPI RegisterListenFD (int fd, int type, HWND hwnd, void* context)
函数作用:注销文件描述符
BOOL GUIAPI UnregisterListenFD (int fd) {
return TRUE; }
14、standalone.c
(1)SRVEVTHOOK GUIAPI SetServerEventHook (SRVEVTHOOK SrvEvtHook)
\\brief Sets an event hook in the server of MiniGUI-Processes.
(2)static void ParseEvent (PMSGQUEUE msg_que, int event)
函数作用:解析事件,将IAL类型的事件最终解析为对应的消息并加入消息队列中。
(3)BOOL GUIAPI StandAloneStartup (void)
函数作用: mg_maxfd = 0; #ifndef _NEWGAL_ENGINE_BF533 InstallIntervalTimer (); #endif
(4)void StandAloneCleanup (void)
函数作用:
#ifndef _NEWGAL_ENGINE_BF533
UninstallIntervalTimer (); #endif
(5)BOOL minigui_idle (void)
函数作用:return IdleHandler4StandAlone (__mg_dsk_msg_queue);
(6)BOOL IdleHandler4StandAlone (PMSGQUEUE msg_queue)
函数作用:standalone模式下的空闲处理函数
(1)获得文件描述符中输入事件类型:n = IAL_WaitEvent (IAL_MOUSEEVENT | IAL_KEYEVENT,mg_maxfd, &rset, wsetptr, esetptr, NULL); (2)对输入事件进行解析:
if (n & IAL_MOUSEEVENT) ParseEvent (msg_queue, IAL_MOUSEEVENT); if (n & IAL_KEYEVENT) ParseEvent (msg_queue, IAL_KEYEVENT);
if (n == 0) ParseEvent (msg_queue, 0)
(3)函数返回值为TRUE,表示有输入事件,返回值为FALSE,表示超时或者有错误发生。
15、keyboard.h
(1)宏定义
#define VC_XLATE 0x0000 /* translate keycodes using keymap */ #define VC_MEDIUMRAW 0x0001 /* medium raw (keycode) mode */ #define VC_RAW 0x0002 /* raw (scancode) mode */ #define VC_UNICODE 0x0004 /* Unicode mode */ #define VC_APPLIC 0x0010 /* application key mode */ #define VC_CKMODE 0x0020 /* cursor key mode */ #define VC_REPEAT 0x0040 /* keyboard repeat */
#define VC_CRLF 0x0080 /* 0 - enter sends CR, 1 - enter sends CRLF */
#define VC_META 0x0100 /* 0 - meta, 1 - meta=prefix with ESC */
(2)定义键盘信息数据结构
typedef struct _key_info {
DWORD kbd_mode; DWORD shiftstate; DWORD oldstate; int npadch; unsigned char diacr; int dead_key_next; unsigned char type; unsigned char buff[50]; int pos; } key_info;
(3)键盘分布信息数据结构及初始化数据结构:
typedef void (* INIT_KBD_LAYOUT) (ushort*** key_maps_p, struct kbdiacr** accent_table_p, unsigned int* accent_table_size_p, char*** func_table_p); typedef struct kbd_layout_info
{
char* name;
INIT_KBD_LAYOUT init; } kbd_layout_info;
(4)声明初始化默认键盘分布
16、keyboard.c(待分析。。。)
(1)static inline void put_queue (char ch, key_info* kinfo)
函数作用:将字符放入键盘缓存中。
kinfo->buff [kinfo->pos] = ch; kinfo->pos ++;
(2)static inline void puts_queue (char* cp, key_info* kinfo)
函数作用:将以cp为首地址的一串字符放入缓存中。
(3)static void applkey (int key, char mode, key_info* kinfo) (4)static void to_utf8 (ushort c, key_info* kinfo)
函数作用:将字符经过转化后放入缓存中。
(5)宏定义连接符
#define A_GRAVE '`' #define A_ACUTE '\\'' #define A_CFLEX '^' #define A_TILDE '~' #define A_DIAER '\ #define A_CEDIL ','
(6)定义连接符数组
static unsigned char ret_diacr[NR_DEAD] = {A_GRAVE, A_ACUTE, A_CFLEX, A_TILDE, A_DIAER, A_CEDIL };
(7)static unsigned char handle_diacr (unsigned char ch, key_info* kinfo)
函数作用:对连接符进行处理。
二、数据结构解析
1、鼠标移动事件数据结构
typedef struct _MOUSEEVENT {
int event; //事件标识符,代表不同的鼠标事件ME_* int x; //鼠标的位置 int y;
DWORD status; //状态信息 }MOUSEEVENT;
typedef MOUSEEVENT* PMOUSEEVENT;
2、键盘事件的数据结构
typedef struct _KEYEVENT {
int event; //事件标识符,代表不同的键盘事件KE_* int scancode; //按键扫描码 DWORD status; //状态信息 }KEYEVENT;
typedef KEYEVENT* PKEYEVENT;
3、底层事件的数据结构
(1)底层事件的数据:
typedef union _LWEVENTDATA { MOUSEEVENT me; KEYEVENT ke; }LWEVENTDATA;
(2)底层事件:
typedef struct _LWEVENT {
int type; //底层事件标识符,KE_*| ME_* int count; //发生时间 DWORD status; //状态
LWEVENTDATA data; //数据,当event为KE_*时,data为KEYEVENT,当event为ME_*时,
//data为MOUSEEVENT
}LWEVENT;
typedef LWEVENT* PLWEVENT;
4、输入引擎相关的数据结构:
(1)输入引擎处理函数:
typedef struct tagINPUT {
char* id; //标识符,输入引擎的名称
// 输入初始化和终止函数
BOOL (*init_input) (struct tagINPUT *input, const char* mdev, const char* mtype); void (*term_input) (void);
// 鼠标操作
int (*update_mouse) (void); void (*get_mouse_xy) (int* x, int* y); void (*set_mouse_xy) (int x, int y); int (*get_mouse_button) (void);
void (*set_mouse_range) (int minx, int miny, int maxx, int maxy); void (*suspend_mouse) (void);
int (*resume_mouse) (void);
// 键盘操作
int (*update_keyboard) (void); const char* (*get_keyboard_state) (void); void (*suspend_keyboard) (void); int (*resume_keyboard) (void); void (*set_leds) (unsigned int leds);
int (*wait_event) (int which, int maxfd, fd_set *in, fd_set *out,fd_set *except, struct timeval *timeout);
char mdev [MAX_PATH + 1]; }INPUT;
(2)输入引擎的键盘数据结构:
struct QVFbKeyData {
unsigned int unicode; unsigned int modifiers; BYTE press; BYTE repeat; };
5、消息相关数据结构:
(1)消息数据结构:
typedef struct _MSG {
HWND hwnd; //消息所属的窗口句柄
int message; //消息标识符MS_*
WPARAM wParam; //消息的第一个参数,32位整型 LPARAM lParam;//消息的第二个参数,32位整型 unsigned int time;//消息发生时间 #ifndef _LITE_VERSION
void* pAdd; //附加数据 #endif } MSG;
typedef MSG* PMSG;
(2)消息链表数据结构:
typedef struct _QMSG {
MSG Msg; //当前消息 struct _QMSG* next; //下一条消息 }QMSG;
typedef QMSG* PQMSG;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MINIGUI输入模块代码文件分析(5)在线全文阅读。
相关推荐: