⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 window.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 5 页
字号:
    REGION_INTERSECT(pScreen, Rgn, Rgn, &pWin->winSize);}WindowPtrRealChildHead(pWin)    register WindowPtr pWin;{    if (!pWin->parent &&	(screenIsSaved == SCREEN_SAVER_ON) &&	(HasSaverWindow (pWin->drawable.pScreen->myNum)))	return (pWin->firstChild);    else	return (NullWindow);}/***** * CreateWindow *    Makes a window in response to client request  *****/WindowPtrCreateWindow(wid, pParent, x, y, w, h, bw, class, vmask, vlist,	     depth, client, visual, error)    Window wid;    register WindowPtr pParent;    int x,y;    unsigned int w, h, bw;    unsigned int class;    register Mask vmask;    XID *vlist;    int depth;    ClientPtr client;    VisualID visual;    int *error;{    register WindowPtr pWin;    WindowPtr pHead;    register ScreenPtr pScreen;    xEvent event;    int idepth, ivisual;    Bool fOK;    DepthPtr pDepth;    PixmapFormatRec *format;    register WindowOptPtr ancwopt;    if (class == CopyFromParent)	class = pParent->drawable.class;    if ((class != InputOutput) && (class != InputOnly))    {	*error = BadValue;	client->errorValue = class;	return NullWindow;    }    if ((class != InputOnly) && (pParent->drawable.class == InputOnly))    {	*error = BadMatch;	return NullWindow;    }    if ((class == InputOnly) && ((bw != 0) || (depth != 0)))    {	*error = BadMatch;	return NullWindow;    }    pScreen = pParent->drawable.pScreen;    if ((class == InputOutput) && (depth == 0))	depth = pParent->drawable.depth;    ancwopt = pParent->optional;    if (!ancwopt)	ancwopt = FindWindowWithOptional(pParent)->optional;    if (visual == CopyFromParent) {#ifdef XAPPGROUP	VisualID ag_visual;	if (client->appgroup && !pParent->parent &&	    (ag_visual = XagRootVisual (client)))	    visual = ag_visual;	else#endif	visual = ancwopt->visual;    }    /* Find out if the depth and visual are acceptable for this Screen */    if ((visual != ancwopt->visual) || (depth != pParent->drawable.depth))    {	fOK = FALSE;	for(idepth = 0; idepth < pScreen->numDepths; idepth++)	{	    pDepth = (DepthPtr) &pScreen->allowedDepths[idepth];	    if ((depth == pDepth->depth) || (depth == 0))	    {		for (ivisual = 0; ivisual < pDepth->numVids; ivisual++)		{		    if (visual == pDepth->vids[ivisual])		    {			fOK = TRUE;			break;		    }		}	    }	}	if (fOK == FALSE)	{	    *error = BadMatch;	    return NullWindow;	}    }    if (((vmask & (CWBorderPixmap | CWBorderPixel)) == 0) &&	(class != InputOnly) &&	(depth != pParent->drawable.depth))    {	*error = BadMatch;	return NullWindow;    }    if (((vmask & CWColormap) == 0) &&	(class != InputOnly) &&	((visual != ancwopt->visual) || (ancwopt->colormap == None)))    {	*error = BadMatch;	return NullWindow;    }    pWin = AllocateWindow(pScreen);    if (!pWin)    {	*error = BadAlloc;	return NullWindow;    }    pWin->drawable = pParent->drawable;    pWin->drawable.depth = depth;    if (depth == pParent->drawable.depth)	pWin->drawable.bitsPerPixel = pParent->drawable.bitsPerPixel;    else    {	for (format = screenInfo.formats; format->depth != depth; format++)	    ;	pWin->drawable.bitsPerPixel = format->bitsPerPixel;    }    if (class == InputOnly)	pWin->drawable.type = (short) UNDRAWABLE_WINDOW;    pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;    pWin->drawable.id = wid;    pWin->drawable.class = class;    pWin->parent = pParent;    SetWindowToDefaults(pWin);    if (visual != ancwopt->visual)    {	if (!MakeWindowOptional (pWin))	{	    xfree (pWin);	    *error = BadAlloc;	    return NullWindow;	}	pWin->optional->visual = visual;	pWin->optional->colormap = None;    }    pWin->borderWidth = bw;#ifdef XCSECURITY    /*  can't let untrusted clients have background None windows;     *  they make it too easy to steal window contents     */    if (client->trustLevel != XSecurityClientTrusted)    {	pWin->backgroundState = BackgroundPixel;	pWin->background.pixel = 0;    }    else#endif    pWin->backgroundState = None;    pWin->borderIsPixel = pParent->borderIsPixel;    pWin->border = pParent->border;    if (pWin->borderIsPixel == FALSE)	pWin->border.pixmap->refcnt++;		    pWin->origin.x = x + (int)bw;    pWin->origin.y = y + (int)bw;    pWin->drawable.width = w;    pWin->drawable.height = h;    pWin->drawable.x = pParent->drawable.x + x + (int)bw;    pWin->drawable.y = pParent->drawable.y + y + (int)bw;	/* set up clip list correctly for unobscured WindowPtr */    REGION_INIT(pScreen, &pWin->clipList, NullBox, 1);    REGION_INIT(pScreen, &pWin->borderClip, NullBox, 1);    REGION_INIT(pScreen, &pWin->winSize, NullBox, 1);    REGION_INIT(pScreen, &pWin->borderSize, NullBox, 1);    pHead = RealChildHead(pParent);    if (pHead)    {	pWin->nextSib = pHead->nextSib;	if (pHead->nextSib)	    pHead->nextSib->prevSib = pWin;	else	    pParent->lastChild = pWin;	pHead->nextSib = pWin;	pWin->prevSib = pHead;    }    else    {	pWin->nextSib = pParent->firstChild;	if (pParent->firstChild)	    pParent->firstChild->prevSib = pWin;	else	    pParent->lastChild = pWin;	pParent->firstChild = pWin;    }    SetWinSize (pWin);    SetBorderSize (pWin);    /* We SHOULD check for an error value here XXX */    if (!(*pScreen->CreateWindow)(pWin))    {	*error = BadAlloc;	DeleteWindow(pWin, None);	return NullWindow;    }    /* We SHOULD check for an error value here XXX */    (*pScreen->PositionWindow)(pWin, pWin->drawable.x, pWin->drawable.y);    if (!(vmask & CWEventMask))	RecalculateDeliverableEvents(pWin);    if (vmask)	*error = ChangeWindowAttributes(pWin, vmask, vlist, wClient (pWin));    else	*error = Success;    if (*error != Success)    {	DeleteWindow(pWin, None);	return NullWindow;    }    if (!(vmask & CWBackingStore) && (defaultBackingStore != NotUseful))    {	XID value = defaultBackingStore;	(void)ChangeWindowAttributes(pWin, CWBackingStore, &value, wClient (pWin));	pWin->forcedBS = TRUE;    }    if (SubSend(pParent))    {	event.u.u.type = CreateNotify;	event.u.createNotify.window = wid;	event.u.createNotify.parent = pParent->drawable.id;	event.u.createNotify.x = x;	event.u.createNotify.y = y;	event.u.createNotify.width = w;	event.u.createNotify.height = h;	event.u.createNotify.borderWidth = bw;	event.u.createNotify.override = pWin->overrideRedirect;	DeliverEvents(pParent, &event, 1, NullWindow);		    }    return pWin;}static void#if NeedFunctionPrototypesFreeWindowResources(register WindowPtr pWin)#elseFreeWindowResources(pWin)    register WindowPtr pWin;#endif{    register ScreenPtr pScreen = pWin->drawable.pScreen;    DeleteWindowFromAnySaveSet(pWin);    DeleteWindowFromAnySelections(pWin);    DeleteWindowFromAnyEvents(pWin, TRUE);    REGION_UNINIT(pScreen, &pWin->clipList);    REGION_UNINIT(pScreen, &pWin->winSize);    REGION_UNINIT(pScreen, &pWin->borderClip);    REGION_UNINIT(pScreen, &pWin->borderSize);#ifdef SHAPE    if (wBoundingShape (pWin))	REGION_DESTROY(pScreen, wBoundingShape (pWin));    if (wClipShape (pWin))	REGION_DESTROY(pScreen, wClipShape (pWin));#endif    if (pWin->borderIsPixel == FALSE)	(*pScreen->DestroyPixmap)(pWin->border.pixmap);    if (pWin->backgroundState == BackgroundPixmap)	(*pScreen->DestroyPixmap)(pWin->background.pixmap);    DeleteAllWindowProperties(pWin);    /* We SHOULD check for an error value here XXX */    (*pScreen->DestroyWindow)(pWin);    DisposeWindowOptional (pWin);}static void#if NeedFunctionPrototypesCrushTree(WindowPtr pWin)#elseCrushTree(pWin)    WindowPtr pWin;#endif{    register WindowPtr pChild, pSib, pParent;    UnrealizeWindowProcPtr UnrealizeWindow;    xEvent event;    if (!(pChild = pWin->firstChild))	return;    UnrealizeWindow = pWin->drawable.pScreen->UnrealizeWindow;    while (1)    {	if (pChild->firstChild)	{	    pChild = pChild->firstChild;	    continue;	}	while (1)	{	    pParent = pChild->parent;	    if (SubStrSend(pChild, pParent))	    {		event.u.u.type = DestroyNotify;		event.u.destroyNotify.window = pChild->drawable.id;		DeliverEvents(pChild, &event, 1, NullWindow);			    }	    FreeResource(pChild->drawable.id, RT_WINDOW);	    pSib = pChild->nextSib;#ifdef DO_SAVE_UNDERS	    if (pChild->saveUnder && pChild->viewable)		deltaSaveUndersViewable--;#endif	    pChild->viewable = FALSE;	    if (pChild->realized)	    {		pChild->realized = FALSE;		(*UnrealizeWindow)(pChild);	    }	    FreeWindowResources(pChild);	    xfree(pChild);	    if ( (pChild = pSib) )		break;	    pChild = pParent;	    pChild->firstChild = NullWindow;	    pChild->lastChild = NullWindow;	    if (pChild == pWin)		return;	}    }}	/***** *  DeleteWindow *	 Deletes child of window then window itself *	 If wid is None, don't send any events *****//*ARGSUSED*/intDeleteWindow(value, wid)    pointer value;    XID wid; {    register WindowPtr pParent;    register WindowPtr pWin = (WindowPtr)value;    xEvent event;    UnmapWindow(pWin, FALSE);    CrushTree(pWin);    pParent = pWin->parent;    if (wid && pParent && SubStrSend(pWin, pParent))    {	event.u.u.type = DestroyNotify;	event.u.destroyNotify.window = pWin->drawable.id;	DeliverEvents(pWin, &event, 1, NullWindow);		    }    FreeWindowResources(pWin);    if (pParent)    {	if (pParent->firstChild == pWin)	    pParent->firstChild = pWin->nextSib;	if (pParent->lastChild == pWin)	    pParent->lastChild = pWin->prevSib;	if (pWin->nextSib)	    pWin->nextSib->prevSib = pWin->prevSib;	if (pWin->prevSib)	    pWin->prevSib->nextSib = pWin->nextSib;    }    xfree(pWin);    return Success;}/*ARGSUSED*/voidDestroySubwindows(pWin, client)    register WindowPtr pWin;    ClientPtr client;{    /* XXX     * The protocol is quite clear that each window should be     * destroyed in turn, however, unmapping all of the first     * eliminates most of the calls to ValidateTree.  So,     * this implementation is incorrect in that all of the     * UnmapNotifies occur before all of the DestroyNotifies.     * If you care, simply delete the call to UnmapSubwindows.     */    UnmapSubwindows(pWin);    while (pWin->lastChild)	FreeResource(pWin->lastChild->drawable.id, RT_NONE);}#define DeviceEventMasks (KeyPressMask | KeyReleaseMask | ButtonPressMask | \    ButtonReleaseMask | PointerMotionMask)/***** *  ChangeWindowAttributes *    *  The value-mask specifies which attributes are to be changed; the *  value-list contains one value for each one bit in the mask, from least *  to most significant bit in the mask.   *****/ intChangeWindowAttributes(pWin, vmask, vlist, client)    register WindowPtr pWin;    Mask vmask;    XID *vlist;    ClientPtr client;{    register Mask index2;    register XID *pVlist;    PixmapPtr pPixmap;    Pixmap pixID;    CursorPtr pCursor, pOldCursor;    Cursor cursorID;    WindowPtr pChild;    Colormap cmap;    ColormapPtr	pCmap;    xEvent xE;    int result;    register ScreenPtr pScreen;    Mask vmaskCopy = 0;    register Mask tmask;    unsigned int val;    int error;    Bool checkOptional = FALSE;    Bool borderRelative = FALSE;    WindowPtr pLayerWin;    if ((pWin->drawable.class == InputOnly) && (vmask & (~INPUTONLY_LEGAL_MASK)))	return BadMatch;    error = Success;    pScreen = pWin->drawable.pScreen;    pVlist = vlist;    tmask = vmask;    while (tmask)    {	index2 = (Mask) lowbit (tmask);	tmask &= ~index2;	switch (index2)	{	  case CWBackPixmap:	    pixID = (Pixmap )*pVlist;	    pVlist++;	    if (pWin->backgroundState == ParentRelative)		borderRelative = TRUE;	    if (pixID == None)	    {#ifdef XCSECURITY		/*  can't let untrusted clients have background None windows */		if (client->trustLevel == XSecurityClientTrusted)		{#endif		if (pWin->backgroundState == BackgroundPixmap)		    (*pScreen->DestroyPixmap)(pWin->background.pixmap);		if (!pWin->parent)		    MakeRootTile(pWin);		else		    pWin->backgroundState = None;#ifdef XCSECURITY		}		else		{ /* didn't change the background to None, so don't tell ddx */		    index2 = 0; 		}#endif	    }	    else if (pixID == ParentRelative)	    {		if (pWin->parent &&		    pWin->drawable.depth != pWin->parent->drawable.depth)		{		    error = BadMatch;		    goto PatchUp;		}		if (pWin->backgroundState == BackgroundPixmap)		    (*pScreen->DestroyPixmap)(pWin->background.pixmap);		if (!pWin->parent)		    MakeRootTile(pWin);		else		    pWin->backgroundState = ParentRelative;		borderRelative = TRUE;		/* Note that the parent's backgroundTile's refcnt is NOT		 * incremented. */	    }	    else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -