linux红外远程控制驱动(三)
时间:2007-04-18 来源:ilttv.cn
6、红外信号映射为X事件
如果我们希望使用遥控器远程遥控进行视频、音频等播放操作,则需要将上面解码后的红外信号映射为X事件(当然指的是针对基于X的图形应用时)。这个过程主要涉及到下面几个函数:
l KeyCode XKeysymToKeycode(Display *display, KeySym keysym)
将KeySym转换为KeyCode。Display指定连接的X server。KeySym表示键盘按键的字符编码,如XK_Up、XK_Down等,定义的KeySym列表在X11/keysymdef.h文件里,多数应用通常只包括X11/keysym.h文件。KeyCode代表了物理按键。如果指定的KeySym没有对应任何KeyCode,则返回0。
l XTestFakeKeyEvent(display, keycode, True, 0);
使用XTEST扩展发送按键事件的接口。第三个参数表示按键被按下或释放,如果按下,则发送KeyPress事件,否则发送KeyRelease。使用这个函数时,不能够指定事件发送的目的地,它将按照真实键盘按键的事件传送机制来传送。
l XSync(Display *display, Bool discard)
flush输出缓冲,并等待所有的请求已经被X server接收和处理。对于X server接收到的每个协议错误,XSync将调用客户端应用的错误处理函数。server生成的都依次添加在xlib的事件队列里。如果设置discard为False,则XSync不丢弃这个事件队列里的事件,否则,丢弃所有队列里的事件。
在前面示例里添加下面的定义:
static struct KeyMapEntry {
char *config;
KeySym keysym;
} keymap[] = {
{"Escape", XK_Escape},
{"Backspace", XK_BackSpace},
{"1", XK_1},
{"2", XK_2},
{"3", XK_3},
{"4", XK_4},
{"5", XK_5},
{"6", XK_6},
{"7", XK_7},
{"8", XK_8},
{"9", XK_9},
{"0", XK_0},
{"Up", XK_Up},
{"Down", XK_Down},
{"Left", XK_Left},
{"Right", XK_Right},
};
void
dispatchEvent(char *msg)
{
struct KeyMapEntry entry;
KeyCode keycode;
int i;
for ( i = 0; keymap[i].config; i++) {
entry = keymap[i];
if (strcmp(entry.config, msg) == 0) {
keycode = XKeysymToKeycode(display, entry.keysym);
XTestFakeKeyEvent(display, keycode, True, 0);
XTestFakeKeyEvent(display, keycode, False, 0);
XSync(display, False);
break;
}
}
if (!keymap[i].config)
print("<WARNING> Unknown config string: %s\n", msg);
}
然后将lirc_code2char循环里的语句
system(c);
替换为
dispatchEvent(c);