예제 #1
0
파일: targparser.c 프로젝트: amic3r/Terra
const void *TArgParserNextParameter(void)
{
	const void *data;
	const char *arg;
	char type = TArgParser.ph.paramtype;

	if(!TArgParser.ph.remainingParams) return 0;

	TFree(TArgParser.ph.param);

	arg = TArgParser.argv[TArgParser.idx];

	if(type == 'd' || type == 'i') {
		int *p;
		TArgParser.ph.param = TAlloc(sizeof(int));
		p = (int *) TArgParser.ph.param;
		
		sscanf(arg,"%d",p);
		data = TArgParser.ph.param;
	} else if(type == 'u') {
		unsigned int *p;
		TArgParser.ph.param = TAlloc(sizeof(unsigned int));
		p = (unsigned int *) TArgParser.ph.param;
		
		sscanf(arg,"%u",p);
		data = TArgParser.ph.param;
	} else if(type == 'x' || type == 'X') {
		unsigned int *p;
		TArgParser.ph.param = TAlloc(sizeof(unsigned int));
		p = (unsigned int *) TArgParser.ph.param;

		sscanf(arg, type == 'x' ? "%x" : "%X",p);
		data = TArgParser.ph.param;
	} else if(type == 'f' || type == 'F') {
		double *p;
		TArgParser.ph.param = TAlloc(sizeof(double));
		p = (double *) TArgParser.ph.param;

		sscanf(arg, "%lf",p);
		data = TArgParser.ph.param;
	} else if(type == 'c') {
		char *p;
		TArgParser.ph.param = TAlloc(sizeof(char));
		p = (char *) TArgParser.ph.param;

		sscanf(arg, "%c",p);
		data = TArgParser.ph.param;
	} else {
		data = arg;
		TArgParser.ph.param = 0;
	}

	TArgParser.ph.remainingParams--;
	TArgParser.idx++;
	return data;
}
예제 #2
0
LOCAL TBOOL rfb_initpointer(struct rfb_Display *mod)
{
	TAPTR TExecBase = TGetExecBase(mod);
	FILE *f;

	if ((mod->rfb_Flags & (RFBFL_CANSHOWPTR | RFBFL_SHOWPTR)) !=
		(RFBFL_CANSHOWPTR | RFBFL_SHOWPTR))
		return TFALSE;
	rfb_initdefpointer(mod);
	f = fopen(DEF_CURSORFILE, "rb");
	if (f)
	{
		struct ImgLoader ld;

		if (imgload_init_file(&ld, TExecBase, f))
		{
			if (imgload_load(&ld))
			{
				mod->rfb_PtrImage = ld.iml_Image;
				mod->rfb_PtrWidth = ld.iml_Width;
				mod->rfb_PtrHeight = ld.iml_Height;
				mod->rfb_Flags |= RFBFL_PTR_ALLOCATED;
			}
		}
		fclose(f);
	}
	mod->rfb_PtrBackBuffer.data = TAlloc(mod->rfb_MemMgr,
		TVPIXFMT_BYTES_PER_PIXEL(mod->rfb_PixBuf.tpb_Format) *
		mod->rfb_PtrWidth * mod->rfb_PtrHeight);
	if (mod->rfb_PtrBackBuffer.data)
		return TTRUE;
	rfb_initdefpointer(mod);
	return TFALSE;
}
예제 #3
0
파일: tquadtree.c 프로젝트: amic3r/Terra
TQuadObj *TQuadObjNew(const TRectangle *rect, void *data)
{
	TQuadObj *pt = (TQuadObj *) TAlloc(sizeof(TQuadObj));
	if(!pt) return 0;

	pt->rect = *rect;
	pt->data = data;
	return pt;
}
예제 #4
0
파일: tdata.c 프로젝트: amic3r/Terra
static inline TData *TDataNew(TUInt16 type)
{
	TData *content = (TData *)TAlloc(sizeof(TData));
	if (content) {
		content->data = 0;
		content->size = 0;
		content->type = type;
	}

	return content;
}
예제 #5
0
LOCAL void
fb_getselection(WINDISPLAY *mod, struct TVRequest *req)
{
	struct TExecBase *TExecBase = TGetExecBase(mod);
	LPSTR utf8 = NULL;
	int utf8Bytes = 0;
	HANDLE clipData;
	LPCWSTR utf16; 

	req->tvr_Op.GetSelection.Data = TNULL;
	req->tvr_Op.GetSelection.Length = 0;

	if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
	{
		TDBPRINTF(TDB_WARN,(
				  "no 'CF_UNICODETEXT' Windows clipboard data available\n"));
		return;
	}
	if (!OpenClipboard(mod->fbd_DeviceHWnd))
	{
		TDBPRINTF(TDB_WARN, ("cannot open Windows clipboard\n"));
		return;
	}
	clipData = GetClipboardData(CF_UNICODETEXT);
	if (clipData != NULL)
	{
		utf16 = GlobalLock(clipData);
		utf8Bytes = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, 
										NULL, 0, NULL, 0);
		if (utf8Bytes != 0)
		{
			utf8 = (LPSTR) TAlloc(TNULL, utf8Bytes);
			utf8Bytes = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, 
											utf8, utf8Bytes, NULL, 0);
		}
		GlobalUnlock(clipData);
	}
	else
		TDBPRINTF(TDB_WARN, ("no Windows clipboard data\n"));
	CloseClipboard();

	if (!utf8Bytes)
	{
		TFree(utf8);
		TDBPRINTF(TDB_WARN, (
				  "failed encoding UTF-8 from Windows clipboard\n"));
		return;
	}
	--utf8Bytes;
	TDBPRINTF(TDB_TRACE,("get selection: N = %d S = '%s'\n", utf8Bytes, utf8));
	req->tvr_Op.GetSelection.Data = utf8;
	req->tvr_Op.GetSelection.Length = utf8Bytes;
}
예제 #6
0
static void tek_lib_exec_allocarg(lua_State *L, struct TExecBase *TExecBase,
	int stackidx, struct LuaTaskArgs *arg)
{
	const char *s = lua_tolstring(L, stackidx, &arg->len);
	if (arg->len > 0)
	{
		arg->arg = TAlloc(TNULL, arg->len);
		if (arg->arg == TNULL)
			luaL_error(L, "out of memory");
		memcpy(arg->arg, s, arg->len);
	}
}
예제 #7
0
파일: tquadtree.c 프로젝트: amic3r/Terra
TQuadTree *TQuadTreeNew(const TRectangle *bounds)
{
	TQuadTree *qt = (TQuadTree *) TAlloc(sizeof(TQuadTree));
	if(!qt) return 0;

	qt->level_limit = 5;
	qt->obj_limit = 50;

	qt->head = TQuadNodeNew(bounds);

	return qt;
}
예제 #8
0
파일: region.c 프로젝트: callcc/tekui
TLIBAPI struct Region *region_new(struct RectPool *pool, TINT *s)
{
	struct TExecBase *TExecBase = pool->p_ExecBase;
	struct Region *region = TAlloc(TNULL, sizeof(struct Region));
	if (region)
	{
		if (!region_init(pool, region, s))
		{
			TFree(region);
			region = TNULL;
		}
	}
	return region;
}
예제 #9
0
파일: targparser.c 프로젝트: amic3r/Terra
void TArgParserAddArgument(const char *name, char type, char amount, char def, const char *help)
{
	TArg *arg = (TArg *) TAlloc(sizeof(TArg));
	if(arg) {
		arg->name = name;
		arg->type = type;
		arg->amount = amount;
		arg->def = def;
		arg->help = help;
		arg->used = 0;

		if(!TArgParser.argFormat) TArgParser.argFormat = TArrayNew(1);

		TArrayAppend(TArgParser.argFormat, arg);
	}
}
예제 #10
0
파일: region.c 프로젝트: technosaurus/tekui
TLIBAPI struct Region *region_new(struct RectPool *pool, TINT *s)
{
	struct TExecBase *TExecBase = pool->p_ExecBase;
	struct Region *region = TAlloc(TNULL, sizeof(struct Region));
	if (region)
	{
		region->rg_Pool = pool;
		region_initrectlist(&region->rg_Rects);
		if (s && !region_insertrect(pool, &region->rg_Rects,
			s[0], s[1], s[2], s[3]))
		{
			TFree(region);
			region = TNULL;
		}
	}
	return region;
}
예제 #11
0
파일: teklib.c 프로젝트: ld-test/tekui
TLIBAPI struct TModule *TNewInstance(struct TModule *mod, TSIZE possize,
	TSIZE negsize)
{
	struct TExecBase *TExecBase = TGetExecBase(mod);
	TAPTR inst = TAlloc(TNULL, possize + negsize);
	if (inst)
	{
		TSIZE size = TMIN(((struct TModule *) mod)->tmd_NegSize, negsize);
		inst = (TINT8 *) inst + negsize;
		if (size > 0)
			TCopyMem((TINT8 *) mod - size, (TINT8 *) inst - size, size);
		size = TMIN(((struct TModule *) mod)->tmd_PosSize, possize);
		TCopyMem(mod, inst, size);
		((struct TModule *) inst)->tmd_PosSize = possize;
		((struct TModule *) inst)->tmd_NegSize = negsize;
		((struct TModule *) inst)->tmd_InitTask = TFindTask(TNULL);
	}
	return inst;
}
예제 #12
0
LOCAL void
fb_allocpen(WINDISPLAY *mod, struct TVRequest *req)
{
	struct TExecBase *TExecBase = TGetExecBase(mod);
	WINWINDOW *v = req->tvr_Op.AllocPen.Window;
	TUINT rgb = req->tvr_Op.AllocPen.RGB;
	struct FBPen *pen = TAlloc(mod->fbd_MemMgr, sizeof(struct FBPen));
	if (pen)
	{
		COLORREF col = RGB2COLORREF(rgb);
		pen->rgb = rgb;
		pen->col = col;
		pen->brush = CreateSolidBrush(col);
		pen->pen = CreatePen(PS_SOLID, 0, col);
		TAddTail(&v->penlist, &pen->node);
		req->tvr_Op.AllocPen.Pen = (TVPEN) pen;
		return;
	}
	req->tvr_Op.AllocPen.Pen = TVPEN_UNDEFINED;
}
예제 #13
0
static TBOOL tek_lib_exec_init_link_to_parent(lua_State *L, 
	struct LuaExecTask *lexec)
{
	struct TExecBase *TExecBase = lexec->exec;
	TAPTR atom;
	
	/* task's userdata initially contains a pointer to
	** childtask-userdata in parent Lua state */
	struct LuaExecChild *ctx = TGetTaskData(TNULL);
	
	/* now relink to own task */
	TSetTaskData(TNULL, lexec);
	
	lexec->parent = ctx ? ctx->parent : TNULL;
	if (ctx && ctx->taskname)
	{
		/* child context */
		strcpy(lexec->atomname, ctx->atomname);
		lexec->taskname = lexec->atomname + TEK_LIB_TASK_ATOMNAME_OFFSET;
		lexec->shared = ctx->parent->shared;
	}
	else
	{
		/* root context */
		lexec->taskname = tek_lib_exec_taskname(lexec->atomname, "main");
		lexec->shared = TAlloc(TNULL, sizeof(struct SharedState));
		if (lexec->shared == TNULL)
			return TFALSE;
	}
	atom = TLockAtom(TEK_LIB_BASETASK_ATOMNAME, 
		TATOMF_CREATE | TATOMF_NAME | TATOMF_TRY);
	if (atom)
	{
		TSetAtomData(atom, (TTAG) lexec->task);
		TUnlockAtom(atom, TATOMF_KEEP);
	}

	return TTRUE;
}
예제 #14
0
LOCAL TBOOL rfb_resizewinbuffer(struct rfb_Display *mod, struct rfb_Window *v,
	TINT oldw, TINT oldh, TINT w, TINT h)
{
	if (oldw == w && oldh == h)
		return TTRUE;
	TAPTR TExecBase = TGetExecBase(mod);
	struct TVPixBuf newbuf = v->rfbw_PixBuf;
	TUINT pixfmt = v->rfbw_PixBuf.tpb_Format;

	newbuf.tpb_BytesPerLine = TVPIXFMT_BYTES_PER_PIXEL(pixfmt) * w;
	newbuf.tpb_Data = TAlloc(mod->rfb_MemMgr, newbuf.tpb_BytesPerLine * h);
	if (!newbuf.tpb_Data)
		return TFALSE;
	TINT cw = TMIN(oldw, w);
	TINT ch = TMIN(oldh, h);

	pixconv_convert(&v->rfbw_PixBuf, &newbuf,
		0, 0, cw - 1, ch - 1, 0, 0, TFALSE, TFALSE);
	TFree(v->rfbw_PixBuf.tpb_Data);
	v->rfbw_PixBuf = newbuf;
	return TTRUE;
}
예제 #15
0
파일: visual_io.c 프로젝트: callcc/tekui
LOCAL TBOOL tek_lib_visual_io_open(TEKVisual *vis)
{	
	struct TExecBase *TExecBase = vis->vis_ExecBase;
	struct IOData *iodata = TAlloc(TNULL, sizeof(struct IOData));
	if (iodata)
	{
		TTAGITEM tags[2];
		sprintf(iodata->atomname, "msgport.ui.%p", TFindTask(TNULL));
		iodata->vis = vis;
		vis->vis_IOData = iodata;
		tags[0].tti_Tag = TTask_UserData;
		tags[0].tti_Value = (TTAG) iodata;
		tags[1].tti_Tag = TTAG_DONE;
		struct THook taskhook;
		TInitHook(&taskhook, tek_lib_visual_io_dispatch, TNULL);
		vis->vis_IOTask = TCreateTask(&taskhook, tags);
		if (vis->vis_IOTask)
			return TTRUE;
		TFree(iodata);
		vis->vis_IOData = TNULL;
	}
	return TFALSE;
}
예제 #16
0
static int CALLBACK fontenumcb(
    ENUMLOGFONTEX *lpelfe,
    NEWTEXTMETRICEX *lpntme,
    int fonttype,
    LPARAM param)
{
    LOGFONT *lf = &lpelfe->elfLogFont;
    TSTRPTR fullname = (TSTRPTR) lpelfe->elfFullName;
    TSTRPTR style = (TSTRPTR) lpelfe->elfStyle;
    TSTRPTR script = (TSTRPTR) lpelfe->elfScript;
    struct FontQueryHandle *fqh = (struct FontQueryHandle *) param;
    WINDISPLAY *mod = fqh->handle.thn_Owner;
    struct TExecBase *TExecBase = TGetExecBase(mod);
    struct FontQueryNode *fqn;

    if (fqh->match_depth == 0)
    {
        LOGFONT logfont;
        memcpy(&logfont, lf, sizeof(LOGFONT));
        fqh->match_depth = 1;
        TDBPRINTF(TDB_INFO,("fontenum - entering recursion\n"));
        logfont.lfCharSet = ANSI_CHARSET;
        logfont.lfPitchAndFamily = 0;
        EnumFontFamiliesEx(
            mod->fbd_DeviceHDC,
            &logfont,
            (FONTENUMPROCA) fontenumcb,
            (LPARAM) fqh, 0);
        fqh->match_depth = 0;
        return TTRUE;
    }


    if (fqh->fscale && !(fonttype & TRUETYPE_FONTTYPE))
        return TTRUE;
    if (fqh->fitalic && !lf->lfItalic)
        return TTRUE;
    if (fqh->fbold && (lf->lfWeight < FW_BOLD))
        return TTRUE;

    TDBPRINTF(TDB_INFO,("entry:'%s' style:'%s' script:'%s' type:%04x weight:%d italic:%d recurs:%d, size:%d\n",
                        fullname, style, script, fonttype, lf->lfWeight, !!lf->lfItalic,
                        fqh->match_depth, lf->lfHeight));

    fqn = TAlloc(TNULL,
                 sizeof(struct FontQueryNode) + strlen(fullname) + 1);
    if (fqn == TNULL)
        return TFALSE;

    strcpy((char *) (fqn + 1), fullname);
    fqn->tags[0].tti_Tag = TVisual_FontName;
    fqn->tags[0].tti_Value = (TTAG) (fqn + 1);
    fqn->tags[1].tti_Tag = TVisual_FontItalic;
    fqn->tags[1].tti_Value = !!lf->lfItalic;
    fqn->tags[2].tti_Tag = TVisual_FontBold;
    fqn->tags[2].tti_Value = (lf->lfWeight >= FW_BOLD);
    fqn->tags[3].tti_Tag = TTAG_DONE;

    TAddTail(&fqh->reslist, &fqn->node);
    return TTRUE;
}
예제 #17
0
파일: tquadtree.c 프로젝트: amic3r/Terra
TQuadNode *TQuadNodeNew(const TRectangle *bounds)
{
	TQuadNode *qn = (TQuadNode *) TAlloc(sizeof(TQuadNode));
	if(qn) TQuadNodeInit(qn,bounds);
	return qn;
}
예제 #18
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);
	}
}
예제 #19
0
static TBOOL x11_processvisualevent(struct X11Display *mod,
	struct X11Window *v, TAPTR msgstate, XEvent *ev)
{
	TAPTR TExecBase = TGetExecBase(mod);
	TIMSG *imsg;

	switch (ev->type)
	{
		case ClientMessage:
			if ((v->eventmask & TITYPE_CLOSE) &&
				(Atom) ev->xclient.data.l[0] == v->atom_wm_delete_win)
			{
				if (x11_getimsg(mod, v, &imsg, TITYPE_CLOSE))
					TAddTail(&v->imsgqueue, &imsg->timsg_Node);
			}
			break;

		case ConfigureNotify:
			if (mod->x11_RequestInProgress && (v->flags & X11WFL_WAIT_RESIZE))
			{
				TReplyMsg(mod->x11_RequestInProgress);
				mod->x11_RequestInProgress = TNULL;
				v->flags &= ~X11WFL_WAIT_RESIZE;
				TDBPRINTF(TDB_INFO, ("Released request (ConfigureNotify)\n"));
			}

			v->winleft = ev->xconfigure.x;
			v->wintop = ev->xconfigure.y;

			if ((v->winwidth != ev->xconfigure.width ||
					v->winheight != ev->xconfigure.height))
			{
				v->flags |= X11WFL_WAIT_EXPOSE;
				v->winwidth = ev->xconfigure.width;
				v->winheight = ev->xconfigure.height;
				if (v->eventmask & TITYPE_NEWSIZE)
				{
					if (x11_getimsg(mod, v, &imsg, TITYPE_NEWSIZE))
					{
						imsg->timsg_Width = v->winwidth;
						imsg->timsg_Height = v->winheight;
						TAddTail(&v->imsgqueue, &imsg->timsg_Node);
					}
					TDBPRINTF(TDB_TRACE, ("Configure: NEWSIZE: %d %d\n",
							v->winwidth, v->winheight));
				}
			}
			break;

		case EnterNotify:
		case LeaveNotify:
			if (v->eventmask & TITYPE_MOUSEOVER)
			{
				if (x11_getimsg(mod, v, &imsg, TITYPE_MOUSEOVER))
				{
					imsg->timsg_Code = (ev->type == EnterNotify);
					TAddTail(&v->imsgqueue, &imsg->timsg_Node);
				}
			}
			break;

		case MapNotify:
			if (mod->x11_RequestInProgress)
			{
				TReplyMsg(mod->x11_RequestInProgress);
				mod->x11_RequestInProgress = TNULL;
				v->flags |= X11WFL_WAIT_EXPOSE;
				TDBPRINTF(TDB_TRACE, ("Released request (MapNotify)\n"));
			}
			break;

		case Expose:
			if (v->flags & X11WFL_WAIT_EXPOSE)
				v->flags &= ~X11WFL_WAIT_EXPOSE;
			else if ((v->eventmask & TITYPE_REFRESH) &&
				x11_getimsg(mod, v, &imsg, TITYPE_REFRESH))
			{
				imsg->timsg_X = ev->xexpose.x;
				imsg->timsg_Y = ev->xexpose.y;
				imsg->timsg_Width = ev->xexpose.width;
				imsg->timsg_Height = ev->xexpose.height;
				TAddTail(&v->imsgqueue, &imsg->timsg_Node);
				TDBPRINTF(TDB_TRACE, ("Expose: REFRESH: %d %d %d %d\n",
						imsg->timsg_X, imsg->timsg_Y,
						imsg->timsg_Width, imsg->timsg_Height));
			}
			break;

		case GraphicsExpose:
			if (mod->x11_CopyExposeHook)
			{
				TINT rect[4];

				rect[0] = ev->xgraphicsexpose.x;
				rect[1] = ev->xgraphicsexpose.y;
				rect[2] = rect[0] + ev->xgraphicsexpose.width - 1;
				rect[3] = rect[1] + ev->xgraphicsexpose.height - 1;
				TCallHookPkt(mod->x11_CopyExposeHook,
					mod->x11_RequestInProgress->tvr_Op.CopyArea.Window,
					(TTAG) rect);
			}

			if (ev->xgraphicsexpose.count > 0)
				break;

			/* no more graphics expose events, fallthru: */

		case NoExpose:
			if (mod->x11_RequestInProgress)
			{
				TReplyMsg(mod->x11_RequestInProgress);
				mod->x11_RequestInProgress = TNULL;
				mod->x11_CopyExposeHook = TNULL;
				TDBPRINTF(TDB_TRACE, ("Released request (NoExpose)\n"));
			}
			else
				TDBPRINTF(TDB_INFO, ("NoExpose: TITYPE_REFRESH not set\n"));
			break;

		case FocusIn:
		case FocusOut:
			mod->x11_KeyQual = 0;
			if (v->eventmask & TITYPE_FOCUS)
			{
				if (x11_getimsg(mod, v, &imsg, TITYPE_FOCUS))
				{
					imsg->timsg_Code = (ev->type == FocusIn);
					TAddTail(&v->imsgqueue, &imsg->timsg_Node);
				}
			}
			break;

		case MotionNotify:
		{
			struct TNode *next, *node = mod->x11_vlist.tlh_Head.tln_Succ;

			x11_setmousepos(mod, v, ev->xmotion.x, ev->xmotion.y);
			v->mousex = mod->x11_ScreenMouseX - v->winleft;
			v->mousey = mod->x11_ScreenMouseY - v->wintop;
			for (; (next = node->tln_Succ); node = next)
			{
				struct X11Window *v = (struct X11Window *) node;

				if (v->eventmask & TITYPE_MOUSEMOVE &&
					x11_getimsg(mod, v, &imsg, TITYPE_MOUSEMOVE))
					TAddTail(&v->imsgqueue, &imsg->timsg_Node);
			}
			break;
		}

		case ButtonRelease:
		case ButtonPress:
			x11_setmousepos(mod, v, ev->xbutton.x, ev->xbutton.y);
			if (v->eventmask & TITYPE_MOUSEBUTTON)
			{
				if (x11_getimsg(mod, v, &imsg, TITYPE_MOUSEBUTTON))
				{
					unsigned int button = ev->xbutton.button;

					if (ev->type == ButtonPress)
					{
						switch (button)
						{
							case Button1:
								imsg->timsg_Code = TMBCODE_LEFTDOWN;
								break;
							case Button2:
								imsg->timsg_Code = TMBCODE_MIDDLEDOWN;
								break;
							case Button3:
								imsg->timsg_Code = TMBCODE_RIGHTDOWN;
								break;
							case Button4:
								imsg->timsg_Code = TMBCODE_WHEELUP;
								break;
							case Button5:
								imsg->timsg_Code = TMBCODE_WHEELDOWN;
								break;
						}
					}
					else
					{
						switch (button)
						{
							case Button1:
								imsg->timsg_Code = TMBCODE_LEFTUP;
								break;
							case Button2:
								imsg->timsg_Code = TMBCODE_MIDDLEUP;
								break;
							case Button3:
								imsg->timsg_Code = TMBCODE_RIGHTUP;
								break;
						}
					}
					TAddTail(&v->imsgqueue, &imsg->timsg_Node);
				}
			}
			break;

		case KeyRelease:
			x11_processkey(mod, v, (XKeyEvent *) ev, TFALSE);
			break;

		case KeyPress:
			x11_processkey(mod, v, (XKeyEvent *) ev, TTRUE);
			break;

		case SelectionRequest:
		{
			XSelectionRequestEvent *req = (XSelectionRequestEvent *) ev;
			XEvent replyevent;
			XSelectionEvent *reply = &replyevent.xselection;
			memset(&replyevent, 0, sizeof replyevent);

			reply->type = SelectionNotify;
			reply->serial = ev->xany.send_event;
			reply->send_event = True;
			reply->display = req->display;
			reply->requestor = req->requestor;
			reply->selection = req->selection;
			reply->property = req->property;
			reply->target = None;
			reply->time = req->time;

			if (req->target == mod->x11_XA_TARGETS)
			{
				XChangeProperty(mod->x11_Display, req->requestor,
					req->property, XA_ATOM, 32, PropModeReplace,
					(unsigned char *) &mod->x11_XA_UTF8_STRING, 1);
			}
			else if (req->target == mod->x11_XA_UTF8_STRING)
			{
				XSelectionEvent *rcopy = TAlloc(TNULL, sizeof *reply);

				if (rcopy && x11_getimsg(mod, v, &imsg, TITYPE_REQSELECTION))
				{
					*rcopy = *reply;
					imsg->timsg_Requestor = (TTAG) rcopy;
					imsg->timsg_Code =
						req->selection == mod->x11_XA_PRIMARY ? 2 : 1;
					TAddTail(&v->imsgqueue, &imsg->timsg_Node);
					break;
				}
				TFree(rcopy);
			}
			else
				reply->property = None;

			XSendEvent(mod->x11_Display, req->requestor, 0, NoEventMask,
				&replyevent);
			XSync(mod->x11_Display, False);
			break;
		}

	}
	return TFALSE;
}
예제 #20
0
파일: tprofiler.c 프로젝트: amic3r/Terra
TProfile *TProfileNew(void)
{
	TProfile *p = (TProfile *) TAlloc(sizeof(p));
	if(p) TProfileInit(p);
	return p;
}