summaryrefslogtreecommitdiffstats
path: root/carbon/tkMacOSXWindowEvent.c
diff options
context:
space:
mode:
Diffstat (limited to 'carbon/tkMacOSXWindowEvent.c')
-rw-r--r--carbon/tkMacOSXWindowEvent.c984
1 files changed, 0 insertions, 984 deletions
diff --git a/carbon/tkMacOSXWindowEvent.c b/carbon/tkMacOSXWindowEvent.c
deleted file mode 100644
index 99ab918..0000000
--- a/carbon/tkMacOSXWindowEvent.c
+++ /dev/null
@@ -1,984 +0,0 @@
-/*
- * tkMacOSXWindowEvent.c --
- *
- * This file defines the routines for both creating and handling Window
- * Manager class events for Tk.
- *
- * Copyright 2001, Apple Computer, Inc.
- * Copyright (c) 2005-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.
- *
- * The following terms apply to all files originating from Apple
- * Computer, Inc. ("Apple") and associated with the software unless
- * explicitly disclaimed in individual files.
- *
- * Apple hereby grants permission to use, copy, modify, distribute, and
- * license this software and its documentation for any purpose, provided
- * that existing copyright notices are retained in all copies and that
- * this notice is included verbatim in any distributions. No written
- * agreement, license, or royalty fee is required for any of the
- * authorized uses. Modifications to this software may be copyrighted by
- * their authors and need not follow the licensing terms described here,
- * provided that the new terms are clearly indicated on the first page of
- * each file where they apply.
- *
- * IN NO EVENT SHALL APPLE, THE AUTHORS OR DISTRIBUTORS OF THE SOFTWARE
- * BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
- * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS
- * DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN IF APPLE OR THE
- * AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. APPLE,
- * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
- * NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND
- * APPLE, THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE
- * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * GOVERNMENT USE: If you are acquiring this software on behalf of the
- * U.S. government, the Government shall have only "Restricted Rights" in
- * the software and related documentation as defined in the Federal
- * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you are
- * acquiring the software on behalf of the Department of Defense, the
- * software shall be classified as "Commercial Computer Software" and the
- * Government shall have only "Restricted Rights" as defined in Clause
- * 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the
- * authors grant the U.S. Government and others acting in its behalf
- * permission to use and distribute the software in accordance with the
- * terms specified in this license.
- */
-
-#include "tkMacOSXPrivate.h"
-#include "tkMacOSXWm.h"
-#include "tkMacOSXEvent.h"
-#include "tkMacOSXDebug.h"
-
-/*
-#ifdef TK_MAC_DEBUG
-#define TK_MAC_DEBUG_CLIP_REGIONS
-#endif
-*/
-
-/*
- * Declaration of functions used only in this file
- */
-
-static int GenerateUpdateEvent(Window window);
-static int GenerateUpdates(HIMutableShapeRef updateRgn,
- CGRect *updateBounds, TkWindow *winPtr);
-static int GenerateActivateEvents(Window window, int activeFlag);
-static void ClearPort(CGrafPtr port, HIShapeRef updateRgn);
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXProcessApplicationEvent --
- *
- * This processes Application level events, mainly activate and
- * deactivate.
- *
- * Results:
- * 0.
- *
- * Side effects:
- * Hide or reveal floating windows.
- *
- *----------------------------------------------------------------------
- */
-
-MODULE_SCOPE int
-TkMacOSXProcessApplicationEvent(
- TkMacOSXEvent *eventPtr,
- MacEventStatus *statusPtr)
-{
- Tcl_CmdInfo dummy;
-
- /*
- * This is a bit of a hack. We get "show" events both when we come back
- * from being hidden, and whenever we are activated. I only want to run
- * the "show" proc when we have been hidden already, not as a substitute
- * for <Activate>. So I use this toggle...
- */
-
- static int toggleHide = 0;
-
- switch (eventPtr->eKind) {
- case kEventAppActivated:
- ShowFloatingWindows();
- break;
- case kEventAppDeactivated:
- TkSuspendClipboard();
- HideFloatingWindows();
- break;
- case kEventAppQuit:
- statusPtr->stopProcessing = 1;
- break;
- case kEventAppHidden:
- if (toggleHide == 0) {
- toggleHide = 1;
- if (eventPtr->interp && Tcl_GetCommandInfo(eventPtr->interp,
- "::tk::mac::OnHide", &dummy)) {
- Tcl_GlobalEval(eventPtr->interp, "::tk::mac::OnHide");
- }
- }
- statusPtr->stopProcessing = 1;
- break;
- case kEventAppShown:
- if (toggleHide == 1) {
- toggleHide = 0;
- if (eventPtr->interp && Tcl_GetCommandInfo(eventPtr->interp,
- "::tk::mac::OnShow", &dummy)) {
- Tcl_GlobalEval(eventPtr->interp, "::tk::mac::OnShow");
- }
- }
- statusPtr->stopProcessing = 1;
- break;
- case kEventAppAvailableWindowBoundsChanged: {
- static UInt32 prevId = 0;
- UInt32 id;
- OSStatus err;
-
- err = ChkErr(GetEventParameter, eventPtr->eventRef,
- kEventParamTransactionID, typeUInt32, NULL, sizeof(id), NULL,
- &id);
- if (err != noErr || id != prevId) {
- TkDisplay *dispPtr = TkGetDisplayList();
-
- prevId = id;
- TkMacOSXDisplayChanged(dispPtr->display);
- }
- /*
- * Should we call ::tk::mac::OnDisplayChanged?
- */
- break;
- }
- default:
- break;
- }
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXProcessAppearanceEvent --
- *
- * This processes Appearance events.
- *
- * Results:
- * 0.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-MODULE_SCOPE int
-TkMacOSXProcessAppearanceEvent(
- TkMacOSXEvent *eventPtr,
- MacEventStatus *statusPtr)
-{
- switch (eventPtr->eKind) {
- case kEventAppearanceScrollBarVariantChanged:
- TkMacOSXInitScrollbarMetrics();
- break;
- default:
- break;
- }
- return 0;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXProcessWindowEvent --
- *
- * This processes Window level events, mainly activate and deactivate.
- *
- * Results:
- * 0.
- *
- * Side effects:
- * Cause Windows to be moved forward or backward in the window stack.
- *
- *----------------------------------------------------------------------
- */
-
-MODULE_SCOPE int
-TkMacOSXProcessWindowEvent(
- TkMacOSXEvent *eventPtr,
- MacEventStatus *statusPtr)
-{
- OSStatus err;
- WindowRef whichWindow;
- Window window;
- int eventFound = false;
- TkDisplay *dispPtr;
- TkWindow *winPtr;
-
- switch (eventPtr->eKind) {
- case kEventWindowActivated:
- case kEventWindowDeactivated:
- case kEventWindowUpdate:
- case kEventWindowExpanding:
- case kEventWindowBoundsChanged:
- case kEventWindowDragStarted:
- case kEventWindowDragCompleted:
- case kEventWindowConstrain:
- case kEventWindowGetRegion:
- case kEventWindowDrawContent:
- break;
- default:
- return 0;
- break;
- }
- err = ChkErr(GetEventParameter, eventPtr->eventRef,
- kEventParamDirectObject, typeWindowRef, NULL, sizeof(whichWindow),
- NULL, &whichWindow);
- if (err != noErr) {
- return 0;
- }
-
- window = TkMacOSXGetXWindow(whichWindow);
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window);
-
- switch (eventPtr->eKind) {
- case kEventWindowActivated:
- case kEventWindowDeactivated:
- if (window != None) {
- int activate = (eventPtr->eKind == kEventWindowActivated);
-
- eventFound |= GenerateActivateEvents(window, activate);
- eventFound |= TkMacOSXGenerateFocusEvent(window, activate);
- if (winPtr) {
- TkMacOSXEnterExitFullscreen(winPtr, activate);
- }
- statusPtr->stopProcessing = 1;
- }
- break;
- case kEventWindowUpdate:
- if (window != None && GenerateUpdateEvent(window)) {
- eventFound = true;
- statusPtr->stopProcessing = 1;
- }
- break;
- case kEventWindowExpanding:
- if (winPtr) {
- winPtr->wmInfoPtr->hints.initial_state =
- TkMacOSXIsWindowZoomed(winPtr) ? ZoomState : NormalState;
- Tk_MapWindow((Tk_Window) winPtr);
-
- /*
- * Need to process all Tk events generated by Tk_MapWindow()
- * before returning to ensure all children are mapped, as
- * otherwise the Activate event that follows Expanding would not
- * be processed by any unmapped children.
- */
-
- while (Tcl_ServiceEvent(TCL_WINDOW_EVENTS)) {/*empty body*/};
- while (Tcl_DoOneEvent(TCL_IDLE_EVENTS)) {/*empty body*/};
- }
- break;
- case kEventWindowBoundsChanged:
- if (winPtr) {
- WmInfo *wmPtr = winPtr->wmInfoPtr;
- UInt32 attr;
- Rect bounds;
- int x = -1, y = -1, width = -1, height = -1, flags = 0;
-
- ChkErr(GetEventParameter, eventPtr->eventRef,
- kEventParamAttributes, typeUInt32, NULL, sizeof(attr),
- NULL, &attr);
- ChkErr(GetEventParameter, eventPtr->eventRef,
- kEventParamCurrentBounds, typeQDRectangle, NULL,
- sizeof(bounds), NULL, &bounds);
- if (attr & kWindowBoundsChangeOriginChanged) {
- x = bounds.left - wmPtr->xInParent;
- y = bounds.top - wmPtr->yInParent;
- flags |= TK_LOCATION_CHANGED;
- }
- if (attr & kWindowBoundsChangeSizeChanged) {
- width = bounds.right - bounds.left;
- height = bounds.bottom - bounds.top;
- flags |= TK_SIZE_CHANGED;
- }
- TkMacOSXInvalClipRgns((Tk_Window) winPtr);
- TkMacOSXInvalidateWindow((MacDrawable*) window, TK_PARENT_WINDOW);
- TkGenWMConfigureEvent((Tk_Window)winPtr, x, y, width, height,
- flags);
- if (attr & kWindowBoundsChangeUserResize ||
- attr & kWindowBoundsChangeUserDrag) {
- TkMacOSXRunTclEventLoop();
- }
- if (wmPtr->attributes & kWindowResizableAttribute) {
- HIViewRef growBoxView;
-
- err = HIViewFindByID(HIViewGetRoot(whichWindow),
- kHIViewWindowGrowBoxID, &growBoxView);
- if (err == noErr) {
- ChkErr(HIViewSetNeedsDisplay, growBoxView, true);
- }
- }
- }
- break;
- case kEventWindowDragStarted:
- if (!(TkMacOSXModifierState() & cmdKey)) {
- TkMacOSXBringWindowForward(whichWindow);
- }
- TkMacOSXTrackingLoop(1);
- break;
- case kEventWindowDragCompleted: {
- Rect maxBounds, bounds, strWidths;
- int h = 0, v = 0;
-
- TkMacOSXTrackingLoop(0);
- ChkErr(GetWindowGreatestAreaDevice, whichWindow, kWindowDragRgn, NULL,
- &maxBounds);
- ChkErr(GetWindowBounds, whichWindow, kWindowStructureRgn, &bounds);
- ChkErr(GetWindowStructureWidths, whichWindow, &strWidths);
- if (bounds.left > maxBounds.right - strWidths.left) {
- h = maxBounds.right - (strWidths.left ? strWidths.left : 40)
- - bounds.left;
- } else if (bounds.right < maxBounds.left + strWidths.right) {
- h = maxBounds.left + (strWidths.right ? strWidths.right : 40)
- - bounds.right;
- }
- if (bounds.top > maxBounds.bottom - strWidths.top) {
- v = maxBounds.bottom - (strWidths.top ? strWidths.top : 40)
- - bounds.top;
- } else if (bounds.bottom < maxBounds.top + strWidths.bottom) {
- v = maxBounds.top + (strWidths.bottom ? strWidths.bottom : 40)
- - bounds.bottom;
- } else if (strWidths.top && bounds.top < maxBounds.top) {
- v = maxBounds.top - bounds.top;
- }
- if (h || v) {
- OffsetRect(&bounds, h, v);
- ChkErr(SetWindowBounds, whichWindow, kWindowStructureRgn,&bounds);
- }
- break;
- }
- case kEventWindowConstrain:
- if (winPtr && (winPtr->wmInfoPtr->flags & WM_FULLSCREEN) &&
- TkMacOSXMakeFullscreen(winPtr,whichWindow,1,NULL) == TCL_OK) {
- statusPtr->stopProcessing = 1;
- }
- break;
- case kEventWindowGetRegion:
- if (winPtr && (winPtr->wmInfoPtr->flags & WM_TRANSPARENT)) {
- WindowRegionCode code;
-
- statusPtr->stopProcessing = (CallNextEventHandler(
- eventPtr->callRef, eventPtr->eventRef) == noErr);
- err = ChkErr(GetEventParameter, eventPtr->eventRef,
- kEventParamWindowRegionCode, typeWindowRegionCode, NULL,
- sizeof(code), NULL, &code);
- if (err == noErr && code == kWindowOpaqueRgn) {
- RgnHandle rgn;
-
- err = ChkErr(GetEventParameter, eventPtr->eventRef,
- kEventParamRgnHandle, typeQDRgnHandle, NULL,
- sizeof(rgn), NULL, &rgn);
- if (err == noErr) {
- SetEmptyRgn(rgn);
- statusPtr->stopProcessing = 1;
- }
- }
- }
- break;
- case kEventWindowDrawContent:
- if (winPtr && (winPtr->wmInfoPtr->flags & WM_TRANSPARENT)) {
- CGrafPtr port;
-
- GetPort(&port);
- ClearPort(port, NULL);
- }
- break;
- }
-
- return eventFound;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateUpdateEvent --
- *
- * Given a Macintosh window update event this function generates all the
- * Expose XEvents needed by Tk.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GenerateUpdateEvent(
- Window window)
-{
- WindowRef macWindow;
- TkDisplay *dispPtr;
- TkWindow *winPtr;
- int result = 0;
- CGRect updateBounds;
- HIShapeRef rgn;
- HIMutableShapeRef updateRgn;
- int dx, dy;
-
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *)Tk_IdToWindow(dispPtr->display, window);
-
- if (winPtr ==NULL ){
- return result;
- }
- macWindow = TkMacOSXDrawableWindow(window);
- TK_IF_MAC_OS_X_API (5, HIWindowCopyShape,
- ChkErr(HIWindowCopyShape, macWindow, kWindowUpdateRgn,
- kHICoordSpaceWindow, &rgn);
- dx = -winPtr->wmInfoPtr->xInParent;
- dy = -winPtr->wmInfoPtr->yInParent;
- ) TK_ELSE_MAC_OS_X (5,
- Rect bounds;
-
- TkMacOSXCheckTmpQdRgnEmpty();
- ChkErr(GetWindowRegion, macWindow, kWindowUpdateRgn, tkMacOSXtmpQdRgn);
- rgn = HIShapeCreateWithQDRgn(tkMacOSXtmpQdRgn);
- SetEmptyRgn(tkMacOSXtmpQdRgn);
- ChkErr(GetWindowBounds, macWindow, kWindowContentRgn, &bounds);
- dx = -bounds.left;
- dy = -bounds.top;
- ) TK_ENDIF;
-
- updateRgn = HIShapeCreateMutableCopy(rgn);
- CFRelease(rgn);
- ChkErr(HIShapeOffset, updateRgn, dx, dy);
- HIShapeGetBounds(updateRgn, &updateBounds);
-#ifdef TK_MAC_DEBUG_CLIP_REGIONS
- TkMacOSXDebugFlashRegion(window, updateRgn);
-#endif /* TK_MAC_DEBUG_CLIP_REGIONS */
- BeginUpdate(macWindow);
- if (winPtr->wmInfoPtr->flags & WM_TRANSPARENT) {
- ClearPort(TkMacOSXGetDrawablePort(window), updateRgn);
- }
- result = GenerateUpdates(updateRgn, &updateBounds, winPtr);
- EndUpdate(macWindow);
- CFRelease(updateRgn);
- if (result) {
- /*
- * Ensure there are no pending idle-time redraws that could prevent
- * the just posted Expose events from generating new redraws.
- */
-
- Tcl_DoOneEvent(TCL_IDLE_EVENTS|TCL_DONT_WAIT);
- }
- return result;
- }
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateUpdates --
- *
- * Given a Macintosh update region and a Tk window this function geneates
- * a X Expose event for the window if it is within the update region. The
- * function will then recursivly have each damaged window generate Expose
- * events for its child windows.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-static int
-GenerateUpdates(
- HIMutableShapeRef updateRgn,
- CGRect *updateBounds,
- TkWindow *winPtr)
-{
- TkWindow *childPtr;
- XEvent event;
- CGRect bounds, damageBounds;
- HIShapeRef boundsRgn, damageRgn;
-
- TkMacOSXWinCGBounds(winPtr, &bounds);
- if (!CGRectIntersectsRect(bounds, *updateBounds)) {
- return 0;
- }
- TK_IF_MAC_OS_X_API (4, HIShapeIntersectsRect,
- if (!HIShapeIntersectsRect(updateRgn, &bounds)) {
- return 0;
- }
- ) TK_ENDIF
-
- /*
- * Compute the bounding box of the area that the damage occured in.
- */
-
- boundsRgn = HIShapeCreateWithRect(&bounds);
- damageRgn = HIShapeCreateIntersection(updateRgn, boundsRgn);
- if (HIShapeIsEmpty(damageRgn)) {
- CFRelease(damageRgn);
- CFRelease(boundsRgn);
- return 0;
- }
- HIShapeGetBounds(damageRgn, &damageBounds);
- ChkErr(TkMacOSHIShapeUnion, boundsRgn, updateRgn, updateRgn);
- HIShapeGetBounds(updateRgn, updateBounds);
- CFRelease(damageRgn);
- CFRelease(boundsRgn);
-
- event.xany.serial = Tk_Display(winPtr)->request;
- event.xany.send_event = false;
- event.xany.window = Tk_WindowId(winPtr);
- event.xany.display = Tk_Display(winPtr);
- event.type = Expose;
- event.xexpose.x = damageBounds.origin.x - bounds.origin.x;
- event.xexpose.y = damageBounds.origin.y - bounds.origin.y;
- event.xexpose.width = damageBounds.size.width;
- event.xexpose.height = damageBounds.size.height;
- event.xexpose.count = 0;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
- /*
- * Generate updates for the children of this window
- */
-
- for (childPtr = winPtr->childList; childPtr != NULL;
- childPtr = childPtr->nextPtr) {
- if (!Tk_IsMapped(childPtr) || Tk_IsTopLevel(childPtr)) {
- continue;
- }
- GenerateUpdates(updateRgn, updateBounds, childPtr);
- }
-
- /*
- * Generate updates for any contained windows
- */
-
- if (Tk_IsContainer(winPtr)) {
- childPtr = TkpGetOtherWindow(winPtr);
- if (childPtr != NULL && Tk_IsMapped(childPtr)) {
- GenerateUpdates(updateRgn, updateBounds, childPtr);
- }
-
- /*
- * TODO: Here we should handle out of process embedding.
- */
- }
-
- return 1;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * GenerateActivateEvents --
- *
- * Given a Macintosh window activate event this function generates all
- * the X Activate events needed by Tk.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-int
-GenerateActivateEvents(
- Window window, /* Root X window for event. */
- int activeFlag)
-{
- TkWindow *winPtr;
- TkDisplay *dispPtr;
-
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window);
- if (winPtr == NULL || winPtr->window == None) {
- return false;
- }
-
- TkGenerateActivateEvents(winPtr,activeFlag);
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkMacOSXGenerateFocusEvent --
- *
- * Given a Macintosh window activate event this function generates all
- * the X Focus events needed by Tk.
- *
- * Results:
- * True if event(s) are generated - false otherwise.
- *
- * Side effects:
- * Additional events may be place on the Tk event queue.
- *
- *----------------------------------------------------------------------
- */
-
-MODULE_SCOPE int
-TkMacOSXGenerateFocusEvent(
- Window window, /* Root X window for event. */
- int activeFlag)
-{
- XEvent event;
- Tk_Window tkwin;
- TkDisplay *dispPtr;
-
- dispPtr = TkGetDisplayList();
- tkwin = Tk_IdToWindow(dispPtr->display, window);
- if (tkwin == NULL) {
- return false;
- }
-
- /*
- * Don't send focus events to windows of class help or to windows with the
- * kWindowNoActivatesAttribute.
- */
-
- if (((TkWindow *)tkwin)->wmInfoPtr->macClass == kHelpWindowClass ||
- ((TkWindow *)tkwin)->wmInfoPtr->attributes &
- kWindowNoActivatesAttribute) {
- return false;
- }
-
- /*
- * Generate FocusIn and FocusOut events. This event is only sent to the
- * toplevel window.
- */
-
- if (activeFlag) {
- event.xany.type = FocusIn;
- } else {
- event.xany.type = FocusOut;
- }
-
- event.xany.serial = dispPtr->display->request;
- event.xany.send_event = False;
- event.xfocus.display = dispPtr->display;
- event.xfocus.window = window;
- event.xfocus.mode = NotifyNormal;
- event.xfocus.detail = NotifyDetailNone;
-
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- return true;
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGenWMConfigureEvent --
- *
- * Generate a ConfigureNotify event for Tk. Depending on the value of
- * flag the values of width/height, x/y, or both may be changed.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A ConfigureNotify event is sent to Tk.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkGenWMConfigureEvent(
- Tk_Window tkwin,
- int x,
- int y,
- int width,
- int height,
- int flags)
-{
- XEvent event;
- WmInfo *wmPtr;
- TkWindow *winPtr = (TkWindow *) tkwin;
-
- if (tkwin == NULL) {
- return;
- }
-
- event.type = ConfigureNotify;
- event.xconfigure.serial = Tk_Display(tkwin)->request;
- event.xconfigure.send_event = False;
- event.xconfigure.display = Tk_Display(tkwin);
- event.xconfigure.event = Tk_WindowId(tkwin);
- event.xconfigure.window = Tk_WindowId(tkwin);
- event.xconfigure.border_width = winPtr->changes.border_width;
- event.xconfigure.override_redirect = winPtr->atts.override_redirect;
- if (winPtr->changes.stack_mode == Above) {
- event.xconfigure.above = winPtr->changes.sibling;
- } else {
- event.xconfigure.above = None;
- }
-
- if (!(flags & TK_LOCATION_CHANGED)) {
- x = Tk_X(tkwin);
- y = Tk_Y(tkwin);
- }
- if (!(flags & TK_SIZE_CHANGED)) {
- width = Tk_Width(tkwin);
- height = Tk_Height(tkwin);
- }
- event.xconfigure.x = x;
- event.xconfigure.y = y;
- event.xconfigure.width = width;
- event.xconfigure.height = height;
-
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-
- /*
- * Update window manager information.
- */
-
- if (Tk_IsTopLevel(winPtr)) {
- wmPtr = winPtr->wmInfoPtr;
- if (flags & TK_LOCATION_CHANGED) {
- wmPtr->x = x;
- wmPtr->y = y;
- wmPtr->flags &= ~(WM_NEGATIVE_X | WM_NEGATIVE_Y);
- }
- if ((flags & TK_SIZE_CHANGED) && !(wmPtr->flags & WM_SYNC_PENDING) &&
- ((width != Tk_Width(tkwin)) || (height != Tk_Height(tkwin)))) {
- if ((wmPtr->width == -1) && (width == winPtr->reqWidth)) {
- /*
- * Don't set external width, since the user didn't change it
- * from what the widgets asked for.
- */
- } else {
- if (wmPtr->gridWin != NULL) {
- wmPtr->width = wmPtr->reqGridWidth
- + (width - winPtr->reqWidth)/wmPtr->widthInc;
- if (wmPtr->width < 0) {
- wmPtr->width = 0;
- }
- } else {
- wmPtr->width = width;
- }
- }
- if ((wmPtr->height == -1) && (height == winPtr->reqHeight)) {
- /*
- * Don't set external height, since the user didn't change it
- * from what the widgets asked for.
- */
- } else {
- if (wmPtr->gridWin != NULL) {
- wmPtr->height = wmPtr->reqGridHeight
- + (height - winPtr->reqHeight)/wmPtr->heightInc;
- if (wmPtr->height < 0) {
- wmPtr->height = 0;
- }
- } else {
- wmPtr->height = height;
- }
- }
- wmPtr->configWidth = width;
- wmPtr->configHeight = height;
- }
- }
-
- /*
- * Now set up the changes structure. Under X we wait for the
- * ConfigureNotify to set these values. On the Mac we know imediatly that
- * this is what we want - so we just set them. However, we need to make
- * sure the windows clipping region is marked invalid so the change is
- * visible to the subwindow.
- */
-
- winPtr->changes.x = x;
- winPtr->changes.y = y;
- winPtr->changes.width = width;
- winPtr->changes.height = height;
- TkMacOSXInvalClipRgns(tkwin);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkGenWMDestroyEvent --
- *
- * Generate a WM Destroy event for Tk.
- *
- * Results:
- * None.
- *
- * Side effects:
- * A WM_PROTOCOL/WM_DELETE_WINDOW event is sent to Tk.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkGenWMDestroyEvent(
- Tk_Window tkwin)
-{
- XEvent event;
-
- event.xany.serial = Tk_Display(tkwin)->request;
- event.xany.send_event = False;
- event.xany.display = Tk_Display(tkwin);
-
- event.xclient.window = Tk_WindowId(tkwin);
- event.xclient.type = ClientMessage;
- event.xclient.message_type = Tk_InternAtom(tkwin, "WM_PROTOCOLS");
- event.xclient.format = 32;
- event.xclient.data.l[0] = Tk_InternAtom(tkwin, "WM_DELETE_WINDOW");
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * TkWmProtocolEventProc --
- *
- * This procedure is called by the Tk_HandleEvent whenever a
- * ClientMessage event arrives whose type is "WM_PROTOCOLS". This
- * procedure handles the message from the window manager in an
- * appropriate fashion.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Depends on what sort of handler, if any, was set up for the protocol.
- *
- *----------------------------------------------------------------------
- */
-
-void
-TkWmProtocolEventProc(
- TkWindow *winPtr, /* Window to which the event was sent. */
- XEvent *eventPtr) /* X event. */
-{
- WmInfo *wmPtr;
- ProtocolHandler *protPtr;
- Tcl_Interp *interp;
- Atom protocol;
- int result;
-
- wmPtr = winPtr->wmInfoPtr;
- if (wmPtr == NULL) {
- return;
- }
- protocol = (Atom) eventPtr->xclient.data.l[0];
- for (protPtr = wmPtr->protPtr; protPtr != NULL;
- protPtr = protPtr->nextPtr) {
- if (protocol == protPtr->protocol) {
- Tcl_Preserve(protPtr);
- interp = protPtr->interp;
- Tcl_Preserve(interp);
- result = Tcl_GlobalEval(interp, protPtr->command);
- if (result != TCL_OK) {
- Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
- "\n (command for \"%s\" window manager protocol)",
- Tk_GetAtomName((Tk_Window) winPtr, protocol)));
- Tcl_BackgroundException(interp, result);
- }
- Tcl_Release(interp);
- Tcl_Release(protPtr);
- return;
- }
- }
-
- /*
- * No handler was present for this protocol. If this is a WM_DELETE_WINDOW
- * message then just destroy the window.
- */
-
- if (protocol == Tk_InternAtom((Tk_Window) winPtr, "WM_DELETE_WINDOW")) {
- Tk_DestroyWindow((Tk_Window) winPtr);
- }
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * Tk_MacOSXIsAppInFront --
- *
- * Returns 1 if this app is the foreground app.
- *
- * Results:
- * 1 if app is in front, 0 otherwise.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-int
-Tk_MacOSXIsAppInFront(void)
-{
- OSStatus err;
- ProcessSerialNumber frontPsn, ourPsn = {0, kCurrentProcess};
- Boolean isFrontProcess = true;
-
- err = ChkErr(GetFrontProcess, &frontPsn);
- if (err == noErr) {
- ChkErr(SameProcess, &frontPsn, &ourPsn, &isFrontProcess);
- }
-
- return (isFrontProcess == true);
-}
-
-/*
- *----------------------------------------------------------------------
- *
- * ClearPort --
- *
- * Clear (i.e. fill with transparent color) the given port.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ClearPort(
- CGrafPtr port,
- HIShapeRef updateRgn)
-{
- CGContextRef context;
- Rect bounds;
- CGRect rect;
-
- GetPortBounds(port, &bounds);
- QDBeginCGContext(port, &context);
- SyncCGContextOriginWithPort(context, port);
- CGContextConcatCTM(context, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0,
- bounds.bottom - bounds.top));
- if (updateRgn) {
- ChkErr(HIShapeReplacePathInCGContext, updateRgn, context);
- CGContextEOClip(context);
- }
- rect = CGRectMake(0, 0, bounds.right, bounds.bottom);
- CGContextClearRect(context, rect);
- QDEndCGContext(port, &context);
-}
-
-/*
- * Local Variables:
- * fill-column: 78
- * c-basic-offset: 4
- * End:
- */