diff options
Diffstat (limited to 'macosx/tkMacOSXXStubs.c')
-rw-r--r-- | macosx/tkMacOSXXStubs.c | 335 |
1 files changed, 178 insertions, 157 deletions
diff --git a/macosx/tkMacOSXXStubs.c b/macosx/tkMacOSXXStubs.c index 2ebf2b1..6891a3d 100644 --- a/macosx/tkMacOSXXStubs.c +++ b/macosx/tkMacOSXXStubs.c @@ -1,18 +1,19 @@ -/* +/* * tkMacOSXXStubs.c -- * - * This file contains most of the X calls called by Tk. Many of - * these calls are just stubs and either don't make sense on the - * Macintosh or thier implamentation just doesn't do anything. Other - * calls will eventually be moved into other files. + * This file contains most of the X calls called by Tk. Many of + * these calls are just stubs and either don't make sense on the + * Macintosh or thier implamentation just doesn't do anything. Other + * calls will eventually be moved into other files. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. * 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. * - * RCS: @(#) $Id: tkMacOSXXStubs.c,v 1.2.2.13 2006/09/10 17:07:36 das Exp $ + * RCS: @(#) $Id: tkMacOSXXStubs.c,v 1.2.2.14 2007/04/29 02:26:51 das Exp $ */ #include "tkMacOSXInt.h" @@ -20,14 +21,14 @@ /* * Because this file is still under major development Debugger statements are - * used through out this file. The define TCL_DEBUG will decide whether + * used through out this file. The define TCL_DEBUG will decide whether * the debugger statements actually call the debugger or not. */ #ifndef TCL_DEBUG # define Debugger() #endif - + #define ROOT_ID 10 /* @@ -35,30 +36,27 @@ */ static TkDisplay *gMacDisplay = NULL; /* Macintosh display. */ -static char *macScreenName = ":0"; /* Default name of macintosh display. */ +static const char *macScreenName = ":0"; /* Default name of macintosh display. */ /* * Forward declarations of procedures used in this file. */ -static XID MacXIdAlloc _ANSI_ARGS_((Display *display)); -static int DefaultErrorHandler _ANSI_ARGS_((Display* display, - XErrorEvent* err_evt)); +static XID MacXIdAlloc(Display *display); +static int DefaultErrorHandler(Display* display, XErrorEvent* err_evt); /* * Other declarations */ -static int TkMacOSXXDestroyImage _ANSI_ARGS_((XImage *image)); -static unsigned long TkMacOSXXGetPixel _ANSI_ARGS_((XImage *image, int x, int y)); -static int TkMacOSXXPutPixel _ANSI_ARGS_((XImage *image, int x, int y, - unsigned long pixel)); -static XImage *TkMacOSXXSubImage _ANSI_ARGS_((XImage *image, int x, int y, - unsigned int width, unsigned int height)); -static int TkMacOSXXAddPixel _ANSI_ARGS_((XImage *image, long value)); -int _XInitImageFuncPtrs _ANSI_ARGS_((XImage *image)); - +static int TkMacOSXXDestroyImage(XImage *image); +static unsigned long TkMacOSXXGetPixel(XImage *image, int x, int y); +static int TkMacOSXXPutPixel(XImage *image, int x, int y, unsigned long pixel); +static XImage *TkMacOSXXSubImage(XImage *image, int x, int y, + unsigned int width, unsigned int height); +static int TkMacOSXXAddPixel(XImage *image, long value); + /* *---------------------------------------------------------------------- * @@ -81,6 +79,7 @@ TkMacOSXDisplayChanged(Display *display) { GDHandle graphicsDevice; Screen *screen; + Rect bounds = {0, 0, 0, 0}, *maxBounds; if (display == NULL || display->screens == NULL) { return; @@ -88,15 +87,29 @@ TkMacOSXDisplayChanged(Display *display) screen = display->screens; graphicsDevice = GetMainDevice(); - screen->root_depth = (*(*graphicsDevice)->gdPMap)->cmpSize * - (*(*graphicsDevice)->gdPMap)->cmpCount; - screen->height = (*graphicsDevice)->gdRect.bottom - + screen->root_depth = (*(*graphicsDevice)->gdPMap)->cmpSize * + (*(*graphicsDevice)->gdPMap)->cmpCount; + screen->height = (*graphicsDevice)->gdRect.bottom - (*graphicsDevice)->gdRect.top; - screen->width = (*graphicsDevice)->gdRect.right - + screen->width = (*graphicsDevice)->gdRect.right - (*graphicsDevice)->gdRect.left; - screen->mwidth = (screen->width * 254 + 360) / 720; - screen->mheight = (screen->height * 254 + 360) / 720; + screen->mwidth = (screen->width * 254 + 360) / 720; + screen->mheight = (screen->height * 254 + 360) / 720; + + maxBounds = (Rect*) screen->ext_data; + *maxBounds = bounds; + graphicsDevice = GetDeviceList(); + while (graphicsDevice) { + OSStatus err; + + err = ChkErr(GetAvailableWindowPositioningBounds, graphicsDevice, + &bounds); + if (err == noErr) { + UnionRect(&bounds, maxBounds, maxBounds); + } + graphicsDevice = GetNextDevice(graphicsDevice); + } } /* @@ -122,7 +135,8 @@ TkpOpenDisplay( { Display *display; Screen *screen; - int fd = 0; + int fd = 0; + static Rect maxBounds = {0, 0, 0, 0}; if (gMacDisplay != NULL) { if (strcmp(gMacDisplay->display->display_name, display_name) == 0) { @@ -131,7 +145,6 @@ TkpOpenDisplay( return NULL; } } - InitCursor(); display = (Display *) ckalloc(sizeof(Display)); screen = (Screen *) ckalloc(sizeof(Screen)); @@ -139,13 +152,13 @@ TkpOpenDisplay( bzero(screen, sizeof(Screen)); display->resource_alloc = MacXIdAlloc; - display->request = 0; - display->qlen = 0; - display->fd = fd; - display->screens = screen; - display->nscreens = 1; + display->request = 0; + display->qlen = 0; + display->fd = fd; + display->screens = screen; + display->nscreens = 1; display->default_screen = 0; - display->display_name = macScreenName; + display->display_name = (char*)macScreenName; Gestalt(gestaltQuickdrawVersion, (long*)&display->proto_minor_version); display->proto_major_version = 10; @@ -156,14 +169,15 @@ TkpOpenDisplay( /* * These screen bits never change */ - screen->root = ROOT_ID; - screen->display = display; - screen->black_pixel = 0x00000000; - screen->white_pixel = 0x00FFFFFF; + screen->root = ROOT_ID; + screen->display = display; + screen->black_pixel = 0x00000000 | PIXEL_MAGIC << 24; + screen->white_pixel = 0x00FFFFFF | PIXEL_MAGIC << 24; + screen->ext_data = (XExtData*) &maxBounds; screen->root_visual = (Visual *) ckalloc(sizeof(Visual)); screen->root_visual->visualid = 0; - screen->root_visual->class = TrueColor; + screen->root_visual->class = TrueColor; screen->root_visual->red_mask = 0x00FF0000; screen->root_visual->green_mask = 0x0000FF00; screen->root_visual->blue_mask = 0x000000FF; @@ -209,15 +223,15 @@ TkpCloseDisplay( { Display *display = displayPtr->display; if (gMacDisplay != displayPtr) { - Tcl_Panic("TkpCloseDisplay: tried to call TkpCloseDisplay on bad display"); + Tcl_Panic("TkpCloseDisplay: tried to call TkpCloseDisplay on bad display"); } gMacDisplay = NULL; if (display->screens != (Screen *) NULL) { - if (display->screens->root_visual != (Visual *) NULL) { - ckfree((char *) display->screens->root_visual); - } - ckfree((char *) display->screens); + if (display->screens->root_visual != (Visual *) NULL) { + ckfree((char *) display->screens->root_visual); + } + ckfree((char *) display->screens); } ckfree((char *) display); } @@ -229,7 +243,7 @@ TkpCloseDisplay( * * This procedure is called to cleanup resources associated with * claiming clipboard ownership and for receiving selection get - * results. This function is called in tkWindow.c. This has to be + * results. This function is called in tkWindow.c. This has to be * called by the display cleanup function because we still need the * access display elements. * @@ -244,7 +258,7 @@ TkpCloseDisplay( void TkClipCleanup(dispPtr) - TkDisplay *dispPtr; /* display associated with clipboard */ + TkDisplay *dispPtr; /* display associated with clipboard */ { /* * Make sure that the local scrap is transfered to the global @@ -329,7 +343,7 @@ TkpWindowWasRecentlyDeleted( * * DefaultErrorHandler -- * - * This procedure is the default X error handler. Tk uses it's + * This procedure is the default X error handler. Tk uses it's * own error handler so this call should never be called. * * Results: @@ -347,7 +361,7 @@ DefaultErrorHandler( XErrorEvent* err_evt) { /* - * This call should never be called. Tk replaces + * This call should never be called. Tk replaces * it with its own error handler. */ Tcl_Panic("Warning hit bogus error handler!"); @@ -394,45 +408,45 @@ XGetImage(display, d, x, y, width, height, plane_mask, format) unsigned int height; unsigned long plane_mask; int format; -{ +{ XImage * imagePtr = NULL; Pixmap pixmap = (Pixmap) NULL; Tk_Window win = (Tk_Window) ((MacDrawable *) d)->winPtr; - GC gc; - int depth = 32; - int offset = 0; - int bitmap_pad = 32; - int bytes_per_line = 0; - + GC gc; + int depth = 32; + int offset = 0; + int bitmap_pad = 32; + int bytes_per_line = 0; + if (TkMacOSXGetDrawablePort(d)) { - if (format == ZPixmap) { - if (width > 0 && height > 0) { - /* Tk_GetPixmap fails for zero width or height */ - pixmap = Tk_GetPixmap(display, d, width, height, depth); - } - if (win) { - XGCValues values; - gc = Tk_GetGC(win, 0, &values); - } else { - gc = XCreateGC(display, pixmap, 0, NULL); - } - if (pixmap) { - XCopyArea(display, d, pixmap, gc, x, y, width, height, 0, 0); - } - imagePtr = XCreateImage(display, NULL, depth, format, offset, - (char*)TkMacOSXGetDrawablePort(pixmap), - width, height, bitmap_pad, bytes_per_line); - /* Track Pixmap underlying the XImage in the unused obdata field * - * so that we can treat XImages coming from XGetImage specially. */ - imagePtr->obdata = (XPointer) pixmap; - if (!win) { - XFreeGC(display, gc); - } - } else { - TkpDisplayWarning( - "XGetImage: only ZPixmap types are implemented", - "XGetImage Failure"); - } + if (format == ZPixmap) { + if (width > 0 && height > 0) { + /* Tk_GetPixmap fails for zero width or height */ + pixmap = Tk_GetPixmap(display, d, width, height, depth); + } + if (win) { + XGCValues values; + gc = Tk_GetGC(win, 0, &values); + } else { + gc = XCreateGC(display, pixmap, 0, NULL); + } + if (pixmap) { + XCopyArea(display, d, pixmap, gc, x, y, width, height, 0, 0); + } + imagePtr = XCreateImage(display, NULL, depth, format, offset, + (char*)TkMacOSXGetDrawablePort(pixmap), + width, height, bitmap_pad, bytes_per_line); + /* Track Pixmap underlying the XImage in the unused obdata field * + * so that we can treat XImages coming from XGetImage specially. */ + imagePtr->obdata = (XPointer) pixmap; + if (!win) { + XFreeGC(display, gc); + } + } else { + TkpDisplayWarning( + "XGetImage: only ZPixmap types are implemented", + "XGetImage Failure"); + } } return imagePtr; } @@ -460,17 +474,18 @@ XGetGeometry(display, d, root_return, x_return, y_return, width_return, *width_return = Tk_Width(winPtr); *height_return = Tk_Height(winPtr); *border_width_return = winPtr->changes.border_width; - *depth_return = Tk_Depth(winPtr); + *depth_return = Tk_Depth(winPtr); } else { Rect boundsRect; CGrafPtr destPort = TkMacOSXGetDrawablePort(d); - GetPortBounds(destPort,&boundsRect); + + GetPortBounds(destPort, &boundsRect); *x_return = boundsRect.left; *y_return = boundsRect.top; *width_return = boundsRect.right - boundsRect.left; *height_return = boundsRect.bottom - boundsRect.top; - *border_width_return = 0; - *depth_return = 32; + *border_width_return = 0; + *depth_return = 32; } return 1; } @@ -514,23 +529,23 @@ XSetWMNormalHints( XSizeHints* hints) { /* - * Do nothing. Shouldn't even be called. + * Do nothing. Shouldn't even be called. */ } XSizeHints * -XAllocSizeHints() +XAllocSizeHints(void) { /* - * Always return NULL. Tk code checks to see if NULL + * Always return NULL. Tk code checks to see if NULL * is returned & does nothing if it is. */ - + return NULL; } #endif -XImage * +XImage * XCreateImage( Display* display, Visual* visual, @@ -542,7 +557,7 @@ XCreateImage( unsigned int height, int bitmap_pad, int bytes_per_line) -{ +{ XImage *ximage; display->request++; @@ -658,15 +673,15 @@ XQueryColor( unsigned char r, g, b; XColor *d = def_in_out; - p = d->pixel; - r = (p & 0x00FF0000) >> 16; - g = (p & 0x0000FF00) >> 8; - b = (p & 0x000000FF); - d->red = (r << 8) | r; + p = d->pixel; + r = (p & 0x00FF0000) >> 16; + g = (p & 0x0000FF00) >> 8; + b = (p & 0x000000FF); + d->red = (r << 8) | r; d->green = (g << 8) | g; - d->blue = (b << 8) | b; + d->blue = (b << 8) | b; d->flags = DoRed|DoGreen|DoBlue; - d->pad = 0; + d->pad = 0; } void @@ -682,21 +697,21 @@ XQueryColors( XColor *d = defs_in_out; for (i = 0; i < ncolors; i++, d++) { - p = d->pixel; - r = (p & 0x00FF0000) >> 16; - g = (p & 0x0000FF00) >> 8; - b = (p & 0x000000FF); - d->red = (r << 8) | r; + p = d->pixel; + r = (p & 0x00FF0000) >> 16; + g = (p & 0x0000FF00) >> 8; + b = (p & 0x000000FF); + d->red = (r << 8) | r; d->green = (g << 8) | g; - d->blue = (b << 8) | b; + d->blue = (b << 8) | b; d->flags = DoRed|DoGreen|DoBlue; - d->pad = 0; + d->pad = 0; } } -int +int XQueryTree(display, w, root_return, parent_return, children_return, - nchildren_return) + nchildren_return) Display* display; Window w; Window* root_return; @@ -737,7 +752,7 @@ XRefreshKeyboardMapping( XMappingEvent* x) Debugger(); } -void +void XSetIconName( Display* display, Window w, @@ -749,15 +764,15 @@ XSetIconName( display->request++; } -void +void XForceScreenSaver( Display* display, int mode) { - /* - * This function is just a no-op. It is defined to - * reset the screen saver. However, there is no real - * way to do this on a Mac. Let me know if there is! + /* + * This function is just a no-op. It is defined to + * reset the screen saver. However, there is no real + * way to do this on a Mac. Let me know if there is! */ display->request++; } @@ -784,7 +799,7 @@ XSync (Display *display, Bool flag) * TkGetServerInfo -- * * Given a window, this procedure returns information about - * the window server for that window. This procedure provides + * the window server for that window. This procedure provides * the guts of the "winfo server" command. * * Results: @@ -800,7 +815,7 @@ void TkGetServerInfo( Tcl_Interp *interp, /* The server information is returned in * this interpreter's result. */ - Tk_Window tkwin) /* Token for window; this selects a + Tk_Window tkwin) /* Token for window; this selects a * particular display and server. */ { char buffer[8 + TCL_INTEGER_SPACE * 2]; @@ -810,77 +825,83 @@ TkGetServerInfo( ProtocolRevision(Tk_Display(tkwin))); sprintf(buffer2, " %x", VendorRelease(Tk_Display(tkwin))); Tcl_AppendResult(interp, buffer, ServerVendor(Tk_Display(tkwin)), - buffer2, (char *) NULL); + buffer2, NULL); } /* - * Image stuff + * Image stuff */ -static int +static int TkMacOSXXDestroyImage( XImage *image) { if (image->obdata) - Tk_FreePixmap((Display*)gMacDisplay,(Pixmap)image->obdata); + Tk_FreePixmap((Display*)gMacDisplay,(Pixmap)image->obdata); return 0; } -static unsigned long +static unsigned long TkMacOSXXGetPixel( XImage *image, int x, int y) { - CGrafPtr grafPtr, oldPort; + CGrafPtr destPort, savePort; + Boolean portChanged; RGBColor cPix; unsigned long r, g, b, c; - grafPtr = (CGrafPtr)image->data; - GetPort(&oldPort); - SetPort(grafPtr); - GetCPixel(x,y,&cPix); + + destPort = (CGrafPtr)image->data; + portChanged = QDSwapPort(destPort, &savePort); + GetCPixel(x, y, &cPix); if (image->obdata) { - /* Image from XGetImage, 16 bit color values */ - r = (cPix . red) >> 8; - g = (cPix . green) >> 8; - b = (cPix . blue) >> 8; + /* Image from XGetImage, 16 bit color values */ + r = (cPix . red) >> 8; + g = (cPix . green) >> 8; + b = (cPix . blue) >> 8; } else { - r = cPix . red; - g = cPix . green; - b = cPix . blue; + r = cPix . red; + g = cPix . green; + b = cPix . blue; } c = (r<<16)|(g<<8)|(b); - SetPort(oldPort); + if (portChanged) { + QDSwapPort(savePort, NULL); + } return c; } -static int +static int TkMacOSXXPutPixel( XImage *image, int x, int y, unsigned long pixel) { - CGrafPtr grafPtr, oldPort; + CGrafPtr destPort, savePort; + Boolean portChanged; RGBColor cPix; unsigned long r, g, b; - grafPtr = (CGrafPtr)image->data; - GetPort(&oldPort); - SetPort(grafPtr); + + destPort = (CGrafPtr)image->data; + portChanged = QDSwapPort(destPort, &savePort); r = (pixel & image->red_mask)>>16; g = (pixel & image->green_mask)>>8; b = (pixel & image->blue_mask); if (image->obdata) { - /* Image from XGetImage, 16 bit color values */ - cPix . red = r << 8; - cPix . green = g << 8; - cPix . blue = b << 8; + /* Image from XGetImage, 16 bit color values */ + cPix . red = r << 8; + cPix . green = g << 8; + cPix . blue = b << 8; } else { - cPix . red = r; - cPix . green = g; - cPix . blue = b; + cPix . red = r; + cPix . green = g; + cPix . blue = b; + } + SetCPixel(x, y, &cPix); + if (portChanged) { + QDSwapPort(savePort, NULL); } - SetCPixel(x,y,&cPix); - SetPort(oldPort); return 0; } @@ -896,7 +917,7 @@ TkMacOSXXSubImage( return NULL; } -static int +static int TkMacOSXXAddPixel( XImage *image, long value) @@ -912,7 +933,7 @@ TkMacOSXXAddPixel( * XSetWindowBackgroundPixmap, XSetWindowBorder, XSetWindowBorderPixmap, * XSetWindowBorderWidth, XSetWindowColormap * - * These functions are all no-ops. They all have equivilent + * These functions are all no-ops. They all have equivilent * Tk calls that should always be used instead. * * Results: @@ -933,7 +954,7 @@ XChangeWindowAttributes( { } -void +void XSetWindowBackground( Display *display, Window window, @@ -984,8 +1005,8 @@ XSetWindowColormap( Status XStringListToTextProperty( - char** list, - int count, + char** list, + int count, XTextProperty* text_prop_return) { Debugger(); @@ -993,8 +1014,8 @@ XStringListToTextProperty( } void XSetWMClientMachine( - Display* display, - Window w, + Display* display, + Window w, XTextProperty* text_prop) { Debugger(); |