📄 tkplace.c
字号:
slavePtr->tkwin = tkwin; slavePtr->masterPtr = NULL; slavePtr->nextPtr = NULL; slavePtr->x = slavePtr->y = 0; slavePtr->relX = slavePtr->relY = (float) 0.0; slavePtr->width = slavePtr->height = 0; slavePtr->relWidth = slavePtr->relHeight = (float) 0.0; slavePtr->anchor = TK_ANCHOR_NW; slavePtr->borderMode = BM_INSIDE; slavePtr->flags = 0; Tcl_SetHashValue(hPtr, slavePtr); Tk_CreateEventHandler(tkwin, StructureNotifyMask, SlaveStructureProc, (ClientData) slavePtr); Tk_ManageGeometry(tkwin, &placerType, (ClientData) slavePtr); } else { slavePtr = (Slave *) Tcl_GetHashValue(hPtr); } return slavePtr;}/* *---------------------------------------------------------------------- * * UnlinkSlave -- * * This procedure removes a slave window from the chain of slaves * in its master. * * Results: * None. * * Side effects: * The slave list of slavePtr's master changes. * *---------------------------------------------------------------------- */static voidUnlinkSlave(slavePtr) Slave *slavePtr; /* Slave structure to be unlinked. */{ register Master *masterPtr; register Slave *prevPtr; masterPtr = slavePtr->masterPtr; if (masterPtr == NULL) { return; } if (masterPtr->slavePtr == slavePtr) { masterPtr->slavePtr = slavePtr->nextPtr; } else { for (prevPtr = masterPtr->slavePtr; ; prevPtr = prevPtr->nextPtr) { if (prevPtr == NULL) { panic("UnlinkSlave couldn't find slave to unlink"); } if (prevPtr->nextPtr == slavePtr) { prevPtr->nextPtr = slavePtr->nextPtr; break; } } } slavePtr->masterPtr = NULL;}/* *---------------------------------------------------------------------- * * FindMaster -- * * Given a Tk_Window token, find the Master structure corresponding * to that token (making a new one if necessary). * * Results: * None. * * Side effects: * A new Master structure may be created. * *---------------------------------------------------------------------- */static Master *FindMaster(tkwin) Tk_Window tkwin; /* Token for desired master. */{ Tcl_HashEntry *hPtr; register Master *masterPtr; int new; hPtr = Tcl_CreateHashEntry(&masterTable, (char *) tkwin, &new); if (new) { masterPtr = (Master *) ckalloc(sizeof(Master)); masterPtr->tkwin = tkwin; masterPtr->slavePtr = NULL; masterPtr->flags = 0; Tcl_SetHashValue(hPtr, masterPtr); Tk_CreateEventHandler(masterPtr->tkwin, StructureNotifyMask, MasterStructureProc, (ClientData) masterPtr); } else { masterPtr = (Master *) Tcl_GetHashValue(hPtr); } return masterPtr;}/* *---------------------------------------------------------------------- * * ConfigureSlave -- * * This procedure is called to process an argv/argc list to * reconfigure the placement of a window. * * Results: * A standard Tcl result. If an error occurs then a message is * left in interp->result. * * Side effects: * Information in slavePtr may change, and slavePtr's master is * scheduled for reconfiguration. * *---------------------------------------------------------------------- */static intConfigureSlave(interp, slavePtr, argc, argv) Tcl_Interp *interp; /* Used for error reporting. */ Slave *slavePtr; /* Pointer to current information * about slave. */ int argc; /* Number of config arguments. */ char **argv; /* String values for arguments. */{ register Master *masterPtr; int c, result; size_t length; double d; result = TCL_OK; if (Tk_IsTopLevel(slavePtr->tkwin)) { Tcl_AppendResult(interp, "can't use placer on top-level window \"", Tk_PathName(slavePtr->tkwin), "\"; use wm command instead", (char *) NULL); return TCL_ERROR; } for ( ; argc > 0; argc -= 2, argv += 2) { if (argc < 2) { Tcl_AppendResult(interp, "extra option \"", argv[0], "\" (option with no value?)", (char *) NULL); result = TCL_ERROR; goto done; } length = strlen(argv[0]); c = argv[0][1]; if ((c == 'a') && (strncmp(argv[0], "-anchor", length) == 0)) { if (Tk_GetAnchor(interp, argv[1], &slavePtr->anchor) != TCL_OK) { result = TCL_ERROR; goto done; } } else if ((c == 'b') && (strncmp(argv[0], "-bordermode", length) == 0)) { c = argv[1][0]; length = strlen(argv[1]); if ((c == 'i') && (strncmp(argv[1], "ignore", length) == 0) && (length >= 2)) { slavePtr->borderMode = BM_IGNORE; } else if ((c == 'i') && (strncmp(argv[1], "inside", length) == 0) && (length >= 2)) { slavePtr->borderMode = BM_INSIDE; } else if ((c == 'o') && (strncmp(argv[1], "outside", length) == 0)) { slavePtr->borderMode = BM_OUTSIDE; } else { Tcl_AppendResult(interp, "bad border mode \"", argv[1], "\": must be ignore, inside, or outside", (char *) NULL); result = TCL_ERROR; goto done; } } else if ((c == 'h') && (strncmp(argv[0], "-height", length) == 0)) { if (argv[1][0] == 0) { slavePtr->flags &= ~CHILD_HEIGHT; } else { if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1], &slavePtr->height) != TCL_OK) { result = TCL_ERROR; goto done; } slavePtr->flags |= CHILD_HEIGHT; } } else if ((c == 'i') && (strncmp(argv[0], "-in", length) == 0)) { Tk_Window tkwin; Tk_Window ancestor; tkwin = Tk_NameToWindow(interp, argv[1], slavePtr->tkwin); if (tkwin == NULL) { result = TCL_ERROR; goto done; } /* * Make sure that the new master is either the logical parent * of the slave or a descendant of that window, and that the * master and slave aren't the same. */ for (ancestor = tkwin; ; ancestor = Tk_Parent(ancestor)) { if (ancestor == Tk_Parent(slavePtr->tkwin)) { break; } if (Tk_IsTopLevel(ancestor)) { Tcl_AppendResult(interp, "can't place ", Tk_PathName(slavePtr->tkwin), " relative to ", Tk_PathName(tkwin), (char *) NULL); result = TCL_ERROR; goto done; } } if (slavePtr->tkwin == tkwin) { Tcl_AppendResult(interp, "can't place ", Tk_PathName(slavePtr->tkwin), " relative to itself", (char *) NULL); result = TCL_ERROR; goto done; } if ((slavePtr->masterPtr != NULL) && (slavePtr->masterPtr->tkwin == tkwin)) { /* * Re-using same old master. Nothing to do. */ } else { if ((slavePtr->masterPtr != NULL) && (slavePtr->masterPtr->tkwin != Tk_Parent(slavePtr->tkwin))) { Tk_UnmaintainGeometry(slavePtr->tkwin, slavePtr->masterPtr->tkwin); } UnlinkSlave(slavePtr); slavePtr->masterPtr = FindMaster(tkwin); slavePtr->nextPtr = slavePtr->masterPtr->slavePtr; slavePtr->masterPtr->slavePtr = slavePtr; } } else if ((c == 'r') && (strncmp(argv[0], "-relheight", length) == 0) && (length >= 5)) { if (argv[1][0] == 0) { slavePtr->flags &= ~CHILD_REL_HEIGHT; } else { if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) { result = TCL_ERROR; goto done; } slavePtr->relHeight = (float) d; slavePtr->flags |= CHILD_REL_HEIGHT; } } else if ((c == 'r') && (strncmp(argv[0], "-relwidth", length) == 0) && (length >= 5)) { if (argv[1][0] == 0) { slavePtr->flags &= ~CHILD_REL_WIDTH; } else { if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) { result = TCL_ERROR; goto done; } slavePtr->relWidth = (float) d; slavePtr->flags |= CHILD_REL_WIDTH; } } else if ((c == 'r') && (strncmp(argv[0], "-relx", length) == 0) && (length >= 5)) { if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) { result = TCL_ERROR; goto done; } slavePtr->relX = (float) d; } else if ((c == 'r') && (strncmp(argv[0], "-rely", length) == 0) && (length >= 5)) { if (Tcl_GetDouble(interp, argv[1], &d) != TCL_OK) { result = TCL_ERROR; goto done; } slavePtr->relY = (float) d; } else if ((c == 'w') && (strncmp(argv[0], "-width", length) == 0)) { if (argv[1][0] == 0) { slavePtr->flags &= ~CHILD_WIDTH; } else { if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1], &slavePtr->width) != TCL_OK) { result = TCL_ERROR; goto done; } slavePtr->flags |= CHILD_WIDTH; } } else if ((c == 'x') && (strncmp(argv[0], "-x", length) == 0)) { if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1], &slavePtr->x) != TCL_OK) { result = TCL_ERROR; goto done; } } else if ((c == 'y') && (strncmp(argv[0], "-y", length) == 0)) { if (Tk_GetPixels(interp, slavePtr->tkwin, argv[1], &slavePtr->y) != TCL_OK) { result = TCL_ERROR; goto done; } } else { Tcl_AppendResult(interp, "unknown or ambiguous option \"", argv[0], "\": must be -anchor, -bordermode, -height, ", "-in, -relheight, -relwidth, -relx, -rely, -width, ", "-x, or -y", (char *) NULL); result = TCL_ERROR; goto done; } } /* * If there's no master specified for this slave, use its Tk_Parent. * Then arrange for a placement recalculation in the master. */ done: masterPtr = slavePtr->masterPtr; if (masterPtr == NULL) { masterPtr = FindMaster(Tk_Parent(slavePtr->tkwin)); slavePtr->masterPtr = masterPtr; slavePtr->nextPtr = masterPtr->slavePtr; masterPtr->slavePtr = slavePtr; } if (!(masterPtr->flags & PARENT_RECONFIG_PENDING)) { masterPtr->flags |= PARENT_RECONFIG_PENDING; Tcl_DoWhenIdle(RecomputePlacement, (ClientData) masterPtr); } return result;}/* *---------------------------------------------------------------------- * * RecomputePlacement -- * * This procedure is called as a when-idle handler. It recomputes * the geometries of all the slaves of a given master. * * Results: * None. * * Side effects: * Windows may change size or shape. * *---------------------------------------------------------------------- */static voidRecomputePlacement(clientData) ClientData clientData; /* Pointer to Master record. */{ register Master *masterPtr = (Master *) clientData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -