summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXXStubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'macosx/tkMacOSXXStubs.c')
-rw-r--r--macosx/tkMacOSXXStubs.c335
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();