diff options
Diffstat (limited to 'macosx/tkMacOSXSubwindows.c')
-rw-r--r-- | macosx/tkMacOSXSubwindows.c | 642 |
1 files changed, 305 insertions, 337 deletions
diff --git a/macosx/tkMacOSXSubwindows.c b/macosx/tkMacOSXSubwindows.c index d536a1b..18dc2ec 100644 --- a/macosx/tkMacOSXSubwindows.c +++ b/macosx/tkMacOSXSubwindows.c @@ -1,16 +1,16 @@ -/* +/* * tkMacOSXSubwindows.c -- * * Implements subwindows for the macintosh version of Tk. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * Copyright 2001, Apple Computer, Inc. - * Copyright (c) 2006 Daniel A. Steffen <das@users.sourceforge.net> + * Copyright (c) 2006-2007 Daniel A. Steffen <das@users.sourceforge.net> * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacOSXSubwindows.c,v 1.2.2.13 2006/10/31 22:33:38 das Exp $ + * RCS: @(#) $Id: tkMacOSXSubwindows.c,v 1.2.2.14 2007/04/29 02:26:50 das Exp $ */ #include "tkMacOSXInt.h" @@ -18,23 +18,19 @@ #include "tkMacOSXWm.h" /* -#ifdef TK_MAC_DEBUG +#ifdef TK_MAC_DEBUG #define TK_MAC_DEBUG_CLIP_REGIONS #endif */ /* - * Temporary region that can be reused. - */ -static RgnHandle tmpRgn = NULL; - -/* * Prototypes for functions used only in this file. */ static void GenerateConfigureNotify (TkWindow *winPtr, int includeWin); static void UpdateOffsets (TkWindow *winPtr, int deltaX, int deltaY); + /* *---------------------------------------------------------------------- * @@ -51,13 +47,13 @@ static void UpdateOffsets (TkWindow *winPtr, int deltaX, int deltaY); *---------------------------------------------------------------------- */ -void +void XDestroyWindow( Display* display, /* Display. */ Window window) /* Window. */ { MacDrawable *macWin = (MacDrawable *) window; - CGrafPtr destPort; + CGrafPtr destPort; /* * Remove any dangling pointers that may exist if * the window we are deleting is being tracked by @@ -68,68 +64,69 @@ XDestroyWindow( macWin->toplevel->referenceCount--; if (Tk_IsTopLevel(macWin->winPtr)) { - WindowRef winRef; - /* - * We are relying on the Activate Mac OS event to pass the - * focus away from a window that is getting Destroyed to the - * Front non-floating window. BUT we don't get activate events - * when a floating window is destroyed - since the front non-floating - * window doesn't in fact get activated... So maybe we can check here - * and if we are destroying a floating window, we can pass the focus - * back to the front non-floating window... - */ - - if (macWin->grafPtr != NULL) { - TkWindow *focusPtr = TkGetFocusWin(macWin->winPtr); - if (focusPtr == NULL || (focusPtr->mainPtr->winPtr == macWin->winPtr)) { - winRef = GetWindowFromPort(macWin->grafPtr); - if (TkpIsWindowFloating (winRef)) { - Window window; - - window = TkMacOSXGetXWindow(ActiveNonFloatingWindow()); - if (window != None) { - TkMacOSXGenerateFocusEvent(window, 1); - } - } - } - } + WindowRef winRef; + /* + * We are relying on the Activate Mac OS event to pass the + * focus away from a window that is getting Destroyed to the + * Front non-floating window. BUT we don't get activate events + * when a floating window is destroyed - since the front non-floating + * window doesn't in fact get activated... So maybe we can check here + * and if we are destroying a floating window, we can pass the focus + * back to the front non-floating window... + */ + + if (macWin->grafPtr != NULL) { + TkWindow *focusPtr = TkGetFocusWin(macWin->winPtr); + if (focusPtr == NULL || (focusPtr->mainPtr->winPtr == macWin->winPtr)) { + winRef = GetWindowFromPort(macWin->grafPtr); + if (TkpIsWindowFloating (winRef)) { + Window window; + + window = TkMacOSXGetXWindow(ActiveNonFloatingWindow()); + if (window != None) { + TkMacOSXGenerateFocusEvent(window, 1); + } + } + } + } DisposeRgn(macWin->clipRgn); DisposeRgn(macWin->aboveClipRgn); - + DisposeRgn(macWin->drawRgn); + /* * Delete the Mac window and remove it from the windowTable. * The window could be NULL if the window was never mapped. * However, we don't do this for embedded windows, they don't * go in the window list, and they do not own their portPtr's. */ - + if (!(Tk_IsEmbedded(macWin->winPtr))) { - destPort = TkMacOSXGetDrawablePort(window); + destPort = TkMacOSXGetDrawablePort(window); if (destPort != NULL) { - TkMacOSXWindowList *listPtr, *prevPtr; - WindowRef winRef; - winRef = GetWindowFromPort(destPort); - TkMacOSXUnregisterMacWindow(winRef); - DisposeWindow(winRef); - - for (listPtr = tkMacOSXWindowListPtr, prevPtr = NULL; - tkMacOSXWindowListPtr != NULL; - prevPtr = listPtr, listPtr = listPtr->nextPtr) { - if (listPtr->winPtr == macWin->winPtr) { - if (prevPtr == NULL) { - tkMacOSXWindowListPtr = listPtr->nextPtr; - } else { - prevPtr->nextPtr = listPtr->nextPtr; - } - ckfree((char *) listPtr); - break; - } - } + TkMacOSXWindowList *listPtr, *prevPtr; + WindowRef winRef; + winRef = GetWindowFromPort(destPort); + TkMacOSXUnregisterMacWindow(winRef); + DisposeWindow(winRef); + + for (listPtr = tkMacOSXWindowListPtr, prevPtr = NULL; + tkMacOSXWindowListPtr != NULL; + prevPtr = listPtr, listPtr = listPtr->nextPtr) { + if (listPtr->winPtr == macWin->winPtr) { + if (prevPtr == NULL) { + tkMacOSXWindowListPtr = listPtr->nextPtr; + } else { + prevPtr->nextPtr = listPtr->nextPtr; + } + ckfree((char *) listPtr); + break; + } + } } } - + macWin->grafPtr = NULL; - + /* * Delay deletion of a toplevel data structure untill all * children have been deleted. @@ -138,18 +135,14 @@ XDestroyWindow( ckfree((char *) macWin->toplevel); } } else { - CGrafPtr destPort; - destPort = TkMacOSXGetDrawablePort(window); - if (destPort != NULL) { - SetGWorld(destPort, NULL); - TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); - } + TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); if (macWin->winPtr->parentPtr != NULL) { TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr->parentPtr); } DisposeRgn(macWin->clipRgn); DisposeRgn(macWin->aboveClipRgn); - + DisposeRgn(macWin->drawRgn); + if (macWin->toplevel->referenceCount == 0) { ckfree((char *) macWin->toplevel); } @@ -162,7 +155,7 @@ XDestroyWindow( * * XMapWindow -- * - * Map the given X Window to the screen. See X window documentation + * Map the given X Window to the screen. See X window documentation * for more details. * * Results: @@ -174,7 +167,7 @@ XDestroyWindow( *---------------------------------------------------------------------- */ -void +void XMapWindow( Display* display, /* Display. */ Window window) /* Window. */ @@ -186,7 +179,7 @@ XMapWindow( /* * Under certain situations it's possible for this function to be * called before the toplevel window it's associated with has actually - * been mapped. In that case we need to create the real Macintosh + * been mapped. In that case we need to create the real Macintosh * window now as this function as well as other X functions assume that * the portPtr is valid. */ @@ -204,7 +197,7 @@ XMapWindow( * XXX windows that have a wmPtr->master parent set. */ WindowRef wRef = GetWindowFromPort(destPort); - if ((TkMacOSXWindowClass(macWin->winPtr) == kSheetWindowClass) + if ((macWin->winPtr->wmInfoPtr->macClass == kSheetWindowClass) && (macWin->winPtr->wmInfoPtr->master != None)) { ShowSheetWindow(wRef, GetWindowFromPort(TkMacOSXGetDrawablePort(macWin->winPtr->wmInfoPtr->master))); @@ -212,25 +205,25 @@ XMapWindow( ShowWindow(wRef); } } + TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr); - /* + /* * We only need to send the MapNotify event * for toplevel windows. */ event.xany.serial = display->request; event.xany.send_event = False; event.xany.display = display; - + event.xmap.window = window; event.xmap.type = MapNotify; event.xmap.event = window; event.xmap.override_redirect = macWin->winPtr->atts.override_redirect; Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); } else { - /* - * Generate damage for that area of the window + /* + * Generate damage for that area of the window */ - SetGWorld(destPort, NULL); TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr->parentPtr); TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); } @@ -241,7 +234,7 @@ XMapWindow( * * XUnmapWindow -- * - * Unmap the given X Window to the screen. See X window + * Unmap the given X Window to the screen. See X window * documentation for more details. * * Results: @@ -253,7 +246,7 @@ XMapWindow( *---------------------------------------------------------------------- */ -void +void XUnmapWindow( Display* display, /* Display. */ Window window) /* Window. */ @@ -273,15 +266,16 @@ XUnmapWindow( * XXX windows that have a wmPtr->master parent set. */ WindowRef wref = GetWindowFromPort(destPort); - if ((TkMacOSXWindowClass(macWin->winPtr) == kSheetWindowClass) + if ((macWin->winPtr->wmInfoPtr->macClass == kSheetWindowClass) && (macWin->winPtr->wmInfoPtr->master != None)) { HideSheetWindow(wref); } else { HideWindow(wref); } } + TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr); - /* + /* * We only need to send the UnmapNotify event * for toplevel windows. */ @@ -295,10 +289,9 @@ XUnmapWindow( event.xunmap.from_configure = false; Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL); } else { - /* + /* * Generate damage for that area of the window. */ - SetGWorld(destPort, NULL); TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr->parentPtr); } @@ -309,7 +302,7 @@ XUnmapWindow( * * XResizeWindow -- * - * Resize a given X window. See X windows documentation for + * Resize a given X window. See X windows documentation for * further details. * * Results: @@ -321,104 +314,99 @@ XUnmapWindow( *---------------------------------------------------------------------- */ -void +void XResizeWindow( Display* display, /* Display. */ - Window window, /* Window. */ + Window window, /* Window. */ unsigned int width, unsigned int height) { MacDrawable *macWin = (MacDrawable *) window; - CGrafPtr destPort; - int havePort = 1; + CGrafPtr destPort; destPort = TkMacOSXGetDrawablePort(window); - if (destPort == NULL) { - havePort = 0; - } - display->request++; if (Tk_IsTopLevel(macWin->winPtr)) { if (!Tk_IsEmbedded(macWin->winPtr)) { - /* + /* * NOTE: we are not adding the new space to the update - * region. It is currently assumed that Tk will need + * region. It is currently assumed that Tk will need * to completely redraw anway. */ - if (havePort) { - SetPort(destPort); - SizeWindow(GetWindowFromPort(destPort), - (short) width, (short) height, false); - TkMacOSXInvalidateWindow(macWin, TK_WINDOW_ONLY); - TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr); - } + if (destPort) { + WindowRef w = GetWindowFromPort(destPort); + Rect bounds; + + ChkErr(GetWindowBounds, w, kWindowContentRgn, &bounds); + bounds.right = bounds.left + width; + bounds.bottom = bounds.top + height; + ChkErr(SetWindowBounds, w, kWindowContentRgn, &bounds); + TkMacOSXInvalidateWindow(macWin, TK_WINDOW_ONLY); + } } else { int deltaX, deltaY; - + /* * Find the Parent window - - * For an embedded window this will be its container. + * For an embedded window this will be its container. */ TkWindow *contWinPtr; - + contWinPtr = TkpGetOtherWindow(macWin->winPtr); - + if (contWinPtr != NULL) { - MacDrawable *macParent = contWinPtr->privatePtr; + MacDrawable *macParent = contWinPtr->privatePtr; - if (havePort) { - SetPort(destPort); + if (destPort) { TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); - TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr); + TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr); } deltaX = macParent->xOff + macWin->winPtr->changes.x - macWin->xOff; deltaY = macParent->yOff + macWin->winPtr->changes.y - macWin->yOff; - + UpdateOffsets(macWin->winPtr, deltaX, deltaY); } else { - /* - * This is the case where we are embedded in - * another app. At this point, we are assuming that - * the changes.x,y is not maintained, if you need + /* + * This is the case where we are embedded in + * another app. At this point, we are assuming that + * the changes.x,y is not maintained, if you need * the info get it from Tk_GetRootCoords, - * and that the toplevel sits at 0,0 when it is drawn. - */ - + * and that the toplevel sits at 0,0 when it is drawn. + */ + TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); UpdateOffsets(macWin->winPtr, 0, 0); } - - } + + } } else { /* TODO: update all xOff & yOffs */ int deltaX, deltaY, parentBorderwidth; MacDrawable *macParent = macWin->winPtr->parentPtr->privatePtr; - + if (macParent == NULL) { return; /* TODO: Probably should be a panic */ } - - if (havePort) { - SetPort(destPort); + + if (destPort) { TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); - TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr); - } + TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr); + } deltaX = - macWin->xOff; deltaY = - macWin->yOff; parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width; - + deltaX += macParent->xOff + parentBorderwidth + macWin->winPtr->changes.x; deltaY += macParent->yOff + parentBorderwidth + macWin->winPtr->changes.y; - + UpdateOffsets(macWin->winPtr, deltaX, deltaY); } } - /* *---------------------------------------------------------------------- @@ -426,9 +414,9 @@ XResizeWindow( * GenerateConfigureNotify -- * * Generates ConfigureNotify events for all the child widgets - * of the widget passed in the winPtr parameter. If includeWin - * is true, also generates ConfigureNotify event for the - * widget itself. + * of the widget passed in the winPtr parameter. If includeWin + * is true, also generates ConfigureNotify event for the + * widget itself. * * Results: * None. @@ -445,24 +433,23 @@ GenerateConfigureNotify (TkWindow *winPtr, int includeWin) TkWindow *childPtr; for (childPtr = winPtr->childList; childPtr != NULL; - childPtr = childPtr->nextPtr) { - if (!Tk_IsMapped(childPtr) || Tk_IsTopLevel(childPtr)) { - continue; - } - GenerateConfigureNotify(childPtr, 1); + childPtr = childPtr->nextPtr) { + if (!Tk_IsMapped(childPtr) || Tk_IsTopLevel(childPtr)) { + continue; + } + GenerateConfigureNotify(childPtr, 1); } if (includeWin) { - TkDoConfigureNotify(winPtr); + TkDoConfigureNotify(winPtr); } -} - - +} + /* *---------------------------------------------------------------------- * * XMoveResizeWindow -- * - * Move or resize a given X window. See X windows documentation + * Move or resize a given X window. See X windows documentation * for further details. * * Results: @@ -474,83 +461,79 @@ GenerateConfigureNotify (TkWindow *winPtr, int includeWin) *---------------------------------------------------------------------- */ -void +void XMoveResizeWindow( Display* display, /* Display. */ - Window window, /* Window. */ + Window window, /* Window. */ int x, int y, unsigned int width, unsigned int height) -{ +{ MacDrawable * macWin = (MacDrawable *) window; - CGrafPtr destPort; - int havePort = 1; + CGrafPtr destPort; destPort = TkMacOSXGetDrawablePort(window); - if (destPort == NULL) { - havePort = 0; - } - - if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { - /* + if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { + /* * NOTE: we are not adding the new space to the update - * region. It is currently assumed that Tk will need + * region. It is currently assumed that Tk will need * to completely redraw anway. */ - if (havePort) { - SetPort( destPort); - SizeWindow(GetWindowFromPort(destPort), - (short) width, (short) height, false); - MoveWindowStructure(GetWindowFromPort(destPort), x, y); - + if (destPort) { + Rect bounds; + + bounds.left = x + macWin->winPtr->wmInfoPtr->xInParent; + bounds.right = bounds.left + width; + bounds.top = y + macWin->winPtr->wmInfoPtr->yInParent; + bounds.bottom = bounds.top + height; + ChkErr(SetWindowBounds, GetWindowFromPort(destPort), + kWindowContentRgn, &bounds); TkMacOSXInvalidateWindow(macWin, TK_WINDOW_ONLY); - TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr); - } + } } else { int deltaX, deltaY, parentBorderwidth; Rect bounds; MacDrawable *macParent; - - /* - * Find the Parent window - - * For an embedded window this will be its container. - */ - + + /* + * Find the Parent window - + * For an embedded window this will be its container. + */ + if (Tk_IsEmbedded(macWin->winPtr)) { TkWindow *contWinPtr; - + contWinPtr = TkpGetOtherWindow(macWin->winPtr); if (contWinPtr == NULL) { Tcl_Panic("XMoveResizeWindow could not find container"); } macParent = contWinPtr->privatePtr; - + /* * NOTE: Here we should handle out of process embedding. */ - - + + } else { - macParent = macWin->winPtr->parentPtr->privatePtr; + macParent = macWin->winPtr->parentPtr->privatePtr; if (macParent == NULL) { - return; /* TODO: Probably should be a panic */ + return; /* TODO: Probably should be a panic */ } } - if (havePort) { - SetPort( destPort); + if (destPort) { TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr); } deltaX = - macWin->xOff; deltaY = - macWin->yOff; - - /* + + /* * If macWin->winPtr is an embedded window, don't offset by its * parent's borderwidth... */ - + if (!Tk_IsEmbedded(macWin->winPtr)) { parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width; } else { @@ -560,13 +543,13 @@ XMoveResizeWindow( macWin->winPtr->changes.x; deltaY += macParent->yOff + parentBorderwidth + macWin->winPtr->changes.y; - + UpdateOffsets(macWin->winPtr, deltaX, deltaY); - if (havePort) { + if (destPort) { TkMacOSXWinBounds(macWin->winPtr, &bounds); InvalWindowRect(GetWindowFromPort(destPort),&bounds); - } - GenerateConfigureNotify(macWin->winPtr, 0); + } + GenerateConfigureNotify(macWin->winPtr, 0); } } @@ -575,7 +558,7 @@ XMoveResizeWindow( * * XMoveWindow -- * - * Move a given X window. See X windows documentation for further + * Move a given X window. See X windows documentation for further * details. * * Results: @@ -587,7 +570,7 @@ XMoveResizeWindow( *---------------------------------------------------------------------- */ -void +void XMoveWindow( Display* display, /* Display. */ Window window, /* Window. */ @@ -596,70 +579,64 @@ XMoveWindow( { MacDrawable *macWin = (MacDrawable *) window; CGrafPtr destPort; - int havePort = 1; destPort = TkMacOSXGetDrawablePort(window); - if (destPort == NULL) { - havePort = 0; - } if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { - /* + /* * NOTE: we are not adding the new space to the update - * region. It is currently assumed that Tk will need + * region. It is currently assumed that Tk will need * to completely redraw anway. */ - if (havePort) { - SetPort(destPort); - MoveWindowStructure( GetWindowFromPort(destPort), x, y); + if (destPort) { + WindowRef w = GetWindowFromPort(destPort); + MoveWindowStructure(w, x, y); TkMacOSXInvalidateWindow(macWin, TK_WINDOW_ONLY); - TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr); - } + } } else { int deltaX, deltaY, parentBorderwidth; Rect bounds; MacDrawable *macParent; - - /* - * Find the Parent window - - * For an embedded window this will be its container. - */ - + + /* + * Find the Parent window - + * For an embedded window this will be its container. + */ + if (Tk_IsEmbedded(macWin->winPtr)) { TkWindow *contWinPtr; - + contWinPtr = TkpGetOtherWindow(macWin->winPtr); if (contWinPtr == NULL) { Tcl_Panic("XMoveWindow could not find container"); } macParent = contWinPtr->privatePtr; - + /* * NOTE: Here we should handle out of process embedding. */ - + } else { - macParent = macWin->winPtr->parentPtr->privatePtr; + macParent = macWin->winPtr->parentPtr->privatePtr; if (macParent == NULL) { - return; /* TODO: Probably should be a panic */ + return; /* TODO: Probably should be a panic */ } } - if (havePort) { - SetPort(destPort); + if (destPort) { TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW); TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr); - } - + } + deltaX = - macWin->xOff; deltaY = - macWin->yOff; - - /* + + /* * If macWin->winPtr is an embedded window, don't offset by its * parent's borderwidth... */ - + if (!Tk_IsEmbedded(macWin->winPtr)) { parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width; } else { @@ -669,12 +646,12 @@ XMoveWindow( macWin->winPtr->changes.x; deltaY += macParent->yOff + parentBorderwidth + macWin->winPtr->changes.y; - + UpdateOffsets(macWin->winPtr, deltaX, deltaY); - if (havePort) { - TkMacOSXWinBounds(macWin->winPtr, &bounds); + if (destPort) { + TkMacOSXWinBounds(macWin->winPtr, &bounds); InvalWindowRect(GetWindowFromPort(destPort),&bounds); - } + } GenerateConfigureNotify(macWin->winPtr, 0); } } @@ -695,18 +672,18 @@ XMoveWindow( *---------------------------------------------------------------------- */ -void +void XRaiseWindow( Display* display, /* Display. */ Window window) /* Window. */ { MacDrawable *macWin = (MacDrawable *) window; - + display->request++; if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { TkWmRestackToplevel(macWin->winPtr, Above, NULL); } else { - /* TODO: this should generate damage */ + /* TODO: this should generate damage */ } } @@ -727,18 +704,18 @@ XRaiseWindow( *---------------------------------------------------------------------- */ -void +void XLowerWindow( Display* display, /* Display. */ Window window) /* Window. */ { MacDrawable *macWin = (MacDrawable *) window; - + display->request++; if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) { TkWmRestackToplevel(macWin->winPtr, Below, NULL); } else { - /* TODO: this should generate damage */ + /* TODO: this should generate damage */ } } #endif @@ -755,7 +732,7 @@ XLowerWindow( * None. * * Side effects: - * Changes the attributes of the specified window. Note that we + * Changes the attributes of the specified window. Note that we * ignore the passed in values and use the values stored in the * TkWindow data structure. * @@ -784,8 +761,8 @@ XConfigureWindow( } /* - * Change the stacking order of the window. Tk actuall keeps all - * the information we need for stacking order. All we need to do + * Change the stacking order of the window. Tk actuall keeps all + * the information we need for stacking order. All we need to do * is make sure the clipping regions get updated and generate damage * that will ensure things get drawn correctly. */ @@ -793,28 +770,27 @@ XConfigureWindow( if (value_mask & CWStackMode) { Rect bounds; CGrafPtr destPort; - + destPort = TkMacOSXGetDrawablePort(w); if (destPort != NULL) { - SetPort( destPort); TkMacOSXInvalClipRgns((Tk_Window) winPtr->parentPtr); TkMacOSXWinBounds(winPtr, &bounds); InvalWindowRect(GetWindowFromPort(destPort),&bounds); } - } + } - /* TkGenWMMoveRequestEvent(macWin->winPtr, + /* TkGenWMMoveRequestEvent(macWin->winPtr, macWin->winPtr->changes.x, macWin->winPtr->changes.y); */ } /* *---------------------------------------------------------------------- * - * TkMacOSXUpdateClipRgn -- + * TkMacOSXUpdateClipRgn -- * * This function updates the cliping regions for a given window - * and all of its children. Once updated the TK_CLIP_INVALID flag - * in the subwindow data structure is unset. The TK_CLIP_INVALID + * and all of its children. Once updated the TK_CLIP_INVALID flag + * in the subwindow data structure is unset. The TK_CLIP_INVALID * flag should always be unset before any drawing is attempted. * * Results: @@ -841,21 +817,18 @@ TkMacOSXUpdateClipRgn( if (winPtr->privatePtr && winPtr->privatePtr->flags & TK_CLIP_INVALID) { if (Tk_IsMapped(winPtr)) { rgn = winPtr->privatePtr->aboveClipRgn; - if (tmpRgn == NULL) { - tmpRgn = NewRgn(); - } - /* + /* * Start with a region defined by the window bounds. */ x = winPtr->privatePtr->xOff; y = winPtr->privatePtr->yOff; SetRectRgn(rgn, (short) x, (short) y, - (short) (winPtr->changes.width + x), + (short) (winPtr->changes.width + x), (short) (winPtr->changes.height + y)); - /* + /* * Clip away the area of any windows that may obscure this * window. * For a non-toplevel window, first, clip to the parents visible @@ -863,14 +836,15 @@ TkMacOSXUpdateClipRgn( * Second, clip away any siblings that are higher in the * stacking order. * For an embedded toplevel, just clip to the container's visible - * clip region. Remember, we only allow one contained window + * clip region. Remember, we only allow one contained window * in a frame, and don't support any other widgets in the frame * either. This is not currently enforced, however. */ - if (!Tk_IsTopLevel(winPtr)) { + if (!Tk_IsTopLevel(winPtr)) { TkMacOSXUpdateClipRgn(winPtr->parentPtr); - SectRgn(rgn, + TkMacOSXCheckTmpRgnEmpty(1); + SectRgn(rgn, winPtr->parentPtr->privatePtr->aboveClipRgn, rgn); win2Ptr = winPtr->nextPtr; @@ -881,10 +855,10 @@ TkMacOSXUpdateClipRgn( } x = win2Ptr->privatePtr->xOff; y = win2Ptr->privatePtr->yOff; - SetRectRgn(tmpRgn, (short) x, (short) y, - (short) (win2Ptr->changes.width + x), + SetRectRgn(tkMacOSXtmpRgn1, (short) x, (short) y, + (short) (win2Ptr->changes.width + x), (short) (win2Ptr->changes.height + y)); - DiffRgn(rgn, tmpRgn, rgn); + DiffRgn(rgn, tkMacOSXtmpRgn1, rgn); win2Ptr = win2Ptr->nextPtr; } @@ -893,11 +867,14 @@ TkMacOSXUpdateClipRgn( if (contWinPtr != NULL) { TkMacOSXUpdateClipRgn(contWinPtr); - SectRgn(rgn, + TkMacOSXCheckTmpRgnEmpty(1); + SectRgn(rgn, contWinPtr->privatePtr->aboveClipRgn, rgn); } else if (tkMacOSXEmbedHandler != NULL) { - tkMacOSXEmbedHandler->getClipProc((Tk_Window) winPtr, tmpRgn); - SectRgn(rgn, tmpRgn, rgn); + TkMacOSXCheckTmpRgnEmpty(1); + tkMacOSXEmbedHandler->getClipProc((Tk_Window) winPtr, + tkMacOSXtmpRgn1); + SectRgn(rgn, tkMacOSXtmpRgn1, rgn); } /* @@ -906,10 +883,10 @@ TkMacOSXUpdateClipRgn( } - /* + /* * The final clip region is the aboveClip region (or visible * region) minus all the children of this window. - * Alternatively, if the window is a container, we must also + * Alternatively, if the window is a container, we must also * subtract the region of the embedded window. */ @@ -924,10 +901,10 @@ TkMacOSXUpdateClipRgn( } x = win2Ptr->privatePtr->xOff; y = win2Ptr->privatePtr->yOff; - SetRectRgn(tmpRgn, (short) x, (short) y, - (short) (win2Ptr->changes.width + x), + SetRectRgn(tkMacOSXtmpRgn1, (short) x, (short) y, + (short) (win2Ptr->changes.width + x), (short) (win2Ptr->changes.height + y)); - DiffRgn(rgn, tmpRgn, rgn); + DiffRgn(rgn, tkMacOSXtmpRgn1, rgn); win2Ptr = win2Ptr->nextPtr; } @@ -938,18 +915,19 @@ TkMacOSXUpdateClipRgn( if (Tk_IsMapped(win2Ptr)) { x = win2Ptr->privatePtr->xOff; y = win2Ptr->privatePtr->yOff; - SetRectRgn(tmpRgn, (short) x, (short) y, - (short) (win2Ptr->changes.width + x), + SetRectRgn(tkMacOSXtmpRgn1, (short) x, (short) y, + (short) (win2Ptr->changes.width + x), (short) (win2Ptr->changes.height + y)); - DiffRgn(rgn, tmpRgn, rgn); + DiffRgn(rgn, tkMacOSXtmpRgn1, rgn); } - } + } /* * NOTE: Here we should handle out of process embedding. */ } + SetEmptyRgn(tkMacOSXtmpRgn1); } else { /* * An unmapped window has empty clip regions to prevent any @@ -957,7 +935,7 @@ TkMacOSXUpdateClipRgn( * visible. [Bug 940117] */ - if (!Tk_IsTopLevel(winPtr)) { + if (!Tk_IsTopLevel(winPtr)) { TkMacOSXUpdateClipRgn(winPtr->parentPtr); } else if (Tk_IsEmbedded(winPtr)) { TkWindow *contWinPtr = TkpGetOtherWindow(winPtr); @@ -972,7 +950,7 @@ TkMacOSXUpdateClipRgn( winPtr->privatePtr->flags &= ~TK_CLIP_INVALID; -#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_CLIP_REGIONS) +#ifdef TK_MAC_DEBUG_CLIP_REGIONS TkMacOSXInitNamedDebugSymbol(HIToolbox, int, QDDebugFlashRegion, CGrafPtr port, RgnHandle region); if (QDDebugFlashRegion) { @@ -991,8 +969,8 @@ TkMacOSXUpdateClipRgn( * * TkMacOSXVisableClipRgn -- * - * This function returnd the Macintosh cliping region for the - * given window. A NULL Rgn means the window is not visible. + * This function returnd the Macintosh cliping region for the + * given window. A NULL Rgn means the window is not visible. * * Results: * The region. @@ -1033,7 +1011,7 @@ TkMacOSXVisableClipRgn( void TkMacOSXInvalidateWindow( - MacDrawable *macWin, /* Make window that's causing damage. */ + MacDrawable *macWin, /* Make window that's causing damage. */ int flag) /* Should be TK_WINDOW_ONLY or * TK_PARENT_WINDOW */ { @@ -1053,7 +1031,7 @@ TkMacOSXInvalidateWindow( InvalWindowRgn(windowRef, macWin->aboveClipRgn); } -#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_CLIP_REGIONS) +#ifdef TK_MAC_DEBUG_CLIP_REGIONS TkMacOSXInitNamedDebugSymbol(HIToolbox, int, QDDebugFlashRegion, CGrafPtr port, RgnHandle region); if (QDDebugFlashRegion) { @@ -1073,7 +1051,7 @@ TkMacOSXInvalidateWindow( * This function returns the Graphics Port for a given X drawable. * * Results: - * A CGrafPort . Either an off screen pixmap or a Window. + * A CGrafPort . Either an off screen pixmap or a Window. * * Side effects: * None. @@ -1086,68 +1064,65 @@ TkMacOSXGetDrawablePort( Drawable drawable) { MacDrawable *macWin = (MacDrawable *) drawable; - GWorldPtr resultPort = NULL; - + CGrafPtr resultPort = NULL; + if (macWin == NULL) { - return NULL; + return NULL; } - + /* - * This is NULL for off-screen pixmaps. Then the portPtr + * This is NULL for off-screen pixmaps. Then the portPtr * always points to the off-screen port, and we don't * have to worry about containment */ - + if (macWin->clipRgn == NULL) { return macWin->grafPtr; } - + /* * If the Drawable is in an embedded window, use the Port of its container. - * + * * TRICKY POINT: we can have cases when a toplevel is being destroyed - * where the winPtr for the toplevel has been freed, but the children - * are not all the way destroyed. The children will call this function + * where the winPtr for the toplevel has been freed, but the children + * are not all the way destroyed. The children will call this function * as they are being destroyed, but Tk_IsEmbedded will return garbage. - * So we check the copy of the TK_EMBEDDED flag we put into the + * So we check the copy of the TK_EMBEDDED flag we put into the * toplevel's macWin flags. */ - - - - + if (!(macWin->toplevel->flags & TK_EMBEDDED)) { - return macWin->toplevel->grafPtr; + return macWin->toplevel->grafPtr; } else { - TkWindow *contWinPtr; + TkWindow *contWinPtr; contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr); - - if (contWinPtr != NULL) { - resultPort = TkMacOSXGetDrawablePort( + + if (contWinPtr != NULL) { + resultPort = TkMacOSXGetDrawablePort( (Drawable) contWinPtr->privatePtr); - } else if (tkMacOSXEmbedHandler != NULL) { + } else if (tkMacOSXEmbedHandler != NULL) { resultPort = tkMacOSXEmbedHandler->getPortProc( - (Tk_Window) macWin->winPtr); - } - + (Tk_Window) macWin->winPtr); + } + if (resultPort == NULL) { /* * FIXME: * * So far as I can tell, the only time that this happens is when * we are tearing down an embedded child interpreter, and most - * of the time, this is harmless... However, we really need to + * of the time, this is harmless... However, we really need to * find why the embedding loses. */ DebugStr("\pTkMacOSXGetDrawablePort couldn't find container"); - return NULL; - } - + return NULL; + } + /* * NOTE: Here we should handle out of process embedding. */ - + } return resultPort; } @@ -1177,23 +1152,23 @@ TkMacOSXGetRootControl( */ MacDrawable *macWin = (MacDrawable *) drawable; ControlRef result = NULL; - + if (macWin == NULL) { - return NULL; + return NULL; } if (!(macWin->toplevel->flags & TK_EMBEDDED)) { - return macWin->toplevel->rootControl; + return macWin->toplevel->rootControl; } else { - TkWindow *contWinPtr; + TkWindow *contWinPtr; - contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr); + contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr); - if (contWinPtr != NULL) { - result = TkMacOSXGetRootControl( - (Drawable) contWinPtr->privatePtr); - } else if (tkMacOSXEmbedHandler != NULL) { - result = NULL; - } + if (contWinPtr != NULL) { + result = TkMacOSXGetRootControl( + (Drawable) contWinPtr->privatePtr); + } else if (tkMacOSXEmbedHandler != NULL) { + result = NULL; + } } return result; } @@ -1204,7 +1179,7 @@ TkMacOSXGetRootControl( * TkMacOSXInvalClipRgns -- * * This function invalidates the clipping regions for a given - * window and all of its children. This function should be + * window and all of its children. This function should be * called whenever changes are made to subwindows that would * affect the size or position of windows. * @@ -1213,7 +1188,7 @@ TkMacOSXGetRootControl( * * Side effects: * The cliping regions for the window and its children are - * mark invalid. (Make sure they are valid before drawing.) + * mark invalid. (Make sure they are valid before drawing.) * *---------------------------------------------------------------------- */ @@ -1225,8 +1200,8 @@ TkMacOSXInvalClipRgns( TkWindow *winPtr = (TkWindow *) tkwin; TkWindow *childPtr; - /* - * If already marked we can stop because all + /* + * If already marked we can stop because all * decendants will also already be marked. */ if (!winPtr->privatePtr || winPtr->privatePtr->flags & TK_CLIP_INVALID) { @@ -1237,8 +1212,8 @@ TkMacOSXInvalClipRgns( SetEmptyRgn(winPtr->privatePtr->aboveClipRgn); SetEmptyRgn(winPtr->privatePtr->clipRgn); - /* - * Invalidate clip regions for all children & + /* + * Invalidate clip regions for all children & * their decendants - unless the child is a toplevel. */ childPtr = winPtr->childList; @@ -1274,7 +1249,7 @@ TkMacOSXInvalClipRgns( * * Given a Tk window this function determines the windows * bounds in relation to the Macintosh window's coordinate - * system. This is also the same coordinate system as the + * system. This is also the same coordinate system as the * Tk toplevel window in which this window is contained. * * Results: @@ -1327,14 +1302,14 @@ UpdateOffsets( if (winPtr->privatePtr == NULL) { /* - * We havn't called Tk_MakeWindowExist for this window yet. The - * offset information will be postponed and calulated at that - * time. (This will usually only happen when a mapped parent is + * We havn't called Tk_MakeWindowExist for this window yet. The + * offset information will be postponed and calulated at that + * time. (This will usually only happen when a mapped parent is * being moved but has child windows that have yet to be mapped.) */ return; } - + winPtr->privatePtr->xOff += deltaX; winPtr->privatePtr->yOff += deltaY; @@ -1345,17 +1320,17 @@ UpdateOffsets( } childPtr = childPtr->nextPtr; } - + if (Tk_IsContainer(winPtr)) { childPtr = TkpGetOtherWindow(winPtr); if (childPtr != NULL) { UpdateOffsets(childPtr,deltaX,deltaY); } - + /* * NOTE: Here we should handle out of process embedding. */ - + } } @@ -1387,8 +1362,7 @@ Tk_GetPixmap( GWorldPtr gWorld; Rect bounds; MacDrawable *macPix; - PixMapHandle pixels; - + if (display != NULL) { display->request++; } @@ -1398,6 +1372,7 @@ Tk_GetPixmap( macPix->yOff = 0; macPix->clipRgn = NULL; macPix->aboveClipRgn = NULL; + macPix->drawRgn = NULL; macPix->referenceCount = 0; macPix->toplevel = NULL; macPix->flags = 0; @@ -1409,24 +1384,20 @@ Tk_GetPixmap( depth = 0; } /* - * Allocate memory for the off screen pixmap. If we fail - * try again from system memory. Eventually, we may have + * Allocate memory for the off screen pixmap. If we fail + * try again from system memory. Eventually, we may have * to panic. */ - err = NewGWorld(&gWorld, depth, &bounds, NULL, NULL, 0); - if (err != noErr) { - err = NewGWorld(&gWorld, depth, &bounds, NULL, NULL, useTempMem); - } + err = ChkErr(NewGWorld, &gWorld, depth, &bounds, NULL, NULL, 0 +#ifdef __LITTLE_ENDIAN__ + | kNativeEndianPixMap +#endif + ); if (err != noErr) { - Tcl_Panic("Out of memory: NewGWorld failed in Tk_GetPixmap"); + Tcl_Panic("Out of memory: NewGWorld failed in Tk_GetPixmap"); } - - /* - * Lock down the pixels so they don't move out from under us. - */ - pixels = GetGWorldPixMap(gWorld); - LockPixels(pixels); macPix->grafPtr = gWorld; + macPix->context = NULL; return (Pixmap) macPix; } @@ -1447,17 +1418,14 @@ Tk_GetPixmap( *---------------------------------------------------------------------- */ -void +void Tk_FreePixmap( Display *display, /* Display. */ - Pixmap pixmap) /* Pixmap to destroy */ + Pixmap pixmap) /* Pixmap to destroy */ { MacDrawable *macPix = (MacDrawable *) pixmap; - PixMapHandle pixels; display->request++; - pixels = GetGWorldPixMap(macPix->grafPtr); - UnlockPixels(pixels); DisposeGWorld(macPix->grafPtr); ckfree((char *) macPix); } |