rt_bool_t player_workbench_event_handler(rtgui_widget_t *widget, rtgui_event_t *event) { if (event->type == RTGUI_EVENT_KBD) { struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; if (((ekbd->type == RTGUI_KEYUP) && ekbd->key == RTGUIK_HOME) && !RTGUI_WORKBENCH_IS_MODAL_MODE(workbench)) { /* active home view */ if (workbench->current_view != home_view) { rtgui_view_show(home_view, RT_FALSE); return RT_TRUE; } } } else if (event->type == RTGUI_EVENT_COMMAND) { struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event; if ((ecmd->command_id == PLAYER_REQUEST_FUNCTION_VIEW) && !RTGUI_WORKBENCH_IS_MODAL_MODE(workbench)) { rtgui_view_show(RTGUI_VIEW(function_view), RT_FALSE); return RT_TRUE; } else { /* let default workbench event handler to handle it */ return rtgui_workbench_event_handler(widget, event); } } return rtgui_workbench_event_handler(widget, event); }
static rt_bool_t demo_workbench_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) { /* 我们目前只对按键事件感兴趣。如果当前workbench处于模式显示状态,忽略它 */ if ((event->type == RTGUI_EVENT_KBD) && !RTGUI_WORKBENCH_IS_MODAL_MODE(RTGUI_WORKBENCH(widget))) { struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; if (ekbd->type == RTGUI_KEYDOWN) { if (ekbd->key == RTGUIK_RIGHT) { demo_view_next(RT_NULL, RT_NULL); return RT_TRUE; } else if (ekbd->key == RTGUIK_LEFT) { demo_view_prev(RT_NULL, RT_NULL); return RT_TRUE; } } } /* 如果不是绘制事件,使用view原来的事件处理函数处理 */ return rtgui_workbench_event_handler(widget, event); }
rt_bool_t rtgui_workbench_event_handler(rtgui_widget_t* widget, rtgui_event_t* event) { struct rtgui_workbench* workbench = (struct rtgui_workbench*)widget; switch (event->type) { case RTGUI_EVENT_PANEL_DETACH: RTGUI_WIDGET_HIDE(RTGUI_WIDGET(workbench)); RTGUI_TOPLEVEL(workbench)->server = RT_NULL; return RT_TRUE; case RTGUI_EVENT_PANEL_SHOW: /* show workbench in server */ rtgui_workbench_show(workbench); break; case RTGUI_EVENT_PANEL_HIDE: /* hide widget */ RTGUI_WIDGET_HIDE(widget); break; case RTGUI_EVENT_MOUSE_MOTION: { struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; struct rtgui_toplevel* top = RTGUI_TOPLEVEL(emouse->wid); /* check the destination window */ if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL) { RTGUI_WIDGET(top)->event_handler(RTGUI_WIDGET(top), event); } else { /* let viewer to handle it */ rtgui_view_t* view = workbench->current_view; if (view != RT_NULL && RTGUI_WIDGET(view)->event_handler != RT_NULL) { RTGUI_WIDGET(view)->event_handler(RTGUI_WIDGET(view), event); } } } break; case RTGUI_EVENT_MOUSE_BUTTON: { struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; struct rtgui_toplevel* top = RTGUI_TOPLEVEL(emouse->wid); /* check the destination window */ if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL) { RTGUI_WIDGET(top)->event_handler(RTGUI_WIDGET(top), event); } else { if (RTGUI_WORKBENCH_IS_MODAL_MODE(workbench)) { /* let modal widget to handle it */ if (workbench->modal_widget != RT_NULL && workbench->modal_widget->event_handler != RT_NULL) { workbench->modal_widget->event_handler(workbench->modal_widget, event); } } else { /* let viewer to handle it */ rtgui_view_t* view = workbench->current_view; if (view != RT_NULL && RTGUI_WIDGET(view)->event_handler != RT_NULL) { RTGUI_WIDGET(view)->event_handler(RTGUI_WIDGET(view), event); } } } } break; case RTGUI_EVENT_KBD: { struct rtgui_event_kbd* kbd = (struct rtgui_event_kbd*)event; struct rtgui_toplevel* top = RTGUI_TOPLEVEL(kbd->wid); /* check the destination window */ if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL) { RTGUI_WIDGET(top)->event_handler(RTGUI_WIDGET(top), event); } else { if (RTGUI_WORKBENCH_IS_MODAL_MODE(workbench)) { /* let modal widget to handle it */ if (workbench->modal_widget != RT_NULL && workbench->modal_widget->event_handler != RT_NULL) { workbench->modal_widget->event_handler(workbench->modal_widget, event); } } else { if (RTGUI_CONTAINER(widget)->focused == widget) { /* set focused widget to the current view */ if (workbench->current_view != RT_NULL) rtgui_widget_focus(RTGUI_WIDGET(RTGUI_CONTAINER(workbench->current_view)->focused)); } return rtgui_toplevel_event_handler(widget, event); } } } break; case RTGUI_EVENT_PAINT: { struct rtgui_event_paint* epaint = (struct rtgui_event_paint*)event; struct rtgui_toplevel* top = RTGUI_TOPLEVEL(epaint->wid); /* check the destination window */ if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL) { RTGUI_WIDGET(top)->event_handler(RTGUI_WIDGET(top), event); } else { rtgui_view_t* view; /* un-hide workbench */ RTGUI_WIDGET_UNHIDE(widget); /* paint a view */ view = workbench->current_view; if (view != RT_NULL) { /* remake a paint event */ RTGUI_EVENT_PAINT_INIT(epaint); epaint->wid = RT_NULL; /* send this event to the view */ if (RTGUI_WIDGET(view)->event_handler != RT_NULL) { RTGUI_WIDGET(view)->event_handler(RTGUI_WIDGET(view), event); } } else { struct rtgui_dc* dc; struct rtgui_rect rect; dc = rtgui_dc_begin_drawing(widget); rtgui_widget_get_rect(widget, &rect); rtgui_dc_fill_rect(dc, &rect); rtgui_dc_end_drawing(dc); } } } break; case RTGUI_EVENT_CLIP_INFO: { struct rtgui_event_clip_info* eclip = (struct rtgui_event_clip_info*)event; struct rtgui_widget* dest_widget = RTGUI_WIDGET(eclip->wid); if (dest_widget != RT_NULL && dest_widget->event_handler != RT_NULL) { dest_widget->event_handler(dest_widget, event); } else { return rtgui_toplevel_event_handler(widget, event); } } break; case RTGUI_EVENT_WIN_CLOSE: case RTGUI_EVENT_WIN_ACTIVATE: case RTGUI_EVENT_WIN_DEACTIVATE: { struct rtgui_event_win* wevent = (struct rtgui_event_win*)event; struct rtgui_widget* dest_widget = RTGUI_WIDGET(wevent->wid); if (dest_widget != RT_NULL && dest_widget->event_handler != RT_NULL) { dest_widget->event_handler(dest_widget, event); } } break; case RTGUI_EVENT_WIN_MOVE: { struct rtgui_event_win_move* wevent = (struct rtgui_event_win_move*)event; struct rtgui_toplevel* top = RTGUI_TOPLEVEL(wevent->wid); if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL) { RTGUI_WIDGET(top)->event_handler(RTGUI_WIDGET(top), event); } } break; default: return rtgui_toplevel_event_handler(widget, event); } return RT_TRUE; }