LOCAL void rfb_passevent_keyboard(struct rfb_Display *mod, TIMSG *msg) { /* pass keyboard events to focused window, else to the ** hovered window (also setting the focus): */ if (!rfb_passevent_to_focus(mod, msg)) rfb_passevent_by_mousexy(mod, msg, TTRUE); }
LOCAL void rfb_passevent_mousebutton(struct rfb_Display *mod, TIMSG *msg) { TBOOL down = msg->timsg_Code & (TMBCODE_LEFTDOWN | TMBCODE_RIGHTDOWN | TMBCODE_MIDDLEDOWN); struct rfb_Window *v = rfb_passevent_by_mousexy(mod, msg, down); if (!down && v != mod->rfb_FocusWindow) rfb_passevent_to_focus(mod, msg); }
static void rfb_processevent(RFBDISPLAY *mod) { TAPTR TExecBase = TGetExecBase(mod); TIMSG *msg; if (mod->rfb_RndIMsgPort == TNULL) return; while ((msg = TGetMsg(mod->rfb_RndIMsgPort))) { /*RFBWINDOW *v = (RFBWINDOW *) msg->timsg_Instance;*/ TIMSG *imsg; switch (msg->timsg_Type) { case TITYPE_INTERVAL: TDBPRINTF(TDB_WARN,("unhandled event: INTERVAL\n")); break; case TITYPE_REFRESH: { TINT drect[4]; drect[0] = msg->timsg_X; drect[1] = msg->timsg_Y; drect[2] = msg->timsg_X + msg->timsg_Width - 1; drect[3] = msg->timsg_Y + msg->timsg_Height - 1; rfb_damage(mod, drect, TNULL); break; } case TITYPE_NEWSIZE: TDBPRINTF(TDB_WARN,("unhandled event: NEWSIZE\n")); break; case TITYPE_CLOSE: { /* send to root window */ TLock(mod->rfb_InstanceLock); RFBWINDOW *v = (RFBWINDOW *) TLASTNODE(&mod->rfb_VisualList); if (rfb_getimsg(mod, v, &imsg, TITYPE_CLOSE)) TPutMsg(v->rfbw_IMsgPort, TNULL, imsg); TUnlock(mod->rfb_InstanceLock); break; } case TITYPE_FOCUS: TDBPRINTF(TDB_INFO,("unhandled event: FOCUS\n")); break; case TITYPE_MOUSEOVER: TDBPRINTF(TDB_INFO,("unhandled event: MOUSEOVER\n")); break; case TITYPE_KEYUP: case TITYPE_KEYDOWN: /* pass keyboard events to focused window, else to the * hovered window (also setting the focus): */ if (!rfb_passevent_to_focus(mod, msg)) rfb_passevent_by_mousexy(mod, msg, TTRUE); break; case TITYPE_MOUSEMOVE: /* pass mouse movements to focused and hovered window: */ if (rfb_passevent_by_mousexy(mod, msg, TFALSE) != mod->rfb_FocusWindow) rfb_passevent_to_focus(mod, msg); break; case TITYPE_MOUSEBUTTON: { /* set focus on mousebutton down */ TBOOL focus = msg->timsg_Code & (TMBCODE_LEFTDOWN | TMBCODE_RIGHTDOWN | TMBCODE_MIDDLEDOWN); rfb_passevent_by_mousexy(mod, msg, focus); break; } } TReplyMsg(msg); } }
LOCAL void rfb_passevent_mousemove(struct rfb_Display *mod, TIMSG *msg) { /* pass mouse movements to focused and hovered window: */ if (rfb_passevent_by_mousexy(mod, msg, TFALSE) != mod->rfb_FocusWindow) rfb_passevent_to_focus(mod, msg); }