Exemple #1
0
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);
	}
}
Exemple #2
0
static void rfb_processevent(struct rfb_Display *mod)
{
	TAPTR TExecBase = TGetExecBase(mod);
	TIMSG *msg;

	if (mod->rfb_RndIMsgPort == TNULL)
		return;

	while ((msg = TGetMsg(mod->rfb_RndIMsgPort)))
	{
		/*struct rfb_Window *v = (struct rfb_Window *) 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);
				rfb_flush_clients(mod, TTRUE);
				break;
			}
			case TITYPE_NEWSIZE:
				if ((mod->rfb_Flags & RFBFL_BUFFER_OWNER) &&
					(mod->rfb_Flags & RFBFL_BUFFER_CAN_RESIZE))
				{
					region_free(&mod->rfb_RectPool, &mod->rfb_DirtyRegion);
					mod->rfb_Flags &= ~RFBFL_DIRTY;

					TINT neww = mod->rfb_Width = msg->timsg_Width;
					TINT newh = mod->rfb_Height = msg->timsg_Height;

					TUINT pixfmt = mod->rfb_PixBuf.tpb_Format;
					TUINT bpp = TVPIXFMT_BYTES_PER_PIXEL(pixfmt);
					TUINT bpl = bpp * neww;

					struct TVPixBuf newbuf;

					newbuf.tpb_BytesPerLine = bpl;
					newbuf.tpb_Format = mod->rfb_PixBuf.tpb_Format;
					newbuf.tpb_Data = TAlloc(mod->rfb_MemMgr, bpl * newh);
					if (newbuf.tpb_Data == TNULL)
						break;

					struct TNode *next, 
						*node = mod->rfb_VisualList.tlh_Head.tln_Succ;

					for (; (next = node->tln_Succ); node = next)
					{
						struct rfb_Window *v = (struct rfb_Window *) node;

						rfb_setrealcliprect(mod, v);

						TINT w0 = REGION_RECT_WIDTH(&v->rfbw_ScreenRect);
						TINT h0 = REGION_RECT_HEIGHT(&v->rfbw_ScreenRect);

						if ((v->rfbw_Flags & RFBWFL_FULLSCREEN))
						{
							v->rfbw_ScreenRect.r[0] = 0;
							v->rfbw_ScreenRect.r[1] = 0;
							v->rfbw_ScreenRect.r[2] = neww - 1;
							v->rfbw_ScreenRect.r[3] = newh - 1;
						}

						TINT ww = REGION_RECT_WIDTH(&v->rfbw_ScreenRect);
						TINT wh = REGION_RECT_HEIGHT(&v->rfbw_ScreenRect);

						if (v->rfbw_MinWidth > 0 && ww < v->rfbw_MinWidth)
							v->rfbw_ScreenRect.r[0] =
								v->rfbw_ScreenRect.r[2] - v->rfbw_MinWidth;
						if (v->rfbw_MinHeight > 0 && wh < v->rfbw_MinHeight)
							v->rfbw_ScreenRect.r[1] =
								v->rfbw_ScreenRect.r[3] - v->rfbw_MinHeight;

						ww = REGION_RECT_WIDTH(&v->rfbw_ScreenRect);
						wh = REGION_RECT_HEIGHT(&v->rfbw_ScreenRect);

						if (v->rfbw_Flags & RFBWFL_BACKBUFFER)
							rfb_resizewinbuffer(mod, v, w0, h0, ww, wh);
						else
							v->rfbw_PixBuf = newbuf;

						rfb_setwinrect(mod, v);

						if (ww != w0 || wh != h0)
						{
							if (rfb_getimsg(mod, v, &imsg, TITYPE_NEWSIZE))
							{
								imsg->timsg_Width = ww;
								imsg->timsg_Height = wh;
								TPutMsg(v->rfbw_IMsgPort, TNULL, imsg);
							}
						}
					}

					TFree(mod->rfb_PixBuf.tpb_Data);
					mod->rfb_PixBuf = newbuf;

					struct Rect drect;

					REGION_RECT_SET(&drect, 0, 0, neww - 1, newh - 1);
					rfb_damage(mod, drect.r, TNULL);
				}
				else
					TDBPRINTF(TDB_WARN, ("Cannot resize this framebuffer\n"));
				break;

			case TITYPE_CLOSE:
			{
				/* send to root window */
				TLock(mod->rfb_InstanceLock);
				struct rfb_Window *v =
					(struct rfb_Window *) 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:
				rfb_passevent_keyboard(mod, msg);
				break;

			case TITYPE_MOUSEMOVE:
				rfb_passevent_mousemove(mod, msg);
				break;

			case TITYPE_MOUSEBUTTON:
				rfb_passevent_mousebutton(mod, msg);
				break;
		}
		TReplyMsg(msg);
	}
}