事件重放函数:
static gboolean replay_one_event (gpointer user_data)
...{
DFBContext *context = (DFBContext*)user_data;
off_t cur = 0;
DFBInputEvent event = context->event;
if(event.type == DIET_KEYPRESS || event.type == DIET_KEYRELEASE)
...{
dfb_input_dispatch (context->keyboard_device, &event);
}
else
...{
dfb_input_dispatch (context->mouse_device, &event);
}
if (fread (&context->event, sizeof (DFBInputEvent), 1, context->file) == 1)
...{
guint ms = (context->event.timestamp.tv_sec - event.timestamp.tv_sec) * 1000
+ (context->event.timestamp.tv_usec - event.timestamp.tv_usec)/1000;
g_timeout_add (ms, replay_one_event, user_data);
}
else
...{
g_main_loop_quit (context->loop);
}
return FALSE;
}
注意:DirectFB中的笔点事件是以相对坐标方式表示的,所以要保证重放时光标在同样的初始位置。如果DirectFB以多进程的方式运行,这个程序可以是一个独立的进程,否则要放到应用程序的进程中才行。