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

📄 tkwindow.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 5 页
字号:
 *	the first time the window is mapped. * *---------------------------------------------------------------------- */Tk_WindowTk_CreateWindowFromPath(interp, tkwin, pathName, screenName)    Tcl_Interp *interp;		/* Interpreter to use for error reporting.				 * Interp->result is assumed to be				 * initialized by the caller. */    Tk_Window tkwin;		/* Token for any window in application				 * that is to contain new window. */    char *pathName;		/* Path name for new window within the				 * application of tkwin.  The parent of				 * this window must already exist, but				 * the window itself must not exist. */    char *screenName;		/* If NULL, new window will be on same				 * screen as its parent.  If non-NULL,				 * gives name of screen on which to create				 * new window;  window will be a top-level				 * window. */{#define FIXED_SPACE 5    char fixedSpace[FIXED_SPACE+1];    char *p;    Tk_Window parent;    int numChars;    /*     * Strip the parent's name out of pathName (it's everything up     * to the last dot).  There are two tricky parts: (a) must     * copy the parent's name somewhere else to avoid modifying     * the pathName string (for large names, space for the copy     * will have to be malloc'ed);  (b) must special-case the     * situation where the parent is ".".     */    p = strrchr(pathName, '.');    if (p == NULL) {	Tcl_AppendResult(interp, "bad window path name \"", pathName,		"\"", (char *) NULL);	return NULL;    }    numChars = p-pathName;    if (numChars > FIXED_SPACE) {	p = (char *) ckalloc((unsigned) (numChars+1));    } else {	p = fixedSpace;    }    if (numChars == 0) {	*p = '.';	p[1] = '\0';    } else {	strncpy(p, pathName, (size_t) numChars);	p[numChars] = '\0';    }    /*     * Find the parent window.     */    parent = Tk_NameToWindow(interp, p, tkwin);    if (p != fixedSpace) {        ckfree(p);    }    if (parent == NULL) {	return NULL;    }    if (((TkWindow *) parent)->flags & TK_ALREADY_DEAD) {	Tcl_AppendResult(interp, 	    "can't create window: parent has been destroyed", (char *) NULL);	return NULL;    } else if (((TkWindow *) parent)->flags & TK_CONTAINER) {	Tcl_AppendResult(interp, 	    "can't create window: its parent has -container = yes",		(char *) NULL);	return NULL;    }    /*     * Create the window.     */    if (screenName == NULL) {	TkWindow *parentPtr = (TkWindow *) parent;	TkWindow *winPtr;	winPtr = TkAllocWindow(parentPtr->dispPtr, parentPtr->screenNum,		parentPtr);	if (NameWindow(interp, winPtr, parentPtr, pathName+numChars+1)		!= TCL_OK) {	    Tk_DestroyWindow((Tk_Window) winPtr);	    return NULL;	} else {	    return (Tk_Window) winPtr;	}    } else {	return CreateTopLevelWindow(interp, parent, pathName+numChars+1,		screenName);    }}/* *-------------------------------------------------------------- * * Tk_DestroyWindow -- * *	Destroy an existing window.  After this call, the caller *	should never again use the token. * * Results: *	None. * * Side effects: *	The window is deleted, along with all of its children. *	Relevant callback procedures are invoked. * *-------------------------------------------------------------- */voidTk_DestroyWindow(tkwin)    Tk_Window tkwin;		/* Window to destroy. */{    TkWindow *winPtr = (TkWindow *) tkwin;    TkDisplay *dispPtr = winPtr->dispPtr;    XEvent event;    if (winPtr->flags & TK_ALREADY_DEAD) {	/*	 * A destroy event binding caused the window to be destroyed	 * again.  Ignore the request.	 */	return;    }    winPtr->flags |= TK_ALREADY_DEAD;    /*     * Some cleanup needs to be done immediately, rather than later,     * because it needs information that will be destoyed before we     * get to the main cleanup point.  For example, TkFocusDeadWindow     * needs to access the parentPtr field from a window, but if     * a Destroy event handler deletes the window's parent this     * field will be NULL before the main cleanup point is reached.     */    TkFocusDeadWindow(winPtr);    /*     * If this is a main window, remove it from the list of main     * windows.  This needs to be done now (rather than later with     * all the other main window cleanup) to handle situations where     * a destroy binding for a window calls "exit".  In this case     * the child window cleanup isn't complete when exit is called,     * so the reference count of its application doesn't go to zero     * when exit calls Tk_DestroyWindow on ".", so the main window     * doesn't get removed from the list and exit loops infinitely.     * Even worse, if "destroy ." is called by the destroy binding     * before calling "exit", "exit" will attempt to destroy     * mainPtr->winPtr, which no longer exists, and there may be a     * core dump.     *     * Also decrement the display refcount so that if this is the     * last Tk application in this process on this display, the display     * can be closed and its data structures deleted.     */    if (winPtr->mainPtr->winPtr == winPtr) {        dispPtr->refCount--;	if (tkMainWindowList == winPtr->mainPtr) {	    tkMainWindowList = winPtr->mainPtr->nextPtr;	} else {	    TkMainInfo *prevPtr;	    for (prevPtr = tkMainWindowList;		    prevPtr->nextPtr != winPtr->mainPtr;		    prevPtr = prevPtr->nextPtr) {		/* Empty loop body. */	    }	    prevPtr->nextPtr = winPtr->mainPtr->nextPtr;	}	numMainWindows--;    }    /*     * Recursively destroy children.     */    dispPtr->destroyCount++;    while (winPtr->childList != NULL) {	TkWindow *childPtr;	childPtr = winPtr->childList;	childPtr->flags |= TK_DONT_DESTROY_WINDOW;	Tk_DestroyWindow((Tk_Window) childPtr);	if (winPtr->childList == childPtr) {	    /*	     * The child didn't remove itself from the child list, so	     * let's remove it here.  This can happen in some strange	     * conditions, such as when a Delete event handler for a	     * window deletes the window's parent.	     */	    winPtr->childList = childPtr->nextPtr;	    childPtr->parentPtr = NULL;	}    }    if ((winPtr->flags & (TK_CONTAINER|TK_BOTH_HALVES))	    == (TK_CONTAINER|TK_BOTH_HALVES)) {	/*	 * This is the container for an embedded application, and	 * the embedded application is also in this process.  Delete	 * the embedded window in-line here, for the same reasons we	 * delete children in-line (otherwise, for example, the Tk	 * window may appear to exist even though its X window is	 * gone; this could cause errors).  Special note: it's possible	 * that the embedded window has already been deleted, in which	 * case TkpGetOtherWindow will return NULL.	 */	TkWindow *childPtr;	childPtr = TkpGetOtherWindow(winPtr);	if (childPtr != NULL) {	    childPtr->flags |= TK_DONT_DESTROY_WINDOW;	    Tk_DestroyWindow((Tk_Window) childPtr);	}    }    /*     * Generate a DestroyNotify event.  In order for the DestroyNotify     * event to be processed correctly, need to make sure the window     * exists.  This is a bit of a kludge, and may be unnecessarily     * expensive, but without it no event handlers will get called for     * windows that don't exist yet.     *     * Note: if the window's pathName is NULL it means that the window     * was not successfully initialized in the first place, so we should     * not make the window exist or generate the event.     */    if (winPtr->pathName != NULL) {	if (winPtr->window == None) {	    Tk_MakeWindowExist(tkwin);	}	event.type = DestroyNotify;	event.xdestroywindow.serial =		LastKnownRequestProcessed(winPtr->display);	event.xdestroywindow.send_event = False;	event.xdestroywindow.display = winPtr->display;	event.xdestroywindow.event = winPtr->window;	event.xdestroywindow.window = winPtr->window;	Tk_HandleEvent(&event);    }    /*     * Cleanup the data structures associated with this window.     */    if (winPtr->flags & TK_TOP_LEVEL) {	TkWmDeadWindow(winPtr);    } else if (winPtr->flags & TK_WM_COLORMAP_WINDOW) {	TkWmRemoveFromColormapWindows(winPtr);    }    if (winPtr->window != None) {#if defined(MAC_TCL) || defined(__WIN32__)	XDestroyWindow(winPtr->display, winPtr->window);#else	if ((winPtr->flags & TK_TOP_LEVEL)		|| !(winPtr->flags & TK_DONT_DESTROY_WINDOW)) {	    /*	     * The parent has already been destroyed and this isn't	     * a top-level window, so this window will be destroyed	     * implicitly when the parent's X window is destroyed;	     * it's much faster not to do an explicit destroy of this	     * X window.	     */	    dispPtr->lastDestroyRequest = NextRequest(winPtr->display);	    XDestroyWindow(winPtr->display, winPtr->window);	}#endif	TkFreeWindowId(dispPtr, winPtr->window);	Tcl_DeleteHashEntry(Tcl_FindHashEntry(&dispPtr->winTable,		(char *) winPtr->window));	winPtr->window = None;    }    dispPtr->destroyCount--;    UnlinkWindow(winPtr);    TkEventDeadWindow(winPtr);    TkBindDeadWindow(winPtr);#ifdef TK_USE_INPUT_METHODS    if (winPtr->inputContext != NULL) {	XDestroyIC(winPtr->inputContext);    }#endif /* TK_USE_INPUT_METHODS */    if (winPtr->tagPtr != NULL) {	TkFreeBindingTags(winPtr);    }    TkOptionDeadWindow(winPtr);    TkSelDeadWindow(winPtr);    TkGrabDeadWindow(winPtr);    if (winPtr->mainPtr != NULL) {	if (winPtr->pathName != NULL) {	    Tk_DeleteAllBindings(winPtr->mainPtr->bindingTable,		    (ClientData) winPtr->pathName);	    Tcl_DeleteHashEntry(Tcl_FindHashEntry(&winPtr->mainPtr->nameTable,		    winPtr->pathName));	}	winPtr->mainPtr->refCount--;	if (winPtr->mainPtr->refCount == 0) {	    register TkCmd *cmdPtr;	    /*	     * We just deleted the last window in the application.  Delete	     * the TkMainInfo structure too and replace all of Tk's commands	     * with dummy commands that return errors.  Also delete the	     * "send" command to unregister the interpreter.             *             * NOTE: Only replace the commands it if the interpreter is             * not being deleted. If it *is*, the interpreter cleanup will             * do all the needed work.	     */            if ((winPtr->mainPtr->interp != NULL) &&                    (!Tcl_InterpDeleted(winPtr->mainPtr->interp))) {                for (cmdPtr = commands; cmdPtr->name != NULL; cmdPtr++) {                    Tcl_CreateCommand(winPtr->mainPtr->interp, cmdPtr->name,                            TkDeadAppCmd, (ClientData) NULL,                            (void (*) _ANSI_ARGS_((ClientData))) NULL);                }                Tcl_CreateCommand(winPtr->mainPtr->interp, "send",                        TkDeadAppCmd, (ClientData) NULL,                         (void (*) _ANSI_ARGS_((ClientData))) NULL);                Tcl_UnlinkVar(winPtr->mainPtr->interp, "tk_strictMotif");            }                	    Tcl_DeleteHashTable(&winPtr->mainPtr->nameTable);	    TkBindFree(winPtr->mainPtr);	    TkFontPkgFree(winPtr->mainPtr);	    TkDeleteAllImages(winPtr->mainPtr);            /*             * When embedding Tk into other applications, make sure              * that all destroy events reach the server. Otherwise             * the embedding application may also attempt to destroy             * the windows, resulting in an X error             */            if (winPtr->flags & TK_EMBEDDED) {                XSync(winPtr->display,False) ;             }	    ckfree((char *) winPtr->mainPtr);            /*             * If no other applications are using the display, close the             * display now and relinquish its data structures.             */                        if (dispPtr->refCount <= 0) {#ifdef	NOT_YET                /*                 * I have disabled this code because on Windows there are                 * still order dependencies in close-down. All displays                 * and resources will get closed down properly anyway at                 * exit, through the exit handler.                 */                                TkDisplay *theDispPtr, *backDispPtr;                                /*                 * Splice this display out of the list of displays.                 */                                for (theDispPtr = tkDisplayList, backDispPtr = NULL;                         (theDispPtr != winPtr->dispPtr) &&                             (theDispPtr != NULL);                         theDispPtr = theDispPtr->nextPtr) {                    backDispPtr = theDispPtr;                }                if (theDispPtr == NULL) {                    panic("could not find display to close!");                }                if (backDispPtr == NULL) {                    tkDisplayList = theDispPtr->nextPtr;                } else {                    backDispPtr->nextPtr = theDispPtr->nextPtr;                }                                /*                 * Found and spliced it out, now actually do the cleanup.                 */                                if (dispPtr->name != NULL) {                    ckfree(dispPtr->name);                }                                Tcl_DeleteHashTable(&(dispPtr->winTable));		/*                 * Cannot yet close the display because we still have                 * order of deletion problems. Defer until exit handling                 * instead. At that time, the display will cleanly shut                 * down (hopefully..). (JYL)                 */                TkpCloseDisplay(dispPtr);                /*                 * There is lots more to clean up, we leave it at this for                 * the time being.                 */#endif            }	}    }    ckfree((char *) winPtr);}/* *-------------------------------------------------------------- * * Tk_MapWindow -- * *	Map a window within its parent.  This may require the *	window and/or its parents to actually be created. * * Results: *	None. * * Side effects: *	The given window will be mapped.  Windows may also *	be created. * *-------------------------------------------------------------- */voidTk_MapWindow(tkwin)    Tk_Window tkwin;		/* Token for window to map. */{    register TkWindow *winPtr = (TkWindow *) tkwin;    XEvent event;

⌨️ 快捷键说明

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