summaryrefslogtreecommitdiffstats
path: root/tk8.6/macosx/tkMacOSXSubwindows.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2018-01-02 20:34:49 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2018-01-02 20:34:49 (GMT)
commit89c1ac99d375fbd73892aa659f06ef5e2c5ea56e (patch)
treee76ce80d68d11f1ea137bc33a42f71a1d1f32028 /tk8.6/macosx/tkMacOSXSubwindows.c
parent01e4cd2ef2ff59418766b2259fbc99771646aba6 (diff)
downloadblt-89c1ac99d375fbd73892aa659f06ef5e2c5ea56e.zip
blt-89c1ac99d375fbd73892aa659f06ef5e2c5ea56e.tar.gz
blt-89c1ac99d375fbd73892aa659f06ef5e2c5ea56e.tar.bz2
upgrade to tcl/tk 8.6.8
Diffstat (limited to 'tk8.6/macosx/tkMacOSXSubwindows.c')
-rw-r--r--tk8.6/macosx/tkMacOSXSubwindows.c1421
1 files changed, 0 insertions, 1421 deletions
diff --git a/tk8.6/macosx/tkMacOSXSubwindows.c b/tk8.6/macosx/tkMacOSXSubwindows.c
deleted file mode 100644
index 20678ea..0000000
--- a/tk8.6/macosx/tkMacOSXSubwindows.c
+++ /dev/null
@@ -1,1421 +0,0 @@
-/*
- * tkMacOSXSubwindows.c --
- *
- * Implements subwindows for the macintosh version of Tk.
- *
- * Copyright (c) 1995-1997 Sun Microsystems, Inc.
- * Copyright 2001-2009, Apple Inc.
- * Copyright (c) 2006-2009 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.
- */
-
-#include "tkMacOSXPrivate.h"
-#include "tkMacOSXDebug.h"
-#include "tkMacOSXWm.h"
-
-/*
-#ifdef TK_MAC_DEBUG
-#define TK_MAC_DEBUG_CLIP_REGIONS
-#endif
-*/
-
-/*
- * Prototypes for functions used only in this file.
- */
-
-static void MoveResizeWindow(MacDrawable *macWin);
-static void GenerateConfigureNotify(TkWindow *winPtr,
- int includeWin);
-static void UpdateOffsets(TkWindow *winPtr, int deltaX,
- int deltaY);
-static void NotifyVisibility(TkWindow *winPtr, XEvent *eventPtr);
-
-
-/*
- *----------------------------------------------------------------------
- *
- * XDestroyWindow --
- *
- * Dealocates the given X Window.
- *
- * Results:
- * The window id is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XDestroyWindow(
- Display *display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
-
- /*
- * Remove any dangling pointers that may exist if the window we are
- * deleting is being tracked by the grab code.
- */
-
- TkPointerDeadWindow(macWin->winPtr);
- TkMacOSXSelDeadWindow(macWin->winPtr);
- macWin->toplevel->referenceCount--;
-
- if (!Tk_IsTopLevel(macWin->winPtr) ) {
- TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW);
- if (macWin->winPtr->parentPtr != NULL) {
- TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr->parentPtr);
- }
- if (macWin->visRgn) {
- CFRelease(macWin->visRgn);
- }
- if (macWin->aboveVisRgn) {
- CFRelease(macWin->aboveVisRgn);
- }
- if (macWin->drawRgn) {
- CFRelease(macWin->drawRgn);
- }
-
- if (macWin->toplevel->referenceCount == 0) {
- ckfree(macWin->toplevel);
- }
- ckfree(macWin);
- return;
- }
- if (macWin->visRgn) {
- CFRelease(macWin->visRgn);
- }
- if (macWin->aboveVisRgn) {
- CFRelease(macWin->aboveVisRgn);
- }
- if (macWin->drawRgn) {
- CFRelease(macWin->drawRgn);
- }
- macWin->view = nil;
-
- /*
- * Delay deletion of a toplevel data structure untill all children have
- * been deleted.
- */
-
- if (macWin->toplevel->referenceCount == 0) {
- ckfree(macWin->toplevel);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMapWindow --
- *
- * Map the given X Window to the screen. See X window documentation for
- * more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The subwindow or toplevel may appear on the screen.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMapWindow(
- Display *display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
- XEvent event;
-
- /*
- * 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 window now as
- * this function as well as other X functions assume that the portPtr is
- * valid.
- */
-
- if (!TkMacOSXHostToplevelExists(macWin->toplevel->winPtr)) {
- TkMacOSXMakeRealWindowExist(macWin->toplevel->winPtr);
- }
-
- display->request++;
- macWin->winPtr->flags |= TK_MAPPED;
- if (Tk_IsTopLevel(macWin->winPtr)) {
- if (!Tk_IsEmbedded(macWin->winPtr)) {
- NSWindow *win = TkMacOSXDrawableWindow(window);
- [NSApp activateIgnoringOtherApps:YES];
- if ( [win canBecomeKeyWindow] ) {
- [win makeKeyAndOrderFront:NSApp];
- }
- TkMacOSXApplyWindowAttributes(macWin->winPtr, win);
- }
- TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr);
-
- /*
- * We only need to send the MapNotify event for toplevel windows.
- */
-
- event.xany.serial = LastKnownRequestProcessed(display);
- 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.
- */
-
- TkMacOSXInvalClipRgns((Tk_Window) macWin->winPtr->parentPtr);
- TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW);
- }
-
- /*
- * Generate VisibilityNotify events for window and all mapped children.
- */
-
- event.xany.send_event = False;
- event.xany.display = display;
- event.xvisibility.type = VisibilityNotify;
- event.xvisibility.state = VisibilityUnobscured;
- NotifyVisibility(macWin->winPtr, &event);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * NotifyVisibility --
- *
- * Recursively called helper proc for XMapWindow().
- *
- * Results:
- * None.
- *
- * Side effects:
- * VisibilityNotify events are queued.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-NotifyVisibility(
- TkWindow *winPtr,
- XEvent *eventPtr)
-{
- if (winPtr->atts.event_mask & VisibilityChangeMask) {
- eventPtr->xany.serial = LastKnownRequestProcessed(winPtr->display);
- eventPtr->xvisibility.window = winPtr->window;
- Tk_QueueWindowEvent(eventPtr, TCL_QUEUE_TAIL);
- }
- for (winPtr = winPtr->childList; winPtr != NULL;
- winPtr = winPtr->nextPtr) {
- if (winPtr->flags & TK_MAPPED) {
- NotifyVisibility(winPtr, eventPtr);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XUnmapWindow --
- *
- * Unmap the given X Window to the screen. See X window documentation for
- * more details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The subwindow or toplevel may be removed from the screen.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XUnmapWindow(
- Display *display, /* Display. */
- Window window) /* Window. */
-{
- MacDrawable *macWin = (MacDrawable *) window;
- TkWindow *winPtr = macWin->winPtr;
- TkWindow *parentPtr = winPtr->parentPtr;
- XEvent event;
-
- display->request++;
- if (Tk_IsTopLevel(winPtr)) {
- if (!Tk_IsEmbedded(winPtr) &&
- winPtr->wmInfoPtr->hints.initial_state!=IconicState) {
- NSWindow *win = TkMacOSXDrawableWindow(window);
-
- if ([win isVisible]) {
- [[win parentWindow] removeChildWindow:win];
- [win orderOut:NSApp];
- }
- }
- TkMacOSXInvalClipRgns((Tk_Window) winPtr);
-
- /*
- * We only need to send the UnmapNotify event for toplevel windows.
- */
-
- event.xany.serial = LastKnownRequestProcessed(display);
- event.xany.send_event = False;
- event.xany.display = display;
-
- event.xunmap.type = UnmapNotify;
- event.xunmap.window = window;
- event.xunmap.event = window;
- event.xunmap.from_configure = false;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- } else {
- /*
- * Rebuild the visRgn clip region for the parent so it will be allowed
- * to draw in the space from which this subwindow was removed.
- */
- if (parentPtr && parentPtr->privatePtr->visRgn) {
- TkMacOSXInvalidateViewRegion(TkMacOSXDrawableView(parentPtr->privatePtr),
- parentPtr->privatePtr->visRgn);
- }
- TkMacOSXInvalClipRgns((Tk_Window) parentPtr);
- TkMacOSXUpdateClipRgn(parentPtr);
- }
- winPtr->flags &= ~TK_MAPPED;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XResizeWindow --
- *
- * Resize a given X window. See X windows documentation for further
- * details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XResizeWindow(
- Display *display, /* Display. */
- Window window, /* Window. */
- unsigned int width,
- unsigned int height)
-{
- MacDrawable *macWin = (MacDrawable *) window;
- display->request++;
- if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) {
- NSWindow *w = macWin->winPtr->wmInfoPtr->window;
- if (w) {
- NSRect r = [w contentRectForFrameRect:[w frame]];
- r.origin.y += r.size.height - height;
- r.size.width = width;
- r.size.height = height;
- [w setFrame:[w frameRectForContentRect:r] display:YES];
- }
- } else {
- MoveResizeWindow(macWin);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMoveResizeWindow --
- *
- * Move or resize a given X window. See X windows documentation
- * for further details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMoveResizeWindow(
- Display *display, /* Display. */
- Window window, /* Window. */
- int x, int y,
- unsigned int width,
- unsigned int height)
-{
- MacDrawable *macWin = (MacDrawable *) window;
-
- display->request++;
- if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) {
- NSWindow *w = macWin->winPtr->wmInfoPtr->window;
- if (w) {
- /* We explicitly convert everything to doubles so we don't get
- * surprised (again) by what happens when you do arithmetic with
- * unsigned ints.
- */
- CGFloat X = (CGFloat)x;
- CGFloat Y = (CGFloat)y;
- CGFloat Width = (CGFloat)width;
- CGFloat Height = (CGFloat)height;
- CGFloat XOff = (CGFloat)macWin->winPtr->wmInfoPtr->xInParent;
- CGFloat YOff = (CGFloat)macWin->winPtr->wmInfoPtr->yInParent;
- NSRect r = NSMakeRect(X + XOff,
- tkMacOSXZeroScreenHeight - Y - YOff - Height,
- Width, Height);
- [w setFrame:[w frameRectForContentRect:r] display:YES];
- }
- } else {
- MoveResizeWindow(macWin);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XMoveWindow --
- *
- * Move a given X window. See X windows documentation for further
- * details.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XMoveWindow(
- Display *display, /* Display. */
- Window window, /* Window. */
- int x, int y)
-{
- MacDrawable *macWin = (MacDrawable *) window;
-
- display->request++;
- if (Tk_IsTopLevel(macWin->winPtr) && !Tk_IsEmbedded(macWin->winPtr)) {
- NSWindow *w = macWin->winPtr->wmInfoPtr->window;
- if (w) {
- [w setFrameTopLeftPoint:NSMakePoint(x, tkMacOSXZeroScreenHeight - y)];
- }
- } else {
- MoveResizeWindow(macWin);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * MoveResizeWindow --
- *
- * Helper proc for XResizeWindow, XMoveResizeWindow and XMoveWindow.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-MoveResizeWindow(
- MacDrawable *macWin)
-{
- int deltaX = 0, deltaY = 0, parentBorderwidth = 0;
- MacDrawable *macParent = NULL;
- NSWindow *macWindow = TkMacOSXDrawableWindow((Drawable) macWin);
-
- /*
- * Find the Parent window, for an embedded window it will be its container.
- */
-
- if (Tk_IsEmbedded(macWin->winPtr)) {
- TkWindow *contWinPtr = TkpGetOtherWindow(macWin->winPtr);
-
- if (contWinPtr) {
- macParent = contWinPtr->privatePtr;
- } else {
- /*
- * Here we should handle out of process embedding. 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.
- */
- }
- } else {
- /*
- * TODO: update all xOff & yOffs
- */
-
- macParent = macWin->winPtr->parentPtr->privatePtr;
- parentBorderwidth = macWin->winPtr->parentPtr->changes.border_width;
- }
-
- if (macParent) {
- deltaX = macParent->xOff + parentBorderwidth +
- macWin->winPtr->changes.x - macWin->xOff;
- deltaY = macParent->yOff + parentBorderwidth +
- macWin->winPtr->changes.y - macWin->yOff;
- }
- if (macWindow) {
- TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW);
- if (macParent) {
- TkMacOSXInvalClipRgns((Tk_Window) macParent->winPtr);
- }
- }
- UpdateOffsets(macWin->winPtr, deltaX, deltaY);
- if (macWindow) {
- TkMacOSXInvalidateWindow(macWin, TK_PARENT_WINDOW);
- }
- GenerateConfigureNotify(macWin->winPtr, 0);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * 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.
- *
- * Results:
- * None.
- *
- * Side effects:
- * ConfigureNotify events will be posted.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-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);
- }
- if (includeWin) {
- TkDoConfigureNotify(winPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * XRaiseWindow --
- *
- * Change the stacking order of a window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the stacking order of the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-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
- */
- }
-}
-
-#if 0
-/*
- *----------------------------------------------------------------------
- *
- * XLowerWindow --
- *
- * Change the stacking order of a window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Changes the stacking order of the specified window.
- *
- *----------------------------------------------------------------------
- */
-
-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
- */
- }
-}
-#endif
-
-/*
- *----------------------------------------------------------------------
- *
- * XConfigureWindow --
- *
- * Change the size, position, stacking, or border of the specified window.
- *
- * Results:
- * None.
- *
- * Side effects:
- * 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.
- *
- *----------------------------------------------------------------------
- */
-
-void
-XConfigureWindow(
- Display *display, /* Display. */
- Window w, /* Window. */
- unsigned int value_mask,
- XWindowChanges *values)
-{
- MacDrawable *macWin = (MacDrawable *) w;
- TkWindow *winPtr = macWin->winPtr;
-
- display->request++;
-
- /*
- * Change the shape and/or position of the window.
- */
-
- if (value_mask & (CWX|CWY|CWWidth|CWHeight)) {
- XMoveResizeWindow(display, w, winPtr->changes.x, winPtr->changes.y,
- winPtr->changes.width, winPtr->changes.height);
- }
-
- /*
- * Change the stacking order of the window. Tk actually 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.
- */
-
- if (value_mask & CWStackMode) {
- NSView *view = TkMacOSXDrawableView(macWin);
- Rect bounds;
- NSRect r;
-
- if (view) {
- TkMacOSXInvalClipRgns((Tk_Window) winPtr->parentPtr);
- TkMacOSXWinBounds(winPtr, &bounds);
- r = NSMakeRect(bounds.left,
- [view bounds].size.height - bounds.bottom,
- bounds.right - bounds.left, bounds.bottom - bounds.top);
- [view setNeedsDisplayInRect:r];
- }
- }
-
- /* TkGenWMMoveRequestEvent(macWin->winPtr,
- macWin->winPtr->changes.x, macWin->winPtr->changes.y); */
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXSetDrawingEnabled --
- *
- * This function sets the TK_DO_NOT_DRAW flag for a given window and
- * all of its children.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The clipping regions for the window and its children are cleared.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacOSXSetDrawingEnabled(
- TkWindow *winPtr,
- int flag)
-{
- TkWindow *childPtr;
- MacDrawable *macWin = winPtr->privatePtr;
-
- if (macWin) {
- if (flag ) {
- macWin->flags &= ~TK_DO_NOT_DRAW;
- } else {
- macWin->flags |= TK_DO_NOT_DRAW;
- }
- }
-
- /*
- * Set the flag for all children & their descendants, excluding
- * Toplevels. (??? Do we need to exclude Toplevels?)
- */
-
- childPtr = winPtr->childList;
- while (childPtr) {
- if (!Tk_IsTopLevel(childPtr)) {
- TkMacOSXSetDrawingEnabled(childPtr, flag);
- }
- childPtr = childPtr->nextPtr;
- }
-
- /*
- * If the window is a container, set the flag for its embedded window.
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
-
- if (childPtr) {
- TkMacOSXSetDrawingEnabled(childPtr, flag);
- }
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXUpdateClipRgn --
- *
- * This function updates the clipping 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 flag should always be
- * unset before any drawing is attempted.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The clip regions for the window and its children are updated.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacOSXUpdateClipRgn(
- TkWindow *winPtr)
-{
- MacDrawable *macWin;
-
- if (winPtr == NULL) {
- return;
- }
- macWin = winPtr->privatePtr;
- if (macWin && macWin->flags & TK_CLIP_INVALID) {
- TkWindow *win2Ptr;
-
-#ifdef TK_MAC_DEBUG_CLIP_REGIONS
- TkMacOSXDbgMsg("%s", winPtr->pathName);
-#endif
- if (Tk_IsMapped(winPtr)) {
- int rgnChanged = 0;
- CGRect bounds;
- HIMutableShapeRef rgn;
-
- /*
- * Start with a region defined by the window bounds.
- */
-
- TkMacOSXWinCGBounds(winPtr, &bounds);
- rgn = TkMacOSXHIShapeCreateMutableWithRect(&bounds);
-
- /*
- * Clip away the area of any windows that may obscure this window.
- * For a non-toplevel window, first, clip to the parents visible
- * clip region. 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 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 (winPtr->parentPtr) {
- TkMacOSXUpdateClipRgn(winPtr->parentPtr);
- ChkErr(HIShapeIntersect,
- winPtr->parentPtr->privatePtr->aboveVisRgn,
- rgn, rgn);
- }
- win2Ptr = winPtr;
- while ((win2Ptr = win2Ptr->nextPtr)) {
- if (Tk_IsTopLevel(win2Ptr) || !Tk_IsMapped(win2Ptr)) {
- continue;
- }
- TkMacOSXWinCGBounds(win2Ptr, &bounds);
- ChkErr(TkMacOSHIShapeDifferenceWithRect, rgn, &bounds);
- }
- } else if (Tk_IsEmbedded(winPtr)) {
- win2Ptr = TkpGetOtherWindow(winPtr);
- if (win2Ptr) {
- TkMacOSXUpdateClipRgn(win2Ptr);
- ChkErr(HIShapeIntersect,
- win2Ptr->privatePtr->aboveVisRgn, rgn, rgn);
- } else if (tkMacOSXEmbedHandler != NULL) {
- TkRegion r = TkCreateRegion();
- HIShapeRef visRgn;
-
- tkMacOSXEmbedHandler->getClipProc((Tk_Window) winPtr, r);
- visRgn = TkMacOSXGetNativeRegion(r);
- ChkErr(HIShapeIntersect, visRgn, rgn, rgn);
- CFRelease(visRgn);
- TkpReleaseRegion(r);
- }
-
- /*
- * TODO: Here we should handle out of process embedding.
- */
- }
- macWin->aboveVisRgn = HIShapeCreateCopy(rgn);
-
- /*
- * The final clip region is the aboveVis region (or visible region)
- * minus all the children of this window. If the window is a
- * container, we must also subtract the region of the embedded
- * window.
- */
-
- win2Ptr = winPtr->childList;
- while (win2Ptr) {
- if (Tk_IsTopLevel(win2Ptr) || !Tk_IsMapped(win2Ptr)) {
- win2Ptr = win2Ptr->nextPtr;
- continue;
- }
- TkMacOSXWinCGBounds(win2Ptr, &bounds);
- ChkErr(TkMacOSHIShapeDifferenceWithRect, rgn, &bounds);
- rgnChanged = 1;
- win2Ptr = win2Ptr->nextPtr;
- }
-
- if (Tk_IsContainer(winPtr)) {
- win2Ptr = TkpGetOtherWindow(winPtr);
- if (win2Ptr) {
- if (Tk_IsMapped(win2Ptr)) {
- TkMacOSXWinCGBounds(win2Ptr, &bounds);
- ChkErr(TkMacOSHIShapeDifferenceWithRect, rgn, &bounds);
- rgnChanged = 1;
- }
- }
-
- /*
- * TODO: Here we should handle out of process embedding.
- */
- }
-
- if (rgnChanged) {
- HIShapeRef diffRgn = HIShapeCreateDifference(
- macWin->aboveVisRgn, rgn);
-
- if (!HIShapeIsEmpty(diffRgn)) {
- macWin->visRgn = HIShapeCreateCopy(rgn);
- }
- CFRelease(diffRgn);
- }
- CFRelease(rgn);
- } else {
- /*
- * An unmapped window has empty clip regions to prevent any
- * (erroneous) drawing into it or its children from becoming
- * visible. [Bug 940117]
- */
-
- if (!Tk_IsTopLevel(winPtr)) {
- TkMacOSXUpdateClipRgn(winPtr->parentPtr);
- } else if (Tk_IsEmbedded(winPtr)) {
- win2Ptr = TkpGetOtherWindow(winPtr);
- if (win2Ptr) {
- TkMacOSXUpdateClipRgn(win2Ptr);
- }
- }
- macWin->aboveVisRgn = TkMacOSXHIShapeCreateEmpty();
- }
- if (!macWin->visRgn) {
- macWin->visRgn = HIShapeCreateCopy(macWin->aboveVisRgn);
- }
- macWin->flags &= ~TK_CLIP_INVALID;
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXVisableClipRgn --
- *
- * This function returns the Macintosh clipping region for the given
- * window. The caller is responsible for disposing of the returned
- * region via TkDestroyRegion().
- *
- * Results:
- * The region.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-TkRegion
-TkMacOSXVisableClipRgn(
- TkWindow *winPtr)
-{
- if (winPtr->privatePtr->flags & TK_CLIP_INVALID) {
- TkMacOSXUpdateClipRgn(winPtr);
- }
- return (TkRegion)HIShapeCreateMutableCopy(winPtr->privatePtr->visRgn);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXInvalidateViewRegion --
- *
- * This function invalidates the given region of a view.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Damage is created.
- *
- *----------------------------------------------------------------------
- */
-
-static OSStatus
-InvalViewRect(int msg, HIShapeRef rgn, const CGRect *rect, void *ref) {
- static CGAffineTransform t;
- NSView *view = ref;
-
- if (!view) {
- return paramErr;
- }
- switch (msg) {
- case kHIShapeEnumerateInit:
- t = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0,
- NSHeight([view bounds]));
- break;
- case kHIShapeEnumerateRect:
- [view setNeedsDisplayInRect:NSRectFromCGRect(
- CGRectApplyAffineTransform(*rect, t))];
- break;
- }
- return noErr;
-}
-
-void
-TkMacOSXInvalidateViewRegion(
- NSView *view,
- HIShapeRef rgn)
-{
- if (view && !HIShapeIsEmpty(rgn)) {
- ChkErr(HIShapeEnumerate, rgn,
- kHIShapeParseFromBottom|kHIShapeParseFromLeft,
- InvalViewRect, view);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXInvalidateWindow --
- *
- * This function invalidates a window and (optionally) its children.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Damage is created.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacOSXInvalidateWindow(
- MacDrawable *macWin, /* Window to be invalidated. */
- int flag) /* Should be TK_WINDOW_ONLY or
- * TK_PARENT_WINDOW */
-{
-#ifdef TK_MAC_DEBUG_CLIP_REGIONS
- TkMacOSXDbgMsg("%s", macWin->winPtr->pathName);
-#endif
- if (macWin->flags & TK_CLIP_INVALID) {
- TkMacOSXUpdateClipRgn(macWin->winPtr);
- }
- TkMacOSXInvalidateViewRegion(TkMacOSXDrawableView(macWin),
- (flag == TK_WINDOW_ONLY) ? macWin->visRgn : macWin->aboveVisRgn);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXDrawableWindow --
- *
- * This function returns the NSWindow for a given X drawable.
- *
- * Results:
- * A NSWindow, or nil for off screen pixmaps.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-NSWindow*
-TkMacOSXDrawableWindow(
- Drawable drawable)
-{
- MacDrawable *macWin = (MacDrawable *) drawable;
- NSWindow *result = nil;
-
- if (!macWin || macWin->flags & TK_IS_PIXMAP) {
- result = nil;
- } else if (macWin->toplevel && macWin->toplevel->winPtr &&
- macWin->toplevel->winPtr->wmInfoPtr &&
- macWin->toplevel->winPtr->wmInfoPtr->window) {
- result = macWin->toplevel->winPtr->wmInfoPtr->window;
- } else if (macWin->winPtr && macWin->winPtr->wmInfoPtr &&
- macWin->winPtr->wmInfoPtr->window) {
- result = macWin->winPtr->wmInfoPtr->window;
- } else if (macWin->toplevel && (macWin->toplevel->flags & TK_EMBEDDED)) {
- TkWindow *contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr);
- if (contWinPtr) {
- result = TkMacOSXDrawableWindow((Drawable) contWinPtr->privatePtr);
- }
- }
- return result;
-}
-
-void *
-TkMacOSXDrawable(
- Drawable drawable)
-{
- return TkMacOSXDrawableWindow(drawable);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXGetDrawablePort --
- *
- * This function returns the Graphics Port for a given X drawable.
- *
- * Results:
- * NULL.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void *
-TkMacOSXGetDrawablePort(
- Drawable drawable)
-{
- return NULL;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXDrawableView --
- *
- * This function returns the NSView for a given X drawable.
- *
- * Results:
- * A NSView* or nil.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-NSView*
-TkMacOSXDrawableView(
- MacDrawable *macWin)
-{
- NSView *result = nil;
-
- if (!macWin) {
- result = nil;
- } else if (!macWin->toplevel) {
- result = macWin->view;
- } else if (!(macWin->toplevel->flags & TK_EMBEDDED)) {
- result = macWin->toplevel->view;
- } else {
- TkWindow *contWinPtr = TkpGetOtherWindow(macWin->toplevel->winPtr);
- if (contWinPtr) {
- result = TkMacOSXDrawableView(contWinPtr->privatePtr);
- }
- }
- return result;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXGetRootControl --
- *
- * This function returns the NSView for a given X drawable.
- *
- * Results:
- * A NSView* .
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void *
-TkMacOSXGetRootControl(
- Drawable drawable)
-{
- /*
- * will probably need to fix this up for embedding
- */
-
- return TkMacOSXDrawableView((MacDrawable *) drawable);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXInvalClipRgns --
- *
- * This function invalidates the clipping regions for a given 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.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The clipping regions for the window and its children are marked invalid.
- * (Make sure they are valid before drawing.)
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacOSXInvalClipRgns(
- Tk_Window tkwin)
-{
- TkWindow *winPtr = (TkWindow *) tkwin;
- TkWindow *childPtr;
- MacDrawable *macWin = winPtr->privatePtr;
-
- /*
- * If already marked we can stop because all descendants will also already
- * be marked.
- */
-
-#ifdef TK_MAC_DEBUG_CLIP_REGIONS
- TkMacOSXDbgMsg("%s", winPtr->pathName);
-#endif
-
- if (!macWin || macWin->flags & TK_CLIP_INVALID) {
- return;
- }
-
- macWin->flags |= TK_CLIP_INVALID;
- if (macWin->visRgn) {
- CFRelease(macWin->visRgn);
- macWin->visRgn = NULL;
- }
- if (macWin->aboveVisRgn) {
- CFRelease(macWin->aboveVisRgn);
- macWin->aboveVisRgn = NULL;
- }
- if (macWin->drawRgn) {
- CFRelease(macWin->drawRgn);
- macWin->drawRgn = NULL;
- }
-
- /*
- * Invalidate clip regions for all children & their descendants, unless the
- * child is a toplevel.
- */
-
- childPtr = winPtr->childList;
- while (childPtr) {
- if (!Tk_IsTopLevel(childPtr)) {
- TkMacOSXInvalClipRgns((Tk_Window) childPtr);
- }
- childPtr = childPtr->nextPtr;
- }
-
- /*
- * Also, if the window is a container, mark its embedded window.
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
-
- if (childPtr) {
- TkMacOSXInvalClipRgns((Tk_Window) childPtr);
- }
-
- /*
- * TODO: Here we should handle out of process embedding.
- */
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXWinBounds --
- *
- * 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 Tk toplevel window in which this window
- * is contained.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacOSXWinBounds(
- TkWindow *winPtr,
- void *bounds)
-{
- Rect *b = (Rect *)bounds;
- b->left = winPtr->privatePtr->xOff;
- b->top = winPtr->privatePtr->yOff;
- b->right = b->left + winPtr->changes.width;
- b->bottom = b->top + winPtr->changes.height;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXWinCGBounds --
- *
- * 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 Tk toplevel window in which this window
- * is contained.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkMacOSXWinCGBounds(
- TkWindow *winPtr,
- CGRect *bounds)
-{
- bounds->origin.x = winPtr->privatePtr->xOff;
- bounds->origin.y = winPtr->privatePtr->yOff;
- bounds->size.width = winPtr->changes.width;
- bounds->size.height = winPtr->changes.height;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * UpdateOffsets --
- *
- * Updates the X & Y offsets of the given TkWindow from the TopLevel it is
- * a decendant of.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The xOff & yOff fields for the Mac window datastructure is updated to
- * the proper offset.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-UpdateOffsets(
- TkWindow *winPtr,
- int deltaX,
- int deltaY)
-{
- TkWindow *childPtr;
-
- if (winPtr->privatePtr == NULL) {
- /*
- * We haven'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;
-
- childPtr = winPtr->childList;
- while (childPtr != NULL) {
- if (!Tk_IsTopLevel(childPtr)) {
- UpdateOffsets(childPtr, deltaX, deltaY);
- }
- childPtr = childPtr->nextPtr;
- }
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
- if (childPtr != NULL) {
- UpdateOffsets(childPtr,deltaX,deltaY);
- }
-
- /*
- * TODO: Here we should handle out of process embedding.
- */
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_GetPixmap --
- *
- * Creates an in memory drawing surface.
- *
- * Results:
- * Returns a handle to a new pixmap.
- *
- * Side effects:
- * Allocates a new CGBitmapContext.
- *
- *----------------------------------------------------------------------
- */
-
-Pixmap
-Tk_GetPixmap(
- Display *display, /* Display for new pixmap (can be null). */
- Drawable d, /* Drawable where pixmap will be used (ignored). */
- int width, /* Dimensions of pixmap. */
- int height,
- int depth) /* Bits per pixel for pixmap. */
-{
- MacDrawable *macPix;
-
- if (display != NULL) {
- display->request++;
- }
- macPix = ckalloc(sizeof(MacDrawable));
- macPix->winPtr = NULL;
- macPix->xOff = 0;
- macPix->yOff = 0;
- macPix->visRgn = NULL;
- macPix->aboveVisRgn = NULL;
- macPix->drawRgn = NULL;
- macPix->referenceCount = 0;
- macPix->toplevel = NULL;
- macPix->flags = TK_IS_PIXMAP | (depth == 1 ? TK_IS_BW_PIXMAP : 0);
- macPix->view = nil;
- macPix->context = NULL;
- macPix->size = CGSizeMake(width, height);
-
- return (Pixmap) macPix;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_FreePixmap --
- *
- * Release the resources associated with a pixmap.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Deletes the CGBitmapContext created by Tk_GetPixmap.
- *
- *----------------------------------------------------------------------
- */
-
-void
-Tk_FreePixmap(
- Display *display, /* Display. */
- Pixmap pixmap) /* Pixmap to destroy */
-{
- MacDrawable *macPix = (MacDrawable *) pixmap;
-
- display->request++;
- if (macPix->context) {
- char *data = CGBitmapContextGetData(macPix->context);
-
- if (data) {
- ckfree(data);
- }
- CFRelease(macPix->context);
- }
- ckfree(macPix);
-}
-
-/*
- * Local Variables:
- * mode: objc
- * c-basic-offset: 4
- * fill-column: 79
- * coding: utf-8
- * End:
- */