summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog25
-rw-r--r--macosx/tkMacOSXBitmap.c270
-rw-r--r--macosx/tkMacOSXButton.c1969
-rw-r--r--macosx/tkMacOSXCarbonEvents.c399
-rw-r--r--macosx/tkMacOSXClipboard.c343
-rw-r--r--macosx/tkMacOSXCursor.c8
-rw-r--r--macosx/tkMacOSXDialog.c1013
-rw-r--r--macosx/tkMacOSXDraw.c800
-rw-r--r--macosx/tkMacOSXEvent.c235
-rw-r--r--macosx/tkMacOSXFont.c2364
-rw-r--r--macosx/tkMacOSXInit.c44
-rw-r--r--macosx/tkMacOSXInt.h180
-rw-r--r--macosx/tkMacOSXKeyEvent.c1418
-rw-r--r--macosx/tkMacOSXMenu.c3954
-rw-r--r--macosx/tkMacOSXMenubutton.c977
-rw-r--r--macosx/tkMacOSXMouseEvent.c22
-rw-r--r--macosx/tkMacOSXScale.c308
-rw-r--r--macosx/tkMacOSXWindowEvent.c62
-rw-r--r--macosx/tkMacOSXWm.c1408
19 files changed, 7665 insertions, 8134 deletions
diff --git a/ChangeLog b/ChangeLog
index 573695a..a52eaef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-04-13 Donal K. Fellows <donal.k.fellows@manchester.ac.uk>
+
+ * macosx/tkMacOSXInt.h (LOG_MSG, LOG_ON_ERROR): Added macros to make
+ the OSX code much less #ifdef-full.
+
2007-04-12 Jeff Hobbs <jeffh@ActiveState.com>
* library/ttk/panedwindow.tcl (ttk::panedwindow::Press): handle
@@ -5,23 +10,23 @@
2007-04-10 Joe English <jenglish@users.sourceforge.net>
- * win/ttkWinMonitor.c, win/ttkWinXPTheme.c: Re-sync
- with Tile codebase so patches can flow back and forth.
- * win/ttkWinXPTheme.c: Skip OS version test, should work on
- Vista/Aero now as well as XP [Fixes #1687299, thanks
- to George Petasis for tracking this down].
+ * win/ttkWinMonitor.c, win/ttkWinXPTheme.c: Re-sync with Tile codebase
+ so patches can flow back and forth.
+ * win/ttkWinXPTheme.c: Skip OS version test, should work on Vista/Aero
+ now as well as XP [Fixes #1687299, thanks to George Petasis for
+ tracking this down].
2007-03-21 Joe English <jenglish@users.sourceforge.net>
- * generic/ttk/ttkLayout.c(Ttk_BuildLayoutTemplate): BUGFIX:
- Nested TTK_GROUP nodes did not work unless they appeared
- at the end of the layout (and only by accident then).
+ * generic/ttk/ttkLayout.c(Ttk_BuildLayoutTemplate): BUGFIX: Nested
+ TTK_GROUP nodes did not work unless they appeared at the end of the
+ layout (and only by accident then).
2007-03-08 Joe English <jenglish@users.sourceforge.net>
* tests/grid.test(grid-21.7): Reset wm geometry . and pack propagate .
- at end of test. 'pack propagate . 0' was causing cascading failures in
- subsequent tests [Bug 1676770].
+ at end of test. 'pack propagate . 0' was causing cascading failures in
+ subsequent tests. [Bug 1676770]
2007-03-07 Daniel Steffen <das@users.sourceforge.net>
diff --git a/macosx/tkMacOSXBitmap.c b/macosx/tkMacOSXBitmap.c
index 369759e..9735d98 100644
--- a/macosx/tkMacOSXBitmap.c
+++ b/macosx/tkMacOSXBitmap.c
@@ -1,34 +1,36 @@
-/*
+/*
* tkMacOSXBitmap.c --
*
- * This file handles the implementation of native bitmaps.
+ * This file handles the implementation of native bitmaps.
*
* Copyright (c) 1996-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXBitmap.c,v 1.4 2006/03/24 14:58:01 das Exp $
+ * RCS: @(#) $Id: tkMacOSXBitmap.c,v 1.5 2007/04/13 14:51:17 dkf Exp $
*/
#include "tkMacOSXInt.h"
/*
- * Depending on the resource type there are different ways to
- * draw native icons.
+ * Depending on the resource type there are different ways to draw native
+ * icons.
*/
-#define TYPE1 0 /* Family icon suite. */
-#define TYPE2 1 /* ICON resource. */
-#define TYPE3 2 /* cicn resource. */
+
+#define TYPE1 0 /* Family icon suite. */
+#define TYPE2 1 /* ICON resource. */
+#define TYPE3 2 /* cicn resource. */
/*
- * This data structure describes the id and type of a given icon.
- * It is used as the source for native icons.
+ * This data structure describes the id and type of a given icon. It is used
+ * as the source for native icons.
*/
+
typedef struct {
- int id; /* Resource Id for Icon. */
- long int type; /* Type of icon. */
+ int id; /* Resource Id for Icon. */
+ long int type; /* Type of icon. */
} NativeIcon;
/*
@@ -36,35 +38,35 @@ typedef struct {
*/
typedef struct {
- char *name; /* Name of icon. */
- long int type; /* Type of icon. */
- int id; /* Id of icon. */
- int size; /* Size of icon. */
+ char *name; /* Name of icon. */
+ long int type; /* Type of icon. */
+ int id; /* Id of icon. */
+ int size; /* Size of icon. */
} BuiltInIcon;
/*
- * This array mapps a string name to the supported builtin icons
- * on the Macintosh.
+ * This array mapps a string name to the supported builtin icons on the
+ * Macintosh.
*/
static BuiltInIcon builtInIcons[] = {
- {"document", TYPE1, kGenericDocumentIconResource, 32},
- {"stationery", TYPE1, kGenericStationeryIconResource, 32},
- {"edition", TYPE1, kGenericEditionFileIconResource, 32},
- {"application", TYPE1, kGenericApplicationIconResource, 32},
- {"accessory", TYPE1, kGenericDeskAccessoryIconResource, 32},
- {"folder", TYPE1, kGenericFolderIconResource, 32},
- {"pfolder", TYPE1, kPrivateFolderIconResource, 32},
- {"trash", TYPE1, kTrashIconResource, 32},
- {"floppy", TYPE1, kFloppyIconResource, 32},
- {"ramdisk", TYPE1, kGenericRAMDiskIconResource, 32},
- {"cdrom", TYPE1, kGenericCDROMIconResource, 32},
- {"preferences", TYPE1, kGenericPreferencesIconResource, 32},
- {"querydoc", TYPE1, kGenericQueryDocumentIconResource, 32},
- {"stop", TYPE2, kStopIcon, 32},
- {"note", TYPE2, kNoteIcon, 32},
- {"caution", TYPE2, kCautionIcon, 32},
- {(char *) NULL, 0, 0, 0}
+ {"document", TYPE1, kGenericDocumentIconResource, 32},
+ {"stationery", TYPE1, kGenericStationeryIconResource, 32},
+ {"edition", TYPE1, kGenericEditionFileIconResource, 32},
+ {"application", TYPE1, kGenericApplicationIconResource, 32},
+ {"accessory", TYPE1, kGenericDeskAccessoryIconResource, 32},
+ {"folder", TYPE1, kGenericFolderIconResource, 32},
+ {"pfolder", TYPE1, kPrivateFolderIconResource, 32},
+ {"trash", TYPE1, kTrashIconResource, 32},
+ {"floppy", TYPE1, kFloppyIconResource, 32},
+ {"ramdisk", TYPE1, kGenericRAMDiskIconResource, 32},
+ {"cdrom", TYPE1, kGenericCDROMIconResource, 32},
+ {"preferences", TYPE1, kGenericPreferencesIconResource, 32},
+ {"querydoc", TYPE1, kGenericQueryDocumentIconResource, 32},
+ {"stop", TYPE2, kStopIcon, 32},
+ {"note", TYPE2, kNoteIcon, 32},
+ {"caution", TYPE2, kCautionIcon, 32},
+ {(char *) NULL, 0, 0, 0}
};
/*
@@ -72,46 +74,46 @@ static BuiltInIcon builtInIcons[] = {
*
* TkpDefineNativeBitmaps --
*
- * Add native bitmaps.
+ * Add native bitmaps.
*
* Results:
- * A standard Tcl result. If an error occurs then TCL_ERROR is
- * returned and a message is left in the interp's result.
+ * A standard Tcl result. If an error occurs then TCL_ERROR is returned
+ * and a message is left in the interp's result.
*
* Side effects:
- * "Name" is entered into the bitmap table and may be used from
- * here on to refer to the given bitmap.
+ * "Name" is entered into the bitmap table and may be used from here on
+ * to refer to the given bitmap.
*
*----------------------------------------------------------------------
*/
void
-TkpDefineNativeBitmaps()
+TkpDefineNativeBitmaps(void)
{
- int new;
- Tcl_HashEntry *predefHashPtr;
- TkPredefBitmap *predefPtr;
- CONST char * name;
+ Tcl_HashTable *tablePtr = TkGetBitmapPredefTable();
BuiltInIcon *builtInPtr;
- NativeIcon *nativeIconPtr;
- Tcl_HashTable *tablePtr;
-
- for (builtInPtr = builtInIcons; builtInPtr->name != NULL; builtInPtr++) {
- name = Tk_GetUid(builtInPtr->name);
- tablePtr = TkGetBitmapPredefTable();
- predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &new);
- if (!new) {
- continue;
- }
- predefPtr = (TkPredefBitmap *) ckalloc(sizeof(TkPredefBitmap));
- nativeIconPtr = (NativeIcon *) ckalloc(sizeof(NativeIcon));
- nativeIconPtr->id = builtInPtr->id;
- nativeIconPtr->type = builtInPtr->type;
- predefPtr->source = (char *) nativeIconPtr;
- predefPtr->width = builtInPtr->size;
- predefPtr->height = builtInPtr->size;
- predefPtr->native = 1;
- Tcl_SetHashValue(predefHashPtr, predefPtr);
+
+ for (builtInPtr=builtInIcons ; builtInPtr->name!=NULL ; builtInPtr++) {
+ Tcl_HashEntry *predefHashPtr;
+ CONST char *name;
+ int isNew;
+
+ name = Tk_GetUid(builtInPtr->name);
+ predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &isNew);
+ if (isNew) {
+ TkPredefBitmap *predefPtr = (TkPredefBitmap *)
+ ckalloc(sizeof(TkPredefBitmap));
+ NativeIcon *nativeIconPtr = (NativeIcon *)
+ ckalloc(sizeof(NativeIcon));
+
+ nativeIconPtr->id = builtInPtr->id;
+ nativeIconPtr->type = builtInPtr->type;
+ predefPtr->source = (char *) nativeIconPtr;
+ predefPtr->width = builtInPtr->size;
+ predefPtr->height = builtInPtr->size;
+ predefPtr->native = 1;
+ Tcl_SetHashValue(predefHashPtr, predefPtr);
+ }
}
}
@@ -120,15 +122,15 @@ TkpDefineNativeBitmaps()
*
* TkpCreateNativeBitmap --
*
- * Add native bitmaps.
+ * Add native bitmaps.
*
* Results:
- * A standard Tcl result. If an error occurs then TCL_ERROR is
- * returned and a message is left in the interp's result.
+ * A standard Tcl result. If an error occurs then TCL_ERROR is returned
+ * and a message is left in the interp's result.
*
* Side effects:
- * "Name" is entered into the bitmap table and may be used from
- * here on to refer to the given bitmap.
+ * "Name" is entered into the bitmap table and may be used from here on
+ * to refer to the given bitmap.
*
*----------------------------------------------------------------------
*/
@@ -136,16 +138,15 @@ TkpDefineNativeBitmaps()
Pixmap
TkpCreateNativeBitmap(
Display *display,
- CONST char * source) /* Info about the icon to build. */
+ CONST char *source) /* Info about the icon to build. */
{
Pixmap pix;
GWorldPtr destPort;
Rect destRect;
- Handle icon;
CGrafPtr saveWorld;
GDHandle saveDevice;
NativeIcon *nativeIconPtr;
-
+
pix = Tk_GetPixmap(display, None, 32, 32, 0);
destPort = TkMacOSXGetDrawablePort(pix);
@@ -155,20 +156,21 @@ TkpCreateNativeBitmap(
nativeIconPtr = (NativeIcon *) source;
SetRect(&destRect, 0, 0, 32, 32);
if (nativeIconPtr->type == TYPE1) {
- RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
+ RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
- RGBForeColor(&white);
- PaintRect(&destRect);
- PlotIconID(&destRect, atAbsoluteCenter, ttNone, nativeIconPtr->id);
+ RGBForeColor(&white);
+ PaintRect(&destRect);
+ PlotIconID(&destRect, atAbsoluteCenter, ttNone, nativeIconPtr->id);
} else if (nativeIconPtr->type == TYPE2) {
- icon = GetIcon(nativeIconPtr->id);
- if (icon != NULL) {
- RGBColor black = {0, 0, 0};
-
- RGBForeColor(&black);
- PlotIcon(&destRect, icon);
- ReleaseResource(icon);
- }
+ Handle icon = GetIcon(nativeIconPtr->id);
+
+ if (icon != NULL) {
+ RGBColor black = {0, 0, 0};
+
+ RGBForeColor(&black);
+ PlotIcon(&destRect, icon);
+ ReleaseResource(icon);
+ }
}
SetGWorld(saveWorld, saveDevice);
@@ -180,24 +182,24 @@ TkpCreateNativeBitmap(
*
* TkpGetNativeAppBitmap --
*
- * Add native bitmaps.
+ * Add native bitmaps.
*
* Results:
- * A standard Tcl result. If an error occurs then TCL_ERROR is
- * returned and a message is left in the interp's result.
+ * A standard Tcl result. If an error occurs then TCL_ERROR is returned
+ * and a message is left in the interp's result.
*
* Side effects:
- * "Name" is entered into the bitmap table and may be used from
- * here on to refer to the given bitmap.
+ * "Name" is entered into the bitmap table and may be used from here on
+ * to refer to the given bitmap.
*
*----------------------------------------------------------------------
*/
Pixmap
TkpGetNativeAppBitmap(
- Display *display, /* The display. */
- CONST char *name, /* The name of the bitmap. */
- int *width, /* The width & height of the bitmap. */
+ Display *display, /* The display. */
+ CONST char *name, /* The name of the bitmap. */
+ int *width, /* The width & height of the bitmap. */
int *height)
{
Pixmap pix;
@@ -208,66 +210,74 @@ TkpGetNativeAppBitmap(
Handle resource;
int type = -1, destWrote;
Str255 nativeName;
-
+
/*
* macRoman is the encoding that the resource fork uses.
*/
Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), name,
- strlen(name), 0, NULL,
- (char *) &nativeName[1],
- 255, NULL, &destWrote, NULL); /* Internalize native */
+ strlen(name), 0, NULL, (char *) &nativeName[1], 255, NULL,
+ &destWrote, NULL); /* Internalize native */
nativeName[0] = destWrote;
resource = GetNamedResource('cicn', nativeName);
if (resource != NULL) {
- type = TYPE3;
+ type = TYPE3;
} else {
- resource = GetNamedResource('ICON', nativeName);
- if (resource != NULL) {
- type = TYPE2;
- }
+ resource = GetNamedResource('ICON', nativeName);
+ if (resource != NULL) {
+ type = TYPE2;
+ }
}
-
+
if (resource == NULL) {
- return (Pixmap) NULL;
+ return (Pixmap) NULL;
}
-
+
pix = Tk_GetPixmap(display, None, 32, 32, 0);
destPort = TkMacOSXGetDrawablePort(pix);
GetGWorld(&saveWorld, &saveDevice);
SetGWorld(destPort, NULL);
-
+
SetRect(&destRect, 0, 0, 32, 32);
if (type == TYPE2) {
- RGBColor black = {0, 0, 0};
-
- RGBForeColor(&black);
- PlotIcon(&destRect, resource);
- ReleaseResource(resource);
+ RGBColor black = {0, 0, 0};
+
+ RGBForeColor(&black);
+ PlotIcon(&destRect, resource);
+ ReleaseResource(resource);
} else if (type == TYPE3) {
- RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
- short id;
- ResType theType;
- Str255 dummy;
-
- /*
- * We need to first paint the background white. Also, for
- * some reason we *must* use GetCIcon instead of GetNamedResource
- * for PlotCIcon to work - so we use GetResInfo to get the id.
- */
- RGBForeColor(&white);
- PaintRect(&destRect);
- GetResInfo(resource, &id, &theType, dummy);
- ReleaseResource(resource);
- resource = (Handle) GetCIcon(id);
- PlotCIcon(&destRect, (CIconHandle) resource);
- DisposeCIcon((CIconHandle) resource);
+ RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
+ short id;
+ ResType theType;
+ Str255 dummy;
+
+ /*
+ * We need to first paint the background white. Also, for some reason
+ * we *must* use GetCIcon instead of GetNamedResource for PlotCIcon to
+ * work - so we use GetResInfo to get the id.
+ */
+
+ RGBForeColor(&white);
+ PaintRect(&destRect);
+ GetResInfo(resource, &id, &theType, dummy);
+ ReleaseResource(resource);
+ resource = (Handle) GetCIcon(id);
+ PlotCIcon(&destRect, (CIconHandle) resource);
+ DisposeCIcon((CIconHandle) resource);
}
-
+
*width = 32;
*height = 32;
SetGWorld(saveWorld, saveDevice);
return pix;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXButton.c b/macosx/tkMacOSXButton.c
index c7577f3..1fc95aa 100644
--- a/macosx/tkMacOSXButton.c
+++ b/macosx/tkMacOSXButton.c
@@ -1,16 +1,16 @@
-/*
+/*
* tkMacOSXButton.c --
*
- * This file implements the Macintosh specific portion of the
- * button widgets.
+ * This file implements the Macintosh specific portion of the button
+ * widgets.
*
* Copyright (c) 1996-1997 by Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXButton.c,v 1.20 2006/08/18 07:30:54 das Exp $
+ * RCS: @(#) $Id: tkMacOSXButton.c,v 1.21 2007/04/13 14:51:17 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -23,6 +23,7 @@
/*
* Default insets for controls
*/
+
#define DEF_INSET_LEFT 2
#define DEF_INSET_RIGHT 2
#define DEF_INSET_TOP 2
@@ -37,7 +38,7 @@
#define DRAW_CUSTOM 2 /* Make our own button drawing. */
#define DRAW_BEVEL 3
-/*
+/*
* Declaration of Mac specific button structure.
*/
@@ -46,75 +47,77 @@ typedef struct {
SInt16 minValue;
SInt16 maxValue;
SInt16 procID;
- int isBevel;
+ int isBevel;
} MacControlParams;
typedef struct {
int drawType;
Tk_3DBorder border;
int relief;
- int offset; /* 0 means this is a normal widget. 1 means
- * it is an image button, so we offset the
- * image to make the button appear to move
- * up and down as the relief changes. */
- GC gc;
+ int offset; /* 0 means this is a normal widget. 1 means it
+ * is an image button, so we offset the image
+ * to make the button appear to move up and
+ * down as the relief changes. */
+ GC gc;
int hasImageOrBitmap;
} DrawParams;
-
typedef struct {
- TkButton info; /* generic button info */
- int id;
- int usingControl;
- int useTkText;
- int flags; /* initialisation status */
- MacControlParams params;
- WindowRef windowRef;
- RGBColor userPaneBackground;
- ControlRef userPane; /* Carbon control */
- ControlRef control; /* Carbon control */
- Str255 controlTitle;
- ControlFontStyleRec fontStyle;
- /*
- * the following are used to store the image content for
- * beveled buttons - i.e. buttons with images.
+ TkButton info; /* Generic button info */
+ int id;
+ int usingControl;
+ int useTkText;
+ int flags; /* Initialisation status */
+ MacControlParams params;
+ WindowRef windowRef;
+ RGBColor userPaneBackground;
+ ControlRef userPane; /* Carbon control */
+ ControlRef control; /* Carbon control */
+ Str255 controlTitle;
+ ControlFontStyleRec fontStyle;
+ /*
+ * The following are used to store the image content for beveled buttons -
+ * i.e. buttons with images.
*/
- CCTabHandle tabHandle;
+ CCTabHandle tabHandle;
ControlButtonContentInfo bevelButtonContent;
- OpenCPicParams picParams;
- Pixmap picPixmap;
+ OpenCPicParams picParams;
+ Pixmap picPixmap;
} MacButton;
/*
* Forward declarations for procedures defined later in this file:
*/
-
-static OSErr SetUserPaneDrawProc(ControlRef control,
- ControlUserPaneDrawProcPtr upp);
-static OSErr SetUserPaneSetUpSpecialBackgroundProc(ControlRef control,
- ControlUserPaneBackgroundProcPtr upp);
-static void UserPaneDraw(ControlRef control, ControlPartCode cpc);
-static void UserPaneBackgroundProc(ControlHandle,
- ControlBackgroundPtr info);
-
-static void ButtonEventProc _ANSI_ARGS_(( ClientData clientData, XEvent *eventPtr));
-static int UpdateControlColors _ANSI_ARGS_((MacButton *mbPtr ));
-static void TkMacOSXComputeControlParams _ANSI_ARGS_((TkButton * butPtr, MacControlParams * paramsPtr));
-static int TkMacOSXComputeDrawParams _ANSI_ARGS_((TkButton * butPtr, DrawParams * dpPtr));
-static void TkMacOSXDrawControl _ANSI_ARGS_((MacButton *butPtr,
- GWorldPtr destPort, GC gc, Pixmap pixmap));
-static void SetupBevelButton _ANSI_ARGS_((MacButton *butPtr,
- ControlRef controlHandle,
- GWorldPtr destPort, GC gc, Pixmap pixmap));
+static OSErr SetUserPaneDrawProc(ControlRef control,
+ ControlUserPaneDrawProcPtr upp);
+static OSErr SetUserPaneSetUpSpecialBackgroundProc(
+ ControlRef control,
+ ControlUserPaneBackgroundProcPtr upp);
+static void UserPaneDraw(ControlRef control, ControlPartCode cpc);
+static void UserPaneBackgroundProc(ControlHandle,
+ ControlBackgroundPtr info);
+
+static void ButtonEventProc(ClientData clientData,
+ XEvent *eventPtr);
+static int UpdateControlColors(MacButton *mbPtr);
+static void TkMacOSXComputeControlParams(TkButton *butPtr,
+ MacControlParams *paramsPtr);
+static int TkMacOSXComputeDrawParams(TkButton *butPtr,
+ DrawParams *dpPtr);
+static void TkMacOSXDrawControl(MacButton *butPtr,
+ GWorldPtr destPort, GC gc, Pixmap pixmap);
+static void SetupBevelButton(MacButton *butPtr,
+ ControlRef controlHandle, GWorldPtr destPort,
+ GC gc, Pixmap pixmap);
/*
* The class procedure table for the button widgets.
*/
-Tk_ClassProcs tkpButtonProcs = {
- sizeof(Tk_ClassProcs), /* size */
- TkButtonWorldChanged, /* worldChangedProc */
+Tk_ClassProcs tkpButtonProcs = {
+ sizeof(Tk_ClassProcs), /* size */
+ TkButtonWorldChanged, /* worldChangedProc */
};
static int bCount;
@@ -126,13 +129,13 @@ int tkPictureIsOpen;
*
* TkpCreateButton --
*
- * Allocate a new TkButton structure.
+ * Allocate a new TkButton structure.
*
* Results:
- * Returns a newly allocated TkButton structure.
+ * Returns a newly allocated TkButton structure.
*
* Side effects:
- * Registers an event handler for the widget.
+ * Registers an event handler for the widget.
*
*----------------------------------------------------------------------
*/
@@ -141,10 +144,10 @@ TkButton *
TkpCreateButton(
Tk_Window tkwin)
{
- MacButton *macButtonPtr;
- macButtonPtr = (MacButton *) ckalloc(sizeof(MacButton));
+ MacButton *macButtonPtr = (MacButton *) ckalloc(sizeof(MacButton));
+
Tk_CreateEventHandler(tkwin, ActivateMask,
- ButtonEventProc, (ClientData) macButtonPtr);
+ ButtonEventProc, (ClientData) macButtonPtr);
macButtonPtr->id = bCount++;
macButtonPtr->usingControl = 0;
macButtonPtr->flags = 0;
@@ -165,6 +168,7 @@ TkpCreateButton(
macButtonPtr->bevelButtonContent.contentType = kControlContentPictHandle;
bzero(&macButtonPtr->params, sizeof(macButtonPtr->params));
bzero(&macButtonPtr->fontStyle,sizeof(macButtonPtr->fontStyle));
+
return (TkButton *)macButtonPtr;
}
@@ -173,309 +177,298 @@ TkpCreateButton(
*
* TkpDisplayButton --
*
- * This procedure is invoked to display a button widget. It is
- * normally invoked as an idle handler.
+ * This procedure is invoked to display a button widget. It is normally
+ * invoked as an idle handler.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Commands are output to X to display the button in its
- * current mode. The REDRAW_PENDING flag is cleared.
+ * Commands are output to X to display the button in its current mode.
+ * The REDRAW_PENDING flag is cleared.
*
*----------------------------------------------------------------------
*/
void
TkpDisplayButton(
- ClientData clientData) /* Information about widget. */
+ ClientData clientData) /* Information about widget. */
{
MacButton *macButtonPtr = (MacButton *)clientData;
- TkButton *butPtr = (TkButton *) clientData;
- Tk_Window tkwin = butPtr->tkwin;
- int width, height, fullWidth, fullHeight;
- int textXOffset, textYOffset;
- int haveImage = 0, haveText = 0;
+ TkButton *butPtr = (TkButton *) clientData;
+ Tk_Window tkwin = butPtr->tkwin;
GWorldPtr destPort;
- int borderWidth;
Pixmap pixmap;
- int wasUsingControl;
- int imageWidth = 0, imageHeight = 0;
- int imageXOffset = 0, imageYOffset = 0; /* image information that will
- * be used to restrict disabled
- * pixmap as well */
- DrawParams drawParams, * dpPtr = &drawParams;
+ int width, height, fullWidth, fullHeight, textXOffset, textYOffset;
+ int borderWidth, wasUsingControl;
+ int haveImage = 0, haveText = 0, imageWidth = 0, imageHeight = 0;
+ int imageXOffset = 0, imageYOffset = 0;
+ /* Image information that will be used to
+ * restrict disabled pixmap as well. */
+ DrawParams drawParams, *dpPtr = &drawParams;
butPtr->flags &= ~REDRAW_PENDING;
if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
- return;
+ return;
}
pixmap = (Pixmap) Tk_WindowId(tkwin);
wasUsingControl = macButtonPtr->usingControl;
if (TkMacOSXComputeDrawParams(butPtr, &drawParams) ) {
- macButtonPtr->usingControl = 1;
- if (butPtr->type == TYPE_BUTTON) {
- macButtonPtr->useTkText = 0;
- } else {
- macButtonPtr->useTkText = 1;
- }
+ macButtonPtr->usingControl = 1;
+ if (butPtr->type == TYPE_BUTTON) {
+ macButtonPtr->useTkText = 0;
+ } else {
+ macButtonPtr->useTkText = 1;
+ }
} else {
- macButtonPtr->usingControl = 0;
- macButtonPtr->useTkText = 1;
+ macButtonPtr->usingControl = 0;
+ macButtonPtr->useTkText = 1;
}
-
- /*
- * set up clipping region. Make sure the we are using the port
- * for this button, or we will set the wrong window's clip.
+
+ /*
+ * Set up clipping region. Make sure the we are using the port for this
+ * button, or we will set the wrong window's clip.
*/
-
+
destPort = TkMacOSXGetDrawablePort(pixmap);
SetGWorld(destPort, NULL);
TkMacOSXSetUpClippingRgn(pixmap);
-
/*
- * See the comment in UpdateControlColors as to why we use the
+ * See the comment in UpdateControlColors as to why we use the
* highlightbackground for the border of Macintosh buttons.
*/
if (macButtonPtr->useTkText) {
- if (butPtr->type == TYPE_BUTTON) {
- Tk_Fill3DRectangle(tkwin, pixmap, butPtr->highlightBorder, 0, 0,
- Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
- } else {
- Tk_Fill3DRectangle(tkwin, pixmap, butPtr->normalBorder, 0, 0,
- Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
- }
+ if (butPtr->type == TYPE_BUTTON) {
+ Tk_Fill3DRectangle(tkwin, pixmap, butPtr->highlightBorder, 0, 0,
+ Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
+ } else {
+ Tk_Fill3DRectangle(tkwin, pixmap, butPtr->normalBorder, 0, 0,
+ Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT);
+ }
}
/*
* Draw the native portion of the buttons. Start by creating the control
- * if it doesn't already exist. Then configure the Macintosh control from
- * the Tk info. Finally, we call Draw1Control to draw to the screen.
+ * if it doesn't already exist. Then configure the Macintosh control from
+ * the Tk info. Finally, we call Draw1Control to draw to the screen.
*/
if (macButtonPtr->usingControl) {
- borderWidth = 0;
- TkMacOSXDrawControl(macButtonPtr, destPort, dpPtr->gc, pixmap);
- } else {
- if (wasUsingControl && macButtonPtr->userPane) {
- DisposeControl(macButtonPtr->userPane);
- macButtonPtr->userPane = NULL;
- macButtonPtr->control = NULL;
- macButtonPtr->flags = 0;
- }
+ borderWidth = 0;
+ TkMacOSXDrawControl(macButtonPtr, destPort, dpPtr->gc, pixmap);
+ } else if (wasUsingControl && macButtonPtr->userPane) {
+ DisposeControl(macButtonPtr->userPane);
+ macButtonPtr->userPane = NULL;
+ macButtonPtr->control = NULL;
+ macButtonPtr->flags = 0;
}
if ((dpPtr->drawType == DRAW_CUSTOM) || (dpPtr->drawType == DRAW_LABEL)) {
- borderWidth = butPtr->borderWidth;
+ borderWidth = butPtr->borderWidth;
}
/*
- * Display image or bitmap or text for button. This has
- * already been done under Appearance with the Bevel
- * button types.
+ * Display image or bitmap or text for button. This has already been done
+ * under Appearance with the Bevel button types.
*/
if (dpPtr->drawType == DRAW_BEVEL) {
- /* Empty Body */
- } else {
- if (butPtr->image != None) {
- Tk_SizeOfImage(butPtr->image, &width, &height);
- haveImage = 1;
- } else if (butPtr->bitmap != None) {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
- haveImage = 1;
- }
- imageWidth = width;
- imageHeight = height;
-
- haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0);
- if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) {
- int x;
- int y;
- textXOffset = 0;
- textYOffset = 0;
- fullWidth = 0;
- fullHeight = 0;
-
- switch ((enum compound) butPtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- /* Image is above or below text */
- if (butPtr->compound == COMPOUND_TOP) {
- textYOffset = height + butPtr->padY;
- } else {
- imageYOffset = butPtr->textHeight + butPtr->padY;
- }
- fullHeight = height + butPtr->textHeight + butPtr->padY;
- fullWidth = (width > butPtr->textWidth ? width :
- butPtr->textWidth);
- textXOffset = (fullWidth - butPtr->textWidth)/2;
- imageXOffset = (fullWidth - width)/2;
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- /*
- * Image is left or right of text
- */
-
- if (butPtr->compound == COMPOUND_LEFT) {
- textXOffset = width + butPtr->padX;
- } else {
- imageXOffset = butPtr->textWidth + butPtr->padX;
- }
- fullWidth = butPtr->textWidth + butPtr->padX + width;
- fullHeight = (height > butPtr->textHeight ? height :
- butPtr->textHeight);
- textYOffset = (fullHeight - butPtr->textHeight)/2;
- imageYOffset = (fullHeight - height)/2;
- break;
- }
- case COMPOUND_CENTER: {
- /*
- * Image and text are superimposed
- */
-
- fullWidth = (width > butPtr->textWidth ? width :
- butPtr->textWidth);
- fullHeight = (height > butPtr->textHeight ? height :
- butPtr->textHeight);
- textXOffset = (fullWidth - butPtr->textWidth)/2;
- imageXOffset = (fullWidth - width)/2;
- textYOffset = (fullHeight - butPtr->textHeight)/2;
- imageYOffset = (fullHeight - height)/2;
- break;
- }
- case COMPOUND_NONE: {break;}
- }
-
- TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY,
- butPtr->indicatorSpace + fullWidth, fullHeight, &x, &y);
-
- x += butPtr->indicatorSpace;
-
- x += dpPtr->offset;
- y += dpPtr->offset;
- if (dpPtr->relief == TK_RELIEF_RAISED) {
- x -= dpPtr->offset;
- y -= dpPtr->offset;
- } else if (dpPtr->relief == TK_RELIEF_SUNKEN) {
- x += dpPtr->offset;
- y += dpPtr->offset;
- }
- imageXOffset += x;
- imageYOffset += y;
- if (butPtr->image != NULL) {
- if ((butPtr->selectImage != NULL) &&
- (butPtr->flags & SELECTED)) {
- Tk_RedrawImage(butPtr->selectImage, 0, 0,
- width, height, pixmap, imageXOffset, imageYOffset);
- } else if ((butPtr->tristateImage != NULL) &&
- (butPtr->flags & TRISTATED)) {
- Tk_RedrawImage(butPtr->tristateImage, 0, 0,
- width, height, pixmap, imageXOffset, imageYOffset);
- } else {
- Tk_RedrawImage(butPtr->image, 0, 0, width,
- height, pixmap, imageXOffset, imageYOffset);
- }
- } else {
- XSetClipOrigin(butPtr->display, dpPtr->gc,
+ goto applyStipple;
+ }
+
+ if (butPtr->image != None) {
+ Tk_SizeOfImage(butPtr->image, &width, &height);
+ haveImage = 1;
+ } else if (butPtr->bitmap != None) {
+ Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
+ haveImage = 1;
+ }
+ imageWidth = width;
+ imageHeight = height;
+
+ haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0);
+ if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) {
+ int x, y;
+
+ textXOffset = 0;
+ textYOffset = 0;
+ fullWidth = 0;
+ fullHeight = 0;
+
+ switch ((enum compound) butPtr->compound) {
+ case COMPOUND_TOP:
+ case COMPOUND_BOTTOM:
+ /*
+ * Image is above or below text.
+ */
+
+ if (butPtr->compound == COMPOUND_TOP) {
+ textYOffset = height + butPtr->padY;
+ } else {
+ imageYOffset = butPtr->textHeight + butPtr->padY;
+ }
+ fullHeight = height + butPtr->textHeight + butPtr->padY;
+ fullWidth = (width>butPtr->textWidth ? width : butPtr->textWidth);
+ textXOffset = (fullWidth - butPtr->textWidth)/2;
+ imageXOffset = (fullWidth - width)/2;
+ break;
+
+ case COMPOUND_LEFT:
+ case COMPOUND_RIGHT:
+ /*
+ * Image is left or right of text.
+ */
+
+ if (butPtr->compound == COMPOUND_LEFT) {
+ textXOffset = width + butPtr->padX;
+ } else {
+ imageXOffset = butPtr->textWidth + butPtr->padX;
+ }
+ fullWidth = butPtr->textWidth + butPtr->padX + width;
+ fullHeight = (height > butPtr->textHeight ? height :
+ butPtr->textHeight);
+ textYOffset = (fullHeight - butPtr->textHeight)/2;
+ imageYOffset = (fullHeight - height)/2;
+ break;
+
+ case COMPOUND_CENTER:
+ /*
+ * Image and text are superimposed.
+ */
+
+ fullWidth = (width>butPtr->textWidth ? width : butPtr->textWidth);
+ fullHeight = (height > butPtr->textHeight ? height :
+ butPtr->textHeight);
+ textXOffset = (fullWidth - butPtr->textWidth)/2;
+ imageXOffset = (fullWidth - width)/2;
+ textYOffset = (fullHeight - butPtr->textHeight)/2;
+ imageYOffset = (fullHeight - height)/2;
+ break;
+
+ case COMPOUND_NONE:
+ break;
+ }
+
+ TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY,
+ butPtr->indicatorSpace + fullWidth, fullHeight, &x, &y);
+
+ x += butPtr->indicatorSpace;
+
+ x += dpPtr->offset;
+ y += dpPtr->offset;
+ if (dpPtr->relief == TK_RELIEF_RAISED) {
+ x -= dpPtr->offset;
+ y -= dpPtr->offset;
+ } else if (dpPtr->relief == TK_RELIEF_SUNKEN) {
+ x += dpPtr->offset;
+ y += dpPtr->offset;
+ }
+ imageXOffset += x;
+ imageYOffset += y;
+ if (butPtr->image != NULL) {
+ if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) {
+ Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height,
+ pixmap, imageXOffset, imageYOffset);
+ } else if ((butPtr->tristateImage != NULL) &&
+ (butPtr->flags & TRISTATED)) {
+ Tk_RedrawImage(butPtr->tristateImage, 0, 0, width, height,
+ pixmap, imageXOffset, imageYOffset);
+ } else {
+ Tk_RedrawImage(butPtr->image, 0, 0, width, height, pixmap,
+ imageXOffset, imageYOffset);
+ }
+ } else {
+ XSetClipOrigin(butPtr->display, dpPtr->gc, imageXOffset,
+ imageYOffset);
+ XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, dpPtr->gc,
+ 0, 0, (unsigned int) width, (unsigned int) height,
+ imageXOffset, imageYOffset, 1);
+ XSetClipOrigin(butPtr->display, dpPtr->gc, 0, 0);
+ }
+
+ if (macButtonPtr->useTkText) {
+ Tk_DrawTextLayout(butPtr->display, pixmap, dpPtr->gc,
+ butPtr->textLayout, x + textXOffset, y + textYOffset,
+ 0, -1);
+ Tk_UnderlineTextLayout(butPtr->display, pixmap, dpPtr->gc,
+ butPtr->textLayout, x + textXOffset, y + textYOffset,
+ butPtr->underline);
+ }
+ y += fullHeight/2;
+ } else if (haveImage) {
+ int x = 0, y;
+
+ TkComputeAnchor(butPtr->anchor, tkwin, 0, 0,
+ butPtr->indicatorSpace + width, height, &x, &y);
+ x += butPtr->indicatorSpace;
+
+ x += dpPtr->offset;
+ y += dpPtr->offset;
+ if (dpPtr->relief == TK_RELIEF_RAISED) {
+ x -= dpPtr->offset;
+ y -= dpPtr->offset;
+ } else if (dpPtr->relief == TK_RELIEF_SUNKEN) {
+ x += dpPtr->offset;
+ y += dpPtr->offset;
+ }
+ imageXOffset += x;
+ imageYOffset += y;
+ if (butPtr->image != NULL) {
+ if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) {
+ Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height,
+ pixmap, imageXOffset, imageYOffset);
+ } else if ((butPtr->tristateImage != NULL) &&
+ (butPtr->flags & TRISTATED)) {
+ Tk_RedrawImage(butPtr->tristateImage, 0, 0, width, height,
+ pixmap, imageXOffset, imageYOffset);
+ } else {
+ Tk_RedrawImage(butPtr->image, 0, 0, width, height, pixmap,
imageXOffset, imageYOffset);
- XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, dpPtr->gc,
- 0, 0, (unsigned int) width, (unsigned int) height,
- imageXOffset, imageYOffset, 1);
- XSetClipOrigin(butPtr->display, dpPtr->gc, 0, 0);
- }
-
- if (macButtonPtr->useTkText) {
- Tk_DrawTextLayout(butPtr->display, pixmap,
- dpPtr->gc, butPtr->textLayout,
- x + textXOffset, y + textYOffset, 0, -1);
- Tk_UnderlineTextLayout(butPtr->display, pixmap, dpPtr->gc,
- butPtr->textLayout,
- x + textXOffset, y + textYOffset,
- butPtr->underline);
- }
- y += fullHeight/2;
- } else {
- if (haveImage) {
- int x = 0;
- int y;
-
- TkComputeAnchor(butPtr->anchor, tkwin, 0, 0,
- butPtr->indicatorSpace + width, height, &x, &y);
- x += butPtr->indicatorSpace;
-
- x += dpPtr->offset;
- y += dpPtr->offset;
- if (dpPtr->relief == TK_RELIEF_RAISED) {
- x -= dpPtr->offset;
- y -= dpPtr->offset;
- } else if (dpPtr->relief == TK_RELIEF_SUNKEN) {
- x += dpPtr->offset;
- y += dpPtr->offset;
- }
- imageXOffset += x;
- imageYOffset += y;
- if (butPtr->image != NULL) {
- if ((butPtr->selectImage != NULL) &&
- (butPtr->flags & SELECTED)) {
- Tk_RedrawImage(butPtr->selectImage, 0, 0, width,
- height, pixmap, imageXOffset, imageYOffset);
- } else if ((butPtr->tristateImage != NULL) &&
- (butPtr->flags & TRISTATED)) {
- Tk_RedrawImage(butPtr->tristateImage, 0, 0, width,
- height, pixmap, imageXOffset, imageYOffset);
- } else {
- Tk_RedrawImage(butPtr->image, 0, 0, width, height,
- pixmap, imageXOffset, imageYOffset);
- }
- } else {
- XSetClipOrigin(butPtr->display, dpPtr->gc, x, y);
- XCopyPlane(butPtr->display, butPtr->bitmap,
- pixmap, dpPtr->gc,
- 0, 0, (unsigned int) width,
- (unsigned int) height, x, y, 1);
- XSetClipOrigin(butPtr->display, dpPtr->gc, 0, 0);
- }
- y += height/2;
- } else if (macButtonPtr->useTkText) {
- int x = 0;
- int y;
- TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX,
- butPtr->padY,
- butPtr->indicatorSpace + butPtr->textWidth,
- butPtr->textHeight, &x, &y);
- x += butPtr->indicatorSpace;
- Tk_DrawTextLayout(butPtr->display, pixmap, dpPtr->gc,
- butPtr->textLayout, x, y, 0, -1);
- }
- }
+ }
+ } else {
+ XSetClipOrigin(butPtr->display, dpPtr->gc, x, y);
+ XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, dpPtr->gc,
+ 0, 0, (unsigned) width, (unsigned) height, x, y, 1);
+ XSetClipOrigin(butPtr->display, dpPtr->gc, 0, 0);
+ }
+ y += height/2;
+ } else if (macButtonPtr->useTkText) {
+ int x = 0, y;
+
+ TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY,
+ butPtr->indicatorSpace + butPtr->textWidth,
+ butPtr->textHeight, &x, &y);
+ x += butPtr->indicatorSpace;
+ Tk_DrawTextLayout(butPtr->display, pixmap, dpPtr->gc,
+ butPtr->textLayout, x, y, 0, -1);
}
/*
* If the button is disabled with a stipple rather than a special
- * foreground color, generate the stippled effect. If the widget
- * is selected and we use a different background color when selected,
- * must temporarily modify the GC so the stippling is the right color.
+ * foreground color, generate the stippled effect. If the widget is
+ * selected and we use a different background color when selected, must
+ * temporarily modify the GC so the stippling is the right color.
*/
+ applyStipple:
if (macButtonPtr->useTkText) {
- if ((butPtr->state == STATE_DISABLED)
- && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) {
- if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn
+ if ((butPtr->state == STATE_DISABLED)
+ && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) {
+ if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn
&& (butPtr->selectBorder != NULL)) {
- XSetForeground(butPtr->display, butPtr->stippleGC,
+ XSetForeground(butPtr->display, butPtr->stippleGC,
Tk_3DBorderColor(butPtr->selectBorder)->pixel);
- }
+ }
+
/*
* Stipple the whole button if no disabledFg was specified,
* otherwise restrict stippling only to displayed image
*/
+
if (butPtr->disabledFg == NULL) {
XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC,
0, 0, (unsigned) Tk_Width(tkwin),
@@ -485,24 +478,25 @@ TkpDisplayButton(
imageXOffset, imageYOffset,
(unsigned) imageWidth, (unsigned) imageHeight);
}
- if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn
+ if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn
&& (butPtr->selectBorder != NULL)) {
XSetForeground(butPtr->display, butPtr->stippleGC,
Tk_3DBorderColor(butPtr->normalBorder)->pixel);
}
- }
-
- /*
- * Draw the border and traversal highlight last. This way, if the
- * button's contents overflow they'll be covered up by the border.
- */
-
- if (dpPtr->relief != TK_RELIEF_FLAT) {
- int inset = butPtr->highlightWidth;
- Tk_Draw3DRectangle(tkwin, pixmap, dpPtr->border, inset, inset,
- Tk_Width(tkwin) - 2*inset, Tk_Height(tkwin) - 2*inset,
- butPtr->borderWidth, dpPtr->relief);
- }
+ }
+
+ /*
+ * Draw the border and traversal highlight last. This way, if the
+ * button's contents overflow they'll be covered up by the border.
+ */
+
+ if (dpPtr->relief != TK_RELIEF_FLAT) {
+ int inset = butPtr->highlightWidth;
+
+ Tk_Draw3DRectangle(tkwin, pixmap, dpPtr->border, inset, inset,
+ Tk_Width(tkwin) - 2*inset, Tk_Height(tkwin) - 2*inset,
+ butPtr->borderWidth, dpPtr->relief);
+ }
}
}
@@ -511,236 +505,228 @@ TkpDisplayButton(
*
* TkpComputeButtonGeometry --
*
- * After changes in a button's text or bitmap, this procedure
- * recomputes the button's geometry and passes this information
- * along to the geometry manager for the window.
+ * After changes in a button's text or bitmap, this procedure recomputes
+ * the button's geometry and passes this information along to the
+ * geometry manager for the window.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The button's window may change size.
+ * The button's window may change size.
*
*----------------------------------------------------------------------
*/
void
TkpComputeButtonGeometry(
- TkButton *butPtr) /* Button whose geometry may have changed. */
+ TkButton *butPtr) /* Button whose geometry may have changed. */
{
int width, height, avgWidth, haveImage = 0, haveText = 0;
- int xInset, yInset;
- int txtWidth, txtHeight;
+ int xInset, yInset, txtWidth, txtHeight;
Tk_FontMetrics fm;
DrawParams drawParams;
/*
* First figure out the size of the contents of the button.
*/
-
+
width = 0;
height = 0;
txtWidth = 0;
txtHeight = 0;
avgWidth = 0;
-
butPtr->indicatorSpace = 0;
if (butPtr->image != NULL) {
- Tk_SizeOfImage(butPtr->image, &width, &height);
- haveImage = 1;
+ Tk_SizeOfImage(butPtr->image, &width, &height);
+ haveImage = 1;
} else if (butPtr->bitmap != None) {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
- haveImage = 1;
+ Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
+ haveImage = 1;
}
if (haveImage == 0 || butPtr->compound != COMPOUND_NONE) {
- Tk_FreeTextLayout(butPtr->textLayout);
- butPtr->textLayout = Tk_ComputeTextLayout(butPtr->tkfont,
- Tcl_GetString(butPtr->textPtr), -1, butPtr->wrapLength,
- butPtr->justify, 0, &butPtr->textWidth, &butPtr->textHeight);
-
- txtWidth = butPtr->textWidth;
- txtHeight = butPtr->textHeight;
- avgWidth = Tk_TextWidth(butPtr->tkfont, "0", 1);
- Tk_GetFontMetrics(butPtr->tkfont, &fm);
- haveText = (txtWidth != 0 && txtHeight != 0);
+ Tk_FreeTextLayout(butPtr->textLayout);
+ butPtr->textLayout = Tk_ComputeTextLayout(butPtr->tkfont,
+ Tcl_GetString(butPtr->textPtr), -1, butPtr->wrapLength,
+ butPtr->justify, 0, &butPtr->textWidth, &butPtr->textHeight);
+
+ txtWidth = butPtr->textWidth;
+ txtHeight = butPtr->textHeight;
+ avgWidth = Tk_TextWidth(butPtr->tkfont, "0", 1);
+ Tk_GetFontMetrics(butPtr->tkfont, &fm);
+ haveText = (txtWidth != 0 && txtHeight != 0);
}
/*
- * If the button is compound (ie, it shows both an image and text),
- * the new geometry is a combination of the image and text geometry.
- * We only honor the compound bit if the button has both text and an
- * image, because otherwise it is not really a compound button.
+ * If the button is compound (ie, it shows both an image and text), the
+ * new geometry is a combination of the image and text geometry. We only
+ * honor the compound bit if the button has both text and an image,
+ * because otherwise it is not really a compound button.
*/
if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) {
- switch ((enum compound) butPtr->compound) {
- case COMPOUND_TOP:
- case COMPOUND_BOTTOM: {
- /*
- * Image is above or below text
- */
-
- height += txtHeight + butPtr->padY;
- width = (width > txtWidth ? width : txtWidth);
- break;
- }
- case COMPOUND_LEFT:
- case COMPOUND_RIGHT: {
- /*
- * Image is left or right of text
- */
-
- width += txtWidth + butPtr->padX;
- height = (height > txtHeight ? height : txtHeight);
- break;
- }
- case COMPOUND_CENTER: {
- /*
- * Image and text are superimposed
- */
-
- width = (width > txtWidth ? width : txtWidth);
- height = (height > txtHeight ? height : txtHeight);
- break;
- }
- case COMPOUND_NONE: {break;}
- }
- if (butPtr->width > 0) {
- width = butPtr->width;
- }
- if (butPtr->height > 0) {
- height = butPtr->height;
- }
-
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
- butPtr->indicatorSpace = height;
- if (butPtr->type == TYPE_CHECK_BUTTON) {
- butPtr->indicatorDiameter = (65 * height)/100;
- } else {
- butPtr->indicatorDiameter = (75 * height)/100;
- }
- }
-
- width += 2 * butPtr->padX;
- height += 2 * butPtr->padY;
+ switch ((enum compound) butPtr->compound) {
+ case COMPOUND_TOP:
+ case COMPOUND_BOTTOM:
+ /*
+ * Image is above or below text.
+ */
+
+ height += txtHeight + butPtr->padY;
+ width = (width > txtWidth ? width : txtWidth);
+ break;
+ case COMPOUND_LEFT:
+ case COMPOUND_RIGHT:
+ /*
+ * Image is left or right of text.
+ */
+
+ width += txtWidth + butPtr->padX;
+ height = (height > txtHeight ? height : txtHeight);
+ break;
+ case COMPOUND_CENTER:
+ /*
+ * Image and text are superimposed.
+ */
+
+ width = (width > txtWidth ? width : txtWidth);
+ height = (height > txtHeight ? height : txtHeight);
+ break;
+ case COMPOUND_NONE:
+ break;
+ }
+ if (butPtr->width > 0) {
+ width = butPtr->width;
+ }
+ if (butPtr->height > 0) {
+ height = butPtr->height;
+ }
+ if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
+ butPtr->indicatorSpace = height;
+ if (butPtr->type == TYPE_CHECK_BUTTON) {
+ butPtr->indicatorDiameter = (65 * height)/100;
+ } else {
+ butPtr->indicatorDiameter = (75 * height)/100;
+ }
+ }
+
+ width += 2 * butPtr->padX;
+ height += 2 * butPtr->padY;
+ } else if (haveImage) {
+ if (butPtr->width > 0) {
+ width = butPtr->width;
+ }
+ if (butPtr->height > 0) {
+ height = butPtr->height;
+ }
+ if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
+ butPtr->indicatorSpace = height;
+ if (butPtr->type == TYPE_CHECK_BUTTON) {
+ butPtr->indicatorDiameter = (65 * height)/100;
+ } else {
+ butPtr->indicatorDiameter = (75 * height)/100;
+ }
+ }
} else {
- if (haveImage) {
- if (butPtr->width > 0) {
- width = butPtr->width;
- }
- if (butPtr->height > 0) {
- height = butPtr->height;
- }
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
- butPtr->indicatorSpace = height;
- if (butPtr->type == TYPE_CHECK_BUTTON) {
- butPtr->indicatorDiameter = (65 * height)/100;
- } else {
- butPtr->indicatorDiameter = (75 * height)/100;
- }
- }
- } else {
- width = txtWidth;
- height = txtHeight;
- if (butPtr->width > 0) {
- width = butPtr->width * avgWidth;
- }
- if (butPtr->height > 0) {
- height = butPtr->height * fm.linespace;
- }
- if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
- butPtr->indicatorDiameter = fm.linespace;
- if (butPtr->type == TYPE_CHECK_BUTTON) {
- butPtr->indicatorDiameter =
- (80 * butPtr->indicatorDiameter)/100;
- }
- butPtr->indicatorSpace = butPtr->indicatorDiameter + avgWidth;
- }
- }
+ width = txtWidth;
+ height = txtHeight;
+ if (butPtr->width > 0) {
+ width = butPtr->width * avgWidth;
+ }
+ if (butPtr->height > 0) {
+ height = butPtr->height * fm.linespace;
+ }
+ if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) {
+ butPtr->indicatorDiameter = fm.linespace;
+ if (butPtr->type == TYPE_CHECK_BUTTON) {
+ butPtr->indicatorDiameter =
+ (80 * butPtr->indicatorDiameter)/100;
+ }
+ butPtr->indicatorSpace = butPtr->indicatorDiameter + avgWidth;
+ }
}
/*
* Now figure out the size of the border decorations for the button.
*/
-
+
if (butPtr->highlightWidth < 0) {
- butPtr->highlightWidth = 0;
+ butPtr->highlightWidth = 0;
}
-
+
/*
- * The width and height calculation for Appearance buttons with images &
- * non-Appearance buttons with images is different. In the latter case,
- * we add the borderwidth to the inset, since we are going to stamp a
- * 3-D border over the image. In the former, we add it to the height,
+ * The width and height calculation for Appearance buttons with images &
+ * non-Appearance buttons with images is different. In the latter case, we
+ * add the borderwidth to the inset, since we are going to stamp a 3-D
+ * border over the image. In the former, we add it to the height,
* directly, since Appearance will draw the border as part of our control.
*
* When issuing the geometry request, add extra space for the indicator,
- * if any, and for the border and padding, plus if this is an image two
+ * if any, and for the border and padding, plus if this is an image two
* extra pixels so the display can be offset by 1 pixel in either
* direction for the raised or lowered effect.
*
* The highlight width corresponds to the default ring on the Macintosh.
* As such, the highlight width is only added if the button is the default
- * button. The actual width of the default ring is one less than the
- * highlight width as there is also one pixel of spacing.
- * Appearance buttons with images do not have a highlight ring, because the
- * Bevel button type does not support one.
+ * button. The actual width of the default ring is one less than the
+ * highlight width as there is also one pixel of spacing. Appearance
+ * buttons with images do not have a highlight ring, because the Bevel
+ * button type does not support one.
*/
if ((butPtr->image == None) && (butPtr->bitmap == None)) {
- width += 2*butPtr->padX;
- height += 2*butPtr->padY;
+ width += 2*butPtr->padX;
+ height += 2*butPtr->padY;
}
-
+
if ((butPtr->type == TYPE_BUTTON)) {
- if ((butPtr->image == None) && (butPtr->bitmap == None)) {
- butPtr->inset = 0;
- if (butPtr->defaultState != STATE_DISABLED) {
- butPtr->inset += butPtr->highlightWidth;
- }
- } else {
- butPtr->inset = 0;
- width += (2 * butPtr->borderWidth + 4);
- height += (2 * butPtr->borderWidth + 4);
- }
- } else if ((butPtr->type != TYPE_LABEL)) {
- if (butPtr->indicatorOn) {
- butPtr->inset = 0;
- } else {
- /*
- * Under Appearance, the Checkbutton or radiobutton with an image
- * is represented by a BevelButton with the Sticky defProc...
- * So we must set its height in the same way as the Button
- * with an image or bitmap.
- */
-
- if ( (butPtr->image != None) || (butPtr->bitmap != None)) {
- int border;
- butPtr->inset = 0;
- if ( butPtr->borderWidth <= 2 ) {
- border = 6;
- } else {
- border = 2 * butPtr->borderWidth + 2;
- }
- width += border;
- height += border;
- } else {
- butPtr->inset = butPtr->borderWidth;
- }
- }
+ if ((butPtr->image == None) && (butPtr->bitmap == None)) {
+ butPtr->inset = 0;
+ if (butPtr->defaultState != STATE_DISABLED) {
+ butPtr->inset += butPtr->highlightWidth;
+ }
+ } else {
+ butPtr->inset = 0;
+ width += (2 * butPtr->borderWidth + 4);
+ height += (2 * butPtr->borderWidth + 4);
+ }
+ } else if (butPtr->type == TYPE_LABEL) {
+ butPtr->inset = butPtr->borderWidth;
+ } else if (butPtr->indicatorOn) {
+ butPtr->inset = 0;
} else {
- butPtr->inset = butPtr->borderWidth;
+ /*
+ * Under Appearance, the Checkbutton or radiobutton with an image is
+ * represented by a BevelButton with the Sticky defProc... So we must
+ * set its height in the same way as the Button with an image or
+ * bitmap.
+ */
+
+ if ((butPtr->image != None) || (butPtr->bitmap != None)) {
+ int border;
+
+ butPtr->inset = 0;
+ if (butPtr->borderWidth <= 2) {
+ border = 6;
+ } else {
+ border = 2 * butPtr->borderWidth + 2;
+ }
+ width += border;
+ height += border;
+ } else {
+ butPtr->inset = butPtr->borderWidth;
+ }
}
if (TkMacOSXComputeDrawParams(butPtr,&drawParams)) {
- xInset = butPtr->indicatorSpace + DEF_INSET_LEFT + DEF_INSET_RIGHT;
- yInset = DEF_INSET_TOP + DEF_INSET_BOTTOM;
+ xInset = butPtr->indicatorSpace + DEF_INSET_LEFT + DEF_INSET_RIGHT;
+ yInset = DEF_INSET_TOP + DEF_INSET_BOTTOM;
} else {
- xInset = butPtr->indicatorSpace+butPtr->inset*2;
- yInset = butPtr->inset*2;
+ xInset = butPtr->indicatorSpace+butPtr->inset*2;
+ yInset = butPtr->inset*2;
}
Tk_GeometryRequest(butPtr->tkwin, width + xInset, height + yInset);
Tk_SetInternalBorder(butPtr->tkwin, butPtr->inset);
@@ -751,13 +737,13 @@ TkpComputeButtonGeometry(
*
* TkpDestroyButton --
*
- * Free data structures associated with the button control.
+ * Free data structures associated with the button control.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Restores the default control state.
+ * Restores the default control state.
*
*----------------------------------------------------------------------
*/
@@ -766,10 +752,11 @@ void
TkpDestroyButton(
TkButton *butPtr)
{
- MacButton *mbPtr = ( MacButton *) butPtr; /* Mac button. */
+ MacButton *mbPtr = (MacButton *) butPtr; /* Mac button. */
+
if (mbPtr->userPane) {
- DisposeControl(mbPtr->userPane);
- mbPtr->userPane = NULL;
+ DisposeControl(mbPtr->userPane);
+ mbPtr->userPane = NULL;
}
}
@@ -778,246 +765,220 @@ TkpDestroyButton(
*
* TkMacOSXInitControl --
*
- * This procedure initialises a Carbon control
+ * This procedure initialises a Carbon control.
*
* Results:
- * 0 on success, 1 on failure.
+ * 0 on success, 1 on failure.
*
* Side effects:
- * A background pane control and the control itself is created
- * The contol is embedded in the background control
- * The background control is embedded in the root control
- * of the containing window
- * The creation parameters for the control are also computed
+ * A background pane control and the control itself is created. The
+ * contol is embedded in the background control. The background control
+ * is embedded in the root control of the containing window. The creation
+ * parameters for the control are also computed.
*
*----------------------------------------------------------------------
*/
static int
-TkMacOSXInitControl (
- MacButton *mbPtr, /* Mac button. */
- GWorldPtr destPort,
- GC gc,
- Pixmap pixmap,
- Rect *paneRect,
- Rect *cntrRect
-)
+TkMacOSXInitControl(
+ MacButton *mbPtr, /* Mac button. */
+ GWorldPtr destPort,
+ GC gc,
+ Pixmap pixmap,
+ Rect *paneRect,
+ Rect *cntrRect)
{
- OSErr status;
- TkButton * butPtr = ( TkButton * )mbPtr;
+ OSErr status;
+ TkButton *butPtr = (TkButton *) mbPtr;
ControlRef rootControl;
- SInt16 procID;
- Boolean initiallyVisible;
- SInt16 initialValue;
- SInt16 minValue;
- SInt16 maxValue;
- SInt32 controlReference;
+ SInt16 procID, initialValue, minValue, maxValue;
+ Boolean initiallyVisible;
+ SInt32 controlReference;
rootControl = TkMacOSXGetRootControl(Tk_WindowId(butPtr->tkwin));
- mbPtr->windowRef
- = GetWindowFromPort(TkMacOSXGetDrawablePort(Tk_WindowId(butPtr->tkwin)));
+ mbPtr->windowRef = GetWindowFromPort(
+ TkMacOSXGetDrawablePort(Tk_WindowId(butPtr->tkwin)));
- /*
- * Set up the user pane
+ /*
+ * Set up the user pane.
*/
initiallyVisible = false;
- initialValue = kControlSupportsEmbedding|kControlHasSpecialBackground;
- minValue = 0;
- maxValue = 1;
- procID = kControlUserPaneProc;
+ initialValue = kControlSupportsEmbedding|kControlHasSpecialBackground;
+ minValue = 0;
+ maxValue = 1;
+ procID = kControlUserPaneProc;
controlReference = (SInt32)mbPtr;
- mbPtr->userPane = NewControl(mbPtr->windowRef,
- paneRect, "\p",
- initiallyVisible,
- initialValue,
- minValue,
- maxValue,
- procID,
- controlReference );
-
+ mbPtr->userPane = NewControl(mbPtr->windowRef, paneRect, "\p",
+ initiallyVisible, initialValue, minValue, maxValue, procID,
+ controlReference);
+
if (!mbPtr->userPane) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Failed to create user pane control\n");
-#endif
- return 1;
+ LOG_MSG("Failed to create user pane control");
+ return 1;
}
-
+
if ((status = EmbedControl(mbPtr->userPane,rootControl)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Failed to embed user pane control %d\n", status);
-#endif
- return 1;
+ LOG_MSG("Failed to embed user pane control %d", status);
+ return 1;
}
-
+
SetUserPaneSetUpSpecialBackgroundProc(mbPtr->userPane,
- UserPaneBackgroundProc);
+ UserPaneBackgroundProc);
SetUserPaneDrawProc(mbPtr->userPane,UserPaneDraw);
initiallyVisible = false;
TkMacOSXComputeControlParams(butPtr,&mbPtr->params);
- mbPtr->control = NewControl(mbPtr->windowRef,
- cntrRect, "\p",
- initiallyVisible,
- mbPtr->params.initialValue,
- mbPtr->params.minValue,
- mbPtr->params.maxValue,
- mbPtr->params.procID,
- controlReference );
-
+ mbPtr->control = NewControl(mbPtr->windowRef, cntrRect, "\p",
+ initiallyVisible, mbPtr->params.initialValue,
+ mbPtr->params.minValue, mbPtr->params.maxValue,
+ mbPtr->params.procID, controlReference);
+
if (!mbPtr->control) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"failed to create control of type %d\n",procID);
-#endif
- return 1;
+ LOG_MSG("failed to create control of type %d", procID);
+ return 1;
}
-
- if (EmbedControl(mbPtr->control,mbPtr->userPane) != noErr ) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"failed to embed control of type %d\n",procID);
-#endif
- return 1;
+
+ if (EmbedControl(mbPtr->control,mbPtr->userPane) != noErr) {
+ LOG_MSG("failed to embed control of type %d", procID);
+ return 1;
}
-
+
mbPtr->flags |= (1 + 2);
return 0;
}
-
+
/*
*--------------------------------------------------------------
*
* TkMacOSXDrawControl --
*
- * This function draws the tk button using Mac controls
- * In addition, this code may apply custom colors passed
- * in the TkButton.
+ * This function draws the tk button using Mac controls. In addition,
+ * this code may apply custom colors passed in the TkButton.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The control is created, or reinitialised as needed
- *
+ * The control is created, or reinitialised as needed.
*
*--------------------------------------------------------------
*/
static void
TkMacOSXDrawControl(
- MacButton *mbPtr, /* Mac button. */
- GWorldPtr destPort, /* Off screen GWorld. */
- GC gc, /* The GC we are drawing into - needed for
- * the bevel button */
- Pixmap pixmap) /* The pixmap we are drawing into - needed
- * for the bevel button */
-
+ MacButton *mbPtr, /* Mac button. */
+ GWorldPtr destPort, /* Off screen GWorld. */
+ GC gc, /* The GC we are drawing into - needed for the
+ * bevel button */
+ Pixmap pixmap) /* The pixmap we are drawing into - needed for
+ * the bevel button */
{
- TkButton * butPtr = ( TkButton *)mbPtr;
- int err;
- TkWindow * winPtr;
- Rect paneRect;
- Rect cntrRect;
-
- winPtr = (TkWindow *)butPtr->tkwin;
-
- paneRect.left = winPtr->privatePtr->xOff;
- paneRect.top = winPtr->privatePtr->yOff;
- paneRect.right = paneRect.left + Tk_Width(butPtr->tkwin);
+ TkButton *butPtr = (TkButton *) mbPtr;
+ int err;
+ TkWindow *winPtr;
+ Rect paneRect, cntrRect;
+
+ winPtr = (TkWindow *) butPtr->tkwin;
+
+ paneRect.left = winPtr->privatePtr->xOff;
+ paneRect.top = winPtr->privatePtr->yOff;
+ paneRect.right = paneRect.left + Tk_Width(butPtr->tkwin);
paneRect.bottom = paneRect.top + Tk_Height(butPtr->tkwin);
cntrRect = paneRect;
/*
- cntrRect.left += butPtr->inset;
- cntrRect.top += butPtr->inset;
- cntrRect.right -= butPtr->inset;
+ cntrRect.left += butPtr->inset;
+ cntrRect.top += butPtr->inset;
+ cntrRect.right -= butPtr->inset;
cntrRect.bottom -= butPtr->inset;
*/
- cntrRect.left += DEF_INSET_LEFT;
- cntrRect.top += DEF_INSET_TOP;
- cntrRect.right -= DEF_INSET_RIGHT;
+ cntrRect.left += DEF_INSET_LEFT;
+ cntrRect.top += DEF_INSET_TOP;
+ cntrRect.right -= DEF_INSET_RIGHT;
cntrRect.bottom -= DEF_INSET_BOTTOM;
- /*
- * The control has been previously initialised
- * It may need to be re-initialised
+ /*
+ * The control has been previously initialised. It may need to be
+ * re-initialised.
*/
-
+
if (mbPtr->flags) {
- MacControlParams params;
- TkMacOSXComputeControlParams(butPtr, &params);
- if (bcmp(&params, &mbPtr->params, sizeof(params))) {
- /*
- * the type of control has changed
- * Clean it up and clear the flag
- */
-
- if (mbPtr->userPane) {
- DisposeControl(mbPtr->userPane);
- mbPtr->userPane = NULL;
- mbPtr->control = NULL;
- }
- mbPtr->flags = 0;
- }
+ MacControlParams params;
+
+ TkMacOSXComputeControlParams(butPtr, &params);
+ if (bcmp(&params, &mbPtr->params, sizeof(params))) {
+ /*
+ * The type of control has changed. Clean it up and clear the
+ * flag.
+ */
+
+ if (mbPtr->userPane) {
+ DisposeControl(mbPtr->userPane);
+ mbPtr->userPane = NULL;
+ mbPtr->control = NULL;
+ }
+ mbPtr->flags = 0;
+ }
}
if (!(mbPtr->flags & 1)) {
- if (TkMacOSXInitControl(mbPtr, destPort, gc,
- pixmap, &paneRect, &cntrRect) ) {
- return;
- }
+ if (TkMacOSXInitControl(mbPtr, destPort, gc, pixmap,
+ &paneRect, &cntrRect)) {
+ return;
+ }
}
SetControlBounds(mbPtr->userPane, &paneRect);
SetControlBounds(mbPtr->control, &cntrRect);
if (!mbPtr->useTkText) {
- Str255 controlTitle;
- ControlFontStyleRec fontStyle;
- Tk_Font font;
- int len;
-
- if (((mbPtr->info.image == NULL) && (mbPtr->info.bitmap == None))
- || (mbPtr->info.compound != COMPOUND_NONE)) {
- len = TkFontGetFirstTextLayout(butPtr->textLayout,
- &font, (char*) controlTitle);
- controlTitle[len] = 0;
- } else {
- len = 0;
- controlTitle[0] = 0;
- }
- if (bcmp(mbPtr->controlTitle, controlTitle, len+1)) {
- CFStringRef cf;
- cf = CFStringCreateWithCString(NULL,
- (char*) controlTitle, kCFStringEncodingUTF8);
- if (cf != NULL) {
- SetControlTitleWithCFString(mbPtr->control, cf);
- CFRelease(cf);
- }
- bcopy(controlTitle, mbPtr->controlTitle, len+1);
- }
- if (len) {
- TkMacOSXInitControlFontStyle(font, &fontStyle);
- if (bcmp(&mbPtr->fontStyle, &fontStyle, sizeof(fontStyle)) ) {
- if (SetControlFontStyle(mbPtr->control, &fontStyle) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetControlFontStyle failed\n");
-#endif
- }
- bcopy(&fontStyle, &mbPtr->fontStyle,
- sizeof(fontStyle));
- }
- }
+ Str255 controlTitle;
+ ControlFontStyleRec fontStyle;
+ Tk_Font font;
+ int len;
+
+ if (((mbPtr->info.image == NULL) && (mbPtr->info.bitmap == None))
+ || (mbPtr->info.compound != COMPOUND_NONE)) {
+ len = TkFontGetFirstTextLayout(butPtr->textLayout,
+ &font, (char*) controlTitle);
+ controlTitle[len] = 0;
+ } else {
+ len = 0;
+ controlTitle[0] = 0;
+ }
+ if (bcmp(mbPtr->controlTitle, controlTitle, len+1)) {
+ CFStringRef cf = CFStringCreateWithCString(NULL,
+ (char*) controlTitle, kCFStringEncodingUTF8);
+
+ if (cf != NULL) {
+ SetControlTitleWithCFString(mbPtr->control, cf);
+ CFRelease(cf);
+ }
+ bcopy(controlTitle, mbPtr->controlTitle, len+1);
+ }
+ if (len) {
+ TkMacOSXInitControlFontStyle(font, &fontStyle);
+ if (bcmp(&mbPtr->fontStyle, &fontStyle, sizeof(fontStyle)) ) {
+ if (SetControlFontStyle(mbPtr->control, &fontStyle) != noErr) {
+ LOG_MSG("SetControlFontStyle failed");
+ }
+ bcopy(&fontStyle, &mbPtr->fontStyle, sizeof(fontStyle));
+ }
+ }
}
if (mbPtr->params.isBevel) {
- /* Initialiase the image/button parameters */
- SetupBevelButton(mbPtr, mbPtr->control, destPort,
- gc, pixmap);
+ /*
+ * Initialiase the image/button parameters.
+ */
+
+ SetupBevelButton(mbPtr, mbPtr->control, destPort, gc, pixmap);
}
if (butPtr->flags & SELECTED) {
- SetControlValue(mbPtr->control, 1);
+ SetControlValue(mbPtr->control, 1);
} else if (butPtr->flags & TRISTATED) {
- SetControlValue(mbPtr->control, 2);
+ SetControlValue(mbPtr->control, 2);
} else {
- SetControlValue(mbPtr->control, 0);
+ SetControlValue(mbPtr->control, 0);
}
if (!Tk_MacOSXIsAppInFront() || butPtr->state == STATE_DISABLED) {
@@ -1027,6 +988,7 @@ TkMacOSXDrawControl(
* Use NoPart for normal and to ensure correct direct transition from
* disabled to active -state. [Bug 706446]
*/
+
HiliteControl(mbPtr->control, kControlNoPart);
if (butPtr->state == STATE_ACTIVE) {
@@ -1034,15 +996,15 @@ TkMacOSXDrawControl(
HiliteControl(mbPtr->control, kControlButtonPart);
} else {
switch (butPtr->type) {
- case TYPE_BUTTON:
- HiliteControl(mbPtr->control, kControlButtonPart);
- break;
- case TYPE_RADIO_BUTTON:
- HiliteControl(mbPtr->control, kControlRadioButtonPart);
- break;
- case TYPE_CHECK_BUTTON:
- HiliteControl(mbPtr->control, kControlCheckBoxPart);
- break;
+ case TYPE_BUTTON:
+ HiliteControl(mbPtr->control, kControlButtonPart);
+ break;
+ case TYPE_RADIO_BUTTON:
+ HiliteControl(mbPtr->control, kControlRadioButtonPart);
+ break;
+ case TYPE_CHECK_BUTTON:
+ HiliteControl(mbPtr->control, kControlCheckBoxPart);
+ break;
}
}
}
@@ -1050,30 +1012,30 @@ TkMacOSXDrawControl(
UpdateControlColors(mbPtr);
if (butPtr->type == TYPE_BUTTON) {
- Boolean isDefault;
-
- if (butPtr->defaultState == STATE_ACTIVE) {
- isDefault = true;
- } else {
- isDefault = false;
- }
- if ((err=SetControlData(mbPtr->control, kControlNoPart,
- kControlPushButtonDefaultTag,
- sizeof(isDefault), (Ptr) &isDefault)) != noErr) {
- }
+ Boolean isDefault;
+
+ if (butPtr->defaultState == STATE_ACTIVE) {
+ isDefault = true;
+ } else {
+ isDefault = false;
+ }
+ if (SetControlData(mbPtr->control, kControlNoPart,
+ kControlPushButtonDefaultTag,
+ sizeof(isDefault), (Ptr) &isDefault) != noErr) {
+ }
}
if (mbPtr->flags&2) {
- ShowControl(mbPtr->userPane);
- ShowControl(mbPtr->control);
- mbPtr->flags ^= 2;
+ ShowControl(mbPtr->userPane);
+ ShowControl(mbPtr->control);
+ mbPtr->flags ^= 2;
} else {
- SetControlVisibility(mbPtr->control, true, true);
- Draw1Control(mbPtr->userPane);
+ SetControlVisibility(mbPtr->control, true, true);
+ Draw1Control(mbPtr->userPane);
}
if (mbPtr->params.isBevel) {
- KillPicture(mbPtr->bevelButtonContent.u.picture);
+ KillPicture(mbPtr->bevelButtonContent.u.picture);
}
}
@@ -1082,150 +1044,131 @@ TkMacOSXDrawControl(
*
* SetupBevelButton --
*
- * Sets up the Bevel Button with image by copying the
- * source image onto the PicHandle for the button.
+ * Sets up the Bevel Button with image by copying the source image onto
+ * the PicHandle for the button.
*
* Results:
- * None
+ * None
*
* Side effects:
- * The image or bitmap for the button is copied over to a picture.
+ * The image or bitmap for the button is copied over to a picture.
*
*--------------------------------------------------------------
*/
+
void
SetupBevelButton(
- MacButton *mbPtr, /* Mac button. */
- ControlRef controlHandle, /* The control to set this picture to */
- GWorldPtr destPort, /* Off screen GWorld. */
- GC gc, /* The GC we are drawing into - needed for
- * the bevel button */
- Pixmap pixmap /* The pixmap we are drawing into - needed
- for the bevel button */
- )
+ MacButton *mbPtr, /* Mac button. */
+ ControlRef controlHandle, /* The control to set this picture to */
+ GWorldPtr destPort, /* Off screen GWorld. */
+ GC gc, /* The GC we are drawing into - needed for the
+ * bevel button */
+ Pixmap pixmap) /* The pixmap we are drawing into - needed for
+ * the bevel button */
{
- int err;
- TkButton *butPtr = ( TkButton *)mbPtr;
- int height, width;
+ int err, height, width;
+ TkButton *butPtr = (TkButton *) mbPtr;
ControlButtonGraphicAlignment theAlignment;
-
+
SetPort(destPort);
if (butPtr->image != None) {
- Tk_SizeOfImage(butPtr->image,
- &width, &height);
+ Tk_SizeOfImage(butPtr->image, &width, &height);
} else {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap,
- &width, &height);
+ Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
}
-
+
if ((butPtr->width > 0) && (butPtr->width < width)) {
- width = butPtr->width;
+ width = butPtr->width;
}
if ((butPtr->height > 0) && (butPtr->height < height)) {
- height = butPtr->height;
+ height = butPtr->height;
}
mbPtr->picParams.srcRect.right = width;
mbPtr->picParams.srcRect.bottom = height;
- /*
- * Set the flag to circumvent clipping and bounds problems with OS 10.0.4
+ /*
+ * Set the flag to circumvent clipping and bounds problems with OS 10.0.4
*/
-
- if (!(mbPtr->bevelButtonContent.u.picture
- = OpenCPicture(&mbPtr->picParams)) ) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"OpenCPicture failed\n");
-#endif
+
+ mbPtr->bevelButtonContent.u.picture = OpenCPicture(&mbPtr->picParams);
+ if (!mbPtr->bevelButtonContent.u.picture) {
+ LOG_MSG("OpenCPicture failed");
}
tkPictureIsOpen = 1;
-
+
/*
- * TO DO - There is one case where XCopyPlane calls CopyDeepMask,
- * which does not get recorded in the picture. So the bitmap code
- * will fail in that case.
+ * TO DO - There is one case where XCopyPlane calls CopyDeepMask, which
+ * does not get recorded in the picture. So the bitmap code will fail in
+ * that case.
*/
-
+
if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) {
- Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height,
- pixmap, 0, 0);
- } else if ((butPtr->tristateImage != NULL) && (butPtr->flags & TRISTATED)) {
- Tk_RedrawImage(butPtr->tristateImage, 0, 0, width, height,
- pixmap, 0, 0);
+ Tk_RedrawImage(butPtr->selectImage, 0,0, width, height, pixmap, 0,0);
+ } else if ((butPtr->tristateImage!=NULL) && (butPtr->flags & TRISTATED)) {
+ Tk_RedrawImage(butPtr->tristateImage, 0,0, width,height, pixmap, 0,0);
} else if (butPtr->image != NULL) {
- Tk_RedrawImage(butPtr->image, 0, 0, width,
- height, pixmap, 0, 0);
- } else {
- XSetClipOrigin(butPtr->display, gc, 0, 0);
- XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, 0, 0,
- (unsigned int) width, (unsigned int) height, 0, 0, 1);
+ Tk_RedrawImage(butPtr->image, 0, 0, width, height, pixmap, 0, 0);
+ } else {
+ XSetClipOrigin(butPtr->display, gc, 0, 0);
+ XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, 0, 0,
+ (unsigned int) width, (unsigned int) height, 0, 0, 1);
}
-
+
ClosePicture();
tkPictureIsOpen = 0;
-
- if ((err = SetControlData(controlHandle, kControlButtonPart,
- kControlBevelButtonContentTag,
- sizeof(ControlButtonContentInfo),
- (char *) &mbPtr->bevelButtonContent)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,
- "SetControlData BevelButtonContent failed, %d\n", err );
-#endif
- }
-
+
+ err = SetControlData(controlHandle, kControlButtonPart,
+ kControlBevelButtonContentTag,
+ sizeof(ControlButtonContentInfo),
+ (char *) &mbPtr->bevelButtonContent);
+ LOG_ON_ERROR(SetControlData_BevelButtonContent);
+
if (butPtr->anchor == TK_ANCHOR_N) {
- theAlignment = kControlBevelButtonAlignTop;
- } else if (butPtr->anchor == TK_ANCHOR_NE) {
- theAlignment = kControlBevelButtonAlignTopRight;
- } else if (butPtr->anchor == TK_ANCHOR_E) {
- theAlignment = kControlBevelButtonAlignRight;
+ theAlignment = kControlBevelButtonAlignTop;
+ } else if (butPtr->anchor == TK_ANCHOR_NE) {
+ theAlignment = kControlBevelButtonAlignTopRight;
+ } else if (butPtr->anchor == TK_ANCHOR_E) {
+ theAlignment = kControlBevelButtonAlignRight;
} else if (butPtr->anchor == TK_ANCHOR_SE) {
- theAlignment = kControlBevelButtonAlignBottomRight;
+ theAlignment = kControlBevelButtonAlignBottomRight;
} else if (butPtr->anchor == TK_ANCHOR_S) {
- theAlignment = kControlBevelButtonAlignBottom;
+ theAlignment = kControlBevelButtonAlignBottom;
} else if (butPtr->anchor == TK_ANCHOR_SW) {
- theAlignment = kControlBevelButtonAlignBottomLeft;
+ theAlignment = kControlBevelButtonAlignBottomLeft;
} else if (butPtr->anchor == TK_ANCHOR_W) {
- theAlignment = kControlBevelButtonAlignLeft;
+ theAlignment = kControlBevelButtonAlignLeft;
} else if (butPtr->anchor == TK_ANCHOR_NW) {
- theAlignment = kControlBevelButtonAlignTopLeft;
+ theAlignment = kControlBevelButtonAlignTopLeft;
} else if (butPtr->anchor == TK_ANCHOR_CENTER) {
- theAlignment = kControlBevelButtonAlignCenter;
+ theAlignment = kControlBevelButtonAlignCenter;
}
- if ((err = SetControlData(controlHandle, kControlButtonPart,
- kControlBevelButtonGraphicAlignTag,
- sizeof(ControlButtonGraphicAlignment),
- (char *) &theAlignment)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,
- "SetControlData BevelButtonGraphicAlign failed, %d\n", err );
-#endif
- }
+ err = SetControlData(controlHandle, kControlButtonPart,
+ kControlBevelButtonGraphicAlignTag,
+ sizeof(ControlButtonGraphicAlignment),
+ (char *) &theAlignment);
+ LOG_ON_ERROR(SetControlData_BevelButtonGraphicAlign);
if (butPtr->compound != COMPOUND_NONE) {
- ControlButtonTextPlacement thePlacement = \
- kControlBevelButtonPlaceNormally;
- if (butPtr->compound == COMPOUND_TOP) {
- thePlacement = kControlBevelButtonPlaceBelowGraphic;
- } else if (butPtr->compound == COMPOUND_BOTTOM) {
- thePlacement = kControlBevelButtonPlaceAboveGraphic;
- } else if (butPtr->compound == COMPOUND_LEFT) {
- thePlacement = kControlBevelButtonPlaceToRightOfGraphic;
- } else if (butPtr->compound == COMPOUND_RIGHT) {
- thePlacement = kControlBevelButtonPlaceToLeftOfGraphic;
- }
- if ((err = SetControlData(controlHandle, kControlButtonPart,
- kControlBevelButtonTextPlaceTag,
- sizeof(ControlButtonTextPlacement),
- (char *) &thePlacement)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,
- "SetControlData BevelButtonTextPlace failed, %d\n", err );
-#endif
- }
+ ControlButtonTextPlacement thePlacement =
+ kControlBevelButtonPlaceNormally;
+
+ if (butPtr->compound == COMPOUND_TOP) {
+ thePlacement = kControlBevelButtonPlaceBelowGraphic;
+ } else if (butPtr->compound == COMPOUND_BOTTOM) {
+ thePlacement = kControlBevelButtonPlaceAboveGraphic;
+ } else if (butPtr->compound == COMPOUND_LEFT) {
+ thePlacement = kControlBevelButtonPlaceToRightOfGraphic;
+ } else if (butPtr->compound == COMPOUND_RIGHT) {
+ thePlacement = kControlBevelButtonPlaceToLeftOfGraphic;
+ }
+ err = SetControlData(controlHandle, kControlButtonPart,
+ kControlBevelButtonTextPlaceTag,
+ sizeof(ControlButtonTextPlacement),
+ (char *) &thePlacement);
+ LOG_ON_ERROR(SetControlData_BevelButtonTextPlace);
}
}
@@ -1234,28 +1177,30 @@ SetupBevelButton(
*
* SetUserPaneDrawProc --
*
- * Utility function to add a UserPaneDrawProc
- * to a userPane control. From MoreControls code
- * from Apple DTS.
+ * Utility function to add a UserPaneDrawProc to a userPane control. From
+ * MoreControls code from Apple DTS.
*
* Results:
- * MacOS system error.
+ * MacOS system error.
*
* Side effects:
- * The user pane gets a new UserPaneDrawProc.
+ * The user pane gets a new UserPaneDrawProc.
*
*--------------------------------------------------------------
*/
-OSErr SetUserPaneDrawProc (
+
+OSErr
+SetUserPaneDrawProc(
ControlRef control,
ControlUserPaneDrawProcPtr upp)
{
ControlUserPaneDrawUPP myControlUserPaneDrawUPP;
- myControlUserPaneDrawUPP = NewControlUserPaneDrawUPP(upp);
- return SetControlData (control,
- kControlNoPart, kControlUserPaneDrawProcTag,
- sizeof(myControlUserPaneDrawUPP),
- (Ptr) &myControlUserPaneDrawUPP);
+
+ myControlUserPaneDrawUPP = NewControlUserPaneDrawUPP(upp);
+ return SetControlData(control, kControlNoPart,
+ kControlUserPaneDrawProcTag,
+ sizeof(myControlUserPaneDrawUPP),
+ (Ptr) &myControlUserPaneDrawUPP);
}
/*
@@ -1263,28 +1208,29 @@ OSErr SetUserPaneDrawProc (
*
* SetUserPaneSetUpSpecialBackgroundProc --
*
- * Utility function to add a UserPaneBackgroundProc
- * to a userPane control
+ * Utility function to add a UserPaneBackgroundProc to a userPane control
*
* Results:
- * MacOS system error.
+ * MacOS system error.
*
* Side effects:
- * The user pane gets a new UserPaneBackgroundProc.
+ * The user pane gets a new UserPaneBackgroundProc.
*
*--------------------------------------------------------------
*/
+
OSErr
SetUserPaneSetUpSpecialBackgroundProc(
- ControlRef control,
+ ControlRef control,
ControlUserPaneBackgroundProcPtr upp)
{
ControlUserPaneBackgroundUPP myControlUserPaneBackgroundUPP;
+
myControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundUPP(upp);
- return SetControlData (control, kControlNoPart,
- kControlUserPaneBackgroundProcTag,
- sizeof(myControlUserPaneBackgroundUPP),
- (Ptr) &myControlUserPaneBackgroundUPP);
+ return SetControlData(control, kControlNoPart,
+ kControlUserPaneBackgroundProcTag,
+ sizeof(myControlUserPaneBackgroundUPP),
+ (Ptr) &myControlUserPaneBackgroundUPP);
}
/*
@@ -1292,28 +1238,29 @@ SetUserPaneSetUpSpecialBackgroundProc(
*
* UserPaneDraw --
*
- * This function draws the background of the user pane that will
- * lie under checkboxes and radiobuttons.
+ * This function draws the background of the user pane that will lie
+ * under checkboxes and radiobuttons.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The user pane gets updated to the current color.
+ * The user pane gets updated to the current color.
*
*--------------------------------------------------------------
*/
+
void
UserPaneDraw(
ControlRef control,
ControlPartCode cpc)
{
+ MacButton *mbPtr = (MacButton *) GetControlReference(control);
Rect contrlRect;
- MacButton * mbPtr;
- mbPtr = ( MacButton *)GetControlReference(control);
+
GetControlBounds(control,&contrlRect);
- RGBBackColor (&mbPtr->userPaneBackground);
- EraseRect (&contrlRect);
+ RGBBackColor(&mbPtr->userPaneBackground);
+ EraseRect(&contrlRect);
}
/*
@@ -1321,14 +1268,14 @@ UserPaneDraw(
*
* UserPaneBackgroundProc --
*
- * This function sets up the background of the user pane that will
- * lie under checkboxes and radiobuttons.
+ * This function sets up the background of the user pane that will lie
+ * under checkboxes and radiobuttons.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The user pane background gets set to the current color.
+ * The user pane background gets set to the current color.
*
*--------------------------------------------------------------
*/
@@ -1338,10 +1285,10 @@ UserPaneBackgroundProc(
ControlHandle control,
ControlBackgroundPtr info)
{
- MacButton * mbPtr;
- mbPtr = ( MacButton *)GetControlReference(control);
+ MacButton *mbPtr = (MacButton *) GetControlReference(control);
+
if (info->colorDevice) {
- RGBBackColor (&mbPtr->userPaneBackground);
+ RGBBackColor(&mbPtr->userPaneBackground);
}
}
@@ -1350,82 +1297,83 @@ UserPaneBackgroundProc(
*
* UpdateControlColors --
*
- * This function will review the colors used to display
- * a Macintosh button. If any non-standard colors are
- * used we create a custom palette for the button, populate
- * with the colors for the button and install the palette.
+ * This function will review the colors used to display a Macintosh
+ * button. If any non-standard colors are used we create a custom palette
+ * for the button, populate with the colors for the button and install
+ * the palette.
*
- * Under Appearance, we just set the pointer that will be
- * used by the UserPaneDrawProc.
+ * Under Appearance, we just set the pointer that will be used by the
+ * UserPaneDrawProc.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The Macintosh control may get a custom palette installed.
+ * The Macintosh control may get a custom palette installed.
*
*--------------------------------------------------------------
*/
static int
-UpdateControlColors(MacButton * mbPtr)
+UpdateControlColors(
+ MacButton *mbPtr)
{
XColor *xcolor;
- TkButton * butPtr = ( TkButton * )mbPtr;
-
+ TkButton *butPtr = (TkButton *) mbPtr;
+
/*
- * Under Appearance we cannot change the background of the
- * button itself. However, the color we are setting is the color
- * of the containing userPane. This will be the color that peeks
- * around the rounded corners of the button.
- * We make this the highlightbackground rather than the background,
- * because if you color the background of a frame containing a
- * button, you usually also color the highlightbackground as well,
- * or you will get a thin grey ring around the button.
+ * Under Appearance we cannot change the background of the button itself.
+ * However, the color we are setting is the color of the containing
+ * userPane. This will be the color that peeks around the rounded corners
+ * of the button. We make this the highlightbackground rather than the
+ * background, because if you color the background of a frame containing a
+ * button, you usually also color the highlightbackground as well, or you
+ * will get a thin grey ring around the button.
*/
-
+
if (butPtr->type == TYPE_BUTTON) {
- xcolor = Tk_3DBorderColor(butPtr->highlightBorder);
+ xcolor = Tk_3DBorderColor(butPtr->highlightBorder);
} else {
- xcolor = Tk_3DBorderColor(butPtr->normalBorder);
+ xcolor = Tk_3DBorderColor(butPtr->normalBorder);
}
TkSetMacColor(xcolor->pixel, &mbPtr->userPaneBackground);
-
+
return false;
-}
+}
+
/*
*--------------------------------------------------------------
*
* ButtonEventProc --
*
- * This procedure is invoked by the Tk dispatcher for various
- * events on buttons.
+ * This procedure is invoked by the Tk dispatcher for various events on
+ * buttons.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * When it gets exposed, it is redisplayed.
+ * When it gets exposed, it is redisplayed.
*
*--------------------------------------------------------------
*/
static void
ButtonEventProc(
- ClientData clientData, /* Information about window. */
- XEvent *eventPtr) /* Information about event. */
+ ClientData clientData, /* Information about window. */
+ XEvent *eventPtr) /* Information about event. */
{
TkButton *buttonPtr = (TkButton *) clientData;
+
if (eventPtr->type == ActivateNotify
- || eventPtr->type == DeactivateNotify) {
- if ((buttonPtr->tkwin == NULL)
- || (!Tk_IsMapped(buttonPtr->tkwin))) {
- return;
- }
- if ((buttonPtr->flags & REDRAW_PENDING) == 0) {
- Tcl_DoWhenIdle(TkpDisplayButton, (ClientData) buttonPtr);
- buttonPtr->flags |= REDRAW_PENDING;
- }
+ || eventPtr->type == DeactivateNotify) {
+ if ((buttonPtr->tkwin == NULL) || (!Tk_IsMapped(buttonPtr->tkwin))) {
+ return;
+ }
+ if ((buttonPtr->flags & REDRAW_PENDING) == 0) {
+ Tcl_DoWhenIdle(TkpDisplayButton, (ClientData) buttonPtr);
+ buttonPtr->flags |= REDRAW_PENDING;
+ }
}
}
@@ -1434,216 +1382,221 @@ ButtonEventProc(
*
* TkMacOSXComputeControlParams --
*
- * This procedure computes the various parameters used
- * when creating a Carbon control (NewControl)
- * These are determined by the various tk button parameters
+ * This procedure computes the various parameters used when creating a
+ * Carbon control (NewControl). These are determined by the various Tk
+ * button parameters
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Sets the control initialisation parameters
+ * Sets the control initialisation parameters
*
*----------------------------------------------------------------------
*/
static void
-TkMacOSXComputeControlParams(TkButton * butPtr, MacControlParams * paramsPtr )
+TkMacOSXComputeControlParams(
+ TkButton *butPtr,
+ MacControlParams *paramsPtr)
{
paramsPtr->isBevel = 0;
-
- /*
- * Determine ProcID based on button type and dimensions
+
+ /*
+ * Determine ProcID based on button type and dimensions.
*/
-
+
switch (butPtr->type) {
- case TYPE_BUTTON:
- if ((butPtr->image == None) && (butPtr->bitmap == None)) {
- paramsPtr->initialValue = 1;
- paramsPtr->minValue = 0;
- paramsPtr->maxValue = 1;
- paramsPtr->procID = kControlPushButtonProc;
- } else {
- paramsPtr->initialValue = 0;
- paramsPtr->minValue = kControlBehaviorOffsetContents
- | kControlContentPictHandle;
- paramsPtr->maxValue = 1;
- if (butPtr->borderWidth <= 2) {
- paramsPtr->procID = kControlBevelButtonSmallBevelProc;
- } else if (butPtr->borderWidth == 3) {
- paramsPtr->procID = kControlBevelButtonNormalBevelProc;
- } else {
- paramsPtr->procID = kControlBevelButtonLargeBevelProc;
- }
- paramsPtr->isBevel = 1;
- }
- break;
- case TYPE_RADIO_BUTTON:
- if (((butPtr->image == None) && (butPtr->bitmap == None))
- || (butPtr->indicatorOn)) {
- paramsPtr->initialValue = 1;
- paramsPtr->minValue = 0;
- paramsPtr->maxValue = 2;
- paramsPtr->procID = kControlRadioButtonProc;
- } else {
- paramsPtr->initialValue = 0;
- paramsPtr->minValue = kControlBehaviorOffsetContents|
- kControlBehaviorSticky|
- kControlContentPictHandle;
- paramsPtr->maxValue = 2;
- if (butPtr->borderWidth <= 2) {
- paramsPtr->procID = kControlBevelButtonSmallBevelProc;
- } else if (butPtr->borderWidth == 3) {
- paramsPtr->procID = kControlBevelButtonNormalBevelProc;
- } else {
- paramsPtr->procID = kControlBevelButtonLargeBevelProc;
- }
- paramsPtr->isBevel = 1;
- }
- break;
- case TYPE_CHECK_BUTTON:
- if (((butPtr->image == None)
- && (butPtr->bitmap == None))
- || (butPtr->indicatorOn)) {
- paramsPtr->initialValue = 1;
- paramsPtr->minValue = 0;
- paramsPtr->maxValue = 2;
- paramsPtr->procID = kControlCheckBoxProc;
- } else {
- paramsPtr->initialValue = 0;
- paramsPtr->minValue = kControlBehaviorOffsetContents
- | kControlBehaviorSticky
- | kControlContentPictHandle;
- paramsPtr->maxValue = 2;
- if (butPtr->borderWidth <= 2) {
- paramsPtr->procID = kControlBevelButtonSmallBevelProc;
- } else if (butPtr->borderWidth == 3) {
- paramsPtr->procID = kControlBevelButtonNormalBevelProc;
- } else {
- paramsPtr->procID = kControlBevelButtonLargeBevelProc;
- }
- paramsPtr->isBevel = 1;
- }
- break;
+ case TYPE_BUTTON:
+ if ((butPtr->image == None) && (butPtr->bitmap == None)) {
+ paramsPtr->initialValue = 1;
+ paramsPtr->minValue = 0;
+ paramsPtr->maxValue = 1;
+ paramsPtr->procID = kControlPushButtonProc;
+ } else {
+ paramsPtr->initialValue = 0;
+ paramsPtr->minValue = kControlBehaviorOffsetContents
+ | kControlContentPictHandle;
+ paramsPtr->maxValue = 1;
+ if (butPtr->borderWidth <= 2) {
+ paramsPtr->procID = kControlBevelButtonSmallBevelProc;
+ } else if (butPtr->borderWidth == 3) {
+ paramsPtr->procID = kControlBevelButtonNormalBevelProc;
+ } else {
+ paramsPtr->procID = kControlBevelButtonLargeBevelProc;
+ }
+ paramsPtr->isBevel = 1;
+ }
+ break;
+ case TYPE_RADIO_BUTTON:
+ if (((butPtr->image == None) && (butPtr->bitmap == None))
+ || (butPtr->indicatorOn)) {
+ paramsPtr->initialValue = 1;
+ paramsPtr->minValue = 0;
+ paramsPtr->maxValue = 2;
+ paramsPtr->procID = kControlRadioButtonProc;
+ } else {
+ paramsPtr->initialValue = 0;
+ paramsPtr->minValue = kControlBehaviorOffsetContents |
+ kControlBehaviorSticky | kControlContentPictHandle;
+ paramsPtr->maxValue = 2;
+ if (butPtr->borderWidth <= 2) {
+ paramsPtr->procID = kControlBevelButtonSmallBevelProc;
+ } else if (butPtr->borderWidth == 3) {
+ paramsPtr->procID = kControlBevelButtonNormalBevelProc;
+ } else {
+ paramsPtr->procID = kControlBevelButtonLargeBevelProc;
+ }
+ paramsPtr->isBevel = 1;
+ }
+ break;
+ case TYPE_CHECK_BUTTON:
+ if (((butPtr->image == None) && (butPtr->bitmap == None))
+ || (butPtr->indicatorOn)) {
+ paramsPtr->initialValue = 1;
+ paramsPtr->minValue = 0;
+ paramsPtr->maxValue = 2;
+ paramsPtr->procID = kControlCheckBoxProc;
+ } else {
+ paramsPtr->initialValue = 0;
+ paramsPtr->minValue = kControlBehaviorOffsetContents |
+ kControlBehaviorSticky | kControlContentPictHandle;
+ paramsPtr->maxValue = 2;
+ if (butPtr->borderWidth <= 2) {
+ paramsPtr->procID = kControlBevelButtonSmallBevelProc;
+ } else if (butPtr->borderWidth == 3) {
+ paramsPtr->procID = kControlBevelButtonNormalBevelProc;
+ } else {
+ paramsPtr->procID = kControlBevelButtonLargeBevelProc;
+ }
+ paramsPtr->isBevel = 1;
+ }
+ break;
}
-}
+}
+
/*
*----------------------------------------------------------------------
*
* TkMacOSXComputeDrawParams --
*
- * This procedure computes the various parameters used
- * when drawing a button
- * These are determined by the various tk button parameters
+ * This procedure computes the various parameters used when drawing a
+ * button. These are determined by the various Tk button parameters.
*
* Results:
- * 1 if control will be used, 0 otherwise.
+ * 1 if control will be used, 0 otherwise.
*
* Side effects:
- * Sets the button draw parameters
+ * Sets the button draw parameters
*
*----------------------------------------------------------------------
*/
static int
-TkMacOSXComputeDrawParams(TkButton * butPtr, DrawParams * dpPtr)
+TkMacOSXComputeDrawParams(
+ TkButton *butPtr,
+ DrawParams *dpPtr)
{
- dpPtr->hasImageOrBitmap = ((butPtr->image != NULL)
- || (butPtr->bitmap != None));
- dpPtr->offset = (butPtr->type == TYPE_BUTTON)
- && dpPtr->hasImageOrBitmap;
+ dpPtr->hasImageOrBitmap = ((butPtr->image != NULL)
+ || (butPtr->bitmap != None));
+ dpPtr->offset = (butPtr->type == TYPE_BUTTON)
+ && dpPtr->hasImageOrBitmap;
dpPtr->border = butPtr->normalBorder;
- if ((butPtr->state == STATE_DISABLED)
- && (butPtr->disabledFg != NULL)) {
- dpPtr->gc = butPtr->disabledGC;
- } else if ((butPtr->type == TYPE_BUTTON)
- && (butPtr->state == STATE_ACTIVE)) {
- dpPtr->gc = butPtr->activeTextGC;
- dpPtr->border = butPtr->activeBorder;
+ if ((butPtr->state == STATE_DISABLED) && (butPtr->disabledFg != NULL)) {
+ dpPtr->gc = butPtr->disabledGC;
+ } else if ((butPtr->type==TYPE_BUTTON) && (butPtr->state==STATE_ACTIVE)) {
+ dpPtr->gc = butPtr->activeTextGC;
+ dpPtr->border = butPtr->activeBorder;
} else {
- dpPtr->gc = butPtr->normalTextGC;
+ dpPtr->gc = butPtr->normalTextGC;
}
- if ((butPtr->flags & SELECTED)
- && (butPtr->state != STATE_ACTIVE)
- && (butPtr->selectBorder != NULL)
- && !butPtr->indicatorOn) {
- dpPtr->border = butPtr->selectBorder;
+ if ((butPtr->flags & SELECTED) && (butPtr->state != STATE_ACTIVE)
+ && (butPtr->selectBorder != NULL) && !butPtr->indicatorOn) {
+ dpPtr->border = butPtr->selectBorder;
}
-
+
/*
- * Override the relief specified for the button if this is a
- * checkbutton or radiobutton and there's no indicator.
- * However, don't do this in the presence of Appearance, since
- * then the bevel button will take care of the relief.
+ * Override the relief specified for the button if this is a checkbutton
+ * or radiobutton and there's no indicator. However, don't do this in the
+ * presence of Appearance, since then the bevel button will take care of
+ * the relief.
*/
dpPtr->relief = butPtr->relief;
if ((butPtr->type >= TYPE_CHECK_BUTTON) && !butPtr->indicatorOn) {
- if (!dpPtr->hasImageOrBitmap) {
- dpPtr->relief = (butPtr->flags & SELECTED) ? TK_RELIEF_SUNKEN
- : TK_RELIEF_RAISED;
- }
+ if (!dpPtr->hasImageOrBitmap) {
+ dpPtr->relief = (butPtr->flags & SELECTED) ? TK_RELIEF_SUNKEN
+ : TK_RELIEF_RAISED;
+ }
}
/*
* Determine the draw type
*/
+
if (butPtr->type == TYPE_LABEL) {
- dpPtr->drawType = DRAW_LABEL;
+ dpPtr->drawType = DRAW_LABEL;
} else if (butPtr->type == TYPE_BUTTON) {
- if (!dpPtr->hasImageOrBitmap) {
- dpPtr->drawType = DRAW_CONTROL;
- } else if (butPtr->image != None) {
- dpPtr->drawType = DRAW_BEVEL;
- } else {
- /*
- * TO DO - The current way the we draw bitmaps (XCopyPlane)
- * uses CopyDeepMask in this one case. The Picture recording
- * does not record this call, and so we can't use the
- * Appearance bevel button here. The only case that would
- * exercise this is if you use a bitmap, with
- * -data & -mask specified. We should probably draw the
- * appearance button and overprint the image in this case.
- * This just punts and draws the old-style, ugly, button.
- */
-
- if (dpPtr->gc->clip_mask == 0) {
- dpPtr->drawType = DRAW_BEVEL;
- } else {
- TkpClipMask *clipPtr = (TkpClipMask*) dpPtr->gc->clip_mask;
- if ((clipPtr->type == TKP_CLIP_PIXMAP) &&
- (clipPtr->value.pixmap != butPtr->bitmap)) {
- dpPtr->drawType = DRAW_CUSTOM;
- } else {
- dpPtr->drawType = DRAW_BEVEL;
- }
- }
- }
+ if (!dpPtr->hasImageOrBitmap) {
+ dpPtr->drawType = DRAW_CONTROL;
+ } else if (butPtr->image != None) {
+ dpPtr->drawType = DRAW_BEVEL;
+ } else {
+ /*
+ * TO DO - The current way the we draw bitmaps (XCopyPlane) uses
+ * CopyDeepMask in this one case. The Picture recording does not
+ * record this call, and so we can't use the Appearance bevel
+ * button here. The only case that would exercise this is if you
+ * use a bitmap, with -data & -mask specified. We should probably
+ * draw the appearance button and overprint the image in this
+ * case. This just punts and draws the old-style, ugly, button.
+ */
+
+ if (dpPtr->gc->clip_mask == 0) {
+ dpPtr->drawType = DRAW_BEVEL;
+ } else {
+ TkpClipMask *clipPtr = (TkpClipMask *) dpPtr->gc->clip_mask;
+
+ if ((clipPtr->type == TKP_CLIP_PIXMAP) &&
+ (clipPtr->value.pixmap != butPtr->bitmap)) {
+ dpPtr->drawType = DRAW_CUSTOM;
+ } else {
+ dpPtr->drawType = DRAW_BEVEL;
+ }
+ }
+ }
+ } else if (butPtr->indicatorOn) {
+ dpPtr->drawType = DRAW_CONTROL;
+ } else if (dpPtr->hasImageOrBitmap) {
+ if (dpPtr->gc->clip_mask == 0) {
+ dpPtr->drawType = DRAW_BEVEL;
+ } else {
+ TkpClipMask *clipPtr = (TkpClipMask*) dpPtr->gc->clip_mask;
+
+ if ((clipPtr->type == TKP_CLIP_PIXMAP) &&
+ (clipPtr->value.pixmap != butPtr->bitmap)) {
+ dpPtr->drawType = DRAW_CUSTOM;
+ } else {
+ dpPtr->drawType = DRAW_BEVEL;
+ }
+ }
} else {
- if (butPtr->indicatorOn) {
- dpPtr->drawType = DRAW_CONTROL;
- } else if (dpPtr->hasImageOrBitmap) {
- if (dpPtr->gc->clip_mask == 0) {
- dpPtr->drawType = DRAW_BEVEL;
- } else {
- TkpClipMask *clipPtr = (TkpClipMask*) dpPtr->gc->clip_mask;
- if ((clipPtr->type == TKP_CLIP_PIXMAP) &&
- (clipPtr->value.pixmap != butPtr->bitmap)) {
- dpPtr->drawType = DRAW_CUSTOM;
- } else {
- dpPtr->drawType = DRAW_BEVEL;
- }
- }
- } else {
- dpPtr->drawType = DRAW_CUSTOM;
- }
+ dpPtr->drawType = DRAW_CUSTOM;
}
if ((dpPtr->drawType == DRAW_CONTROL) || (dpPtr->drawType == DRAW_BEVEL)) {
- return 1;
+ return 1;
} else {
- return 0;
+ return 0;
}
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXCarbonEvents.c b/macosx/tkMacOSXCarbonEvents.c
index d9eba35..81706ba 100644
--- a/macosx/tkMacOSXCarbonEvents.c
+++ b/macosx/tkMacOSXCarbonEvents.c
@@ -1,14 +1,13 @@
/*
* tkMacOSXCarbonEvents.c --
*
- * This file implements functions that register for and handle
- * various Carbon Events and Timers. Most carbon events of interest
- * to TkAqua are processed in a handler registered on the dispatcher
- * event target so that we get first crack at them before HIToolbox
- * dispatchers/processes them further.
- * As some events are sent directly to the focus or app event target
- * and not dispatched normally, we also register a handler on the
- * application event target.
+ * This file implements functions that register for and handle various
+ * Carbon Events and Timers. Most carbon events of interest to TkAqua are
+ * processed in a handler registered on the dispatcher event target so
+ * that we get first crack at them before HIToolbox dispatchers/processes
+ * them further. As some events are sent directly to the focus or app
+ * event target and not dispatched normally, we also register a handler
+ * on the application event target.
*
* Copyright 2001, Apple Computer, Inc.
* Copyright (c) 2005 Daniel A. Steffen <das@users.sourceforge.net>
@@ -16,51 +15,45 @@
* 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.
- *
- * RCS: @(#) $Id: tkMacOSXCarbonEvents.c,v 1.13 2006/10/31 22:33:34 das Exp $
+ * 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.
+ *
+ * RCS: @(#) $Id: tkMacOSXCarbonEvents.c,v 1.14 2007/04/13 14:51:17 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -73,44 +66,51 @@
#endif
*/
-/* Declarations of functions used only in this file */
-static OSStatus CarbonEventHandlerProc(EventHandlerCallRef callRef,
- EventRef event, void *userData);
-static OSStatus InstallStandardApplicationEventHandler();
-static void ExitRaelEventHandlerProc (EventHandlerCallRef, EventRef, void*)
- __attribute__ ((__noreturn__));
-static void CarbonTimerProc(EventLoopTimerRef timer, void *userData);
+/*
+ * Declarations of functions used only in this file:
+ */
+
+static OSStatus CarbonEventHandlerProc(EventHandlerCallRef callRef,
+ EventRef event, void *userData);
+static OSStatus InstallStandardApplicationEventHandler(void);
+static void ExitRaelEventHandlerProc(EventHandlerCallRef,
+ EventRef, void *) __attribute__ ((__noreturn__));
+static void CarbonTimerProc(EventLoopTimerRef timer,
+ void *userData);
+
+/*
+ * Static data used by several functions in this file:
+ */
-/* Static data used by several functions in this file */
static jmp_buf exitRaelJmpBuf;
static EventLoopTimerRef carbonTimer = NULL;
static int carbonTimerEnabled = 0;
-
+
/*
*----------------------------------------------------------------------
*
* CarbonEventHandlerProc --
*
- * This procedure is the handler for all registered CarbonEvents.
+ * This procedure is the handler for all registered CarbonEvents.
*
* Results:
- * OS status code.
+ * OS status code.
*
* Side effects:
- * Dispatches CarbonEvents.
+ * Dispatches CarbonEvents.
*
*----------------------------------------------------------------------
*/
static OSStatus
-CarbonEventHandlerProc (
- EventHandlerCallRef callRef,
- EventRef event,
- void *userData)
+CarbonEventHandlerProc(
+ EventHandlerCallRef callRef,
+ EventRef event,
+ void *userData)
{
- OSStatus result = eventNotHandledErr;
- TkMacOSXEvent macEvent;
- MacEventStatus eventStatus;
+ OSStatus result = eventNotHandledErr;
+ TkMacOSXEvent macEvent;
+ MacEventStatus eventStatus;
macEvent.eventRef = event;
macEvent.eClass = GetEventClass(macEvent.eventRef);
@@ -123,11 +123,14 @@ CarbonEventHandlerProc (
if (macEvent.eKind != kEventMouseMoved &&
macEvent.eKind != kEventMouseDragged) {
TkMacOSXCarbonEventToAscii(event, buf);
- fprintf(stderr, "CarbonEventHandlerProc started handling %s\n", buf);
+ LOG_MSG("CarbonEventHandlerProc started handling %s", buf);
TkMacOSXInitNamedDebugSymbol(HIToolbox, void, _DebugPrintEvent,
EventRef inEvent);
if (_DebugPrintEvent) {
- /* Carbon-internal event debugging (c.f. Technote 2124) */
+ /*
+ * Carbon-internal event debugging (c.f. Technote 2124)
+ */
+
_DebugPrintEvent(event);
}
}
@@ -141,8 +144,7 @@ CarbonEventHandlerProc (
#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_CARBON_EVENTS)
if (macEvent.eKind != kEventMouseMoved &&
macEvent.eKind != kEventMouseDragged) {
- fprintf(stderr,
- "CarbonEventHandlerProc finished handling %s: %s handled\n",
+ LOG_MSG("CarbonEventHandlerProc finished handling %s: %s handled",
buf, eventStatus.stopProcessing ? " " : "not");
}
#endif /* TK_MAC_DEBUG_CARBON_EVENTS */
@@ -154,81 +156,71 @@ CarbonEventHandlerProc (
*
* TkMacOSXInitCarbonEvents --
*
- * This procedure initializes all CarbonEvent handlers.
+ * This procedure initializes all CarbonEvent handlers.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Handlers for Carbon Events are registered.
+ * Handlers for Carbon Events are registered.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE void
-TkMacOSXInitCarbonEvents (
- Tcl_Interp *interp)
+TkMacOSXInitCarbonEvents(
+ Tcl_Interp *interp)
{
OSStatus err;
const EventTypeSpec dispatcherEventTypes[] = {
- {kEventClassMouse, kEventMouseDown},
- {kEventClassMouse, kEventMouseUp},
- {kEventClassMouse, kEventMouseMoved},
- {kEventClassMouse, kEventMouseDragged},
- {kEventClassMouse, kEventMouseWheelMoved},
- {kEventClassWindow, kEventWindowUpdate},
- {kEventClassWindow, kEventWindowActivated},
- {kEventClassWindow, kEventWindowDeactivated},
- {kEventClassKeyboard, kEventRawKeyDown},
- {kEventClassKeyboard, kEventRawKeyRepeat},
- {kEventClassKeyboard, kEventRawKeyUp},
- {kEventClassKeyboard, kEventRawKeyModifiersChanged},
- {kEventClassKeyboard, kEventRawKeyRepeat},
- {kEventClassApplication, kEventAppActivated},
- {kEventClassApplication, kEventAppDeactivated},
- {kEventClassApplication, kEventAppQuit},
+ {kEventClassMouse, kEventMouseDown},
+ {kEventClassMouse, kEventMouseUp},
+ {kEventClassMouse, kEventMouseMoved},
+ {kEventClassMouse, kEventMouseDragged},
+ {kEventClassMouse, kEventMouseWheelMoved},
+ {kEventClassWindow, kEventWindowUpdate},
+ {kEventClassWindow, kEventWindowActivated},
+ {kEventClassWindow, kEventWindowDeactivated},
+ {kEventClassKeyboard, kEventRawKeyDown},
+ {kEventClassKeyboard, kEventRawKeyRepeat},
+ {kEventClassKeyboard, kEventRawKeyUp},
+ {kEventClassKeyboard, kEventRawKeyModifiersChanged},
+ {kEventClassKeyboard, kEventRawKeyRepeat},
+ {kEventClassApplication, kEventAppActivated},
+ {kEventClassApplication, kEventAppDeactivated},
+ {kEventClassApplication, kEventAppQuit},
};
const EventTypeSpec applicationEventTypes[] = {
- {kEventClassMenu, kEventMenuBeginTracking},
- {kEventClassMenu, kEventMenuEndTracking},
- {kEventClassCommand, kEventCommandProcess},
- {kEventClassCommand, kEventCommandUpdateStatus},
- {kEventClassMouse, kEventMouseWheelMoved},
- {kEventClassWindow, kEventWindowExpanded},
- {kEventClassApplication, kEventAppHidden},
- {kEventClassApplication, kEventAppShown},
- {kEventClassApplication, kEventAppAvailableWindowBoundsChanged},
+ {kEventClassMenu, kEventMenuBeginTracking},
+ {kEventClassMenu, kEventMenuEndTracking},
+ {kEventClassCommand, kEventCommandProcess},
+ {kEventClassCommand, kEventCommandUpdateStatus},
+ {kEventClassMouse, kEventMouseWheelMoved},
+ {kEventClassWindow, kEventWindowExpanded},
+ {kEventClassApplication, kEventAppHidden},
+ {kEventClassApplication, kEventAppShown},
+ {kEventClassApplication, kEventAppAvailableWindowBoundsChanged},
};
EventHandlerUPP handler = NewEventHandlerUPP(CarbonEventHandlerProc);
err = InstallStandardApplicationEventHandler();
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "InstallStandardApplicationEventHandler failed, %d\n",
- (int) err);
-#endif
- }
+ LOG_ON_ERROR(InstallStandardApplicationEventHandler);
err = InstallEventHandler(GetEventDispatcherTarget(), handler,
GetEventTypeCount(dispatcherEventTypes), dispatcherEventTypes,
(void *) interp, NULL);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "InstallEventHandler failed, %d\n", (int) err);
-#endif
- }
+ LOG_ON_ERROR(InstallEventHandler);
err = InstallEventHandler(GetApplicationEventTarget(), handler,
GetEventTypeCount(applicationEventTypes), applicationEventTypes,
(void *) interp, NULL);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "InstallEventHandler failed, %d\n", (int) err);
-#endif
- }
+ LOG_ON_ERROR(InstallEventHandler);
#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_CARBON_EVENTS)
TkMacOSXInitNamedDebugSymbol(HIToolbox, void, TraceEventByName, char*);
if (TraceEventByName) {
- /* Carbon-internal event debugging (c.f. Technote 2124) */
+ /*
+ * Carbon-internal event debugging (c.f. Technote 2124)
+ */
+
TraceEventByName("kEventMouseDown");
TraceEventByName("kEventMouseUp");
TraceEventByName("kEventMouseWheelMoved");
@@ -261,34 +253,38 @@ TkMacOSXInitCarbonEvents (
*
* InstallStandardApplicationEventHandler --
*
- * This procedure installs the carbon standard application event
- * handler.
+ * This procedure installs the carbon standard application event handler.
*
* Results:
- * OS status code.
+ * OS status code.
*
* Side effects:
- * Standard handlers for application Carbon Events are registered.
+ * Standard handlers for application Carbon Events are registered.
*
*----------------------------------------------------------------------
*/
static OSStatus
-InstallStandardApplicationEventHandler()
+InstallStandardApplicationEventHandler(void)
{
- /*
- * This is a hack to workaround missing Carbon API to install the standard
- * application event handler (InstallStandardEventHandler() does not work
- * on the application target). The only way to install the standard app
- * handler is to call RunApplicationEventLoop(), but since we are running
- * our own event loop, we'll immediately need to break out of RAEL again:
- * we do this via longjmp out of the ExitRaelEventHandlerProc event handler
- * called first off from RAEL by posting a high priority dummy event.
- * This workaround is derived from a similar approach in Technical Q&A 1061.
- */
- enum { kExitRaelEvent = 'ExiT' };
- const EventTypeSpec exitRaelEventType =
- { kExitRaelEvent, kExitRaelEvent};
+ /*
+ * This is a hack to workaround missing Carbon API to install the standard
+ * application event handler (InstallStandardEventHandler() does not work
+ * on the application target). The only way to install the standard app
+ * handler is to call RunApplicationEventLoop(), but since we are running
+ * our own event loop, we'll immediately need to break out of RAEL again:
+ * we do this via longjmp out of the ExitRaelEventHandlerProc event
+ * handler called first off from RAEL by posting a high priority dummy
+ * event. This workaround is derived from a similar approach in Technical
+ * Q&A 1061.
+ */
+
+ enum {
+ kExitRaelEvent = 'ExiT'
+ };
+ const EventTypeSpec exitRaelEventType = {
+ kExitRaelEvent, kExitRaelEvent
+ };
EventHandlerUPP exitRaelEventHandler;
EventHandlerRef exitRaelEventHandlerRef = NULL;
EventRef exitRaelEvent = NULL;
@@ -302,7 +298,7 @@ InstallStandardApplicationEventHandler()
&exitRaelEventHandlerRef);
}
if (err == noErr) {
- err = CreateEvent(NULL, kExitRaelEvent, kExitRaelEvent,
+ err = CreateEvent(NULL, kExitRaelEvent, kExitRaelEvent,
GetCurrentEventTime(), kEventAttributeNone, &exitRaelEvent);
}
if (err == noErr) {
@@ -312,7 +308,11 @@ InstallStandardApplicationEventHandler()
if (err == noErr) {
if (!setjmp(exitRaelJmpBuf)) {
RunApplicationEventLoop();
- /* This point should never be reached ! */
+
+ /*
+ * This point should never be reached!
+ */
+
Tcl_Panic("RunApplicationEventLoop exited !");
}
}
@@ -333,23 +333,24 @@ InstallStandardApplicationEventHandler()
*
* ExitRaelEventHandlerProc --
*
- * This procedure is the dummy event handler used to break out of
- * RAEL via longjmp, it is called as the first ever event handler
- * in RAEL by posting a high priority dummy event.
+ * This procedure is the dummy event handler used to break out of RAEL
+ * via longjmp(), it is called as the first ever event handler in RAEL by
+ * posting a high priority dummy event.
*
* Results:
- * None. Never returns !
+ * None. Never returns!
*
* Side effects:
- * longjmp back to InstallStandardApplicationEventHandler().
+ * longjmp()s back to InstallStandardApplicationEventHandler().
*
*----------------------------------------------------------------------
*/
static void
-ExitRaelEventHandlerProc (
- EventHandlerCallRef callRef,
- EventRef event, void *userData)
+ExitRaelEventHandlerProc(
+ EventHandlerCallRef callRef,
+ EventRef event,
+ void *userData)
{
longjmp(exitRaelJmpBuf, 1);
}
@@ -359,33 +360,36 @@ ExitRaelEventHandlerProc (
*
* CarbonTimerProc --
*
- * This procedure is the carbon timer handler that runs the tcl
- * event loop periodically. It does not process TCL_WINDOW_EVENTS
- * to avoid reentry issues with Carbon, nor TCL_IDLE_EVENTS since
- * it is only intended to be called during short periods of busy
- * time such as during menu tracking.
+ * This procedure is the carbon timer handler that runs the tcl event
+ * loop periodically. It does not process TCL_WINDOW_EVENTS to avoid
+ * reentry issues with Carbon, nor TCL_IDLE_EVENTS since it is only
+ * intended to be called during short periods of busy time such as during
+ * menu tracking.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Runs the Tcl event loop.
+ * Runs the Tcl event loop.
*
*----------------------------------------------------------------------
*/
static void
-CarbonTimerProc (
- EventLoopTimerRef timer,
- void *userData)
+CarbonTimerProc(
+ EventLoopTimerRef timer,
+ void *userData)
{
- if(carbonTimerEnabled) {
- /* Avoid starving main event loop: process at most 4 events. */
+ if (carbonTimerEnabled) {
+ /*
+ * Avoid starving main event loop: process at most 4 events.
+ */
+
int i = 4;
- while(--i && Tcl_DoOneEvent(
+ while (--i && Tcl_DoOneEvent(
TCL_FILE_EVENTS|TCL_TIMER_EVENTS|TCL_DONT_WAIT)) {
-#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_CARBON_EVENTS)
- fprintf(stderr, "Processed tcl event from carbon timer\n");
+#ifdef TK_MAC_DEBUG_CARBON_EVENTS
+ LOG_MSG("Processed tcl event from carbon timer");
#endif /* TK_MAC_DEBUG_CARBON_EVENTS */
}
}
@@ -396,80 +400,75 @@ CarbonTimerProc (
*
* TkMacOSXStartTclEventLoopCarbonTimer --
*
- * This procedure installs (if necessary) and starts a carbon
- * event timer that runs the tcl event loop periodically.
- * It should be called whenever a nested carbon event loop is
- * run by HIToolbox (e.g. during menutracking) to ensure that
- * non-window non-idle tcl events are processed.
+ * This procedure installs (if necessary) and starts a carbon event timer
+ * that runs the tcl event loop periodically. It should be called
+ * whenever a nested carbon event loop is run by HIToolbox (e.g. during
+ * menutracking) to ensure that non-window non-idle tcl events are
+ * processed.
*
* Results:
- * OS status code.
+ * OS status code.
*
* Side effects:
- * Carbon event timer is installed and started.
+ * Carbon event timer is installed and started.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE OSStatus
-TkMacOSXStartTclEventLoopCarbonTimer()
+TkMacOSXStartTclEventLoopCarbonTimer(void)
{
OSStatus err;
- if(!carbonTimer) {
+ if (!carbonTimer) {
EventLoopTimerUPP timerUPP = NewEventLoopTimerUPP(CarbonTimerProc);
+
err = InstallEventLoopTimer(GetMainEventLoop(), kEventDurationNoWait,
5 * kEventDurationMillisecond, timerUPP, NULL, &carbonTimer);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "InstallEventLoopTimer failed, %d\n", (int) err);
-#endif
- }
+ LOG_ON_ERROR(InstallEventLoopTimer);
} else {
err = SetEventLoopTimerNextFireTime(carbonTimer, kEventDurationNoWait);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "SetEventLoopTimerNextFireTime failed, %d\n",
- (int) err);
-#endif
- }
+ LOG_ON_ERROR(SetEventLoopTimerNextFireTime);
}
carbonTimerEnabled = 1;
return err;
}
-
+
/*
*----------------------------------------------------------------------
*
* TkMacOSXStopTclEventLoopCarbonTimer --
*
- * This procedure stops the carbon event timer started by
- * TkMacOSXStartTclEventLoopCarbonTimer().
+ * This procedure stops the carbon event timer started by
+ * TkMacOSXStartTclEventLoopCarbonTimer().
*
* Results:
- * OS status code.
+ * OS status code.
*
* Side effects:
- * Carbon event timer is stopped.
+ * Carbon event timer is stopped.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE OSStatus
-TkMacOSXStopTclEventLoopCarbonTimer()
+TkMacOSXStopTclEventLoopCarbonTimer(void)
{
OSStatus err = noErr;
- if(carbonTimer) {
- err = SetEventLoopTimerNextFireTime(carbonTimer, kEventDurationForever);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "SetEventLoopTimerNextFireTime failed, %d\n",
- (int) err);
-#endif
- }
+ if (carbonTimer) {
+ err = SetEventLoopTimerNextFireTime(carbonTimer,
+ kEventDurationForever);
+ LOG_ON_ERROR(SetEventLoopTimerNextFireTime);
}
carbonTimerEnabled = 0;
return err;
}
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXClipboard.c b/macosx/tkMacOSXClipboard.c
index 03f700c..b4008c6 100644
--- a/macosx/tkMacOSXClipboard.c
+++ b/macosx/tkMacOSXClipboard.c
@@ -1,15 +1,15 @@
/*
* tkMacOSXClipboard.c --
*
- * This file manages the clipboard for the Tk toolkit.
+ * This file manages the clipboard for the Tk toolkit.
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXClipboard.c,v 1.7 2007/01/19 00:36:45 das Exp $
+ * RCS: @(#) $Id: tkMacOSXClipboard.c,v 1.8 2007/04/13 14:51:17 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -21,59 +21,58 @@
*
* TkSelGetSelection --
*
- * Retrieve the specified selection from another process. For
- * now, only fetching XA_STRING from CLIPBOARD is supported.
- * Eventually other types should be allowed.
- *
+ * Retrieve the specified selection from another process. For now, only
+ * fetching XA_STRING from CLIPBOARD is supported. Eventually other types
+ * should be allowed.
+ *
* Results:
- * The return value is a standard Tcl return value.
- * If an error occurs (such as no selection exists)
- * then an error message is left in the interp's result.
+ * The return value is a standard Tcl return value. If an error occurs
+ * (such as no selection exists) then an error message is left in the
+ * interp's result.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
int
TkSelGetSelection(
- Tcl_Interp *interp, /* Interpreter to use for reporting
- * errors. */
- Tk_Window tkwin, /* Window on whose behalf to retrieve
- * the selection (determines display
- * from which to retrieve). */
- Atom selection, /* Selection to retrieve. */
- Atom target, /* Desired form in which selection
- * is to be returned. */
- Tk_GetSelProc *proc, /* Procedure to call to process the
- * selection, once it has been retrieved. */
- ClientData clientData) /* Arbitrary value to pass to proc. */
+ Tcl_Interp *interp, /* Interpreter to use for reporting errors. */
+ Tk_Window tkwin, /* Window on whose behalf to retrieve the
+ * selection (determines display from which to
+ * retrieve). */
+ Atom selection, /* Selection to retrieve. */
+ Atom target, /* Desired form in which selection is to be
+ * returned. */
+ Tk_GetSelProc *proc, /* Procedure to call to process the selection,
+ * once it has been retrieved. */
+ ClientData clientData) /* Arbitrary value to pass to proc. */
{
- int result;
- int err;
+ int result, err;
long length;
ScrapRef scrapRef;
- char * buf;
+ char *buf;
if ((selection == Tk_InternAtom(tkwin, "CLIPBOARD"))
- && (target == XA_STRING)) {
- /*
- * Get the scrap from the Macintosh global clipboard.
- */
-
- err = GetCurrentScrap(&scrapRef);
- if (err != noErr) {
- Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
- " GetCurrentScrap failed.", (char *) NULL);
- return TCL_ERROR;
- }
+ && (target == XA_STRING)) {
+ /*
+ * Get the scrap from the Macintosh global clipboard.
+ */
+
+ err = GetCurrentScrap(&scrapRef);
+ if (err != noErr) {
+ Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
+ " GetCurrentScrap failed.", NULL);
+ return TCL_ERROR;
+ }
/*
* Try UNICODE first
*/
- err = GetScrapFlavorSize(scrapRef, kScrapFlavorTypeUnicode, &length);
- if (err == noErr && length > 0) {
+
+ err = GetScrapFlavorSize(scrapRef, kScrapFlavorTypeUnicode, &length);
+ if (err == noErr && length > 0) {
Tcl_DString ds;
char *data;
@@ -98,49 +97,49 @@ TkSelGetSelection(
}
}
- err = GetScrapFlavorSize(scrapRef, 'TEXT', &length);
- if (err != noErr) {
- Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
- " GetScrapFlavorSize failed.", (char *) NULL);
- return TCL_ERROR;
- }
- if (length > 0) {
- Tcl_DString encodedText;
- char *data;
-
- buf = (char *) ckalloc(length + 1);
+ err = GetScrapFlavorSize(scrapRef, 'TEXT', &length);
+ if (err != noErr) {
+ Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
+ " GetScrapFlavorSize failed.", NULL);
+ return TCL_ERROR;
+ }
+ if (length > 0) {
+ Tcl_DString encodedText;
+ char *data;
+
+ buf = (char *) ckalloc(length + 1);
buf[length] = 0;
err = GetScrapFlavorData(scrapRef, 'TEXT', &length, buf);
- if (err != noErr) {
- Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
- " GetScrapFlavorData failed.", (char *) NULL);
- return TCL_ERROR;
- }
-
- /*
- * Tcl expects '\n' not '\r' as the line break character.
- */
-
- for (data = buf; *data != '\0'; data++) {
- if (*data == '\r') {
- *data = '\n';
- }
- }
-
- Tcl_ExternalToUtfDString(TkMacOSXCarbonEncoding, buf, length,
- &encodedText);
- result = (*proc)(clientData, interp,
- Tcl_DStringValue(&encodedText));
- Tcl_DStringFree(&encodedText);
-
- ckfree(buf);
- return result;
- }
+ if (err != noErr) {
+ Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
+ " GetScrapFlavorData failed.", (char *) NULL);
+ return TCL_ERROR;
+ }
+
+ /*
+ * Tcl expects '\n' not '\r' as the line break character.
+ */
+
+ for (data = buf; *data != '\0'; data++) {
+ if (*data == '\r') {
+ *data = '\n';
+ }
+ }
+
+ Tcl_ExternalToUtfDString(TkMacOSXCarbonEncoding, buf, length,
+ &encodedText);
+ result = (*proc)(clientData, interp,
+ Tcl_DStringValue(&encodedText));
+ Tcl_DStringFree(&encodedText);
+
+ ckfree(buf);
+ return result;
+ }
}
-
+
Tcl_AppendResult(interp, Tk_GetAtomName(tkwin, selection),
- " selection doesn't exist or form \"", Tk_GetAtomName(tkwin, target),
- "\" not defined", (char *) NULL);
+ " selection doesn't exist or form \"",
+ Tk_GetAtomName(tkwin, target), "\" not defined", NULL);
return TCL_ERROR;
}
@@ -149,48 +148,46 @@ TkSelGetSelection(
*
* TkSetSelectionOwner --
*
- * This function claims ownership of the specified selection.
- * If the selection is CLIPBOARD, then we empty the system
- * clipboard.
+ * This function claims ownership of the specified selection. If the
+ * selection is CLIPBOARD, then we empty the system clipboard.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
void
XSetSelectionOwner(
- Display* display, /* X Display. */
- Atom selection, /* What selection to own. */
- Window owner, /* Window to be the owner. */
- Time time) /* The current time? */
+ Display *display, /* X Display. */
+ Atom selection, /* What selection to own. */
+ Window owner, /* Window to be the owner. */
+ Time time) /* The current time? */
{
Tk_Window tkwin;
TkDisplay *dispPtr;
/*
- * This is a gross hack because the Tk_InternAtom interface is broken.
- * It expects a Tk_Window, even though it only needs a Tk_Display.
+ * This is a gross hack because the Tk_InternAtom interface is broken. It
+ * expects a Tk_Window, even though it only needs a Tk_Display.
*/
tkwin = (Tk_Window) TkGetMainInfoList()->winPtr;
if (selection == Tk_InternAtom(tkwin, "CLIPBOARD")) {
+ /*
+ * Only claim and empty the clipboard if we aren't already the owner
+ * of the clipboard.
+ */
- /*
- * Only claim and empty the clipboard if we aren't already the
- * owner of the clipboard.
- */
-
- dispPtr = TkGetMainInfoList()->winPtr->dispPtr;
- if (dispPtr->clipboardActive) {
- return;
- }
- ClearCurrentScrap();
+ dispPtr = TkGetMainInfoList()->winPtr->dispPtr;
+ if (dispPtr->clipboardActive) {
+ return;
+ }
+ ClearCurrentScrap();
}
}
@@ -199,23 +196,23 @@ XSetSelectionOwner(
*
* TkSelUpdateClipboard --
*
- * This function is called to force the clipboard to be updated
- * after new data is added. On the Mac we don't need to do
- * anything.
+ * This function is called to force the clipboard to be updated after new
+ * data is added. On the Mac we don't need to do anything.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
void
TkSelUpdateClipboard(
- TkWindow *winPtr, /* Window associated with clipboard. */
- TkClipboardTarget *targetPtr) /* Info about the content. */
+ TkWindow *winPtr, /* Window associated with clipboard. */
+ TkClipboardTarget *targetPtr)
+ /* Info about the content. */
{
}
@@ -224,28 +221,25 @@ TkSelUpdateClipboard(
*
* TkSelEventProc --
*
- * This procedure is invoked whenever a selection-related
- * event occurs.
+ * This procedure is invoked whenever a selection-related event occurs.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Lots: depends on the type of event.
+ * Lots: depends on the type of event.
*
*--------------------------------------------------------------
*/
void
TkSelEventProc(
- Tk_Window tkwin, /* Window for which event was
- * targeted. */
- register XEvent *eventPtr) /* X event: either SelectionClear,
- * SelectionRequest, or
- * SelectionNotify. */
+ Tk_Window tkwin, /* Window for which event was targeted. */
+ register XEvent *eventPtr) /* X event: either SelectionClear,
+ * SelectionRequest, or SelectionNotify. */
{
if (eventPtr->type == SelectionClear) {
- TkSelClearSelection(tkwin, eventPtr);
+ TkSelClearSelection(tkwin, eventPtr);
}
}
@@ -254,22 +248,21 @@ TkSelEventProc(
*
* TkSelPropProc --
*
- * This procedure is invoked when property-change events
- * occur on windows not known to the toolkit. This is a stub
- * function under Windows.
+ * This procedure is invoked when property-change events occur on windows
+ * not known to the toolkit. This is a stub function under Windows.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
void
TkSelPropProc(
- register XEvent *eventPtr) /* X PropertyChange event. */
+ register XEvent *eventPtr) /* X PropertyChange event. */
{
}
@@ -278,20 +271,20 @@ TkSelPropProc(
*
* TkSuspendClipboard --
*
- * Handle clipboard conversion as required by the suppend event.
- * This function is also called on exit.
+ * Handle clipboard conversion as required by the suppend event. This
+ * function is also called on exit.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The local scrap is moved to the global scrap.
+ * The local scrap is moved to the global scrap.
*
*----------------------------------------------------------------------
*/
void
-TkSuspendClipboard()
+TkSuspendClipboard(void)
{
TkClipboardTarget *targetPtr;
TkClipboardBuffer *cbPtr;
@@ -302,50 +295,50 @@ TkSuspendClipboard()
dispPtr = TkGetDisplayList();
if ((dispPtr == NULL) || !dispPtr->clipboardActive) {
- return;
+ return;
}
for (targetPtr = dispPtr->clipTargetPtr; targetPtr != NULL;
- targetPtr = targetPtr->nextPtr) {
- if (targetPtr->type == XA_STRING)
- break;
+ targetPtr = targetPtr->nextPtr) {
+ if (targetPtr->type == XA_STRING) {
+ break;
+ }
}
if (targetPtr != NULL) {
- Tcl_DString encodedText;
- Tcl_DString unicodedText;
-
- length = 0;
- for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL;
- cbPtr = cbPtr->nextPtr) {
- length += cbPtr->length;
- }
-
- buffer = ckalloc(length);
- buffPtr = buffer;
- for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL;
- cbPtr = cbPtr->nextPtr) {
- for (p = cbPtr->buffer, endPtr = p + cbPtr->length;
- p < endPtr; p++) {
- if (*p == '\n') {
- *buffPtr++ = '\r';
- } else {
- *buffPtr++ = *p;
- }
- }
- }
-
- ClearCurrentScrap();
- GetCurrentScrap(&scrapRef);
- Tcl_UtfToExternalDString(TkMacOSXCarbonEncoding, buffer,
- length, &encodedText);
- PutScrapFlavor(scrapRef, 'TEXT', 0,
- Tcl_DStringLength(&encodedText),
- Tcl_DStringValue(&encodedText) );
- Tcl_DStringFree(&encodedText);
+ Tcl_DString encodedText, unicodedText;
+
+ length = 0;
+ for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL;
+ cbPtr = cbPtr->nextPtr) {
+ length += cbPtr->length;
+ }
+
+ buffer = ckalloc(length);
+ buffPtr = buffer;
+ for (cbPtr = targetPtr->firstBufferPtr; cbPtr != NULL;
+ cbPtr = cbPtr->nextPtr) {
+ for (p = cbPtr->buffer, endPtr = p + cbPtr->length;
+ p < endPtr; p++) {
+ if (*p == '\n') {
+ *buffPtr++ = '\r';
+ } else {
+ *buffPtr++ = *p;
+ }
+ }
+ }
+
+ ClearCurrentScrap();
+ GetCurrentScrap(&scrapRef);
+ Tcl_UtfToExternalDString(TkMacOSXCarbonEncoding, buffer, length,
+ &encodedText);
+ PutScrapFlavor(scrapRef, 'TEXT', 0, Tcl_DStringLength(&encodedText),
+ Tcl_DStringValue(&encodedText));
+ Tcl_DStringFree(&encodedText);
/*
- * Also put unicode data on scrap
+ * Also put unicode data on scrap.
*/
+
Tcl_DStringInit(&unicodedText);
Tcl_UtfToUniCharDString(buffer, length, &unicodedText);
PutScrapFlavor(scrapRef, kScrapFlavorTypeUnicode, 0,
@@ -353,20 +346,26 @@ TkSuspendClipboard()
Tcl_DStringValue(&unicodedText));
Tcl_DStringFree(&unicodedText);
- ckfree(buffer);
+ ckfree(buffer);
}
/*
- * The system now owns the scrap. We tell Tk that it has
- * lost the selection so that it will look for it the next time
- * it needs it. (Window list NULL if quiting.)
+ * The system now owns the scrap. We tell Tk that it has lost the
+ * selection so that it will look for it the next time it needs it.
+ * (Window list NULL if quiting.)
*/
if (TkGetMainInfoList() != NULL) {
- Tk_ClearSelection((Tk_Window) TkGetMainInfoList()->winPtr,
- Tk_InternAtom((Tk_Window) TkGetMainInfoList()->winPtr,
- "CLIPBOARD"));
+ Tk_ClearSelection((Tk_Window) TkGetMainInfoList()->winPtr,
+ Tk_InternAtom((Tk_Window) TkGetMainInfoList()->winPtr,
+ "CLIPBOARD"));
}
-
- return;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXCursor.c b/macosx/tkMacOSXCursor.c
index 5b3cfa4..175af6a 100644
--- a/macosx/tkMacOSXCursor.c
+++ b/macosx/tkMacOSXCursor.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXCursor.c,v 1.8 2006/07/20 06:24:16 das Exp $
+ * RCS: @(#) $Id: tkMacOSXCursor.c,v 1.9 2007/04/13 14:51:17 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -358,7 +358,7 @@ TkMacOSXInstallCursor(
CCrsrHandle ccursor;
CursHandle cursor;
static unsigned int cursorStep = 0;
-
+
gResizeOverride = resizeOverride;
if (resizeOverride) {
@@ -366,9 +366,7 @@ TkMacOSXInstallCursor(
if (cursor) {
SetCursor(*cursor);
} else {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Resize cursor failed, %d\n", ResError());
-#endif
+ LOG_MSG("Resize cursor failed, %d", ResError());
}
} else if (macCursorPtr == NULL) {
SetThemeCursor(kThemeArrowCursor);
diff --git a/macosx/tkMacOSXDialog.c b/macosx/tkMacOSXDialog.c
index 8d0b7c5..4b41cb5 100644
--- a/macosx/tkMacOSXDialog.c
+++ b/macosx/tkMacOSXDialog.c
@@ -6,10 +6,10 @@
* Copyright (c) 1996-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXDialog.c,v 1.21 2006/12/01 07:13:00 das Exp $
+ * RCS: @(#) $Id: tkMacOSXDialog.c,v 1.22 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -25,6 +25,7 @@
/*
* The following are ID's for resources that are defined in tkMacOSXResource.r
*/
+
#define OPEN_BOX 130
#define OPEN_POPUP 131
#define OPEN_MENU 132
@@ -43,46 +44,45 @@
* The following structure is used in the GetFileName() function. It stored
* information about the file dialog and the file filters.
*/
+
typedef struct _OpenFileData {
FileFilterList fl; /* List of file filters. */
SInt16 curType; /* The filetype currently being listed. */
short popupItem; /* Item number of the popup in the dialog. */
- int usePopup; /* True if we show the popup menu (this is
- * an open operation and the -filetypes
- * option is set). */
+ int usePopup; /* True if we show the popup menu (this is an
+ * open operation and the -filetypes option is
+ * set). */
} OpenFileData;
-
/*
- * The following structure is used in the tk_messageBox
- * implementation.
+ * The following structure is used in the tk_messageBox implementation.
*/
+
typedef struct {
- WindowRef windowRef;
- int buttonIndex;
+ WindowRef windowRef;
+ int buttonIndex;
} CallbackUserData;
-
static OSStatus AlertHandler(EventHandlerCallRef callRef,
EventRef eventRef, void *userData);
-static Boolean MatchOneType(StringPtr fileNamePtr, OSType fileType,
+static Boolean MatchOneType(StringPtr fileNamePtr, OSType fileType,
OpenFileData *myofdPtr, FileFilter *filterPtr);
-static pascal Boolean OpenFileFilterProc(AEDesc* theItem, void* info,
+static pascal Boolean OpenFileFilterProc(AEDesc* theItem, void* info,
NavCallBackUserData callBackUD,
NavFilterModes filterMode);
-static pascal void OpenEventProc(NavEventCallbackMessage callBackSelector,
+static pascal void OpenEventProc(NavEventCallbackMessage callBackSelector,
NavCBRecPtr callBackParms,
NavCallBackUserData callBackUD);
-static void InitFileDialogs();
-static int NavServicesGetFile(Tcl_Interp *interp, OpenFileData *ofd,
- AEDesc *initialDescPtr,
+static void InitFileDialogs(void);
+static int NavServicesGetFile(Tcl_Interp *interp,
+ OpenFileData *ofd, AEDesc *initialDescPtr,
char *initialFile, AEDescList *selectDescPtr,
- CFStringRef title, CFStringRef message, int multiple, int isOpen);
-static int HandleInitialDirectory (Tcl_Interp *interp,
- char *initialFile, char *initialDir,
- FSRef *dirRef,
- AEDescList *selectDescPtr,
- AEDesc *dirDescPtr);
+ CFStringRef title, CFStringRef message,
+ int multiple, int isOpen);
+static int HandleInitialDirectory(Tcl_Interp *interp,
+ char *initialFile, char *initialDir,
+ FSRef *dirRef, AEDescList *selectDescPtr,
+ AEDesc *dirDescPtr);
/*
* Have we initialized the file dialog subsystem
@@ -97,16 +97,14 @@ static int fileDlgInited = 0;
static NavObjectFilterUPP openFileFilterUPP;
static NavEventUPP openFileEventUPP;
-
/*
*----------------------------------------------------------------------
*
* Tk_ChooseColorObjCmd --
*
- * This procedure implements the color dialog box for the Mac
- * platform. See the user documentation for details on what it
- * does.
+ * This procedure implements the color dialog box for the Mac platform.
+ * See the user documentation for details on what it does.
*
* Results:
* A standard Tcl result.
@@ -119,10 +117,10 @@ static NavEventUPP openFileEventUPP;
int
Tk_ChooseColorObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
+ ClientData clientData, /* Main window associated with interpreter. */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
Tk_Window parent;
char *title;
@@ -131,17 +129,17 @@ Tk_ChooseColorObjCmd(
static int inited = 0;
static RGBColor in;
static CONST char *optionStrings[] = {
- "-initialcolor", "-parent", "-title", NULL
+ "-initialcolor", "-parent", "-title", NULL
};
enum options {
- COLOR_INITIAL, COLOR_PARENT, COLOR_TITLE
+ COLOR_INITIAL, COLOR_PARENT, COLOR_TITLE
};
if (inited == 0) {
- /*
- * 'in' stores the last color picked. The next time the color dialog
- * pops up, the last color will remain in the dialog.
- */
+ /*
+ * 'in' stores the last color picked. The next time the color dialog
+ * pops up, the last color will remain in the dialog.
+ */
in.red = 0xffff;
in.green = 0xffff;
@@ -154,46 +152,44 @@ Tk_ChooseColorObjCmd(
picked = 0;
for (i = 1; i < objc; i += 2) {
- int index;
- char *option, *value;
+ int index;
+ char *option, *value;
if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option",
TCL_EXACT, &index) != TCL_OK) {
return TCL_ERROR;
}
if (i + 1 == objc) {
- option = Tcl_GetStringFromObj(objv[i], NULL);
+ option = Tcl_GetString(objv[i]);
Tcl_AppendResult(interp, "value for \"", option, "\" missing",
- (char *) NULL);
+ NULL);
return TCL_ERROR;
}
value = Tcl_GetStringFromObj(objv[i + 1], NULL);
switch ((enum options) index) {
- case COLOR_INITIAL: {
- XColor *colorPtr;
+ case COLOR_INITIAL: {
+ XColor *colorPtr;
- colorPtr = Tk_GetColor(interp, parent, value);
- if (colorPtr == NULL) {
- return TCL_ERROR;
- }
- in.red = colorPtr->red;
- in.green = colorPtr->green;
- in.blue = colorPtr->blue;
- Tk_FreeColor(colorPtr);
- break;
+ colorPtr = Tk_GetColor(interp, parent, value);
+ if (colorPtr == NULL) {
+ return TCL_ERROR;
}
- case COLOR_PARENT: {
- parent = Tk_NameToWindow(interp, value, parent);
- if (parent == NULL) {
- return TCL_ERROR;
- }
- break;
- }
- case COLOR_TITLE: {
- title = value;
- break;
+ in.red = colorPtr->red;
+ in.green = colorPtr->green;
+ in.blue = colorPtr->blue;
+ Tk_FreeColor(colorPtr);
+ break;
+ }
+ case COLOR_PARENT:
+ parent = Tk_NameToWindow(interp, value, parent);
+ if (parent == NULL) {
+ return TCL_ERROR;
}
+ break;
+ case COLOR_TITLE:
+ title = value;
+ break;
}
}
@@ -213,13 +209,13 @@ Tk_ChooseColorObjCmd(
/* This doesn't seem to actually set the title! */
Tcl_UtfToExternal(NULL, NULL, title, -1, 0, NULL,
- StrBody(cpinfo.prompt), 255, &srcRead, &dstWrote, NULL);
+ StrBody(cpinfo.prompt), 255, &srcRead, &dstWrote, NULL);
StrLength(cpinfo.prompt) = (unsigned char) dstWrote;
if ((PickColor(&cpinfo) == noErr) && (cpinfo.newColorChosen != 0)) {
- in.red = cpinfo.theColor.color.rgb.red;
- in.green = cpinfo.theColor.color.rgb.green;
- in.blue = cpinfo.theColor.color.rgb.blue;
+ in.red = cpinfo.theColor.color.rgb.red;
+ in.green = cpinfo.theColor.color.rgb.green;
+ in.blue = cpinfo.theColor.color.rgb.blue;
picked = 1;
}
@@ -239,24 +235,24 @@ Tk_ChooseColorObjCmd(
*
* Tk_GetOpenFileObjCmd --
*
- * This procedure implements the "open file" dialog box for the
- * Mac platform. See the user documentation for details on what
- * it does.
+ * This procedure implements the "open file" dialog box for the Mac
+ * platform. See the user documentation for details on what it does.
*
* Results:
- * A standard Tcl result.
+ * A standard Tcl result.
*
* Side effects:
- * See user documentation.
+ * See user documentation.
+ *
*----------------------------------------------------------------------
*/
int
Tk_GetOpenFileObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
+ ClientData clientData, /* Main window associated with interpreter. */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
int i, result, multiple;
OpenFileData ofd;
@@ -268,16 +264,12 @@ Tk_GetOpenFileObjCmd(
AEDescList selectDesc = {typeNull, NULL};
char *initialFile = NULL, *initialDir = NULL;
static CONST char *openOptionStrings[] = {
- "-defaultextension", "-filetypes",
- "-initialdir", "-initialfile",
- "-message", "-multiple",
- "-parent", "-title", NULL
+ "-defaultextension", "-filetypes", "-initialdir", "-initialfile",
+ "-message", "-multiple", "-parent", "-title", NULL
};
enum openOptions {
- OPEN_DEFAULT, OPEN_FILETYPES,
- OPEN_INITDIR, OPEN_INITFILE,
- OPEN_MESSAGE, OPEN_MULTIPLE,
- OPEN_PARENT, OPEN_TITLE
+ OPEN_DEFAULT, OPEN_FILETYPES, OPEN_INITDIR, OPEN_INITFILE,
+ OPEN_MESSAGE, OPEN_MULTIPLE, OPEN_PARENT, OPEN_TITLE
};
if (!fileDlgInited) {
@@ -292,9 +284,9 @@ Tk_GetOpenFileObjCmd(
TkInitFileFilters(&ofd.fl);
- ofd.curType = 0;
- ofd.popupItem = OPEN_POPUP_ITEM;
- ofd.usePopup = 1;
+ ofd.curType = 0;
+ ofd.popupItem = OPEN_POPUP_ITEM;
+ ofd.usePopup = 1;
for (i = 1; i < objc; i += 2) {
char *choice;
@@ -315,55 +307,57 @@ Tk_GetOpenFileObjCmd(
}
switch (index) {
- case OPEN_DEFAULT:
- break;
- case OPEN_FILETYPES:
- if (TkGetFileFilters(interp, &ofd.fl, objv[i + 1], 0)
- != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_INITDIR:
- initialDir = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- /* empty strings should be like no selection given */
- if (choiceLen == 0) { initialDir = NULL; }
- break;
- case OPEN_INITFILE:
- initialFile = Tcl_GetStringFromObj(objv[i + 1], NULL);
- /* empty strings should be like no selection given */
- if (choiceLen == 0) { initialFile = NULL; }
- break;
- case OPEN_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- case OPEN_MULTIPLE:
- if (Tcl_GetBooleanFromObj(interp, objv[i + 1], &multiple)
- != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case OPEN_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
+ case OPEN_DEFAULT:
+ break;
+ case OPEN_FILETYPES:
+ if (TkGetFileFilters(interp, &ofd.fl, objv[i + 1], 0) != TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case OPEN_INITDIR:
+ initialDir = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ /* empty strings should be like no selection given */
+ if (choiceLen == 0) {
+ initialDir = NULL;
+ }
+ break;
+ case OPEN_INITFILE:
+ initialFile = Tcl_GetStringFromObj(objv[i + 1], NULL);
+ /* empty strings should be like no selection given */
+ if (choiceLen == 0) {
+ initialFile = NULL;
+ }
+ break;
+ case OPEN_MESSAGE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ message = CFStringCreateWithBytes(NULL, (unsigned char*) choice,
+ choiceLen, kCFStringEncodingUTF8, false);
+ break;
+ case OPEN_MULTIPLE:
+ if (Tcl_GetBooleanFromObj(interp, objv[i+1], &multiple)!=TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case OPEN_PARENT:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ parent = Tk_NameToWindow(interp, choice, parent);
+ if (parent == NULL) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case OPEN_TITLE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ title = CFStringCreateWithBytes(NULL, (unsigned char*) choice,
+ choiceLen, kCFStringEncodingUTF8, false);
+ break;
}
}
if (HandleInitialDirectory(interp, initialFile, initialDir, &dirRef,
- &selectDesc, &initialDesc) != TCL_OK) {
+ &selectDesc, &initialDesc) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
@@ -374,7 +368,7 @@ Tk_GetOpenFileObjCmd(
result = NavServicesGetFile(interp, &ofd, initialPtr,
NULL, &selectDesc, title, message, multiple, OPEN_FILE);
- end:
+ end:
TkFreeFileFilters(&ofd.fl);
AEDisposeDesc(&initialDesc);
AEDisposeDesc(&selectDesc);
@@ -420,12 +414,12 @@ Tk_GetSaveFileObjCmd(
CFStringRef title, message;
OpenFileData ofd;
static CONST char *saveOptionStrings[] = {
- "-defaultextension", "-filetypes", "-initialdir", "-initialfile",
- "-message", "-parent", "-title", NULL
+ "-defaultextension", "-filetypes", "-initialdir", "-initialfile",
+ "-message", "-parent", "-title", NULL
};
enum saveOptions {
- SAVE_DEFAULT, SAVE_FILETYPES, SAVE_INITDIR, SAVE_INITFILE,
- SAVE_MESSAGE, SAVE_PARENT, SAVE_TITLE
+ SAVE_DEFAULT, SAVE_FILETYPES, SAVE_INITDIR, SAVE_INITFILE,
+ SAVE_MESSAGE, SAVE_PARENT, SAVE_TITLE
};
if (!fileDlgInited) {
@@ -438,59 +432,59 @@ Tk_GetSaveFileObjCmd(
message = NULL;
for (i = 1; i < objc; i += 2) {
- char *choice;
+ char *choice, *string;
int index, choiceLen;
- char *string;
if (Tcl_GetIndexFromObj(interp, objv[i], saveOptionStrings, "option",
TCL_EXACT, &index) != TCL_OK) {
return TCL_ERROR;
}
if (i + 1 == objc) {
- string = Tcl_GetStringFromObj(objv[i], NULL);
+ string = Tcl_GetString(objv[i]);
Tcl_AppendResult(interp, "value for \"", string, "\" missing",
- (char *) NULL);
+ NULL);
return TCL_ERROR;
}
switch (index) {
- case SAVE_DEFAULT:
- break;
- case SAVE_FILETYPES:
- /* Currently unimplemented - what would we do here anyway? */
- break;
- case SAVE_INITDIR:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- /* empty strings should be like no selection given */
- if (choiceLen &&
- HandleInitialDirectory(interp, NULL, choice, &dirRef,
- NULL, &initialDesc) != TCL_OK) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case SAVE_INITFILE:
- initialFile = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- /* empty strings should be like no selection given */
- if (choiceLen == 0) { initialFile = NULL; }
- break;
- case SAVE_MESSAGE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
- case SAVE_PARENT:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- parent = Tk_NameToWindow(interp, choice, parent);
- if (parent == NULL) {
- result = TCL_ERROR;
- goto end;
- }
- break;
- case SAVE_TITLE:
- choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
- break;
+ case SAVE_DEFAULT:
+ break;
+ case SAVE_FILETYPES:
+ /* Currently unimplemented - what would we do here anyway? */
+ break;
+ case SAVE_INITDIR:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ /* empty strings should be like no selection given */
+ if (choiceLen && HandleInitialDirectory(interp, NULL, choice,
+ &dirRef, NULL, &initialDesc) != TCL_OK) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case SAVE_INITFILE:
+ initialFile = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ /* empty strings should be like no selection given */
+ if (choiceLen == 0) {
+ initialFile = NULL;
+ }
+ break;
+ case SAVE_MESSAGE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ message = CFStringCreateWithBytes(NULL, (unsigned char*) choice,
+ choiceLen, kCFStringEncodingUTF8, false);
+ break;
+ case SAVE_PARENT:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ parent = Tk_NameToWindow(interp, choice, parent);
+ if (parent == NULL) {
+ result = TCL_ERROR;
+ goto end;
+ }
+ break;
+ case SAVE_TITLE:
+ choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
+ title = CFStringCreateWithBytes(NULL, (unsigned char*) choice,
+ choiceLen, kCFStringEncodingUTF8, false);
+ break;
}
}
@@ -501,10 +495,9 @@ Tk_GetSaveFileObjCmd(
initialPtr = &initialDesc;
}
result = NavServicesGetFile(interp, &ofd, initialPtr, initialFile, NULL,
- title, message, false, SAVE_FILE);
-
- end:
+ title, message, false, SAVE_FILE);
+ end:
AEDisposeDesc(&initialDesc);
if (title != NULL) {
CFRelease(title);
@@ -521,26 +514,26 @@ Tk_GetSaveFileObjCmd(
*
* Tk_ChooseDirectoryObjCmd --
*
- * This procedure implements the "tk_chooseDirectory" dialog box
- * for the Windows platform. See the user documentation for details
- * on what it does.
+ * This procedure implements the "tk_chooseDirectory" dialog box for the
+ * Windows platform. See the user documentation for details on what it
+ * does.
*
* Results:
- * See user documentation.
+ * See user documentation.
*
* Side effects:
- * A modal dialog window is created. Tcl_SetServiceMode() is
- * called to allow background events to be processed
+ * A modal dialog window is created. Tcl_SetServiceMode() is called to
+ * allow background events to be processed
*
*----------------------------------------------------------------------
*/
int
-Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv)
- ClientData clientData; /* Main window associated with interpreter. */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
+Tk_ChooseDirectoryObjCmd(
+ ClientData clientData, /* Main window associated with interpreter. */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
int i, result;
Tk_Window parent;
@@ -596,8 +589,8 @@ Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv)
break;
case CHOOSE_MESSAGE:
choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- message = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
+ message = CFStringCreateWithBytes(NULL, (unsigned char*)choice,
+ choiceLen, kCFStringEncodingUTF8, false);
break;
case CHOOSE_PARENT:
choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
@@ -609,8 +602,8 @@ Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv)
break;
case CHOOSE_TITLE:
choice = Tcl_GetStringFromObj(objv[i + 1], &choiceLen);
- title = CFStringCreateWithBytes(NULL, (unsigned char*) choice, choiceLen,
- kCFStringEncodingUTF8, false);
+ title = CFStringCreateWithBytes(NULL, (unsigned char*) choice,
+ choiceLen, kCFStringEncodingUTF8, false);
break;
}
}
@@ -635,7 +628,7 @@ Tk_ChooseDirectoryObjCmd(clientData, interp, objc, objv)
return result;
}
-
+
int
HandleInitialDirectory (
Tcl_Interp *interp,
@@ -702,21 +695,21 @@ HandleInitialDirectory (
AEDisposeDesc(&fileDesc);
}
-end:
+ end:
if (dirName != NULL) {
Tcl_DStringFree(&ds);
}
return result;
}
-
+
static void
-InitFileDialogs()
+InitFileDialogs(void)
{
fileDlgInited = 1;
openFileFilterUPP = NewNavObjectFilterUPP(OpenFileFilterProc);
openFileEventUPP = NewNavEventUPP(OpenEventProc);
}
-
+
static int
NavServicesGetFile(
Tcl_Interp *interp,
@@ -738,13 +731,13 @@ NavServicesGetFile(
int result;
err = NavGetDefaultDialogCreationOptions(&diagOptions);
- if (err!=noErr) {
+ if (err != noErr) {
return TCL_ERROR;
}
diagOptions.location.h = -1;
diagOptions.location.v = -1;
diagOptions.optionFlags = kNavDontAutoTranslate
- + kNavDontAddTranslateItems;
+ + kNavDontAddTranslateItems;
if (multiple) {
diagOptions.optionFlags += kNavAllowMultipleFiles;
}
@@ -764,8 +757,8 @@ NavServicesGetFile(
int index = 0;
ofdPtr->curType = 0;
- menuItemNames = (CFStringRef *)ckalloc(ofdPtr->fl.numFilters
- * sizeof(CFStringRef));
+ menuItemNames = (CFStringRef *)
+ ckalloc(ofdPtr->fl.numFilters * sizeof(CFStringRef));
for (filterPtr = ofdPtr->fl.filters; filterPtr != NULL;
filterPtr = filterPtr->next, index++) {
@@ -780,13 +773,14 @@ NavServicesGetFile(
}
/*
- * This is required to allow App packages to be selectable in the
- * file dialogs...
+ * This is required to allow App packages to be selectable in the file
+ * dialogs...
*/
diagOptions.optionFlags += kNavSupportPackages;
- diagOptions.clientName = CFStringCreateWithCString(NULL, "Wish", kCFStringEncodingUTF8);
+ diagOptions.clientName = CFStringCreateWithCString(NULL, "Wish",
+ kCFStringEncodingUTF8);
diagOptions.message = message;
diagOptions.windowTitle = title;
if (initialFile) {
@@ -801,42 +795,25 @@ NavServicesGetFile(
diagOptions.preferenceKey = 0;
/*
- * Now process the selection list. We have to use the popupExtension
- * to fill the menu.
+ * Now process the selection list. We have to use the popupExtension to
+ * fill the menu.
*/
if (isOpen == OPEN_FILE) {
- err = NavCreateGetFileDialog(&diagOptions,
- NULL,
- openFileEventUPP,
- NULL,
- openFileFilterUPP,
- ofdPtr,
- &dialogRef);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavCreateGetFileDialog failed, %d\n", err);
-#endif
- dialogRef = NULL;
- }
+ err = NavCreateGetFileDialog(&diagOptions, NULL, openFileEventUPP,
+ NULL, openFileFilterUPP, ofdPtr, &dialogRef);
+ LOG_ON_ERROR(NavCreateGetFileDialog);
} else if (isOpen == SAVE_FILE) {
err = NavCreatePutFileDialog(&diagOptions, 'TEXT', 'WIsH',
openFileEventUPP, NULL, &dialogRef);
- if (err!=noErr){
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavCreatePutFileDialog failed, %d\n", err);
-#endif
- dialogRef = NULL;
- }
+ LOG_ON_ERROR(NavCreatePutFileDialog);
} else if (isOpen == CHOOSE_FOLDER) {
err = NavCreateChooseFolderDialog(&diagOptions, openFileEventUPP,
openFileFilterUPP, NULL, &dialogRef);
- if (err!=noErr){
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavCreateChooseFolderDialog failed, %d\n", err);
-#endif
- dialogRef = NULL;
- }
+ LOG_ON_ERROR(NavCreateChooseFolderDialog);
+ }
+ if (err != noErr) {
+ dialogRef = NULL;
}
if (dialogRef) {
@@ -848,16 +825,11 @@ NavServicesGetFile(
NavCustomControl(dialogRef, kNavCtlSetSelection, selectDescPtr);
}
- if ((err = NavDialogRun(dialogRef)) != noErr){
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavDialogRun failed, %d\n", err);
-#endif
- } else {
- if ((err = NavDialogGetReply(dialogRef, &theReply)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"NavGetReply failed, %d\n", err);
-#endif
- }
+ err = NavDialogRun(dialogRef);
+ LOG_ON_ERROR(NavDialogRun);
+ if (err == noErr) {
+ err = NavDialogGetReply(dialogRef, &theReply);
+ LOG_ON_ERROR(NavDialogGetReply);
}
}
@@ -878,68 +850,57 @@ NavServicesGetFile(
if (theReply.validRecord && err == noErr) {
AEDesc resultDesc;
long count;
- FSRef fsRef;
- char pathPtr[1024];
- int pathValid = 0;
+ FSRef fsRef;
+ char pathPtr[1024];
+ int pathValid = 0;
+
err = AECountItems(&theReply.selection, &count);
if (err == noErr) {
long i;
+
for (i = 1; i <= count; i++) {
- err = AEGetNthDesc(&theReply.selection,
- i, typeFSRef, NULL, &resultDesc);
+ err = AEGetNthDesc(&theReply.selection, i, typeFSRef, NULL,
+ &resultDesc);
pathValid = 0;
+ if (err != noErr) {
+ continue;
+ }
+ err = AEGetDescData(&resultDesc, &fsRef, sizeof(fsRef));
+ LOG_ON_ERROR(AEGetDescData);
if (err == noErr) {
- if ((err = AEGetDescData(&resultDesc, &fsRef, sizeof(fsRef)))
- != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"AEGetDescData failed %d\n", err);
-#endif
- } else {
- if ((err = FSRefMakePath(&fsRef, (unsigned char*) pathPtr, 1024))) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"FSRefMakePath failed, %d\n", err);
-#endif
- } else {
- if (isOpen == SAVE_FILE) {
- CFStringRef saveNameRef;
- char saveName [1024];
- if ((saveNameRef = NavDialogGetSaveFileName(dialogRef))) {
- if (CFStringGetCString(saveNameRef, saveName,
- 1024, kCFStringEncodingUTF8)) {
- if (strlen(pathPtr) + strlen(saveName) < 1023) {
- strcat(pathPtr, "/");
- strcat(pathPtr, saveName);
- pathValid = 1;
- } else {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "Path name too long\n");
-#endif
- }
- } else {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "CFStringGetCString failed\n");
-#endif
- }
- } else {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "NavDialogGetSaveFileName failed\n");
-#endif
- }
+ err = FSRefMakePath(&fsRef, (unsigned char*) pathPtr,
+ 1024);
+ LOG_ON_ERROR(FSRefMakePath);
+ if (err == noErr) {
+ if (isOpen == SAVE_FILE) {
+ CFStringRef saveNameRef;
+ char saveName[1024];
+
+ saveNameRef = NavDialogGetSaveFileName(dialogRef);
+ if (!saveNameRef) {
+ LOG_MSG("NavDialogGetSaveFileName failed");
+ } else if (!CFStringGetCString(saveNameRef,
+ saveName, 1024, kCFStringEncodingUTF8)) {
+ LOG_MSG("CFStringGetCString failed");
+ } else if (strlen(pathPtr)+strlen(saveName)<1023){
+ strcat(pathPtr, "/");
+ strcat(pathPtr, saveName);
+ goto pathValid;
} else {
- pathValid = 1;
- }
- if (pathValid) {
- if (multiple) {
- Tcl_ListObjAppendElement(interp, theResult,
- Tcl_NewStringObj(pathPtr, -1));
- } else {
- Tcl_SetStringObj(theResult, pathPtr, -1);
- }
+ LOG_MSG("Path name too long");
}
}
+ } else {
+ pathValid:
+ if (multiple) {
+ Tcl_ListObjAppendElement(interp, theResult,
+ Tcl_NewStringObj(pathPtr, -1));
+ } else {
+ Tcl_SetStringObj(theResult, pathPtr, -1);
+ }
}
- AEDisposeDesc(&resultDesc);
}
+ AEDisposeDesc(&resultDesc);
}
}
err = NavDisposeReply(&theReply);
@@ -968,12 +929,14 @@ NavServicesGetFile(
if (diagOptions.clientName) {
CFRelease(diagOptions.clientName);
}
+
/*
* dispose of the CFArray diagOptions.popupExtension
*/
if (menuItemNames) {
int i;
+
for (i = 0;i < ofdPtr->fl.numFilters; i++) {
CFRelease(menuItemNames[i]);
}
@@ -985,10 +948,11 @@ NavServicesGetFile(
return result;
}
-
+
static pascal Boolean
OpenFileFilterProc(
- AEDesc* theItem, void* info,
+ AEDesc *theItem,
+ void *info,
NavCallBackUserData callBackUD,
NavFilterModes filterMode)
{
@@ -996,94 +960,86 @@ OpenFileFilterProc(
if (!ofdPtr || !ofdPtr->usePopup) {
return true;
- } else {
- if (ofdPtr->fl.numFilters == 0) {
- return true;
- } else {
- if ((theItem->descriptorType == typeFSS)
- || (theItem->descriptorType = typeFSRef)) {
- NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo *) info;
- char fileName[256];
- int result;
-
- if (!theInfo->isFolder) {
- OSType fileType;
- StringPtr fileNamePtr;
- Tcl_DString fileNameDString;
- int i;
- FileFilter *filterPtr;
-
- fileType =
- theInfo->fileAndFolder.fileInfo.finderInfo.fdType;
- Tcl_DStringInit (&fileNameDString);
-
- if (theItem->descriptorType == typeFSS) {
- int len;
- fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name);
- len = fileNamePtr[0];
- strncpy(fileName, (char*) fileNamePtr + 1, len);
- fileName[len] = '\0';
- fileNamePtr = (unsigned char*) fileName;
-
- } else if ((theItem->descriptorType = typeFSRef)) {
- OSStatus err;
- FSRef *theRef = (FSRef *) *theItem->dataHandle;
- HFSUniStr255 uniFileName;
- err = FSGetCatalogInfo (theRef, kFSCatInfoNone, NULL,
- &uniFileName, NULL, NULL);
-
- if (err == noErr) {
- Tcl_UniCharToUtfDString (
- (Tcl_UniChar *) uniFileName.unicode,
- uniFileName.length,
- &fileNameDString);
- fileNamePtr = (unsigned char*) Tcl_DStringValue(&fileNameDString);
- } else {
- fileNamePtr = NULL;
- }
- }
- if (ofdPtr->usePopup) {
- i = ofdPtr->curType;
- for (filterPtr = ofdPtr->fl.filters;
- filterPtr && i > 0; i--) {
- filterPtr = filterPtr->next;
- }
- if (filterPtr) {
- result = MatchOneType(fileNamePtr, fileType,
- ofdPtr, filterPtr);
- } else {
- result = false;
- }
- } else {
- /*
- * We are not using the popup menu. In this case, the
- * file is considered matched if it matches any of
- * the file filters.
- */
-
- result = UNMATCHED;
- for (filterPtr = ofdPtr->fl.filters; filterPtr;
- filterPtr = filterPtr->next) {
- if (MatchOneType(fileNamePtr, fileType,
- ofdPtr, filterPtr) == MATCHED) {
- result = MATCHED;
- break;
- }
- }
- }
+ }
+
+ if (ofdPtr->fl.numFilters == 0) {
+ return true;
+ }
+
+ if ((theItem->descriptorType == typeFSS)
+ || (theItem->descriptorType = typeFSRef)) {
+ NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo *) info;
+ char fileName[256];
+ int result, i, len;
+ OSType fileType;
+ StringPtr fileNamePtr;
+ Tcl_DString fileNameDString;
+ FileFilter *filterPtr;
- Tcl_DStringFree (&fileNameDString);
- return (result == MATCHED);
+ if (!theInfo->isFolder) {
+ fileType = theInfo->fileAndFolder.fileInfo.finderInfo.fdType;
+ Tcl_DStringInit(&fileNameDString);
+
+ if (theItem->descriptorType == typeFSS) {
+ fileNamePtr = (((FSSpec *) *theItem->dataHandle)->name);
+ len = fileNamePtr[0];
+ strncpy(fileName, (char*) fileNamePtr + 1, len);
+ fileName[len] = '\0';
+ fileNamePtr = (unsigned char*) fileName;
+ } else if ((theItem->descriptorType = typeFSRef)) {
+ OSStatus err;
+ FSRef *theRef = (FSRef *) *theItem->dataHandle;
+ HFSUniStr255 uniFileName;
+
+ err = FSGetCatalogInfo(theRef, kFSCatInfoNone, NULL,
+ &uniFileName, NULL, NULL);
+
+ if (err == noErr) {
+ Tcl_UniCharToUtfDString(
+ (Tcl_UniChar *) uniFileName.unicode,
+ uniFileName.length, &fileNameDString);
+ fileNamePtr = (unsigned char *)
+ Tcl_DStringValue(&fileNameDString);
} else {
- return true;
+ fileNamePtr = NULL;
}
}
- }
+ if (ofdPtr->usePopup) {
+ i = ofdPtr->curType;
+ for (filterPtr=ofdPtr->fl.filters ; filterPtr && i>0 ; i--) {
+ filterPtr = filterPtr->next;
+ }
+ if (filterPtr) {
+ result = MatchOneType(fileNamePtr, fileType, ofdPtr,
+ filterPtr);
+ } else {
+ result = UNMATCHED;
+ }
+ } else {
+ /*
+ * We are not using the popup menu. In this case, the file is
+ * considered matched if it matches any of the file filters.
+ */
- return true;
+ result = UNMATCHED;
+ for (filterPtr = ofdPtr->fl.filters; filterPtr;
+ filterPtr = filterPtr->next) {
+ if (MatchOneType(fileNamePtr, fileType,
+ ofdPtr, filterPtr) == MATCHED) {
+ result = MATCHED;
+ break;
+ }
+ }
+ }
+
+ Tcl_DStringFree(&fileNameDString);
+ return (result == MATCHED);
+ }
}
-}
+ return true;
+}
+
pascal void
OpenEventProc(
NavEventCallbackMessage callBackSelector,
@@ -1097,12 +1053,12 @@ OpenEventProc(
|kNavCBCancel|kNavCBAdjustPreview);
if (callBackSelector == kNavCBPopupMenuSelect) {
- chosenItem = (NavMenuItemSpec *) callBackParams->eventData.eventDataParms.param;
+ chosenItem = (NavMenuItemSpec *)
+ callBackParams->eventData.eventDataParms.param;
ofd->curType = chosenItem->menuType;
} else if (callBackSelector == kNavCBAdjustRect
|| (callBackSelector & otherEvent) != 0) {
- while (Tcl_DoOneEvent(TCL_IDLE_EVENTS
- | TCL_DONT_WAIT
+ while (Tcl_DoOneEvent(TCL_IDLE_EVENTS | TCL_DONT_WAIT
| TCL_WINDOW_EVENTS)) {
/* Empty Body */
}
@@ -1114,51 +1070,52 @@ OpenEventProc(
*
* MatchOneType --
*
- * Match a file with one file type in the list of file types.
+ * Match a file with one file type in the list of file types.
*
* Results:
- * Returns MATCHED if the file matches with the file type; returns
- * UNMATCHED otherwise.
+ * Returns MATCHED if the file matches with the file type; returns
+ * UNMATCHED otherwise.
*
* Side effects:
- * None
+ * None
*
*----------------------------------------------------------------------
*/
static Boolean
MatchOneType(
- StringPtr fileNamePtr, /* Name of the file */
- OSType fileType, /* Type of the file, 0 means there was no specified type. */
- OpenFileData * ofdPtr, /* Information about this file dialog */
- FileFilter * filterPtr) /* Match the file described by pb against
- * this filter */
+ StringPtr fileNamePtr, /* Name of the file */
+ OSType fileType, /* Type of the file, 0 means there was no
+ * specified type. */
+ OpenFileData *ofdPtr, /* Information about this file dialog */
+ FileFilter *filterPtr) /* Match the file described by pb against this
+ * filter */
{
- FileFilterClause * clausePtr;
+ FileFilterClause *clausePtr;
/*
- * A file matches with a file type if it matches with at least one
- * clause of the type.
+ * A file matches with a file type if it matches with at least one clause
+ * of the type.
*
- * If the clause has both glob patterns and ostypes, the file must
- * match with at least one pattern AND at least one ostype.
+ * If the clause has both glob patterns and ostypes, the file must match
+ * with at least one pattern AND at least one ostype.
*
* If the clause has glob patterns only, the file must match with at least
* one pattern.
*
- * If the clause has mac types only, the file must match with at least
- * one mac type.
+ * If the clause has mac types only, the file must match with at least one
+ * mac type.
*
- * If the clause has neither glob patterns nor mac types, it's
- * considered an error.
+ * If the clause has neither glob patterns nor mac types, it's considered
+ * an error.
*/
for (clausePtr = filterPtr->clauses; clausePtr;
clausePtr = clausePtr->next) {
- int macMatched = 0;
+ int macMatched = 0;
int globMatched = 0;
- GlobPattern * globPtr;
- MacFileType * mfPtr;
+ GlobPattern *globPtr;
+ MacFileType *mfPtr;
if (clausePtr->patterns == NULL) {
globMatched = 1;
@@ -1196,10 +1153,10 @@ MatchOneType(
goto glob_unmatched;
}
- glob_unmatched:
+ glob_unmatched:
continue;
- glob_matched:
+ glob_matched:
globMatched = 1;
break;
}
@@ -1212,13 +1169,12 @@ MatchOneType(
}
/*
- * On Mac OS X, it is not uncommon for files to have NO
- * file type. But folks with Tcl code on Classic MacOS pretty
- * much assume that a generic file will have type TEXT. So
- * if we were strict about matching types when the source file
- * had NO type set, they would have to add another rule always
- * with no fileType. To avoid that, we pass the macMatch side
- * of the test if no fileType is set.
+ * On Mac OS X, it is not uncommon for files to have NO file type.
+ * But folks with Tcl code on Classic MacOS pretty much assume that a
+ * generic file will have type TEXT. So if we were strict about
+ * matching types when the source file had NO type set, they would
+ * have to add another rule always with no fileType. To avoid that, we
+ * pass the macMatch side of the test if no fileType is set.
*/
if (globMatched && (macMatched || (fileType == 0))) {
@@ -1228,26 +1184,26 @@ MatchOneType(
return UNMATCHED;
}
-
+
/*
*----------------------------------------------------------------------
*
* TkAboutDlg --
*
- * Displays the default Tk About box. This code uses Macintosh
- * resources to define the content of the About Box.
+ * Displays the default Tk About box. This code uses Macintosh resources
+ * to define the content of the About Box.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
void
-TkAboutDlg()
+TkAboutDlg(void)
{
DialogPtr aboutDlog;
WindowRef windowRef;
@@ -1272,95 +1228,83 @@ TkAboutDlg()
return;
}
-
+
/*
*----------------------------------------------------------------------
*
* Tk_MessageBoxObjCmd --
*
- * Implements the tk_messageBox in native Mac OS X style.
+ * Implements the tk_messageBox in native Mac OS X style.
*
* Results:
- * A standard Tcl result.
+ * A standard Tcl result.
*
* Side effects:
- * none
+ * none
*
*----------------------------------------------------------------------
*/
int
Tk_MessageBoxObjCmd(
- ClientData clientData, /* Main window associated with interpreter. */
- Tcl_Interp *interp, /* Current interpreter. */
- int objc, /* Number of arguments. */
- Tcl_Obj *CONST objv[]) /* Argument objects. */
+ ClientData clientData, /* Main window associated with interpreter. */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
- Tk_Window tkwin = (Tk_Window) clientData;
+ Tk_Window tkwin = (Tk_Window) clientData;
AlertStdCFStringAlertParamRec paramCFStringRec;
- AlertType alertType;
- DialogRef dialogRef;
- CFStringRef messageTextCF = NULL;
- CFStringRef finemessageTextCF = NULL;
- OSErr osError;
- SInt16 itemHit;
- Boolean haveDefaultOption = false;
- Boolean haveParentOption = false;
- char *str;
- int index;
- int defaultButtonIndex;
- int defaultNativeButtonIndex; /* 1, 2, 3: right to left. */
- int typeIndex;
- int i;
- int indexDefaultOption = 0;
- int result = TCL_OK;
+ AlertType alertType;
+ DialogRef dialogRef;
+ CFStringRef messageTextCF = NULL;
+ CFStringRef finemessageTextCF = NULL;
+ OSErr osError;
+ SInt16 itemHit;
+ Boolean haveDefaultOption = false, haveParentOption = false;
+ char *str;
+ int defaultButtonIndex;
+ int defaultNativeButtonIndex; /* 1, 2, 3: right to left. */
+ int index, typeIndex, i;
+ int indexDefaultOption = 0;
+ int result = TCL_OK;
static CONST char *movableAlertStrings[] = {
- "-default", "-detail", "-icon",
- "-message", "-parent",
- "-title", "-type",
- (char *)NULL
+ "-default", "-detail", "-icon", "-message", "-parent", "-title",
+ "-type", NULL
};
static CONST char *movableTypeStrings[] = {
- "abortretryignore", "ok",
- "okcancel", "retrycancel",
- "yesno", "yesnocancel",
- (char *)NULL
+ "abortretryignore", "ok", "okcancel", "retrycancel", "yesno",
+ "yesnocancel", NULL
};
static CONST char *movableButtonStrings[] = {
- "abort", "retry", "ignore",
- "ok", "cancel", "yes", "no",
- (char *)NULL
+ "abort", "retry", "ignore", "ok", "cancel", "yes", "no", NULL
};
static CONST char *movableIconStrings[] = {
- "error", "info", "question", "warning",
- (char *)NULL
+ "error", "info", "question", "warning", NULL
};
enum movableAlertOptions {
- ALERT_DEFAULT, ALERT_DETAIL, ALERT_ICON,
- ALERT_MESSAGE, ALERT_PARENT,
+ ALERT_DEFAULT, ALERT_DETAIL, ALERT_ICON, ALERT_MESSAGE, ALERT_PARENT,
ALERT_TITLE, ALERT_TYPE
};
enum movableTypeOptions {
- TYPE_ABORTRETRYIGNORE, TYPE_OK,
- TYPE_OKCANCEL, TYPE_RETRYCANCEL,
+ TYPE_ABORTRETRYIGNORE, TYPE_OK, TYPE_OKCANCEL, TYPE_RETRYCANCEL,
TYPE_YESNO, TYPE_YESNOCANCEL
};
enum movableButtonOptions {
- TEXT_ABORT, TEXT_RETRY, TEXT_IGNORE,
- TEXT_OK, TEXT_CANCEL, TEXT_YES, TEXT_NO
+ TEXT_ABORT, TEXT_RETRY, TEXT_IGNORE, TEXT_OK, TEXT_CANCEL, TEXT_YES,
+ TEXT_NO
};
enum movableIconOptions {
ICON_ERROR, ICON_INFO, ICON_QUESTION, ICON_WARNING
};
/*
- * Need to map from 'movableButtonStrings' and its corresponding integer index,
- * to the native button index, which is 1, 2, 3, from right to left.
- * This is necessary to do for each separate '-type' of button sets.
+ * Need to map from 'movableButtonStrings' and its corresponding integer
+ * index, to the native button index, which is 1, 2, 3, from right to
+ * left. This is necessary to do for each separate '-type' of button sets.
*/
- short buttonIndexAndTypeToNativeButtonIndex[][7] = {
+ short buttonIndexAndTypeToNativeButtonIndex[][7] = {
/* abort retry ignore ok cancel yes no */
{1, 2, 3, 0, 0, 0, 0}, /* abortretryignore */
{0, 0, 0, 1, 0, 0, 0}, /* ok */
@@ -1375,7 +1319,7 @@ Tk_MessageBoxObjCmd(
* descriptive button text string index.
*/
- short nativeButtonIndexAndTypeToButtonIndex[][4] = {
+ short nativeButtonIndexAndTypeToButtonIndex[][4] = {
{-1, 0, 1, 2}, /* abortretryignore */
{-1, 3, 0, 0}, /* ok */
{-1, 3, 4, 0}, /* okcancel */
@@ -1387,76 +1331,77 @@ Tk_MessageBoxObjCmd(
alertType = kAlertPlainAlert;
typeIndex = TYPE_OK;
- GetStandardAlertDefaultParams(&paramCFStringRec, kStdCFStringAlertVersionOne);
+ GetStandardAlertDefaultParams(&paramCFStringRec,
+ kStdCFStringAlertVersionOne);
paramCFStringRec.movable = true;
paramCFStringRec.helpButton = false;
paramCFStringRec.defaultButton = kAlertStdAlertOKButton;
paramCFStringRec.cancelButton = kAlertStdAlertCancelButton;
for (i = 1; i < objc; i += 2) {
- int iconIndex;
- char *string;
+ int iconIndex;
+ char *string;
if (Tcl_GetIndexFromObj(interp, objv[i], movableAlertStrings, "option",
- TCL_EXACT, &index) != TCL_OK) {
+ TCL_EXACT, &index) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
if (i + 1 == objc) {
string = Tcl_GetStringFromObj(objv[i], NULL);
Tcl_AppendResult(interp, "value for \"", string, "\" missing",
- (char *) NULL);
+ NULL);
result = TCL_ERROR;
goto end;
}
switch (index) {
-
- case ALERT_DEFAULT:
-
+ case ALERT_DEFAULT:
/*
- * Need to postpone processing of this option until we are
- * sure to know the '-type' as well.
+ * Need to postpone processing of this option until we are sure to
+ * know the '-type' as well.
*/
haveDefaultOption = true;
indexDefaultOption = i;
break;
- case ALERT_DETAIL:
+ case ALERT_DETAIL:
str = Tcl_GetStringFromObj(objv[i + 1], NULL);
- finemessageTextCF = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
+ finemessageTextCF = CFStringCreateWithCString(NULL, str,
+ kCFStringEncodingUTF8);
break;
- case ALERT_ICON:
- /* not sure about UTF translation here... */
+ case ALERT_ICON:
+ /* not sure about UTF translation here... */
if (Tcl_GetIndexFromObj(interp, objv[i + 1], movableIconStrings,
- "value", TCL_EXACT, &iconIndex) != TCL_OK) {
+ "value", TCL_EXACT, &iconIndex) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
switch (iconIndex) {
- case ICON_ERROR:
+ case ICON_ERROR:
alertType = kAlertStopAlert;
break;
- case ICON_INFO:
+ case ICON_INFO:
alertType = kAlertNoteAlert;
break;
- case ICON_QUESTION:
+ case ICON_QUESTION:
alertType = kAlertCautionAlert;
break;
- case ICON_WARNING:
+ case ICON_WARNING:
alertType = kAlertCautionAlert;
break;
}
break;
- case ALERT_MESSAGE:
+ case ALERT_MESSAGE:
str = Tcl_GetStringFromObj(objv[i + 1], NULL);
- messageTextCF = CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8);
+ messageTextCF = CFStringCreateWithCString(NULL, str,
+ kCFStringEncodingUTF8);
break;
- case ALERT_PARENT:
+ case ALERT_PARENT:
str = Tcl_GetStringFromObj(objv[i + 1], NULL);
tkwin = Tk_NameToWindow(interp, str, tkwin);
if (tkwin == NULL) {
@@ -1466,39 +1411,39 @@ Tk_MessageBoxObjCmd(
haveParentOption = true;
break;
- case ALERT_TITLE:
+ case ALERT_TITLE:
break;
- case ALERT_TYPE:
- /* not sure about UTF translation here... */
+ case ALERT_TYPE:
+ /* not sure about UTF translation here... */
if (Tcl_GetIndexFromObj(interp, objv[i + 1], movableTypeStrings,
- "value", TCL_EXACT, &typeIndex) != TCL_OK) {
+ "value", TCL_EXACT, &typeIndex) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
switch (typeIndex) {
- case TYPE_ABORTRETRYIGNORE:
+ case TYPE_ABORTRETRYIGNORE:
paramCFStringRec.defaultText = CFSTR("Abort");
paramCFStringRec.cancelText = CFSTR("Retry");
paramCFStringRec.otherText = CFSTR("Ignore");
paramCFStringRec.cancelButton = kAlertStdAlertOtherButton;
break;
- case TYPE_OK:
+ case TYPE_OK:
paramCFStringRec.defaultText = CFSTR("OK");
break;
- case TYPE_OKCANCEL:
+ case TYPE_OKCANCEL:
paramCFStringRec.defaultText = CFSTR("OK");
paramCFStringRec.cancelText = CFSTR("Cancel");
break;
- case TYPE_RETRYCANCEL:
+ case TYPE_RETRYCANCEL:
paramCFStringRec.defaultText = CFSTR("Retry");
paramCFStringRec.cancelText = CFSTR("Cancel");
break;
- case TYPE_YESNO:
+ case TYPE_YESNO:
paramCFStringRec.defaultText = CFSTR("Yes");
paramCFStringRec.cancelText = CFSTR("No");
break;
- case TYPE_YESNOCANCEL:
+ case TYPE_YESNOCANCEL:
paramCFStringRec.defaultText = CFSTR("Yes");
paramCFStringRec.cancelText = CFSTR("No");
paramCFStringRec.otherText = CFSTR("Cancel");
@@ -1512,25 +1457,27 @@ Tk_MessageBoxObjCmd(
if (haveDefaultOption) {
/*
- * Any '-default' option needs to know the '-type' option, which is why
- * we do this here.
+ * Any '-default' option needs to know the '-type' option, which is
+ * why we do this here.
*/
str = Tcl_GetStringFromObj(objv[indexDefaultOption + 1], NULL);
if (Tcl_GetIndexFromObj(interp, objv[indexDefaultOption + 1],
- movableButtonStrings, "value", TCL_EXACT,
- &defaultButtonIndex) != TCL_OK) {
+ movableButtonStrings, "value", TCL_EXACT,
+ &defaultButtonIndex) != TCL_OK) {
result = TCL_ERROR;
goto end;
}
- /* Need to map from "ok" etc. to 1, 2, 3, right to left. */
+ /*
+ * Need to map from "ok" etc. to 1, 2, 3, right to left.
+ */
defaultNativeButtonIndex =
buttonIndexAndTypeToNativeButtonIndex[typeIndex][defaultButtonIndex];
if (defaultNativeButtonIndex == 0) {
Tcl_SetObjResult(interp,
- Tcl_NewStringObj("Illegal default option", -1));
+ Tcl_NewStringObj("Illegal default option", -1));
result = TCL_ERROR;
goto end;
}
@@ -1542,11 +1489,11 @@ Tk_MessageBoxObjCmd(
SetThemeCursor(kThemeArrowCursor);
if (haveParentOption) {
- TkWindow *winPtr;
- WindowRef windowRef;
- EventTargetRef notifyTarget;
- EventHandlerUPP handler;
- CallbackUserData data;
+ TkWindow *winPtr;
+ WindowRef windowRef;
+ EventTargetRef notifyTarget;
+ EventHandlerUPP handler;
+ CallbackUserData data;
const EventTypeSpec kEvents[] = {
{kEventClassCommand, kEventProcessCommand}
};
@@ -1558,12 +1505,12 @@ Tk_MessageBoxObjCmd(
*/
windowRef = GetWindowFromPort(
- TkMacOSXGetDrawablePort(Tk_WindowId(tkwin)));
+ TkMacOSXGetDrawablePort(Tk_WindowId(tkwin)));
notifyTarget = GetWindowEventTarget(windowRef);
osError = CreateStandardSheet(alertType, messageTextCF,
- finemessageTextCF, &paramCFStringRec,
- notifyTarget, &dialogRef);
- if(osError != noErr) {
+ finemessageTextCF, &paramCFStringRec, notifyTarget,
+ &dialogRef);
+ if (osError != noErr) {
result = TCL_ERROR;
goto end;
}
@@ -1571,8 +1518,7 @@ Tk_MessageBoxObjCmd(
data.buttonIndex = 1;
handler = NewEventHandlerUPP(AlertHandler);
InstallEventHandler(notifyTarget, handler,
- GetEventTypeCount(kEvents),
- kEvents, &data, NULL);
+ GetEventTypeCount(kEvents), kEvents, &data, NULL);
osError = ShowSheetWindow(GetDialogWindow(dialogRef), windowRef);
if(osError != noErr) {
result = TCL_ERROR;
@@ -1587,8 +1533,8 @@ Tk_MessageBoxObjCmd(
DisposeEventHandlerUPP(handler);
} else {
osError = CreateStandardAlert(alertType, messageTextCF,
- finemessageTextCF, &paramCFStringRec, &dialogRef);
- if(osError != noErr) {
+ finemessageTextCF, &paramCFStringRec, &dialogRef);
+ if (osError != noErr) {
result = TCL_ERROR;
goto end;
}
@@ -1598,8 +1544,8 @@ Tk_MessageBoxObjCmd(
goto end;
}
}
- if(osError == noErr) {
- int ind;
+ if (osError == noErr) {
+ int ind;
/*
* Map 'itemHit' (1, 2, 3) to descriptive text string.
@@ -1607,12 +1553,12 @@ Tk_MessageBoxObjCmd(
ind = nativeButtonIndexAndTypeToButtonIndex[typeIndex][itemHit];
Tcl_SetObjResult(interp,
- Tcl_NewStringObj(movableButtonStrings[ind], -1));
+ Tcl_NewStringObj(movableButtonStrings[ind], -1));
} else {
result = TCL_ERROR;
}
- end:
+ end:
if (finemessageTextCF != NULL) {
CFRelease(finemessageTextCF);
}
@@ -1621,7 +1567,7 @@ Tk_MessageBoxObjCmd(
}
return result;
}
-
+
/*
*----------------------------------------------------------------------
*
@@ -1639,24 +1585,27 @@ Tk_MessageBoxObjCmd(
*/
static OSStatus
-AlertHandler(EventHandlerCallRef callRef, EventRef eventRef, void *userData)
+AlertHandler(
+ EventHandlerCallRef callRef,
+ EventRef eventRef,
+ void *userData)
{
- OSStatus result = eventNotHandledErr;
- HICommand cmd;
- CallbackUserData *dataPtr = (CallbackUserData *) userData;
+ OSStatus result = eventNotHandledErr;
+ HICommand cmd;
+ CallbackUserData *dataPtr = (CallbackUserData *) userData;
GetEventParameter(eventRef, kEventParamDirectObject, typeHICommand,
- NULL, sizeof(cmd), NULL, &cmd);
+ NULL, sizeof(cmd), NULL, &cmd);
switch (cmd.commandID) {
- case kHICommandOK:
+ case kHICommandOK:
dataPtr->buttonIndex = 1;
result = noErr;
break;
- case kHICommandCancel:
+ case kHICommandCancel:
dataPtr->buttonIndex = 2;
result = noErr;
break;
- case kHICommandOther:
+ case kHICommandOther:
dataPtr->buttonIndex = 3;
result = noErr;
break;
diff --git a/macosx/tkMacOSXDraw.c b/macosx/tkMacOSXDraw.c
index 06a52a2..f4b8600 100644
--- a/macosx/tkMacOSXDraw.c
+++ b/macosx/tkMacOSXDraw.c
@@ -1,18 +1,17 @@
-/*
+/*
* tkMacOSXDraw.c --
*
- * This file contains functions that perform drawing to
- * Xlib windows. Most of the functions simple emulate
- * Xlib functions.
+ * This file contains functions that perform drawing to Xlib windows.
+ * Most of the functions simple emulate Xlib functions.
*
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
* Copyright (c) 2006 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.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXDraw.c,v 1.18 2006/10/16 16:25:38 das Exp $
+ * RCS: @(#) $Id: tkMacOSXDraw.c,v 1.19 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -24,15 +23,17 @@
#endif
*/
-#define RGBFLOATRED(c) ((c).red / 65535.0)
+#define RGBFLOATRED(c) ((c).red / 65535.0)
#define RGBFLOATGREEN(c) ((c).green / 65535.0)
-#define RGBFLOATBLUE(c) ((c).blue / 65535.0)
-#define radians(d) ((d) * (M_PI/180.0))
+#define RGBFLOATBLUE(c) ((c).blue / 65535.0)
+#define radians(d) ((d) * (M_PI/180.0))
/*
- * Non-antialiased CG drawing looks better and more like X11 drawing when using
- * very fine lines, so decrease all linewidths by the following constant.
+ * Non-antialiased CG drawing looks better and more like X11 drawing when
+ * using very fine lines, so decrease all linewidths by the following
+ * constant.
*/
+
#define NON_AA_CG_OFFSET .999
/*
@@ -53,33 +54,35 @@ static int useThemedFrame = 0;
/*
* Prototypes for functions used only in this file.
*/
-static unsigned char InvertByte(unsigned char data);
-static void TkMacOSXSetUpCGContext(MacDrawable *macWin, CGrafPtr destPort,
- GC gc, CGContextRef *contextPtr);
-static void TkMacOSXReleaseCGContext(MacDrawable *macWin, CGrafPtr destPort,
- CGContextRef *context);
+
+static unsigned char InvertByte(unsigned char data);
+static void TkMacOSXSetUpCGContext(MacDrawable *macWin,
+ CGrafPtr destPort, GC gc,
+ CGContextRef *contextPtr);
+static void TkMacOSXReleaseCGContext(MacDrawable *macWin,
+ CGrafPtr destPort, CGContextRef *context);
/*
*----------------------------------------------------------------------
*
* TkMacOSXInitCGDrawing --
*
- * Initializes link vars that control CG drawing.
+ * Initializes link vars that control CG drawing.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE int
-TkMacOSXInitCGDrawing(interp, enable, limit)
- Tcl_Interp *interp;
- int enable;
- int limit;
+TkMacOSXInitCGDrawing(
+ Tcl_Interp *interp,
+ int enable,
+ int limit)
{
static Boolean initialized = FALSE;
@@ -104,12 +107,13 @@ TkMacOSXInitCGDrawing(interp, enable, limit)
/*
* Piggy-back the themed drawing var init here.
*/
+
if (Tcl_LinkVar(interp, "::tk::mac::useThemedToplevel",
- (char *) &useThemedToplevel, TCL_LINK_BOOLEAN) != TCL_OK) {
+ (char *) &useThemedToplevel, TCL_LINK_BOOLEAN) != TCL_OK) {
Tcl_ResetResult(interp);
}
if (Tcl_LinkVar(interp, "::tk::mac::useThemedFrame",
- (char *) &useThemedFrame, TCL_LINK_BOOLEAN) != TCL_OK) {
+ (char *) &useThemedFrame, TCL_LINK_BOOLEAN) != TCL_OK) {
Tcl_ResetResult(interp);
}
}
@@ -121,36 +125,35 @@ TkMacOSXInitCGDrawing(interp, enable, limit)
*
* XCopyArea --
*
- * Copies data from one drawable to another using block transfer
- * routines.
+ * Copies data from one drawable to another using block transfer
+ * routines.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Data is moved from a window or bitmap to a second window or
- * bitmap.
+ * Data is moved from a window or bitmap to a second window or bitmap.
*
*----------------------------------------------------------------------
*/
void
XCopyArea(
- Display* display, /* Display. */
- Drawable src, /* Source drawable. */
- Drawable dst, /* Destination drawable. */
- GC gc, /* GC to use. */
- int src_x, /* X & Y, width & height */
- int src_y, /* define the source rectangle */
- unsigned int width, /* the will be copied. */
+ Display *display, /* Display. */
+ Drawable src, /* Source drawable. */
+ Drawable dst, /* Destination drawable. */
+ GC gc, /* GC to use. */
+ int src_x, /* X & Y, width & height */
+ int src_y, /* define the source rectangle */
+ unsigned int width, /* the will be copied. */
unsigned int height,
- int dest_x, /* Dest X & Y on dest rect. */
+ int dest_x, /* Dest X & Y on dest rect. */
int dest_y)
{
Rect srcRect, dstRect;
- Rect * srcPtr, * dstPtr;
- const BitMap * srcBit;
- const BitMap * dstBit;
+ Rect *srcPtr, *dstPtr;
+ const BitMap *srcBit;
+ const BitMap *dstBit;
MacDrawable *srcDraw = (MacDrawable *) src;
MacDrawable *dstDraw = (MacDrawable *) dst;
CGrafPtr srcPort, dstPort;
@@ -195,20 +198,20 @@ XCopyArea(
(short) (dstDraw->yOff + dest_y + height));
}
TkMacOSXSetUpClippingRgn(dst);
+
/*
- * We will change the clip rgn in this routine, so we need to
- * be able to restore it when we exit.
+ * We will change the clip rgn in this routine, so we need to be able to
+ * restore it when we exit.
*/
GetClip(tmpRgn2);
if (tkPictureIsOpen) {
/*
- * When rendering into a picture, after a call to "OpenCPicture"
- * the clipping is seriously WRONG and also INCONSISTENT with the
- * clipping for single plane bitmaps.
- * To circumvent this problem, we clip to the whole window
- * In this case, would have also clipped to the srcRect
- * ClipRect(&srcRect);
+ * When rendering into a picture, after a call to "OpenCPicture" the
+ * clipping is seriously WRONG and also INCONSISTENT with the clipping
+ * for single plane bitmaps. To circumvent this problem, we clip to
+ * the whole window In this case, would have also clipped to the
+ * srcRect ClipRect(&srcRect);
*/
GetPortBounds(dstPort,&clpRect);
@@ -216,11 +219,12 @@ XCopyArea(
ClipRect(&clpRect);
}
if (!gc->clip_mask) {
+ /* do nothing */
} else if (((TkpClipMask*)gc->clip_mask)->type == TKP_CLIP_REGION) {
RgnHandle clipRgn = (RgnHandle)
((TkpClipMask*)gc->clip_mask)->value.region;
-
int xOffset = 0, yOffset = 0;
+
if (tmpRgn == NULL) {
tmpRgn = NewRgn();
}
@@ -252,39 +256,33 @@ XCopyArea(
*
* XCopyPlane --
*
- * Copies a bitmap from a source drawable to a destination
- * drawable. The plane argument specifies which bit plane of
- * the source contains the bitmap. Note that this implementation
- * ignores the gc->function.
+ * Copies a bitmap from a source drawable to a destination drawable. The
+ * plane argument specifies which bit plane of the source contains the
+ * bitmap. Note that this implementation ignores the gc->function.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Changes the destination drawable.
+ * Changes the destination drawable.
*
*----------------------------------------------------------------------
*/
void
XCopyPlane(
- Display* display, /* Display. */
- Drawable src, /* Source drawable. */
- Drawable dst, /* Destination drawable. */
- GC gc, /* The GC to use. */
- int src_x, /* X, Y, width & height */
- int src_y, /* define the source rect. */
- unsigned int width,
- unsigned int height,
- int dest_x, /* X & Y on dest where we will copy. */
- int dest_y,
- unsigned long plane) /* Which plane to copy. */
+ Display *display, /* Display. */
+ Drawable src, /* Source drawable. */
+ Drawable dst, /* Destination drawable. */
+ GC gc, /* The GC to use. */
+ int src_x, int src_y, /* X, Y, width & height define the source
+ * rect. */
+ unsigned int width, unsigned int height,
+ int dest_x, int dest_y, /* X & Y on dest where we will copy. */
+ unsigned long plane) /* Which plane to copy. */
{
- Rect srcRect, dstRect;
- Rect * srcPtr, * dstPtr;
- const BitMap * srcBit;
- const BitMap * dstBit;
- const BitMap * mskBit;
+ Rect srcRect, dstRect, *srcPtr, *dstPtr;
+ const BitMap *srcBit, *dstBit, *mskBit;
MacDrawable *srcDraw = (MacDrawable *) src;
MacDrawable *dstDraw = (MacDrawable *) dst;
GWorldPtr srcPort, dstPort, mskPort;
@@ -311,10 +309,10 @@ XCopyPlane(
srcPtr = &srcRect;
if (tkPictureIsOpen) {
/*
- * When rendering into a picture, after a call to "OpenCPicture"
- * the clipping is seriously WRONG and also INCONSISTENT with the
- * clipping for color bitmaps.
- * To circumvent this problem, we clip to the whole window
+ * When rendering into a picture, after a call to "OpenCPicture" the
+ * clipping is seriously WRONG and also INCONSISTENT with the clipping
+ * for color bitmaps. To circumvent this problem, we clip to the whole
+ * window.
*/
Rect clpRect;
@@ -348,8 +346,8 @@ XCopyPlane(
if (clipPtr->value.pixmap == src) {
PixMapHandle pm;
/*
- * Case 2: transparent bitmaps. If it's color we ignore
- * the forecolor.
+ * Case 2: transparent bitmaps. If it's color we ignore the
+ * forecolor.
*/
pm = GetPortPixMap(srcPort);
@@ -367,8 +365,8 @@ XCopyPlane(
tmode = srcCopy;
mskPort = TkMacOSXGetDrawablePort(clipPtr->value.pixmap);
mskBit = GetPortBitMapForCopyBits(mskPort);
- CopyDeepMask(srcBit, mskBit, dstBit,
- srcPtr, srcPtr, dstPtr, tmode, NULL);
+ CopyDeepMask(srcBit, mskBit, dstBit, srcPtr, srcPtr, dstPtr,
+ tmode, NULL);
}
}
@@ -380,14 +378,14 @@ XCopyPlane(
*
* TkPutImage --
*
- * Copies a subimage from an in-memory image to a rectangle of
- * of the specified drawable.
+ * Copies a subimage from an in-memory image to a rectangle of the
+ * specified drawable.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws the image on the specified drawable.
+ * Draws the image on the specified drawable.
*
*----------------------------------------------------------------------
*/
@@ -430,13 +428,14 @@ TkPutImage(
SetRect(srcPtr, src_x, src_y, src_x + width, src_y + height);
if (tkPictureIsOpen) {
/*
- * When rendering into a picture, after a call to "OpenCPicture"
- * the clipping is seriously WRONG and also INCONSISTENT with the
- * clipping for single plane bitmaps.
- * To circumvent this problem, we clip to the whole window
+ * When rendering into a picture, after a call to "OpenCPicture" the
+ * clipping is seriously WRONG and also INCONSISTENT with the clipping
+ * for single plane bitmaps. To circumvent this problem, we clip to
+ * the whole window.
*/
Rect clpRect;
+
GetPortBounds(destPort,&clpRect);
ClipRect(&clpRect);
destPtr = srcPtr;
@@ -447,14 +446,19 @@ TkPutImage(
}
if (image->obdata) {
- /* Image from XGetImage, copy from containing GWorld directly */
+ /*
+ * Image from XGetImage, copy from containing GWorld directly.
+ */
+
GWorldPtr srcPort = TkMacOSXGetDrawablePort((Drawable)image->obdata);
+
CopyBits(GetPortBitMapForCopyBits(srcPort),
destBits, srcPtr, destPtr, srcCopy, NULL);
} else if (image->depth == 1) {
/*
* BW image
*/
+
const int maxRowBytes = 0x3ffe;
BitMap bitmap;
int odd;
@@ -487,7 +491,7 @@ TkPutImage(
oldPtr = dataPtr;
odd = sliceRowBytes % 2;
if (!newData) {
- newData = (char *) ckalloc(image->height * (sliceRowBytes+odd));
+ newData = ckalloc(image->height * (sliceRowBytes+odd));
}
newPtr = newData;
for (i = 0; i < image->height; i++) {
@@ -512,6 +516,7 @@ TkPutImage(
/*
* Color image
*/
+
const int maxRowBytes = 0x3ffc;
PixMap pixmap;
@@ -519,7 +524,7 @@ TkPutImage(
pixmap.bounds.top = 0;
pixmap.bounds.bottom = (short) image->height;
pixmap.pixelType = RGBDirect;
- pixmap.pmVersion = baseAddr32; /* 32bit clean */
+ pixmap.pmVersion = baseAddr32; /* 32bit clean */
pixmap.packType = 0;
pixmap.packSize = 0;
pixmap.hRes = 0x00480000;
@@ -589,23 +594,23 @@ TkPutImage(
*
* XDrawLines --
*
- * Draw connected lines.
+ * Draw connected lines.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Renders a series of connected lines.
+ * Renders a series of connected lines.
*
*----------------------------------------------------------------------
*/
void
XDrawLines(
- Display* display, /* Display. */
+ Display *display, /* Display. */
Drawable d, /* Draw on this. */
GC gc, /* Use this GC. */
- XPoint* points, /* Array of points. */
+ XPoint *points, /* Array of points. */
int npoints, /* Number of points. */
int mode) /* Line drawing mode. */
{
@@ -654,15 +659,19 @@ XDrawLines(
TkMacOSXSetUpGraphicsPort(gc, destPort);
ShowPen();
PenPixPat(gPenPat);
- /* This is broken for fat lines, it is not possible to correctly
- * imitate X11 drawing of oblique fat lines with QD line drawing,
- * we should draw a filled polygon instead. */
+
+ /*
+ * This is broken for fat lines, it is not possible to correctly
+ * imitate X11 drawing of oblique fat lines with QD line drawing, we
+ * should draw a filled polygon instead.
+ */
+
MoveTo((short) (macWin->xOff + points[0].x + o),
- (short) (macWin->yOff + points[0].y + o));
+ (short) (macWin->yOff + points[0].y + o));
for (i = 1; i < npoints; i++) {
if (mode == CoordModeOrigin) {
LineTo((short) (macWin->xOff + points[i].x + o),
- (short) (macWin->yOff + points[i].y + o));
+ (short) (macWin->yOff + points[i].y + o));
} else {
Line((short) points[i].x, (short) points[i].y);
}
@@ -678,23 +687,24 @@ XDrawLines(
*
* XDrawSegments --
*
- * Draw unconnected lines.
+ * Draw unconnected lines.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Renders a series of unconnected lines.
+ * Renders a series of unconnected lines.
*
*----------------------------------------------------------------------
*/
-void XDrawSegments(
+void
+XDrawSegments(
Display *display,
- Drawable d,
+ Drawable d,
GC gc,
XSegment *segments,
- int nsegments)
+ int nsegments)
{
MacDrawable *macWin = (MacDrawable *) d;
CGrafPtr saveWorld;
@@ -730,14 +740,18 @@ void XDrawSegments(
TkMacOSXSetUpGraphicsPort(gc, destPort);
ShowPen();
PenPixPat(gPenPat);
- /* This is broken for fat lines, it is not possible to correctly
- * imitate X11 drawing of oblique fat lines with QD line drawing,
- * we should draw a filled polygon instead. */
+
+ /*
+ * This is broken for fat lines, it is not possible to correctly
+ * imitate X11 drawing of oblique fat lines with QD line drawing, we
+ * should draw a filled polygon instead.
+ */
+
for (i = 0; i < nsegments; i++) {
MoveTo((short) (macWin->xOff + segments[i].x1 + o),
- (short) (macWin->yOff + segments[i].y1 + o));
+ (short) (macWin->yOff + segments[i].y1 + o));
LineTo((short) (macWin->xOff + segments[i].x2 + o),
- (short) (macWin->yOff + segments[i].y2 + o));
+ (short) (macWin->yOff + segments[i].y2 + o));
}
HidePen();
}
@@ -750,13 +764,13 @@ void XDrawSegments(
*
* XFillPolygon --
*
- * Draws a filled polygon.
+ * Draws a filled polygon.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws a filled polygon on the specified drawable.
+ * Draws a filled polygon on the specified drawable.
*
*----------------------------------------------------------------------
*/
@@ -813,11 +827,11 @@ XFillPolygon(
PenNormal();
polygon = OpenPoly();
MoveTo((short) (macWin->xOff + points[0].x),
- (short) (macWin->yOff + points[0].y));
+ (short) (macWin->yOff + points[0].y));
for (i = 1; i < npoints; i++) {
if (mode == CoordModeOrigin) {
LineTo((short) (macWin->xOff + points[i].x),
- (short) (macWin->yOff + points[i].y));
+ (short) (macWin->yOff + points[i].y));
} else {
Line((short) points[i].x, (short) points[i].y);
}
@@ -835,25 +849,24 @@ XFillPolygon(
*
* XDrawRectangle --
*
- * Draws a rectangle.
+ * Draws a rectangle.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws a rectangle on the specified drawable.
+ * Draws a rectangle on the specified drawable.
*
*----------------------------------------------------------------------
*/
void
XDrawRectangle(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- int x, /* Upper left corner. */
- int y,
- unsigned int width, /* Width & height of rect. */
+ Display *display, /* Display. */
+ Drawable d, /* Draw on this. */
+ GC gc, /* Use this GC. */
+ int x, int y, /* Upper left corner. */
+ unsigned int width, /* Width & height of rect. */
unsigned int height)
{
MacDrawable *macWin = (MacDrawable *) d;
@@ -891,10 +904,10 @@ XDrawRectangle(
TkMacOSXSetUpGraphicsPort(gc, destPort);
ShowPen();
PenPixPat(gPenPat);
- theRect.left = (short) (macWin->xOff + x + o);
- theRect.top = (short) (macWin->yOff + y + o);
- theRect.right = (short) (theRect.left + width + lw);
- theRect.bottom = (short) (theRect.top + height + lw);
+ theRect.left = (short) (macWin->xOff + x + o);
+ theRect.top = (short) (macWin->yOff + y + o);
+ theRect.right = (short) (theRect.left + width + lw);
+ theRect.bottom = (short) (theRect.top + height + lw);
FrameRect(&theRect);
HidePen();
}
@@ -908,27 +921,26 @@ XDrawRectangle(
*
* XDrawRectangles --
*
- * Draws the outlines of the specified rectangles as if a
- * five-point PolyLine protocol request were specified for each
- * rectangle:
+ * Draws the outlines of the specified rectangles as if a five-point
+ * PolyLine protocol request were specified for each rectangle:
*
- * [x,y] [x+width,y] [x+width,y+height] [x,y+height]
- * [x,y]
+ * [x,y] [x+width,y] [x+width,y+height] [x,y+height]
+ * [x,y]
*
- * For the specified rectangles, these functions do not draw a
- * pixel more than once. XDrawRectangles draws the rectangles in
- * the order listed in the array. If rectangles intersect, the
- * intersecting pixels are drawn multiple times. Draws a
- * rectangle.
+ * For the specified rectangles, these functions do not draw a pixel more
+ * than once. XDrawRectangles draws the rectangles in the order listed in
+ * the array. If rectangles intersect, the intersecting pixels are drawn
+ * multiple times. Draws a rectangle.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws rectangles on the specified drawable.
+ * Draws rectangles on the specified drawable.
*
*----------------------------------------------------------------------
*/
+
void
XDrawRectangles(
Display *display,
@@ -975,10 +987,10 @@ XDrawRectangles(
ShowPen();
PenPixPat(gPenPat);
for (i = 0, rectPtr = rectArr; i < nRects;i++, rectPtr++) {
- theRect.left = (short) (macWin->xOff + rectPtr->x + o);
- theRect.top = (short) (macWin->yOff + rectPtr->y + o);
- theRect.right = (short) (theRect.left + rectPtr->width + lw);
- theRect.bottom = (short) (theRect.top + rectPtr->height + lw);
+ theRect.left = (short) (macWin->xOff + rectPtr->x + o);
+ theRect.top = (short) (macWin->yOff + rectPtr->y + o);
+ theRect.right = (short) (theRect.left + rectPtr->width + lw);
+ theRect.bottom = (short) (theRect.top + rectPtr->height + lw);
FrameRect(&theRect);
}
HidePen();
@@ -993,23 +1005,24 @@ XDrawRectangles(
*
* XFillRectangles --
*
- * Fill multiple rectangular areas in the given drawable.
+ * Fill multiple rectangular areas in the given drawable.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws onto the specified drawable.
+ * Draws onto the specified drawable.
*
*----------------------------------------------------------------------
*/
+
void
XFillRectangles(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- XRectangle *rectangles, /* Rectangle array. */
- int n_rectangles) /* Number of rectangles. */
+ Display* display, /* Display. */
+ Drawable d, /* Draw on this. */
+ GC gc, /* Use this GC. */
+ XRectangle *rectangles, /* Rectangle array. */
+ int n_rectangles) /* Number of rectangles. */
{
MacDrawable *macWin = (MacDrawable *) d;
CGrafPtr saveWorld;
@@ -1033,8 +1046,7 @@ XFillRectangles(
if (rectPtr->width == 0 || rectPtr->height == 0) {
continue;
}
- rect = CGRectMake(
- macWin->xOff + rectPtr->x,
+ rect = CGRectMake(macWin->xOff + rectPtr->x,
macWin->yOff + rectPtr->y,
rectPtr->width, rectPtr->height);
CGContextFillRect(outContext, rect);
@@ -1045,10 +1057,10 @@ XFillRectangles(
TkMacOSXSetUpGraphicsPort(gc, destPort);
for (i = 0, rectPtr = rectangles; i < n_rectangles; i++, rectPtr++) {
- theRect.left = (short) (macWin->xOff + rectPtr->x);
- theRect.top = (short) (macWin->yOff + rectPtr->y);
- theRect.right = (short) (theRect.left + rectPtr->width);
- theRect.bottom = (short) (theRect.top + rectPtr->height);
+ theRect.left = (short) (macWin->xOff + rectPtr->x);
+ theRect.top = (short) (macWin->yOff + rectPtr->y);
+ theRect.right = (short) (theRect.left + rectPtr->width);
+ theRect.bottom = (short) (theRect.top + rectPtr->height);
FillCRect(&theRect, gPenPat);
}
}
@@ -1061,28 +1073,27 @@ XFillRectangles(
*
* XDrawArc --
*
- * Draw an arc.
+ * Draw an arc.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws an arc on the specified drawable.
+ * Draws an arc on the specified drawable.
*
*----------------------------------------------------------------------
*/
void
XDrawArc(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- int x, /* Upper left of */
- int y, /* bounding rect. */
- unsigned int width, /* Width & height. */
+ Display* display, /* Display. */
+ Drawable d, /* Draw on this. */
+ GC gc, /* Use this GC. */
+ int x, int y, /* Upper left of bounding rect. */
+ unsigned int width, /* Width & height. */
unsigned int height,
- int angle1, /* Staring angle of arc. */
- int angle2) /* Extent of arc. */
+ int angle1, /* Staring angle of arc. */
+ int angle2) /* Extent of arc. */
{
MacDrawable *macWin = (MacDrawable *) d;
CGrafPtr saveWorld;
@@ -1142,11 +1153,11 @@ XDrawArc(
TkMacOSXSetUpGraphicsPort(gc, destPort);
ShowPen();
PenPixPat(gPenPat);
- theRect.left = (short) (macWin->xOff + x + o);
- theRect.top = (short) (macWin->yOff + y + o);
- theRect.right = (short) (theRect.left + width + lw);
+ theRect.left = (short) (macWin->xOff + x + o);
+ theRect.top = (short) (macWin->yOff + y + o);
+ theRect.right = (short) (theRect.left + width + lw);
theRect.bottom = (short) (theRect.top + height + lw);
- start = (short) (90 - (angle1/64));
+ start = (short) (90 - (angle1/64));
extent = (short) (-(angle2/64));
FrameArc(&theRect, start, extent);
HidePen();
@@ -1161,23 +1172,23 @@ XDrawArc(
*
* XDrawArcs --
*
- * Draws multiple circular or elliptical arcs. Each arc is
- * specified by a rectangle and two angles. The center of the
- * circle or ellipse is the center of the rect- angle, and the
- * major and minor axes are specified by the width and height.
- * Positive angles indicate counterclock- wise motion, and
- * negative angles indicate clockwise motion. If the magnitude
- * of angle2 is greater than 360 degrees, XDrawArcs truncates it
- * to 360 degrees.
+ * Draws multiple circular or elliptical arcs. Each arc is specified by a
+ * rectangle and two angles. The center of the circle or ellipse is the
+ * center of the rectangle, and the major and minor axes are specified by
+ * the width and height. Positive angles indicate counterclock- wise
+ * motion, and negative angles indicate clockwise motion. If the
+ * magnitude of angle2 is greater than 360 degrees, XDrawArcs truncates
+ * it to 360 degrees.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws an arc for each array element on the specified drawable.
+ * Draws an arc for each array element on the specified drawable.
*
*----------------------------------------------------------------------
*/
+
void
XDrawArcs(
Display *display,
@@ -1186,12 +1197,11 @@ XDrawArcs(
XArc *arcArr,
int nArcs)
{
-
MacDrawable *macWin = (MacDrawable *) d;
CGrafPtr saveWorld;
GDHandle saveDevice;
GWorldPtr destPort;
- XArc * arcPtr;
+ XArc *arcPtr;
int i, lw = gc->line_width;
destPort = TkMacOSXGetDrawablePort(d);
@@ -1211,8 +1221,7 @@ XDrawArcs(
|| arcPtr->angle2 == 0) {
continue;
}
- rect = CGRectMake(
- macWin->xOff + arcPtr->x + o,
+ rect = CGRectMake(macWin->xOff + arcPtr->x + o,
macWin->yOff + arcPtr->y + o,
arcPtr->width, arcPtr->height);
@@ -1226,13 +1235,13 @@ XDrawArcs(
CGMutablePathRef p = CGPathCreateMutable();
CGAffineTransform t = CGAffineTransformIdentity;
CGPoint c = CGPointMake(CGRectGetMidX(rect),
- CGRectGetMidY(rect));
+ CGRectGetMidY(rect));
float w = CGRectGetWidth(rect);
if (arcPtr->width != arcPtr->height) {
t = CGAffineTransformMakeScale(1, CGRectGetHeight(rect)/w);
c = CGPointApplyAffineTransform(c,
- CGAffineTransformInvert(t));
+ CGAffineTransformInvert(t));
}
CGPathAddArc(p, &t, c.x, c.y, w/2,
radians(-arcPtr->angle1/64.0),
@@ -1253,11 +1262,11 @@ XDrawArcs(
ShowPen();
PenPixPat(gPenPat);
for (i = 0, arcPtr = arcArr;i < nArcs;i++, arcPtr++) {
- theRect.left = (short) (macWin->xOff + arcPtr->x + o);
- theRect.top = (short) (macWin->yOff + arcPtr->y + o);
- theRect.right = (short) (theRect.left + arcPtr->width + lw);
+ theRect.left = (short) (macWin->xOff + arcPtr->x + o);
+ theRect.top = (short) (macWin->yOff + arcPtr->y + o);
+ theRect.right = (short) (theRect.left + arcPtr->width + lw);
theRect.bottom = (short) (theRect.top + arcPtr->height + lw);
- start = (short) (90 - (arcPtr->angle1/64));
+ start = (short) (90 - (arcPtr->angle1/64));
extent = (short) (-(arcPtr->angle2/64));
FrameArc(&theRect, start, extent);
}
@@ -1273,28 +1282,27 @@ XDrawArcs(
*
* XFillArc --
*
- * Draw a filled arc.
+ * Draw a filled arc.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws a filled arc on the specified drawable.
+ * Draws a filled arc on the specified drawable.
*
*----------------------------------------------------------------------
*/
void
XFillArc(
- Display* display, /* Display. */
- Drawable d, /* Draw on this. */
- GC gc, /* Use this GC. */
- int x, /* Upper left of */
- int y, /* bounding rect. */
- unsigned int width, /* Width & height. */
+ Display* display, /* Display. */
+ Drawable d, /* Draw on this. */
+ GC gc, /* Use this GC. */
+ int x, int y, /* Upper left of bounding rect. */
+ unsigned int width, /* Width & height. */
unsigned int height,
- int angle1, /* Staring angle of arc. */
- int angle2) /* Extent of arc. */
+ int angle1, /* Staring angle of arc. */
+ int angle2) /* Extent of arc. */
{
MacDrawable *macWin = (MacDrawable *) d;
CGrafPtr saveWorld;
@@ -1322,9 +1330,7 @@ XFillArc(
u += NON_AA_CG_OFFSET;
}
TkMacOSXSetUpCGContext(macWin, destPort, gc, &outContext);
- rect = CGRectMake(
- macWin->xOff + x + o,
- macWin->yOff + y + o,
+ rect = CGRectMake(macWin->xOff + x + o, macWin->yOff + y + o,
width - u, height - u);
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040
@@ -1364,9 +1370,9 @@ XFillArc(
double vertex[2], center1[2], center2[2];
TkMacOSXSetUpGraphicsPort(gc, destPort);
- theRect.left = (short) (macWin->xOff + x + o);
- theRect.top = (short) (macWin->yOff + y + o);
- theRect.right = (short) (theRect.left + width + lw);
+ theRect.left = (short) (macWin->xOff + x + o);
+ theRect.top = (short) (macWin->yOff + y + o);
+ theRect.right = (short) (theRect.left + width + lw);
theRect.bottom = (short) (theRect.top + height + lw);
start = (short) (90 - (angle1/64));
extent = (short) (-(angle2/64));
@@ -1388,7 +1394,7 @@ XFillArc(
polygon = OpenPoly();
MoveTo((short) ((theRect.left + theRect.right)/2),
- (short) ((theRect.top + theRect.bottom)/2));
+ (short) ((theRect.top + theRect.bottom)/2));
LineTo((short) (center1[0] + .5), (short) (center1[1] + .5));
LineTo((short) (center2[0] + .5), (short) (center2[1] + .5));
ClosePoly();
@@ -1413,16 +1419,17 @@ XFillArc(
*
* XFillArcs --
*
- * Draw a filled arc.
+ * Draw a filled arc.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Draws a filled arc for each array element on the specified drawable.
+ * Draws a filled arc for each array element on the specified drawable.
*
*----------------------------------------------------------------------
*/
+
void
XFillArcs(
Display *display,
@@ -1435,7 +1442,7 @@ XFillArcs(
CGrafPtr saveWorld;
GDHandle saveDevice;
GWorldPtr destPort;
- XArc * arcPtr;
+ XArc *arcPtr;
int i, lw = gc->line_width;
destPort = TkMacOSXGetDrawablePort(d);
@@ -1459,8 +1466,7 @@ XFillArcs(
|| arcPtr->angle2 == 0) {
continue;
}
- rect = CGRectMake(
- macWin->xOff + arcPtr->x + o,
+ rect = CGRectMake(macWin->xOff + arcPtr->x + o,
macWin->yOff + arcPtr->y + o,
arcPtr->width - u, arcPtr->height - u);
@@ -1474,13 +1480,13 @@ XFillArcs(
CGMutablePathRef p = CGPathCreateMutable();
CGAffineTransform t = CGAffineTransformIdentity;
CGPoint c = CGPointMake(CGRectGetMidX(rect),
- CGRectGetMidY(rect));
+ CGRectGetMidY(rect));
float w = CGRectGetWidth(rect);
if (arcPtr->width != arcPtr->height) {
t = CGAffineTransformMakeScale(1, CGRectGetHeight(rect)/w);
c = CGPointApplyAffineTransform(c,
- CGAffineTransformInvert(t));
+ CGAffineTransformInvert(t));
}
if (gc->arc_mode == ArcPieSlice) {
CGPathMoveToPoint(p, &t, c.x, c.y);
@@ -1507,9 +1513,9 @@ XFillArcs(
TkMacOSXSetUpGraphicsPort(gc, destPort);
for (i = 0, arcPtr = arcArr;i<nArcs;i++, arcPtr++) {
- theRect.left = (short) (macWin->xOff + arcPtr->x + o);
- theRect.top = (short) (macWin->yOff + arcPtr->y + o);
- theRect.right = (short) (theRect.left + arcPtr->width + lw);
+ theRect.left = (short) (macWin->xOff + arcPtr->x + o);
+ theRect.top = (short) (macWin->yOff + arcPtr->y + o);
+ theRect.right = (short) (theRect.left + arcPtr->width + lw);
theRect.bottom = (short) (theRect.top + arcPtr->height + lw);
start = (short) (90 - (arcPtr->angle1/64));
extent = (short) (- (arcPtr->angle2/64));
@@ -1532,7 +1538,7 @@ XFillArcs(
polygon = OpenPoly();
MoveTo((short) ((theRect.left + theRect.right)/2),
- (short) ((theRect.top + theRect.bottom)/2));
+ (short) ((theRect.top + theRect.bottom)/2));
LineTo((short) (center1[0] + .5), (short) (center1[1] + .5));
LineTo((short) (center2[0] + .5), (short) (center2[1] + .5));
ClosePoly();
@@ -1561,8 +1567,10 @@ XFillArcs(
*
*----------------------------------------------------------------------
*/
+
long
-XMaxRequestSize(Display *display)
+XMaxRequestSize(
+ Display *display)
{
return (SHRT_MAX / 4);
}
@@ -1573,31 +1581,28 @@ XMaxRequestSize(Display *display)
*
* TkScrollWindow --
*
- * Scroll a rectangle of the specified window and accumulate
- * a damage region.
+ * Scroll a rectangle of the specified window and accumulate a damage
+ * region.
*
* Results:
- * Returns 0 if the scroll genereated no additional damage.
- * Otherwise, sets the region that needs to be repainted after
- * scrolling and returns 1.
+ * Returns 0 if the scroll genereated no additional damage. Otherwise,
+ * sets the region that needs to be repainted after scrolling and returns
+ * 1.
*
* Side effects:
- * Scrolls the bits in the window.
+ * Scrolls the bits in the window.
*
*----------------------------------------------------------------------
*/
int
TkScrollWindow(
- Tk_Window tkwin, /* The window to be scrolled. */
- GC gc, /* GC for window to be scrolled. */
- int x, /* Position rectangle to be scrolled. */
- int y,
- int width,
- int height,
- int dx, /* Distance rectangle should be moved. */
- int dy,
- TkRegion damageRgn) /* Region to accumulate damage in. */
+ Tk_Window tkwin, /* The window to be scrolled. */
+ GC gc, /* GC for window to be scrolled. */
+ int x, int y, /* Position rectangle to be scrolled. */
+ int width, int height,
+ int dx, int dy, /* Distance rectangle should be moved. */
+ TkRegion damageRgn) /* Region to accumulate damage in. */
{
MacDrawable *destDraw = (MacDrawable *) Tk_WindowId(tkwin);
RgnHandle rgn = (RgnHandle) damageRgn;
@@ -1613,13 +1618,12 @@ TkScrollWindow(
TkMacOSXSetUpClippingRgn(Tk_WindowId(tkwin));
/*
- * Due to the implementation below the behavior may be differnt
- * than X in certain cases that should never occur in Tk. The
- * scrollRect is the source rect extended by the offset (the union
- * of the source rect and the offset rect). Everything
- * in the extended scrollRect is scrolled. On X, it's possible
- * to "skip" over an area if the offset makes the source and
- * destination rects disjoint and non-aligned.
+ * Due to the implementation below the behavior may be differnt than X in
+ * certain cases that should never occur in Tk. The scrollRect is the
+ * source rect extended by the offset (the union of the source rect and
+ * the offset rect). Everything in the extended scrollRect is scrolled. On
+ * X, it's possible to "skip" over an area if the offset makes the source
+ * and destination rects disjoint and non-aligned.
*/
SetRect(&srcRect, (short) (destDraw->xOff + x),
@@ -1639,9 +1643,10 @@ TkScrollWindow(
}
/*
- * Adjust clip region so that we don't copy any windows
- * that may overlap us.
+ * Adjust clip region so that we don't copy any windows that may overlap
+ * us.
*/
+
visRgn = NewRgn();
clipRgn = NewRgn();
RectRgn(rgn, &srcRect);
@@ -1654,14 +1659,14 @@ TkScrollWindow(
SetEmptyRgn(rgn);
/*
- * When a menu is up, the Mac does not expect drawing to occur and
- * does not clip out the menu. We have to do it ourselves. This
- * is pretty gross.
+ * When a menu is up, the Mac does not expect drawing to occur and does
+ * not clip out the menu. We have to do it ourselves. This is pretty
+ * gross.
*/
if (tkUseMenuCascadeRgn == 1) {
- Point scratch = {0, 0};
- MacDrawable *macDraw = (MacDrawable *) Tk_WindowId(tkwin);
+ Point scratch = {0, 0};
+ MacDrawable *macDraw = (MacDrawable *) Tk_WindowId(tkwin);
LocalToGlobal(&scratch);
CopyRgn(tkMenuCascadeRgn, rgn);
@@ -1678,17 +1683,14 @@ TkScrollWindow(
DisposeRgn(clipRgn);
DisposeRgn(visRgn);
+
/*
- * Fortunantly, the region returned by ScrollRect is symanticlly
- * the same as what we need to return in this function. If the
- * region is empty we return zero to denote that no damage was
- * created.
+ * Fortunantly, the region returned by ScrollRect is symanticlly the same
+ * as what we need to return in this function. If the region is empty we
+ * return zero to denote that no damage was created.
*/
- if (EmptyRgn(rgn)) {
- return 0;
- } else {
- return 1;
- }
+
+ return !EmptyRgn(rgn);
}
/*
@@ -1696,13 +1698,13 @@ TkScrollWindow(
*
* TkMacOSXSetUpGraphicsPort --
*
- * Set up the graphics port from the given GC.
+ * Set up the graphics port from the given GC.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The current port is adjusted.
+ * The current port is adjusted.
*
*----------------------------------------------------------------------
*/
@@ -1710,7 +1712,7 @@ TkScrollWindow(
void
TkMacOSXSetUpGraphicsPort(
GC gc,
- GWorldPtr destPort) /* GC to apply to current port. */
+ GWorldPtr destPort) /* GC to apply to current port. */
{
RGBColor macColor;
@@ -1719,12 +1721,15 @@ TkMacOSXSetUpGraphicsPort(
}
if (TkSetMacColor(gc->foreground, &macColor) == true) {
- /* TODO: cache RGBPats for preformace - measure gains... */
+ /*
+ * TODO: cache RGBPats for preformace - measure gains...
+ */
+
MakeRGBPat(gPenPat, &macColor);
}
PenNormal();
- if(gc->function == GXxor) {
+ if (gc->function == GXxor) {
PenMode(patXor);
}
if (gc->line_width > 1) {
@@ -1732,26 +1737,26 @@ TkMacOSXSetUpGraphicsPort(
}
if (gc->line_style != LineSolid) {
/*
- * Here the dash pattern should be set in the drawing,
- * environment, but I don't know how to do that for the Mac.
+ * Here the dash pattern should be set in the drawing environment, but
+ * I don't know how to do that for the Mac.
*
- * p[] is an array of unsigned chars containing the dash list.
- * A '\0' indicates the end of this list.
+ * p[] is an array of unsigned chars containing the dash list. A '\0'
+ * indicates the end of this list.
*
- * Someone knows how to implement this? If you have a more
- * complete implementation of SetUpGraphicsPort() for
- * the Mac (or for Windows), please let me know.
+ * Someone knows how to implement this? If you have a more complete
+ * implementation of SetUpGraphicsPort() for the Mac (or for Windows),
+ * please let me know.
*
- * Jan Nijtmans
- * CMG Arnhem, B.V.
- * email: j.nijtmans@chello.nl (private)
- * jan.nijtmans@cmg.nl (work)
- * url: http://purl.oclc.org/net/nijtmans/
+ * Jan Nijtmans
+ * CMG Arnhem, B.V.
+ * email: j.nijtmans@chello.nl (private)
+ * jan.nijtmans@cmg.nl (work)
+ * url: http://purl.oclc.org/net/nijtmans/
*
* FIXME:
- * This is not possible with QuickDraw line drawing. As of
- * Tk 8.4.7 we have a complete set of drawing routines using
- * CG, so there is no reason to support this here.
+ * This is not possible with QuickDraw line drawing. As of Tk 8.4.7 we
+ * have a complete set of drawing routines using CG, so there is no
+ * reason to support this here.
*/
}
}
@@ -1761,13 +1766,13 @@ TkMacOSXSetUpGraphicsPort(
*
* TkMacOSXSetUpCGContext --
*
- * Set up a CGContext for the given graphics port.
+ * Set up a CGContext for the given graphics port.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
@@ -1791,13 +1796,13 @@ TkMacOSXSetUpCGContext(
outContext = *contextPtr;
/*
- * Now clip the CG Context to the port. Note, we have already
- * set up the port with our clip region, so we can just get
- * the clip back out of there. If we use the macWin->clipRgn
- * directly at this point, we get some odd drawing effects.
+ * Now clip the CG Context to the port. Note, we have already set up the
+ * port with our clip region, so we can just get the clip back out of
+ * there. If we use the macWin->clipRgn directly at this point, we get
+ * some odd drawing effects.
*
- * We also have to intersect our clip region with the port
- * visible region so we don't overwrite the window decoration.
+ * We also have to intersect our clip region with the port visible region
+ * so we don't overwrite the window decoration.
*/
if (!clipRgn) {
@@ -1813,8 +1818,8 @@ TkMacOSXSetUpCGContext(
SetEmptyRgn(clipRgn);
/*
- * Note: You have to call SyncCGContextOriginWithPort
- * AFTER all the clip region manipulations.
+ * Note: You have to call SyncCGContextOriginWithPort AFTER all the clip
+ * region manipulations.
*/
SyncCGContextOriginWithPort(outContext, destPort);
@@ -1823,28 +1828,32 @@ TkMacOSXSetUpCGContext(
boundsRect.bottom - boundsRect.top);
CGContextConcatCTM(outContext, coordsTransform);
- /* Now offset the CTM to the subwindow offset */
+ /*
+ * Now offset the CTM to the subwindow offset.
+ */
if (TkSetMacColor(gc->foreground, &macColor) == true) {
- CGContextSetRGBFillColor(outContext,
- RGBFLOATRED(macColor),
- RGBFLOATGREEN(macColor),
- RGBFLOATBLUE(macColor),
- 1);
- CGContextSetRGBStrokeColor(outContext,
- RGBFLOATRED(macColor),
- RGBFLOATGREEN(macColor),
- RGBFLOATBLUE(macColor),
- 1);
+ CGContextSetRGBFillColor(outContext, RGBFLOATRED(macColor),
+ RGBFLOATGREEN(macColor), RGBFLOATBLUE(macColor), 1);
+ CGContextSetRGBStrokeColor(outContext, RGBFLOATRED(macColor),
+ RGBFLOATGREEN(macColor), RGBFLOATBLUE(macColor), 1);
}
- if(gc->function == GXxor) {
+ if (gc->function == GXxor) {
+ /* empty */
}
w = gc->line_width;
- /* When should we antialias? */
+
+ /*
+ * When should we antialias?
+ */
+
if (notAA(gc->line_width)) {
- /* Make non-antialiased CG drawing look more like X11 */
+ /*
+ * Make non-antialiased CG drawing look more like X11.
+ */
+
w -= (gc->line_width ? NON_AA_CG_OFFSET : 0);
CGContextSetShouldAntialias(outContext, 0);
} else {
@@ -1867,7 +1876,7 @@ TkMacOSXSetUpCGContext(
if (gc->cap_style == CapButt) {
/*
- * What about CapNotLast, CapProjecting?
+ * What about CapNotLast, CapProjecting?
*/
CGContextSetLineCap(outContext, kCGLineCapButt);
@@ -1891,22 +1900,22 @@ TkMacOSXSetUpCGContext(
*
* TkMacOSXReleaseCGContext --
*
- * Release the CGContext for the given graphics port.
+ * Release the CGContext for the given graphics port.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
static void
TkMacOSXReleaseCGContext(
- MacDrawable *macWin,
- CGrafPtr destPort,
- CGContextRef *outContext)
+ MacDrawable *macWin,
+ CGrafPtr destPort,
+ CGContextRef *outContext)
{
CGContextSynchronize(*outContext);
QDEndCGContext(destPort, outContext);
@@ -1917,21 +1926,21 @@ TkMacOSXReleaseCGContext(
*
* TkMacOSXSetUpClippingRgn --
*
- * Set up the clipping region so that drawing only occurs on the
- * specified X subwindow.
+ * Set up the clipping region so that drawing only occurs on the
+ * specified X subwindow.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The clipping region in the current port is changed.
+ * The clipping region in the current port is changed.
*
*----------------------------------------------------------------------
*/
void
TkMacOSXSetUpClippingRgn(
- Drawable drawable) /* Drawable to update. */
+ Drawable drawable) /* Drawable to update. */
{
MacDrawable *macDraw = (MacDrawable *) drawable;
@@ -1942,40 +1951,44 @@ TkMacOSXSetUpClippingRgn(
#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_DRAWING)
TkMacOSXInitNamedDebugSymbol(HIToolbox, int, QDDebugFlashRegion,
- CGrafPtr port, RgnHandle region);
+ CGrafPtr port, RgnHandle region);
if (QDDebugFlashRegion) {
CGrafPtr grafPtr = TkMacOSXGetDrawablePort(drawable);
- /* Carbon-internal region flashing SPI (c.f. Technote 2124) */
+
+ /*
+ * Carbon-internal region flashing SPI (c.f. Technote 2124)
+ */
+
QDDebugFlashRegion(grafPtr, macDraw->clipRgn);
}
#endif /* TK_MAC_DEBUG_DRAWING */
/*
* When a menu is up, the Mac does not expect drawing to occur and
- * does not clip out the menu. We have to do it ourselves. This
- * is pretty gross.
+ * does not clip out the menu. We have to do it ourselves. This is
+ * pretty gross.
*/
if (macDraw->clipRgn != NULL) {
if (tkUseMenuCascadeRgn == 1) {
- Point scratch = {0, 0};
- GDHandle saveDevice;
- GWorldPtr saveWorld;
-
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(TkMacOSXGetDrawablePort(drawable), NULL);
- LocalToGlobal(&scratch);
- SetGWorld(saveWorld, saveDevice);
- if (tmpRgn == NULL) {
- tmpRgn = NewRgn();
- }
- CopyRgn(tkMenuCascadeRgn, tmpRgn);
- OffsetRgn(tmpRgn, -scratch.h, -scratch.v);
- DiffRgn(macDraw->clipRgn, tmpRgn, tmpRgn);
- SetClip(tmpRgn);
- macDraw->toplevel->flags |= TK_DRAWN_UNDER_MENU;
+ Point scratch = {0, 0};
+ GDHandle saveDevice;
+ GWorldPtr saveWorld;
+
+ GetGWorld(&saveWorld, &saveDevice);
+ SetGWorld(TkMacOSXGetDrawablePort(drawable), NULL);
+ LocalToGlobal(&scratch);
+ SetGWorld(saveWorld, saveDevice);
+ if (tmpRgn == NULL) {
+ tmpRgn = NewRgn();
+ }
+ CopyRgn(tkMenuCascadeRgn, tmpRgn);
+ OffsetRgn(tmpRgn, -scratch.h, -scratch.v);
+ DiffRgn(macDraw->clipRgn, tmpRgn, tmpRgn);
+ SetClip(tmpRgn);
+ macDraw->toplevel->flags |= TK_DRAWN_UNDER_MENU;
} else {
- SetClip(macDraw->clipRgn);
+ SetClip(macDraw->clipRgn);
}
}
}
@@ -1986,31 +1999,29 @@ TkMacOSXSetUpClippingRgn(
*
* TkMacOSXMakeStippleMap --
*
- * Given a drawable and a stipple pattern this function draws the
- * pattern repeatedly over the drawable. The drawable can then
- * be used as a mask for bit-bliting a stipple pattern over an
- * object.
+ * Given a drawable and a stipple pattern this function draws the pattern
+ * repeatedly over the drawable. The drawable can then be used as a mask
+ * for bit-bliting a stipple pattern over an object.
*
* Results:
- * A BitMap data structure.
+ * A BitMap data structure.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
BitMapPtr
TkMacOSXMakeStippleMap(
- Drawable drawable, /* Window to apply stipple. */
- Drawable stipple) /* The stipple pattern. */
+ Drawable drawable, /* Window to apply stipple. */
+ Drawable stipple) /* The stipple pattern. */
{
GWorldPtr destPort;
BitMapPtr bitmapPtr;
- Rect portRect;
- int width, height, stippleHeight, stippleWidth;
- int i, j;
- char * data;
+ Rect portRect;
+ int width, height, stippleHeight, stippleWidth, i, j;
+ char *data;
Rect bounds;
destPort = TkMacOSXGetDrawablePort(drawable);
@@ -2039,7 +2050,7 @@ TkMacOSXMakeStippleMap(
bounds.bottom = i + stippleHeight;
CopyBits(GetPortBitMapForCopyBits(destPort), bitmapPtr,
- &portRect, &bounds, srcCopy, NULL);
+ &portRect, &bounds, srcCopy, NULL);
}
}
return bitmapPtr;
@@ -2050,20 +2061,20 @@ TkMacOSXMakeStippleMap(
*
* InvertByte --
*
- * This function reverses the bits in the passed in Byte of data.
+ * This function reverses the bits in the passed in Byte of data.
*
* Results:
- * The incoming byte in reverse bit order.
+ * The incoming byte in reverse bit order.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
static unsigned char
InvertByte(
- unsigned char data) /* Byte of data. */
+ unsigned char data) /* Byte of data. */
{
unsigned char i;
unsigned char mask = 1, result = 0;
@@ -2082,32 +2093,32 @@ InvertByte(
*
* TkpDrawHighlightBorder --
*
- * This procedure draws a rectangular ring around the outside of
- * a widget to indicate that it has received the input focus.
+ * This procedure draws a rectangular ring around the outside of a widget
+ * to indicate that it has received the input focus.
*
- * On the Macintosh, this puts a 1 pixel border in the bgGC color
- * between the widget and the focus ring, except in the case where
- * highlightWidth is 1, in which case the border is left out.
+ * On the Macintosh, this puts a 1 pixel border in the bgGC color between
+ * the widget and the focus ring, except in the case where highlightWidth
+ * is 1, in which case the border is left out.
*
- * For proper Mac L&F, use highlightWidth of 3.
+ * For proper Mac L&F, use highlightWidth of 3.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * A rectangle "width" pixels wide is drawn in "drawable",
- * corresponding to the outer area of "tkwin".
+ * A rectangle "width" pixels wide is drawn in "drawable", corresponding
+ * to the outer area of "tkwin".
*
*----------------------------------------------------------------------
*/
void
TkpDrawHighlightBorder (
- Tk_Window tkwin,
- GC fgGC,
- GC bgGC,
- int highlightWidth,
- Drawable drawable)
+ Tk_Window tkwin,
+ GC fgGC,
+ GC bgGC,
+ int highlightWidth,
+ Drawable drawable)
{
if (highlightWidth == 1) {
TkDrawInsetFocusHighlight (tkwin, fgGC, highlightWidth, drawable, 0);
@@ -2125,8 +2136,8 @@ TkpDrawHighlightBorder (
*
* TkpDrawFrame --
*
- * This procedure draws the rectangular frame area. If the user
- * has request themeing, it draws with a the background theme.
+ * This procedure draws the rectangular frame area. If the user has
+ * request themeing, it draws with a the background theme.
*
* Results:
* None.
@@ -2138,15 +2149,20 @@ TkpDrawHighlightBorder (
*/
void
-TkpDrawFrame (Tk_Window tkwin, Tk_3DBorder border,
- int highlightWidth, int borderWidth, int relief)
+TkpDrawFrame(
+ Tk_Window tkwin,
+ Tk_3DBorder border,
+ int highlightWidth,
+ int borderWidth,
+ int relief)
{
if (useThemedToplevel && Tk_IsTopLevel(tkwin)) {
/*
- * Currently only support themed toplevels, until we can better
- * factor this to handle individual windows (blanket theming of
- * frames will work for very few UIs).
+ * Currently only support themed toplevels, until we can better factor
+ * this to handle individual windows (blanket theming of frames will
+ * work for very few UIs).
*/
+
Rect bounds;
Point origin;
CGrafPtr saveWorld;
@@ -2175,15 +2191,21 @@ TkpDrawFrame (Tk_Window tkwin, Tk_3DBorder border,
EraseRect(&bounds);
SetGWorld(saveWorld, saveDevice);
- XCopyArea(display, pixmap, Tk_WindowId(tkwin),
- gc, 0, 0, bounds.right, bounds.bottom, 0, 0);
+ XCopyArea(display, pixmap, Tk_WindowId(tkwin), gc, 0, 0, bounds.right,
+ bounds.bottom, 0, 0);
Tk_FreePixmap(display, pixmap);
Tk_FreeGC(display, gc);
} else {
- Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin),
- border, highlightWidth, highlightWidth,
- Tk_Width(tkwin) - 2 * highlightWidth,
- Tk_Height(tkwin) - 2 * highlightWidth,
- borderWidth, relief);
+ Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), border, highlightWidth,
+ highlightWidth, Tk_Width(tkwin) - 2 * highlightWidth,
+ Tk_Height(tkwin) - 2 * highlightWidth, borderWidth, relief);
}
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXEvent.c b/macosx/tkMacOSXEvent.c
index 82a4ad0..dd90d6e 100644
--- a/macosx/tkMacOSXEvent.c
+++ b/macosx/tkMacOSXEvent.c
@@ -1,4 +1,4 @@
-/*
+/*
* tkMacOSXEvent.c --
*
* This file contains the basic Mac OS X Event handling routines.
@@ -7,23 +7,23 @@
* Copyright 2001, Apple Computer, Inc.
* Copyright (c) 2005-2006 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.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXEvent.c,v 1.12 2006/10/31 22:33:34 das Exp $
+ * RCS: @(#) $Id: tkMacOSXEvent.c,v 1.13 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
#include "tkMacOSXEvent.h"
#include "tkMacOSXDebug.h"
-
+
/*
*----------------------------------------------------------------------
*
* TkMacOSXFlushWindows --
*
- * This routine flushes all the Carbon windows of the application. It
- * is called by the setup procedure for the Tcl/Carbon event source.
+ * This routine flushes all the Carbon windows of the application. It is
+ * called by the setup procedure for the Tcl/Carbon event source.
*
* Results:
* None.
@@ -35,10 +35,10 @@
*/
MODULE_SCOPE void
-TkMacOSXFlushWindows ()
+TkMacOSXFlushWindows(void)
{
WindowRef wRef = GetWindowList();
-
+
while (wRef) {
CGrafPtr portPtr = GetWindowPort(wRef);
if (QDIsPortBuffered(portPtr)) {
@@ -48,62 +48,61 @@ TkMacOSXFlushWindows ()
}
}
-/*
+/*
*----------------------------------------------------------------------
- *
+ *
* TkMacOSXProcessEvent --
- *
+ *
* This dispatches a filtered Carbon event to the appropriate handler
*
* Note on MacEventStatus.stopProcessing: Please be conservative in the
- * individual handlers and don't assume the event is fully handled
- * unless you *really* need to ensure that other handlers don't see the
- * event anymore. Some OS manager or library might be interested in
- * events even after they are already handled on the Tk level.
+ * individual handlers and don't assume the event is fully handled unless
+ * you *really* need to ensure that other handlers don't see the event
+ * anymore. Some OS manager or library might be interested in events even
+ * after they are already handled on the Tk level.
*
- * Results:
+ * Results:
* 0 on success
* -1 on failure
*
* Side effects:
* Converts a Carbon event to a Tk event
- *
+ *
*----------------------------------------------------------------------
*/
-MODULE_SCOPE int
-TkMacOSXProcessEvent(TkMacOSXEvent * eventPtr, MacEventStatus * statusPtr)
+MODULE_SCOPE int
+TkMacOSXProcessEvent(
+ TkMacOSXEvent *eventPtr,
+ MacEventStatus *statusPtr)
{
switch (eventPtr->eClass) {
- case kEventClassMouse:
- TkMacOSXProcessMouseEvent(eventPtr, statusPtr);
- break;
- case kEventClassWindow:
- TkMacOSXProcessWindowEvent(eventPtr, statusPtr);
- break;
- case kEventClassKeyboard:
- TkMacOSXProcessKeyboardEvent(eventPtr, statusPtr);
- break;
- case kEventClassApplication:
- TkMacOSXProcessApplicationEvent(eventPtr, statusPtr);
- break;
- case kEventClassMenu:
- TkMacOSXProcessMenuEvent(eventPtr, statusPtr);
- break;
- case kEventClassCommand:
- TkMacOSXProcessCommandEvent(eventPtr, statusPtr);
- break;
- default:
-#ifdef TK_MAC_DEBUG
- {
- char buf [256];
- fprintf(stderr,
- "Unrecognised event : %s\n",
- TkMacOSXCarbonEventToAscii(eventPtr->eventRef, buf));
- }
-#endif
- break;
- }
+ case kEventClassMouse:
+ TkMacOSXProcessMouseEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassWindow:
+ TkMacOSXProcessWindowEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassKeyboard:
+ TkMacOSXProcessKeyboardEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassApplication:
+ TkMacOSXProcessApplicationEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassMenu:
+ TkMacOSXProcessMenuEvent(eventPtr, statusPtr);
+ break;
+ case kEventClassCommand:
+ TkMacOSXProcessCommandEvent(eventPtr, statusPtr);
+ break;
+ default: {
+ char buf[256];
+
+ LOG_MSG("Unrecognised event : %s\n",
+ TkMacOSXCarbonEventToAscii(eventPtr->eventRef, buf));
+ break;
+ }
+ }
return 0;
}
@@ -112,8 +111,8 @@ TkMacOSXProcessEvent(TkMacOSXEvent * eventPtr, MacEventStatus * statusPtr)
*
* TkMacOSXProcessMenuEvent --
*
- * This routine processes the event in eventPtr, and
- * generates the appropriate Tk events from it.
+ * This routine processes the event in eventPtr, and generates the
+ * appropriate Tk events from it.
*
* Results:
* True if event(s) are generated - false otherwise.
@@ -125,37 +124,37 @@ TkMacOSXProcessEvent(TkMacOSXEvent * eventPtr, MacEventStatus * statusPtr)
*/
MODULE_SCOPE int
-TkMacOSXProcessMenuEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
+TkMacOSXProcessMenuEvent(
+ TkMacOSXEvent *eventPtr,
+ MacEventStatus *statusPtr)
{
- int menuContext;
- OSStatus status;
+ int menuContext;
+ OSStatus status;
switch (eventPtr->eKind) {
- case kEventMenuBeginTracking:
- case kEventMenuEndTracking:
- break;
- default:
- return 0;
- break;
+ case kEventMenuBeginTracking:
+ case kEventMenuEndTracking:
+ break;
+ default:
+ return 0;
+ break;
}
- status = GetEventParameter(eventPtr->eventRef,
- kEventParamMenuContext,
- typeUInt32, NULL,
- sizeof(menuContext), NULL,
- &menuContext);
+ status = GetEventParameter(eventPtr->eventRef, kEventParamMenuContext,
+ typeUInt32, NULL, sizeof(menuContext), NULL, &menuContext);
if (status == noErr && (menuContext & kMenuContextMenuBar)) {
static int oldMode = TCL_SERVICE_ALL;
+
if (eventPtr->eKind == kEventMenuBeginTracking) {
oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
TkMacOSXClearMenubarActive();
-
+
/*
* Handle -postcommand
*/
-
+
TkMacOSXPreprocessMenu();
} else {
- Tcl_SetServiceMode(oldMode);
+ Tcl_SetServiceMode(oldMode);
}
}
return 0;
@@ -166,8 +165,8 @@ TkMacOSXProcessMenuEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
*
* TkMacOSXProcessCommandEvent --
*
- * This routine processes the event in eventPtr, and
- * generates the appropriate Tk events from it.
+ * This routine processes the event in eventPtr, and generates the
+ * appropriate Tk events from it.
*
* Results:
* True if event(s) are generated - false otherwise.
@@ -179,32 +178,29 @@ TkMacOSXProcessMenuEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
*/
MODULE_SCOPE int
-TkMacOSXProcessCommandEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
+TkMacOSXProcessCommandEvent(
+ TkMacOSXEvent *eventPtr,
+ MacEventStatus *statusPtr)
{
- HICommand command;
- int menuContext;
- OSStatus status;
+ HICommand command;
+ int menuContext;
+ OSStatus status;
switch (eventPtr->eKind) {
- case kEventCommandProcess:
- case kEventCommandUpdateStatus:
- break;
- default:
- return 0;
- break;
+ case kEventCommandProcess:
+ case kEventCommandUpdateStatus:
+ break;
+ default:
+ return 0;
+ break;
}
- status = GetEventParameter(eventPtr->eventRef,
- kEventParamDirectObject,
- typeHICommand, NULL,
- sizeof(command), NULL,
- &command);
+ status = GetEventParameter(eventPtr->eventRef, kEventParamDirectObject,
+ typeHICommand, NULL, sizeof(command), NULL, &command);
if (status == noErr && (command.attributes & kHICommandFromMenu)) {
if (eventPtr->eKind == kEventCommandProcess) {
- status = GetEventParameter(eventPtr->eventRef,
- kEventParamMenuContext,
- typeUInt32, NULL,
- sizeof(menuContext), NULL,
- &menuContext);
+ status = GetEventParameter(eventPtr->eventRef,
+ kEventParamMenuContext, typeUInt32, NULL,
+ sizeof(menuContext), NULL, &menuContext);
if (status == noErr && (menuContext & kMenuContextMenuBar) &&
(menuContext & kMenuContextMenuBarTracking)) {
TkMacOSXHandleMenuSelect(GetMenuID(command.menu.menuRef),
@@ -212,26 +208,26 @@ TkMacOSXProcessCommandEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
GetCurrentEventKeyModifiers() & optionKey);
return 1;
}
- } else {
+ } else if (command.commandID == kHICommandPreferences
+ && eventPtr->interp) {
Tcl_CmdInfo dummy;
- if (command.commandID == kHICommandPreferences && eventPtr->interp) {
- if (Tcl_GetCommandInfo(eventPtr->interp,
- "::tk::mac::ShowPreferences", &dummy)) {
- if (!IsMenuItemEnabled(command.menu.menuRef,
- command.menu.menuItemIndex)) {
- EnableMenuItem(command.menu.menuRef,
- command.menu.menuItemIndex);
- }
- } else {
- if (IsMenuItemEnabled(command.menu.menuRef,
- command.menu.menuItemIndex)) {
- DisableMenuItem(command.menu.menuRef,
- command.menu.menuItemIndex);
- }
+
+ if (Tcl_GetCommandInfo(eventPtr->interp,
+ "::tk::mac::ShowPreferences", &dummy)) {
+ if (!IsMenuItemEnabled(command.menu.menuRef,
+ command.menu.menuItemIndex)) {
+ EnableMenuItem(command.menu.menuRef,
+ command.menu.menuItemIndex);
+ }
+ } else {
+ if (IsMenuItemEnabled(command.menu.menuRef,
+ command.menu.menuItemIndex)) {
+ DisableMenuItem(command.menu.menuRef,
+ command.menu.menuItemIndex);
}
- statusPtr->stopProcessing = 1;
- return 1;
}
+ statusPtr->stopProcessing = 1;
+ return 1;
}
}
return 0;
@@ -256,17 +252,17 @@ TkMacOSXProcessCommandEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
*/
MODULE_SCOPE OSStatus
-TkMacOSXReceiveAndProcessEvent()
+TkMacOSXReceiveAndProcessEvent(void)
{
static EventTargetRef targetRef = NULL;
EventRef eventRef;
OSStatus err;
/*
- * This is a poll, since we have already counted the events coming
- * into this routine, and are guaranteed to have one waiting.
+ * This is a poll, since we have already counted the events coming into
+ * this routine, and are guaranteed to have one waiting.
*/
-
+
err = ReceiveNextEvent(0, NULL, kEventDurationNoWait, true, &eventRef);
if (err == noErr) {
if (!targetRef) {
@@ -277,11 +273,10 @@ TkMacOSXReceiveAndProcessEvent()
TkMacOSXStopTclEventLoopCarbonTimer();
#ifdef TK_MAC_DEBUG
if (err != noErr && err != eventLoopTimedOutErr
- && err != eventNotHandledErr
- ) {
- char buf [256];
- fprintf(stderr,
- "RCNE SendEventToEventTarget (%s) failed, %d\n",
+ && err != eventNotHandledErr) {
+ char buf[256];
+
+ ERR_MSG("RCNE SendEventToEventTarget (%s) failed, %d",
TkMacOSXCarbonEventToAscii(eventRef, buf), (int)err);
}
#endif
@@ -289,3 +284,11 @@ TkMacOSXReceiveAndProcessEvent()
}
return err;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXFont.c b/macosx/tkMacOSXFont.c
index 87d4c9c..00e88ac 100644
--- a/macosx/tkMacOSXFont.c
+++ b/macosx/tkMacOSXFont.c
@@ -1,8 +1,8 @@
/*
* tkMacOSXFont.c --
*
- * Contains the Macintosh implementation of the platform-independant
- * font package interface. This version uses ATSU instead of Quickdraw.
+ * Contains the Macintosh implementation of the platform-independant font
+ * package interface. This version uses ATSU instead of Quickdraw.
*
* Copyright 2002-2004 Benjamin Riefenstahl, Benjamin.Riefenstahl@epost.de
*
@@ -16,7 +16,6 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- *
* Todos:
*
* - Get away from Font Manager and Quickdraw functions as much as possible,
@@ -26,16 +25,16 @@
* instead of just assuming that they are the same.
*
* - Get a second font register going for fonts that are not assigned to a
- * font family by the OS. On my system I have 27 fonts of that type,
- * Hebrew, Arabic and Hindi fonts that actually come with the system.
+ * font family by the OS. On my system I have 27 fonts of that type, Hebrew,
+ * Arabic and Hindi fonts that actually come with the system.
* FMGetFontFamilyInstanceFromFont() returns -981 (kFMInvalidFontFamilyErr)
- * for these and they are not listed when enumerating families, but they
- * are when enumerating fonts directly. The problem that the OS sees may
- * be that at least some of them do not contain any Latin characters. Note
- * that such fonts can not be used for controls, because controls
- * definitely require a family id (this assertion needs testing).
+ * for these and they are not listed when enumerating families, but they are
+ * when enumerating fonts directly. The problem that the OS sees may be that
+ * at least some of them do not contain any Latin characters. Note that such
+ * fonts can not be used for controls, because controls definitely require a
+ * family id (this assertion needs testing).
*
- * RCS: @(#) $Id: tkMacOSXFont.c,v 1.21 2006/12/30 23:15:22 cc_benny Exp $
+ * RCS: @(#) $Id: tkMacOSXFont.c,v 1.22 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -46,40 +45,47 @@
#define TK_MAC_DEBUG_FONTS
#endif
*/
+#ifdef TK_MAC_DEBUG_FONTS
+#define FDBG DBG_MSG
+#else
+#define LOG_ON_ERR(...) /* nothing */
+#define FDBG(...) /* nothing */
+#endif
/* Define macros only available on Mac OS X 10.3 or later */
#ifndef FixedToInt
-#define FixedToInt(a) ((short)(((Fixed)(a) + fixed1/2) >> 16))
+#define FixedToInt(a) ((short)(((Fixed)(a) + fixed1/2) >> 16))
#endif
#ifndef IntToFixed
-#define IntToFixed(a) ((Fixed)(a) << 16)
+#define IntToFixed(a) ((Fixed)(a) << 16)
#endif
/*
- * Problem: The sum of two parts is not the same as the whole. In particular
+ * Problem: The sum of two parts is not the same as the whole. In particular
* the width of two separately measured strings will usually be larger than
- * the width of them pasted together. Tk has a design bug here, because it
- * generally assumes that this kind of arithmetic works.
- * To workaround this, #define TK_MAC_COALESCE_LINE to 1 below, we then avoid
- * lines that tremble and shiver while the cursor passes through them by
- * undercutting the system and behind the scenes pasting strings together that
- * look like they are on the same line and adjacent and that are drawn with
- * the same font. To do this we need some global data.
+ * the width of them pasted together. Tk has a design bug here, because it
+ * generally assumes that this kind of arithmetic works. To workaround this,
+ * #define TK_MAC_COALESCE_LINE to 1 below, we then avoid lines that tremble
+ * and shiver while the cursor passes through them by undercutting the system
+ * and behind the scenes pasting strings together that look like they are on
+ * the same line and adjacent and that are drawn with the same font. To do
+ * this we need some global data.
*/
+
#define TK_MAC_COALESCE_LINE 0
typedef TkMacOSXFont MacFont;
typedef TkMacOSXFontDrawingContext DrawingContext;
/*
- * Information about font families, initialized at startup time. Font
- * families are described by a mapping from UTF-8 names to MacOS font family
- * IDs. The whole list is kept as the sorted array "familyList", allocated
- * with ckrealloc().
+ * Information about font families, initialized at startup time. Font families
+ * are described by a mapping from UTF-8 names to MacOS font family IDs. The
+ * whole list is kept as the sorted array "familyList", allocated with
+ * ckrealloc().
*
* Note: This would have been easier, if we could just have used Tcl hash
- * arrays. Unfortunately there seems to be no pre-packaged
- * non-case-sensitive version of that available.
+ * arrays. Unfortunately there seems to be no pre-packaged non-case-sensitive
+ * version of that available.
*/
typedef struct {
@@ -89,43 +95,42 @@ typedef struct {
static MacFontFamily * familyList = NULL;
static int
- familyListNextFree = 0, /* The next free slot in familyList. */
- familyListMaxValid = 0, /* The top of the sorted area. */
- familyListSize = 0; /* The size of the whole array. */
+ familyListNextFree = 0, /* The next free slot in familyList. */
+ familyListMaxValid = 0, /* The top of the sorted area. */
+ familyListSize = 0; /* The size of the whole array. */
/*
* A simple one-shot sub-allocator for fast and efficient allocation of
- * strings. Used by the familyList array for the names. These strings are
- * only allocated once at startup and never freed. If you ever need to
+ * strings. Used by the familyList array for the names. These strings are only
+ * allocated once at startup and never freed. If you ever need to
* re-initialize this, you can just ckfree() all the StringBlocks in the list
* and start over.
*/
-#define STRING_BLOCK_MAX (1024-8) /* Make sizeof(StringBlock) ==
- * 1024. */
+#define STRING_BLOCK_MAX (1024-8) /* Make sizeof(StringBlock) ==
+ * 1024. */
typedef struct StringBlock {
- struct StringBlock * next; /* Starting from "stringMemory" these
- * blocks form a linked list. */
- int nextFree; /* Top of the used area in the
- * "strings" member. */
- char strings[STRING_BLOCK_MAX]; /* The actual memory managed here. */
+ struct StringBlock *next; /* Starting from "stringMemory" these
+ * blocks form a linked list. */
+ int nextFree; /* Top of the used area in the
+ * "strings" member. */
+ char strings[STRING_BLOCK_MAX]; /* The actual memory managed here. */
} StringBlock;
-static StringBlock * stringMemory = NULL;
-
+static StringBlock *stringMemory = NULL;
#if TK_MAC_COALESCE_LINE
-static Tcl_DString currentLine; /* The current line as seen so far. This
- * contains a Tcl_UniChar DString. */
+static Tcl_DString currentLine; /* The current line as seen so far. This
+ * contains a Tcl_UniChar DString. */
static int
- currentY = -1, /* The Y position (row in pixels) of the
- * current line. */
- currentLeft = -1, /* The left edge (pixels) of the current
- * line. */
- currentRight = -1; /* The right edge (pixels) of the current
- * line. */
-static const MacFont * currentFontPtr = NULL;
- /* The font of the current line. */
+ currentY = -1, /* The Y position (row in pixels) of the
+ * current line. */
+ currentLeft = -1, /* The left edge (pixels) of the current
+ * line. */
+ currentRight = -1; /* The right edge (pixels) of the current
+ * line. */
+static const MacFont *currentFontPtr = NULL;
+ /* The font of the current line. */
#endif /* TK_MAC_COALESCE_LINE */
static int antialiasedTextEnabled;
@@ -135,7 +140,7 @@ static int antialiasedTextEnabled;
*/
#define SYSTEMFONT_NAME "system"
-#define APPLFONT_NAME "application"
+#define APPLFONT_NAME "application"
/*
* Procedures used only in this file.
@@ -145,104 +150,88 @@ static int antialiasedTextEnabled;
* The actual workers.
*/
-static void MacFontDrawText(
- const MacFont * fontPtr,
- const char * source, int numBytes,
- int rangeStart, int rangeLength,
- int x, int y);
-static int MeasureStringWidth(
- const MacFont * fontPtr,
- int start, int end);
-
+static void MacFontDrawText(const MacFont *fontPtr,
+ const char * source, int numBytes, int rangeStart,
+ int rangeLength, int x, int y);
+static int MeasureStringWidth(const MacFont *fontPtr,
+ int start, int end);
#if TK_MAC_COALESCE_LINE
-static const Tcl_UniChar * UpdateLineBuffer(
- const MacFont * fontPtr,
- const DrawingContext * drawingContextPtr,
- const char * source, int numBytes,
- int x, int y,
- int * offset);
+static const Tcl_UniChar* UpdateLineBuffer(const MacFont * fontPtr,
+ const DrawingContext *drawingContextPtr,
+ const char *source, int numBytes, int x, int y,
+ int *offset);
#endif /* TK_MAC_COALESCE_LINE */
/*
* Initialization and setup of a font data structure.
*/
-static void InitFont(
- Tk_Window tkwin,
- FMFontFamily familyId, const char * familyName,
- int size, int qdStyle, MacFont * fontPtr);
-static void InitATSUObjects(
- FMFontFamily familyId,
- short qdsize, short qdStyle,
- ATSUFontID * fontIdPtr,
- ATSUTextLayout * layoutPtr, ATSUStyle * stylePtr);
-static void InitATSUStyle(
- ATSUFontID fontId, short ptSize, short qdStyle,
- ATSUStyle style);
-static void SetFontFeatures(
- ATSUFontID fontId, int fixed,
- ATSUStyle style);
-static void AdjustFontHeight(
- MacFont * fontPtr);
-static void InitATSULayout(
- const DrawingContext * drawingContextPtr,
- ATSUTextLayout layout, int fixed);
-static void ReleaseFont(
- MacFont * fontPtr);
+static void InitFont(Tk_Window tkwin, FMFontFamily familyId,
+ const char * familyName, int size, int qdStyle,
+ MacFont * fontPtr);
+static void InitATSUObjects(FMFontFamily familyId, short qdsize,
+ short qdStyle, ATSUFontID * fontIdPtr,
+ ATSUTextLayout *layoutPtr, ATSUStyle *stylePtr);
+static void InitATSUStyle(ATSUFontID fontId, short ptSize,
+ short qdStyle, ATSUStyle style);
+static void SetFontFeatures(ATSUFontID fontId, int fixed,
+ ATSUStyle style);
+static void AdjustFontHeight(MacFont *fontPtr);
+static void InitATSULayout(const DrawingContext*drawingContextPtr,
+ ATSUTextLayout layout, int fixed);
+static void ReleaseFont(MacFont *fontPtr);
/*
* Finding fonts by name.
*/
-static const MacFontFamily * FindFontFamilyOrAlias(
- const char * name);
-static const MacFontFamily * FindFontFamilyOrAliasOrFallback(
- const char * name);
+static const MacFontFamily* FindFontFamilyOrAlias(const char *name);
+static const MacFontFamily* FindFontFamilyOrAliasOrFallback(const char*name);
/*
* Doing interesting things with font families and fonts.
*/
-static void InitFontFamilies(void);
-static OSStatus GetFontFamilyName(
- FMFontFamily fontFamily, char * name, int numBytes);
+static void InitFontFamilies(void);
+static OSStatus GetFontFamilyName(FMFontFamily fontFamily, char *name,
+ int numBytes);
/*
* Accessor functions and internal utilities for the font family list.
*/
-static const MacFontFamily * AddFontFamily(
- const char * name, FMFontFamily familyId);
+static const MacFontFamily * AddFontFamily(const char *name,
+ FMFontFamily familyId);
static const MacFontFamily * FindFontFamily(const char * name);
-static Tcl_Obj * EnumFontFamilies(void);
-
-static OSStatus FontFamilyEnumCallback(ATSFontFamilyRef family, void *refCon);
-static void SortFontFamilies(void);
-static int CompareFontFamilies(const void * vp1, const void * vp2);
-static const char * AddString(const char * in);
+static Tcl_Obj * EnumFontFamilies(void);
+static OSStatus FontFamilyEnumCallback(ATSFontFamilyRef family,
+ void *refCon);
+static void SortFontFamilies(void);
+static int CompareFontFamilies(const void *vp1, const void *vp2);
+static const char * AddString(const char *in);
/*
*-------------------------------------------------------------------------
*
* TkpFontPkgInit --
*
- * This procedure is called when an application is created. It
- * initializes all the structures that are used by the
- * platform-dependant code on a per application basis.
+ * This procedure is called when an application is created. It
+ * initializes all the structures that are used by the platform-dependant
+ * code on a per application basis.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Initialization of variables local to this file.
+ * Initialization of variables local to this file.
*
*-------------------------------------------------------------------------
*/
void
TkpFontPkgInit(
- TkMainInfo * mainPtr) /* The application being created. */
+ TkMainInfo *mainPtr) /* The application being created. */
{
InitFontFamilies();
@@ -250,10 +239,7 @@ TkpFontPkgInit(
Tcl_DStringInit(&currentLine);
#endif
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "tkMacOSXFont.c (ATSU version) intialized "
- "(" __TIME__ ")\n");
-#endif
+ FDBG("tkMacOSXFont.c (ATSU version) intialized (" __TIME__ ")");
}
/*
@@ -261,41 +247,41 @@ TkpFontPkgInit(
*
* TkpGetNativeFont --
*
- * Map a platform-specific native font name to a TkFont.
+ * Map a platform-specific native font name to a TkFont.
*
* Results:
- * The return value is a pointer to a TkFont that represents the
- * native font. If a native font by the given name could not be
- * found, the return value is NULL.
+ * The return value is a pointer to a TkFont that represents the native
+ * font. If a native font by the given name could not be found, the
+ * return value is NULL.
*
- * Every call to this procedure returns a new TkFont structure, even
- * if the name has already been seen before. The caller should call
- * TkpDeleteFont() when the font is no longer needed.
+ * Every call to this procedure returns a new TkFont structure, even if
+ * the name has already been seen before. The caller should call
+ * TkpDeleteFont() when the font is no longer needed.
*
- * The caller is responsible for initializing the memory associated
- * with the generic TkFont when this function returns and releasing
- * the contents of the generics TkFont before calling TkpDeleteFont().
+ * The caller is responsible for initializing the memory associated with
+ * the generic TkFont when this function returns and releasing the
+ * contents of the generics TkFont before calling TkpDeleteFont().
*
* Side effects:
- * None.
+ * None.
*
*---------------------------------------------------------------------------
*/
TkFont *
TkpGetNativeFont(
- Tk_Window tkwin, /* For display where font will be used. */
- const char * name) /* Platform-specific font name. */
+ Tk_Window tkwin, /* For display where font will be used. */
+ const char * name) /* Platform-specific font name. */
{
FMFontFamily familyId;
MacFont * fontPtr;
if (strcmp(name, SYSTEMFONT_NAME) == 0) {
- familyId = GetSysFont();
+ familyId = GetSysFont();
} else if (strcmp(name, APPLFONT_NAME) == 0) {
- familyId = GetAppFont();
+ familyId = GetAppFont();
} else {
- return NULL;
+ return NULL;
}
fontPtr = (MacFont *) ckalloc(sizeof(MacFont));
@@ -309,74 +295,74 @@ TkpGetNativeFont(
*
* TkpGetFontFromAttributes --
*
- * Given a desired set of attributes for a font, find a font with the
- * closest matching attributes.
+ * Given a desired set of attributes for a font, find a font with the
+ * closest matching attributes.
*
* Results:
- * The return value is a pointer to a TkFont that represents the font
- * with the desired attributes. If a font with the desired attributes
- * could not be constructed, some other font will be substituted
- * automatically.
+ * The return value is a pointer to a TkFont that represents the font
+ * with the desired attributes. If a font with the desired attributes
+ * could not be constructed, some other font will be substituted
+ * automatically.
*
- * Every call to this procedure returns a new TkFont structure, even
- * if the specified attributes have already been seen before. The
- * caller should call TkpDeleteFont() to free the platform- specific
- * data when the font is no longer needed.
+ * Every call to this procedure returns a new TkFont structure, even if
+ * the specified attributes have already been seen before. The caller
+ * should call TkpDeleteFont() to free the platform-specific data when
+ * the font is no longer needed.
*
- * The caller is responsible for initializing the memory associated
- * with the generic TkFont when this function returns and releasing
- * the contents of the generic TkFont before calling TkpDeleteFont().
+ * The caller is responsible for initializing the memory associated with
+ * the generic TkFont when this function returns and releasing the
+ * contents of the generic TkFont before calling TkpDeleteFont().
*
* Side effects:
- * None.
+ * None.
*
*---------------------------------------------------------------------------
*/
TkFont *
TkpGetFontFromAttributes(
- TkFont * tkFontPtr, /* If non-NULL, store the information in this
- * existing TkFont structure, rather than
- * allocating a new structure to hold the font;
- * the existing contents of the font will be
- * released. If NULL, a new TkFont structure is
- * allocated. */
- Tk_Window tkwin, /* For display where font will be used. */
- const TkFontAttributes * faPtr)
- /* Set of attributes to match. */
+ TkFont *tkFontPtr, /* If non-NULL, store the information in this
+ * existing TkFont structure, rather than
+ * allocating a new structure to hold the
+ * font; the existing contents of the font
+ * will be released. If NULL, a new TkFont
+ * structure is allocated. */
+ Tk_Window tkwin, /* For display where font will be used. */
+ const TkFontAttributes *faPtr)
+ /* Set of attributes to match. */
{
short qdStyle;
FMFontFamily familyId;
- const char * name;
- const MacFontFamily * familyPtr;
- MacFont * fontPtr;
+ const char *name;
+ const MacFontFamily *familyPtr;
+ MacFont *fontPtr;
familyId = GetAppFont();
name = NULL;
qdStyle = 0;
if (faPtr->family != NULL) {
- familyPtr = FindFontFamilyOrAliasOrFallback(faPtr->family);
- if (familyPtr != NULL) {
- name = familyPtr->name;
- familyId = familyPtr->familyId;
- }
+ familyPtr = FindFontFamilyOrAliasOrFallback(faPtr->family);
+ if (familyPtr != NULL) {
+ name = familyPtr->name;
+ familyId = familyPtr->familyId;
+ }
}
if (faPtr->weight != TK_FW_NORMAL) {
- qdStyle |= bold;
+ qdStyle |= bold;
}
if (faPtr->slant != TK_FS_ROMAN) {
- qdStyle |= italic;
+ qdStyle |= italic;
}
if (faPtr->underline) {
- qdStyle |= underline;
+ qdStyle |= underline;
}
if (tkFontPtr == NULL) {
- fontPtr = (MacFont *) ckalloc(sizeof(MacFont));
+ fontPtr = (MacFont *) ckalloc(sizeof(MacFont));
} else {
- fontPtr = (MacFont *) tkFontPtr;
- ReleaseFont(fontPtr);
+ fontPtr = (MacFont *) tkFontPtr;
+ ReleaseFont(fontPtr);
}
InitFont(tkwin, familyId, name, faPtr->size, qdStyle, fontPtr);
@@ -388,23 +374,23 @@ TkpGetFontFromAttributes(
*
* TkpDeleteFont --
*
- * Called to release a font allocated by TkpGetNativeFont() or
- * TkpGetFontFromAttributes(). The caller should have already
- * released the fields of the TkFont that are used exclusively by the
- * generic TkFont code.
+ * Called to release a font allocated by TkpGetNativeFont() or
+ * TkpGetFontFromAttributes(). The caller should have already released
+ * the fields of the TkFont that are used exclusively by the generic
+ * TkFont code.
*
* Results:
- * TkFont is deallocated.
+ * TkFont is deallocated.
*
* Side effects:
- * None.
+ * None.
*
*---------------------------------------------------------------------------
*/
void
TkpDeleteFont(
- TkFont * tkFontPtr) /* Token of font to be deleted. */
+ TkFont *tkFontPtr) /* Token of font to be deleted. */
{
ReleaseFont((MacFont *) tkFontPtr);
}
@@ -414,23 +400,23 @@ TkpDeleteFont(
*
* TkpGetFontFamilies --
*
- * Return information about the font families that are available on
- * the display of the given window.
+ * Return information about the font families that are available on the
+ * display of the given window.
*
* Results:
- * Modifies interp's result object to hold a list of all the available
- * font families.
+ * Modifies interp's result object to hold a list of all the available
+ * font families.
*
* Side effects:
- * None.
+ * None.
*
*---------------------------------------------------------------------------
*/
void
TkpGetFontFamilies(
- Tcl_Interp * interp, /* Interp to hold result. */
- Tk_Window tkwin) /* For display to query. */
+ Tcl_Interp *interp, /* Interp to hold result. */
+ Tk_Window tkwin) /* For display to query. */
{
Tcl_SetObjResult(interp,EnumFontFamilies());
}
@@ -440,28 +426,30 @@ TkpGetFontFamilies(
*
* TkpGetSubFonts --
*
- * A function used by the testing package for querying the actual
- * screen fonts that make up a font object.
+ * A function used by the testing package for querying the actual screen
+ * fonts that make up a font object.
*
* Results:
- * Modifies interp's result object to hold a list containing the names
- * of the screen fonts that make up the given font object.
+ * Modifies interp's result object to hold a list containing the names of
+ * the screen fonts that make up the given font object.
*
* Side effects:
- * None.
+ * None.
*
*-------------------------------------------------------------------------
*/
void
TkpGetSubFonts(
- Tcl_Interp * interp, /* Interp to hold result. */
- Tk_Font tkfont) /* Font object to query. */
+ Tcl_Interp *interp, /* Interp to hold result. */
+ Tk_Font tkfont) /* Font object to query. */
{
- /* We don't know much about our fallback fonts, ATSU does all that for
- * us. We could use ATSUMatchFont to implement this function. But as
- * the information is only used for testing, such an effort seems not
- * very useful. */
+ /*
+ * We don't know much about our fallback fonts, ATSU does all that for us.
+ * We could use ATSUMatchFont to implement this function. But as the
+ * information is only used for testing, such an effort seems not very
+ * useful.
+ */
}
/*
@@ -469,24 +457,24 @@ TkpGetSubFonts(
*
* TkpGetFontAttrsForChar --
*
- * Retrieve the font attributes of the actual font used to render a
- * given character.
+ * Retrieve the font attributes of the actual font used to render a given
+ * character.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The font attributes are stored in *faPtr.
+ * The font attributes are stored in *faPtr.
*
*----------------------------------------------------------------------
*/
void
TkpGetFontAttrsForChar(
- Tk_Window tkwin, /* Window on the font's display */
- Tk_Font tkfont, /* Font to query */
- Tcl_UniChar c, /* Character of interest */
- TkFontAttributes* faPtr) /* Output: Font attributes */
+ Tk_Window tkwin, /* Window on the font's display */
+ Tk_Font tkfont, /* Font to query */
+ Tcl_UniChar c, /* Character of interest */
+ TkFontAttributes* faPtr) /* Output: Font attributes */
{
TkMacOSXFont* fontPtr = (TkMacOSXFont*) tkfont;
UniChar uchar = c;
@@ -497,8 +485,8 @@ TkpGetFontAttrsForChar(
UniCharCount changedLength;
/*
- * Most of the attributes are just copied from the base font. This
- * assumes that all fonts can have all attributes.
+ * Most of the attributes are just copied from the base font. This assumes
+ * that all fonts can have all attributes.
*/
*faPtr = fontPtr->font.fa;
@@ -515,57 +503,46 @@ TkpGetFontAttrsForChar(
TkMacOSXLayoutSetString(fontPtr, &drawingContext, &uchar, 1);
fontId = fontPtr->atsuFontId;
- err = ATSUMatchFontsToText(
- fontPtr->atsuLayout, 0, 1,
- &fontId, &changedOffset, &changedLength);
+ err = ATSUMatchFontsToText(fontPtr->atsuLayout, 0, 1,
+ &fontId, &changedOffset, &changedLength);
#ifdef TK_MAC_DEBUG_FONTS
if (err != kATSUFontsMatched && err != noErr) {
- fprintf(stderr, "TkpGetFontAttrsForChar: "
- "Can't match \\u%04X\n",
- (unsigned) c);
+ FDBG("TkpGetFontAttrsForChar: Can't match \\u%04X", (unsigned) c);
}
#endif
if (err == kATSUFontsMatched) {
-
- /*
- * A fallback was used and the actual font is in fontId. Determine
- * the name.
- */
-
- FMFontFamily fontFamilyId;
- FMFontStyle fontStyle;
- int i;
-
- err = FMGetFontFamilyInstanceFromFont(
- fontId, &fontFamilyId, &fontStyle);
+ /*
+ * A fallback was used and the actual font is in fontId. Determine the
+ * name.
+ */
+
+ FMFontFamily fontFamilyId;
+ FMFontStyle fontStyle;
+ int i;
+
+ err = FMGetFontFamilyInstanceFromFont(fontId, &fontFamilyId,
+ &fontStyle);
+ LOG_ON_ERR(FMGetFontFamilyInstanceFromFont);
+
+ if (err == noErr) {
+ /*
+ * Find the canonical name in our global list.
+ */
+
+ for (i=0; i<familyListMaxValid; ++i) {
+ if (fontFamilyId == familyList[i].familyId) {
+ faPtr->family = familyList[i].name;
+ break;
+ }
+ }
#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "FMGetFontFamilyInstanceFromFont: Error %d\n",
- (int) err);
- }
+ if (i >= familyListMaxValid) {
+ FDBG("TkpGetFontAttrsForChar: Can't find font %d for \\u%04X",
+ (int) fontFamilyId, (unsigned) c);
+ }
#endif
-
- if (err == noErr) {
-
- /*
- * Find the canonical name in our global list.
- */
-
- for (i=0; i<familyListMaxValid; ++i) {
- if (fontFamilyId == familyList[i].familyId) {
- faPtr->family = familyList[i].name;
- break;
- }
- }
-#ifdef TK_MAC_DEBUG_FONTS
- if (i >= familyListMaxValid) {
- fprintf(stderr, "TkpGetFontAttrsForChar: "
- "Can't find font %d for \\u%04X\n",
- (int) fontFamilyId, (unsigned) c);
- }
-#endif
- }
+ }
}
#if TK_MAC_USE_QUARZ
@@ -576,133 +553,124 @@ TkpGetFontAttrsForChar(
/*
*---------------------------------------------------------------------------
*
- * Tk_MeasureChars --
+ * Tk_MeasureChars --
*
- * Determine the number of characters from the string that will fit in
- * the given horizontal span. The measurement is done under the
- * assumption that Tk_DrawChars() will be used to actually display the
- * characters.
+ * Determine the number of characters from the string that will fit in
+ * the given horizontal span. The measurement is done under the
+ * assumption that Tk_DrawChars() will be used to actually display the
+ * characters.
*
- * With ATSUI we need the line context to do this right, so we have the
- * actual implementation in TkpMeasureCharsInContext().
+ * With ATSUI we need the line context to do this right, so we have the
+ * actual implementation in TkpMeasureCharsInContext().
*
* Results:
- *
- * The return value is the number of bytes from source that fit into the
- * span that extends from 0 to maxLength. *lengthPtr is filled with the
- * x-coordinate of the right edge of the last character that did fit.
+ * The return value is the number of bytes from source that fit into the
+ * span that extends from 0 to maxLength. *lengthPtr is filled with the
+ * x-coordinate of the right edge of the last character that did fit.
*
* Side effects:
- *
- * None.
+ * None.
*
* Todo:
- *
- * Effects of the "flags" parameter are untested.
+ * Effects of the "flags" parameter are untested.
*
*---------------------------------------------------------------------------
*/
int
Tk_MeasureChars(
- Tk_Font tkfont, /* Font in which characters will be drawn. */
- const char * source, /* UTF-8 string to be displayed. Need not be
- * '\0' terminated. */
- int numBytes, /* Maximum number of bytes to consider from
- * source string. */
- int maxLength, /* If >= 0, maxLength specifies the longest
- * permissible line length; don't consider any
- * character that would cross this x-position.
- * If < 0, then line length is unbounded and the
- * flags argument is ignored. */
- int flags, /* Various flag bits OR-ed together:
- * TK_PARTIAL_OK means include the last char
- * which only partially fit on this line.
- * TK_WHOLE_WORDS means stop on a word boundary,
- * if possible. TK_AT_LEAST_ONE means return at
- * least one character even if no characters
- * fit. */
- int * lengthPtr) /* Filled with x-location just after the
- * terminating character. */
+ Tk_Font tkfont, /* Font in which characters will be drawn. */
+ const char *source, /* UTF-8 string to be displayed. Need not be
+ * '\0' terminated. */
+ int numBytes, /* Maximum number of bytes to consider from
+ * source string. */
+ int maxLength, /* If >= 0, maxLength specifies the longest
+ * permissible line length; don't consider any
+ * character that would cross this x-position.
+ * If < 0, then line length is unbounded and
+ * the flags argument is ignored. */
+ int flags, /* Various flag bits OR-ed together:
+ * TK_PARTIAL_OK means include the last char
+ * which only partially fit on this line.
+ * TK_WHOLE_WORDS means stop on a word
+ * boundary, if possible. TK_AT_LEAST_ONE
+ * means return at least one character even if
+ * no characters fit. */
+ int *lengthPtr) /* Filled with x-location just after the
+ * terminating character. */
{
- return TkpMeasureCharsInContext(
- tkfont, source, numBytes, 0, numBytes, maxLength, flags, lengthPtr);
+ return TkpMeasureCharsInContext(tkfont, source, numBytes, 0, numBytes,
+ maxLength, flags, lengthPtr);
}
/*
*---------------------------------------------------------------------------
*
- * TkpMeasureCharsInContext --
+ * TkpMeasureCharsInContext --
*
- * Determine the number of bytes from the string that will fit in the
- * given horizontal span. The measurement is done under the assumption
- * that TkpDrawCharsInContext() will be used to actually display the
- * characters.
+ * Determine the number of bytes from the string that will fit in the
+ * given horizontal span. The measurement is done under the assumption
+ * that TkpDrawCharsInContext() will be used to actually display the
+ * characters.
*
- * This one is almost the same as Tk_MeasureChars(), but with access to
- * all the characters on the line for context.
+ * This one is almost the same as Tk_MeasureChars(), but with access to
+ * all the characters on the line for context.
*
* Results:
- * The return value is the number of bytes from source that
- * fit into the span that extends from 0 to maxLength. *lengthPtr is
- * filled with the x-coordinate of the right edge of the last
- * character that did fit.
+ * The return value is the number of bytes from source that fit into the
+ * span that extends from 0 to maxLength. *lengthPtr is filled with the
+ * x-coordinate of the right edge of the last character that did fit.
*
* Side effects:
- * None.
+ * None.
*
*---------------------------------------------------------------------------
*/
int
TkpMeasureCharsInContext(
- Tk_Font tkfont, /* Font in which characters will be drawn. */
- const char * source, /* UTF-8 string to be displayed. Need not be
- * '\0' terminated. */
- int numBytes, /* Maximum number of bytes to consider from
- * source string in all. */
- int rangeStart, /* Index of first byte to measure. */
- int rangeLength, /* Length of range to measure in bytes. */
- int maxLength, /* If >= 0, maxLength specifies the longest
- * permissible line length; don't consider any
- * character that would cross this x-position.
- * If < 0, then line length is unbounded and the
- * flags argument is ignored. */
- int flags, /* Various flag bits OR-ed together:
- * TK_PARTIAL_OK means include the last char
- * which only partially fits on this line.
- * TK_WHOLE_WORDS means stop on a word boundary,
- * if possible.
- * TK_AT_LEAST_ONE means return at least one
- * character (or at least the first partial word
- * in case TK_WHOLE_WORDS is also set) even if no
- * characters (words) fit.
- * TK_ISOLATE_END means that the last character
- * should not be considered in context with the
- * rest of the string (used for breaking
- * lines). */
- int * lengthPtr) /* Filled with x-location just after the
- * terminating character. */
+ Tk_Font tkfont, /* Font in which characters will be drawn. */
+ const char * source, /* UTF-8 string to be displayed. Need not be
+ * '\0' terminated. */
+ int numBytes, /* Maximum number of bytes to consider from
+ * source string in all. */
+ int rangeStart, /* Index of first byte to measure. */
+ int rangeLength, /* Length of range to measure in bytes. */
+ int maxLength, /* If >= 0, maxLength specifies the longest
+ * permissible line length; don't consider any
+ * character that would cross this x-position.
+ * If < 0, then line length is unbounded and
+ * the flags argument is ignored. */
+ int flags, /* Various flag bits OR-ed together:
+ * TK_PARTIAL_OK means include the last char
+ * which only partially fits on this line.
+ * TK_WHOLE_WORDS means stop on a word
+ * boundary, if possible. TK_AT_LEAST_ONE
+ * means return at least one character (or at
+ * least the first partial word in case
+ * TK_WHOLE_WORDS is also set) even if no
+ * characters (words) fit. TK_ISOLATE_END
+ * means that the last character should not be
+ * considered in context with the rest of the
+ * string (used for breaking lines). */
+ int *lengthPtr) /* Filled with x-location just after the
+ * terminating character. */
{
- const MacFont * fontPtr = (const MacFont *) tkfont;
- int curX = -1;
- int curByte = 0;
- UniChar * uchars;
+ const MacFont *fontPtr = (const MacFont *) tkfont;
+ int curX = -1, curByte = 0;
+ UniChar *uchars;
int ulen, urstart, urlen, urend;
Tcl_DString ucharBuffer;
DrawingContext drawingContext;
-
/*
* Sanity checks.
*/
if ((rangeStart < 0) || ((rangeStart+rangeLength) > numBytes)) {
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "MeasureChars: bad parameters\n");
-#endif
- *lengthPtr = 0;
- return 0;
+ FDBG("MeasureChars: bad parameters");
+ *lengthPtr = 0;
+ return 0;
}
/*
@@ -711,13 +679,11 @@ TkpMeasureCharsInContext(
if (rangeLength == 0 || (maxLength == 0 && !(flags & TK_AT_LEAST_ONE))) {
#ifdef TK_MAC_DEBUG_FONTS
- fflush(stdout);
- fprintf(stderr, "measure: '%.*s', empty\n",
- rangeLength, source+rangeStart);
- fflush(stderr);
+ fflush(stdout);
#endif
- *lengthPtr = 0;
- return 0;
+ FDBG("measure: '%.*s', empty", rangeLength, source+rangeStart);
+ *lengthPtr = 0;
+ return 0;
}
#if TK_MAC_USE_QUARZ
@@ -734,242 +700,217 @@ TkpMeasureCharsInContext(
urend = urstart + urlen;
if (maxLength < 0) {
-
- curX = MeasureStringWidth(fontPtr, urstart, urend);
- curByte = rangeLength;
-
+ curX = MeasureStringWidth(fontPtr, urstart, urend);
+ curByte = rangeLength;
} else {
-
- UniCharArrayOffset offset = 0;
- OSStatus err;
-
- /*
- * Have some upper limit on the size actually used.
- */
-
- if (maxLength > 32767) {
- maxLength = 32767;
- }
-
- offset = urstart;
- err = noErr;
-
- if (maxLength > 1) {
-
- /*
- * Let the system do some work by calculating a line break.
- *
- * Somehow ATSUBreakLine seems to assume that it needs at least
- * one pixel padding. So we add one to the limit. Note also
- * that ATSUBreakLine sometimes runs into an endless loop when
- * the third parameter is equal or less than IntToFixed(2), so we
- * need at least IntToFixed(3) (at least that's the current state
- * of my knowledge).
- */
-
- err = ATSUBreakLine(
- fontPtr->atsuLayout,
- urstart,
- IntToFixed(maxLength+1),
- false, /* !iUseAsSoftLineBreak */
- &offset);
-
- /*
- * There is no way to signal an error from this routine, so we
- * use predefined offset=urstart and otherwise ignore the
- * possibility.
- */
+ UniCharArrayOffset offset = 0;
+ OSStatus err;
+
+ /*
+ * Have some upper limit on the size actually used.
+ */
+
+ if (maxLength > 32767) {
+ maxLength = 32767;
+ }
+
+ offset = urstart;
+ err = noErr;
+
+ if (maxLength > 1) {
+ /*
+ * Let the system do some work by calculating a line break.
+ *
+ * Somehow ATSUBreakLine seems to assume that it needs at least
+ * one pixel padding. So we add one to the limit. Note also that
+ * ATSUBreakLine sometimes runs into an endless loop when the
+ * third parameter is equal or less than IntToFixed(2), so we need
+ * at least IntToFixed(3) (at least that's the current state of my
+ * knowledge).
+ */
+
+ err = ATSUBreakLine(fontPtr->atsuLayout, urstart,
+ IntToFixed(maxLength+1), false, /* !iUseAsSoftLineBreak */
+ &offset);
+
+ /*
+ * There is no way to signal an error from this routine, so we use
+ * predefined offset=urstart and otherwise ignore the possibility.
+ */
#ifdef TK_MAC_DEBUG_FONTS
- if ((err != noErr) && (err != kATSULineBreakInWord)) {
- fprintf(stderr, "ATSUBreakLine(): Error %d for '%.*s'\n",
- (int) err, rangeLength, source+rangeStart);
- }
+ if ((err != noErr) && (err != kATSULineBreakInWord)) {
+ FDBG("ATSUBreakLine(): Error %d for '%.*s'",
+ (int) err, rangeLength, source+rangeStart);
+ }
#endif
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "measure: '%.*s', break offset=%d, errcode=%d\n",
- rangeLength, source+rangeStart, (int) offset, (int) err);
-#endif
-
- /*
- * ATSUBreakLine includes the whitespace that separates words,
- * but we don't want that. Besides, ATSUBreakLine thinks that
- * spaces don't occupy pixels at the end of the break, which is
- * also something we like to decide for ourself.
- */
-
- while ((offset > (UniCharArrayOffset)urstart) && (uchars[offset-1] == ' ')) {
- offset--;
- }
-
- /*
- * Fix up left-overs for the TK_WHOLE_WORDS case.
- */
-
- if (flags & TK_WHOLE_WORDS) {
- if(flags & TK_AT_LEAST_ONE) {
-
- /*
- * If we are the the start of the range, we need to look
- * forward. If we are not at the end of a word, we must
- * be in the middle of the first word, so we also look
- * forward.
- */
-
- if ((offset == (UniCharArrayOffset)urstart) || (uchars[offset] != ' ')) {
- while ((offset < (UniCharArrayOffset)urend)
- && (uchars[offset] != ' ')) {
- offset++;
- }
- }
- } else {
-
- /*
- * If we are not at the end of a word, we need to look
- * backward.
- */
-
- if ((offset != (UniCharArrayOffset)urend) && (uchars[offset] != ' ')) {
- while ((offset > (UniCharArrayOffset)urstart)
- && (uchars[offset-1] != ' ')) {
- offset--;
- }
- while ((offset > (UniCharArrayOffset)urstart)
- && (uchars[offset-1] == ' ')) {
- offset--;
- }
- }
- }
- }
- }
-
- if (offset > (UniCharArrayOffset)urend) {
- offset = urend;
- }
-
- /*
- * If "flags" says that we don't actually want a word break, we need
- * to find the next character break ourself, as ATSUBreakLine() will
- * only give us word breaks. Do a simple linear search.
- */
-
- if ((err != kATSULineBreakInWord)
- && !(flags & TK_WHOLE_WORDS)
- && (offset <= (UniCharArrayOffset)urend)) {
-
- UniCharArrayOffset lastOffset = offset;
- UniCharArrayOffset nextoffset;
- int lastX = -1;
- int wantonemorechar = -1; /* undecided */
-
- while (offset <= (UniCharArrayOffset)urend) {
-
- if (flags & TK_ISOLATE_END) {
- TkMacOSXLayoutSetString(fontPtr, &drawingContext,
- uchars, offset);
- }
- curX = MeasureStringWidth(fontPtr, urstart, offset);
-
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "measure: '%.*s', try until=%d, width=%d\n",
- rangeLength, source+rangeStart, (int) offset, curX);
-#endif
-
- if (curX > maxLength) {
-
- /*
- * Even if we are over the limit, we may want another
- * character in some situations. Than we keep looking
- * for one more character.
- */
-
- if (wantonemorechar == -1) {
- wantonemorechar =
- ((flags & TK_AT_LEAST_ONE)
- && (lastOffset == (UniCharArrayOffset)urstart))
- ||
- ((flags & TK_PARTIAL_OK)
- && (lastX != maxLength))
- ;
- if (!wantonemorechar) {
- break;
- }
- lastX = curX;
- }
-
- /*
- * There may belong combining marks to this character.
- * Wait for a new curX to collect them all.
- */
-
- if (lastX != curX) {
- break;
- }
- }
-
- /*
- * Save this position, so we can come back to it.
- */
-
- lastX = curX;
- lastOffset = offset;
-
- /*
- * Increment offset by one character, taking combining marks
- * into account.
- */
-
- if (offset >= (UniCharArrayOffset)urend) {
- break;
- }
- nextoffset = 0;
- if (flags & TK_ISOLATE_END) {
- TkMacOSXLayoutSetString(fontPtr, &drawingContext,
- uchars, ulen);
- }
- err = ATSUNextCursorPosition(
- fontPtr->atsuLayout,
- offset,
- kATSUByCluster,
- &nextoffset);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "ATSUNextCursorPosition(): "
- "Error %d\n", (int) err);
-#endif
- break;
- }
- if (nextoffset <= offset) {
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "ATSUNextCursorPosition(): "
- "Can't move further "
- "(shouldn't happen, bad data?)\n");
-#endif
- break;
- }
-
- offset = nextoffset;
- }
-
- /*
- * We have overshot one character, so backup one position.
- */
-
- curX = lastX;
- offset = lastOffset;
- }
-
- if (curX < 0) {
- if (flags & TK_ISOLATE_END) {
- TkMacOSXLayoutSetString(fontPtr, &drawingContext,
- uchars, offset);
- }
- curX = MeasureStringWidth(fontPtr, urstart, offset);
- }
-
- curByte = Tcl_UtfAtIndex(source, offset) - source;
- curByte -= rangeStart;
+ FDBG("measure: '%.*s', break offset=%d, errcode=%d",
+ rangeLength, source+rangeStart, (int) offset, (int) err);
+
+ /*
+ * ATSUBreakLine includes the whitespace that separates words, but
+ * we don't want that. Besides, ATSUBreakLine thinks that spaces
+ * don't occupy pixels at the end of the break, which is also
+ * something we like to decide for ourself.
+ */
+
+ while ((offset > (UniCharArrayOffset)urstart)
+ && (uchars[offset-1] == ' ')) {
+ offset--;
+ }
+
+ /*
+ * Fix up left-overs for the TK_WHOLE_WORDS case.
+ */
+
+ if (flags & TK_WHOLE_WORDS) {
+ if (flags & TK_AT_LEAST_ONE) {
+ /*
+ * If we are the the start of the range, we need to look
+ * forward. If we are not at the end of a word, we must be
+ * in the middle of the first word, so we also look
+ * forward.
+ */
+
+ if ((offset == (UniCharArrayOffset)urstart)
+ || (uchars[offset] != ' ')) {
+ while ((offset < (UniCharArrayOffset)urend)
+ && (uchars[offset] != ' ')) {
+ offset++;
+ }
+ }
+ } else {
+ /*
+ * If we are not at the end of a word, we need to look
+ * backward.
+ */
+
+ if ((offset != (UniCharArrayOffset)urend)
+ && (uchars[offset] != ' ')) {
+ while ((offset > (UniCharArrayOffset)urstart)
+ && (uchars[offset-1] != ' ')) {
+ offset--;
+ }
+ while ((offset > (UniCharArrayOffset)urstart)
+ && (uchars[offset-1] == ' ')) {
+ offset--;
+ }
+ }
+ }
+ }
+ }
+
+ if (offset > (UniCharArrayOffset)urend) {
+ offset = urend;
+ }
+
+ /*
+ * If "flags" says that we don't actually want a word break, we need
+ * to find the next character break ourself, as ATSUBreakLine() will
+ * only give us word breaks. Do a simple linear search.
+ */
+
+ if ((err != kATSULineBreakInWord)
+ && !(flags & TK_WHOLE_WORDS)
+ && (offset <= (UniCharArrayOffset)urend)) {
+ UniCharArrayOffset lastOffset = offset;
+ UniCharArrayOffset nextoffset;
+ int lastX = -1;
+ int wantonemorechar = -1; /* undecided */
+
+ while (offset <= (UniCharArrayOffset)urend) {
+ if (flags & TK_ISOLATE_END) {
+ TkMacOSXLayoutSetString(fontPtr, &drawingContext,
+ uchars, offset);
+ }
+ curX = MeasureStringWidth(fontPtr, urstart, offset);
+
+ FDBG("measure: '%.*s', try until=%d, width=%d",
+ rangeLength, source+rangeStart, (int) offset, curX);
+
+ if (curX > maxLength) {
+ /*
+ * Even if we are over the limit, we may want another
+ * character in some situations. Than we keep looking for
+ * one more character.
+ */
+
+ if (wantonemorechar == -1) {
+ wantonemorechar =
+ ((flags & TK_AT_LEAST_ONE)
+ && (lastOffset == (UniCharArrayOffset)urstart))
+ || ((flags & TK_PARTIAL_OK)
+ && (lastX != maxLength));
+ if (!wantonemorechar) {
+ break;
+ }
+ lastX = curX;
+ }
+
+ /*
+ * There may belong combining marks to this character.
+ * Wait for a new curX to collect them all.
+ */
+
+ if (lastX != curX) {
+ break;
+ }
+ }
+
+ /*
+ * Save this position, so we can come back to it.
+ */
+
+ lastX = curX;
+ lastOffset = offset;
+
+ /*
+ * Increment offset by one character, taking combining marks
+ * into account.
+ */
+
+ if (offset >= (UniCharArrayOffset)urend) {
+ break;
+ }
+ nextoffset = 0;
+ if (flags & TK_ISOLATE_END) {
+ TkMacOSXLayoutSetString(fontPtr, &drawingContext,
+ uchars, ulen);
+ }
+ err = ATSUNextCursorPosition(fontPtr->atsuLayout, offset,
+ kATSUByCluster, &nextoffset);
+ if (err != noErr) {
+ FDBG("ATSUNextCursorPosition(): Error %d", (int) err);
+ break;
+ }
+ if (nextoffset <= offset) {
+ FDBG("ATSUNextCursorPosition(): Can't move further "
+ "(shouldn't happen, bad data?)");
+ break;
+ }
+
+ offset = nextoffset;
+ }
+
+ /*
+ * We have overshot one character, so backup one position.
+ */
+
+ curX = lastX;
+ offset = lastOffset;
+ }
+
+ if (curX < 0) {
+ if (flags & TK_ISOLATE_END) {
+ TkMacOSXLayoutSetString(fontPtr, &drawingContext,
+ uchars, offset);
+ }
+ curX = MeasureStringWidth(fontPtr, urstart, offset);
+ }
+
+ curByte = Tcl_UtfAtIndex(source, offset) - source;
+ curByte -= rangeStart;
}
Tcl_DStringFree(&ucharBuffer);
@@ -980,13 +921,12 @@ TkpMeasureCharsInContext(
#ifdef TK_MAC_DEBUG_FONTS
fflush(stdout);
- fprintf(stderr, "measure: '%.*s', maxpix=%d, -> width=%d, bytes=%d, "
- "flags=%s%s%s%s\n",
- rangeLength, source+rangeStart, maxLength, curX, curByte,
- flags & TK_PARTIAL_OK ? "partialOk " : "",
- flags & TK_WHOLE_WORDS ? "wholeWords " : "",
- flags & TK_AT_LEAST_ONE ? "atLeastOne " : "",
- flags & TK_ISOLATE_END ? "isolateEnd " : "");
+ FDBG("measure: '%.*s', maxpix=%d, -> width=%d, bytes=%d, flags=%s%s%s%s",
+ rangeLength, source+rangeStart, maxLength, curX, curByte,
+ flags & TK_PARTIAL_OK ? "partialOk " : "",
+ flags & TK_WHOLE_WORDS ? "wholeWords " : "",
+ flags & TK_AT_LEAST_ONE ? "atLeastOne " : "",
+ flags & TK_ISOLATE_END ? "isolateEnd " : "");
fflush(stderr);
#endif
@@ -999,42 +939,40 @@ TkpMeasureCharsInContext(
*
* Tk_DrawChars --
*
- * Draw a string of characters on the screen.
+ * Draw a string of characters on the screen.
*
- * With ATSUI we need the line context to do this right, so we have the
- * actual implementation in TkpDrawCharsInContext().
+ * With ATSUI we need the line context to do this right, so we have the
+ * actual implementation in TkpDrawCharsInContext().
*
* Results:
- *
- * None.
+ * None.
*
* Side effects:
- *
- * Information gets drawn on the screen.
+ * Information gets drawn on the screen.
*
*---------------------------------------------------------------------------
*/
void
Tk_DrawChars(
- Display * display, /* Display on which to draw. */
- Drawable drawable, /* Window or pixmap in which to draw. */
- GC gc, /* Graphics context for drawing characters. */
- Tk_Font tkfont, /* Font in which characters will be drawn; must
- * be the same as font used in GC. */
- const char * source, /* UTF-8 string to be displayed. Need not be
- * '\0' terminated. All Tk meta-characters
- * (tabs, control characters, and newlines)
- * should be stripped out of the string that is
- * passed to this function. If they are not
- * stripped out, they will be displayed as
- * regular printing characters. */
- int numBytes, /* Number of bytes in string. */
- int x, int y) /* Coordinates at which to place origin of the
- * string when drawing. */
+ Display *display, /* Display on which to draw. */
+ Drawable drawable, /* Window or pixmap in which to draw. */
+ GC gc, /* Graphics context for drawing characters. */
+ Tk_Font tkfont, /* Font in which characters will be drawn; must
+ * be the same as font used in GC. */
+ const char *source, /* UTF-8 string to be displayed. Need not be
+ * '\0' terminated. All Tk meta-characters
+ * (tabs, control characters, and newlines)
+ * should be stripped out of the string that
+ * is passed to this function. If they are not
+ * stripped out, they will be displayed as
+ * regular printing characters. */
+ int numBytes, /* Number of bytes in string. */
+ int x, int y) /* Coordinates at which to place origin of the
+ * string when drawing. */
{
TkpDrawCharsInContext(display, drawable, gc, tkfont, source, numBytes,
- 0, numBytes, x, y);
+ 0, numBytes, x, y);
}
@@ -1043,46 +981,45 @@ Tk_DrawChars(
*
* TkpDrawCharsInContext --
*
- * Draw a string of characters on the screen like Tk_DrawChars(), with
- * access to all the characters on the line for context.
+ * Draw a string of characters on the screen like Tk_DrawChars(), with
+ * access to all the characters on the line for context.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Information gets drawn on the screen.
+ * Information gets drawn on the screen.
*
* Todo:
+ * We could try to implement a correct stipple algorithm.
*
- * We could try to implement a correct stipple algorithm.
- *
- * The fiddling with QD GraphPorts can be replaced with just working
- * with the Quarz CGContext (see TkMacOSXQuarzStartDraw()), once we
- * decide to stick to Quarz and really forget about QD drawing in here.
+ * The fiddling with QD GraphPorts can be replaced with just working with
+ * the Quarz CGContext (see TkMacOSXQuarzStartDraw()), once we decide to
+ * stick to Quarz and really forget about QD drawing in here.
*
*---------------------------------------------------------------------------
*/
void
TkpDrawCharsInContext(
- Display * display, /* Display on which to draw. */
- Drawable drawable, /* Window or pixmap in which to draw. */
- GC gc, /* Graphics context for drawing characters. */
- Tk_Font tkfont, /* Font in which characters will be drawn; must
- * be the same as font used in GC. */
- const char * source, /* UTF-8 string to be displayed. Need not be
- * '\0' terminated. All Tk meta-characters
- * (tabs, control characters, and newlines)
- * should be stripped out of the string that is
- * passed to this function. If they are not
- * stripped out, they will be displayed as
- * regular printing characters. */
- int numBytes, /* Number of bytes in string. */
- int rangeStart, /* Index of first byte to draw. */
- int rangeLength, /* Length of range to draw in bytes. */
- int x, int y) /* Coordinates at which to place origin of the
- * whole (not just the range) string when
- * drawing. */
+ Display *display, /* Display on which to draw. */
+ Drawable drawable, /* Window or pixmap in which to draw. */
+ GC gc, /* Graphics context for drawing characters. */
+ Tk_Font tkfont, /* Font in which characters will be drawn; must
+ * be the same as font used in GC. */
+ const char * source, /* UTF-8 string to be displayed. Need not be
+ * '\0' terminated. All Tk meta-characters
+ * (tabs, control characters, and newlines)
+ * should be stripped out of the string that
+ * is passed to this function. If they are not
+ * stripped out, they will be displayed as
+ * regular printing characters. */
+ int numBytes, /* Number of bytes in string. */
+ int rangeStart, /* Index of first byte to draw. */
+ int rangeLength, /* Length of range to draw in bytes. */
+ int x, int y) /* Coordinates at which to place origin of the
+ * whole (not just the range) string when
+ * drawing. */
{
const MacFont * fontPtr;
MacDrawable * macWin;
@@ -1107,54 +1044,52 @@ TkpDrawCharsInContext(
GetForeColor(&origColor);
if ((gc->fill_style == FillStippled
- || gc->fill_style == FillOpaqueStippled)
- && gc->stipple != None) {
-
- Pixmap pixmap;
- GWorldPtr bufferPort;
- Pattern white;
-
- stippleMap = TkMacOSXMakeStippleMap(drawable, gc->stipple);
-
- pixmap = Tk_GetPixmap(display, drawable,
- stippleMap->bounds.right, stippleMap->bounds.bottom, 0);
-
- bufferPort = TkMacOSXGetDrawablePort(pixmap);
- SetGWorld(bufferPort, NULL);
-
- if (TkSetMacColor(gc->foreground, &macColor)) {
- RGBForeColor(&macColor);
- }
- GetQDGlobalsWhite(&white);
- ShowPen();
- FillRect(&stippleMap->bounds, &white);
- MacFontDrawText(fontPtr, source, numBytes, rangeStart, rangeLength,
- 0, 0);
- HidePen();
-
- SetGWorld(destPort, NULL);
-
- CopyDeepMask(GetPortBitMapForCopyBits(bufferPort), stippleMap,
- GetPortBitMapForCopyBits(destPort), &stippleMap->bounds,
- &stippleMap->bounds, &portRect,
- srcOr, NULL);
-
- /*
- * TODO: this doesn't work quite right - it does a blend. you can't
- * draw white text when you have a stipple.
- */
-
- Tk_FreePixmap(display, pixmap);
- ckfree(stippleMap->baseAddr);
- ckfree((char *)stippleMap);
+ || gc->fill_style == FillOpaqueStippled)
+ && gc->stipple != None) {
+ Pixmap pixmap;
+ GWorldPtr bufferPort;
+ Pattern white;
+
+ stippleMap = TkMacOSXMakeStippleMap(drawable, gc->stipple);
+
+ pixmap = Tk_GetPixmap(display, drawable,
+ stippleMap->bounds.right, stippleMap->bounds.bottom, 0);
+
+ bufferPort = TkMacOSXGetDrawablePort(pixmap);
+ SetGWorld(bufferPort, NULL);
+
+ if (TkSetMacColor(gc->foreground, &macColor)) {
+ RGBForeColor(&macColor);
+ }
+ GetQDGlobalsWhite(&white);
+ ShowPen();
+ FillRect(&stippleMap->bounds, &white);
+ MacFontDrawText(fontPtr, source, numBytes, rangeStart, rangeLength,
+ 0, 0);
+ HidePen();
+
+ SetGWorld(destPort, NULL);
+
+ CopyDeepMask(GetPortBitMapForCopyBits(bufferPort), stippleMap,
+ GetPortBitMapForCopyBits(destPort), &stippleMap->bounds,
+ &stippleMap->bounds, &portRect, srcOr, NULL);
+
+ /*
+ * TODO: this doesn't work quite right - it does a blend. You can't
+ * draw white text when you have a stipple.
+ */
+
+ Tk_FreePixmap(display, pixmap);
+ ckfree(stippleMap->baseAddr);
+ ckfree((char *)stippleMap);
} else {
- if (TkSetMacColor(gc->foreground, &macColor)) {
- RGBForeColor(&macColor);
- }
- ShowPen();
- MacFontDrawText(fontPtr, source, numBytes, rangeStart, rangeLength,
- macWin->xOff + x, macWin->yOff + y);
- HidePen();
+ if (TkSetMacColor(gc->foreground, &macColor)) {
+ RGBForeColor(&macColor);
+ }
+ ShowPen();
+ MacFontDrawText(fontPtr, source, numBytes, rangeStart, rangeLength,
+ macWin->xOff + x, macWin->yOff + y);
+ HidePen();
}
RGBForeColor(&origColor);
@@ -1171,34 +1106,31 @@ TkpDrawCharsInContext(
*
* TkMacOSXQuarzStartDraw --
*
- * Setup a Quarz CGContext from the current QD GraphPort for use in
- * drawing or measuring.
+ * Setup a Quarz CGContext from the current QD GraphPort for use in
+ * drawing or measuring.
*
* Results:
- *
- * A CGContext is allocated, configured and returned in
- * drawingContextPtr. Also drawingContextPtr->portRect is filled in.
+ * A CGContext is allocated, configured and returned in
+ * drawingContextPtr. Also drawingContextPtr->portRect is filled in.
*
* Side effects:
- *
- * None.
+ * None.
*
* Assumptions:
- *
- * The current QD GraphPort contains all the data necessary. This is
- * clearly the case for the actual drawing, but not so clear for
- * measuring. OTOH for measuring the specific parameters are not really
- * interesting and the GraphPort is not changed either. The
- * availability of a CGContext may be important for the measuring
- * process though.
+ * The current QD GraphPort contains all the data necessary. This is
+ * clearly the case for the actual drawing, but not so clear for
+ * measuring. OTOH for measuring the specific parameters are not really
+ * interesting and the GraphPort is not changed either. The availability
+ * of a CGContext may be important for the measuring process though.
*
*-------------------------------------------------------------------------
*/
void
TkMacOSXQuarzStartDraw(
- DrawingContext * drawingContextPtr) /* Quarz context data filled in
- * by this function. */
+ DrawingContext *drawingContextPtr)
+ /* Quarz context data filled in by this
+ * function. */
{
GDHandle currentDevice;
CGrafPtr destPort;
@@ -1213,53 +1145,47 @@ TkMacOSXQuarzStartDraw(
err = QDBeginCGContext(destPort, &outContext);
if (err == noErr && outContext) {
- /*
- * Now clip the CG Context to the port. We also have to intersect our clip
- * region with the port visible region so we don't overwrite the window
- * decoration.
- */
-
- if (!clipRgn) {
- clipRgn = NewRgn();
- }
-
- GetPortBounds(destPort, &boundsRect);
-
- RectRgn(clipRgn, &boundsRect);
- SectRegionWithPortClipRegion(destPort, clipRgn);
- SectRegionWithPortVisibleRegion(destPort, clipRgn);
- ClipCGContextToRegion(outContext, &boundsRect, clipRgn);
- SetEmptyRgn(clipRgn);
-
- /*
- * Note: You have to call SyncCGContextOriginWithPort
- * AFTER all the clip region manipulations.
- */
-
- SyncCGContextOriginWithPort(outContext, destPort);
-
- /*
- * Scale the color values, as QD uses UInt16 with the range [0..2^16-1]
- * while Quarz uses float with [0..1]. NB: Only
- * CGContextSetRGBFillColor() seems to be actually used by ATSU.
- */
-
- GetForeColor(&macColor);
- CGContextSetRGBFillColor(outContext,
- RGBFLOATRED(macColor),
- RGBFLOATGREEN(macColor),
- RGBFLOATBLUE(macColor),
- 1.0f);
- #ifdef TK_MAC_DEBUG_FONTS
+ /*
+ * Now clip the CG Context to the port. We also have to intersect our
+ * clip region with the port visible region so we don't overwrite the
+ * window decoration.
+ */
+
+ if (!clipRgn) {
+ clipRgn = NewRgn();
+ }
+
+ GetPortBounds(destPort, &boundsRect);
+
+ RectRgn(clipRgn, &boundsRect);
+ SectRegionWithPortClipRegion(destPort, clipRgn);
+ SectRegionWithPortVisibleRegion(destPort, clipRgn);
+ ClipCGContextToRegion(outContext, &boundsRect, clipRgn);
+ SetEmptyRgn(clipRgn);
+
+ /*
+ * Note: You have to call SyncCGContextOriginWithPort AFTER all the
+ * clip region manipulations.
+ */
+
+ SyncCGContextOriginWithPort(outContext, destPort);
+
+ /*
+ * Scale the color values, as QD uses UInt16 with the range
+ * [0..2^16-1] while Quarz uses float with [0..1]. NB: Only
+ * CGContextSetRGBFillColor() seems to be actually used by ATSU.
+ */
+
+ GetForeColor(&macColor);
+ CGContextSetRGBFillColor(outContext, RGBFLOATRED(macColor),
+ RGBFLOATGREEN(macColor), RGBFLOATBLUE(macColor), 1.0f);
} else {
- fprintf(stderr, "QDBeginCGContext(): Error %d\n", (int) err);
- #endif
+ FDBG("QDBeginCGContext(): Error %d", (int) err);
}
drawingContextPtr->graphPort = destPort;
drawingContextPtr->cgContext = outContext;
drawingContextPtr->portRect = boundsRect;
-
}
/*
@@ -1267,16 +1193,16 @@ TkMacOSXQuarzStartDraw(
*
* TkMacOSXQuarzEndDraw --
*
- * Free the Quarz CGContext in drawingContextPtr.
+ * Free the Quarz CGContext in drawingContextPtr.
*
* Results:
*
- * The CGContext is de-allocated. drawingContextPtr->cgContext will be
- * invalid after this.
+ * The CGContext is de-allocated. drawingContextPtr->cgContext will be
+ * invalid after this.
*
* Side effects:
*
- * None.
+ * None.
*
*-------------------------------------------------------------------------
*/
@@ -1287,8 +1213,8 @@ TkMacOSXQuarzEndDraw(
{
if (drawingContextPtr->cgContext) {
QDEndCGContext(
- drawingContextPtr->graphPort,
- &drawingContextPtr->cgContext);
+ drawingContextPtr->graphPort,
+ &drawingContextPtr->cgContext);
}
}
#endif /* TK_MAC_USE_QUARZ */
@@ -1298,28 +1224,28 @@ TkMacOSXQuarzEndDraw(
*
* MacFontDrawText --
*
- * Helper function for Tk_DrawChars. Draws characters, using the
- * screen font in fontPtr to draw multilingual characters.
+ * Helper function for Tk_DrawChars. Draws characters, using the screen
+ * font in fontPtr to draw multilingual characters.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Information gets drawn on the screen.
+ * Information gets drawn on the screen.
*
*-------------------------------------------------------------------------
*/
static void
MacFontDrawText(
- const MacFont * fontPtr, /* Contains font to use when drawing
- * following string. */
- const char * source, /* Potentially multilingual UTF-8 string. */
- int numBytes, /* Length of string in bytes. */
- int rangeStart, /* Index of first byte to draw. */
- int rangeLength, /* Length of range to draw in bytes. */
- int x, int y) /* Coordinates at which to place origin of
- * string when drawing. */
+ const MacFont *fontPtr, /* Contains font to use when drawing
+ * following string. */
+ const char *source, /* Potentially multilingual UTF-8 string. */
+ int numBytes, /* Length of string in bytes. */
+ int rangeStart, /* Index of first byte to draw. */
+ int rangeLength, /* Length of range to draw in bytes. */
+ int x, int y) /* Coordinates at which to place origin of
+ * string when drawing. */
{
Fixed fx, fy;
int ulen, urstart, urlen;
@@ -1332,12 +1258,11 @@ MacFontDrawText(
Tcl_DString runString;
#endif
-
#if TK_MAC_USE_QUARZ
TkMacOSXQuarzStartDraw(&drawingContext);
/*
- * Turn the y coordinate upside-down for Quarz drawing. We would have
+ * Turn the y coordinate upside-down for Quarz drawing. We would have
* liked to just use a CTM transform in the CGContext, but than we get
* upside-down text, so doing it that way gets more painfull than to just
* hack around the problem right here.
@@ -1349,10 +1274,9 @@ MacFontDrawText(
fy = IntToFixed(y);
#endif
-
#if TK_MAC_COALESCE_LINE
- UpdateLineBuffer(
- fontPtr, &drawingContext, source, numBytes, x, y, &lineOffset);
+ UpdateLineBuffer(fontPtr, &drawingContext, source, numBytes, x, y,
+ &lineOffset);
fx = IntToFixed(currentLeft);
@@ -1372,15 +1296,8 @@ MacFontDrawText(
urstart = Tcl_NumUtfChars(source, rangeStart);
urlen = Tcl_NumUtfChars(source+rangeStart,rangeLength);
- err = ATSUDrawText(
- fontPtr->atsuLayout,
- lineOffset+urstart, urlen,
- fx, fy);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUDrawText(): Error %d\n", (int) err);
- }
-#endif
+ err = ATSUDrawText(fontPtr->atsuLayout, lineOffset+urstart, urlen, fx,fy);
+ LOG_ON_ERR(ATSUDrawText);
#if !TK_MAC_COALESCE_LINE
Tcl_DStringFree(&runString);
@@ -1390,46 +1307,42 @@ MacFontDrawText(
TkMacOSXQuarzEndDraw(&drawingContext);
#endif
}
-
/*
*---------------------------------------------------------------------------
*
* MeasureStringWidth --
*
- * Low-level measuring of strings.
+ * Low-level measuring of strings.
*
* Results:
- *
- * The width of the string in pixels.
+ * The width of the string in pixels.
*
* Side effects:
- *
- * None.
+ * None.
*
* Assumptions:
- *
- * fontPtr->atsuLayout is setup with the actual string data to measure.
+ * fontPtr->atsuLayout is setup with the actual string data to measure.
*
*---------------------------------------------------------------------------
*/
static int
MeasureStringWidth(
- const MacFont * fontPtr, /* Contains font, ATSU layout and string data
- * to measure. */
- int start, int end) /* Start and end positions to measure in that
- * string. */
+ const MacFont *fontPtr, /* Contains font, ATSU layout and string data
+ * to measure. */
+ int start, int end) /* Start and end positions to measure in that
+ * string. */
{
/*
* This implementation of measuring via ATSUGetGlyphBounds() does not
* quite conform with the specification given for [font measure]:
*
- * The return value is the total width in pixels of text, not
- * including the extra pixels used by highly exagerrated characters
- * such as cursive "f".
+ * The return value is the total width in pixels of text, not
+ * including the extra pixels used by highly exagerrated characters
+ * such as cursive "f".
*
- * Instead the result of ATSUGetGlyphBounds() *does* include these
- * "extra pixels".
+ * Instead the result of ATSUGetGlyphBounds() *does* include these "extra
+ * pixels".
*/
ATSTrapezoid bounds;
@@ -1437,23 +1350,19 @@ MeasureStringWidth(
OSStatus err;
if (end <= start) {
- return 0;
+ return 0;
}
bounds.upperRight.x = bounds.upperLeft.x = 0;
- err = ATSUGetGlyphBounds(
- fontPtr->atsuLayout,
- 0, 0,
- start, end-start,
- kATSUseFractionalOrigins,
- 1, &bounds, &numBounds);
+ err = ATSUGetGlyphBounds(fontPtr->atsuLayout, 0, 0, start, end-start,
+ kATSUseFractionalOrigins, 1, &bounds, &numBounds);
#ifdef TK_MAC_DEBUG_FONTS
if (err != noErr) {
- fprintf(stderr, "ATSUGetGlyphBounds(): Error %d\n", (int) err);
+ FDBG("ATSUGetGlyphBounds(): Error %d", (int) err);
} else if (numBounds < 1) {
- fprintf(stderr, "ATSUGetGlyphBounds(): No output\n");
+ FDBG("ATSUGetGlyphBounds(): No output");
} else if (numBounds > 1) {
- fprintf(stderr, "ATSUGetGlyphBounds(): More output\n");
+ FDBG("ATSUGetGlyphBounds(): More output");
}
#endif
@@ -1466,52 +1375,50 @@ MeasureStringWidth(
*
* UpdateLineBuffer --
*
- * See the general dicussion of TK_MAC_COALESCE_LINE on the header
- * pages. This function maintains the data for this feature.
+ * See the general dicussion of TK_MAC_COALESCE_LINE on the header pages.
+ * This function maintains the data for this feature.
*
* Results:
- *
- * The Tcl_UniChar string of the whole line as seen so far.
+ * The Tcl_UniChar string of the whole line as seen so far.
*
* Side effects:
+ * "*offset" is filled with the index of the first new character in
+ * "currentLine". The globals currentLine, currentY, currentLeft,
+ * currentRight and currentFontPtr are updated as necessary.
*
- * "*offset" is filled with the index of the first new character in
- * "currentLine". The globals currentLine, currentY, currentLeft,
- * currentRight and currentFontPtr are updated as necessary.
- *
- * The currentLine string is set as the current text in
- * fontPtr->atsuLayout (see TkMacOSXLayoutSetString()).
+ * The currentLine string is set as the current text in
+ * fontPtr->atsuLayout (see TkMacOSXLayoutSetString()).
*
*-------------------------------------------------------------------------
*/
static const Tcl_UniChar *
UpdateLineBuffer(
- const MacFont * fontPtr,/* The font to be used for the new piece of
- * text. */
- const DrawingContext * drawingContextPtr,
- /* The Quarz drawing parameters. Needed for
- * measuring the new piece. */
- const char * source, /* A new piece of line to be added. */
- int numBytes, /* Length of the new piece. */
- int x, int y, /* Position of the new piece in the window. */
- int * offset) /* Filled with the offset of the new piece in
- * currentLine. */
+ const MacFont *fontPtr, /* The font to be used for the new piece of
+ * text. */
+ const DrawingContext *drawingContextPtr,
+ /* The Quarz drawing parameters. Needed for
+ * measuring the new piece. */
+ const char *source, /* A new piece of line to be added. */
+ int numBytes, /* Length of the new piece. */
+ int x, int y, /* Position of the new piece in the window. */
+ int *offset) /* Filled with the offset of the new piece in
+ * currentLine. */
{
const Tcl_UniChar * uchars;
int ulen;
if (y != currentY
- || x < currentRight-1 || x > currentRight+2
- || currentFontPtr != fontPtr) {
- Tcl_DStringFree(&currentLine);
- Tcl_DStringInit(&currentLine);
- currentY = y;
- currentLeft = x;
- currentFontPtr = fontPtr;
- *offset = 0;
+ || x < currentRight-1 || x > currentRight+2
+ || currentFontPtr != fontPtr) {
+ Tcl_DStringFree(&currentLine);
+ Tcl_DStringInit(&currentLine);
+ currentY = y;
+ currentLeft = x;
+ currentFontPtr = fontPtr;
+ *offset = 0;
} else {
- *offset = Tcl_DStringLength(&currentLine) / 2;
+ *offset = Tcl_DStringLength(&currentLine) / 2;
}
Tcl_UtfToUniCharDString(source, numBytes, &currentLine);
@@ -1529,33 +1436,33 @@ UpdateLineBuffer(
*
* InitFont --
*
- * Helper for TkpGetNativeFont() and TkpGetFontFromAttributes().
- * Initializes the memory for a MacFont that wraps the
- * platform-specific data.
+ * Helper for TkpGetNativeFont() and TkpGetFontFromAttributes().
+ * Initializes the memory for a MacFont that wraps the platform-specific
+ * data.
*
- * The caller is responsible for initializing the fields of the TkFont
- * that are used exclusively by the generic TkFont code, and for
- * releasing those fields before calling TkpDeleteFont().
+ * The caller is responsible for initializing the fields of the TkFont
+ * that are used exclusively by the generic TkFont code, and for
+ * releasing those fields before calling TkpDeleteFont().
*
* Results:
- * Fills the MacFont structure.
+ * Fills the MacFont structure.
*
* Side effects:
- * Memory allocated.
+ * Memory allocated.
*
*---------------------------------------------------------------------------
*/
static void
InitFont(
- Tk_Window tkwin, /* For display where font will be used. */
- FMFontFamily familyId, /* The font family to initialize for. */
- const char * familyName,/* The font family name, if known. Otherwise
- * this can be NULL. */
- int size, /* Point size for the font. */
- int qdStyle, /* QuickDraw style bits. */
- MacFont * fontPtr) /* Filled with information constructed from the
- * above arguments. */
+ Tk_Window tkwin, /* For display where font will be used. */
+ FMFontFamily familyId, /* The font family to initialize for. */
+ const char * familyName, /* The font family name, if known. Otherwise
+ * this can be NULL. */
+ int size, /* Point size for the font. */
+ int qdStyle, /* QuickDraw style bits. */
+ MacFont * fontPtr) /* Filled with information constructed from the
+ * above arguments. */
{
OSStatus err;
FontInfo fi;
@@ -1565,38 +1472,31 @@ InitFont(
int periodWidth, wWidth;
if (size == 0) {
- size = GetDefFontSize();
+ size = GetDefFontSize();
}
points = (short) TkFontGetPoints(tkwin, size);
err = FetchFontInfo(familyId, points, qdStyle, &fi);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "FetchFontInfo(): Error %d\n", (int) err);
- }
-#endif
+ LOG_ON_ERR(FetchFontInfo);
if (familyName == NULL) {
- char name[256] = "";
- const MacFontFamily * familyPtr;
-
- err = GetFontFamilyName(familyId, name, sizeof(name));
- if (err == noErr) {
-
- /*
- * We find the canonical font name, so we can avoid unnecessary
- * memory management.
- */
-
- familyPtr = FindFontFamily(name);
- if (familyPtr != NULL) {
- familyName = familyPtr->name;
- } else {
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "Font family '%s': Not found\n", name);
-#endif
- }
- }
+ char name[256] = "";
+ const MacFontFamily * familyPtr;
+
+ err = GetFontFamilyName(familyId, name, sizeof(name));
+ if (err == noErr) {
+ /*
+ * We find the canonical font name, so we can avoid unnecessary
+ * memory management.
+ */
+
+ familyPtr = FindFontFamily(name);
+ if (familyPtr != NULL) {
+ familyName = familyPtr->name;
+ } else {
+ FDBG("Font family '%s': Not found", name);
+ }
+ }
}
fontPtr->font.fid = (Font) fontPtr;
@@ -1612,11 +1512,11 @@ InitFont(
fmPtr = &fontPtr->font.fm;
/*
- * Note: Macs measure the line height as ascent + descent +
- * leading. Leading as a separate entity does not exist in X11
- * and Tk. We add it to the ascent at the moment, because adding
- * it to the descent, as the Mac docs would indicate, would change
- * the position of self-drawn underlines.
+ * Note: Macs measure the line height as ascent + descent + leading.
+ * Leading as a separate entity does not exist in X11 and Tk. We add it to
+ * the ascent at the moment, because adding it to the descent, as the Mac
+ * docs would indicate, would change the position of self-drawn
+ * underlines.
*/
fmPtr->ascent = fi.ascent + fi.leading;
@@ -1627,9 +1527,8 @@ InitFont(
fontPtr->qdSize = points;
fontPtr->qdStyle = (short) qdStyle;
- InitATSUObjects(
- familyId, points, qdStyle,
- &fontPtr->atsuFontId, &fontPtr->atsuLayout, &fontPtr->atsuStyle);
+ InitATSUObjects(familyId, points, qdStyle,
+ &fontPtr->atsuFontId, &fontPtr->atsuLayout, &fontPtr->atsuStyle);
Tk_MeasureChars((Tk_Font)fontPtr, ".", 1, -1, 0, &periodWidth);
Tk_MeasureChars((Tk_Font)fontPtr, "W", 1, -1, 0, &wWidth);
@@ -1645,29 +1544,28 @@ InitFont(
*
* InitATSUObjects --
*
- * Helper for InitFont(). Initializes the ATSU data handles for a
- * MacFont.
+ * Helper for InitFont(). Initializes the ATSU data handles for a
+ * MacFont.
*
* Results:
- *
- * Sets up all we know and can do at this point in time in fontIdPtr,
- * layoutPtr and stylePtr.
+ * Sets up all we know and can do at this point in time in fontIdPtr,
+ * layoutPtr and stylePtr.
*
* Side effects:
- *
- * Allocates data structures inside of ATSU.
+ * Allocates data structures inside of ATSU.
*
*---------------------------------------------------------------------------
*/
static void
InitATSUObjects(
- FMFontFamily familyId, /* The font family to use. */
- short ptSize, short qdStyles, /* The additional font parameters. */
- ATSUFontID * fontIdPtr, /* Filled with the font id. */
- ATSUTextLayout * layoutPtr, /* Filled with the ATSU layout handle. */
- ATSUStyle * stylePtr) /* Filled with the ATSU style handle,
- * configured with all parameters. */
+ FMFontFamily familyId, /* The font family to use. */
+ short ptSize, short qdStyles,
+ /* The additional font parameters. */
+ ATSUFontID *fontIdPtr, /* Filled with the font id. */
+ ATSUTextLayout *layoutPtr, /* Filled with the ATSU layout handle. */
+ ATSUStyle *stylePtr) /* Filled with the ATSU style handle,
+ * configured with all parameters. */
{
OSStatus err;
FMFontStyle stylesDone, stylesLeft;
@@ -1684,18 +1582,13 @@ InitATSUObjects(
* Generate a font id from family id and QD style bits.
*/
- err = FMGetFontFromFontFamilyInstance(
- familyId, qdStyles, fontIdPtr, &stylesDone);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "FMGetFontFromFontFamilyInstance(): Error %d\n",
- (int) err);
- }
-#endif
+ err = FMGetFontFromFontFamilyInstance(familyId, qdStyles, fontIdPtr,
+ &stylesDone);
+ LOG_ON_ERR(FMGetFontFromFontFamilyInstance);
/*
- * We see what style bits are left and tell ATSU to synthesize what's
- * left like QD does it.
+ * We see what style bits are left and tell ATSU to synthesize what's left
+ * like QD does it.
*/
stylesLeft = qdStyles & ~(unsigned)stylesDone;
@@ -1705,24 +1598,16 @@ InitATSUObjects(
*/
err = ATSUCreateStyle(stylePtr);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUCreateStyle(): Error %d\n", (int) err);
- }
-#endif
+ LOG_ON_ERR(ATSUCreateStyle);
InitATSUStyle(*fontIdPtr, ptSize, stylesLeft, *stylePtr);
/*
- * Create the layout. Note: We can't set the layout attributes here,
+ * Create the layout. Note: We can't set the layout attributes here,
* because the text and the style must be set first.
*/
err = ATSUCreateTextLayout(layoutPtr);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUCreateTextLayout(): Error %d\n", (int) err);
- }
-#endif
+ LOG_ON_ERR(ATSUCreateTextLayout);
/*InitATSULayout(*layoutPtr);*/
}
@@ -1731,25 +1616,24 @@ InitATSUObjects(
*
* InitATSUStyle --
*
- * Helper for InitATSUObjects(). Initializes the ATSU style for a
- * MacFont.
+ * Helper for InitATSUObjects(). Initializes the ATSU style for a
+ * MacFont.
*
* Results:
- *
- * Sets up all parameters needed for an ATSU style.
+ * Sets up all parameters needed for an ATSU style.
*
* Side effects:
- *
- * Allocates data structures for the style inside of ATSU.
+ * Allocates data structures for the style inside of ATSU.
*
*---------------------------------------------------------------------------
*/
static void
InitATSUStyle(
- ATSUFontID fontId, /* The font id to use. */
- short ptSize, short qdStyles, /* Additional font parameters. */
- ATSUStyle style) /* The style handle to configure. */
+ ATSUFontID fontId, /* The font id to use. */
+ short ptSize, short qdStyles,
+ /* Additional font parameters. */
+ ATSUStyle style) /* The style handle to configure. */
{
/*
* Attributes for the style.
@@ -1757,69 +1641,59 @@ InitATSUStyle(
Fixed fsize = IntToFixed(ptSize);
Boolean
- isBold = (qdStyles&bold) != 0,
- isUnderline = (qdStyles&underline) != 0,
- isItalic = (qdStyles&italic) != 0;
+ isBold = (qdStyles&bold) != 0,
+ isUnderline = (qdStyles&underline) != 0,
+ isItalic = (qdStyles&italic) != 0;
ATSStyleRenderingOptions options =
- antialiasedTextEnabled == -1 ? kATSStyleNoOptions :
- antialiasedTextEnabled == 0 ? kATSStyleNoAntiAliasing :
- kATSStyleApplyAntiAliasing;
+ antialiasedTextEnabled == -1 ? kATSStyleNoOptions :
+ antialiasedTextEnabled == 0 ? kATSStyleNoAntiAliasing :
+ kATSStyleApplyAntiAliasing;
static const ATSUAttributeTag styleTags[] = {
- kATSUFontTag, kATSUSizeTag,
- kATSUQDBoldfaceTag, kATSUQDItalicTag, kATSUQDUnderlineTag,
- kATSUStyleRenderingOptionsTag,
+ kATSUFontTag, kATSUSizeTag,
+ kATSUQDBoldfaceTag, kATSUQDItalicTag, kATSUQDUnderlineTag,
+ kATSUStyleRenderingOptionsTag,
};
static const ByteCount styleSizes[] = {
- sizeof(ATSUFontID), sizeof(Fixed),
- sizeof(Boolean), sizeof(Boolean), sizeof(Boolean),
- sizeof(ATSStyleRenderingOptions),
+ sizeof(ATSUFontID), sizeof(Fixed),
+ sizeof(Boolean), sizeof(Boolean), sizeof(Boolean),
+ sizeof(ATSStyleRenderingOptions),
};
const ATSUAttributeValuePtr styleValues[] = {
- &fontId, &fsize,
- &isBold, &isItalic, &isUnderline,
- &options,
+ &fontId, &fsize,
+ &isBold, &isItalic, &isUnderline,
+ &options,
};
- OSStatus err;
-
- err = ATSUSetAttributes(
- style,
- sizeof(styleTags)/sizeof(styleTags[0]),
- styleTags, styleSizes, styleValues);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUSetAttributes(): Error %d\n", (int) err);
- }
-#endif
+ OSStatus err = ATSUSetAttributes(style,
+ sizeof(styleTags)/sizeof(styleTags[0]),
+ styleTags, styleSizes, styleValues);
+ LOG_ON_ERR(ATSUSetAttributes);
}
-
/*
*---------------------------------------------------------------------------
*
* SetFontFeatures --
*
- * Helper for InitFont(). Request specific font features of the ATSU
- * style object for a MacFont.
+ * Helper for InitFont(). Request specific font features of the ATSU
+ * style object for a MacFont.
*
* Results:
- *
- * None.
+ * None.
*
* Side effects:
- *
- * Specific font features are enabled on the ATSU style object.
+ * Specific font features are enabled on the ATSU style object.
*
*---------------------------------------------------------------------------
*/
static void
SetFontFeatures(
- ATSUFontID fontId, /* The font id to use. */
- int fixed, /* Is this a fixed font? */
- ATSUStyle style) /* The style handle to configure. */
+ ATSUFontID fontId, /* The font id to use. */
+ int fixed, /* Is this a fixed font? */
+ ATSUStyle style) /* The style handle to configure. */
{
/*
* Don't use the standard latin ligatures, if this is determined to be a
@@ -1827,24 +1701,19 @@ SetFontFeatures(
*/
static const ATSUFontFeatureType fixed_featureTypes[] = {
- kLigaturesType, kLigaturesType
+ kLigaturesType, kLigaturesType
};
static const ATSUFontFeatureSelector fixed_featureSelectors[] = {
- kCommonLigaturesOffSelector, kRareLigaturesOffSelector
+ kCommonLigaturesOffSelector, kRareLigaturesOffSelector
};
OSStatus err;
if (fixed) {
- err = ATSUSetFontFeatures(
- style,
- sizeof(fixed_featureTypes)/sizeof(fixed_featureTypes[0]),
- fixed_featureTypes, fixed_featureSelectors);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUSetFontFeatures(): Error %d\n", (int) err);
- }
-#endif
+ err = ATSUSetFontFeatures(style,
+ sizeof(fixed_featureTypes)/sizeof(fixed_featureTypes[0]),
+ fixed_featureTypes, fixed_featureSelectors);
+ LOG_ON_ERR(ATSUSetFontFeatures);
}
}
@@ -1853,17 +1722,15 @@ SetFontFeatures(
*
* AdjustFontHeight --
*
- * Helper for InitFont(). Check font height against some real world
- * examples.
+ * Helper for InitFont(). Check font height against some real world
+ * examples.
*
* Results:
- *
- * None.
+ * None.
*
* Side effects:
- *
- * The metrics in fontPtr->font.fm are adjusted so that typical combined
- * characters fit into ascent+descent.
+ * The metrics in fontPtr->font.fm are adjusted so that typical combined
+ * characters fit into ascent+descent.
*
*---------------------------------------------------------------------------
*/
@@ -1875,7 +1742,7 @@ AdjustFontHeight(
/*
* The standard values for ascent, descent and leading as determined in
* InitFont do not take composition into account, they are designed for
- * plain ASCII characters. This code measures the actual size of some
+ * plain ASCII characters. This code measures the actual size of some
* typical composed characters from the Latin-1 range and corrects these
* factors, especially the ascent.
*
@@ -1883,20 +1750,18 @@ AdjustFontHeight(
* than requested.
*
* An alternative would be to instruct ATSU to shrink oversized combined
- * characters. I think I have seen that feature somewhere, but I can't
+ * characters. I think I have seen that feature somewhere, but I can't
* find it now [BR].
*/
static const UniChar chars[]
- /* Auml, Aacute, Acirc, Atilde, Ccedilla */
- = {0x00C4, 0x00C1, 0x00C2, 0x00C3, 0x00C7};
+ /* Auml, Aacute, Acirc, Atilde, Ccedilla */
+ = {0x00C4, 0x00C1, 0x00C2, 0x00C3, 0x00C7};
static const int charslen = sizeof(chars) / sizeof(chars[0]);
-
DrawingContext drawingContext;
Rect size;
OSStatus err;
-
#if TK_MAC_USE_QUARZ
TkMacOSXQuarzStartDraw(&drawingContext);
#endif
@@ -1904,100 +1769,90 @@ AdjustFontHeight(
TkMacOSXLayoutSetString(fontPtr, &drawingContext, chars, charslen);
size.top = size.bottom = 0;
- err = ATSUMeasureTextImage(
- fontPtr->atsuLayout,
- 0, charslen,
- 0, 0,
- &size);
+ err = ATSUMeasureTextImage(fontPtr->atsuLayout, 0, charslen, 0, 0, &size);
#if TK_MAC_USE_QUARZ
TkMacOSXQuarzEndDraw(&drawingContext);
#endif
if (err != noErr) {
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "ATSUMeasureTextImage(): Error %d\n", (int) err);
-#endif
+ FDBG("ATSUMeasureTextImage(): Error %d", (int) err);
} else {
- TkFontMetrics * fmPtr = &fontPtr->font.fm;
- int ascent = -size.top;
- int descent = size.bottom;
-
- if (ascent > fmPtr->ascent) {
- fmPtr->ascent = ascent;
- }
- if (descent > fmPtr->descent) {
- fmPtr->descent = descent;
- }
+ TkFontMetrics * fmPtr = &fontPtr->font.fm;
+ int ascent = -size.top;
+ int descent = size.bottom;
+
+ if (ascent > fmPtr->ascent) {
+ fmPtr->ascent = ascent;
+ }
+ if (descent > fmPtr->descent) {
+ fmPtr->descent = descent;
+ }
}
}
-
/*
*---------------------------------------------------------------------------
*
* InitATSULayout --
*
- * Helper for TkMacOSXLayoutSetString(). Initializes the ATSU layout
- * object for a MacFont and a specific string.
+ * Helper for TkMacOSXLayoutSetString(). Initializes the ATSU layout
+ * object for a MacFont and a specific string.
*
* Results:
- *
- * Sets up all parameters needed for an ATSU layout object.
+ * Sets up all parameters needed for an ATSU layout object.
*
* Side effects:
- *
- * Allocates data structures for the layout object inside of ATSU.
+ * Allocates data structures for the layout object inside of ATSU.
*
* Assumptions:
- *
- * The actual string data and style information is already set by
- * ATSUSetTextPointerLocation() and ATSUSetRunStyle() (see
- * TkMacOSXLayoutSetString()).
+ * The actual string data and style information is already set by
+ * ATSUSetTextPointerLocation() and ATSUSetRunStyle() (see
+ * TkMacOSXLayoutSetString()).
*
*---------------------------------------------------------------------------
*/
static void
InitATSULayout(
- const DrawingContext * drawingContextPtr,
- /* Specifies the CGContext to use. */
- ATSUTextLayout layout, /* The layout object to configure. */
- int fixed) /* Is this a fixed font? */
+ const DrawingContext *drawingContextPtr,
+ /* Specifies the CGContext to use. */
+ ATSUTextLayout layout, /* The layout object to configure. */
+ int fixed) /* Is this a fixed font? */
{
/*
* Attributes for the layout.
*/
ATSLineLayoutOptions layoutOptions =
- 0
+ 0
#if TK_MAC_COALESCE_LINE
/*
* Options to use unconditionally, when we try to do coalescing in here.
*/
- | kATSLineDisableAllLayoutOperations
- | kATSLineFractDisable
- | kATSLineUseDeviceMetrics
+ | kATSLineDisableAllLayoutOperations
+ | kATSLineFractDisable
+ | kATSLineUseDeviceMetrics
#endif
- ;
+ ;
static const ATSUAttributeTag layoutTags[] = {
#if TK_MAC_USE_QUARZ
- kATSUCGContextTag,
+ kATSUCGContextTag,
#endif
- kATSULineLayoutOptionsTag,
+ kATSULineLayoutOptionsTag,
};
static const ByteCount layoutSizes[] = {
#if TK_MAC_USE_QUARZ
- sizeof(CGContextRef),
+ sizeof(CGContextRef),
#endif
- sizeof(ATSLineLayoutOptions),
+ sizeof(ATSLineLayoutOptions),
};
const ATSUAttributeValuePtr layoutValues[] = {
#if TK_MAC_USE_QUARZ
- (void*)&drawingContextPtr->cgContext,
+ (void*)&drawingContextPtr->cgContext,
#endif
- &layoutOptions,
+ &layoutOptions,
};
OSStatus err;
@@ -2007,29 +1862,16 @@ InitATSULayout(
*/
if (fixed) {
- layoutOptions |=
- kATSLineFractDisable
- | kATSLineUseDeviceMetrics
- ;
+ layoutOptions |= kATSLineFractDisable | kATSLineUseDeviceMetrics;
}
- err = ATSUSetLayoutControls(
- layout,
- sizeof(layoutTags)/sizeof(layoutTags[0]),
- layoutTags, layoutSizes, layoutValues);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUSetLayoutControls(): Error %d\n", (int) err);
- }
-#endif
+ err = ATSUSetLayoutControls(layout,
+ sizeof(layoutTags)/sizeof(layoutTags[0]),
+ layoutTags, layoutSizes, layoutValues);
+ LOG_ON_ERR(ATSUSetLayoutControls);
err = ATSUSetTransientFontMatching(layout, true);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUSetTransientFontMatching(): Error %d\n",
- (int) err);
- }
-#endif
+ LOG_ON_ERR(ATSUSetTransientFontMatching);
}
/*
@@ -2037,83 +1879,68 @@ InitATSULayout(
*
* TkMacOSXLayoutSetString --
*
- * Setup the MacFont for a specific string.
+ * Setup the MacFont for a specific string.
*
* Results:
- *
- * Sets up all parameters so that ATSU can work with the objects in
- * MacFont.
+ * Sets up all parameters so that ATSU can work with the objects in
+ * MacFont.
*
* Side effects:
- *
- * Sets parameters on the layout object fontPtr->atsuLayout.
+ * Sets parameters on the layout object fontPtr->atsuLayout.
*
*---------------------------------------------------------------------------
*/
void
TkMacOSXLayoutSetString(
- const MacFont * fontPtr, /* The fontPtr to configure. */
+ const MacFont *fontPtr, /* The fontPtr to configure. */
const DrawingContext * drawingContextPtr,
- /* For the CGContext to be used.*/
- const UniChar * uchars, int ulen) /* The UniChar string to set into
- * fontPtr->atsuLayout. */
+ /* For the CGContext to be used.*/
+ const UniChar *uchars, int ulen)
+ /* The UniChar string to set into
+ * fontPtr->atsuLayout. */
{
OSStatus err;
- err = ATSUSetTextPointerLocation(
- fontPtr->atsuLayout,
- uchars, kATSUFromTextBeginning, ulen,
- ulen);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUSetTextPointerLocation(): Error %d\n", (int) err);
- }
-#endif
+ err = ATSUSetTextPointerLocation(fontPtr->atsuLayout,
+ uchars, kATSUFromTextBeginning, ulen, ulen);
+ LOG_ON_ERR(ATSUSetTextPointerLocation);
/*
* Styles can only be set after the text is set.
*/
- err = ATSUSetRunStyle(
- fontPtr->atsuLayout, fontPtr->atsuStyle,
- kATSUFromTextBeginning, kATSUToTextEnd);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSUSetRunStyle(): Error %d\n", (int) err);
- }
-#endif
+ err = ATSUSetRunStyle(fontPtr->atsuLayout, fontPtr->atsuStyle,
+ kATSUFromTextBeginning, kATSUToTextEnd);
+ LOG_ON_ERR(ATSUSetRunStyle);
/*
* Layout attributes can only be set after the styles are set.
*/
- InitATSULayout(
- drawingContextPtr, fontPtr->atsuLayout,
- fontPtr->font.fm.fixed);
+ InitATSULayout(drawingContextPtr, fontPtr->atsuLayout,
+ fontPtr->font.fm.fixed);
}
-
/*
*-------------------------------------------------------------------------
*
* ReleaseFont --
*
- * Called to release the Macintosh-specific contents of a TkFont. The
- * caller is responsible for freeing the memory used by the font
- * itself.
+ * Called to release the Macintosh-specific contents of a TkFont. The
+ * caller is responsible for freeing the memory used by the font itself.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Memory is freed.
+ * Memory is freed.
*
*---------------------------------------------------------------------------
*/
static void
ReleaseFont(
- MacFont * fontPtr) /* The font to delete. */
+ MacFont *fontPtr) /* The font to delete. */
{
ATSUDisposeTextLayout(fontPtr->atsuLayout);
ATSUDisposeStyle(fontPtr->atsuStyle);
@@ -2124,40 +1951,40 @@ ReleaseFont(
*
* FindFontFamilyOrAlias, FindFontFamilyOrAliasOrFallback --
*
- * Determine if any physical screen font exists on the system with The
- * given family name. If the family exists, then it should be possible
- * to construct some physical screen font with that family name.
+ * Determine if any physical screen font exists on the system with the
+ * given family name. If the family exists, then it should be possible to
+ * construct some physical screen font with that family name.
*
- * FindFontFamilyOrAlias also considers font aliases as determined by
- * TkFontGetAliasList().
+ * FindFontFamilyOrAlias also considers font aliases as determined by
+ * TkFontGetAliasList().
*
- * FindFontFamilyOrAliasOrFallback also considers font aliases as
- * determined by TkFontGetFallbacks().
+ * FindFontFamilyOrAliasOrFallback also considers font aliases as
+ * determined by TkFontGetFallbacks().
*
- * The overall algorithm to get the closest font to the one requested is
- * this:
+ * The overall algorithm to get the closest font to the one requested is
+ * this:
*
- * try fontname
- * try all aliases for fontname
- * foreach fallback for fontname
- * try the fallback
- * try all aliases for the fallback
+ * try fontname
+ * try all aliases for fontname
+ * foreach fallback for fontname
+ * try the fallback
+ * try all aliases for the fallback
*
* Results:
*
- * The return value is NULL if the specified font family does not exist,
- * a valid MacFontFamily* otherwise.
+ * The return value is NULL if the specified font family does not exist,
+ * a valid MacFontFamily* otherwise.
*
* Side effects:
*
- * None.
+ * None.
*
*-------------------------------------------------------------------------
*/
static const MacFontFamily *
FindFontFamilyOrAlias(
- const char * name) /* Name or alias name of the font to find. */
+ const char * name) /* Name or alias name of the font to find. */
{
const MacFontFamily * familyPtr;
char ** aliases;
@@ -2165,24 +1992,24 @@ FindFontFamilyOrAlias(
familyPtr = FindFontFamily(name);
if (familyPtr != NULL) {
- return familyPtr;
+ return familyPtr;
}
aliases = TkFontGetAliasList(name);
if (aliases != NULL) {
- for (i = 0; aliases[i] != NULL; i++) {
- familyPtr = FindFontFamily(aliases[i]);
- if (familyPtr != NULL) {
- return familyPtr;
- }
- }
+ for (i = 0; aliases[i] != NULL; i++) {
+ familyPtr = FindFontFamily(aliases[i]);
+ if (familyPtr != NULL) {
+ return familyPtr;
+ }
+ }
}
return NULL;
}
-
+
static const MacFontFamily *
FindFontFamilyOrAliasOrFallback(
- const char * name) /* Name or alias name of the font to find. */
+ const char * name) /* Name or alias name of the font to find. */
{
const MacFontFamily * familyPtr;
const char * fallback;
@@ -2191,38 +2018,34 @@ FindFontFamilyOrAliasOrFallback(
familyPtr = FindFontFamilyOrAlias(name);
if (familyPtr != NULL) {
- return familyPtr;
+ return familyPtr;
}
fallbacks = TkFontGetFallbacks();
for (i = 0; fallbacks[i] != NULL; i++) {
- for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) {
- if (strcasecmp(name, fallback) == 0) {
- for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) {
- familyPtr = FindFontFamilyOrAlias(fallback);
- if (familyPtr != NULL) {
- return familyPtr;
- }
- }
- }
- break; /* benny: This "break" is a carry-over from
- * tkMacOSXFont.c, but what is actually its purpose
- * ???? */
- }
+ for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) {
+ if (strcasecmp(name, fallback) == 0) {
+ for (j = 0; (fallback = fallbacks[i][j]) != NULL; j++) {
+ familyPtr = FindFontFamilyOrAlias(fallback);
+ if (familyPtr != NULL) {
+ return familyPtr;
+ }
+ }
+ }
+ break; /* benny: This "break" is a carry-over from
+ * tkMacOSXFont.c, but what is actually its purpose
+ * ???? */
+ }
}
-
/*
- * FIXME: We would have liked to recover by re-enumerating fonts. But
- * that doesn't work, because Carbon seems to cache the inital list of
- * fonts. Fonts newly installed don't show up with
- * FMCreateFontFamilyIterator()/FMGetNextFontFamily() without a restart
- * of the app. Similar problem with fonts removed.
+ * FIXME: We would have liked to recover by re-enumerating fonts. But that
+ * doesn't work, because Carbon seems to cache the inital list of fonts.
+ * Fonts newly installed don't show up with
+ * FMCreateFontFamilyIterator()/FMGetNextFontFamily() without a restart of
+ * the app. Similar problem with fonts removed.
*/
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "Font family '%s': Not found\n", name);
-#endif
-
+ FDBG("Font family '%s': Not found", name);
return NULL;
}
@@ -2231,16 +2054,16 @@ FindFontFamilyOrAliasOrFallback(
*
* InitFontFamilies --
*
- * Helper to TkpFontPkgInit. Use the Font Manager to fill in the
- * familyList global array.
+ * Helper to TkpFontPkgInit. Use the Font Manager to fill in the
+ * familyList global array.
*
* Results:
*
- * None.
+ * None.
*
* Side effects:
*
- * Allocates memory.
+ * Allocates memory.
*
*-------------------------------------------------------------------------
*/
@@ -2255,15 +2078,11 @@ InitFontFamilies(void)
*/
if (familyListNextFree > 0) {
- return;
+ return;
}
err = ATSFontFamilyApplyFunction(FontFamilyEnumCallback,NULL);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "ATSFontFamilyApplyFunction(): Error %d\n", (int) err);
- }
-#endif
+ LOG_ON_ERR(ATSFontFamilyApplyFunction);
AddFontFamily(APPLFONT_NAME, GetAppFont());
AddFontFamily(SYSTEMFONT_NAME, GetSysFont());
@@ -2273,7 +2092,7 @@ InitFontFamilies(void)
static OSStatus
FontFamilyEnumCallback(
- ATSFontFamilyRef family,
+ ATSFontFamilyRef family,
void *refCon)
{
OSStatus err;
@@ -2283,7 +2102,7 @@ FontFamilyEnumCallback(
err = GetFontFamilyName(family, name, sizeof(name));
if (err == noErr) {
- AddFontFamily(name, family);
+ AddFontFamily(name, family);
}
return noErr;
@@ -2295,28 +2114,28 @@ FontFamilyEnumCallback(
*
* GetFontFamilyName --
*
- * Use the Font Manager to get the name of a given FMFontfamily. This
- * currently gets the standard, non-localized QuickDraw name. Other
- * names would be possible, see docs for ATSUFindFontName for a
- * selection. The MacOSX font selector seems to use the localized
- * family name given by ATSUFindFontName(kFontFamilyName), but that API
- * doesn't give us a name at all for some fonts.
+ * Use the Font Manager to get the name of a given FMFontfamily. This
+ * currently gets the standard, non-localized QuickDraw name. Other names
+ * would be possible, see docs for ATSUFindFontName for a selection. The
+ * MacOSX font selector seems to use the localized family name given by
+ * ATSUFindFontName(kFontFamilyName), but that API doesn't give us a name
+ * at all for some fonts.
*
* Results:
- * An OS error code, noErr on success. name is filled with the
- * resulting name.
+ * An OS error code, noErr on success. name is filled with the resulting
+ * name.
*
* Side effects:
- * None.
+ * None.
*
*-------------------------------------------------------------------------
*/
static OSStatus
GetFontFamilyName(
- FMFontFamily fontFamily, /* The font family for which to find the
- * name. */
- char * name, int numBytes) /* Filled with the result. */
+ FMFontFamily fontFamily, /* The font family for which to find the
+ * name. */
+ char * name, int numBytes) /* Filled with the result. */
{
OSStatus err;
Str255 nativeName;
@@ -2328,11 +2147,9 @@ GetFontFamilyName(
name[0] = 0;
err = FMGetFontFamilyName(fontFamily, nativeName);
+ LOG_ON_ERR(FMGetFontFamilyName);
if (err != noErr) {
-#ifdef TK_MAC_DEBUG_FONTS
- fprintf(stderr, "FMGetFontFamilyName(): Error %d\n", (int) err);
-#endif
- return err;
+ return err;
}
/*
@@ -2342,35 +2159,26 @@ GetFontFamilyName(
encoding = kTextEncodingMacRoman;
err = FMGetFontFamilyTextEncoding(fontFamily, &encoding);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "FMGetFontFamilyTextEncoding(): Error %d\n", (int) err);
- }
-#endif
+ LOG_ON_ERR(FMGetFontFamilyTextEncoding);
nameencoding = encoding;
err = RevertTextEncodingToScriptInfo(encoding, &nameencoding, NULL, NULL);
-#ifdef TK_MAC_DEBUG_FONTS
- if (err != noErr) {
- fprintf(stderr, "RevertTextEncodingToScriptInfo(): Error %d\n",
- (int) err);
- }
-#endif
+ LOG_ON_ERR(RevertTextEncodingToScriptInfo);
/*
- * Note: We could use Tcl facilities to do the re-encoding here. We'd
- * have to maintain tables to map OS encoding codes to Tcl encoding names
- * like tkMacOSXFont.c did. Using native re-encoding directly instead is
- * a lot easier and future-proof than that. There is one snag, though: I
- * have seen CFStringGetCString() crash with invalid encoding ids. But
- * than if that happens it would be a bug in
- * FMGetFontFamilyTextEncoding() or RevertTextEncodingToScriptInfo().
+ * Note: We could use Tcl facilities to do the re-encoding here. We'd have
+ * to maintain tables to map OS encoding codes to Tcl encoding names like
+ * tkMacOSXFont.c did. Using native re-encoding directly instead is a lot
+ * easier and future-proof than that. There is one snag, though: I have
+ * seen CFStringGetCString() crash with invalid encoding ids. But than if
+ * that happens it would be a bug in FMGetFontFamilyTextEncoding() or
+ * RevertTextEncodingToScriptInfo().
*/
cfString = CFStringCreateWithPascalStringNoCopy(
- NULL, nativeName, nameencoding, kCFAllocatorNull);
+ NULL, nativeName, nameencoding, kCFAllocatorNull);
CFStringGetCString(
- cfString, name, numBytes, kCFStringEncodingUTF8);
+ cfString, name, numBytes, kCFStringEncodingUTF8);
CFRelease(cfString);
return noErr;
@@ -2381,41 +2189,39 @@ GetFontFamilyName(
*
* FindFontFamily --
*
- * Find the font family with the given name in the global familyList.
- * Uses bsearch() for convenient access. Comparision is done
- * non-case-sensitively with CompareFontFamilies() which see.
+ * Find the font family with the given name in the global familyList.
+ * Uses bsearch() for convenient access. Comparision is done
+ * non-case-sensitively with CompareFontFamilies() which see.
*
* Results:
*
- * MacFontFamily: A pair of family id and the actual name registered for
- * the font.
+ * MacFontFamily: A pair of family id and the actual name registered for
+ * the font.
*
* Side effects:
*
- * None.
+ * None.
*
* Assumption:
*
- * Requires the familyList array to be sorted.
+ * Requires the familyList array to be sorted.
*
*-------------------------------------------------------------------------
*/
static const MacFontFamily *
FindFontFamily(
- const char * name) /* The family name. Note: Names are compared
- * non-case-sensitive. */
+ const char *name) /* The family name. Note: Names are compared
+ * non-case-sensitive. */
{
const MacFontFamily key = {name,-1};
if(familyListMaxValid <= 0) {
- return NULL;
+ return NULL;
}
- return bsearch(
- &key,
- familyList, familyListMaxValid, sizeof(*familyList),
- CompareFontFamilies);
+ return bsearch(&key, familyList, familyListMaxValid, sizeof(*familyList),
+ CompareFontFamilies);
}
/*
@@ -2423,15 +2229,13 @@ FindFontFamily(
*
* EnumFontFamilies --
*
- * Create a Tcl list with the registered names in the global familyList.
+ * Create a Tcl list with the registered names in the global familyList.
*
* Results:
- *
- * A Tcl list of names.
+ * A Tcl list of names.
*
* Side effects:
- *
- * None.
+ * None.
*
*-------------------------------------------------------------------------
*/
@@ -2444,8 +2248,8 @@ EnumFontFamilies(void)
tclList = Tcl_NewListObj(0, NULL);
for (i=0; i<familyListMaxValid; ++i) {
- Tcl_ListObjAppendElement(
- NULL, tclList, Tcl_NewStringObj(familyList[i].name, -1));
+ Tcl_ListObjAppendElement(NULL, tclList,
+ Tcl_NewStringObj(familyList[i].name, -1));
}
return tclList;
@@ -2456,33 +2260,32 @@ EnumFontFamilies(void)
*
* AddFontFamily --
*
- * Register a font family in familyList. Until SortFontFamilies() is
- * called, this is not actually available for FindFontFamily().
+ * Register a font family in familyList. Until SortFontFamilies() is
+ * called, this is not actually available for FindFontFamily().
*
* Results:
*
- * MacFontFamily: The new pair of family id and the actual name
- * registered for the font.
+ * MacFontFamily: The new pair of family id and the actual name
+ * registered for the font.
*
* Side effects:
*
- * New entry in familyList and familyListNextFree updated.
+ * New entry in familyList and familyListNextFree updated.
*
*-------------------------------------------------------------------------
*/
static const MacFontFamily *
AddFontFamily(
- const char * name, /* Font family name to register. */
- FMFontFamily familyId) /* Font family id to register. */
+ const char *name, /* Font family name to register. */
+ FMFontFamily familyId) /* Font family id to register. */
{
MacFontFamily * familyPtr;
if (familyListNextFree >= familyListSize) {
- familyListSize += 100;
- familyList = (MacFontFamily *) ckrealloc(
- (void*) familyList,
- familyListSize * sizeof(*familyList));
+ familyListSize += 100;
+ familyList = (MacFontFamily *) ckrealloc((void*) familyList,
+ familyListSize * sizeof(*familyList));
}
familyPtr = familyList + familyListNextFree;
@@ -2499,18 +2302,18 @@ AddFontFamily(
*
* SortFontFamilies --
*
- * Sort the entries in familyList. Only after calling
- * SortFontFamilies(), the new families registered with AddFontFamily()
- * are actually available for FindFontFamily(), because FindFontFamily()
- * requires the array to be sorted.
+ * Sort the entries in familyList. Only after calling SortFontFamilies(),
+ * the new families registered with AddFontFamily() are actually
+ * available for FindFontFamily(), because FindFontFamily() requires the
+ * array to be sorted.
*
* Results:
*
- * None.
+ * None.
*
* Side effects:
*
- * familyList is sorted and familyListMaxValid is updated.
+ * familyList is sorted and familyListMaxValid is updated.
*
*-------------------------------------------------------------------------
*/
@@ -2519,8 +2322,8 @@ static void
SortFontFamilies(void)
{
if (familyListNextFree > 0) {
- qsort( familyList, familyListNextFree, sizeof(*familyList),
- CompareFontFamilies);
+ qsort(familyList, familyListNextFree, sizeof(*familyList),
+ CompareFontFamilies);
}
familyListMaxValid = familyListNextFree;
}
@@ -2530,21 +2333,19 @@ SortFontFamilies(void)
*
* CompareFontFamilies --
*
- * Comparison function used by SortFontFamilies() and FindFontFamily().
+ * Comparison function used by SortFontFamilies() and FindFontFamily().
*
* Results:
+ * Result as required to generate a stable sort order for bsearch() and
+ * qsort(). The ordering is not case-sensitive as far as
+ * Tcl_UtfNcasecmp() (which see) can provide that.
*
- * Result as required to generate a stable sort order for bsearch() and
- * qsort(). The ordering is not case-sensitive as far as
- * Tcl_UtfNcasecmp() (which see) can provide that.
- *
- * Note: It would be faster to compare first the length and the actual
- * strings only as a tie-breaker, but than the ordering wouldn't look so
- * pretty in [font families] ;-).
+ * Note: It would be faster to compare first the length and the actual
+ * strings only as a tie-breaker, but than the ordering wouldn't look so
+ * pretty in [font families] ;-).
*
* Side effects:
- *
- * None.
+ * None.
*
*-------------------------------------------------------------------------
*/
@@ -2556,9 +2357,7 @@ CompareFontFamilies(
{
const char * name1;
const char * name2;
- int len1;
- int len2;
- int diff;
+ int len1, len2, diff;
name1 = ((const MacFontFamily *) vp1)->name;
name2 = ((const MacFontFamily *) vp2)->name;
@@ -2576,43 +2375,39 @@ CompareFontFamilies(
*
* AddString --
*
- * Helper for AddFontFamily(). Allocates a string in the one-shot
- * allocator.
+ * Helper for AddFontFamily(). Allocates a string in the one-shot
+ * allocator.
*
* Results:
- *
- * A duplicated string in the one-shot allocator.
+ * A duplicated string in the one-shot allocator.
*
* Side effects:
- *
- * May allocate a new memory block.
+ * May allocate a new memory block.
*
*-------------------------------------------------------------------------
*/
static const char *
AddString(
- const char * in) /* String to add, zero-terminated. */
+ const char *in) /* String to add, zero-terminated. */
{
int len;
- char * result;
-
+ char *result;
+
len = strlen(in) +1;
if (stringMemory == NULL
- || (stringMemory->nextFree+len) > STRING_BLOCK_MAX ) {
- StringBlock * newblock =
- (StringBlock *) ckalloc(sizeof(StringBlock));
- newblock->next = stringMemory;
- newblock->nextFree = 0;
- stringMemory = newblock;
+ || (stringMemory->nextFree+len) > STRING_BLOCK_MAX) {
+ StringBlock * newblock = (StringBlock *) ckalloc(sizeof(StringBlock));
+ newblock->next = stringMemory;
+ newblock->nextFree = 0;
+ stringMemory = newblock;
}
result = stringMemory->strings + stringMemory->nextFree;
stringMemory->nextFree += len;
memcpy(result, in, len);
-
return result;
}
@@ -2621,29 +2416,29 @@ AddString(
*
* TkMacOSXIsCharacterMissing --
*
- * Given a tkFont and a character determine whether the character has
- * a glyph defined in the font or not.
+ * Given a tkFont and a character determine whether the character has a
+ * glyph defined in the font or not.
*
* Results:
- * Returns a 1 if the character is missing, a 0 if it is not.
+ * Returns a 1 if the character is missing, a 0 if it is not.
*
* Side effects:
- * None.
+ * None.
*
*---------------------------------------------------------------------------
*/
int
TkMacOSXIsCharacterMissing(
- Tk_Font tkfont, /* The font we are looking in. */
- unsigned int searchChar) /* The character we are looking for. */
+ Tk_Font tkfont, /* The font we are looking in. */
+ unsigned int searchChar) /* The character we are looking for. */
{
/* Background: This function is private and only used in
* tkMacOSXMenu.c:FindMarkCharacter().
*
- * We could use ATSUMatchFont() to implement. We'd have to change the
- * definition of the encoding of the parameter searchChar from MacRoman
- * to UniChar for that.
+ * We could use ATSUMatchFont() to implement. We'd have to change the
+ * definition of the encoding of the parameter searchChar from MacRoman to
+ * UniChar for that.
*
* The system uses font fallback for controls, so we don't really need
* this. */
@@ -2656,30 +2451,27 @@ TkMacOSXIsCharacterMissing(
*
* TkMacOSXInitControlFontStyle --
*
- * This procedure sets up the appropriate ControlFontStyleRec
- * for a Mac control.
+ * This procedure sets up the appropriate ControlFontStyleRec
+ * for a Mac control.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
void
TkMacOSXInitControlFontStyle(
- Tk_Font tkfont, /* Tk font object to use for the control. */
- ControlFontStylePtr fsPtr) /* The style object to configure. */
+ Tk_Font tkfont, /* Tk font object to use for the control. */
+ ControlFontStylePtr fsPtr) /* The style object to configure. */
{
- const MacFont * fontPtr;
- fontPtr = (MacFont *) tkfont;
- fsPtr->flags =
- kControlUseFontMask|
- kControlUseSizeMask|
- kControlUseFaceMask|
- kControlUseJustMask;
+ const MacFont * fontPtr = (MacFont *) tkfont;
+
+ fsPtr->flags = kControlUseFontMask |
+ kControlUseSizeMask | kControlUseFaceMask | kControlUseJustMask;
fsPtr->font = fontPtr->qdFont;
fsPtr->size = fontPtr->qdSize;
fsPtr->style = fontPtr->qdStyle;
@@ -2691,47 +2483,53 @@ TkMacOSXInitControlFontStyle(
*
* TkMacOSXUseAntialiasedText --
*
- * Enables or disables application-wide use of antialiased text (where
- * available). Sets up a linked Tcl global variable to allow
- * disabling of antialiased text from tcl.
- * The possible values for this variable are:
+ * Enables or disables application-wide use of antialiased text (where
+ * available). Sets up a linked Tcl global variable to allow disabling of
+ * antialiased text from tcl. The possible values for this variable are:
*
- * -1 - Use system default as configurable in "System Preferences" ->
- * "General".
- * 0 - Unconditionally disable antialiasing.
- * 1 - Unconditionally enable antialiasing.
+ * -1 - Use system default as configurable in "System Preferences" ->
+ * "General".
+ * 0 - Unconditionally disable antialiasing.
+ * 1 - Unconditionally enable antialiasing.
*
* Results:
*
- * TCL_OK.
+ * TCL_OK.
*
* Side effects:
*
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE int
TkMacOSXUseAntialiasedText(
- Tcl_Interp * interp, /* The Tcl interpreter to receive the
- * variable .*/
- int enable) /* Initial value. */
+ Tcl_Interp * interp, /* The Tcl interpreter to receive the variable .*/
+ int enable) /* Initial value. */
{
static Boolean initialized = FALSE;
- if(!initialized) {
- initialized = TRUE;
-
- if (Tcl_CreateNamespace(interp, "::tk::mac", NULL, NULL) == NULL) {
- Tcl_ResetResult(interp);
- }
- if (Tcl_LinkVar(interp, "::tk::mac::antialiasedtext",
- (char *) &antialiasedTextEnabled,
- TCL_LINK_INT) != TCL_OK) {
- Tcl_ResetResult(interp);
- }
+ if (!initialized) {
+ initialized = TRUE;
+
+ if (Tcl_CreateNamespace(interp, "::tk::mac", NULL, NULL) == NULL) {
+ Tcl_ResetResult(interp);
+ }
+ if (Tcl_LinkVar(interp, "::tk::mac::antialiasedtext",
+ (char *) &antialiasedTextEnabled,
+ TCL_LINK_INT) != TCL_OK) {
+ Tcl_ResetResult(interp);
+ }
}
antialiasedTextEnabled = enable;
return TCL_OK;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXInit.c b/macosx/tkMacOSXInit.c
index d3492c4..6059708 100644
--- a/macosx/tkMacOSXInit.c
+++ b/macosx/tkMacOSXInit.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXInit.c,v 1.25 2006/11/24 19:03:50 hobbs Exp $
+ * RCS: @(#) $Id: tkMacOSXInit.c,v 1.26 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -198,22 +198,29 @@ TkpInit(interp)
FSRef ref;
SInt16 refNum;
- /* Write resource data to temporary file and open it */
+ /*
+ * Write resource data to temporary file and open it.
+ */
+
strcpy(fileName, P_tmpdir);
if (fileName[strlen(fileName) - 1] != '/') {
strcat(fileName, "/");
}
strcat(fileName, "tkMacOSX_XXXXXX");
fd = mkstemp(fileName);
- if (fd == -1) break;
+ if (fd == -1) {
+ break;
+ }
fcntl(fd, F_SETFD, FD_CLOEXEC);
- if (write(fd, data, size) == -1) break;
+ if (write(fd, data, size) == -1) {
+ break;
+ }
err = FSPathMakeRef((unsigned char*)fileName, &ref, NULL);
- if (err != noErr) break;
+ if (err != noErr) {
+ break;
+ }
err = FSOpenResourceFile(&ref, 0, NULL, fsRdPerm, &refNum);
-#ifdef TK_MAC_DEBUG
- if (err != noErr) fprintf(stderr,"FSOpenResourceFile error %ld\n",err);
-#endif
+ LOG_ON_ERROR(FSOpenResourceFile);
break;
}
if (fd != -1) {
@@ -225,12 +232,11 @@ TkpInit(interp)
}
/* REMOVE ME: Close stdin & stdout for remote debugging otherwise we
- * will fight with gdb for stdin & stdout
- */
+ * will fight with gdb for stdin & stdout */
- if (getenv ("XCNOSTDIN") != NULL) {
- close (0);
- close (1);
+ if (getenv("XCNOSTDIN") != NULL) {
+ close(0);
+ close(1);
}
/*
@@ -241,18 +247,22 @@ TkpInit(interp)
if (!isatty(0)) {
struct stat st;
+
if (fstat(0, &st) || (S_ISCHR(st.st_mode) && st.st_blocks == 0)) {
Tk_InitConsoleChannels(interp);
Tcl_RegisterChannel(interp, Tcl_GetStdChannel(TCL_STDIN));
Tcl_RegisterChannel(interp, Tcl_GetStdChannel(TCL_STDOUT));
Tcl_RegisterChannel(interp, Tcl_GetStdChannel(TCL_STDERR));
+
/*
- * Only show the console if we don't have a startup script
- * and tcl_interactive hasn't been set already.
+ * Only show the console if we don't have a startup script and
+ * tcl_interactive hasn't been set already.
*/
+
if (Tcl_GetStartupScript(NULL) == NULL) {
- CONST char *intvar =
- Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY);
+ CONST char *intvar = Tcl_GetVar(interp,
+ "tcl_interactive", TCL_GLOBAL_ONLY);
+
if (intvar == NULL) {
Tcl_SetVar(interp, "tcl_interactive", "1",
TCL_GLOBAL_ONLY);
diff --git a/macosx/tkMacOSXInt.h b/macosx/tkMacOSXInt.h
index f3bb504..289f47b 100644
--- a/macosx/tkMacOSXInt.h
+++ b/macosx/tkMacOSXInt.h
@@ -6,10 +6,10 @@
* Copyright (c) 1995-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXInt.h,v 1.20 2006/10/31 22:33:34 das Exp $
+ * RCS: @(#) $Id: tkMacOSXInt.h,v 1.21 2007/04/13 14:51:18 dkf Exp $
*/
#ifndef _TKMACINT
@@ -32,64 +32,63 @@
#endif
struct TkWindowPrivate {
- TkWindow *winPtr; /* Ptr to tk window or NULL if Pixmap */
- CGrafPtr grafPtr;
+ TkWindow *winPtr; /* Ptr to tk window or NULL if Pixmap */
+ CGrafPtr grafPtr;
ControlRef rootControl;
- int xOff; /* X offset from toplevel window */
- int yOff; /* Y offset from toplevel window */
+ int xOff; /* X offset from toplevel window */
+ int yOff; /* Y offset from toplevel window */
RgnHandle clipRgn; /* Visible region of window */
RgnHandle aboveClipRgn; /* Visible region of window & it's children */
int referenceCount; /* Don't delete toplevel until children are
* gone. */
- struct TkWindowPrivate *toplevel; /* Pointer to the toplevel
- * datastruct. */
+ struct TkWindowPrivate *toplevel;
+ /* Pointer to the toplevel datastruct. */
int flags; /* Various state see defines below. */
};
typedef struct TkWindowPrivate MacDrawable;
/*
- * This list is used to keep track of toplevel windows that have a Mac
- * window attached. This is useful for several things, not the least
- * of which is maintaining floating windows.
+ * This list is used to keep track of toplevel windows that have a Mac window
+ * attached. This is useful for several things, not the least of which is
+ * maintaining floating windows.
*/
typedef struct TkMacOSXWindowList {
- struct TkMacOSXWindowList *nextPtr; /* The next window in the list. */
- TkWindow *winPtr; /* This window */
+ struct TkMacOSXWindowList *nextPtr;
+ /* The next window in the list. */
+ TkWindow *winPtr; /* This window */
} TkMacOSXWindowList;
/*
* Defines use for the flags field of the MacDrawable data structure.
*/
-
+
#define TK_SCROLLBAR_GROW 1
#define TK_CLIP_INVALID 2
#define TK_HOST_EXISTS 4
#define TK_DRAWN_UNDER_MENU 8
/*
- * I am reserving TK_EMBEDDED = 0x100 in the MacDrawable flags
- * This is defined in tk.h. We need to duplicate the TK_EMBEDDED flag in the
- * TkWindow structure for the window, but in the MacWin. This way we can
- * still tell what the correct port is after the TKWindow structure has been
- * freed. This actually happens when you bind destroy of a toplevel to
- * Destroy of a child.
+ * I am reserving TK_EMBEDDED = 0x100 in the MacDrawable flags. This is
+ * defined in tk.h. We need to duplicate the TK_EMBEDDED flag in the TkWindow
+ * structure for the window, but in the MacWin. This way we can still tell
+ * what the correct port is after the TKWindow structure has been freed. This
+ * actually happens when you bind destroy of a toplevel to Destroy of a child.
*/
/*
- * This structure is for handling Netscape-type in process
- * embedding where Tk does not control the top-level. It contains
- * various functions that are needed by Mac specific routines, like
- * TkMacOSXGetDrawablePort. The definitions of the function types
- * are in tkMacOSX.h.
+ * This structure is for handling Netscape-type in process embedding where Tk
+ * does not control the top-level. It contains various functions that are
+ * needed by Mac specific routines, like TkMacOSXGetDrawablePort. The
+ * definitions of the function types are in tkMacOSX.h.
*/
typedef struct {
- Tk_MacOSXEmbedRegisterWinProc *registerWinProc;
- Tk_MacOSXEmbedGetGrafPortProc *getPortProc;
- Tk_MacOSXEmbedMakeContainerExistProc *containerExistProc;
- Tk_MacOSXEmbedGetClipProc *getClipProc;
- Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc;
+ Tk_MacOSXEmbedRegisterWinProc *registerWinProc;
+ Tk_MacOSXEmbedGetGrafPortProc *getPortProc;
+ Tk_MacOSXEmbedMakeContainerExistProc *containerExistProc;
+ Tk_MacOSXEmbedGetClipProc *getClipProc;
+ Tk_MacOSXEmbedGetOffsetInParentProc *getOffsetProc;
} TkMacOSXEmbedHandler;
MODULE_SCOPE TkMacOSXEmbedHandler *tkMacOSXEmbedHandler;
@@ -97,7 +96,7 @@ MODULE_SCOPE TkMacOSXEmbedHandler *tkMacOSXEmbedHandler;
/*
* Defines used for TkMacOSXInvalidateWindow
*/
-
+
#define TK_WINDOW_ONLY 0
#define TK_PARENT_WINDOW 1
@@ -120,65 +119,104 @@ MODULE_SCOPE TkMacOSXEmbedHandler *tkMacOSXEmbedHandler;
* Defines for tkTextDisp.c
*/
-#define TK_LAYOUT_WITH_BASE_CHUNKS 1
-#define TK_DRAW_IN_CONTEXT 1
+#define TK_LAYOUT_WITH_BASE_CHUNKS 1
+#define TK_DRAW_IN_CONTEXT 1
/*
- * Variables shared among various Mac Tk modules but are not
- * exported to the outside world.
+ * Variables shared among various Mac Tk modules but are not exported to the
+ * outside world.
*/
/*
* Globals shared among Macintosh Tk
*/
-MODULE_SCOPE MenuHandle tkCurrentAppleMenu; /* Handle to current Apple Menu */
-MODULE_SCOPE MenuHandle tkAppleMenu; /* Handle to default Apple Menu */
-MODULE_SCOPE MenuHandle tkFileMenu; /* Handles to menus */
-MODULE_SCOPE MenuHandle tkEditMenu; /* Handles to menus */
-MODULE_SCOPE RgnHandle tkMenuCascadeRgn;/* A region to clip with. */
-MODULE_SCOPE int tkUseMenuCascadeRgn; /* If this is 1, clipping code
- * should intersect tkMenuCascadeRgn
- * before drawing occurs.
- * tkMenuCascadeRgn will only
- * be valid when the value of this
- * variable is 1. */
-MODULE_SCOPE int tkPictureIsOpen; /* If this is 1, we are drawing to a
- * picture The clipping should then be
- * done relative to the bounds of the
- * picture rather than the window. As
- * of OS X.0.4, something is seriously
- * wrong: The clipping bounds only
- * seem to work if the top,left values
- * are 0,0 The destination rectangle
- * for CopyBits should also have
- * top,left values of 0,0
- */
+MODULE_SCOPE MenuHandle tkCurrentAppleMenu;
+ /* Handle to current Apple Menu */
+MODULE_SCOPE MenuHandle tkAppleMenu;
+ /* Handle to default Apple Menu */
+MODULE_SCOPE MenuHandle tkFileMenu;
+ /* Handles to menus */
+MODULE_SCOPE MenuHandle tkEditMenu;
+ /* Handles to menus */
+MODULE_SCOPE RgnHandle tkMenuCascadeRgn;
+ /* A region to clip with. */
+MODULE_SCOPE int tkUseMenuCascadeRgn;
+ /* If this is 1, clipping code should
+ * intersect tkMenuCascadeRgn before drawing
+ * occurs. tkMenuCascadeRgn will only be valid
+ * when the value of this variable is 1. */
+MODULE_SCOPE int tkPictureIsOpen;
+ /* If this is 1, we are drawing to a picture
+ * The clipping should then be done relative
+ * to the bounds of the picture rather than
+ * the window. As of OS X.0.4, something is
+ * seriously wrong: The clipping bounds only
+ * seem to work if the top,left values are 0,0
+ * The destination rectangle for CopyBits
+ * should also have top,left values of 0,0 */
MODULE_SCOPE TkMacOSXWindowList *tkMacOSXWindowListPtr;
- /* The list of toplevels */
+ /* The list of toplevels */
MODULE_SCOPE Tcl_Encoding TkMacOSXCarbonEncoding;
-MODULE_SCOPE void TkMacOSXDisplayChanged(Display *display);
-MODULE_SCOPE int TkMacOSXUseAntialiasedText(Tcl_Interp *interp, int enable);
-MODULE_SCOPE void TkMacOSXInitCarbonEvents(Tcl_Interp *interp);
-MODULE_SCOPE int TkMacOSXInitCGDrawing(Tcl_Interp *interp, int enable, int antiAlias);
-MODULE_SCOPE void TkMacOSXInitKeyboard(Tcl_Interp *interp);
-MODULE_SCOPE void TkMacOSXDefaultStartupScript(void);
-MODULE_SCOPE int TkMacOSXGenerateFocusEvent( Window window, int activeFlag);
+MODULE_SCOPE void TkMacOSXDisplayChanged(Display *display);
+MODULE_SCOPE int TkMacOSXUseAntialiasedText(Tcl_Interp *interp,
+ int enable);
+MODULE_SCOPE void TkMacOSXInitCarbonEvents(Tcl_Interp *interp);
+MODULE_SCOPE int TkMacOSXInitCGDrawing(Tcl_Interp *interp, int enable,
+ int antiAlias);
+MODULE_SCOPE void TkMacOSXInitKeyboard(Tcl_Interp *interp);
+MODULE_SCOPE void TkMacOSXDefaultStartupScript(void);
+MODULE_SCOPE int TkMacOSXGenerateFocusEvent(Window window,
+ int activeFlag);
MODULE_SCOPE WindowClass TkMacOSXWindowClass(TkWindow *winPtr);
-MODULE_SCOPE int TkMacOSXIsWindowZoomed(TkWindow *winPtr);
-MODULE_SCOPE int TkGenerateButtonEventForXPointer(Window window);
-MODULE_SCOPE int TkMacOSXCompareColors(unsigned long c1, unsigned long c2);
+MODULE_SCOPE int TkMacOSXIsWindowZoomed(TkWindow *winPtr);
+MODULE_SCOPE int TkGenerateButtonEventForXPointer(Window window);
+MODULE_SCOPE int TkMacOSXCompareColors(unsigned long c1,
+ unsigned long c2);
+MODULE_SCOPE void * TkMacOSXGetNamedSymbol(const char *module,
+ const char *symbol);
+
+/*
+ * Macro to abstract common use of TkMacOSXGetNamedSymbol to initialize named
+ * symbols.
+ */
-MODULE_SCOPE void* TkMacOSXGetNamedSymbol(const char* module, const char* symbol);
-/* Macro to abstract common use of TkMacOSXGetNamedSymbol to initialize named symbols */
#define TkMacOSXInitNamedSymbol(module, ret, symbol, ...) \
static ret (* symbol)(__VA_ARGS__) = (void*)(-1L); \
if (symbol == (void*)(-1L)) { \
symbol = TkMacOSXGetNamedSymbol(STRINGIFY(module), STRINGIFY(_##symbol));\
}
+/*
+ * Macro to make handling failed events a little bit less verbose. Assumes
+ * that error values are always in the (local) variable 'err'.
+ */
+
+#ifdef TK_MAC_DEBUG
+#define LOG_MSG(msg, ...) fprintf(stderr, msg "\n", __VA_ARGS__)
+#define LOG_ON_ERROR(msg) \
+ if (err != noErr) { \
+ fprintf(stderr, ##msg " failed, %d\n", (int) err); \
+ }
+#else
+#define LOG_MSG(msg, ...) /* do nothing */
+#define LOG_ON_ERROR(msg) /* do nothing */
+#endif
+
+/*
+ * Include the stubbed internal platform-specific API.
+ */
+
#include "tkIntPlatDecls.h"
#endif /* _TKMACINT */
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXKeyEvent.c b/macosx/tkMacOSXKeyEvent.c
index 3a6551b..27d6c7b 100644
--- a/macosx/tkMacOSXKeyEvent.c
+++ b/macosx/tkMacOSXKeyEvent.c
@@ -1,8 +1,8 @@
/*
* tkMacOSXKeyEvent.c --
*
- * This file implements functions that decode & handle keyboard events
- * on MacOS X.
+ * This file implements functions that decode & handle keyboard events
+ * on MacOS X.
*
* Copyright 2001, Apple Computer, Inc.
* Copyright (c) 2006 Daniel A. Steffen <das@users.sourceforge.net>
@@ -10,51 +10,49 @@
* 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.
- *
- * RCS: @(#) $Id: tkMacOSXKeyEvent.c,v 1.18 2006/09/11 14:41:04 das Exp $
+ * 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.
+ *
+ * RCS: @(#) $Id: tkMacOSXKeyEvent.c,v 1.19 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -65,252 +63,225 @@
#define TK_MAC_DEBUG_KEYBOARD
#endif
*/
+#ifdef TK_MAC_DEBUG_KEYBOARD
+#define KDBG DBG_MSG
+#else
+#define KDBG(...) /* nothing */
+#endif
typedef struct {
- WindowRef whichWindow;
- int global_x, global_y;
- int local_x, local_y;
+ WindowRef whichWindow;
+ int global_x, global_y;
+ int local_x, local_y;
unsigned int state;
unsigned char ch;
- UInt32 keyCode;
- UInt32 keyModifiers;
- UInt32 message;
+ UInt32 keyCode;
+ UInt32 keyModifiers;
+ UInt32 message;
} KeyEventData;
-static Tk_Window gGrabWinPtr = NULL; /* Current grab window,
- * NULL if no grab. */
-static Tk_Window gKeyboardWinPtr = NULL; /* Current keyboard grab window. */
-
-static UInt32 deadKeyStateUp = 0; /* The deadkey state for the current
- * sequence of keyup events or 0 if
- * not in a deadkey sequence */
-static UInt32 deadKeyStateDown = 0; /* Ditto for keydown */
+static Tk_Window gGrabWinPtr = NULL;
+ /* Current grab window, NULL if no grab. */
+static Tk_Window gKeyboardWinPtr = NULL;
+ /* Current keyboard grab window. */
+static UInt32 deadKeyStateUp = 0;
+ /* The deadkey state for the current sequence
+ * of keyup events or 0 if not in a deadkey
+ * sequence */
+static UInt32 deadKeyStateDown = 0;
+ /* Ditto for keydown */
/*
* Declarations for functions used only in this file.
*/
-
-static int InitKeyData(
- KeyEventData * keyEventDataPtr);
-
-static int InitKeyEvent(
- XEvent * eventPtr,
- KeyEventData * e,
- UInt32 savedKeyCode,
- UInt32 savedModifiers);
-
-static int GenerateKeyEvent (
- UInt32 eKind,
- KeyEventData * e,
- UInt32 savedKeyCode,
- UInt32 savedModifiers,
- const UniChar * chars, int numChars);
-
-static int GetKeyboardLayout (
- Ptr * resourcePtr, TextEncoding * encodingPtr);
-static TextEncoding GetKCHREncoding(
- ScriptCode script, SInt32 layoutid);
-
-static int KeycodeToUnicodeViaUnicodeResource(
- UniChar * uniChars, int maxChars,
- Ptr uchr,
- EventKind eKind,
- UInt32 keycode, UInt32 modifiers,
- UInt32 * deadKeyStatePtr);
-
-static int KeycodeToUnicodeViaKCHRResource(
- UniChar * uniChars, int maxChars,
- Ptr kchr, TextEncoding encoding,
- EventKind eKind,
- UInt32 keycode, UInt32 modifiers,
- UInt32 * deadKeyStatePtr);
+
+static int InitKeyData(KeyEventData *keyEventDataPtr);
+static int InitKeyEvent(XEvent *eventPtr, KeyEventData *e,
+ UInt32 savedKeyCode, UInt32 savedModifiers);
+static int GenerateKeyEvent(UInt32 eKind, KeyEventData *e,
+ UInt32 savedKeyCode, UInt32 savedModifiers,
+ const UniChar *chars, int numChars);
+static int GetKeyboardLayout(Ptr *resourcePtr,
+ TextEncoding *encodingPtr);
+static TextEncoding GetKCHREncoding(ScriptCode script, SInt32 layoutid);
+static int KeycodeToUnicodeViaUnicodeResource(UniChar *uniChars,
+ int maxChars, Ptr uchr, EventKind eKind,
+ UInt32 keycode, UInt32 modifiers,
+ UInt32 *deadKeyStatePtr);
+static int KeycodeToUnicodeViaKCHRResource(UniChar *uniChars,
+ int maxChars, Ptr kchr, TextEncoding encoding,
+ EventKind eKind, UInt32 keycode, UInt32 modifiers,
+ UInt32 *deadKeyStatePtr);
/*
*----------------------------------------------------------------------
*
* TkMacOSXProcessKeyboardEvent --
*
- * This routine processes the event in eventPtr, and
- * generates the appropriate Tk events from it.
+ * This routine processes the event in eventPtr, and generates the
+ * appropriate Tk events from it.
*
* Results:
- * True if event(s) are generated - false otherwise.
+ * True if event(s) are generated - false otherwise.
*
* Side effects:
- * Additional events may be place on the Tk event queue.
+ * Additional events may be place on the Tk event queue.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE int
TkMacOSXProcessKeyboardEvent(
- TkMacOSXEvent * eventPtr,
- MacEventStatus * statusPtr)
+ TkMacOSXEvent *eventPtr,
+ MacEventStatus *statusPtr)
{
static UInt32 savedKeyCode = 0;
static UInt32 savedModifiers = 0;
static UniChar savedChar = 0;
- OSStatus status;
+ OSStatus status;
KeyEventData keyEventData;
- MenuRef menuRef;
+ MenuRef menuRef;
MenuItemIndex menuItemIndex;
int eventGenerated;
UniChar uniChars[5]; /* make this larger, if needed */
UInt32 uniCharsLen = 0;
if (!InitKeyData(&keyEventData)) {
- statusPtr->err = 1;
- return false;
+ statusPtr->err = 1;
+ return false;
}
-
+
/*
* Because of the way that Tk operates, we can't in general funnel menu
- * accelerators through IsMenuKeyEvent. Tk treats accelerators as mere
+ * accelerators through IsMenuKeyEvent. Tk treats accelerators as mere
* decoration, and the user has to install bindings to get them to fire.
*
- * However, the only way to trigger the Hide & Hide Others functions
- * is by invoking the Menu command for Hide. So there is no nice way to
- * provide a Tk command to hide the app which would be available for a
- * binding. So I am going to hijack Command-H and Command-Shift-H
- * here, and run the menu commands. Since the HI Guidelines explicitly
- * reserve these for Hide, this isn't such a bad thing. Also, if you do
- * rebind Command-H to another menu item, Hide will lose its binding.
- *
- * Note that I don't really do anything at this point,
- * I just mark stopProcessing as 0 and return, and then the
- * RecieveAndProcessEvent code will dispatch the event to the default
- * handler.
+ * However, the only way to trigger the Hide & Hide Others functions is by
+ * invoking the Menu command for Hide. So there is no nice way to provide
+ * a Tk command to hide the app which would be available for a binding. So
+ * I am going to hijack Command-H and Command-Shift-H here, and run the
+ * menu commands. Since the HI Guidelines explicitly reserve these for
+ * Hide, this isn't such a bad thing. Also, if you do rebind Command-H to
+ * another menu item, Hide will lose its binding.
+ *
+ * Note that I don't really do anything at this point, I just mark
+ * stopProcessing as 0 and return, and then the RecieveAndProcessEvent
+ * code will dispatch the event to the default handler.
*/
- if ((eventPtr->eKind == kEventRawKeyDown
+ if ((eventPtr->eKind == kEventRawKeyDown
|| eventPtr->eKind == kEventRawKeyRepeat)
- && IsMenuKeyEvent(tkCurrentAppleMenu, eventPtr->eventRef,
+ && IsMenuKeyEvent(tkCurrentAppleMenu, eventPtr->eventRef,
kMenuEventQueryOnly, &menuRef, &menuItemIndex)) {
MenuCommand menuCmd;
GetMenuItemCommandID (menuRef, menuItemIndex, &menuCmd);
switch (menuCmd) {
- case kHICommandHide:
- case kHICommandHideOthers:
- case kHICommandShowAll:
- case kHICommandPreferences:
- case kHICommandQuit:
- statusPtr->stopProcessing = 0;
- return 0; /* TODO: may not be on event on queue. */
- break;
- default:
- break;
+ case kHICommandHide:
+ case kHICommandHideOthers:
+ case kHICommandShowAll:
+ case kHICommandPreferences:
+ case kHICommandQuit:
+ statusPtr->stopProcessing = 0;
+ return 0; /* TODO: may not be on event on queue. */
+ break;
+ default:
+ break;
}
}
- status = GetEventParameter(eventPtr->eventRef,
- kEventParamKeyMacCharCodes,
- typeChar, NULL,
- sizeof(keyEventData.ch), NULL,
- &keyEventData.ch);
+ status = GetEventParameter(eventPtr->eventRef,
+ kEventParamKeyMacCharCodes, typeChar, NULL,
+ sizeof(keyEventData.ch), NULL, &keyEventData.ch);
if (status != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf (stderr, "Failed to retrieve KeyMacCharCodes\n");
-#endif
- statusPtr->err = 1;
- return false;
- }
- status = GetEventParameter(eventPtr->eventRef,
- kEventParamKeyCode,
- typeUInt32, NULL,
- sizeof(keyEventData.keyCode), NULL,
- &keyEventData.keyCode);
+ LOG_MSG("Failed to retrieve KeyMacCharCodes");
+ statusPtr->err = 1;
+ return false;
+ }
+ status = GetEventParameter(eventPtr->eventRef, kEventParamKeyCode,
+ typeUInt32, NULL, sizeof(keyEventData.keyCode), NULL,
+ &keyEventData.keyCode);
if (status != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf (stderr, "Failed to retrieve KeyCode\n");
-#endif
- statusPtr->err = 1;
- return false;
+ LOG_MSG("Failed to retrieve KeyCode");
+ statusPtr->err = 1;
+ return false;
}
- status = GetEventParameter(eventPtr->eventRef,
- kEventParamKeyModifiers,
- typeUInt32, NULL,
- sizeof(keyEventData.keyModifiers), NULL,
- &keyEventData.keyModifiers);
+ status = GetEventParameter(eventPtr->eventRef, kEventParamKeyModifiers,
+ typeUInt32, NULL, sizeof(keyEventData.keyModifiers), NULL,
+ &keyEventData.keyModifiers);
if (status != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf (stderr, "Failed to retrieve KeyModifiers\n");
-#endif
- statusPtr->err = 1;
- return false;
+ LOG_MSG("Failed to retrieve KeyModifiers");
+ statusPtr->err = 1;
+ return false;
}
switch (eventPtr->eKind) {
- case kEventRawKeyUp:
- case kEventRawKeyDown:
- case kEventRawKeyRepeat:
- {
- UInt32 *deadKeyStatePtr;
-
- if (kEventRawKeyDown == eventPtr->eKind) {
- deadKeyStatePtr = &deadKeyStateDown;
- } else {
- deadKeyStatePtr = &deadKeyStateUp;
- }
-
- uniCharsLen = TkMacOSXKeycodeToUnicode(
- uniChars, sizeof(uniChars)/sizeof(*uniChars),
- eventPtr->eKind,
- keyEventData.keyCode, keyEventData.keyModifiers,
- deadKeyStatePtr);
- }
+ case kEventRawKeyUp:
+ case kEventRawKeyDown:
+ case kEventRawKeyRepeat: {
+ UInt32 *deadKeyStatePtr;
+
+ if (kEventRawKeyDown == eventPtr->eKind) {
+ deadKeyStatePtr = &deadKeyStateDown;
+ } else {
+ deadKeyStatePtr = &deadKeyStateUp;
+ }
+
+ uniCharsLen = TkMacOSXKeycodeToUnicode(uniChars,
+ sizeof(uniChars)/sizeof(*uniChars), eventPtr->eKind,
+ keyEventData.keyCode, keyEventData.keyModifiers,
+ deadKeyStatePtr);
+ }
}
if (kEventRawKeyUp == eventPtr->eKind) {
- /*
- * For some reason the deadkey processing for KeyUp doesn't work
- * sometimes, so we fudge and use the last detected KeyDown.
- */
-
- if((0 == uniCharsLen) && (0 != savedChar)) {
- uniChars[0] = savedChar;
- uniCharsLen = 1;
- }
-
- /*
- * Suppress keyup events while we have a deadkey sequence on keydown.
- * We still *do* want to collect deadkey state in this situation if
- * the system provides it, that's why we do this only after
- * TkMacOSXKeycodeToUnicode().
- */
-
- if (0 != deadKeyStateDown) {
- uniCharsLen = 0;
- }
+ /*
+ * For some reason the deadkey processing for KeyUp doesn't work
+ * sometimes, so we fudge and use the last detected KeyDown.
+ */
+
+ if ((0 == uniCharsLen) && (0 != savedChar)) {
+ uniChars[0] = savedChar;
+ uniCharsLen = 1;
+ }
+
+ /*
+ * Suppress keyup events while we have a deadkey sequence on keydown.
+ * We still *do* want to collect deadkey state in this situation if
+ * the system provides it, that's why we do this only after
+ * TkMacOSXKeycodeToUnicode().
+ */
+
+ if (0 != deadKeyStateDown) {
+ uniCharsLen = 0;
+ }
}
keyEventData.message = keyEventData.ch|(keyEventData.keyCode << 8);
- eventGenerated = GenerateKeyEvent(
- eventPtr->eKind, &keyEventData,
- savedKeyCode, savedModifiers,
- uniChars, uniCharsLen);
+ eventGenerated = GenerateKeyEvent(eventPtr->eKind, &keyEventData,
+ savedKeyCode, savedModifiers, uniChars, uniCharsLen);
savedModifiers = keyEventData.keyModifiers;
if ((kEventRawKeyDown == eventPtr->eKind) && (uniCharsLen > 0)) {
- savedChar = uniChars[0];
+ savedChar = uniChars[0];
} else {
- savedChar = 0;
+ savedChar = 0;
}
-
+
statusPtr->stopProcessing = 1;
if (eventGenerated == 0) {
- savedKeyCode = keyEventData.message;
- return false;
+ savedKeyCode = keyEventData.message;
+ return false;
} else if (eventGenerated == -1) {
- savedKeyCode = 0;
- statusPtr->stopProcessing = 0;
- return false;
+ savedKeyCode = 0;
+ statusPtr->stopProcessing = 0;
+ return false;
} else {
- savedKeyCode = 0;
- return true;
+ savedKeyCode = 0;
+ return true;
}
}
@@ -319,107 +290,102 @@ TkMacOSXProcessKeyboardEvent(
*
* GenerateKeyEvent --
*
- * Given Macintosh keyUp, keyDown & autoKey events (in their "raw"
- * form) and a list of unicode characters this function generates the
- * appropriate X key events.
+ * Given Macintosh keyUp, keyDown & autoKey events (in their "raw" form)
+ * and a list of unicode characters this function generates the
+ * appropriate X key events.
*
- * Parameter eKind is a raw keyboard event. e contains the data sent
- * with the event. savedKeyCode and savedModifiers contain the values
- * from the last event that came before (see
- * TkMacOSXProcessKeyboardEvent()). chars/numChars has the Unicode
- * characters for which we want to create events.
+ * Parameter eKind is a raw keyboard event. e contains the data sent with
+ * the event. savedKeyCode and savedModifiers contain the values from the
+ * last event that came before (see TkMacOSXProcessKeyboardEvent()).
+ * chars/numChars has the Unicode characters for which we want to create
+ * events.
*
* Results:
- * 1 if an event was generated, -1 for any error.
+ * 1 if an event was generated, -1 for any error.
*
* Side effects:
- * Additional events may be place on the Tk event queue.
+ * Additional events may be place on the Tk event queue.
*
*----------------------------------------------------------------------
*/
static int
GenerateKeyEvent(
- UInt32 eKind,
- KeyEventData * e,
- UInt32 savedKeyCode,
- UInt32 savedModifiers,
- const UniChar * chars, int numChars)
+ UInt32 eKind,
+ KeyEventData * e,
+ UInt32 savedKeyCode,
+ UInt32 savedModifiers,
+ const UniChar * chars,
+ int numChars)
{
XEvent event;
int i;
-
+
if (-1 == InitKeyEvent(&event, e, savedKeyCode, savedModifiers)) {
- return -1;
+ return -1;
}
if (kEventRawKeyModifiersChanged == eKind) {
+ if (savedModifiers > e->keyModifiers) {
+ event.xany.type = KeyRelease;
+ } else {
+ event.xany.type = KeyPress;
+ }
- if (savedModifiers > e->keyModifiers) {
- event.xany.type = KeyRelease;
- } else {
- event.xany.type = KeyPress;
- }
-
- /*
- * Use special '-1' to signify a special keycode to our
- * platform specific code in tkMacOSXKeyboard.c. This is
- * rather like what happens on Windows.
- */
-
- event.xany.send_event = -1;
-
- /*
- * Set keycode (which was zero) to the changed modifier
- */
-
- event.xkey.keycode = (e->keyModifiers ^ savedModifiers);
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+ /*
+ * Use special '-1' to signify a special keycode to our
+ * platform specific code in tkMacOSXKeyboard.c. This is
+ * rather like what happens on Windows.
+ */
- } else {
+ event.xany.send_event = -1;
- for (i = 0; i < numChars; ++i) {
-
- /*
- * Encode one char in the trans_chars array that was already
- * introduced for MS Windows. Don't encode the string, if it is
- * a control character but was not generated with a real control
- * modifier. Such control characters get generated by KeyTrans()
- * for special keys, but we rather want to identify those by
- * their KeySyms.
- */
-
- event.xkey.trans_chars[0] = 0;
- if ((controlKey & e->keyModifiers) || (chars[i] >= ' ')) {
- int done;
- done = Tcl_UniCharToUtf(chars[i],event.xkey.trans_chars);
- event.xkey.trans_chars[done] = 0;
- }
-
- switch(eKind) {
- case kEventRawKeyDown:
- event.xany.type = KeyPress;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- break;
- case kEventRawKeyUp:
- event.xany.type = KeyRelease;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- break;
- case kEventRawKeyRepeat:
- event.xany.type = KeyRelease;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- event.xany.type = KeyPress;
- Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
- break;
- default:
-#ifdef TK_MAC_DEBUG
- fprintf (stderr,
- "GenerateKeyEvent(): Invalid parameter eKind %d\n",
- (int) eKind);
-#endif
- return -1;
- }
- }
+ /*
+ * Set keycode (which was zero) to the changed modifier
+ */
+
+ event.xkey.keycode = (e->keyModifiers ^ savedModifiers);
+ Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+
+ } else {
+ for (i = 0; i < numChars; ++i) {
+ /*
+ * Encode one char in the trans_chars array that was already
+ * introduced for MS Windows. Don't encode the string, if it is a
+ * control character but was not generated with a real control
+ * modifier. Such control characters get generated by KeyTrans()
+ * for special keys, but we rather want to identify those by their
+ * KeySyms.
+ */
+
+ event.xkey.trans_chars[0] = 0;
+ if ((controlKey & e->keyModifiers) || (chars[i] >= ' ')) {
+ int done;
+ done = Tcl_UniCharToUtf(chars[i],event.xkey.trans_chars);
+ event.xkey.trans_chars[done] = 0;
+ }
+
+ switch(eKind) {
+ case kEventRawKeyDown:
+ event.xany.type = KeyPress;
+ Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+ break;
+ case kEventRawKeyUp:
+ event.xany.type = KeyRelease;
+ Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+ break;
+ case kEventRawKeyRepeat:
+ event.xany.type = KeyRelease;
+ Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+ event.xany.type = KeyPress;
+ Tk_QueueWindowEvent(&event, TCL_QUEUE_TAIL);
+ break;
+ default:
+ LOG_MSG("GenerateKeyEvent(): Invalid parameter eKind %d",
+ (int) eKind);
+ return -1;
+ }
+ }
}
return 1;
@@ -430,33 +396,33 @@ GenerateKeyEvent(
*
* InitKeyData --
*
- * This routine initializes a KeyEventData structure by asking the OS
- * and Tk for all the global information needed here.
+ * This routine initializes a KeyEventData structure by asking the OS and
+ * Tk for all the global information needed here.
*
* Results:
- * True if the current front window can be found in Tk data structures
- * - false otherwise.
+ * True if the current front window can be found in Tk data structures -
+ * false otherwise.
*
* Side Effects:
- * None
+ * None
*
*----------------------------------------------------------------------
*/
-static int
-InitKeyData(KeyEventData * keyEventDataPtr)
+
+static int
+InitKeyData(
+ KeyEventData *keyEventDataPtr)
{
- memset (keyEventDataPtr, 0, sizeof(*keyEventDataPtr));
+ memset(keyEventDataPtr, 0, sizeof(*keyEventDataPtr));
keyEventDataPtr->whichWindow = ActiveNonFloatingWindow();
if (keyEventDataPtr->whichWindow == NULL) {
- return false;
+ return false;
}
XQueryPointer(NULL, None, NULL, NULL,
- &keyEventDataPtr->global_x,
- &keyEventDataPtr->global_y,
- &keyEventDataPtr->local_x,
- &keyEventDataPtr->local_y,
- &keyEventDataPtr->state);
+ &keyEventDataPtr->global_x, &keyEventDataPtr->global_y,
+ &keyEventDataPtr->local_x, &keyEventDataPtr->local_y,
+ &keyEventDataPtr->state);
return true;
}
@@ -466,75 +432,70 @@ InitKeyData(KeyEventData * keyEventDataPtr)
*
* InitKeyEvent --
*
- * Initialize an XEvent structure by asking Tk for global information.
- * Also uses a KeyEventData structure and other current state.
+ * Initialize an XEvent structure by asking Tk for global information.
+ * Also uses a KeyEventData structure and other current state.
*
* Results:
- * 1 on success, -1 for any error.
+ * 1 on success, -1 for any error.
*
* Side effects:
- * Additional events may be place on the Tk event queue.
+ * Additional events may be place on the Tk event queue.
*
*----------------------------------------------------------------------
*/
-/*
- * We have a general problem here. How do we handle 'Option-char'
- * keypresses? The problem is that we might want to bind to some of these
- * (e.g. Cmd-Opt-d is 'uncomment' in Alpha). OTOH Option-d actually produces
- * a real character on MacOS, namely a mathematical delta.
+/*
+ * We have a general problem here. How do we handle 'Option-char' keypresses?
+ * The problem is that we might want to bind to some of these (e.g. Cmd-Opt-d
+ * is 'uncomment' in Alpha). OTOH Option-d actually produces a real character
+ * on MacOS, namely a mathematical delta.
*
* The current behaviour is that a binding goes by the combinations of
- * modifiers and base keysym, that is Option-d. The string value of the
- * event is the mathematical delta character, so if no binding calls
- * [break], the text widget will insert that character.
+ * modifiers and base keysym, that is Option-d. The string value of the event
+ * is the mathematical delta character, so if no binding calls [break], the
+ * text widget will insert that character.
*
- * Note that this is similar to control combinations on all platforms. They
+ * Note that this is similar to control combinations on all platforms. They
* also generate events that have the base character as keysym and a real
- * control character as character value. So Ctrl+C gets us the keysym XK_C,
+ * control character as character value. So Ctrl+C gets us the keysym XK_C,
* the modifier Control (so you can bind <Control-C>) and a string value as
* "\u0003".
- *
+ *
* For a different solutions we may want for the event to contain keysyms for
- * *both* the 'Opt-d' side of things and the mathematical delta. Then a
+ * *both* the 'Opt-d' side of things and the mathematical delta. Then a
* binding on Opt-d will trigger, but a binding on mathematical delta would
- * also trigger. This would require changes in the core, though.
+ * also trigger. This would require changes in the core, though.
*/
static int
InitKeyEvent(
- XEvent * eventPtr,
- KeyEventData * e,
- UInt32 savedKeyCode,
- UInt32 savedModifiers)
+ XEvent * eventPtr,
+ KeyEventData * e,
+ UInt32 savedKeyCode,
+ UInt32 savedModifiers)
{
Window window;
Tk_Window tkwin;
TkDisplay *dispPtr;
-
+
/*
- * The focus must be in the FrontWindow on the Macintosh.
- * We then query Tk to determine the exact Tk window
- * that owns the focus.
+ * The focus must be in the FrontWindow on the Macintosh. We then query Tk
+ * to determine the exact Tk window that owns the focus.
*/
window = TkMacOSXGetXWindow(e->whichWindow);
dispPtr = TkGetDisplayList();
tkwin = Tk_IdToWindow(dispPtr->display, window);
-
+
if (tkwin == NULL) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"tkwin == NULL, %d\n", __LINE__);
-#endif
- return -1;
+ LOG_MSG("tkwin == NULL, %d", __LINE__);
+ return -1;
}
-
+
tkwin = (Tk_Window) ((TkWindow *) tkwin)->dispPtr->focusPtr;
if (tkwin == NULL) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"tkwin == NULL, %d\n", __LINE__);
-#endif
- return -1;
+ LOG_MSG("tkwin == NULL, %d", __LINE__);
+ return -1;
}
eventPtr->xany.send_event = false;
@@ -551,17 +512,15 @@ InitKeyEvent(
eventPtr->xkey.state = e->state;
eventPtr->xkey.trans_chars[0] = 0;
- Tk_TopCoordsToWindow(
- tkwin, e->local_x, e->local_y,
- &eventPtr->xkey.x, &eventPtr->xkey.y);
+ Tk_TopCoordsToWindow(tkwin, e->local_x, e->local_y,
+ &eventPtr->xkey.x, &eventPtr->xkey.y);
eventPtr->xkey.keycode = e->ch |
- ((savedKeyCode & charCodeMask) << 8) |
- ((e->message&keyCodeMask) << 8);
+ ((savedKeyCode & charCodeMask) << 8) |
+ ((e->message&keyCodeMask) << 8);
return 1;
}
-
/*
* If we have old headers, we need to define these types and constants
@@ -583,25 +542,27 @@ InitKeyEvent(
*
* GetKeyboardLayout --
*
- * Queries the OS for a pointer to a keyboard resource.
+ * Queries the OS for a pointer to a keyboard resource.
*
- * This function works with the keyboard layout switch menu. It uses
- * Keyboard Layout Services, where available.
+ * This function works with the keyboard layout switch menu. It uses
+ * Keyboard Layout Services, where available.
*
* Results:
- * 1 if there is returned a Unicode 'uchr' resource in *resourcePtr, 0
- * if it is a classic 'KCHR' resource. A pointer to the actual resource
- * data goes into *resourcePtr. If the resource is a 'KCHR' resource,
- * the corresponding Mac encoding goes into *encodingPtr.
+ * 1 if there is returned a Unicode 'uchr' resource in *resourcePtr, 0 if
+ * it is a classic 'KCHR' resource. A pointer to the actual resource data
+ * goes into *resourcePtr. If the resource is a 'KCHR' resource, the
+ * corresponding Mac encoding goes into *encodingPtr.
*
* Side effects:
- * Sets some internal static variables.
+ * Sets some internal static variables.
*
*----------------------------------------------------------------------
*/
static int
-GetKeyboardLayout (Ptr * resourcePtr, TextEncoding * encodingPtr)
+GetKeyboardLayout(
+ Ptr *resourcePtr,
+ TextEncoding *encodingPtr)
{
static KeyboardLayoutRef lastLayout = NULL;
static SInt32 lastLayoutId;
@@ -622,279 +583,260 @@ GetKeyboardLayout (Ptr * resourcePtr, TextEncoding * encodingPtr)
currentKeyScript = GetScriptManagerVariable(smKeyScript);
TkMacOSXInitNamedSymbol(HIToolbox, OSStatus, KLGetCurrentKeyboardLayout,
- KeyboardLayoutRef*);
+ KeyboardLayoutRef*);
TkMacOSXInitNamedSymbol(HIToolbox, OSStatus, KLGetKeyboardLayoutProperty,
- KeyboardLayoutRef, KeyboardLayoutPropertyTag, const void**);
+ KeyboardLayoutRef, KeyboardLayoutPropertyTag, const void**);
if (KLGetCurrentKeyboardLayout && KLGetKeyboardLayoutProperty) {
-
- /*
- * Use the Keyboard Layout Services (these functions only exist since
- * 10.2).
- */
-
- KLGetCurrentKeyboardLayout(&currentLayout);
-
- if (currentLayout != NULL) {
-
- /*
- * The layout pointer could in theory be the same for different
- * layouts, only the id gives us the information that the
- * keyboard has actually changed. OTOH the layout object can
- * also change and it could still be the same layoutid.
- */
-
- KLGetKeyboardLayoutProperty(currentLayout, kKLIdentifier,
- (const void**)&currentLayoutId);
-
- if ((lastLayout != currentLayout)
- || (lastLayoutId != currentLayoutId)) {
-
-#ifdef TK_MAC_DEBUG_KEYBOARD
- fprintf (stderr, "GetKeyboardLayout(): Use KLS\n");
-#endif
-
- hasLayoutChanged = true;
-
- /*
- * Reinitialize all relevant variables.
- */
-
- lastLayout = currentLayout;
- lastLayoutId = currentLayoutId;
- uchr = NULL;
- KCHR = NULL;
-
- if ((KLGetKeyboardLayoutProperty(currentLayout,
- kKLuchrData, (const void**)&uchr)
- == noErr)
- && (uchr != NULL)) {
- /* done */
- } else if ((KLGetKeyboardLayoutProperty(currentLayout,
- kKLKCHRData, (const void**)&KCHR)
- == noErr)
- && (KCHR != NULL)) {
- /* done */
- }
- }
- }
-
+ /*
+ * Use the Keyboard Layout Services (these functions only exist since
+ * 10.2).
+ */
+
+ KLGetCurrentKeyboardLayout(&currentLayout);
+
+ if (currentLayout != NULL) {
+ /*
+ * The layout pointer could in theory be the same for different
+ * layouts, only the id gives us the information that the keyboard
+ * has actually changed. OTOH the layout object can also change
+ * and it could still be the same layoutid.
+ */
+
+ KLGetKeyboardLayoutProperty(currentLayout, kKLIdentifier,
+ (const void**)&currentLayoutId);
+
+ if ((lastLayout != currentLayout)
+ || (lastLayoutId != currentLayoutId)) {
+ KDBG("GetKeyboardLayout(): Use KLS");
+ hasLayoutChanged = true;
+
+ /*
+ * Reinitialize all relevant variables.
+ */
+
+ lastLayout = currentLayout;
+ lastLayoutId = currentLayoutId;
+ uchr = NULL;
+ KCHR = NULL;
+
+ if ((KLGetKeyboardLayoutProperty(currentLayout, kKLuchrData,
+ (const void**)&uchr) == noErr) && (uchr != NULL)) {
+ /* done */
+ } else if ((KLGetKeyboardLayoutProperty(currentLayout,
+ kKLKCHRData, (const void**)&KCHR) == noErr)
+ && (KCHR != NULL)) {
+ /* done */
+ }
+ }
+ }
} else {
-
- /*
- * Use the classic approach as shown in Apple code samples, loading
- * the keyboard resources directly. This is broken for 10.3 and
- * possibly already in 10.2.
- */
-
- currentLayoutId = GetScriptVariable(currentKeyScript,smScriptKeys);
-
- if ((lastLayout == NULL) || (lastLayoutId != currentLayoutId)) {
-
-#ifdef TK_MAC_DEBUG_KEYBOARD
- fprintf (stderr, "GetKeyboardLayout(): Use GetResource()\n");
-#endif
-
- hasLayoutChanged = true;
-
- /*
- * Reinitialize all relevant variables.
- */
-
- lastLayout = (KeyboardLayoutRef)-1;
- lastLayoutId = currentLayoutId;
- uchr = NULL;
- KCHR = NULL;
-
- /*
- * Get the new layout resource in the classic way.
- */
-
- if (handle != NULL) {
- HUnlock(handle);
- }
-
- if ((handle = GetResource('uchr',currentLayoutId)) != NULL) {
- HLock(handle);
- uchr = *handle;
- } else if ((handle = GetResource('KCHR',currentLayoutId)) != NULL) {
- HLock(handle);
- KCHR = *handle;
- }
- }
+ /*
+ * Use the classic approach as shown in Apple code samples, loading
+ * the keyboard resources directly. This is broken for 10.3 and
+ * possibly already in 10.2.
+ */
+
+ currentLayoutId = GetScriptVariable(currentKeyScript,smScriptKeys);
+
+ if ((lastLayout == NULL) || (lastLayoutId != currentLayoutId)) {
+ KDBG("GetKeyboardLayout(): Use GetResource()");
+
+ hasLayoutChanged = true;
+
+ /*
+ * Reinitialize all relevant variables.
+ */
+
+ lastLayout = (KeyboardLayoutRef)-1;
+ lastLayoutId = currentLayoutId;
+ uchr = NULL;
+ KCHR = NULL;
+
+ /*
+ * Get the new layout resource in the classic way.
+ */
+
+ if (handle != NULL) {
+ HUnlock(handle);
+ }
+
+ if ((handle = GetResource('uchr',currentLayoutId)) != NULL) {
+ HLock(handle);
+ uchr = *handle;
+ } else if ((handle = GetResource('KCHR',currentLayoutId)) != NULL) {
+ HLock(handle);
+ KCHR = *handle;
+ }
+ }
}
if (hasLayoutChanged) {
-
#ifdef TK_MAC_DEBUG_KEYBOARD
- if (KCHR != NULL) {
- fprintf (stderr, "GetKeyboardLayout(): New 'KCHR' layout %d\n",
- (int) (short) currentLayoutId);
- } else if (uchr != NULL) {
- fprintf (stderr, "GetKeyboardLayout(): New 'uchr' layout %d\n",
- (int) (short) currentLayoutId);
- } else {
- fprintf (stderr, "GetKeyboardLayout(): Use cached layout "
- "(should have been %d)\n",
- (int) (short) currentLayoutId);
- }
+ if (KCHR != NULL) {
+ KDBG("GetKeyboardLayout(): New 'KCHR' layout %d",
+ (int) (short) currentLayoutId);
+ } else if (uchr != NULL) {
+ KDBG("GetKeyboardLayout(): New 'uchr' layout %d",
+ (int) (short) currentLayoutId);
+ } else {
+ KDBG("GetKeyboardLayout(): Use cached layout "
+ "(should have been %d)", (int) (short) currentLayoutId);
+ }
#endif
- deadKeyStateUp = deadKeyStateDown = 0;
-
- /*
- * If we did get a new 'KCHR', compute its encoding and put it into
- * lastEncoding.
- *
- * If we didn't get a new 'KCHR' and if we have no 'uchr' either, get
- * some 'KCHR' from the OS cache and leave lastEncoding at its
- * current value. This should better not happen, it doesn't really
- * work.
- */
-
- if (KCHR != NULL) {
- lastEncoding = GetKCHREncoding(currentKeyScript, currentLayoutId);
-#ifdef TK_MAC_DEBUG_KEYBOARD
- fprintf (stderr, "GetKeyboardLayout(): New 'KCHR' encoding %lu "
- "(%lu + 0x%lX)\n",
- lastEncoding, lastEncoding & 0xFFFFL,
- lastEncoding & ~0xFFFFL);
-#endif
- } else if (uchr == NULL) {
- KCHR = (Ptr) GetScriptManagerVariable(smKCHRCache);
- }
+ deadKeyStateUp = deadKeyStateDown = 0;
+
+ /*
+ * If we did get a new 'KCHR', compute its encoding and put it into
+ * lastEncoding.
+ *
+ * If we didn't get a new 'KCHR' and if we have no 'uchr' either, get
+ * some 'KCHR' from the OS cache and leave lastEncoding at its
+ * current value. This should better not happen, it doesn't really
+ * work.
+ */
+
+ if (KCHR != NULL) {
+ lastEncoding = GetKCHREncoding(currentKeyScript, currentLayoutId);
+ KDBG("GetKeyboardLayout(): New 'KCHR' encoding %lu (%lu + 0x%lX)",
+ lastEncoding, lastEncoding & 0xFFFFL,
+ lastEncoding & ~0xFFFFL);
+ } else if (uchr == NULL) {
+ KCHR = (Ptr) GetScriptManagerVariable(smKCHRCache);
+ }
}
if (uchr != NULL) {
- *resourcePtr = uchr;
- return 1;
+ *resourcePtr = uchr;
+ return 1;
} else {
- *resourcePtr = KCHR;
- *encodingPtr = lastEncoding;
- return 0;
+ *resourcePtr = KCHR;
+ *encodingPtr = lastEncoding;
+ return 0;
}
}
-
/*
*----------------------------------------------------------------------
*
* GetKCHREncoding --
*
- * Upgrade a WorldScript code to a TEC encoding based on the keyboard
- * layout id.
+ * Upgrade a WorldScript code to a TEC encoding based on the keyboard
+ * layout id.
*
* Results:
- * The TEC code that corresponds best to the combination of WorldScript
- * code and 'KCHR' id.
+ * The TEC code that corresponds best to the combination of WorldScript
+ * code and 'KCHR' id.
*
* Side effects:
- * None.
+ * None.
*
* Rationale and Notes:
- * WorldScript codes are sometimes not unique encodings. E.g. Icelandic
- * uses script smRoman (0), but the actual encoding is
- * kTextEncodingMacIcelandic (37). ftp://ftp.unicode.org/Public
- * /MAPPINGS/VENDORS/APPLE/README.TXT has a good summary of these
- * variants. So we need to upgrade the script to an encoding with
- * GetTextEncodingFromScriptInfo().
+ * WorldScript codes are sometimes not unique encodings. E.g. Icelandic
+ * uses script smRoman (0), but the actual encoding is
+ * kTextEncodingMacIcelandic (37). ftp://ftp.unicode.org/Public
+ * /MAPPINGS/VENDORS/APPLE/README.TXT has a good summary of these
+ * variants. So we need to upgrade the script to an encoding with
+ * GetTextEncodingFromScriptInfo().
*
- * 'KCHR' ids are usually region codes (see the comments in Script.h).
- * Where they are not, we get a paramErr from the OS function and have
- * appropriate fallbacks.
+ * 'KCHR' ids are usually region codes (see the comments in Script.h).
+ * Where they are not, we get a paramErr from the OS function and have
+ * appropriate fallbacks.
*
*----------------------------------------------------------------------
*/
static TextEncoding
-GetKCHREncoding(ScriptCode script, SInt32 layoutid)
+GetKCHREncoding(
+ ScriptCode script,
+ SInt32 layoutid)
{
RegionCode region = layoutid;
TextEncoding encoding = script;
if (GetTextEncodingFromScriptInfo(script, kTextLanguageDontCare, region,
- &encoding) == noErr) {
- return encoding;
+ &encoding) == noErr) {
+ return encoding;
}
/*
- * GetTextEncodingFromScriptInfo() doesn't know about more exotic
- * layouts. This provides a fallback for good measure. In an ideal
- * world, exotic layouts would always provide a 'uchr' resource anyway,
- * so we wouldn't need this.
+ * GetTextEncodingFromScriptInfo() doesn't know about more exotic layouts.
+ * This provides a fallback for good measure. In an ideal world, exotic
+ * layouts would always provide a 'uchr' resource anyway, so we wouldn't
+ * need this.
*
- * We can add more keyboard layouts, if we get actual complaints. Farsi
- * or other Celtic/Gaelic layouts would be candidates.
+ * We can add more keyboard layouts, if we get actual complaints. Farsi or
+ * other Celtic/Gaelic layouts would be candidates.
*/
switch (layoutid) {
-
- /*
- * Icelandic and Faroese (planned). These layouts are sold by Apple
- * Iceland for legacy applications.
- */
-
- case 1800: case 1821:
- return kTextEncodingMacIcelandic;
-
- /*
- * Irish and Welsh. These layouts are mentioned in <Script.h>.
- *
- * FIXME: This may have to be kTextEncodingMacGaelic instead, but I
- * can't locate layouts of this type for testing.
- */
-
- case 581: case 779:
- return kTextEncodingMacCeltic;
+ /*
+ * Icelandic and Faroese (planned). These layouts are sold by Apple
+ * Iceland for legacy applications.
+ */
+
+ case 1800: case 1821:
+ return kTextEncodingMacIcelandic;
+
+ /*
+ * Irish and Welsh. These layouts are mentioned in <Script.h>.
+ *
+ * FIXME: This may have to be kTextEncodingMacGaelic instead, but I
+ * can't locate layouts of this type for testing.
+ */
+
+ case 581: case 779:
+ return kTextEncodingMacCeltic;
}
-
+
/*
- * The valid script codes are also the valid default encoding codes, so
- * if nothing else helps, fall back on those.
+ * The valid script codes are also the valid default encoding codes, so if
+ * nothing else helps, fall back on those.
*/
return script;
}
-
/*
*----------------------------------------------------------------------
*
* KeycodeToUnicodeViaUnicodeResource --
*
- * Given MacOS key event data this function generates the Unicode
- * characters. It does this using a 'uchr' and the UCKeyTranslate
- * API.
+ * Given MacOS key event data this function generates the Unicode
+ * characters. It does this using a 'uchr' and the UCKeyTranslate API.
*
- * The parameter deadKeyStatePtr can be NULL, if no deadkey handling
- * is needed.
+ * The parameter deadKeyStatePtr can be NULL, if no deadkey handling is
+ * needed.
*
- * Tested and known to work with US, Hebrew, Greek and Russian layouts
- * as well as "Unicode Hex Input".
+ * Tested and known to work with US, Hebrew, Greek and Russian layouts as
+ * well as "Unicode Hex Input".
*
* Results:
- * The number of characters generated if any, 0 if we are waiting for
- * another byte of a dead-key sequence. Fills in the uniChars array
- * with a Unicode string.
+ * The number of characters generated if any, 0 if we are waiting for
+ * another byte of a dead-key sequence. Fills in the uniChars array with
+ * a Unicode string.
*
* Side Effects:
- * None
+ * None
*
*----------------------------------------------------------------------
*/
static int
KeycodeToUnicodeViaUnicodeResource(
- UniChar * uniChars, int maxChars,
- Ptr uchr,
- EventKind eKind,
- UInt32 keycode, UInt32 modifiers,
- UInt32 * deadKeyStatePtr)
+ UniChar *uniChars,
+ int maxChars,
+ Ptr uchr,
+ EventKind eKind,
+ UInt32 keycode,
+ UInt32 modifiers,
+ UInt32 *deadKeyStatePtr)
{
int action;
unsigned long keyboardType;
OptionBits options = 0;
UInt32 dummy_state;
- UniCharCount actuallength;
+ UniCharCount actuallength;
OSStatus status;
keycode &= 0xFF;
@@ -902,260 +844,242 @@ KeycodeToUnicodeViaUnicodeResource(
keyboardType = LMGetKbdType();
if (NULL==deadKeyStatePtr) {
- options = kUCKeyTranslateNoDeadKeysMask;
- dummy_state = 0;
- deadKeyStatePtr = &dummy_state;
+ options = kUCKeyTranslateNoDeadKeysMask;
+ dummy_state = 0;
+ deadKeyStatePtr = &dummy_state;
}
- switch(eKind) {
- case kEventRawKeyDown:
- action = kUCKeyActionDown;
- break;
- case kEventRawKeyUp:
- action = kUCKeyActionUp;
- break;
- case kEventRawKeyRepeat:
- action = kUCKeyActionAutoKey;
- break;
- default:
-#ifdef TK_MAC_DEBUG
- fprintf (stderr,
- "KeycodeToUnicodeViaUnicodeResource(): "
- "Invalid parameter eKind %d\n",
- (int) eKind);
-#endif
- return 0;
+ switch(eKind) {
+ case kEventRawKeyDown:
+ action = kUCKeyActionDown;
+ break;
+ case kEventRawKeyUp:
+ action = kUCKeyActionUp;
+ break;
+ case kEventRawKeyRepeat:
+ action = kUCKeyActionAutoKey;
+ break;
+ default:
+ LOG_MSG("KeycodeToUnicodeViaUnicodeResource(): "
+ "Invalid parameter eKind %d", (int) eKind);
+ return 0;
}
- status = UCKeyTranslate(
- (const UCKeyboardLayout *) uchr,
- keycode, action, modifiers, keyboardType,
- options, deadKeyStatePtr,
- maxChars, &actuallength, uniChars);
+ status = UCKeyTranslate((const UCKeyboardLayout *) uchr, keycode, action,
+ modifiers, keyboardType, options, deadKeyStatePtr, maxChars,
+ &actuallength, uniChars);
if ((0 == actuallength) && (0 != *deadKeyStatePtr)) {
- /*
- * More data later
- */
-
- return 0;
+ /*
+ * More data later
+ */
+
+ return 0;
}
-
+
/*
* some IMEs leave residue :-(
*/
-
- *deadKeyStatePtr = 0;
+
+ *deadKeyStatePtr = 0;
if (noErr != status) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"UCKeyTranslate failed: %d", (int) status);
-#endif
- actuallength = 0;
+ LOG_MSG("UCKeyTranslate failed: %d", (int) status);
+ actuallength = 0;
}
return actuallength;
}
-
/*
*----------------------------------------------------------------------
*
* KeycodeToUnicodeViaKCHRResource --
*
- * Given MacOS key event data this function generates the Unicode
- * characters. It does this using a 'KCHR' and the KeyTranslate API.
+ * Given MacOS key event data this function generates the Unicode
+ * characters. It does this using a 'KCHR' and the KeyTranslate API.
*
- * The parameter deadKeyStatePtr can be NULL, if no deadkey handling
- * is needed.
+ * The parameter deadKeyStatePtr can be NULL, if no deadkey handling is
+ * needed.
*
* Results:
- * The number of characters generated if any, 0 if we are waiting for
- * another byte of a dead-key sequence. Fills in the uniChars array
- * with a Unicode string.
+ * The number of characters generated if any, 0 if we are waiting for
+ * another byte of a dead-key sequence. Fills in the uniChars array with
+ * a Unicode string.
*
* Side Effects:
- * None
+ * None
*
*----------------------------------------------------------------------
*/
static int
KeycodeToUnicodeViaKCHRResource(
- UniChar * uniChars, int maxChars,
- Ptr kchr, TextEncoding encoding,
- EventKind eKind,
- UInt32 keycode, UInt32 modifiers,
- UInt32 * deadKeyStatePtr)
+ UniChar *uniChars,
+ int maxChars,
+ Ptr kchr,
+ TextEncoding encoding,
+ EventKind eKind,
+ UInt32 keycode,
+ UInt32 modifiers,
+ UInt32 *deadKeyStatePtr)
{
UInt32 result;
char macBuff[3];
- char * macStr;
+ char *macStr;
int macStrLen;
UInt32 dummy_state = 0;
-
if (NULL == deadKeyStatePtr) {
- deadKeyStatePtr = &dummy_state;
+ deadKeyStatePtr = &dummy_state;
}
keycode |= modifiers;
result = KeyTranslate(kchr, keycode, deadKeyStatePtr);
if ((0 == result) && (0 != dummy_state)) {
- /*
- * 'dummy_state' gets only filled if the caller did not want deadkey
- * processing (deadKeyStatePtr was NULL originally), but we still
- * have a deadkey. We just push the keycode for the space bar to get
- * the real key value.
- */
-
- result = KeyTranslate(kchr, 0x31, deadKeyStatePtr);
- *deadKeyStatePtr = 0;
+ /*
+ * 'dummy_state' gets only filled if the caller did not want deadkey
+ * processing (deadKeyStatePtr was NULL originally), but we still
+ * have a deadkey. We just push the keycode for the space bar to get
+ * the real key value.
+ */
+
+ result = KeyTranslate(kchr, 0x31, deadKeyStatePtr);
+ *deadKeyStatePtr = 0;
}
if ((0 == result) && (0 != *deadKeyStatePtr)) {
- /*
- * More data later
- */
-
- return 0;
+ /*
+ * More data later
+ */
+
+ return 0;
}
macBuff[0] = (char) (result >> 16);
- macBuff[1] = (char) result;
+ macBuff[1] = (char) result;
macBuff[2] = 0;
if (0 != macBuff[0]) {
- /*
- * If the first byte is valid, the second is too
- */
-
- macStr = macBuff;
- macStrLen = 2;
+ /*
+ * If the first byte is valid, the second is too
+ */
+
+ macStr = macBuff;
+ macStrLen = 2;
} else if (0 != macBuff[1]) {
- /*
- * Only the second is valid
- */
-
- macStr = macBuff+1;
- macStrLen = 1;
+ /*
+ * Only the second is valid
+ */
+
+ macStr = macBuff+1;
+ macStrLen = 1;
} else {
- /*
- * No valid bytes at all -- shouldn't happen
- */
-
- macStr = NULL;
- macStrLen = 0;
+ /*
+ * No valid bytes at all -- shouldn't happen
+ */
+
+ macStr = NULL;
+ macStrLen = 0;
}
if (macStrLen <= 0) {
- return 0;
+ return 0;
} else {
+ /*
+ * Use the CFString conversion routines. This is the easiest and most
+ * compatible way to get from an 8-bit string and a MacOS script code
+ * to a Unicode string.
+ *
+ * FIXME: The system ships with an Irish 'KCHR' but without the
+ * corresponding macCeltic encoding, which triggers the error below.
+ * Tcl doesn't have the macCeltic encoding either right now, so until
+ * we get that, we can just as well stick to this code. The right fix
+ * would be to use the Tcl encodings and add macCeltic and probably
+ * others there. Suitable Unicode data files for the missing encodings
+ * are available from www.evertype.com.
+ */
+
+ CFStringRef cfString;
+ int uniStrLen;
+
+ cfString = CFStringCreateWithCStringNoCopy(NULL, macStr, encoding,
+ kCFAllocatorNull);
+ if (cfString == NULL) {
+ LOG_MSG("CFString: Can't convert with encoding %d",
+ (int) encoding);
+ return 0;
+ }
- /*
- * Use the CFString conversion routines. This is the easiest and
- * most compatible way to get from an 8-bit string and a MacOS script
- * code to a Unicode string.
- *
- * FIXME: The system ships with an Irish 'KCHR' but without the
- * corresponding macCeltic encoding, which triggers the error below.
- * Tcl doesn't have the macCeltic encoding either right now, so until
- * we get that, we can just as well stick to this code. The right
- * fix would be to use the Tcl encodings and add macCeltic and
- * probably others there. Suitable Unicode data files for the
- * missing encodings are available from www.evertype.com.
- */
-
- CFStringRef cfString;
- int uniStrLen;
-
- cfString = CFStringCreateWithCStringNoCopy(
- NULL, macStr, encoding, kCFAllocatorNull);
- if (cfString == NULL) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "CFString: Can't convert with encoding %d\n",
- (int) encoding);
-#endif
- return 0;
- }
-
- uniStrLen = CFStringGetLength(cfString);
- if (uniStrLen > maxChars) {
- uniStrLen = maxChars;
- }
- CFStringGetCharacters(cfString, CFRangeMake(0,uniStrLen), uniChars);
- CFRelease(cfString);
+ uniStrLen = CFStringGetLength(cfString);
+ if (uniStrLen > maxChars) {
+ uniStrLen = maxChars;
+ }
+ CFStringGetCharacters(cfString, CFRangeMake(0,uniStrLen), uniChars);
+ CFRelease(cfString);
- return uniStrLen;
+ return uniStrLen;
}
}
-
/*
*----------------------------------------------------------------------
*
* TkMacOSXKeycodeToUnicode --
*
- * Given MacOS key event data this function generates the Unicode
- * characters. It does this using OS resources and APIs.
+ * Given MacOS key event data this function generates the Unicode
+ * characters. It does this using OS resources and APIs.
*
- * The parameter deadKeyStatePtr can be NULL, if no deadkey handling
- * is needed.
+ * The parameter deadKeyStatePtr can be NULL, if no deadkey handling is
+ * needed.
*
- * This function is called from XKeycodeToKeysym() in
- * tkMacOSKeyboard.c.
+ * This function is called from XKeycodeToKeysym() in tkMacOSKeyboard.c.
*
* Results:
- * The number of characters generated if any, 0 if we are waiting for
- * another byte of a dead-key sequence. Fills in the uniChars array
- * with a Unicode string.
+ * The number of characters generated if any, 0 if we are waiting for
+ * another byte of a dead-key sequence. Fills in the uniChars array with
+ * a Unicode string.
*
* Side Effects:
- * None
+ * None
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE int
TkMacOSXKeycodeToUnicode(
- UniChar * uniChars, int maxChars,
- EventKind eKind,
- UInt32 keycode, UInt32 modifiers,
- UInt32 * deadKeyStatePtr)
+ UniChar *uniChars,
+ int maxChars,
+ EventKind eKind,
+ UInt32 keycode,
+ UInt32 modifiers,
+ UInt32 *deadKeyStatePtr)
{
Ptr resource = NULL;
TextEncoding encoding;
- int len;
-
- if (GetKeyboardLayout(&resource,&encoding)) {
- len = KeycodeToUnicodeViaUnicodeResource(
- uniChars, maxChars, resource, eKind,
- keycode, modifiers, deadKeyStatePtr);
+ if (GetKeyboardLayout(&resource, &encoding)) {
+ return KeycodeToUnicodeViaUnicodeResource(uniChars, maxChars,
+ resource, eKind, keycode, modifiers, deadKeyStatePtr);
} else {
- len = KeycodeToUnicodeViaKCHRResource(
- uniChars, maxChars, resource, encoding, eKind,
- keycode, modifiers, deadKeyStatePtr);
+ return KeycodeToUnicodeViaKCHRResource(uniChars, maxChars, resource,
+ encoding, eKind, keycode, modifiers, deadKeyStatePtr);
}
-
- return len;
}
-
-
/*
*----------------------------------------------------------------------
*
* XGrabKeyboard --
*
- * Simulates a keyboard grab by setting the focus.
+ * Simulates a keyboard grab by setting the focus.
*
* Results:
- * Always returns GrabSuccess.
+ * Always returns GrabSuccess.
*
* Side effects:
- * Sets the keyboard focus to the specified window.
+ * Sets the keyboard focus to the specified window.
*
*----------------------------------------------------------------------
*/
@@ -1178,13 +1102,13 @@ XGrabKeyboard(
*
* XUngrabKeyboard --
*
- * Releases the simulated keyboard grab.
+ * Releases the simulated keyboard grab.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Sets the keyboard focus back to the value before the grab.
+ * Sets the keyboard focus back to the value before the grab.
*
*----------------------------------------------------------------------
*/
@@ -1203,13 +1127,14 @@ XUngrabKeyboard(
* TkMacOSXGetCapture --
*
* Results:
- * Returns the current grab window
+ * Returns the current grab window
* Side effects:
- * None.
+ * None.
*
*/
+
Tk_Window
-TkMacOSXGetCapture()
+TkMacOSXGetCapture(void)
{
return gGrabWinPtr;
}
@@ -1219,26 +1144,25 @@ TkMacOSXGetCapture()
*
* TkpSetCapture --
*
- * This function captures the mouse so that all future events
- * will be reported to this window, even if the mouse is outside
- * the window. If the specified window is NULL, then the mouse
- * is released.
+ * This function captures the mouse so that all future events will be
+ * reported to this window, even if the mouse is outside the window. If
+ * the specified window is NULL, then the mouse is released.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Sets the capture flag and captures the mouse.
+ * Sets the capture flag and captures the mouse.
*
*----------------------------------------------------------------------
*/
void
TkpSetCapture(
- TkWindow *winPtr) /* Capture window, or NULL. */
+ TkWindow *winPtr) /* Capture window, or NULL. */
{
while ((winPtr != NULL) && !Tk_IsTopLevel(winPtr)) {
- winPtr = winPtr->parentPtr;
+ winPtr = winPtr->parentPtr;
}
gGrabWinPtr = (Tk_Window) winPtr;
}
@@ -1248,25 +1172,25 @@ TkpSetCapture(
*
* Tk_SetCaretPos --
*
- * This enables correct placement of the XIM caret. This is called
- * by widgets to indicate their cursor placement, and the caret
- * location is used by TkpGetString to place the XIM caret.
+ * This enables correct placement of the XIM caret. This is called by
+ * widgets to indicate their cursor placement, and the caret location is
+ * used by TkpGetString to place the XIM caret.
*
* Results:
- * None
+ * None
*
* Side effects:
- * None
+ * None
*
*----------------------------------------------------------------------
*/
void
-Tk_SetCaretPos(tkwin, x, y, height)
- Tk_Window tkwin;
- int x;
- int y;
- int height;
+Tk_SetCaretPos(
+ Tk_Window tkwin,
+ int x,
+ int y,
+ int height)
{
}
@@ -1275,23 +1199,31 @@ Tk_SetCaretPos(tkwin, x, y, height)
*
* TkMacOSXInitKeyboard --
*
- * This procedure initializes the keyboard layout.
+ * This procedure initializes the keyboard layout.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
MODULE_SCOPE void
-TkMacOSXInitKeyboard (
- Tcl_Interp *interp)
+TkMacOSXInitKeyboard(
+ Tcl_Interp *interp)
{
Ptr resource;
TextEncoding encoding;
-
- GetKeyboardLayout(&resource,&encoding);
+
+ GetKeyboardLayout(&resource, &encoding);
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXMenu.c b/macosx/tkMacOSXMenu.c
index 6a6d8f3..f4d1acf 100644
--- a/macosx/tkMacOSXMenu.c
+++ b/macosx/tkMacOSXMenu.c
@@ -1,4 +1,4 @@
-/*
+/*
* tkMacOSXMenu.c --
*
* This module implements the Mac-platform specific features of menus.
@@ -7,10 +7,10 @@
* Copyright 2001, Apple Computer, Inc.
* Copyright (c) 2005-2006 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.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXMenu.c,v 1.34 2006/10/31 22:26:06 das Exp $
+ * RCS: @(#) $Id: tkMacOSXMenu.c,v 1.35 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -36,10 +36,9 @@
typedef struct MacMenu {
MenuRef menuHdl; /* The Menu Manager data structure. */
Rect menuRect; /* The rectangle as calculated in the
- * MDEF. This is used to figure ou the
- * clipping rgn before we push
- * the <<MenuSelect>> virtual binding
- * through. */
+ * MDEF. This is used to figure out the
+ * clipping rgn before we push the
+ * <<MenuSelect>> virtual binding through. */
} MacMenu;
typedef struct MenuEntryUserData {
@@ -105,15 +104,14 @@ typedef struct MenuEntryUserData {
*/
typedef struct EntryGeometry {
- int accelTextStart; /* Offset into the accel string where
- * the text starts. Everything before
- * this is modifier key descriptions.
- */
+ int accelTextStart; /* Offset into the accel string where the text
+ * starts. Everything before this is modifier
+ * key descriptions. */
int modifierWidth; /* Width of modifier symbols. */
- int accelTextWidth; /* Width of the text after the modifier
+ int accelTextWidth; /* Width of the text after the modifier
* keys. */
- int nonAccelMargin; /* The width of the margin for entries
- * without accelerators. */
+ int nonAccelMargin; /* The width of the margin for entries without
+ * accelerators. */
} EntryGeometry;
/*
@@ -146,15 +144,14 @@ typedef struct TopLevelMenubarList {
#define MENU_HELP_MENU MENU_PLATFORM_FLAG2
#define MENU_RECONFIGURE_PENDING MENU_PLATFORM_FLAG3
-#define CASCADE_CMD (0x1b)
- /* The special command char for cascade
- * menus. */
+#define CASCADE_CMD (0x1b) /* The special command char for cascade
+ * menus. */
#define MENUBAR_REDRAW_PENDING 1
#define SCREEN_MARGIN 5
static int gNoTkMenus = 0; /* This is used by Tk_MacOSXTurnOffMenus as the
- * flag that Tk is not to draw any menus. */
-
+ * flag that Tk is not to draw any menus. */
+
RgnHandle tkMenuCascadeRgn = NULL;
/* The region to clip drawing to when the
* MDEF is up. */
@@ -183,7 +180,7 @@ static char *currentMenuBarName;
static Tk_Window currentMenuBarOwner;
/* Which window owns the current menu bar. */
static char elipsisString[TCL_UTF_MAX + 1];
- /* The UTF representation of the elipsis (...)
+ /* The UTF representation of the elipsis (...)
* character. */
static int inPostMenu; /* We cannot be re-entrant like X
* windows. */
@@ -197,7 +194,7 @@ static MacDrawable macMDEFDrawable;
static int MDEFScrollFlag = 0; /* Used so that popups don't scroll too soon. */
static int menuBarFlags; /* Used for whether the menu bar needs
* redrawing or not. */
-
+
static struct TearoffSelect {
TkMenu *menuPtr; /* The menu that is torn off */
Point point; /* The point to place the new menu */
@@ -206,8 +203,8 @@ static struct TearoffSelect {
} tearoffStruct;
struct MenuCommandHandlerData { /* This is the ClientData we pass to */
- TkMenu *menuPtr; /* Tcl_DoWhenIdle to move handling */
- int index; /* menu commands to the event loop. */
+ TkMenu *menuPtr; /* Tcl_DoWhenIdle to move handling */
+ int index; /* menu commands to the event loop. */
};
static RgnHandle totalMenuRgn = NULL;
@@ -218,7 +215,7 @@ static RgnHandle utilRgn = NULL;/* Used when creating the region that is to
static TopLevelMenubarList *windowListPtr;
/* A list of windows that have menubars set. */
-static MenuItemDrawingUPP tkThemeMenuItemDrawingUPP;
+static MenuItemDrawingUPP tkThemeMenuItemDrawingUPP;
/* Points to the UPP for theme Item drawing. */
static Tcl_Obj *useMDEFVar;
@@ -228,125 +225,94 @@ MenuRef tkCurrentAppleMenu = NULL;
* Forward declarations for procedures defined later in this file:
*/
-MODULE_SCOPE int TkMacOSXGetNewMenuID _ANSI_ARGS_((Tcl_Interp *interp,
- TkMenu *menuInstPtr,
- int cascade,
- short *menuIDPtr));
-MODULE_SCOPE void TkMacOSXFreeMenuID _ANSI_ARGS_((short menuID));
-
-static void CompleteIdlers _ANSI_ARGS_((TkMenu *menuPtr));
-static void DrawMenuBarWhenIdle _ANSI_ARGS_((
- ClientData clientData));
-static void DrawMenuBackground _ANSI_ARGS_((
- Rect *menuRectPtr, Drawable d, ThemeMenuType type));
-static void DrawMenuEntryAccelerator _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Drawable d, GC gc, Tk_Font tkfont,
- CONST Tk_FontMetrics *fmPtr,
- Tk_3DBorder activeBorder, int x, int y,
- int width, int height, int drawArrow));
-static void DrawMenuEntryBackground _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Drawable d, Tk_3DBorder activeBorder,
- Tk_3DBorder bgBorder, int x, int y,
- int width, int heigth));
-static void DrawMenuEntryIndicator _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Drawable d, GC gc, GC indicatorGC,
- Tk_Font tkfont,
+MODULE_SCOPE int TkMacOSXGetNewMenuID(Tcl_Interp *interp,
+ TkMenu *menuInstPtr, int cascade,
+ short *menuIDPtr);
+MODULE_SCOPE void TkMacOSXFreeMenuID(short menuID);
+
+static void CompleteIdlers(TkMenu *menuPtr);
+static void DrawMenuBarWhenIdle(ClientData clientData);
+static void DrawMenuBackground(Rect *menuRectPtr, Drawable d,
+ ThemeMenuType type);
+static void DrawMenuEntryAccelerator(TkMenu *menuPtr,
+ TkMenuEntry *mePtr, Drawable d, GC gc,
+ Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
+ Tk_3DBorder activeBorder, int x, int y, int width,
+ int height, int drawArrow);
+static void DrawMenuEntryBackground(TkMenu *menuPtr,
+ TkMenuEntry *mePtr, Drawable d,
+ Tk_3DBorder activeBorder, Tk_3DBorder bgBorder,
+ int x, int y, int width, int heigth);
+static void DrawMenuEntryIndicator(TkMenu *menuPtr,
+ TkMenuEntry *mePtr, Drawable d, GC gc,
+ GC indicatorGC, Tk_Font tkfont,
+ CONST Tk_FontMetrics *fmPtr, int x, int y,
+ int width, int height);
+static void DrawMenuEntryLabel(TkMenu *menuPtr,TkMenuEntry *mePtr,
+ Drawable d, GC gc, Tk_Font tkfont,
CONST Tk_FontMetrics *fmPtr, int x, int y,
- int width, int height));
-static void DrawMenuEntryLabel _ANSI_ARGS_((
- TkMenu * menuPtr, TkMenuEntry *mePtr, Drawable d,
- GC gc, Tk_Font tkfont,
+ int width, int height);
+static void DrawMenuSeparator(TkMenu *menuPtr, TkMenuEntry *mePtr,
+ Drawable d, GC gc, Tk_Font tkfont,
CONST Tk_FontMetrics *fmPtr, int x, int y,
- int width, int height));
-static void DrawMenuSeparator _ANSI_ARGS_((TkMenu *menuPtr,
- TkMenuEntry *mePtr, Drawable d, GC gc,
- Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int x, int y, int width, int height));
-static void DrawTearoffEntry _ANSI_ARGS_((TkMenu *menuPtr,
- TkMenuEntry *mePtr, Drawable d, GC gc,
- Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int x, int y, int width, int height));
-static void EventuallyInvokeMenu (ClientData data);
-static void GetEntryText _ANSI_ARGS_((TkMenuEntry *mePtr,
- Tcl_DString *dStringPtr));
-static void GetMenuAccelGeometry _ANSI_ARGS_((TkMenu *menuPtr,
+ int width, int height);
+static void DrawTearoffEntry(TkMenu *menuPtr, TkMenuEntry *mePtr,
+ Drawable d, GC gc, Tk_Font tkfont,
+ CONST Tk_FontMetrics *fmPtr, int x, int y,
+ int width, int height);
+static void EventuallyInvokeMenu(ClientData data);
+static void GetEntryText(TkMenuEntry *mePtr,
+ Tcl_DString *dStringPtr);
+static void GetMenuAccelGeometry(TkMenu *menuPtr,
TkMenuEntry *mePtr, Tk_Font tkfont,
CONST Tk_FontMetrics *fmPtr, int *modWidthPtr,
- int *textWidthPtr, int *heightPtr));
-static void GetMenuLabelGeometry _ANSI_ARGS_((TkMenuEntry *mePtr,
+ int *textWidthPtr, int *heightPtr);
+static void GetMenuLabelGeometry(TkMenuEntry *mePtr,
Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int *widthPtr, int *heightPtr));
-static void GetMenuIndicatorGeometry _ANSI_ARGS_((
- TkMenu *menuPtr, TkMenuEntry *mePtr,
- Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int *widthPtr, int *heightPtr));
-static void GetMenuSeparatorGeometry _ANSI_ARGS_((
+ int *widthPtr, int *heightPtr);
+static void GetMenuIndicatorGeometry(TkMenu *menuPtr,
+ TkMenuEntry *mePtr, Tk_Font tkfont,
+ CONST Tk_FontMetrics *fmPtr,
+ int *widthPtr, int *heightPtr);
+static void GetMenuSeparatorGeometry(
TkMenu *menuPtr, TkMenuEntry *mePtr,
Tk_Font tkfont, CONST Tk_FontMetrics *fmPtr,
- int *widthPtr, int *heightPtr));
-static void GetTearoffEntryGeometry _ANSI_ARGS_((TkMenu *menuPtr,
+ int *widthPtr, int *heightPtr);
+static void GetTearoffEntryGeometry(TkMenu *menuPtr,
TkMenuEntry *mePtr, Tk_Font tkfont,
CONST Tk_FontMetrics *fmPtr, int *widthPtr,
- int *heightPtr));
-static char FindMarkCharacter _ANSI_ARGS_((TkMenuEntry *mePtr));
-static void InvalidateMDEFRgns _ANSI_ARGS_((void));
-
-static void MenuDefProc _ANSI_ARGS_((short message,
- MenuHandle menu, Rect *menuRectPtr,
- Point hitPt, short *whichItem ));
-static void HandleMenuHiliteMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr);
-static void HandleMenuDrawMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr);
-static void HandleMenuFindItemsMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr);
-static void HandleMenuPopUpMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr);
-static void HandleMenuCalcItemMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr);
-
-static void MenuSelectEvent _ANSI_ARGS_((TkMenu *menuPtr));
-static void ReconfigureIndividualMenu _ANSI_ARGS_((
- TkMenu *menuPtr, MenuHandle macMenuHdl,
- int base));
-static void ReconfigureMacintoshMenu _ANSI_ARGS_ ((
- ClientData clientData));
-static void RecursivelyClearActiveMenu _ANSI_ARGS_((
- TkMenu *menuPtr));
-static void RecursivelyDeleteMenu _ANSI_ARGS_((
- TkMenu *menuPtr));
-static void RecursivelyInsertMenu _ANSI_ARGS_((
- TkMenu *menuPtr));
-static void SetDefaultMenubar _ANSI_ARGS_((void));
-static int SetMenuCascade _ANSI_ARGS_((TkMenu *menuPtr));
-static void mySetMenuTitle _ANSI_ARGS_((MenuHandle menuHdl,
- Tcl_Obj *titlePtr));
-static void AppearanceEntryDrawWrapper _ANSI_ARGS_((TkMenuEntry *mePtr,
- Rect * menuRectPtr, MenuTrackingData *mtdPtr,
+ int *heightPtr);
+static char FindMarkCharacter(TkMenuEntry *mePtr);
+static void InvalidateMDEFRgns(void);
+static void MenuDefProc(short message, MenuHandle menu,
+ Rect *menuRectPtr, Point hitPt, short *whichItem);
+static void HandleMenuHiliteMsg(MenuRef menu, Rect *menuRectPtr,
+ Point hitPt, SInt16 *whichItem, TkMenu *menuPtr);
+static void HandleMenuDrawMsg(MenuRef menu, Rect *menuRectPtr,
+ Point hitPt, SInt16 *whichItem, TkMenu *menuPtr);
+static void HandleMenuFindItemsMsg(MenuRef menu, Rect *menuRectPtr,
+ Point hitPt, SInt16 *whichItem, TkMenu *menuPtr);
+static void HandleMenuPopUpMsg(MenuRef menu, Rect *menuRectPtr,
+ Point hitPt, SInt16 *whichItem, TkMenu *menuPtr);
+static void HandleMenuCalcItemMsg(MenuRef menu, Rect *menuRectPtr,
+ Point hitPt, SInt16 *whichItem, TkMenu *menuPtr);
+static void MenuSelectEvent(TkMenu *menuPtr);
+static void ReconfigureIndividualMenu(TkMenu *menuPtr,
+ MenuHandle macMenuHdl, int base);
+static void ReconfigureMacintoshMenu(ClientData clientData);
+static void RecursivelyClearActiveMenu(TkMenu *menuPtr);
+static void RecursivelyDeleteMenu(TkMenu *menuPtr);
+static void RecursivelyInsertMenu(TkMenu *menuPtr);
+static void SetDefaultMenubar(void);
+static int SetMenuCascade(TkMenu *menuPtr);
+static void mySetMenuTitle(MenuHandle menuHdl, Tcl_Obj *titlePtr);
+static void AppearanceEntryDrawWrapper(TkMenuEntry *mePtr,
+ Rect *menuRectPtr, MenuTrackingData *mtdPtr,
Drawable d, Tk_FontMetrics *fmPtr, Tk_Font tkfont,
- int x, int y, int width, int height));
-static pascal void ThemeMenuItemDrawingProc _ANSI_ARGS_ ((const Rect *inBounds,
- SInt16 inDepth, Boolean inIsColorDevice,
- SInt32 inUserData));
-
+ int x, int y, int width, int height);
+static pascal void ThemeMenuItemDrawingProc(const Rect *inBounds,
+ SInt16 inDepth, Boolean inIsColorDevice,
+ SInt32 inUserData);
/*
*----------------------------------------------------------------------
@@ -375,16 +341,15 @@ TkMacOSXUseMenuID(
Tcl_HashEntry *commandEntryPtr;
int newEntry;
int iMacID = macID; /* Do this to remove compiler warning */
-
+
TkMenuInit();
commandEntryPtr = Tcl_CreateHashEntry(&commandTable, (char *) iMacID,
- &newEntry);
- if (newEntry == 1) {
- Tcl_SetHashValue(commandEntryPtr, NULL);
- return TCL_OK;
- } else {
- return TCL_ERROR;
+ &newEntry);
+ if (!newEntry) {
+ return TCL_ERROR;
}
+ Tcl_SetHashValue(commandEntryPtr, NULL);
+ return TCL_OK;
}
/*
@@ -392,27 +357,27 @@ TkMacOSXUseMenuID(
*
* TkMacOSXGetNewMenuID --
*
- * Allocates a new menu id and marks it in use. Each menu on the
- * mac must be designated by a unique id, which is a short. In
- * addition, some ids are reserved by the system. Since Tk uses
- * mostly dynamic menus, we must allocate and free these ids on
- * the fly. We use the id as a key into a hash table; if there
- * is no hash entry, we know that we can use the id.
+ * Allocates a new menu id and marks it in use. Each menu on the mac must
+ * be designated by a unique id, which is a short. In addition, some ids
+ * are reserved by the system. Since Tk uses mostly dynamic menus, we
+ * must allocate and free these ids on the fly. We use the id as a key
+ * into a hash table; if there is no hash entry, we know that we can use
+ * the id.
*
- * Carbon allows a much larger number of menus than the old APIs.
- * I believe this is 32768, but am not sure. This code just uses
- * 2000 as the upper limit. Unfortunately tk leaks menus when
- * cloning, under some circumstances (see bug on sourceforge).
+ * Carbon allows a much larger number of menus than the old APIs. I
+ * believe this is 32768, but am not sure. This code just uses 2000 as
+ * the upper limit. Unfortunately Tk leaks menus when cloning, under some
+ * circumstances (see bug on sourceforge).
*
* Results:
- * Returns TCL_OK if succesful; TCL_ERROR if there are no more
- * ids of the appropriate type to allocate. menuIDPtr contains
- * the new id if succesful.
+ * Returns TCL_OK if succesful; TCL_ERROR if there are no more ids of the
+ * appropriate type to allocate. menuIDPtr contains the new id if
+ * succesful.
*
* Side effects:
- * An entry is created for the menu in the command hash table,
- * and the hash entry is stored in the appropriate field in the
- * menu data structure.
+ * An entry is created for the menu in the command hash table, and the
+ * hash entry is stored in the appropriate field in the menu data
+ * structure.
*
*----------------------------------------------------------------------
*/
@@ -421,7 +386,7 @@ int
Tcl_Interp *interp, /* Used for error reporting */
TkMenu *menuPtr, /* The menu we are working with */
int cascade, /* 0 if we are working with a normal menu;
- 1 if we are working with a cascade */
+ * 1 if we are working with a cascade */
short *menuIDPtr) /* The resulting id */
{
int found = 0;
@@ -430,25 +395,27 @@ int
short returnID = *menuIDPtr;
/*
- * The following code relies on shorts and unsigned chars wrapping
- * when the highest value is incremented. Also, the values between
- * 236 and 255 inclusive are reserved for DA's by the Mac OS.
+ * The following code relies on shorts and unsigned chars wrapping when
+ * the highest value is incremented. Also, the values between 236 and 255
+ * inclusive are reserved for DA's by the Mac OS.
*/
-
+
if (!cascade) {
short curID = lastMenuID + 1;
- if (curID == 236) {
+
+ if (curID == 236) {
curID = 256;
}
while (curID != lastMenuID) {
- int iCurID = curID;
+ int iCurID = curID;
+
commandEntryPtr = Tcl_CreateHashEntry(&commandTable,
(char *) iCurID, &newEntry);
if (newEntry == 1) {
- found = 1;
- lastMenuID = returnID = curID;
- break;
+ found = 1;
+ lastMenuID = returnID = curID;
+ break;
}
curID++;
if (curID == 236) {
@@ -456,19 +423,19 @@ int
}
}
} else {
-
/*
- * Cascade ids must be between 0 and 235 only, so they must be
- * dealt with separately.
+ * Cascade ids must be between 0 and 235 only, so they must be dealt
+ * with separately.
*/
-
+
short curID = lastCascadeID + 1;
- if (curID == 2000) {
+ if (curID == 2000) {
curID = 0;
}
-
+
while (curID != lastCascadeID) {
- int iCurID = curID;
+ int iCurID = curID;
+
commandEntryPtr = Tcl_CreateHashEntry(&commandTable,
(char *) iCurID, &newEntry);
if (newEntry == 1) {
@@ -483,16 +450,15 @@ int
}
}
- if (found) {
- Tcl_SetHashValue(commandEntryPtr, (char *) menuPtr);
- *menuIDPtr = returnID;
- return TCL_OK;
- } else {
+ if (!found) {
Tcl_ResetResult(interp);
- Tcl_AppendResult(interp, "No more menus can be allocated.",
- (char *) NULL);
+ Tcl_AppendResult(interp, "No more menus can be allocated.", NULL);
return TCL_ERROR;
}
+
+ Tcl_SetHashValue(commandEntryPtr, (char *) menuPtr);
+ *menuIDPtr = returnID;
+ return TCL_OK;
}
/*
@@ -517,7 +483,7 @@ TkMacOSXFreeMenuID(
{
Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(&commandTable,
(char *) ((int)menuID));
-
+
if (entryPtr != NULL) {
Tcl_DeleteHashEntry(entryPtr);
}
@@ -541,8 +507,8 @@ TkMacOSXFreeMenuID(
* Returns a standard TCL error.
*
* Side effects:
- * Allocates a Macintosh menu handle and puts in the platformData
- * field of the menuPtr.
+ * Allocates a Macintosh menu handle and puts in the platformData field
+ * of the menuPtr.
*
*----------------------------------------------------------------------
*/
@@ -560,49 +526,45 @@ TkpNewMenu(
int error = TCL_OK;
OSStatus err;
CFStringRef cfStr;
-
+
error = TkMacOSXGetNewMenuID(menuPtr->interp, menuPtr, 0, &menuID);
if (error != TCL_OK) {
return error;
}
err = CreateNewMenu(menuID, kMenuAttrDoNotUseUserCommandKeys, &macMenuHdl);
if (err != noErr) {
- Tcl_AppendResult(menuPtr->interp, "CreateNewMenu failed.",
- (char *) NULL);
- return TCL_ERROR;
+ Tcl_AppendResult(menuPtr->interp, "CreateNewMenu failed.", NULL);
+ return TCL_ERROR;
}
cfStr = CFStringCreateWithCString(NULL, Tk_PathName(menuPtr->tkwin),
- kCFStringEncodingUTF8);
+ kCFStringEncodingUTF8);
if (!cfStr) {
- Tcl_AppendResult(menuPtr->interp, "CFStringCreateWithCString failed.",
- (char *) NULL);
- return TCL_ERROR;
+ Tcl_AppendResult(menuPtr->interp, "CFStringCreateWithCString failed.",
+ NULL);
+ return TCL_ERROR;
}
err = SetMenuTitleWithCFString(macMenuHdl, cfStr);
CFRelease(cfStr);
if (err != noErr) {
- Tcl_AppendResult(menuPtr->interp, "SetMenuTitleWithCFString failed.",
- (char *) NULL);
- return TCL_ERROR;
+ Tcl_AppendResult(menuPtr->interp, "SetMenuTitleWithCFString failed.",
+ NULL);
+ return TCL_ERROR;
}
-
+
/*
- * Check whether we want to use the custom mdef or not. For now
- * the default is to use it unless the variable is explicitly
- * set to no.
+ * Check whether we want to use the custom mdef or not. For now the
+ * default is to use it unless the variable is explicitly set to no.
*/
-
- useMDEFObjPtr = Tcl_ObjGetVar2(menuPtr->interp, useMDEFVar, NULL, TCL_GLOBAL_ONLY);
- if (useMDEFObjPtr == NULL
- || Tcl_GetBooleanFromObj(NULL, useMDEFObjPtr, &useMDEF) == TCL_ERROR
- || useMDEF) {
- menuDefSpec.defType = kMenuDefProcPtr;
- menuDefSpec.u.defProc = MenuDefProc;
- if ((err = SetMenuDefinition(macMenuHdl, &menuDefSpec)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr, "SetMenuDefinition failed %d\n", (int) err);
-#endif
- }
+
+ useMDEFObjPtr = Tcl_ObjGetVar2(menuPtr->interp, useMDEFVar, NULL,
+ TCL_GLOBAL_ONLY);
+ if (useMDEFObjPtr == NULL ||
+ Tcl_GetBooleanFromObj(NULL, useMDEFObjPtr, &useMDEF) == TCL_ERROR
+ || useMDEF) {
+ menuDefSpec.defType = kMenuDefProcPtr;
+ menuDefSpec.u.defProc = MenuDefProc;
+ err = SetMenuDefinition(macMenuHdl, &menuDefSpec);
+ LOG_ON_ERROR(SetMenuDefinition);
}
menuPtr->platformData = (TkMenuPlatformData) ckalloc(sizeof(MacMenu));
((MacMenu *) menuPtr->platformData)->menuHdl = macMenuHdl;
@@ -611,7 +573,7 @@ TkpNewMenu(
if ((currentMenuBarInterp == menuPtr->interp)
&& (currentMenuBarName != NULL)) {
Tk_Window parentWin = Tk_Parent(menuPtr->tkwin);
-
+
if (strcmp(currentMenuBarName, Tk_PathName(parentWin)) == 0) {
if ((strcmp(Tk_PathName(menuPtr->tkwin)
+ strlen(Tk_PathName(parentWin)), ".apple") == 0)
@@ -621,10 +583,10 @@ TkpNewMenu(
Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
menuBarFlags |= MENUBAR_REDRAW_PENDING;
}
- }
+ }
}
}
-
+
menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
return TCL_OK;
@@ -658,12 +620,12 @@ TkpDestroyMenu(
}
if (GetMenuID(macMenuHdl) == currentHelpMenuID) {
MenuRef helpMenuHdl;
- MenuItemIndex helpIndex;
-
- if ((HMGetHelpMenu(&helpMenuHdl,&helpIndex) == noErr)
+ MenuItemIndex helpIndex;
+
+ if ((HMGetHelpMenu(&helpMenuHdl,&helpIndex) == noErr)
&& (helpMenuHdl != NULL)) {
int i, count = CountMenuItems(helpMenuHdl);
-
+
for (i = helpIndex; i <= count; i++) {
DeleteMenuItem(helpMenuHdl, helpIndex);
}
@@ -671,12 +633,12 @@ TkpDestroyMenu(
currentHelpMenuID = 0;
}
if (menuPtr->platformData != NULL) {
- MenuID menuID;
- menuID = GetMenuID(macMenuHdl);
- DeleteMenu(menuID);
- TkMacOSXFreeMenuID(menuID);
- DisposeMenu(macMenuHdl);
- ckfree((char *) menuPtr->platformData);
+ MenuID menuID = GetMenuID(macMenuHdl);
+
+ DeleteMenu(menuID);
+ TkMacOSXFreeMenuID(menuID);
+ DisposeMenu(macMenuHdl);
+ ckfree((char *) menuPtr->platformData);
menuPtr->platformData = NULL;
}
}
@@ -706,6 +668,7 @@ SetMenuCascade(
MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
MenuID newMenuID, menuID = GetMenuID(macMenuHdl);
int error = TCL_OK;
+
if (menuID >= 256) {
error = TkMacOSXGetNewMenuID(menuPtr->interp, menuPtr, 1, &newMenuID);
if (error == TCL_OK) {
@@ -734,13 +697,12 @@ SetMenuCascade(
void
TkpDestroyMenuEntry(
- TkMenuEntry *mePtr) /* The common structure for the menu
- * entry. */
+ TkMenuEntry *mePtr) /* The common structure for the menu entry. */
{
- TkMenu *menuPtr = mePtr->menuPtr;
-
+ TkMenu *menuPtr = mePtr->menuPtr;
+
ckfree((char *) mePtr->platformEntryData);
- if ((menuPtr->platformData != NULL)
+ if ((menuPtr->platformData != NULL)
&& !(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) {
menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
@@ -753,9 +715,9 @@ TkpDestroyMenuEntry(
* GetEntryText --
*
* Given a menu entry, gives back the text that should go in it.
- * Separators should be done by the caller, as they have to be
- * handled specially. This is primarily used to do a substitution
- * between "..." and the ellipsis character which looks nicer.
+ * Separators should be done by the caller, as they have to be handled
+ * specially. This is primarily used to do a substitution between "..."
+ * and the ellipsis character which looks nicer.
*
* Results:
* itemText points to the new text for the item.
@@ -769,8 +731,8 @@ TkpDestroyMenuEntry(
static void
GetEntryText(
TkMenuEntry *mePtr, /* A pointer to the menu entry. */
- Tcl_DString *dStringPtr) /* The DString to put the text into. This
- * will be initialized by this routine. */
+ Tcl_DString *dStringPtr) /* The DString to put the text into. This will
+ * be initialized by this routine. */
{
Tcl_DStringInit(dStringPtr);
if (mePtr->type == TEAROFF_ENTRY) {
@@ -813,12 +775,12 @@ GetEntryText(
*
* FindMarkCharacter --
*
- * Finds the Macintosh mark character based on the font of the
- * item. We calculate a good mark character based on the font
- * that this item is rendered in.
+ * Finds the Macintosh mark character based on the font of the item. We
+ * calculate a good mark character based on the font that this item is
+ * rendered in.
*
- * We try the following special mac characters. If none of them
- * are present, just use the check mark.
+ * We try the following special mac characters. If none of them are
+ * present, just use the check mark.
* '' - Check mark character (\022)
* 'Â¥' - Mac Bullet character (\245)
* '' - Filled diamond (\023)
@@ -846,7 +808,7 @@ FindMarkCharacter(
tkfont = Tk_GetFontFromObj(mePtr->menuPtr->tkwin,
(mePtr->fontPtr == NULL) ? mePtr->menuPtr->fontPtr
: mePtr->fontPtr);
-
+
if (!TkMacOSXIsCharacterMissing(tkfont, '\022')) {
markChar = '\022'; /* Check mark */
} else if (!TkMacOSXIsCharacterMissing(tkfont, '\245')) {
@@ -871,8 +833,8 @@ FindMarkCharacter(
* SetMenuTitle --
*
* Sets title of menu so that the text displays correctly in menubar.
- * This code directly manipulates menu handle data. This code
- * was originally part of an ancient Apple Developer Response mail.
+ * This code directly manipulates menu handle data. This code was
+ * originally part of an ancient Apple Developer Response mail.
*
* Results:
* None.
@@ -887,18 +849,20 @@ FindMarkCharacter(
static void
mySetMenuTitle(
MenuRef menuHdl, /* The menu we are setting the title of. */
- Tcl_Obj *titlePtr) /* The C string to set the title to. */
+ Tcl_Obj *titlePtr) /* The C string to set the title to. */
{
- char *title = (titlePtr == NULL) ? ""
- : Tcl_GetStringFromObj(titlePtr, NULL);
- CFStringRef cf = CFStringCreateWithCString(NULL,
- title, kCFStringEncodingUTF8);
+ char *title = (titlePtr == NULL) ? "" : Tcl_GetString(titlePtr);
+ CFStringRef cf = CFStringCreateWithCString(NULL, title,
+ kCFStringEncodingUTF8);
SetMenuTitleWithCFString(menuHdl, cf);
CFRelease(cf);
}
-
-static int ParseAccelerators(char **accelStringPtr) {
+
+static int
+ParseAccelerators(
+ char **accelStringPtr)
+{
char *accelString = *accelStringPtr;
int flags = 0;
while (1) {
@@ -954,95 +918,91 @@ static int ParseAccelerators(char **accelStringPtr) {
* Processes configurations for menu entries.
*
* Results:
- * Returns standard TCL result. If TCL_ERROR is returned, then
- * the interp's result contains an error message.
+ * Returns standard TCL result. If TCL_ERROR is returned, then the
+ * interp's result contains an error message.
*
* Side effects:
- * Configuration information get set for mePtr; old resources
- * get freed, if any need it.
+ * Configuration information get set for mePtr; old resources get freed,
+ * if any need it.
*
*----------------------------------------------------------------------
*/
int
TkpConfigureMenuEntry(
- TkMenuEntry *mePtr) /* Information about menu entry; may
- * or may not already have values for
- * some fields. */
+ TkMenuEntry *mePtr) /* Information about menu entry; may or may
+ * not already have values for some fields. */
{
TkMenu *menuPtr = mePtr->menuPtr;
-#if 0 /* Unused */
+#if 0 /* Unused */
int index = mePtr->index;
MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
MenuHandle helpMenuHdl = NULL;
#endif
/*
- * Cascade menus have to have menu IDs of less than 256. So
- * we need to change the child menu if this has been configured
- * for a cascade item.
+ * Cascade menus have to have menu IDs of less than 256. So we need to
+ * change the child menu if this has been configured for a cascade item.
*/
-
+
if (mePtr->type == CASCADE_ENTRY) {
if ((mePtr->childMenuRefPtr != NULL)
&& (mePtr->childMenuRefPtr->menuPtr != NULL)) {
MenuHandle childMenuHdl = ((MacMenu *) mePtr
->childMenuRefPtr->menuPtr->platformData)->menuHdl;
-
+
if (childMenuHdl != NULL) {
int error = SetMenuCascade(mePtr->childMenuRefPtr->menuPtr);
-
+
if (error != TCL_OK) {
return error;
}
-
+
if (menuPtr->menuType == MENUBAR) {
mySetMenuTitle(childMenuHdl, mePtr->labelPtr);
}
}
}
}
-
+
/*
- * We need to parse the accelerator string. If it has the strings
- * for Command, Control, Shift or Option, we need to flag it
- * so we can draw the symbols for it. We also need to precalcuate
- * the position of the first real character we are drawing.
+ * We need to parse the accelerator string. If it has the strings for
+ * Command, Control, Shift or Option, we need to flag it so we can draw
+ * the symbols for it. We also need to precalcuate the position of the
+ * first real character we are drawing.
*/
-
+
if (0 == mePtr->accelLength) {
((EntryGeometry *)mePtr->platformEntryData)->accelTextStart = -1;
} else {
char *accelString = (mePtr->accelPtr == NULL) ? ""
- : Tcl_GetStringFromObj(mePtr->accelPtr, NULL);
+ : Tcl_GetString(mePtr->accelPtr);
char *accel = accelString;
mePtr->entryFlags &= ~ENTRY_ACCEL_MASK;
-
+
mePtr->entryFlags |= ParseAccelerators(&accelString);
-
- ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart
+
+ ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart
= ((long) accelString - (long) accel);
}
-
+
if (!(menuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) {
menuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) menuPtr);
}
-
+
return TCL_OK;
}
-
/*
*----------------------------------------------------------------------
*
* ReconfigureIndividualMenu --
*
- * This routine redoes the guts of the menu. It works from
- * a base item and offset, so that a regular menu will
- * just have all of its items added, but the help menu will
- * have all of its items appended after the apple-defined
- * items.
+ * This routine redoes the guts of the menu. It works from a base item
+ * and offset, so that a regular menu will just have all of its items
+ * added, but the help menu will have all of its items appended after the
+ * apple-defined items.
*
* Results:
* None.
@@ -1056,14 +1016,12 @@ TkpConfigureMenuEntry(
static void
ReconfigureIndividualMenu(
TkMenu *menuPtr, /* The menu we are affecting. */
- MenuHandle macMenuHdl, /* The macintosh menu we are affecting.
- * Will not necessarily be
- * menuPtr->platformData because this could
- * be the help menu. */
+ MenuHandle macMenuHdl, /* The macintosh menu we are affecting. Will
+ * not necessarily be menuPtr->platformData
+ * because this could be the help menu. */
int base) /* The last index that we do not want
- * touched. 0 for normal menus;
- * # of system help menu items
- * for help menus. */
+ * touched. 0 for normal menus; # of system
+ * help menu items * for help menus. */
{
int count;
int index;
@@ -1072,17 +1030,17 @@ ReconfigureIndividualMenu(
#if defined(TK_MAC_DEBUG) && defined(TK_MAC_DEBUG_MENUS)
/* Carbon-internal menu debugging (c.f. Technote 2124) */
- TkMacOSXInitNamedDebugSymbol(HIToolbox, void, DebugPrintMenu, MenuRef menu);
+ TkMacOSXInitNamedDebugSymbol(HIToolbox,void,DebugPrintMenu,MenuRef menu);
if (DebugPrintMenu) {
- DebugPrintMenu(macMenuHdl);
+ DebugPrintMenu(macMenuHdl);
}
#endif
for (mePtr = menuPtr->menuRefPtr->parentEntryPtr; mePtr != NULL;
mePtr = mePtr->nextCascadePtr) {
char *name = (mePtr->namePtr == NULL) ? ""
- : Tcl_GetStringFromObj(mePtr->namePtr, NULL);
-
+ : Tcl_GetString(mePtr->namePtr);
+
if (strcmp(Tk_PathName(menuPtr->tkwin), name) == 0) {
if (mePtr->state == ENTRY_DISABLED) {
parentDisabled = 1;
@@ -1090,45 +1048,45 @@ ReconfigureIndividualMenu(
break;
}
}
-
+
/*
* First, we get rid of all of the old items.
*/
-
+
count = CountMenuItems(macMenuHdl);
for (index = base; index < count; index++) {
DeleteMenuItem(macMenuHdl, base + 1);
}
count = menuPtr->numEntries;
-
+
for (index = 1; index <= count; index++) {
mePtr = menuPtr->entries[index - 1];
-
+
/*
- * We have to do separators separately because SetMenuItemText
- * does not parse meta-characters.
+ * We have to do separators separately because SetMenuItemText does
+ * not parse meta-characters.
*/
-
+
if (mePtr->type == SEPARATOR_ENTRY) {
- AppendMenuItemTextWithCFString (macMenuHdl, NULL,
- kMenuItemAttrSeparator | kMenuItemAttrDisabled,
- 0, NULL);
+ AppendMenuItemTextWithCFString (macMenuHdl, NULL,
+ kMenuItemAttrSeparator | kMenuItemAttrDisabled, 0, NULL);
} else {
Tcl_DString itemTextDString;
- CFStringRef cf;
+ CFStringRef cf;
+
GetEntryText(mePtr, &itemTextDString);
- cf = CFStringCreateWithCString(NULL,
- Tcl_DStringValue(&itemTextDString), kCFStringEncodingUTF8);
+ cf = CFStringCreateWithCString(NULL,
+ Tcl_DStringValue(&itemTextDString),kCFStringEncodingUTF8);
if (cf != NULL) {
- AppendMenuItemTextWithCFString (macMenuHdl, cf, 0, 0, NULL);
- CFRelease(cf);
+ AppendMenuItemTextWithCFString (macMenuHdl, cf, 0, 0, NULL);
+ CFRelease(cf);
} else {
- cf = CFSTR ("<Error>");
- AppendMenuItemTextWithCFString (macMenuHdl, cf, 0, 0, NULL);
+ cf = CFSTR ("<Error>");
+ AppendMenuItemTextWithCFString (macMenuHdl, cf, 0, 0, NULL);
}
Tcl_DStringFree(&itemTextDString);
-
+
/*
* Set enabling and disabling correctly.
*/
@@ -1138,61 +1096,60 @@ ReconfigureIndividualMenu(
} else {
EnableMenuItem(macMenuHdl, base + index);
}
-
+
/*
* Set the check mark for check entries and radio entries.
*/
-
- SetItemMark(macMenuHdl, base + index, 0);
+
+ SetItemMark(macMenuHdl, base + index, 0);
if ((mePtr->type == CHECK_BUTTON_ENTRY)
|| (mePtr->type == RADIO_BUTTON_ENTRY)) {
- CheckMenuItem(macMenuHdl, base + index, (mePtr->entryFlags
- & ENTRY_SELECTED) && mePtr->indicatorOn);
+ CheckMenuItem(macMenuHdl, base + index, mePtr->indicatorOn
+ && (mePtr->entryFlags & ENTRY_SELECTED));
if (mePtr->indicatorOn
&& (mePtr->entryFlags & ENTRY_SELECTED)) {
SetItemMark(macMenuHdl, base + index,
FindMarkCharacter(mePtr));
}
}
-
+
if (mePtr->type == CASCADE_ENTRY) {
- if ((mePtr->childMenuRefPtr != NULL)
+ if ((mePtr->childMenuRefPtr != NULL)
&& (mePtr->childMenuRefPtr->menuPtr != NULL)) {
- MenuHandle childMenuHdl =
+ MenuHandle childMenuHdl =
((MacMenu *) mePtr->childMenuRefPtr
->menuPtr->platformData)->menuHdl;
if (childMenuHdl != NULL) {
- {
- SetMenuItemHierarchicalID(macMenuHdl, base + index,
- GetMenuID(childMenuHdl));
- }
+ SetMenuItemHierarchicalID(macMenuHdl, base + index,
+ GetMenuID(childMenuHdl));
}
+
/*
* If we changed the highligthing of this menu, its
- * children all have to be reconfigured so that
- * their state will be reflected in the menubar.
+ * children all have to be reconfigured so that their
+ * state will be reflected in the menubar.
*/
-
- if (!(mePtr->childMenuRefPtr->menuPtr->menuFlags
+
+ if (!(mePtr->childMenuRefPtr->menuPtr->menuFlags
& MENU_RECONFIGURE_PENDING)) {
mePtr->childMenuRefPtr->menuPtr->menuFlags
|= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
+ Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
(ClientData) mePtr->childMenuRefPtr->menuPtr);
}
}
}
-
+
if ((mePtr->type != CASCADE_ENTRY) && (mePtr->accelPtr != NULL)) {
- int accelLen;
- int modifiers = 0;
- int hasCmd = 0;
- int offset = ((EntryGeometry *)mePtr->platformEntryData)->accelTextStart;
- char *accel = Tcl_GetStringFromObj(mePtr->accelPtr, &accelLen);
- accelLen -= offset;
+ int accelLen, modifiers = 0, hasCmd = 0;
+ int offset = ((EntryGeometry *)
+ mePtr->platformEntryData)->accelTextStart;
+ char *accel = Tcl_GetStringFromObj(mePtr->accelPtr,&accelLen);
+
+ accelLen -= offset;
accel+= offset;
-
+
if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) {
modifiers |= kMenuOptionModifier;
}
@@ -1205,71 +1162,75 @@ ReconfigureIndividualMenu(
if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) {
hasCmd = 1;
}
- if (accelLen == 1) {
- if (hasCmd || (modifiers != 0 && modifiers != kMenuShiftModifier)) {
- SetItemCmd(macMenuHdl, base + index, accel[0]);
+ if (accelLen == 1) {
+ if (hasCmd || (modifiers != 0
+ && modifiers != kMenuShiftModifier)) {
+ SetItemCmd(macMenuHdl, base + index, accel[0]);
if (!hasCmd) {
modifiers |= kMenuNoCommandModifier;
}
}
- } else {
- /*
- * Now we need to convert from various textual names
- * to Carbon codes
+ } else {
+ /*
+ * Now we need to convert from various textual names to
+ * Carbon codes.
*/
+
char glyph = 0x0;
- char first = UCHAR(accel[0]);
+ char first = UCHAR(accel[0]);
+
if (first == 'F' && (accel[1] > '0' && accel[1] <= '9')) {
int fkey = accel[1] - '0';
+
if (accel[2] > '0' && accel[2] <= '9') {
fkey = 10*fkey + (accel[2] - '0');
}
if (fkey > 0 && fkey < 16) {
glyph = kMenuF1Glyph + fkey - 1;
}
- } else if (first == 'P' && 0 ==strcasecmp(accel,"pageup")) {
- glyph = kMenuPageUpGlyph;
- } else if (first == 'P' && 0 ==strcasecmp(accel,"pagedown")) {
- glyph = kMenuPageDownGlyph;
- } else if (first == 'L' && 0 ==strcasecmp(accel,"left")) {
- glyph = kMenuLeftArrowGlyph;
- } else if (first == 'R' && 0 ==strcasecmp(accel,"right")) {
- glyph = kMenuRightArrowGlyph;
- } else if (first == 'U' && 0 ==strcasecmp(accel,"up")) {
- glyph = kMenuUpArrowGlyph;
- } else if (first == 'D' && 0 ==strcasecmp(accel,"down")) {
- glyph = kMenuDownArrowGlyph;
- } else if (first == 'E' && 0 ==strcasecmp(accel,"escape")) {
- glyph = kMenuEscapeGlyph;
- } else if (first == 'C' && 0 ==strcasecmp(accel,"clear")) {
- glyph = kMenuClearGlyph;
- } else if (first == 'E' && 0 ==strcasecmp(accel,"enter")) {
- glyph = kMenuEnterGlyph;
- } else if (first == 'D' && 0 ==strcasecmp(accel,"backspace")) {
- glyph = kMenuDeleteLeftGlyph;
- } else if (first == 'S' && 0 ==strcasecmp(accel,"space")) {
- glyph = kMenuSpaceGlyph;
- } else if (first == 'T' && 0 ==strcasecmp(accel,"tab")) {
- glyph = kMenuTabRightGlyph;
- } else if (first == 'F' && 0 ==strcasecmp(accel,"delete")) {
- glyph = kMenuDeleteRightGlyph;
- } else if (first == 'H' && 0 ==strcasecmp(accel,"home")) {
- glyph = kMenuNorthwestArrowGlyph;
- } else if (first == 'R' && 0 ==strcasecmp(accel,"return")) {
- glyph = kMenuReturnGlyph;
- } else if (first == 'H' && 0 ==strcasecmp(accel,"help")) {
- glyph = kMenuHelpGlyph;
- } else if (first == 'P' && 0 ==strcasecmp(accel,"power")) {
- glyph = kMenuPowerGlyph;
- }
+ } else if (first == 'P' && !strcasecmp(accel,"pageup")) {
+ glyph = kMenuPageUpGlyph;
+ } else if (first == 'P' && !strcasecmp(accel,"pagedown")) {
+ glyph = kMenuPageDownGlyph;
+ } else if (first == 'L' && !strcasecmp(accel,"left")) {
+ glyph = kMenuLeftArrowGlyph;
+ } else if (first == 'R' && !strcasecmp(accel,"right")) {
+ glyph = kMenuRightArrowGlyph;
+ } else if (first == 'U' && !strcasecmp(accel,"up")) {
+ glyph = kMenuUpArrowGlyph;
+ } else if (first == 'D' && !strcasecmp(accel,"down")) {
+ glyph = kMenuDownArrowGlyph;
+ } else if (first == 'E' && !strcasecmp(accel,"escape")) {
+ glyph = kMenuEscapeGlyph;
+ } else if (first == 'C' && !strcasecmp(accel,"clear")) {
+ glyph = kMenuClearGlyph;
+ } else if (first == 'E' && !strcasecmp(accel,"enter")) {
+ glyph = kMenuEnterGlyph;
+ } else if (first == 'D' && !strcasecmp(accel,"backspace")){
+ glyph = kMenuDeleteLeftGlyph;
+ } else if (first == 'S' && !strcasecmp(accel,"space")) {
+ glyph = kMenuSpaceGlyph;
+ } else if (first == 'T' && !strcasecmp(accel,"tab")) {
+ glyph = kMenuTabRightGlyph;
+ } else if (first == 'F' && !strcasecmp(accel,"delete")) {
+ glyph = kMenuDeleteRightGlyph;
+ } else if (first == 'H' && !strcasecmp(accel,"home")) {
+ glyph = kMenuNorthwestArrowGlyph;
+ } else if (first == 'R' && !strcasecmp(accel,"return")) {
+ glyph = kMenuReturnGlyph;
+ } else if (first == 'H' && !strcasecmp(accel,"help")) {
+ glyph = kMenuHelpGlyph;
+ } else if (first == 'P' && !strcasecmp(accel,"power")) {
+ glyph = kMenuPowerGlyph;
+ }
if (glyph != 0x0) {
SetMenuItemKeyGlyph(macMenuHdl, base + index, glyph);
if (!hasCmd) {
modifiers |= kMenuNoCommandModifier;
}
}
- }
-
+ }
+
SetMenuItemModifiers(macMenuHdl, base + index, modifiers);
}
}
@@ -1281,25 +1242,24 @@ ReconfigureIndividualMenu(
*
* ReconfigureMacintoshMenu --
*
- * Rebuilds the Macintosh MenuHandle items from the menu. Called
- * usually as an idle handler, but can be called synchronously
- * if the menu is about to be posted.
+ * Rebuilds the Macintosh MenuHandle items from the menu. Called usually
+ * as an idle handler, but can be called synchronously if the menu is
+ * about to be posted.
*
* Results:
* None.
*
* Side effects:
- * Configuration information get set for mePtr; old resources
- * get freed, if any need it.
+ * Configuration information get set for mePtr; old resources get freed,
+ * if any need it.
*
*----------------------------------------------------------------------
*/
static void
ReconfigureMacintoshMenu(
- ClientData clientData) /* Information about menu entry; may
- * or may not already have values for
- * some fields. */
+ ClientData clientData) /* Information about menu entry; may or may
+ * not already have values for some fields. */
{
TkMenu *menuPtr = (TkMenu *) clientData;
MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
@@ -1319,16 +1279,16 @@ ReconfigureMacintoshMenu(
}
*/
if (GetMenuID(macMenuHdl) == currentHelpMenuID) {
- MenuItemIndex helpIndex;
- HMGetHelpMenu(&helpMenuHdl,&helpIndex);
+ MenuItemIndex helpIndex;
+
+ HMGetHelpMenu(&helpMenuHdl, &helpIndex);
if (helpMenuHdl != NULL) {
- ReconfigureIndividualMenu(menuPtr, helpMenuHdl,
- helpIndex - 1);
+ ReconfigureIndividualMenu(menuPtr, helpMenuHdl, helpIndex - 1);
}
}
if (menuPtr->menuType == MENUBAR) {
- if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
+ if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
menuBarFlags |= MENUBAR_REDRAW_PENDING;
}
@@ -1340,8 +1300,8 @@ ReconfigureMacintoshMenu(
*
* CompleteIdlers --
*
- * Completes all idle handling so that the menus are in sync when
- * the user invokes them with the mouse.
+ * Completes all idle handling so that the menus are in sync when the
+ * user invokes them with the mouse.
*
* Results:
* None.
@@ -1354,7 +1314,7 @@ ReconfigureMacintoshMenu(
static void
CompleteIdlers(
- TkMenu *menuPtr) /* The menu we are completing. */
+ TkMenu *menuPtr) /* The menu we are completing. */
{
int i;
@@ -1362,16 +1322,13 @@ CompleteIdlers(
Tcl_CancelIdleCall(ReconfigureMacintoshMenu, (ClientData) menuPtr);
ReconfigureMacintoshMenu((ClientData) menuPtr);
}
-
+
for (i = 0; i < menuPtr->numEntries; i++) {
- if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
- if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
- && (menuPtr->entries[i]->childMenuRefPtr->menuPtr
- != NULL)) {
- CompleteIdlers(menuPtr->entries[i]->childMenuRefPtr
- ->menuPtr);
- }
- }
+ if ((menuPtr->entries[i]->type == CASCADE_ENTRY) &&
+ (menuPtr->entries[i]->childMenuRefPtr != NULL) &&
+ (menuPtr->entries[i]->childMenuRefPtr->menuPtr != NULL)) {
+ CompleteIdlers(menuPtr->entries[i]->childMenuRefPtr->menuPtr);
+ }
}
}
@@ -1402,22 +1359,20 @@ TkpPostMenu(
{
MenuHandle macMenuHdl = ((MacMenu *) menuPtr->platformData)->menuHdl;
long popUpResult;
- int result;
- int oldMode;
+ int result, oldMode;
if (inPostMenu) {
- Tcl_AppendResult(interp,
- "Cannot call post menu while already posting menu",
- (char *) NULL);
+ Tcl_AppendResult(interp,
+ "Cannot call post menu while already posting menu", NULL);
result = TCL_ERROR;
} else {
short menuID;
Window window;
int oldWidth = menuPtr->totalWidth;
Tk_Window parentWindow = Tk_Parent(menuPtr->tkwin);
-
+
inPostMenu++;
-
+
result = TkPreprocessMenu(menuPtr);
if (result != TCL_OK) {
inPostMenu--;
@@ -1425,10 +1380,10 @@ TkpPostMenu(
}
/*
- * The post commands could have deleted the menu, which means
- * we are dead and should go away.
+ * The post commands could have deleted the menu, which means we are
+ * dead and should go away.
*/
-
+
if (menuPtr->tkwin == NULL) {
inPostMenu--;
return TCL_OK;
@@ -1438,15 +1393,15 @@ TkpPostMenu(
if (menuBarFlags & MENUBAR_REDRAW_PENDING) {
Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL);
DrawMenuBarWhenIdle((ClientData *) NULL);
- }
-
+ }
+
if (NULL == parentWindow) {
tearoffStruct.excludeRect.top = tearoffStruct.excludeRect.left
= tearoffStruct.excludeRect.bottom
= tearoffStruct.excludeRect.right = SHRT_MAX;
} else {
int left, top;
-
+
Tk_GetRootCoords(parentWindow, &left, &top);
tearoffStruct.excludeRect.left = left;
tearoffStruct.excludeRect.top = top;
@@ -1454,19 +1409,20 @@ TkpPostMenu(
tearoffStruct.excludeRect.bottom = top + Tk_Height(parentWindow);
if (Tk_Class(parentWindow) == Tk_GetUid("Menubutton")) {
TkWindow *parentWinPtr = (TkWindow *) parentWindow;
- TkMenuButton *mbPtr =
- (TkMenuButton *) parentWinPtr->instanceData;
+ TkMenuButton *mbPtr = (TkMenuButton *)
+ parentWinPtr->instanceData;
int menuButtonWidth = Tk_Width(parentWindow)
- 2 * (mbPtr->highlightWidth + mbPtr->borderWidth + 1);
+
menuPtr->totalWidth = menuButtonWidth > menuPtr->totalWidth
? menuButtonWidth : menuPtr->totalWidth;
}
}
-
+
InsertMenu(macMenuHdl, -1);
RecursivelyInsertMenu(menuPtr);
CountMenuItems(macMenuHdl);
-
+
oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
popUpResult = PopUpMenuSelect(macMenuHdl, y, x, menuPtr->active);
Tcl_SetServiceMode(oldMode);
@@ -1474,18 +1430,18 @@ TkpPostMenu(
menuPtr->totalWidth = oldWidth;
RecursivelyDeleteMenu(menuPtr);
DeleteMenu(GetMenuID(macMenuHdl));
-
+
/*
* Simulate the mouse up.
*/
-
+
window = Tk_WindowId(menuPtr->tkwin);
TkGenerateButtonEventForXPointer(window);
-
+
/*
* Dispatch the command.
*/
-
+
menuID = HiWord(popUpResult);
if (menuID != 0) {
result = TkMacOSXDispatchMenuEvent(menuID, LoWord(popUpResult));
@@ -1494,15 +1450,15 @@ TkpPostMenu(
result = TCL_OK;
}
- /*
- * Be careful, here. The command executed in handling the menu event
- * could destroy the window. Don't try to do anything with it then.
- */
-
- if (menuPtr->tkwin) {
+ /*
+ * Be careful, here. The command executed in handling the menu event
+ * could destroy the window. Don't try to do anything with it then.
+ */
+
+ if (menuPtr->tkwin) {
InvalidateMDEFRgns();
RecursivelyClearActiveMenu(menuPtr);
- }
+ }
inPostMenu--;
}
return result;
@@ -1514,9 +1470,8 @@ TkpPostMenu(
* TkpMenuNewEntry --
*
* Adds a pointer to a new menu entry structure with the platform-
- * specific fields filled in. The Macintosh uses the
- * platformEntryData field of the TkMenuEntry record to store
- * geometry information.
+ * specific fields filled in. The Macintosh uses the platformEntryData
+ * field of the TkMenuEntry record to store geometry information.
*
* Results:
* Standard TCL error.
@@ -1535,7 +1490,7 @@ TkpMenuNewEntry(
EntryGeometry *geometryPtr =
(EntryGeometry *) ckalloc(sizeof(EntryGeometry));
TkMenu *menuPtr = mePtr->menuPtr;
-
+
geometryPtr->accelTextStart = 0;
geometryPtr->accelTextWidth = 0;
geometryPtr->nonAccelMargin = 0;
@@ -1551,12 +1506,11 @@ TkpMenuNewEntry(
/*
*----------------------------------------------------------------------
*
- *
* Tk_MacOSXTurnOffMenus --
*
- * Turns off all the menu drawing code. This is more than just disabling
- * the "menu" command, this means that Tk will NEVER touch the menubar.
- * It is needed in the Plugin, where Tk does not own the menubar.
+ * Turns off all the menu drawing code. This is more than just disabling
+ * the "menu" command, this means that Tk will NEVER touch the menubar.
+ * It is needed in the Plugin, where Tk does not own the menubar.
*
* Results:
* None.
@@ -1568,7 +1522,7 @@ TkpMenuNewEntry(
*/
void
-Tk_MacOSXTurnOffMenus()
+Tk_MacOSXTurnOffMenus(void)
{
gNoTkMenus = 1;
}
@@ -1576,7 +1530,6 @@ Tk_MacOSXTurnOffMenus()
/*
*----------------------------------------------------------------------
*
- *
* DrawMenuBarWhenIdle --
*
* Update the menu bar next time there is an idle event.
@@ -1598,19 +1551,19 @@ DrawMenuBarWhenIdle(
TkMenu *appleMenuPtr, *helpMenuPtr;
MenuHandle macMenuHdl;
Tcl_HashEntry *hashEntryPtr;
-
+
/*
* If we have been turned off, exit.
*/
-
+
if (gNoTkMenus) {
- return;
+ return;
}
-
+
/*
* We need to clear the apple and help menus of any extra items.
*/
-
+
if (currentAppleMenuID != 0) {
hashEntryPtr = Tcl_FindHashEntry(&commandTable,
(char *) ((int)currentAppleMenuID));
@@ -1619,8 +1572,7 @@ DrawMenuBarWhenIdle(
TkpNewMenu(appleMenuPtr);
appleMenuPtr->menuFlags &= ~MENU_APPLE_MENU;
appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) appleMenuPtr);
+ Tcl_DoWhenIdle(ReconfigureMacintoshMenu, (ClientData) appleMenuPtr);
}
if (currentHelpMenuID != 0) {
@@ -1634,12 +1586,11 @@ DrawMenuBarWhenIdle(
Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
(ClientData) helpMenuPtr);
}
-
+
/*
- * We need to find the clone of this menu that is the menubar.
- * Once we do that, for every cascade in the menu, we need to
- * insert the Mac menu in the Mac menubar. Finally, we need
- * to redraw the menubar.
+ * We need to find the clone of this menu that is the menubar. Once we do
+ * that, for every cascade in the menu, we need to insert the Mac menu in
+ * the Mac menubar. Finally, we need to redraw the menubar.
*/
menuRefPtr = NULL;
@@ -1650,188 +1601,163 @@ DrawMenuBarWhenIdle(
if (menuRefPtr != NULL) {
TkMenu *menuPtr, *menuBarPtr;
TkMenu *cascadeMenuPtr;
- char *appleMenuName, *helpMenuName;
- int appleIndex = -1, helpIndex = -1;
- int i;
-
- menuPtr = menuRefPtr->menuPtr;
- if (menuPtr != NULL) {
- TkMenuReferences *specialMenuRefPtr;
- TkMenuEntry *specialEntryPtr;
-
- appleMenuName = ckalloc(strlen(currentMenuBarName)
- + 1 + strlen(".apple") + 1);
- sprintf(appleMenuName, "%s.apple",
- Tk_PathName(menuPtr->tkwin));
- specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- appleMenuName);
- if ((specialMenuRefPtr != NULL)
- && (specialMenuRefPtr->menuPtr != NULL)) {
- for (specialEntryPtr
- = specialMenuRefPtr->parentEntryPtr;
- specialEntryPtr != NULL;
- specialEntryPtr
- = specialEntryPtr->nextCascadePtr) {
+ char *appleMenuName, *helpMenuName;
+ int appleIndex = -1, helpIndex = -1, i;
+
+ menuPtr = menuRefPtr->menuPtr;
+ if (menuPtr != NULL) {
+ TkMenuReferences *specialMenuRefPtr;
+ TkMenuEntry *specialEntryPtr;
+
+ appleMenuName = ckalloc(
+ strlen(currentMenuBarName) + 1 + strlen(".apple") + 1);
+ sprintf(appleMenuName, "%s.apple", Tk_PathName(menuPtr->tkwin));
+ specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
+ appleMenuName);
+ if ((specialMenuRefPtr != NULL)
+ && (specialMenuRefPtr->menuPtr != NULL)) {
+ for (specialEntryPtr = specialMenuRefPtr->parentEntryPtr;
+ specialEntryPtr != NULL;
+ specialEntryPtr = specialEntryPtr->nextCascadePtr) {
if (specialEntryPtr->menuPtr == menuPtr) {
appleIndex = specialEntryPtr->index;
break;
}
}
- }
- ckfree(appleMenuName);
-
- helpMenuName = ckalloc(strlen(currentMenuBarName)
- + 1 + strlen(".help") + 1);
- sprintf(helpMenuName, "%s.help",
- Tk_PathName(menuPtr->tkwin));
- specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- helpMenuName);
- if ((specialMenuRefPtr != NULL)
- && (specialMenuRefPtr->menuPtr != NULL)) {
- for (specialEntryPtr
- = specialMenuRefPtr->parentEntryPtr;
- specialEntryPtr != NULL;
- specialEntryPtr
- = specialEntryPtr->nextCascadePtr) {
+ }
+ ckfree(appleMenuName);
+
+ helpMenuName = ckalloc(
+ strlen(currentMenuBarName) + 1 + strlen(".help") + 1);
+ sprintf(helpMenuName, "%s.help", Tk_PathName(menuPtr->tkwin));
+ specialMenuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
+ helpMenuName);
+ if ((specialMenuRefPtr != NULL)
+ && (specialMenuRefPtr->menuPtr != NULL)) {
+ for (specialEntryPtr = specialMenuRefPtr->parentEntryPtr;
+ specialEntryPtr != NULL;
+ specialEntryPtr = specialEntryPtr->nextCascadePtr) {
if (specialEntryPtr->menuPtr == menuPtr) {
helpIndex = specialEntryPtr->index;
break;
}
}
}
- ckfree(helpMenuName);
-
- }
-
- for (menuBarPtr = menuPtr;
- (menuBarPtr != NULL)
- && (menuBarPtr->menuType != MENUBAR);
- menuBarPtr = menuBarPtr->nextInstancePtr) {
-
- /*
- * Null loop body.
- */
-
- }
-
- if (menuBarPtr == NULL) {
- SetDefaultMenubar();
- } else {
- if (menuBarPtr->tearoff != menuPtr->tearoff) {
- if (menuBarPtr->tearoff) {
- appleIndex = (-1 == appleIndex) ? appleIndex
- : appleIndex + 1;
- helpIndex = (-1 == helpIndex) ? helpIndex
- : helpIndex + 1;
- } else {
- appleIndex = (-1 == appleIndex) ? appleIndex
- : appleIndex - 1;
- helpIndex = (-1 == helpIndex) ? helpIndex
- : helpIndex - 1;
- }
- }
- ClearMenuBar();
-
- if (appleIndex == -1) {
- InsertMenu(tkAppleMenu, 0);
- currentAppleMenuID = 0;
- tkCurrentAppleMenu = tkAppleMenu;
+ ckfree(helpMenuName);
+ }
+
+ for (menuBarPtr = menuPtr;
+ (menuBarPtr != NULL) && (menuBarPtr->menuType != MENUBAR);
+ menuBarPtr = menuBarPtr->nextInstancePtr) {
+ /*
+ * Null loop body.
+ */
+ }
+
+ if (menuBarPtr == NULL) {
+ goto setDefault;
+ }
+
+ if (menuBarPtr->tearoff != menuPtr->tearoff) {
+ if (menuBarPtr->tearoff) {
+ appleIndex = (-1 == appleIndex) ? appleIndex : appleIndex + 1;
+ helpIndex = (-1 == helpIndex) ? helpIndex : helpIndex + 1;
} else {
- short appleID;
- appleMenuPtr = menuBarPtr->entries[appleIndex]
- ->childMenuRefPtr->menuPtr;
- TkpDestroyMenu(appleMenuPtr);
- TkMacOSXGetNewMenuID(appleMenuPtr->interp, appleMenuPtr, 0,
- &appleID);
- macMenuHdl = NewMenu(appleID, "\p\024");
- appleMenuPtr->platformData =
- (TkMenuPlatformData) ckalloc(sizeof(MacMenu));
- ((MacMenu *)appleMenuPtr->platformData)->menuHdl
- = macMenuHdl;
- SetRect(&((MacMenu *) appleMenuPtr->platformData)->menuRect,
- 0, 0, 0, 0);
- appleMenuPtr->menuFlags |= MENU_APPLE_MENU;
- if (!(appleMenuPtr->menuFlags
- & MENU_RECONFIGURE_PENDING)) {
- appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) appleMenuPtr);
- }
- InsertMenu(macMenuHdl, 0);
- RecursivelyInsertMenu(appleMenuPtr);
- currentAppleMenuID = appleID;
- tkCurrentAppleMenu = macMenuHdl;
+ appleIndex = (-1 == appleIndex) ? appleIndex : appleIndex - 1;
+ helpIndex = (-1 == helpIndex) ? helpIndex : helpIndex - 1;
}
- if (helpIndex == -1) {
- currentHelpMenuID = 0;
+ }
+ ClearMenuBar();
+
+ if (appleIndex == -1) {
+ InsertMenu(tkAppleMenu, 0);
+ currentAppleMenuID = 0;
+ tkCurrentAppleMenu = tkAppleMenu;
+ } else {
+ short appleID;
+ appleMenuPtr = menuBarPtr->entries[appleIndex]
+ ->childMenuRefPtr->menuPtr;
+ TkpDestroyMenu(appleMenuPtr);
+ TkMacOSXGetNewMenuID(appleMenuPtr->interp, appleMenuPtr, 0,
+ &appleID);
+ macMenuHdl = NewMenu(appleID, "\p\024");
+ appleMenuPtr->platformData = (TkMenuPlatformData)
+ ckalloc(sizeof(MacMenu));
+ ((MacMenu *)appleMenuPtr->platformData)->menuHdl = macMenuHdl;
+ SetRect(&((MacMenu *) appleMenuPtr->platformData)->menuRect, 0, 0,
+ 0, 0);
+ appleMenuPtr->menuFlags |= MENU_APPLE_MENU;
+ if (!(appleMenuPtr->menuFlags & MENU_RECONFIGURE_PENDING)) {
+ appleMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
+ Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
+ (ClientData) appleMenuPtr);
}
-
- for (i = 0; i < menuBarPtr->numEntries; i++) {
- if (i == appleIndex) {
- if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) {
- DisableMenuItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- } else {
- EnableMenuItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
+ InsertMenu(macMenuHdl, 0);
+ RecursivelyInsertMenu(appleMenuPtr);
+ currentAppleMenuID = appleID;
+ tkCurrentAppleMenu = macMenuHdl;
+ }
+ if (helpIndex == -1) {
+ currentHelpMenuID = 0;
+ }
+
+ for (i = 0; i < menuBarPtr->numEntries; i++) {
+ if (i == appleIndex) {
+ if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) {
+ DisableMenuItem(((MacMenu *) menuBarPtr->entries[i]->
+ childMenuRefPtr->menuPtr->platformData)->menuHdl,
+ 0);
+ } else {
+ EnableMenuItem(((MacMenu *) menuBarPtr->entries[i]->
+ childMenuRefPtr->menuPtr->platformData)->menuHdl,
+ 0);
+ }
+ continue;
+ } else if (i == helpIndex) {
+ TkMenu *helpMenuPtr = menuBarPtr->entries[i]
+ ->childMenuRefPtr->menuPtr;
+
+ if (helpMenuPtr == NULL) {
+ continue;
+ }
+ helpMenuPtr->menuFlags |= MENU_HELP_MENU;
+ if (!(helpMenuPtr->menuFlags
+ & MENU_RECONFIGURE_PENDING)) {
+ helpMenuPtr->menuFlags |= MENU_RECONFIGURE_PENDING;
+ Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
+ (ClientData) helpMenuPtr);
+ }
+ macMenuHdl = ((MacMenu *) helpMenuPtr->platformData)->menuHdl;
+ currentHelpMenuID = GetMenuID(macMenuHdl);
+ } else if (menuBarPtr->entries[i]->type == CASCADE_ENTRY) {
+ if ((menuBarPtr->entries[i]->childMenuRefPtr != NULL) &&
+ menuBarPtr->entries[i]->childMenuRefPtr->menuPtr) {
+ cascadeMenuPtr = menuBarPtr->entries[i]
+ ->childMenuRefPtr->menuPtr;
+ macMenuHdl = ((MacMenu *) cascadeMenuPtr
+ ->platformData)->menuHdl;
+ DeleteMenu(GetMenuID(macMenuHdl));
+ InsertMenu(macMenuHdl, 0);
+ RecursivelyInsertMenu(cascadeMenuPtr);
+ if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) {
+ DisableMenuItem(((MacMenu *) menuBarPtr->entries[i]
+ ->childMenuRefPtr->menuPtr
+ ->platformData)->menuHdl, 0);
+ } else {
+ EnableMenuItem(((MacMenu *) menuBarPtr->entries[i]
+ ->childMenuRefPtr->menuPtr
+ ->platformData)->menuHdl, 0);
}
- continue;
- } else if (i == helpIndex) {
- TkMenu *helpMenuPtr = menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr;
-
- if (helpMenuPtr == NULL) {
- continue;
- }
- helpMenuPtr->menuFlags |= MENU_HELP_MENU;
- if (!(helpMenuPtr->menuFlags
- & MENU_RECONFIGURE_PENDING)) {
- helpMenuPtr->menuFlags
- |= MENU_RECONFIGURE_PENDING;
- Tcl_DoWhenIdle(ReconfigureMacintoshMenu,
- (ClientData) helpMenuPtr);
- }
- macMenuHdl =
- ((MacMenu *) helpMenuPtr->platformData)->menuHdl;
- currentHelpMenuID = GetMenuID(macMenuHdl);
- } else if (menuBarPtr->entries[i]->type
- == CASCADE_ENTRY) {
- if ((menuBarPtr->entries[i]->childMenuRefPtr != NULL)
- && menuBarPtr->entries[i]->childMenuRefPtr
- ->menuPtr != NULL) {
- cascadeMenuPtr = menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr;
- macMenuHdl = ((MacMenu *) cascadeMenuPtr
- ->platformData)->menuHdl;
- DeleteMenu(GetMenuID(macMenuHdl));
- InsertMenu(macMenuHdl, 0);
- RecursivelyInsertMenu(cascadeMenuPtr);
- if (menuBarPtr->entries[i]->state == ENTRY_DISABLED) {
- DisableMenuItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- } else {
- EnableMenuItem(((MacMenu *) menuBarPtr->entries[i]
- ->childMenuRefPtr->menuPtr
- ->platformData)->menuHdl,
- 0);
- }
- }
- }
+ }
}
}
} else {
+ setDefault:
SetDefaultMenubar();
}
DrawMenuBar();
menuBarFlags &= ~MENUBAR_REDRAW_PENDING;
}
-
/*
*----------------------------------------------------------------------
@@ -1852,25 +1778,24 @@ DrawMenuBarWhenIdle(
static void
RecursivelyInsertMenu(
- TkMenu *menuPtr) /* All of the cascade items in this menu
- * will be inserted into the mac menubar. */
+ TkMenu *menuPtr) /* All of the cascade items in this menu will
+ * be inserted into the mac menubar. */
{
int i;
TkMenu *cascadeMenuPtr;
MenuHandle macMenuHdl;
-
+
for (i = 0; i < menuPtr->numEntries; i++) {
- if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
- if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
- && (menuPtr->entries[i]->childMenuRefPtr->menuPtr
- != NULL)) {
- cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr;
- macMenuHdl =
- ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl;
- InsertMenu(macMenuHdl, -1);
- RecursivelyInsertMenu(cascadeMenuPtr);
+ if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
+ if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
+ && menuPtr->entries[i]->childMenuRefPtr->menuPtr != NULL) {
+ cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr;
+ macMenuHdl =
+ ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl;
+ InsertMenu(macMenuHdl, -1);
+ RecursivelyInsertMenu(cascadeMenuPtr);
}
- }
+ }
}
}
@@ -1882,7 +1807,6 @@ RecursivelyInsertMenu(
* Takes all of the cascades of this menu out of the Mac hierarchical
* list.
*
- *
* Results:
* None.
*
@@ -1894,25 +1818,24 @@ RecursivelyInsertMenu(
static void
RecursivelyDeleteMenu(
- TkMenu *menuPtr) /* All of the cascade items in this menu
- * will be inserted into the mac menubar. */
+ TkMenu *menuPtr) /* All of the cascade items in this menu will
+ * be inserted into the mac menubar. */
{
int i;
TkMenu *cascadeMenuPtr;
MenuHandle macMenuHdl;
-
+
for (i = 0; i < menuPtr->numEntries; i++) {
- if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
- if ((menuPtr->entries[i]->childMenuRefPtr != NULL)
- && (menuPtr->entries[i]->childMenuRefPtr->menuPtr
- != NULL)) {
- cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr;
- macMenuHdl =
- ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl;
- DeleteMenu(GetMenuID(macMenuHdl));
- RecursivelyInsertMenu(cascadeMenuPtr);
+ if (menuPtr->entries[i]->type == CASCADE_ENTRY) {
+ if ((menuPtr->entries[i]->childMenuRefPtr != NULL) &&
+ (menuPtr->entries[i]->childMenuRefPtr->menuPtr != NULL)) {
+ cascadeMenuPtr = menuPtr->entries[i]->childMenuRefPtr->menuPtr;
+ macMenuHdl =
+ ((MacMenu *) cascadeMenuPtr->platformData)->menuHdl;
+ DeleteMenu(GetMenuID(macMenuHdl));
+ RecursivelyInsertMenu(cascadeMenuPtr);
}
- }
+ }
}
}
@@ -1933,11 +1856,11 @@ RecursivelyDeleteMenu(
*/
static void
-SetDefaultMenubar()
+SetDefaultMenubar(void)
{
if (currentMenuBarName != NULL) {
- ckfree(currentMenuBarName);
- currentMenuBarName = NULL;
+ ckfree(currentMenuBarName);
+ currentMenuBarName = NULL;
}
currentMenuBarOwner = NULL;
ClearMenuBar();
@@ -1945,8 +1868,8 @@ SetDefaultMenubar()
InsertMenu(tkFileMenu, 0);
InsertMenu(tkEditMenu, 0);
if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
- Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
- menuBarFlags |= MENUBAR_REDRAW_PENDING;
+ Tcl_DoWhenIdle(DrawMenuBarWhenIdle, NULL);
+ menuBarFlags |= MENUBAR_REDRAW_PENDING;
}
}
@@ -1955,8 +1878,8 @@ SetDefaultMenubar()
*
* TkpSetMainMenubar --
*
- * Puts the menu associated with a window into the menubar. Should
- * only be called when the window is in front.
+ * Puts the menu associated with a window into the menubar. Should only
+ * be called when the window is in front.
*
* Results:
* None.
@@ -1971,81 +1894,77 @@ void
TkpSetMainMenubar(
Tcl_Interp *interp, /* The interpreter of the application */
Tk_Window tkwin, /* The frame we are setting up */
- char *menuName) /* The name of the menu to put in front.
- * If NULL, use the default menu bar.
- */
+ char *menuName) /* The name of the menu to put in front. If
+ * NULL, use the default menu bar. */
{
TkWindow *winPtr = (TkWindow *) tkwin;
- CGrafPtr winPort;
+ CGrafPtr winPort;
WindowRef macWindowPtr;
WindowRef frontNonFloating;
winPort = TkMacOSXGetDrawablePort(winPtr->window);
if (!winPort) {
- return;
+ return;
}
macWindowPtr = GetWindowFromPort(winPort);
-
- frontNonFloating = ActiveNonFloatingWindow();
+
+ frontNonFloating = ActiveNonFloatingWindow();
if ((macWindowPtr == NULL) || (macWindowPtr != frontNonFloating)) {
- return;
+ return;
}
- if ((currentMenuBarInterp != interp)
- || (currentMenuBarOwner != tkwin)
- || (currentMenuBarName == NULL)
- || (menuName == NULL)
- || (strcmp(menuName, currentMenuBarName) != 0)) {
+ if ((currentMenuBarInterp != interp) || (currentMenuBarOwner != tkwin)
+ || (currentMenuBarName == NULL) || (menuName == NULL)
+ || (strcmp(menuName, currentMenuBarName) != 0)) {
Tk_Window searchWindow;
- TopLevelMenubarList *listPtr;
-
- if (currentMenuBarName != NULL) {
- ckfree(currentMenuBarName);
- }
+ TopLevelMenubarList *listPtr;
+
+ if (currentMenuBarName != NULL) {
+ ckfree(currentMenuBarName);
+ }
if (menuName == NULL) {
searchWindow = tkwin;
if (strcmp(Tk_Class(searchWindow), "Menu") == 0) {
- TkMenuReferences *menuRefPtr;
-
- menuRefPtr = TkFindMenuReferences(interp, Tk_PathName(tkwin));
- if (menuRefPtr != NULL) {
- TkMenu *menuPtr = menuRefPtr->menuPtr;
- if (menuPtr != NULL) {
- menuPtr = menuPtr->masterMenuPtr;
- searchWindow = menuPtr->tkwin;
- }
- }
- }
+ TkMenuReferences *menuRefPtr;
+
+ menuRefPtr = TkFindMenuReferences(interp, Tk_PathName(tkwin));
+ if (menuRefPtr != NULL) {
+ TkMenu *menuPtr = menuRefPtr->menuPtr;
+
+ if (menuPtr != NULL) {
+ searchWindow = menuPtr->masterMenuPtr->tkwin;
+ }
+ }
+ }
for (; searchWindow != NULL;
searchWindow = Tk_Parent(searchWindow)) {
-
- for (listPtr = windowListPtr; listPtr != NULL;
- listPtr = listPtr->nextPtr) {
- if (listPtr->tkwin == searchWindow) {
- break;
- }
- }
- if (listPtr != NULL) {
- menuName = Tk_PathName(listPtr->menuPtr->masterMenuPtr
- ->tkwin);
- break;
- }
+ for (listPtr = windowListPtr; listPtr != NULL;
+ listPtr = listPtr->nextPtr) {
+ if (listPtr->tkwin == searchWindow) {
+ break;
+ }
+ }
+ if (listPtr != NULL) {
+ menuName = Tk_PathName(
+ listPtr->menuPtr->masterMenuPtr->tkwin);
+ break;
+ }
}
}
-
+
if (menuName == NULL) {
currentMenuBarName = NULL;
- } else {
- currentMenuBarName = ckalloc(strlen(menuName) + 1);
+ } else {
+ currentMenuBarName = ckalloc(strlen(menuName) + 1);
strcpy(currentMenuBarName, menuName);
- }
- currentMenuBarOwner = tkwin;
- currentMenuBarInterp = interp;
+ }
+ currentMenuBarOwner = tkwin;
+ currentMenuBarInterp = interp;
}
if (!(menuBarFlags & MENUBAR_REDRAW_PENDING)) {
- Tcl_DoWhenIdle(DrawMenuBarWhenIdle, (ClientData *) NULL);
- menuBarFlags |= MENUBAR_REDRAW_PENDING;
+ Tcl_DoWhenIdle(DrawMenuBarWhenIdle, NULL);
+ menuBarFlags |= MENUBAR_REDRAW_PENDING;
}
}
@@ -2060,8 +1979,8 @@ TkpSetMainMenubar(
* None.
*
* Side effects:
- * On Windows and UNIX, associates the platform menu with the
- * platform window.
+ * On Windows and UNIX, associates the platform menu with the platform
+ * window.
*
*----------------------------------------------------------------------
*/
@@ -2072,45 +1991,44 @@ TkpSetWindowMenuBar(
TkMenu *menuPtr) /* The menu we are setting */
{
TopLevelMenubarList *listPtr, *prevPtr;
-
+
/*
* Remove any existing reference to this window.
*/
-
- for (prevPtr = NULL, listPtr = windowListPtr;
- listPtr != NULL;
- prevPtr = listPtr, listPtr = listPtr->nextPtr) {
+
+ for (prevPtr = NULL, listPtr = windowListPtr;
+ listPtr != NULL;
+ prevPtr = listPtr, listPtr = listPtr->nextPtr) {
if (listPtr->tkwin == tkwin) {
break;
- }
+ }
}
-
+
if (listPtr != NULL) {
- if (prevPtr != NULL) {
- prevPtr->nextPtr = listPtr->nextPtr;
- } else {
- windowListPtr = listPtr->nextPtr;
- }
- ckfree((char *) listPtr);
+ if (prevPtr != NULL) {
+ prevPtr->nextPtr = listPtr->nextPtr;
+ } else {
+ windowListPtr = listPtr->nextPtr;
+ }
+ ckfree((char *) listPtr);
}
-
+
if (menuPtr != NULL) {
- listPtr = (TopLevelMenubarList *) ckalloc(sizeof(TopLevelMenubarList));
- listPtr->nextPtr = windowListPtr;
- windowListPtr = listPtr;
- listPtr->tkwin = tkwin;
- listPtr->menuPtr = menuPtr;
+ listPtr = (TopLevelMenubarList *) ckalloc(sizeof(TopLevelMenubarList));
+ listPtr->nextPtr = windowListPtr;
+ windowListPtr = listPtr;
+ listPtr->tkwin = tkwin;
+ listPtr->menuPtr = menuPtr;
}
}
-
-static void
+
/*
*----------------------------------------------------------------------
*
* EventuallyInvokeMenu --
*
- * This IdleTime callback actually invokes the menu command
- * scheduled in TkMacOSXDispatchMenuEvent.
+ * This IdleTime callback actually invokes the menu command scheduled in
+ * TkMacOSXDispatchMenuEvent.
*
* Results:
* None.
@@ -2121,32 +2039,33 @@ static void
*----------------------------------------------------------------------
*/
-EventuallyInvokeMenu (ClientData data)
+static void
+EventuallyInvokeMenu(
+ ClientData data)
{
- struct MenuCommandHandlerData *realData
- = (struct MenuCommandHandlerData *) data;
+ struct MenuCommandHandlerData *realData =
+ (struct MenuCommandHandlerData *) data;
int code;
code = TkInvokeMenu(realData->menuPtr->interp, realData->menuPtr,
- realData->index);
-
- if (code != TCL_OK && code != TCL_CONTINUE
- && code != TCL_BREAK) {
- Tcl_AddErrorInfo(realData->menuPtr->interp, "\n (menu invoke)");
- Tcl_BackgroundError(realData->menuPtr->interp);
+ realData->index);
+
+ if (code != TCL_OK && code != TCL_CONTINUE && code != TCL_BREAK) {
+ Tcl_AddErrorInfo(realData->menuPtr->interp, "\n (menu invoke)");
+ Tcl_BackgroundError(realData->menuPtr->interp);
}
-
+
Tcl_Release(realData->menuPtr->interp);
Tcl_Release(realData->menuPtr);
}
-
+
/*
*----------------------------------------------------------------------
*
* TkMacOSXDispatchMenuEvent --
*
- * Given a menu id and an item, dispatches the command associated
- * with it.
+ * Given a menu id and an item, dispatches the command associated with
+ * it.
*
* Results:
* None.
@@ -2159,64 +2078,71 @@ EventuallyInvokeMenu (ClientData data)
int
TkMacOSXDispatchMenuEvent(
- int menuID, /* The menu id of the menu we are invoking */
- int index) /* The one-based index of the item that was
- * selected. */
+ int menuID, /* The menu id of the menu we are invoking */
+ int index) /* The one-based index of the item that was
+ * selected. */
{
int result = TCL_OK;
+
if (menuID != 0) {
- if (menuID == kHMHelpMenuID) {
- if (currentMenuBarOwner != NULL) {
- TkMenuReferences *helpMenuRef;
- char *helpMenuName = ckalloc(strlen(currentMenuBarName)
- + strlen(".help") + 1);
- sprintf(helpMenuName, "%s.help", currentMenuBarName);
- helpMenuRef = TkFindMenuReferences(currentMenuBarInterp,
- helpMenuName);
- ckfree(helpMenuName);
- if ((helpMenuRef != NULL) && (helpMenuRef->menuPtr != NULL)) {
+ if (menuID == kHMHelpMenuID) {
+ if (currentMenuBarOwner != NULL) {
+ TkMenuReferences *helpMenuRef;
+ char *helpMenuName = ckalloc(strlen(currentMenuBarName)
+ + strlen(".help") + 1);
+
+ sprintf(helpMenuName, "%s.help", currentMenuBarName);
+ helpMenuRef = TkFindMenuReferences(currentMenuBarInterp,
+ helpMenuName);
+ ckfree(helpMenuName);
+ if ((helpMenuRef != NULL) && (helpMenuRef->menuPtr != NULL)) {
MenuRef outHelpMenu;
MenuItemIndex itemIndex;
int newIndex;
+
HMGetHelpMenu(&outHelpMenu, &itemIndex);
- newIndex = index - itemIndex;
- result = TkInvokeMenu(currentMenuBarInterp,
- helpMenuRef->menuPtr, newIndex);
- }
- }
- } else {
- Tcl_HashEntry *commandEntryPtr =
- Tcl_FindHashEntry(&commandTable, (char *) ((int)menuID));
- if (commandEntryPtr != NULL) {
- TkMenu *menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr);
- if ((currentAppleMenuID == menuID)
- && (index > menuPtr->numEntries + 1)) {
- /*
- * We don't need to do anything here, the standard
- * Application event handler will open the built-in
- * Apple menu item for us.
- */
- result = TCL_OK;
- } else {
- struct MenuCommandHandlerData *data
- = (struct MenuCommandHandlerData *)
- ckalloc(sizeof(struct MenuCommandHandlerData));
- Tcl_Preserve(menuPtr->interp);
- Tcl_Preserve(menuPtr);
- data->menuPtr = menuPtr;
- data->index = index - 1;
- Tcl_DoWhenIdle (EventuallyInvokeMenu,
- (ClientData) data);
- /* result = TkInvokeMenu(menuPtr->interp, menuPtr, index - 1); */
- }
- } else {
- return TCL_ERROR;
- }
+ newIndex = index - itemIndex;
+ result = TkInvokeMenu(currentMenuBarInterp,
+ helpMenuRef->menuPtr, newIndex);
+ }
+ }
+ } else {
+ Tcl_HashEntry *commandEntryPtr =
+ Tcl_FindHashEntry(&commandTable, (char *) ((int)menuID));
+ TkMenu *menuPtr;
+
+ if (commandEntryPtr == NULL) {
+ return TCL_ERROR;
+ }
+
+ menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr);
+
+ if ((currentAppleMenuID == menuID)
+ && (index > menuPtr->numEntries + 1)) {
+ /*
+ * We don't need to do anything here, the standard Application
+ * event handler will open the built-in Apple menu item for
+ * us.
+ */
+
+ result = TCL_OK;
+ } else {
+ struct MenuCommandHandlerData *data =
+ (struct MenuCommandHandlerData *)
+ ckalloc(sizeof(struct MenuCommandHandlerData));
+
+ Tcl_Preserve(menuPtr->interp);
+ Tcl_Preserve(menuPtr);
+ data->menuPtr = menuPtr;
+ data->index = index - 1;
+ Tcl_DoWhenIdle(EventuallyInvokeMenu, (ClientData) data);
+ /* result = TkInvokeMenu(menuPtr->interp, menuPtr, index-1); */
+ }
}
}
return result;
}
-
+
/*
*----------------------------------------------------------------------
*
@@ -2243,9 +2169,8 @@ GetMenuIndicatorGeometry (
int *heightPtr) /* The resulting height */
{
char markChar;
-
+
*heightPtr = fmPtr->linespace;
-
markChar = (char) FindMarkCharacter(mePtr);
*widthPtr = Tk_TextWidth(tkfont, &markChar, 1) + 4;
}
@@ -2268,61 +2193,64 @@ GetMenuIndicatorGeometry (
static void
GetMenuAccelGeometry (
- TkMenu *menuPtr, /* The menu we are measuring */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int *modWidthPtr, /* The width of all of the key
- * modifier symbols. */
- int *textWidthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
+ TkMenu *menuPtr, /* The menu we are measuring */
+ TkMenuEntry *mePtr, /* The entry we are measuring */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated font metrics */
+ int *modWidthPtr, /* The width of all of the key modifier
+ * symbols. */
+ int *textWidthPtr, /* The resulting width */
+ int *heightPtr) /* The resulting height */
{
*heightPtr = fmPtr->linespace;
*modWidthPtr = 0;
if (mePtr->type == CASCADE_ENTRY) {
- *textWidthPtr = SICN_HEIGHT;
- *modWidthPtr = Tk_TextWidth(tkfont, "W", 1);
+ *textWidthPtr = SICN_HEIGHT;
+ *modWidthPtr = Tk_TextWidth(tkfont, "W", 1);
} else if (0 == mePtr->accelLength) {
- *textWidthPtr = 0;
+ *textWidthPtr = 0;
} else {
- char *accel = (mePtr->accelPtr == NULL) ? ""
- : Tcl_GetStringFromObj(mePtr->accelPtr, NULL);
-
- if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) {
- *textWidthPtr = Tk_TextWidth(tkfont, accel, mePtr->accelLength);
- } else {
- int emWidth = Tk_TextWidth(tkfont, "W", 1) + 1;
- if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) {
- int width = Tk_TextWidth(tkfont, accel, mePtr->accelLength);
- *textWidthPtr = emWidth;
- if (width < emWidth) {
- *modWidthPtr = 0;
- } else {
- *modWidthPtr = width - emWidth;
- }
- } else {
- int length = ((EntryGeometry *)mePtr->platformEntryData)
- ->accelTextStart;
- if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) {
- *modWidthPtr += CONTROL_ICON_WIDTH;
- }
- if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) {
- *modWidthPtr += SHIFT_ICON_WIDTH;
- }
- if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) {
- *modWidthPtr += OPTION_ICON_WIDTH;
- }
- if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) {
- *modWidthPtr += COMMAND_ICON_WIDTH;
- }
- if (1 == (mePtr->accelLength - length)) {
- *textWidthPtr = emWidth;
- } else {
- *textWidthPtr += Tk_TextWidth(tkfont, accel
- + length, mePtr->accelLength - length);
- }
- }
- }
+ char *accel = (mePtr->accelPtr == NULL) ? ""
+ : Tcl_GetString(mePtr->accelPtr);
+
+ if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) {
+ *textWidthPtr = Tk_TextWidth(tkfont, accel, mePtr->accelLength);
+ } else {
+ int emWidth = Tk_TextWidth(tkfont, "W", 1) + 1;
+
+ if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) {
+ int width = Tk_TextWidth(tkfont, accel, mePtr->accelLength);
+
+ *textWidthPtr = emWidth;
+ if (width < emWidth) {
+ *modWidthPtr = 0;
+ } else {
+ *modWidthPtr = width - emWidth;
+ }
+ } else {
+ int length = ((EntryGeometry *)mePtr->platformEntryData)
+ ->accelTextStart;
+
+ if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) {
+ *modWidthPtr += CONTROL_ICON_WIDTH;
+ }
+ if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) {
+ *modWidthPtr += SHIFT_ICON_WIDTH;
+ }
+ if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) {
+ *modWidthPtr += OPTION_ICON_WIDTH;
+ }
+ if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) {
+ *modWidthPtr += COMMAND_ICON_WIDTH;
+ }
+ if (1 == (mePtr->accelLength - length)) {
+ *textWidthPtr = emWidth;
+ } else {
+ *textWidthPtr += Tk_TextWidth(tkfont, accel + length,
+ mePtr->accelLength - length);
+ }
+ }
+ }
}
}
@@ -2344,17 +2272,17 @@ GetMenuAccelGeometry (
static void
GetTearoffEntryGeometry (
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int *widthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are measuring */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated font metrics */
+ int *widthPtr, /* The resulting width */
+ int *heightPtr) /* The resulting height */
{
if ((GetResource('MDEF', 591) == NULL) &&
(menuPtr->menuType == MASTER_MENU)) {
- *heightPtr = fmPtr->linespace;
- *widthPtr = 0;
+ *heightPtr = fmPtr->linespace;
+ *widthPtr = 0;
} else {
*widthPtr = *heightPtr = 0;
}
@@ -2378,18 +2306,18 @@ GetTearoffEntryGeometry (
static void
GetMenuSeparatorGeometry(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are measuring */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalcualted font metrics */
- int *widthPtr, /* The resulting width */
- int *heightPtr) /* The resulting height */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are measuring */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalcualted font metrics */
+ int *widthPtr, /* The resulting width */
+ int *heightPtr) /* The resulting height */
{
- SInt16 outHeight;
-
- GetThemeMenuSeparatorHeight(&outHeight);
- *widthPtr = 0;
- *heightPtr = outHeight;
+ SInt16 outHeight;
+
+ GetThemeMenuSeparatorHeight(&outHeight);
+ *widthPtr = 0;
+ *heightPtr = outHeight;
}
/*
@@ -2403,54 +2331,53 @@ GetMenuSeparatorGeometry(
* None.
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
static void
DrawMenuEntryIndicator(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing */
- GC gc, /* The GC we are drawing with */
- GC indicatorGC, /* The GC to use for the indicator */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int x, /* topleft hand corner of entry */
- int y, /* topleft hand corner of entry */
- int width, /* width of entry */
- int height) /* height of entry */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are drawing */
+ Drawable d, /* The drawable we are drawing */
+ GC gc, /* The GC we are drawing with */
+ GC indicatorGC, /* The GC to use for the indicator */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated font metrics */
+ int x, /* topleft hand corner of entry */
+ int y, /* topleft hand corner of entry */
+ int width, /* width of entry */
+ int height) /* height of entry */
{
- if ((mePtr->type == CHECK_BUTTON_ENTRY) ||
- (mePtr->type == RADIO_BUTTON_ENTRY)) {
- if (mePtr->indicatorOn
- && (mePtr->entryFlags & ENTRY_SELECTED)) {
+ if ((mePtr->type == CHECK_BUTTON_ENTRY) ||
+ (mePtr->type == RADIO_BUTTON_ENTRY)) {
+ if (mePtr->indicatorOn && (mePtr->entryFlags & ENTRY_SELECTED)) {
int baseline;
short markShort;
-
- baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
- GetItemMark(((MacMenu *) menuPtr->platformData)->menuHdl,
- mePtr->index + 1, &markShort);
- if (markShort != 0) {
- char markChar;
- char markCharUTF[TCL_UTF_MAX + 1];
+
+ baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
+ GetItemMark(((MacMenu *) menuPtr->platformData)->menuHdl,
+ mePtr->index + 1, &markShort);
+ if (markShort != 0) {
+ char markChar, markCharUTF[TCL_UTF_MAX + 1];
int dstWrote;
-
- markChar = (char) markShort;
- /*
- * Not sure if this is the correct encoding, but this function
- * doesn't appear to be used at all in, since the Carbon Menus
- * draw themselves
- */
- Tcl_ExternalToUtf(NULL, NULL, &markChar, 1, 0, NULL,
+
+ markChar = (char) markShort;
+
+ /*
+ * Not sure if this is the correct encoding, but this function
+ * doesn't appear to be used at all in, since the Carbon Menus
+ * draw themselves
+ */
+
+ Tcl_ExternalToUtf(NULL, NULL, &markChar, 1, 0, NULL,
markCharUTF, TCL_UTF_MAX + 1, NULL, &dstWrote, NULL);
Tk_DrawChars(menuPtr->display, d, gc, tkfont, markCharUTF,
dstWrote, x + 2, baseline);
- }
+ }
}
- }
+ }
}
/*
@@ -2464,17 +2391,16 @@ DrawMenuEntryIndicator(
* Nothing
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
+
static void
DrawMenuBackground(
- Rect *menuRectPtr, /* The menu rect */
+ Rect *menuRectPtr, /* The menu rect */
Drawable d, /* What we are drawing into */
- ThemeMenuType type /* Type of menu */
- )
+ ThemeMenuType type) /* Type of menu */
{
CGrafPtr saveWorld;
GDHandle saveDevice;
@@ -2484,9 +2410,8 @@ DrawMenuBackground(
GetGWorld(&saveWorld, &saveDevice);
SetGWorld(destPort, NULL);
TkMacOSXSetUpClippingRgn(d);
- DrawThemeMenuBackground (menuRectPtr, type);
- SetGWorld(saveWorld, saveDevice);
- return;
+ DrawThemeMenuBackground(menuRectPtr, type);
+ SetGWorld(saveWorld, saveDevice);
}
/*
@@ -2494,71 +2419,70 @@ DrawMenuBackground(
*
* DrawSICN --
*
- * Given a resource id and an index, loads the appropriate SICN
- * and draws it into a given drawable using the given gc.
+ * Given a resource id and an index, loads the appropriate SICN and draws
+ * it into a given drawable using the given gc.
*
* Results:
* Returns 1 if the SICN was found, 0 if not found.
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
+
static int
DrawSICN(
- int resourceID, /* The resource # of the SICN table */
- int index, /* The index into the SICN table of the
- * icon we want. */
- Drawable d, /* What we are drawing into */
- GC gc, /* The GC to draw with */
- int x, /* The left hand coord of the SICN */
- int y) /* The top coord of the SICN */
+ int resourceID, /* The resource # of the SICN table */
+ int index, /* The index into the SICN table of the icon
+ * we want. */
+ Drawable d, /* What we are drawing into */
+ GC gc, /* The GC to draw with */
+ int x, /* The left hand coord of the SICN */
+ int y) /* The top coord of the SICN */
{
Handle sicnHandle = (Handle) GetResource('SICN', SICN_RESOURCE_NUMBER);
-
+ BitMap sicnBitmap;
+ Rect destRect;
+ CGrafPtr saveWorld;
+ GDHandle saveDevice;
+ GWorldPtr destPort;
+ const BitMap *destBitMap;
+ RGBColor origForeColor, origBackColor, foreColor, backColor;
+
if (NULL == sicnHandle) {
- return 0;
- } else {
- BitMap sicnBitmap;
- Rect destRect;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
- const BitMap *destBitMap;
- RGBColor origForeColor, origBackColor, foreColor, backColor;
-
- HLock(sicnHandle);
- destPort = TkMacOSXGetDrawablePort(d);
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacOSXSetUpClippingRgn(d);
- TkMacOSXSetUpGraphicsPort(gc, destPort);
- GetForeColor(&origForeColor);
- GetBackColor(&origBackColor);
-
- if (TkSetMacColor(gc->foreground, &foreColor)) {
- RGBForeColor(&foreColor);
- }
-
- if (TkSetMacColor(gc->background, &backColor)) {
- RGBBackColor(&backColor);
- }
+ return 0;
+ }
- SetRect(&destRect, x, y, x + SICN_HEIGHT, y + SICN_HEIGHT);
- sicnBitmap.baseAddr = (Ptr) (*sicnHandle) + index * SICN_HEIGHT
- * SICN_ROWS;
- sicnBitmap.rowBytes = SICN_ROWS;
- SetRect(&sicnBitmap.bounds, 0, 0, 16, 16);
- destBitMap = GetPortBitMapForCopyBits(destPort);
- CopyBits(&sicnBitmap, destBitMap, &sicnBitmap.bounds, &destRect, GetPortTextMode(destPort), NULL);
- HUnlock(sicnHandle);
- RGBForeColor(&origForeColor);
- RGBBackColor(&origBackColor);
- SetGWorld(saveWorld, saveDevice);
- return 1;
+ HLock(sicnHandle);
+ destPort = TkMacOSXGetDrawablePort(d);
+ GetGWorld(&saveWorld, &saveDevice);
+ SetGWorld(destPort, NULL);
+ TkMacOSXSetUpClippingRgn(d);
+ TkMacOSXSetUpGraphicsPort(gc, destPort);
+ GetForeColor(&origForeColor);
+ GetBackColor(&origBackColor);
+
+ if (TkSetMacColor(gc->foreground, &foreColor)) {
+ RGBForeColor(&foreColor);
}
+
+ if (TkSetMacColor(gc->background, &backColor)) {
+ RGBBackColor(&backColor);
+ }
+
+ SetRect(&destRect, x, y, x + SICN_HEIGHT, y + SICN_HEIGHT);
+ sicnBitmap.baseAddr = (Ptr) (*sicnHandle) + index*SICN_HEIGHT*SICN_ROWS;
+ sicnBitmap.rowBytes = SICN_ROWS;
+ SetRect(&sicnBitmap.bounds, 0, 0, 16, 16);
+ destBitMap = GetPortBitMapForCopyBits(destPort);
+ CopyBits(&sicnBitmap, destBitMap, &sicnBitmap.bounds, &destRect,
+ GetPortTextMode(destPort), NULL);
+ HUnlock(sicnHandle);
+ RGBForeColor(&origForeColor);
+ RGBBackColor(&origBackColor);
+ SetGWorld(saveWorld, saveDevice);
+ return 1;
}
/*
@@ -2566,93 +2490,90 @@ DrawSICN(
*
* DrawMenuEntryAccelerator --
*
- * This procedure draws the accelerator part of a menu. We
- * need to decide what to draw here. Should we replace strings
- * like "Control", "Command", etc?
+ * This procedure draws the accelerator part of a menu. We need to decide
+ * what to draw here. Should we replace strings like "Control",
+ * "Command", etc?
*
* Results:
* None.
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
static void
DrawMenuEntryAccelerator(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing in */
- GC gc, /* The gc to draw into */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- Tk_3DBorder activeBorder, /* border for menu background */
- int x, /* The left side of the entry */
- int y, /* The top of the entry */
- int width, /* The width of the entry */
- int height, /* The height of the entry */
- int drawArrow) /* Whether or not to draw cascade arrow */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are drawing */
+ Drawable d, /* The drawable we are drawing in */
+ GC gc, /* The gc to draw into */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated font metrics */
+ Tk_3DBorder activeBorder, /* border for menu background */
+ int x, /* The left side of the entry */
+ int y, /* The top of the entry */
+ int width, /* The width of the entry */
+ int height, /* The height of the entry */
+ int drawArrow) /* Whether or not to draw cascade arrow */
{
int activeBorderWidth;
-
+
Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->activeBorderWidthPtr,
- &activeBorderWidth);
+ &activeBorderWidth);
if (mePtr->type == CASCADE_ENTRY) {
- /*
- * Under Appearance, we let the Appearance Manager draw the icon
- */
-
+ /*
+ * Under Appearance, we let the Appearance Manager draw the icon
+ */
} else if (mePtr->accelLength != 0) {
- int leftEdge = x + width;
- int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
- char *accel;
-
- accel = Tcl_GetStringFromObj(mePtr->accelPtr, NULL);
+ int leftEdge = x + width;
+ int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
+ char *accel = Tcl_GetString(mePtr->accelPtr);
if (NULL == GetResource('SICN', SICN_RESOURCE_NUMBER)) {
leftEdge -= ((EntryGeometry *) mePtr->platformEntryData)
- ->accelTextWidth;
+ ->accelTextWidth;
Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel,
- mePtr->accelLength, leftEdge, baseline);
+ mePtr->accelLength, leftEdge, baseline);
} else {
- EntryGeometry *geometryPtr =
- (EntryGeometry *) mePtr->platformEntryData;
+ EntryGeometry *geometryPtr =
+ (EntryGeometry *) mePtr->platformEntryData;
int length = mePtr->accelLength - geometryPtr->accelTextStart;
-
+
leftEdge -= geometryPtr->accelTextWidth;
if ((mePtr->entryFlags & ENTRY_ACCEL_MASK) == 0) {
- leftEdge -= geometryPtr->modifierWidth;
+ leftEdge -= geometryPtr->modifierWidth;
}
-
- Tk_DrawChars(menuPtr->display, d, gc, tkfont, accel
- + geometryPtr->accelTextStart, length, leftEdge, baseline);
+
+ Tk_DrawChars(menuPtr->display, d, gc, tkfont,
+ accel + geometryPtr->accelTextStart, length, leftEdge,
+ baseline);
if (mePtr->entryFlags & ENTRY_COMMAND_ACCEL) {
- leftEdge -= COMMAND_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, COMMAND_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
+ leftEdge -= COMMAND_ICON_WIDTH;
+ DrawSICN(SICN_RESOURCE_NUMBER, COMMAND_ICON, d, gc, leftEdge,
+ (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
}
if (mePtr->entryFlags & ENTRY_OPTION_ACCEL) {
- leftEdge -= OPTION_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, OPTION_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
+ leftEdge -= OPTION_ICON_WIDTH;
+ DrawSICN(SICN_RESOURCE_NUMBER, OPTION_ICON, d, gc, leftEdge,
+ (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
}
if (mePtr->entryFlags & ENTRY_SHIFT_ACCEL) {
- leftEdge -= SHIFT_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, SHIFT_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
+ leftEdge -= SHIFT_ICON_WIDTH;
+ DrawSICN(SICN_RESOURCE_NUMBER, SHIFT_ICON, d, gc, leftEdge,
+ (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
}
if (mePtr->entryFlags & ENTRY_CONTROL_ACCEL) {
- leftEdge -= CONTROL_ICON_WIDTH;
- DrawSICN(SICN_RESOURCE_NUMBER, CONTROL_ICON, d, gc,
- leftEdge, (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
+ leftEdge -= CONTROL_ICON_WIDTH;
+ DrawSICN(SICN_RESOURCE_NUMBER, CONTROL_ICON, d, gc, leftEdge,
+ (y + (height / 2)) - (SICN_HEIGHT / 2) - 1);
}
- }
+ }
}
}
@@ -2667,30 +2588,29 @@ DrawMenuEntryAccelerator(
* None.
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
static void
DrawMenuSeparator(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing into */
- GC gc, /* The gc we are drawing with */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int x, /* left coordinate of entry */
- int y, /* top coordinate of entry */
- int width, /* width of entry */
- int height) /* height of entry */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are drawing */
+ Drawable d, /* The drawable we are drawing into */
+ GC gc, /* The gc we are drawing with */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated font metrics */
+ int x, /* left coordinate of entry */
+ int y, /* top coordinate of entry */
+ int width, /* width of entry */
+ int height) /* height of entry */
{
CGrafPtr saveWorld;
GDHandle saveDevice;
GWorldPtr destPort;
Rect r;
-
+
destPort = TkMacOSXGetDrawablePort(d);
GetGWorld(&saveWorld, &saveDevice);
SetGWorld(destPort, NULL);
@@ -2699,17 +2619,17 @@ DrawMenuSeparator(
r.left = x;
r.bottom = y + height;
r.right = x + width;
-
+
DrawThemeMenuSeparator(&r);
}
/*
*----------------------------------------------------------------------
*
- * AppearanceEntryDrawWrapper --
+ * AppearanceEntryDrawWrapper --
*
- * It routes to the Appearance Managers DrawThemeEntry, which will
- * then call us back after setting up the drawing context.
+ * It routes to the Appearance Managers DrawThemeEntry, which will then
+ * call us back after setting up the drawing context.
*
* Results:
* A menu entry is drawn
@@ -2719,17 +2639,18 @@ DrawMenuSeparator(
*
*----------------------------------------------------------------------
*/
-static void
+
+static void
AppearanceEntryDrawWrapper(
TkMenuEntry *mePtr,
Rect *menuRectPtr,
- MenuTrackingData *mtdPtr,
+ MenuTrackingData *mtdPtr,
Drawable d,
- Tk_FontMetrics *fmPtr,
- Tk_Font tkfont,
- int x,
- int y,
- int width,
+ Tk_FontMetrics *fmPtr,
+ Tk_Font tkfont,
+ int x,
+ int y,
+ int width,
int height)
{
MenuEntryUserData meData;
@@ -2746,32 +2667,30 @@ AppearanceEntryDrawWrapper(
itemRect.left = x;
itemRect.bottom = itemRect.top + height;
itemRect.right = itemRect.left + width;
-
+
if (mePtr->state == ENTRY_ACTIVE) {
- theState = kThemeMenuSelected;
+ theState = kThemeMenuSelected;
} else if (mePtr->state == ENTRY_DISABLED) {
- theState = kThemeMenuDisabled;
+ theState = kThemeMenuDisabled;
} else {
- theState = kThemeMenuActive;
+ theState = kThemeMenuActive;
}
-
+
if (mePtr->type == CASCADE_ENTRY) {
- theType = kThemeMenuItemHierarchical;
+ theType = kThemeMenuItemHierarchical;
} else {
- theType = kThemeMenuItemPlain;
+ theType = kThemeMenuItemPlain;
}
-
- DrawThemeMenuItem (menuRectPtr, &itemRect,
- mtdPtr->virtualMenuTop, mtdPtr->virtualMenuBottom, theState,
- theType, tkThemeMenuItemDrawingUPP,
- (unsigned long) &meData);
-
+
+ DrawThemeMenuItem (menuRectPtr, &itemRect, mtdPtr->virtualMenuTop,
+ mtdPtr->virtualMenuBottom, theState, theType,
+ tkThemeMenuItemDrawingUPP, (unsigned long) &meData);
}
/*
*----------------------------------------------------------------------
*
- * ThemeMenuItemDrawingProc --
+ * ThemeMenuItemDrawingProc --
*
* This routine is called from the Appearance DrawThemeMenuEntry
*
@@ -2783,27 +2702,28 @@ AppearanceEntryDrawWrapper(
*
*----------------------------------------------------------------------
*/
+
static pascal void
-ThemeMenuItemDrawingProc (
+ThemeMenuItemDrawingProc(
const Rect *inBounds,
- SInt16 inDepth,
- Boolean inIsColorDevice,
+ SInt16 inDepth,
+ Boolean inIsColorDevice,
SInt32 inUserData)
{
MenuEntryUserData *meData = (MenuEntryUserData *) inUserData;
- TkpDrawMenuEntry(meData->mePtr, meData->mdefDrawable,
- meData->tkfont, meData->fmPtr, inBounds->left,
- inBounds->top, inBounds->right - inBounds->left,
- inBounds->bottom - inBounds->top, 0, 1);
+
+ TkpDrawMenuEntry(meData->mePtr, meData->mdefDrawable, meData->tkfont,
+ meData->fmPtr, inBounds->left, inBounds->top,
+ inBounds->right-inBounds->left,inBounds->bottom-inBounds->top,0,1);
}
/*
*----------------------------------------------------------------------
*
- * TkMacOSXHandleTearoffMenu() --
+ * TkMacOSXHandleTearoffMenu --
*
- * This routine sees if the MDEF has set a menu and a mouse position
- * for tearing off and makes a tearoff menu if it has.
+ * This routine sees if the MDEF has set a menu and a mouse position for
+ * tearing off and makes a tearoff menu if it has.
*
* Results:
* menuPtr->interp will have the result of the tearoff command.
@@ -2818,18 +2738,17 @@ void
TkMacOSXHandleTearoffMenu(void)
{
if (tearoffStruct.menuPtr != NULL) {
- Tcl_DString tearoffCmdStr;
- char intString[TCL_INTEGER_SPACE];
- short windowPart;
- WindowRef whichWindow;
-
- windowPart = FindWindow(tearoffStruct.point, &whichWindow);
-
- if (windowPart != inMenuBar) {
- Tcl_DStringInit(&tearoffCmdStr);
- Tcl_DStringAppendElement(&tearoffCmdStr, "tkTearOffMenu");
- Tcl_DStringAppendElement(&tearoffCmdStr,
- Tk_PathName(tearoffStruct.menuPtr->tkwin));
+ WindowRef whichWindow;
+ short windowPart = FindWindow(tearoffStruct.point, &whichWindow);
+
+ if (windowPart != inMenuBar) {
+ char intString[TCL_INTEGER_SPACE];
+ Tcl_DString tearoffCmdStr;
+
+ Tcl_DStringInit(&tearoffCmdStr);
+ Tcl_DStringAppendElement(&tearoffCmdStr, "tkTearOffMenu");
+ Tcl_DStringAppendElement(&tearoffCmdStr,
+ Tk_PathName(tearoffStruct.menuPtr->tkwin));
sprintf(intString, "%d", tearoffStruct.point.h);
Tcl_DStringAppendElement(&tearoffCmdStr, intString);
sprintf(intString, "%d", tearoffStruct.point.v);
@@ -2847,24 +2766,25 @@ TkMacOSXHandleTearoffMenu(void)
*
* TkpInitializeMenuBindings --
*
- * For every interp, initializes the bindings for Windows
- * menus. Does nothing on Mac or XWindows.
+ * For every interp, initializes the bindings for Windows menus. Does
+ * nothing on Mac or XWindows.
*
* Results:
* None.
*
* Side effects:
- * C-level bindings are setup for the interp which will
- * handle Alt-key sequences for menus without beeping
- * or interfering with user-defined Alt-key bindings.
+ * C-level bindings are setup for the interp which will handle Alt-key
+ * sequences for menus without beeping or interfering with user-defined
+ * Alt-key bindings.
*
*--------------------------------------------------------------
*/
void
-TkpInitializeMenuBindings(interp, bindingTable)
- Tcl_Interp *interp; /* The interpreter to set. */
- Tk_BindingTable bindingTable; /* The table to add to. */
+TkpInitializeMenuBindings(
+ Tcl_Interp *interp, /* The interpreter to set. */
+ Tk_BindingTable bindingTable)
+ /* The table to add to. */
{
/*
* Nothing to do.
@@ -2876,23 +2796,22 @@ TkpInitializeMenuBindings(interp, bindingTable)
*
* TkpComputeMenubarGeometry --
*
- * This procedure is invoked to recompute the size and
- * layout of a menu that is a menubar clone.
+ * This procedure is invoked to recompute the size and layout of a menu
+ * that is a menubar clone.
*
* Results:
* None.
*
* Side effects:
- * Fields of menu entries are changed to reflect their
- * current positions, and the size of the menu window
- * itself may be changed.
+ * Fields of menu entries are changed to reflect their current positions,
+ * and the size of the menu window itself may be changed.
*
*--------------------------------------------------------------
*/
void
-TkpComputeMenubarGeometry(menuPtr)
- TkMenu *menuPtr; /* Structure describing menu. */
+TkpComputeMenubarGeometry(
+ TkMenu *menuPtr) /* Structure describing menu. */
{
TkpComputeStandardMenuGeometry(menuPtr);
}
@@ -2908,24 +2827,23 @@ TkpComputeMenubarGeometry(menuPtr)
* None.
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
void
DrawTearoffEntry(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* The drawable we are drawing into */
- GC gc, /* The gc we are drawing with */
- Tk_Font tkfont, /* The font we are drawing with */
- CONST Tk_FontMetrics *fmPtr, /* The metrics we are drawing with */
- int x, /* Left edge of entry. */
- int y, /* Top edge of entry. */
- int width, /* Width of entry. */
- int height) /* Height of entry. */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are drawing */
+ Drawable d, /* The drawable we are drawing into */
+ GC gc, /* The gc we are drawing with */
+ Tk_Font tkfont, /* The font we are drawing with */
+ CONST Tk_FontMetrics *fmPtr,/* The metrics we are drawing with */
+ int x, /* Left edge of entry. */
+ int y, /* Top edge of entry. */
+ int width, /* Width of entry. */
+ int height) /* Height of entry. */
{
XPoint points[2];
int margin, segmentWidth, maxX;
@@ -2934,13 +2852,13 @@ DrawTearoffEntry(
if (menuPtr->menuType != MASTER_MENU ) {
return;
}
-
+
margin = (fmPtr->ascent + fmPtr->descent)/2;
points[0].x = x;
points[0].y = y + height/2;
points[1].y = points[0].y;
segmentWidth = 6;
- maxX = width - 1;
+ maxX = width - 1;
border = Tk_Get3DBorderFromObj(menuPtr->tkwin, menuPtr->borderPtr);
while (points[0].x < maxX) {
@@ -2959,12 +2877,10 @@ DrawTearoffEntry(
*
* TkMacOSXSetHelpMenuItemCount --
*
- * Has to be called after the first call to InsertMenu. Sets
- * up the global variable for the number of items in the
- * unmodified help menu.
- * NB. Nobody uses this any more, since you can get the number
- * of system help items from HMGetHelpMenu trivially.
- * But it is in the stubs table...
+ * Has to be called after the first call to InsertMenu. Sets up the
+ * global variable for the number of items in the unmodified help menu.
+ * NB. Nobody uses this any more, since you can get the number of system
+ * help items from HMGetHelpMenu trivially. But it is in the stubs table.
*
* Results:
* None.
@@ -2975,8 +2891,8 @@ DrawTearoffEntry(
*----------------------------------------------------------------------
*/
-void
-TkMacOSXSetHelpMenuItemCount()
+void
+TkMacOSXSetHelpMenuItemCount(void)
{
}
@@ -2997,26 +2913,26 @@ TkMacOSXSetHelpMenuItemCount()
*/
void
-TkMacOSXMenuClick()
+TkMacOSXMenuClick(void)
{
TkMenu *menuPtr;
TkMenuReferences *menuRefPtr;
-
+
if ((currentMenuBarInterp != NULL) && (currentMenuBarName != NULL)) {
- menuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- for (menuPtr = menuRefPtr->menuPtr->masterMenuPtr;
- menuPtr != NULL; menuPtr = menuPtr->nextInstancePtr) {
- if (menuPtr->menuType == MENUBAR) {
- CompleteIdlers(menuPtr);
- break;
- }
- }
+ menuRefPtr = TkFindMenuReferences(currentMenuBarInterp,
+ currentMenuBarName);
+ for (menuPtr = menuRefPtr->menuPtr->masterMenuPtr;
+ menuPtr != NULL; menuPtr = menuPtr->nextInstancePtr) {
+ if (menuPtr->menuType == MENUBAR) {
+ CompleteIdlers(menuPtr);
+ break;
+ }
+ }
}
-
+
if (menuBarFlags & MENUBAR_REDRAW_PENDING) {
- Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL);
- DrawMenuBarWhenIdle((ClientData *) NULL);
+ Tcl_CancelIdleCall(DrawMenuBarWhenIdle, (ClientData *) NULL);
+ DrawMenuBarWhenIdle((ClientData *) NULL);
}
}
@@ -3039,19 +2955,19 @@ TkMacOSXMenuClick()
void
TkpDrawMenuEntry(
- TkMenuEntry *mePtr, /* The entry to draw */
- Drawable d, /* What to draw into */
- Tk_Font tkfont, /* Precalculated font for menu */
+ TkMenuEntry *mePtr, /* The entry to draw */
+ Drawable d, /* What to draw into */
+ Tk_Font tkfont, /* Precalculated font for menu */
CONST Tk_FontMetrics *menuMetricsPtr,
- /* Precalculated metrics for menu */
- int x, /* X-coordinate of topleft of entry */
- int y, /* Y-coordinate of topleft of entry */
- int width, /* Width of the entry rectangle */
- int height, /* Height of the current rectangle */
- int strictMotif, /* Boolean flag */
- int drawArrow) /* Whether or not to draw the cascade
- * arrow for cascade items. Only applies
- * to Windows. */
+ /* Precalculated metrics for menu */
+ int x, /* X-coordinate of topleft of entry */
+ int y, /* Y-coordinate of topleft of entry */
+ int width, /* Width of the entry rectangle */
+ int height, /* Height of the current rectangle */
+ int strictMotif, /* Boolean flag */
+ int drawArrow) /* Whether or not to draw the cascade arrow
+ * for cascade items. Only applies to
+ * Windows. */
{
GC gc;
TkMenu *menuPtr = mePtr->menuPtr;
@@ -3064,33 +2980,33 @@ TkpDrawMenuEntry(
int adjustedHeight = height - 2 * padY;
/*
- * Choose the gc for drawing the foreground part of the entry.
- * Under Appearance, we pass a null (appearanceGC) to tell
- * ourselves not to change whatever color the appearance manager has set.
+ * Choose the gc for drawing the foreground part of the entry. Under
+ * Appearance, we pass a null (appearanceGC) to tell ourselves not to
+ * change whatever color the appearance manager has set.
*/
if ((mePtr->state == ENTRY_ACTIVE) && !strictMotif) {
gc = mePtr->activeGC;
if (gc == NULL) {
- gc = menuPtr->activeGC;
+ gc = menuPtr->activeGC;
}
} else {
- TkMenuEntry *cascadeEntryPtr;
- int parentDisabled = 0;
-
- for (cascadeEntryPtr = menuPtr->menuRefPtr->parentEntryPtr;
- cascadeEntryPtr != NULL;
- cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) {
- char *name = (cascadeEntryPtr->namePtr == NULL) ? ""
- : Tcl_GetStringFromObj(cascadeEntryPtr->namePtr, NULL);
-
- if (strcmp(name, Tk_PathName(menuPtr->tkwin)) == 0) {
- if (cascadeEntryPtr->state == ENTRY_DISABLED) {
- parentDisabled = 1;
- }
- break;
- }
- }
+ TkMenuEntry *cascadeEntryPtr;
+ int parentDisabled = 0;
+
+ for (cascadeEntryPtr = menuPtr->menuRefPtr->parentEntryPtr;
+ cascadeEntryPtr != NULL;
+ cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) {
+ char *name = (cascadeEntryPtr->namePtr == NULL) ? ""
+ : Tcl_GetString(cascadeEntryPtr->namePtr);
+
+ if (strcmp(name, Tk_PathName(menuPtr->tkwin)) == 0) {
+ if (cascadeEntryPtr->state == ENTRY_DISABLED) {
+ parentDisabled = 1;
+ }
+ break;
+ }
+ }
if (((parentDisabled || (mePtr->state == ENTRY_DISABLED)))
&& (menuPtr->disabledFgPtr != NULL)) {
@@ -3103,9 +3019,9 @@ TkpDrawMenuEntry(
if (gc == NULL) {
gc = menuPtr->textGC;
}
- }
+ }
}
-
+
indicatorGC = mePtr->indicatorGC;
if (indicatorGC == NULL) {
indicatorGC = menuPtr->indicatorGC;
@@ -3131,22 +3047,22 @@ TkpDrawMenuEntry(
}
/*
- * Need to draw the entire background, including padding. On Unix,
- * for menubars, we have to draw the rest of the entry taking
- * into account the padding.
+ * Need to draw the entire background, including padding. On Unix, for
+ * menubars, we have to draw the rest of the entry taking into account the
+ * padding.
*/
-
- DrawMenuEntryBackground(menuPtr, mePtr, d, activeBorder,
- bgBorder, x, y, width, height);
-
+
+ DrawMenuEntryBackground(menuPtr, mePtr, d, activeBorder, bgBorder, x, y,
+ width, height);
+
if (mePtr->type == SEPARATOR_ENTRY) {
- DrawMenuSeparator(menuPtr, mePtr, d, gc, tkfont,
+ DrawMenuSeparator(menuPtr, mePtr, d, gc, tkfont,
fmPtr, x, adjustedY, width, adjustedHeight);
} else if (mePtr->type == TEAROFF_ENTRY) {
DrawTearoffEntry(menuPtr, mePtr, d, gc, tkfont, fmPtr, x, adjustedY,
width, adjustedHeight);
} else {
- DrawMenuEntryLabel(menuPtr, mePtr, d, gc, tkfont, fmPtr, x,
+ DrawMenuEntryLabel(menuPtr, mePtr, d, gc, tkfont, fmPtr, x,
adjustedY, width, adjustedHeight);
DrawMenuEntryAccelerator(menuPtr, mePtr, d, gc, tkfont, fmPtr,
activeBorder, x, adjustedY, width, adjustedHeight, drawArrow);
@@ -3154,7 +3070,6 @@ TkpDrawMenuEntry(
DrawMenuEntryIndicator(menuPtr, mePtr, d, gc, indicatorGC, tkfont,
fmPtr, x, adjustedY, width, adjustedHeight);
}
-
}
}
@@ -3163,16 +3078,15 @@ TkpDrawMenuEntry(
*
* TkpComputeStandardMenuGeometry --
*
- * This procedure is invoked to recompute the size and
- * layout of a menu that is not a menubar clone.
+ * This procedure is invoked to recompute the size and layout of a menu
+ * that is not a menubar clone.
*
* Results:
* None.
*
* Side effects:
- * Fields of menu entries are changed to reflect their
- * current positions, and the size of the menu window
- * itself may be changed.
+ * Fields of menu entries are changed to reflect their current positions,
+ * and the size of the menu window itself may be changed.
*
*--------------------------------------------------------------
*/
@@ -3190,15 +3104,15 @@ TkpComputeStandardMenuGeometry(
int entryWidth, maxIndicatorSpace, borderWidth, activeBorderWidth;
TkMenuEntry *mePtr, *columnEntryPtr;
EntryGeometry *geometryPtr;
-
+
if (menuPtr->tkwin == NULL) {
return;
}
Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->borderWidthPtr,
- &borderWidth);
+ &borderWidth);
Tk_GetPixelsFromObj(NULL, menuPtr->tkwin, menuPtr->activeBorderWidthPtr,
- &activeBorderWidth);
+ &activeBorderWidth);
x = y = borderWidth;
indicatorSpace = labelWidth = accelWidth = maxAccelTextWidth = 0;
windowHeight = windowWidth = maxWidth = lastColumnBreak = 0;
@@ -3207,14 +3121,13 @@ TkpComputeStandardMenuGeometry(
maxIndicatorSpace = 0;
/*
- * On the Mac especially, getting font metrics can be quite slow,
- * so we want to do it intelligently. We are going to precalculate
- * them and pass them down to all of the measuring and drawing
- * routines. We will measure the font metrics of the menu once.
- * If an entry does not have its own font set, then we give
- * the geometry/drawing routines the menu's font and metrics.
- * If an entry has its own font, we will measure that font and
- * give all of the geometry/drawing the entry's font and metrics.
+ * On the Mac especially, getting font metrics can be quite slow, so we
+ * want to do it intelligently. We are going to precalculate them and pass
+ * them down to all of the measuring and drawing routines. We will measure
+ * the font metrics of the menu once. If an entry does not have its own
+ * font set, then we give the geometry/drawing routines the menu's font
+ * and metrics. If an entry has its own font, we will measure that font
+ * and give all of the geometry/drawing the entry's font and metrics.
*/
menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
@@ -3225,23 +3138,23 @@ TkpComputeStandardMenuGeometry(
if (mePtr->fontPtr == NULL) {
tkfont = menuFont;
fmPtr = &menuMetrics;
- } else {
+ } else {
tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
-
+ Tk_GetFontMetrics(tkfont, &entryMetrics);
+ fmPtr = &entryMetrics;
+ }
+
if ((i > 0) && mePtr->columnBreak) {
if (maxIndicatorSpace != 0) {
maxIndicatorSpace += 2;
}
for (j = lastColumnBreak; j < i; j++) {
- columnEntryPtr = menuPtr->entries[j];
- geometryPtr =
- (EntryGeometry *) columnEntryPtr->platformEntryData;
-
- columnEntryPtr->indicatorSpace = maxIndicatorSpace;
- columnEntryPtr->width = maxIndicatorSpace + maxWidth
+ columnEntryPtr = menuPtr->entries[j];
+ geometryPtr = (EntryGeometry *)
+ columnEntryPtr->platformEntryData;
+
+ columnEntryPtr->indicatorSpace = maxIndicatorSpace;
+ columnEntryPtr->width = maxIndicatorSpace + maxWidth
+ 2 * activeBorderWidth;
geometryPtr->accelTextWidth = maxAccelTextWidth;
geometryPtr->modifierWidth = maxModifierWidth;
@@ -3249,14 +3162,15 @@ TkpComputeStandardMenuGeometry(
columnEntryPtr->entryFlags &= ~ENTRY_LAST_COLUMN;
if (maxEntryWithoutAccelWidth > maxEntryWithAccelWidth) {
geometryPtr->nonAccelMargin = maxEntryWithoutAccelWidth
- - maxEntryWithAccelWidth;
+ - maxEntryWithAccelWidth;
if (geometryPtr->nonAccelMargin > maxNonAccelMargin) {
- geometryPtr->nonAccelMargin = maxNonAccelMargin;
+ geometryPtr->nonAccelMargin = maxNonAccelMargin;
}
} else {
geometryPtr->nonAccelMargin = 0;
- }
+ }
}
+
x += maxIndicatorSpace + maxWidth + 2 * borderWidth;
windowWidth = x;
maxWidth = maxIndicatorSpace = maxAccelTextWidth = 0;
@@ -3268,88 +3182,86 @@ TkpComputeStandardMenuGeometry(
if (mePtr->type == SEPARATOR_ENTRY) {
GetMenuSeparatorGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &entryWidth, &height);
+ fmPtr, &entryWidth, &height);
mePtr->height = height;
} else if (mePtr->type == TEAROFF_ENTRY) {
- GetTearoffEntryGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &entryWidth, &height);
+ GetTearoffEntryGeometry(menuPtr, mePtr, tkfont,
+ fmPtr, &entryWidth, &height);
mePtr->height = height;
} else {
/*
- * For each entry, compute the height required by that
- * particular entry, plus three widths: the width of the
- * label, the width to allow for an indicator to be displayed
- * to the left of the label (if any), and the width of the
- * accelerator to be displayed to the right of the label
- * (if any). These sizes depend, of course, on the type
- * of the entry.
+ * For each entry, compute the height required by that particular
+ * entry, plus three widths: the width of the label, the width to
+ * allow for an indicator to be displayed to the left of the label
+ * (if any), and the width of the accelerator to be displayed to
+ * the right of the label (if any). These sizes depend, of course,
+ * on the type of the entry.
*/
-
- GetMenuLabelGeometry(mePtr, tkfont, fmPtr, &labelWidth,
- &height);
+
+ GetMenuLabelGeometry(mePtr, tkfont, fmPtr, &labelWidth, &height);
mePtr->height = height;
-
+
if (mePtr->type == CASCADE_ENTRY) {
- GetMenuAccelGeometry(menuPtr, mePtr, tkfont, fmPtr,
- &modifierWidth, &accelWidth, &height);
- nonAccelMargin = 0;
+ GetMenuAccelGeometry(menuPtr, mePtr, tkfont, fmPtr,
+ &modifierWidth, &accelWidth, &height);
+ nonAccelMargin = 0;
} else if (mePtr->accelLength == 0) {
- nonAccelMargin = mePtr->hideMargin ? 0
- : Tk_TextWidth(tkfont, "m", 1);
- accelWidth = modifierWidth = 0;
+ nonAccelMargin = mePtr->hideMargin ? 0
+ : Tk_TextWidth(tkfont, "m", 1);
+ accelWidth = modifierWidth = 0;
} else {
- labelWidth += Tk_TextWidth(tkfont, "m", 1);
- GetMenuAccelGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &modifierWidth, &accelWidth, &height);
- if (height > mePtr->height) {
- mePtr->height = height;
- }
- nonAccelMargin = 0;
+ labelWidth += Tk_TextWidth(tkfont, "m", 1);
+ GetMenuAccelGeometry(menuPtr, mePtr, tkfont, fmPtr,
+ &modifierWidth, &accelWidth, &height);
+ if (height > mePtr->height) {
+ mePtr->height = height;
+ }
+ nonAccelMargin = 0;
}
if (!(mePtr->hideMargin)) {
- GetMenuIndicatorGeometry(menuPtr, mePtr, tkfont,
- fmPtr, &indicatorSpace, &height);
- if (height > mePtr->height) {
- mePtr->height = height;
- }
+ GetMenuIndicatorGeometry(menuPtr, mePtr, tkfont, fmPtr,
+ &indicatorSpace, &height);
+ if (height > mePtr->height) {
+ mePtr->height = height;
+ }
} else {
- indicatorSpace = 0;
+ indicatorSpace = 0;
}
if (nonAccelMargin > maxNonAccelMargin) {
- maxNonAccelMargin = nonAccelMargin;
+ maxNonAccelMargin = nonAccelMargin;
}
if (accelWidth > maxAccelTextWidth) {
- maxAccelTextWidth = accelWidth;
+ maxAccelTextWidth = accelWidth;
}
if (modifierWidth > maxModifierWidth) {
- maxModifierWidth = modifierWidth;
+ maxModifierWidth = modifierWidth;
}
if (indicatorSpace > maxIndicatorSpace) {
- maxIndicatorSpace = indicatorSpace;
+ maxIndicatorSpace = indicatorSpace;
}
entryWidth = labelWidth + modifierWidth + accelWidth
+ nonAccelMargin;
if (entryWidth > maxWidth) {
- maxWidth = entryWidth;
+ maxWidth = entryWidth;
}
-
+
if (mePtr->accelLength > 0) {
- if (entryWidth > maxEntryWithAccelWidth) {
- maxEntryWithAccelWidth = entryWidth;
- }
+ if (entryWidth > maxEntryWithAccelWidth) {
+ maxEntryWithAccelWidth = entryWidth;
+ }
} else {
- if (entryWidth > maxEntryWithoutAccelWidth) {
- maxEntryWithoutAccelWidth = entryWidth;
- }
+ if (entryWidth > maxEntryWithoutAccelWidth) {
+ maxEntryWithoutAccelWidth = entryWidth;
+ }
}
-
+
mePtr->height += 2 * activeBorderWidth;
- }
- mePtr->y = y;
+ }
+ mePtr->y = y;
y += menuPtr->entries[i]->height + borderWidth;
if (y > windowHeight) {
windowHeight = y;
@@ -3357,11 +3269,11 @@ TkpComputeStandardMenuGeometry(
}
for (j = lastColumnBreak; j < menuPtr->numEntries; j++) {
- columnEntryPtr = menuPtr->entries[j];
- geometryPtr = (EntryGeometry *) columnEntryPtr->platformEntryData;
-
- columnEntryPtr->indicatorSpace = maxIndicatorSpace;
- columnEntryPtr->width = maxIndicatorSpace + maxWidth
+ columnEntryPtr = menuPtr->entries[j];
+ geometryPtr = (EntryGeometry *) columnEntryPtr->platformEntryData;
+
+ columnEntryPtr->indicatorSpace = maxIndicatorSpace;
+ columnEntryPtr->width = maxIndicatorSpace + maxWidth
+ 2 * activeBorderWidth;
geometryPtr->accelTextWidth = maxAccelTextWidth;
geometryPtr->modifierWidth = maxModifierWidth;
@@ -3369,21 +3281,21 @@ TkpComputeStandardMenuGeometry(
columnEntryPtr->entryFlags |= ENTRY_LAST_COLUMN;
if (maxEntryWithoutAccelWidth > maxEntryWithAccelWidth) {
geometryPtr->nonAccelMargin = maxEntryWithoutAccelWidth
- - maxEntryWithAccelWidth;
+ - maxEntryWithAccelWidth;
if (geometryPtr->nonAccelMargin > maxNonAccelMargin) {
- geometryPtr->nonAccelMargin = maxNonAccelMargin;
+ geometryPtr->nonAccelMargin = maxNonAccelMargin;
}
} else {
geometryPtr->nonAccelMargin = 0;
- }
+ }
}
windowWidth = x + maxIndicatorSpace + maxWidth
+ 2 * activeBorderWidth + borderWidth;
windowHeight += borderWidth;
-
+
/*
- * The X server doesn't like zero dimensions, so round up to at least
- * 1 (a zero-sized menu should never really occur, anyway).
+ * The X server doesn't like zero dimensions, so round up to at least 1 (a
+ * zero-sized menu should never really occur, anyway).
*/
if (windowWidth <= 0) {
@@ -3415,168 +3327,153 @@ TkpComputeStandardMenuGeometry(
static void
DrawMenuEntryLabel(
- TkMenu *menuPtr, /* The menu we are drawing */
- TkMenuEntry *mePtr, /* The entry we are drawing */
- Drawable d, /* What we are drawing into */
- GC gc, /* The gc we are drawing into */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated font metrics */
- int x, /* left edge */
- int y, /* right edge */
- int width, /* width of entry */
- int height) /* height of entry */
+ TkMenu *menuPtr, /* The menu we are drawing */
+ TkMenuEntry *mePtr, /* The entry we are drawing */
+ Drawable d, /* What we are drawing into */
+ GC gc, /* The gc we are drawing into */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated font metrics */
+ int x, /* left edge */
+ int y, /* right edge */
+ int width, /* width of entry */
+ int height) /* height of entry */
{
- int baseline;
+ int baseline, imageHeight, imageWidth;
int indicatorSpace = mePtr->indicatorSpace;
int leftEdge = x + indicatorSpace;
- int imageHeight, imageWidth;
-
+
/*
* Draw label or bitmap or image for entry.
*/
baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
if (mePtr->image != NULL) {
- Tk_SizeOfImage(mePtr->image, &imageWidth, &imageHeight);
- if ((mePtr->selectImage != NULL)
- && (mePtr->entryFlags & ENTRY_SELECTED)) {
- Tk_RedrawImage(mePtr->selectImage, 0, 0,
- imageWidth, imageHeight, d, leftEdge,
- (int) (y + (mePtr->height - imageHeight)/2));
- } else {
- Tk_RedrawImage(mePtr->image, 0, 0, imageWidth,
- imageHeight, d, leftEdge,
- (int) (y + (mePtr->height - imageHeight)/2));
- }
+ Tk_SizeOfImage(mePtr->image, &imageWidth, &imageHeight);
+ if ((mePtr->selectImage != NULL)
+ && (mePtr->entryFlags & ENTRY_SELECTED)) {
+ Tk_RedrawImage(mePtr->selectImage, 0, 0, imageWidth, imageHeight,
+ d, leftEdge, (int) (y + (mePtr->height - imageHeight)/2));
+ } else {
+ Tk_RedrawImage(mePtr->image, 0, 0, imageWidth, imageHeight,
+ d, leftEdge, (int) (y + (mePtr->height - imageHeight)/2));
+ }
} else if (mePtr->bitmapPtr != NULL) {
- int width, height;
- Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
- Tk_SizeOfBitmap(menuPtr->display,
- bitmap, &width, &height);
- XCopyPlane(menuPtr->display, bitmap, d, gc, 0, 0,
- (unsigned) width, (unsigned) height, leftEdge,
- (int) (y + (mePtr->height - height)/2), 1);
+ int width, height;
+ Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
+
+ Tk_SizeOfBitmap(menuPtr->display, bitmap, &width, &height);
+ XCopyPlane(menuPtr->display, bitmap, d, gc, 0, 0,
+ (unsigned) width, (unsigned) height, leftEdge,
+ (int) (y + (mePtr->height - height)/2), 1);
} else {
- if (mePtr->labelLength > 0) {
- Tcl_DString itemTextDString, convertedTextDString;
- CGrafPtr saveWorld;
- GDHandle saveDevice;
- GWorldPtr destPort;
+ if (mePtr->labelLength > 0) {
+ Tcl_DString itemTextDString, convertedTextDString;
+ CGrafPtr saveWorld;
+ GDHandle saveDevice;
+ GWorldPtr destPort;
#ifdef USE_ATSU
- int xLocation;
- int yLocation;
- int runLengths;
- CFStringRef stringRef;
- ATSUTextLayout textLayout;
- UniCharCount runLength;
- ATSUStyle style;
- int length;
- int err;
- Str255 fontName;
- SInt16 fontSize;
- Style fontStyle;
- ATSUAttributeValuePtr valuePtr;
- ByteCount valueSize;
- Fixed fixedSize;
- short iFONDNumber;
- ATSUFontID fontID;
- ATSUAttributeTag tag;
-
- GetThemeFont (kThemeMenuItemFont, smSystemScript, fontName, &fontSize, &fontStyle);
- if ((err = ATSUCreateStyle(&style)) != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"ATSUCreateStyle failed, %d\n", err);
-#endif
- return;
- }
- fixedSize = fontSize<<16;
- tag = kATSUSizeTag;
- valueSize = sizeof(fixedSize);
- valuePtr = &fixedSize;
+ int xLocation, yLocation, runLengths, length, err;
+ CFStringRef stringRef;
+ ATSUTextLayout textLayout;
+ UniCharCount runLength;
+ ATSUStyle style;
+ Str255 fontName;
+ SInt16 fontSize;
+ Style fontStyle;
+ ATSUAttributeValuePtr valuePtr;
+ ByteCount valueSize;
+ Fixed fixedSize;
+ short iFONDNumber;
+ ATSUFontID fontID;
+ ATSUAttributeTag tag;
+
+ GetThemeFont(kThemeMenuItemFont, smSystemScript, fontName,
+ &fontSize, &fontStyle);
+ err = ATSUCreateStyle(&style);
+ LOG_ON_ERROR(ATSUCreateStyle);
+ if (err != noErr) {
+ return;
+ }
+ fixedSize = fontSize<<16;
+ tag = kATSUSizeTag;
+ valueSize = sizeof(fixedSize);
+ valuePtr = &fixedSize;
err = ATSUSetAttributes(style, 1, &tag, &valueSize, &valuePtr);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"ATSUSetAttributes failed,%d\n", err );
-#endif
- }
+ LOG_ON_ERROR(ATSUSetAttributes);
GetFNum(fontName, &iFONDNumber);
- ATSUFONDtoFontID(iFONDNumber, NULL, &fontID);
- tag = kATSUFontTag;
- valueSize = sizeof(fontID);
- valuePtr = &fontID;
+ ATSUFONDtoFontID(iFONDNumber, NULL, &fontID);
+ tag = kATSUFontTag;
+ valueSize = sizeof(fontID);
+ valuePtr = &fontID;
err = ATSUSetAttributes(style, 1, &tag, &valueSize, &valuePtr);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"ATSUSetAttributes failed,%d\n", err );
+ LOG_ON_ERROR(ATSUSetAttributes);
#endif
- }
-#endif
-
- GetEntryText(mePtr, &itemTextDString);
+ GetEntryText(mePtr, &itemTextDString);
#ifdef USE_ATSU
- runLengths = 1;
- length = Tcl_DStringLength(&itemTextDString);
- stringRef = CFStringCreateWithCString(NULL, Tcl_DStringValue(&itemTextDString),
- kCFStringEncodingUTF8);
- if (!stringRef) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"CFStringCreateWithCString failed\n");
-#endif
- }
- err = ATSUCreateTextLayoutWithTextPtr(CFStringGetCharactersPtr(stringRef),
- 0, length, length,
- 1, &runLengths, &style, &textLayout)
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"ATSUCreateTextLayoutWithTextPtr failed, %d\n", err);
-#endif
- return;
- }
+ runLengths = 1;
+ length = Tcl_DStringLength(&itemTextDString);
+ stringRef = CFStringCreateWithCString(NULL,
+ Tcl_DStringValue(&itemTextDString),
+ kCFStringEncodingUTF8);
+ if (!stringRef) {
+ LOG_MSG("CFStringCreateWithCString failed");
+ }
+ err = ATSUCreateTextLayoutWithTextPtr(
+ CFStringGetCharactersPtr(stringRef), 0, length, length, 1,
+ &runLengths, &style, &textLayout);
+ LOG_ON_ERROR(ATSUCreateTextLayoutWithTextPtr);
+ if (err != noErr) {
+ return;
+ }
#endif
-
- /* Somehow DrawChars is changing the colors, it is odd, since
- it works for the Apple Platinum Appearance, but not for
- some Kaleidoscope Themes... Untill I can figure out what
- exactly is going on, this will have to do: */
- destPort = TkMacOSXGetDrawablePort(d);
- GetGWorld(&saveWorld, &saveDevice);
- SetGWorld(destPort, NULL);
- TkMacOSXSetUpGraphicsPort(gc, destPort);
+ /*
+ * Somehow DrawChars is changing the colors, it is odd, since it
+ * works for the Apple Platinum Appearance, but not for some
+ * Kaleidoscope Themes... Until I can figure out what exactly is
+ * going on, this will have to do:
+ */
+
+ destPort = TkMacOSXGetDrawablePort(d);
+ GetGWorld(&saveWorld, &saveDevice);
+ SetGWorld(destPort, NULL);
+ TkMacOSXSetUpGraphicsPort(gc, destPort);
MoveTo((short) leftEdge, (short) baseline);
- Tcl_UtfToExternalDString(TkMacOSXCarbonEncoding, Tcl_DStringValue(&itemTextDString),
- Tcl_DStringLength(&itemTextDString), &convertedTextDString);
+ Tcl_UtfToExternalDString(TkMacOSXCarbonEncoding,
+ Tcl_DStringValue(&itemTextDString),
+ Tcl_DStringLength(&itemTextDString),
+ &convertedTextDString);
#ifdef USE_ATSU
- xLocation = leftEdge << 16;
- yLocation = baseline << 16;
- ATSUDrawText(textLayout,kATSUFromTextBeginning, kATSUToTextEnd, xLocation, yLocation);
- ATSUDisposeTextLayout(textLayout);
- CFRelease(stringRef);
+ xLocation = leftEdge << 16;
+ yLocation = baseline << 16;
+ ATSUDrawText(textLayout,kATSUFromTextBeginning, kATSUToTextEnd,
+ xLocation, yLocation);
+ ATSUDisposeTextLayout(textLayout);
+ CFRelease(stringRef);
#else
- DrawText(Tcl_DStringValue(&convertedTextDString), 0,
- Tcl_DStringLength(&convertedTextDString));
+ DrawText(Tcl_DStringValue(&convertedTextDString), 0,
+ Tcl_DStringLength(&convertedTextDString));
#endif
-
+
/* Tk_DrawChars(menuPtr->display, d, gc,
- tkfont, Tcl_DStringValue(&itemTextDString),
+ tkfont, Tcl_DStringValue(&itemTextDString),
Tcl_DStringLength(&itemTextDString),
leftEdge, baseline); */
-
+
Tcl_DStringFree(&convertedTextDString);
Tcl_DStringFree(&itemTextDString);
- }
+ }
}
if (mePtr->state == ENTRY_DISABLED) {
if (menuPtr->disabledFgPtr == NULL) {
- } else if ((mePtr->image != NULL)
+ } else if ((mePtr->image != NULL)
&& (menuPtr->disabledImageGC != None)) {
XFillRectangle(menuPtr->display, d, menuPtr->disabledImageGC,
- leftEdge,
- (int) (y + (mePtr->height - imageHeight)/2),
+ leftEdge, (int) (y + (mePtr->height - imageHeight)/2),
(unsigned) imageWidth, (unsigned) imageHeight);
}
}
@@ -3587,41 +3484,41 @@ DrawMenuEntryLabel(
*
* DrawMenuEntryBackground --
*
- * This procedure draws the background part of a menu entry.
- * Under Appearance, we only draw the background if the entry's
- * border is set, we DO NOT inherit it from the menu...
+ * This procedure draws the background part of a menu entry. Under
+ * Appearance, we only draw the background if the entry's border is set,
+ * we DO NOT inherit it from the menu...
*
* Results:
* None.
*
* Side effects:
- * Commands are output to X to display the menu in its
- * current mode.
+ * Commands are output to X to display the menu in its current mode.
*
*----------------------------------------------------------------------
*/
static void
DrawMenuEntryBackground(
- TkMenu *menuPtr, /* The menu we are drawing. */
- TkMenuEntry *mePtr, /* The entry we are drawing. */
- Drawable d, /* What we are drawing into */
- Tk_3DBorder activeBorder, /* Border for active items */
- Tk_3DBorder bgBorder, /* Border for the background */
- int x, /* left edge */
- int y, /* top edge */
- int width, /* width of rectangle to draw */
- int height) /* height of rectangle to draw */
+ TkMenu *menuPtr, /* The menu we are drawing. */
+ TkMenuEntry *mePtr, /* The entry we are drawing. */
+ Drawable d, /* What we are drawing into */
+ Tk_3DBorder activeBorder, /* Border for active items */
+ Tk_3DBorder bgBorder, /* Border for the background */
+ int x, /* left edge */
+ int y, /* top edge */
+ int width, /* width of rectangle to draw */
+ int height) /* height of rectangle to draw */
{
if ((menuPtr->menuType == TEAROFF_MENU)
- || ((mePtr->state == ENTRY_ACTIVE)
- && (mePtr->activeBorderPtr != None))
- || ((mePtr->state != ENTRY_ACTIVE) && (mePtr->borderPtr != None))) {
- if (mePtr->state == ENTRY_ACTIVE) {
+ || ((mePtr->state == ENTRY_ACTIVE)
+ && (mePtr->activeBorderPtr != None))
+ || ((mePtr->state != ENTRY_ACTIVE)
+ && (mePtr->borderPtr != None))) {
+ if (mePtr->state == ENTRY_ACTIVE) {
bgBorder = activeBorder;
- }
- Tk_Fill3DRectangle(menuPtr->tkwin, d, bgBorder,
- x, y, width, height, 0, TK_RELIEF_FLAT);
+ }
+ Tk_Fill3DRectangle(menuPtr->tkwin, d, bgBorder, x, y, width, height,
+ 0, TK_RELIEF_FLAT);
}
}
@@ -3644,35 +3541,34 @@ DrawMenuEntryBackground(
static void
GetMenuLabelGeometry(
- TkMenuEntry *mePtr, /* The entry we are computing */
- Tk_Font tkfont, /* The precalculated font */
- CONST Tk_FontMetrics *fmPtr, /* The precalculated metrics */
- int *widthPtr, /* The resulting width of the label
- * portion */
- int *heightPtr) /* The resulting height of the label
- * portion */
+ TkMenuEntry *mePtr, /* The entry we are computing */
+ Tk_Font tkfont, /* The precalculated font */
+ CONST Tk_FontMetrics *fmPtr,/* The precalculated metrics */
+ int *widthPtr, /* The resulting width of the label portion */
+ int *heightPtr) /* The resulting height of the label
+ * portion. */
{
TkMenu *menuPtr = mePtr->menuPtr;
-
+
if (mePtr->image != NULL) {
- Tk_SizeOfImage(mePtr->image, widthPtr, heightPtr);
+ Tk_SizeOfImage(mePtr->image, widthPtr, heightPtr);
} else if (mePtr->bitmapPtr != NULL) {
- Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
- Tk_SizeOfBitmap(menuPtr->display, bitmap, widthPtr, heightPtr);
+ Pixmap bitmap = Tk_GetBitmapFromObj(menuPtr->tkwin, mePtr->bitmapPtr);
+ Tk_SizeOfBitmap(menuPtr->display, bitmap, widthPtr, heightPtr);
} else {
- *heightPtr = fmPtr->linespace;
-
- if (mePtr->labelPtr != NULL) {
- Tcl_DString itemTextDString;
-
- GetEntryText(mePtr, &itemTextDString);
- *widthPtr = Tk_TextWidth(tkfont,
- Tcl_DStringValue(&itemTextDString),
- Tcl_DStringLength(&itemTextDString));
- Tcl_DStringFree(&itemTextDString);
- } else {
- *widthPtr = 0;
- }
+ *heightPtr = fmPtr->linespace;
+
+ if (mePtr->labelPtr != NULL) {
+ Tcl_DString itemTextDString;
+
+ GetEntryText(mePtr, &itemTextDString);
+ *widthPtr = Tk_TextWidth(tkfont,
+ Tcl_DStringValue(&itemTextDString),
+ Tcl_DStringLength(&itemTextDString));
+ Tcl_DStringFree(&itemTextDString);
+ } else {
+ *widthPtr = 0;
+ }
}
*heightPtr += 1;
}
@@ -3682,8 +3578,8 @@ GetMenuLabelGeometry(
*
* MenuSelectEvent --
*
- * Generates a "MenuSelect" virtual event. This can be used to
- * do context-sensitive menu help.
+ * Generates a "MenuSelect" virtual event. This can be used to do
+ * context-sensitive menu help.
*
* Results:
* None.
@@ -3699,7 +3595,7 @@ MenuSelectEvent(
TkMenu *menuPtr) /* the menu we have selected. */
{
XVirtualEvent event;
-
+
bzero(&event, sizeof(XVirtualEvent));
event.type = VirtualEvent;
event.serial = menuPtr->display->request;
@@ -3710,9 +3606,9 @@ MenuSelectEvent(
event.root = XRootWindow(menuPtr->display, 0);
event.subwindow = None;
event.time = TkpGetMS();
-
- XQueryPointer(NULL, None, NULL, NULL,
- &event.x_root, &event.y_root, NULL, NULL, &event.state);
+
+ XQueryPointer(NULL, None, NULL, NULL, &event.x_root, &event.y_root,
+ NULL, NULL, &event.state);
event.same_screen = true;
event.name = Tk_GetUid("MenuSelect");
Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL);
@@ -3740,17 +3636,17 @@ RecursivelyClearActiveMenu(
{
int i;
TkMenuEntry *mePtr;
-
+
TkActivateMenuEntry(menuPtr, -1);
MenuSelectEvent(menuPtr);
for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- if (mePtr->type == CASCADE_ENTRY) {
- if ((mePtr->childMenuRefPtr != NULL)
- && (mePtr->childMenuRefPtr->menuPtr != NULL)) {
- RecursivelyClearActiveMenu(mePtr->childMenuRefPtr->menuPtr);
- }
- }
+ mePtr = menuPtr->entries[i];
+ if (mePtr->type == CASCADE_ENTRY) {
+ if ((mePtr->childMenuRefPtr != NULL)
+ && (mePtr->childMenuRefPtr->menuPtr != NULL)) {
+ RecursivelyClearActiveMenu(mePtr->childMenuRefPtr->menuPtr);
+ }
+ }
}
}
@@ -3759,8 +3655,8 @@ RecursivelyClearActiveMenu(
*
* InvalidateMDEFRgns --
*
- * Invalidates the regions covered by menus that did redrawing and
- * might be damaged.
+ * Invalidates the regions covered by menus that did redrawing and might
+ * be damaged.
*
* Results:
* None.
@@ -3775,31 +3671,33 @@ void
InvalidateMDEFRgns(void)
{
GDHandle saveDevice;
- GWorldPtr saveWorld, destPort;
- Point scratch;
- MacDrawable *macDraw;
+ GWorldPtr saveWorld;
TkMacOSXWindowList *listPtr;
-
+
if (totalMenuRgn == NULL) {
- return;
+ return;
}
-
+
GetGWorld(&saveWorld, &saveDevice);
- for (listPtr = tkMacOSXWindowListPtr ; listPtr != NULL;
- listPtr = listPtr->nextPtr) {
- macDraw = (MacDrawable *) Tk_WindowId(listPtr->winPtr);
- if (macDraw->flags & TK_DRAWN_UNDER_MENU) {
- destPort = TkMacOSXGetDrawablePort(Tk_WindowId(listPtr->winPtr));
- SetGWorld(destPort, NULL);
- scratch.h = scratch.v = 0;
- GlobalToLocal(&scratch);
- OffsetRgn(totalMenuRgn, scratch.v, scratch.h);
- InvalWindowRgn(GetWindowFromPort(destPort),totalMenuRgn);
- OffsetRgn(totalMenuRgn, -scratch.v, -scratch.h);
- macDraw->flags &= ~TK_DRAWN_UNDER_MENU;
- }
+ for (listPtr = tkMacOSXWindowListPtr ; listPtr != NULL;
+ listPtr = listPtr->nextPtr) {
+ MacDrawable *macDraw = (MacDrawable *) Tk_WindowId(listPtr->winPtr);
+
+ if (macDraw->flags & TK_DRAWN_UNDER_MENU) {
+ GWorldPtr destPort =
+ TkMacOSXGetDrawablePort(Tk_WindowId(listPtr->winPtr));
+ Point scratch;
+
+ SetGWorld(destPort, NULL);
+ scratch.h = scratch.v = 0;
+ GlobalToLocal(&scratch);
+ OffsetRgn(totalMenuRgn, scratch.v, scratch.h);
+ InvalWindowRgn(GetWindowFromPort(destPort),totalMenuRgn);
+ OffsetRgn(totalMenuRgn, -scratch.v, -scratch.h);
+ macDraw->flags &= ~TK_DRAWN_UNDER_MENU;
+ }
}
-
+
SetGWorld(saveWorld, saveDevice);
SetEmptyRgn(totalMenuRgn);
}
@@ -3824,20 +3722,20 @@ void
TkMacOSXClearMenubarActive(void)
{
TkMenuReferences *menuBarRefPtr;
-
+
if (currentMenuBarName != NULL) {
- menuBarRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- if ((menuBarRefPtr != NULL) && (menuBarRefPtr->menuPtr != NULL)) {
- TkMenu *menuPtr;
-
- for (menuPtr = menuBarRefPtr->menuPtr->masterMenuPtr; menuPtr != NULL;
- menuPtr = menuPtr->nextInstancePtr) {
- if (menuPtr->menuType == MENUBAR) {
- RecursivelyClearActiveMenu(menuPtr);
- }
- }
- }
+ menuBarRefPtr = TkFindMenuReferences(currentMenuBarInterp,
+ currentMenuBarName);
+ if ((menuBarRefPtr != NULL) && (menuBarRefPtr->menuPtr != NULL)) {
+ TkMenu *menuPtr;
+
+ for (menuPtr=menuBarRefPtr->menuPtr->masterMenuPtr; menuPtr!=NULL;
+ menuPtr = menuPtr->nextInstancePtr) {
+ if (menuPtr->menuType == MENUBAR) {
+ RecursivelyClearActiveMenu(menuPtr);
+ }
+ }
+ }
}
InvalidateMDEFRgns();
}
@@ -3848,8 +3746,8 @@ TkMacOSXClearMenubarActive(void)
* TkpMenuNotifyToplevelCreate --
*
* This routine reconfigures the menu and the clones indicated by
- * menuName becuase a toplevel has been created and any system
- * menus need to be created. Only applicable to Windows.
+ * menuName becuase a toplevel has been created and any system menus need
+ * to be created. Only applicable to Windows.
*
* Results:
* None.
@@ -3862,9 +3760,8 @@ TkMacOSXClearMenubarActive(void)
void
TkpMenuNotifyToplevelCreate(
- Tcl_Interp *interp, /* The interp the menu lives in. */
- char *menuName) /* The name of the menu to
- * reconfigure. */
+ Tcl_Interp *interp, /* The interp the menu lives in. */
+ char *menuName) /* The name of the menu to reconfigure. */
{
/*
* Nothing to do.
@@ -3889,7 +3786,7 @@ TkpMenuNotifyToplevelCreate(
void
TkpMenuInit(void)
-{
+{
lastMenuID = 256;
Tcl_InitHashTable(&commandTable, TCL_ONE_WORD_KEYS);
currentMenuBarOwner = NULL;
@@ -3900,18 +3797,18 @@ TkpMenuInit(void)
currentMenuBarName = NULL;
windowListPtr = NULL;
- tkThemeMenuItemDrawingUPP
- = NewMenuItemDrawingUPP(ThemeMenuItemDrawingProc);
-
- /*
- * We should just hardcode the utf-8 ellipsis character into
- * 'elipsisString' here
+ tkThemeMenuItemDrawingUPP =
+ NewMenuItemDrawingUPP(ThemeMenuItemDrawingProc);
+
+ /*
+ * We should just hardcode the utf-8 ellipsis character into
+ * 'elipsisString' here
*/
- Tcl_ExternalToUtf(NULL, Tcl_GetEncoding(NULL, "macRoman"),
- "\311", /* ellipsis character */
- -1, 0, NULL, elipsisString,
- TCL_UTF_MAX + 1, NULL, NULL, NULL);
-
+
+ Tcl_ExternalToUtf(NULL, Tcl_GetEncoding(NULL, "macRoman"),
+ "\311", /* ellipsis character */
+ -1, 0, NULL, elipsisString, TCL_UTF_MAX + 1, NULL, NULL, NULL);
+
useMDEFVar = Tcl_NewStringObj("::tk::mac::useCustomMDEF", -1);
}
@@ -3920,8 +3817,7 @@ TkpMenuInit(void)
*
* TkpMenuThreadInit --
*
- * Does platform-specific initialization of thread-specific
- * menu state.
+ * Does platform-specific initialization of thread-specific menu state.
*
* Results:
* None.
@@ -3933,7 +3829,7 @@ TkpMenuInit(void)
*/
void
-TkpMenuThreadInit()
+TkpMenuThreadInit(void)
{
/*
* Nothing to do.
@@ -3945,28 +3841,28 @@ TkpMenuThreadInit()
*
* TkpPreprocessMacMenu --
*
- * Handle preprocessing of menubar if it exists.
+ * Handle preprocessing of menubar if it exists.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * All post commands for the current menubar get executed.
+ * All post commands for the current menubar get executed.
*
*----------------------------------------------------------------------
*/
void
-TkMacOSXPreprocessMenu()
+TkMacOSXPreprocessMenu(void)
{
- TkMenuReferences *mbRefPtr;
- int code;
-
if ((currentMenuBarName != NULL) && (currentMenuBarInterp != NULL)) {
- mbRefPtr = TkFindMenuReferences(currentMenuBarInterp,
- currentMenuBarName);
- if ((mbRefPtr != NULL) && (mbRefPtr->menuPtr != NULL)) {
- Tcl_Preserve((ClientData)currentMenuBarInterp);
+ TkMenuReferences *mbRefPtr =
+ TkFindMenuReferences(currentMenuBarInterp,currentMenuBarName);
+
+ if ((mbRefPtr != NULL) && (mbRefPtr->menuPtr != NULL)) {
+ int code;
+
+ Tcl_Preserve((ClientData) currentMenuBarInterp);
code = TkPreprocessMenu(mbRefPtr->menuPtr->masterMenuPtr);
if ((code != TCL_OK) && (code != TCL_CONTINUE)
&& (code != TCL_BREAK)) {
@@ -3974,8 +3870,8 @@ TkMacOSXPreprocessMenu()
"\n (menu preprocess)");
Tcl_BackgroundError(currentMenuBarInterp);
}
- Tcl_Release((ClientData)currentMenuBarInterp);
- }
+ Tcl_Release((ClientData) currentMenuBarInterp);
+ }
}
}
@@ -3984,188 +3880,178 @@ TkMacOSXPreprocessMenu()
*
* MenuDefProc --
*
- * This routine is the MDEF handler for Tk. It receives all messages
- * for the menu and dispatches them.
+ * This routine is the MDEF handler for Tk. It receives all messages for
+ * the menu and dispatches them.
*
* Results:
* None.
*
* Side effects:
* This routine causes menus to be drawn and will certainly allocate
- * memory as a result. Also, the menu can scroll up and down, and
- * various other interface actions can take place.
+ * memory as a result. Also, the menu can scroll up and down, and various
+ * other interface actions can take place.
*
*----------------------------------------------------------------------
*/
static void
MenuDefProc(
- SInt16 message, /* What action are we taking? */
- MenuRef menu, /* The menu we are working with */
- Rect *menuRectPtr, /* A pointer to the rect for the
- * whole menu. */
- Point hitPt, /* Where the mouse was clicked for
- * the appropriate messages. */
- SInt16 *whichItem) /* Output result. Which item was
- * hit by the user? */
+ SInt16 message, /* What action are we taking? */
+ MenuRef menu, /* The menu we are working with */
+ Rect *menuRectPtr, /* A pointer to the rect for the whole
+ * menu. */
+ Point hitPt, /* Where the mouse was clicked for the
+ * appropriate messages. */
+ SInt16 *whichItem) /* Output result. Which item was hit by the
+ * user? */
{
TkMenu *menuPtr;
Tcl_HashEntry *commandEntryPtr;
int maxMenuHeight;
MenuID menuID;
BitMap screenBits;
-
+
menuID = GetMenuID(menu);
commandEntryPtr = Tcl_FindHashEntry(&commandTable, (char *) ((int)menuID));
-
+
if (commandEntryPtr) {
- menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr);
+ menuPtr = (TkMenu *) Tcl_GetHashValue(commandEntryPtr);
} else {
- menuPtr = NULL;
+ menuPtr = NULL;
}
switch (message) {
- case kMenuInitMsg:
- *whichItem = noErr;
- break;
- case kMenuDisposeMsg:
- break;
- case kMenuHiliteItemMsg: {
- HandleMenuHiliteMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
- break;
- }
- case kMenuCalcItemMsg:
- HandleMenuCalcItemMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
- break;
- case kMenuDrawItemsMsg: {
- /*
- * We do nothing here, because we don't support the Menu Managers
- * dynamic item groups
- */
-
- break;
- }
- case kMenuThemeSavvyMsg:
- *whichItem = kThemeSavvyMenuResponse;
- break;
- case kMenuSizeMsg:
- GetQDGlobalsScreenBits(&screenBits);
- maxMenuHeight = screenBits.bounds.bottom
- - screenBits.bounds.top
- - GetMBarHeight() - SCREEN_MARGIN;
- SetMenuWidth(menu, menuPtr->totalWidth );
- SetMenuHeight(menu,maxMenuHeight < menuPtr->totalHeight ? maxMenuHeight : menuPtr->totalHeight );
- break;
- case kMenuDrawMsg:
- HandleMenuDrawMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
- break;
- case kMenuFindItemMsg:
- HandleMenuFindItemsMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
- break;
- case kMenuPopUpMsg:
- HandleMenuPopUpMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
- break;
+ case kMenuInitMsg:
+ *whichItem = noErr;
+ break;
+ case kMenuDisposeMsg:
+ break;
+ case kMenuHiliteItemMsg:
+ HandleMenuHiliteMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
+ break;
+ case kMenuCalcItemMsg:
+ HandleMenuCalcItemMsg (menu, menuRectPtr, hitPt, whichItem, menuPtr);
+ break;
+ case kMenuDrawItemsMsg:
+ /*
+ * We do nothing here, because we don't support the Menu Managers
+ * dynamic item groups
+ */
+
+ break;
+ case kMenuThemeSavvyMsg:
+ *whichItem = kThemeSavvyMenuResponse;
+ break;
+ case kMenuSizeMsg:
+ GetQDGlobalsScreenBits(&screenBits);
+ maxMenuHeight = screenBits.bounds.bottom
+ - screenBits.bounds.top - GetMBarHeight() - SCREEN_MARGIN;
+ SetMenuWidth(menu, menuPtr->totalWidth);
+ SetMenuHeight(menu, maxMenuHeight<menuPtr->totalHeight
+ ? maxMenuHeight : menuPtr->totalHeight);
+ break;
+ case kMenuDrawMsg:
+ HandleMenuDrawMsg(menu, menuRectPtr, hitPt, whichItem, menuPtr);
+ break;
+ case kMenuFindItemMsg:
+ HandleMenuFindItemsMsg(menu, menuRectPtr, hitPt, whichItem, menuPtr);
+ break;
+ case kMenuPopUpMsg:
+ HandleMenuPopUpMsg(menu, menuRectPtr, hitPt, whichItem, menuPtr);
+ break;
}
}
void
-HandleMenuHiliteMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr)
+HandleMenuHiliteMsg(
+ MenuRef menu,
+ Rect *menuRectPtr,
+ Point hitPt,
+ SInt16 *whichItem,
+ TkMenu *menuPtr)
{
TkMenuEntry *mePtr = NULL;
Tk_Font tkfont;
Tk_FontMetrics fontMetrics;
- int oldItem;
- int newItem = -1;
- MDEFHiliteItemData * hidPtr = ( MDEFHiliteItemData *)whichItem;
- MenuTrackingData mtd, *mtdPtr = &mtd;
- int err;
+ int err, oldItem, newItem = -1;
+ MDEFHiliteItemData *hidPtr = (MDEFHiliteItemData *) whichItem;
+ MenuTrackingData mtd, *mtdPtr = &mtd;
+
oldItem = hidPtr->previousItem - 1;
newItem = hidPtr->newItem - 1;
-
+
err = GetMenuTrackingData(menu, mtdPtr);
+ LOG_ON_ERROR(GetMenuTrackingData);
if (err !=noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"GetMenuTrackingData failed : %d\n", err );
-#endif
return;
}
-
+
if (oldItem >= 0) {
- Rect oldItemRect;
- int width;
-
- mePtr = menuPtr->entries[oldItem];
- if (mePtr->fontPtr == NULL) {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin,
- menuPtr->fontPtr);
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin,
- mePtr->fontPtr);
- }
- Tk_GetFontMetrics(tkfont, &fontMetrics);
-
- width = (mePtr->entryFlags & ENTRY_LAST_COLUMN)
- ? menuPtr->totalWidth - mePtr->x : mePtr->width;
-
- /*
- * In Aqua, have to call EraseMenuBackground when you overdraw
- * a previously selected menu item, otherwise you will see the
- * old select highlight under the transparency of the new menu item.
- */
-
- oldItemRect.left = menuRectPtr->left + mePtr->x;
- oldItemRect.right = oldItemRect.left +width;
- oldItemRect.top = mtdPtr->virtualMenuTop + mePtr->y;
- oldItemRect.bottom = oldItemRect.top + mePtr->height;
-
- EraseMenuBackground(menu, & oldItemRect, NULL);
-
- AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
- (Drawable) &macMDEFDrawable, &fontMetrics, tkfont,
- oldItemRect.left,
- oldItemRect.top,
- width,
- mePtr->height);
+ Rect oldItemRect;
+ int width;
+
+ mePtr = menuPtr->entries[oldItem];
+ if (mePtr->fontPtr == NULL) {
+ tkfont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
+ } else {
+ tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
+ }
+ Tk_GetFontMetrics(tkfont, &fontMetrics);
+
+ width = (mePtr->entryFlags & ENTRY_LAST_COLUMN)
+ ? menuPtr->totalWidth - mePtr->x : mePtr->width;
+
+ /*
+ * In Aqua, have to call EraseMenuBackground when you overdraw a
+ * previously selected menu item, otherwise you will see the old
+ * select highlight under the transparency of the new menu item.
+ */
+
+ oldItemRect.left = menuRectPtr->left + mePtr->x;
+ oldItemRect.right = oldItemRect.left +width;
+ oldItemRect.top = mtdPtr->virtualMenuTop + mePtr->y;
+ oldItemRect.bottom = oldItemRect.top + mePtr->height;
+
+ EraseMenuBackground(menu, & oldItemRect, NULL);
+
+ AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
+ (Drawable) &macMDEFDrawable, &fontMetrics, tkfont,
+ oldItemRect.left, oldItemRect.top, width, mePtr->height);
}
- if (newItem != -1) {
- mePtr = menuPtr->entries[newItem];
- if (mePtr->state != ENTRY_DISABLED) {
- TkActivateMenuEntry(menuPtr, newItem);
- }
- if (mePtr->fontPtr == NULL) {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
- }
- Tk_GetFontMetrics(tkfont, &fontMetrics);
- AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
- (Drawable) &macMDEFDrawable, &fontMetrics, tkfont,
- menuRectPtr->left + mePtr->x,
- mtdPtr->virtualMenuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- mePtr->height);
+ if (newItem != -1) {
+ mePtr = menuPtr->entries[newItem];
+ if (mePtr->state != ENTRY_DISABLED) {
+ TkActivateMenuEntry(menuPtr, newItem);
+ }
+ if (mePtr->fontPtr == NULL) {
+ tkfont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
+ } else {
+ tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
+ }
+ Tk_GetFontMetrics(tkfont, &fontMetrics);
+ AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
+ (Drawable) &macMDEFDrawable, &fontMetrics, tkfont,
+ menuRectPtr->left + mePtr->x,
+ mtdPtr->virtualMenuTop + mePtr->y,
+ (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
+ menuPtr->totalWidth - mePtr->x : mePtr->width,
+ mePtr->height);
}
tkUseMenuCascadeRgn = 1;
MenuSelectEvent(menuPtr);
Tcl_ServiceAll();
tkUseMenuCascadeRgn = 0;
if (newItem!=-1 && mePtr->state != ENTRY_DISABLED) {
- TkActivateMenuEntry(menuPtr, -1);
+ TkActivateMenuEntry(menuPtr, -1);
}
-
}
-
+
/*
*----------------------------------------------------------------------
*
- * HandleMenuDrawMsg --
+ * HandleMenuDrawMsg --
*
- * It handles the MenuDefProc's draw message.
+ * It handles the MenuDefProc's draw message.
*
* Results:
* A menu entry is drawn
@@ -4175,289 +4061,266 @@ HandleMenuHiliteMsg (MenuRef menu,
*
*----------------------------------------------------------------------
*/
+
void
-HandleMenuDrawMsg(MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr)
+HandleMenuDrawMsg(
+ MenuRef menu,
+ Rect *menuRectPtr,
+ Point hitPt,
+ SInt16 *whichItem,
+ TkMenu *menuPtr)
{
Tk_Font tkfont, menuFont;
- Tk_FontMetrics fontMetrics, entryMetrics;
- Tk_FontMetrics *fmPtr;
+ Tk_FontMetrics fontMetrics, entryMetrics, *fmPtr;
TkMenuEntry *mePtr;
int i;
GDHandle device;
TkMenu *searchMenuPtr;
Rect menuClipRect;
ThemeMenuType menuType;
- MenuTrackingData * mtdPtr = (MenuTrackingData *)whichItem;
+ MenuTrackingData *mtdPtr = (MenuTrackingData *) whichItem;
+
/*
- * Store away the menu rectangle so we can keep track of the
- * different regions that the menu obscures.
- */
-
+ * Store away the menu rectangle so we can keep track of the different
+ * regions that the menu obscures.
+ */
+
((MacMenu *) menuPtr->platformData)->menuRect = *menuRectPtr;
if (tkMenuCascadeRgn == NULL) {
- tkMenuCascadeRgn = NewRgn();
+ tkMenuCascadeRgn = NewRgn();
}
if (utilRgn == NULL) {
- utilRgn = NewRgn();
+ utilRgn = NewRgn();
}
if (totalMenuRgn == NULL) {
- totalMenuRgn = NewRgn();
+ totalMenuRgn = NewRgn();
}
SetEmptyRgn(tkMenuCascadeRgn);
for (searchMenuPtr = menuPtr; searchMenuPtr != NULL; ) {
- RectRgn(utilRgn,
- &((MacMenu *) searchMenuPtr->platformData)->menuRect);
- InsetRgn(utilRgn, -1, -1);
- UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn);
- OffsetRgn(utilRgn, 1, 1);
- UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn);
-
- if (searchMenuPtr->menuRefPtr->parentEntryPtr != NULL) {
- searchMenuPtr = searchMenuPtr->menuRefPtr
- ->parentEntryPtr->menuPtr;
- } else {
- break;
- }
- if (searchMenuPtr->menuType == MENUBAR) {
- break;
- }
+ RectRgn(utilRgn,
+ &((MacMenu *) searchMenuPtr->platformData)->menuRect);
+ InsetRgn(utilRgn, -1, -1);
+ UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn);
+ OffsetRgn(utilRgn, 1, 1);
+ UnionRgn(tkMenuCascadeRgn, utilRgn, tkMenuCascadeRgn);
+
+ if (searchMenuPtr->menuRefPtr->parentEntryPtr == NULL) {
+ break;
+ }
+ searchMenuPtr = searchMenuPtr->menuRefPtr->parentEntryPtr->menuPtr;
+ if (searchMenuPtr->menuType == MENUBAR) {
+ break;
+ }
}
UnionRgn(totalMenuRgn, tkMenuCascadeRgn, totalMenuRgn);
SetEmptyRgn(utilRgn);
-
+
/*
- * Now draw the background if Appearance is present...
- */
-
+ * Now draw the background if Appearance is present...
+ */
+
GetGWorld(&macMDEFDrawable.grafPtr, &device);
-
+
if (menuPtr->menuRefPtr->topLevelListPtr != NULL) {
- menuType = kThemeMenuTypePullDown;
+ menuType = kThemeMenuTypePullDown;
} else if (menuPtr->menuRefPtr->parentEntryPtr != NULL) {
- menuType = kThemeMenuTypeHierarchical;
+ menuType = kThemeMenuTypeHierarchical;
} else {
- menuType = kThemeMenuTypePopUp;
+ menuType = kThemeMenuTypePopUp;
}
-
+
DrawMenuBackground(menuRectPtr, (Drawable) &macMDEFDrawable, menuType);
-
+
/*
- * Next, figure out scrolling information.
- */
-
+ * Next, figure out scrolling information.
+ */
+
menuClipRect = *menuRectPtr;
- if ((menuClipRect.bottom - menuClipRect.top)
- < menuPtr->totalHeight) {
- if (mtdPtr->virtualMenuTop < menuRectPtr->top) {
- DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC,
- menuRectPtr->left + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->top);
- menuClipRect.top += SICN_HEIGHT;
- }
- if ((mtdPtr->virtualMenuTop + menuPtr->totalHeight)
- > menuRectPtr->bottom) {
- DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC,
- menuRectPtr->left + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->bottom - SICN_HEIGHT);
- menuClipRect.bottom -= SICN_HEIGHT;
- }
- GetClip(utilRgn);
+ if ((menuClipRect.bottom - menuClipRect.top) < menuPtr->totalHeight) {
+ if (mtdPtr->virtualMenuTop < menuRectPtr->top) {
+ DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW,
+ (Drawable) &macMDEFDrawable, menuPtr->textGC,
+ menuRectPtr->left + menuPtr->entries[1]->indicatorSpace,
+ menuRectPtr->top);
+ menuClipRect.top += SICN_HEIGHT;
+ }
+ if (mtdPtr->virtualMenuTop+menuPtr->totalHeight>menuRectPtr->bottom) {
+ DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW,
+ (Drawable) &macMDEFDrawable, menuPtr->textGC,
+ menuRectPtr->left + menuPtr->entries[1]->indicatorSpace,
+ menuRectPtr->bottom - SICN_HEIGHT);
+ menuClipRect.bottom -= SICN_HEIGHT;
+ }
+ GetClip(utilRgn);
}
-
+
/*
- * Now, actually draw the menu. Don't draw entries that
- * are higher than the top arrow, and don't draw entries
- * that are lower than the bottom.
- */
-
+ * Now, actually draw the menu. Don't draw entries that are higher than
+ * the top arrow, and don't draw entries that are lower than the bottom.
+ */
+
menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
- Tk_GetFontMetrics(menuFont, &fontMetrics);
+ Tk_GetFontMetrics(menuFont, &fontMetrics);
for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- if (mtdPtr->virtualMenuTop + mePtr->y + mePtr->height
- < menuClipRect.top) {
- continue;
- } else if (mtdPtr->virtualMenuTop + mePtr->y
- > menuClipRect.bottom) {
- continue;
- }
- ClipRect(&menuClipRect);
- if (mePtr->fontPtr == NULL) {
- fmPtr = &fontMetrics;
- tkfont = menuFont;
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
- AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
- (Drawable) &macMDEFDrawable, fmPtr, tkfont,
- menuRectPtr->left + mePtr->x,
- mtdPtr->virtualMenuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- menuPtr->entries[i]->height);
+ mePtr = menuPtr->entries[i];
+ if (mtdPtr->virtualMenuTop+mePtr->y+mePtr->height<menuClipRect.top) {
+ continue;
+ } else if (mtdPtr->virtualMenuTop + mePtr->y > menuClipRect.bottom) {
+ continue;
+ }
+
+ ClipRect(&menuClipRect);
+ if (mePtr->fontPtr == NULL) {
+ fmPtr = &fontMetrics;
+ tkfont = menuFont;
+ } else {
+ tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
+ Tk_GetFontMetrics(tkfont, &entryMetrics);
+ fmPtr = &entryMetrics;
+ }
+ AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
+ (Drawable) &macMDEFDrawable, fmPtr, tkfont,
+ menuRectPtr->left + mePtr->x,
+ mtdPtr->virtualMenuTop + mePtr->y,
+ (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
+ menuPtr->totalWidth - mePtr->x : mePtr->width,
+ menuPtr->entries[i]->height);
}
- mtdPtr->virtualMenuBottom = mtdPtr->virtualMenuTop
- + menuPtr->totalHeight;
+ mtdPtr->virtualMenuBottom = mtdPtr->virtualMenuTop + menuPtr->totalHeight;
if (!EmptyRgn(utilRgn)) {
- SetClip(utilRgn);
- SetEmptyRgn(utilRgn);
+ SetClip(utilRgn);
+ SetEmptyRgn(utilRgn);
}
MDEFScrollFlag = 1;
}
-
+
/*
*----------------------------------------------------------------------
*
- * HandleMenuFindItemsMsg --
+ * HandleMenuFindItemsMsg --
*
- * It handles the MenuDefProc's FindItems message. We have to
- * respond by filling in the itemSelected, itemUnderMouse and
- * itemRect fields. This is also the time to scroll the menu if
- * it is too long to fit on the screen.
+ * It handles the MenuDefProc's FindItems message. We have to respond by
+ * filling in the itemSelected, itemUnderMouse and itemRect fields. This
+ * is also the time to scroll the menu if it is too long to fit on the
+ * screen.
*
* Results:
- * The Menu system is informed of the selected item & the item
- * under the mouse.
+ * The Menu system is informed of the selected item & the item under the
+ * mouse.
*
* Side effects:
* The menu might get scrolled.
*
*----------------------------------------------------------------------
*/
+
void
-HandleMenuFindItemsMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr)
+HandleMenuFindItemsMsg(
+ MenuRef menu,
+ Rect *menuRectPtr,
+ Point hitPt,
+ SInt16 *whichItem,
+ TkMenu *menuPtr)
{
TkMenuEntry *parentEntryPtr;
-#if 0 /* Unused */
+#if 0 /* Unused */
Tk_Font tkfont;
- Tk_FontMetrics fontMetrics, entryMetrics;
- Tk_FontMetrics *fmPtr;
+ Tk_FontMetrics fontMetrics, entryMetrics, *fmPtr;
#endif
TkMenuEntry *mePtr;
- int i;
- int newItem = -1;
+ int i, newItem = -1, hasTopScroll, hasBottomScroll, itemUnderMouse = -1;
GDHandle device;
- Rect itemRect;
- short windowPart;
+ short windowPart, scrollAmt = 0;
WindowRef whichWindow;
- RGBColor bgColor;
- RGBColor fgColor;
- RGBColor origFgColor;
+ RGBColor bgColor, fgColor, origFgColor, origForeColor, origBackColor;
PenState origPenState;
- Rect dragRect;
+ Rect itemRect, dragRect, menuClipRect, updateRect;
Rect scratchRect = {-32768, -32768, 32767, 32767};
RgnHandle oldClipRgn;
TkMenuReferences *menuRefPtr;
- Rect menuClipRect;
-
- int hasTopScroll, hasBottomScroll;
- MenuTrackingData * mtdPtr = (MenuTrackingData *)whichItem;
- int itemUnderMouse = -1;
+ MenuTrackingData *mtdPtr = (MenuTrackingData *) whichItem;
enum {
- DONT_SCROLL, DOWN_SCROLL, UP_SCROLL
+ DONT_SCROLL, DOWN_SCROLL, UP_SCROLL
} scrollDirection;
- Rect updateRect;
- short scrollAmt = 0;
- RGBColor origForeColor, origBackColor;
-
+
/*
- * Find out which item was hit. If it is the same as the old item,
- * we don't need to do anything.
+ * Find out which item was hit. If it is the same as the old item, we
+ * don't need to do anything.
*/
if (PtInRect(hitPt, menuRectPtr)) {
- for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- itemRect.left = menuRectPtr->left + mePtr->x;
- itemRect.top = mtdPtr->virtualMenuTop + mePtr->y;
- if (mePtr->entryFlags & ENTRY_LAST_COLUMN) {
- itemRect.right = itemRect.left + menuPtr->totalWidth
- - mePtr->x;
- } else {
- itemRect.right = itemRect.left + mePtr->width;
- }
- itemRect.bottom = itemRect.top
- + mePtr->height;
- if (PtInRect(hitPt, &itemRect)) {
- if ((mePtr->type == SEPARATOR_ENTRY)
- || (mePtr->state == ENTRY_DISABLED)) {
- newItem = -1;
- itemUnderMouse = i;
- } else {
- TkMenuEntry *cascadeEntryPtr;
- int parentDisabled = 0;
-
- for (cascadeEntryPtr
- = menuPtr->menuRefPtr->parentEntryPtr;
- cascadeEntryPtr != NULL;
- cascadeEntryPtr
- = cascadeEntryPtr->nextCascadePtr) {
- char *name;
-
- name = Tcl_GetStringFromObj(
- cascadeEntryPtr->namePtr, NULL);
- if (strcmp(name, Tk_PathName(menuPtr->tkwin))
- == 0) {
- if (cascadeEntryPtr->state == ENTRY_DISABLED) {
- parentDisabled = 1;
- }
- break;
- }
- }
-
- if (parentDisabled) {
- newItem = -1;
- itemUnderMouse = i;
- } else {
- newItem = i;
- itemUnderMouse = i;
- }
- }
- break;
- }
- }
- } else {
+ for (i = 0; i < menuPtr->numEntries; i++) {
+ mePtr = menuPtr->entries[i];
+ itemRect.left = menuRectPtr->left + mePtr->x;
+ itemRect.top = mtdPtr->virtualMenuTop + mePtr->y;
+ if (mePtr->entryFlags & ENTRY_LAST_COLUMN) {
+ itemRect.right = itemRect.left + menuPtr->totalWidth
+ - mePtr->x;
+ } else {
+ itemRect.right = itemRect.left + mePtr->width;
+ }
+ itemRect.bottom = itemRect.top
+ + mePtr->height;
+ if (PtInRect(hitPt, &itemRect)) {
+ if ((mePtr->type == SEPARATOR_ENTRY)
+ || (mePtr->state == ENTRY_DISABLED)) {
+ newItem = -1;
+ itemUnderMouse = i;
+ } else {
+ TkMenuEntry *cascadeEntryPtr;
+ int parentDisabled = 0;
+
+ for (cascadeEntryPtr=menuPtr->menuRefPtr->parentEntryPtr;
+ cascadeEntryPtr != NULL;
+ cascadeEntryPtr=cascadeEntryPtr->nextCascadePtr) {
+ char *name = Tcl_GetString(cascadeEntryPtr->namePtr);
+
+ if (strcmp(name, Tk_PathName(menuPtr->tkwin)) == 0) {
+ if (cascadeEntryPtr->state == ENTRY_DISABLED) {
+ parentDisabled = 1;
+ }
+ break;
+ }
+ }
+
+ if (parentDisabled) {
+ newItem = -1;
+ itemUnderMouse = i;
+ } else {
+ newItem = i;
+ itemUnderMouse = i;
+ }
+ }
+ break;
+ }
+ }
}
/*
* Now we need to take care of scrolling the menu.
*/
-
+
hasTopScroll = mtdPtr->virtualMenuTop < menuRectPtr->top;
hasBottomScroll = mtdPtr->virtualMenuBottom > menuRectPtr->bottom;
scrollDirection = DONT_SCROLL;
if (hasTopScroll && (hitPt.v < menuRectPtr->top + SICN_HEIGHT)) {
- newItem = -1;
- scrollDirection = DOWN_SCROLL;
- } else if (hasBottomScroll && (hitPt.v > (menuRectPtr->bottom - SICN_HEIGHT))) {
- newItem = -1;
- scrollDirection = UP_SCROLL;
+ newItem = -1;
+ scrollDirection = DOWN_SCROLL;
+ } else if (hasBottomScroll && (hitPt.v>menuRectPtr->bottom-SICN_HEIGHT)) {
+ newItem = -1;
+ scrollDirection = UP_SCROLL;
}
-
+
menuClipRect = *menuRectPtr;
if (hasTopScroll) {
- menuClipRect.top += SICN_HEIGHT;
+ menuClipRect.top += SICN_HEIGHT;
}
if (hasBottomScroll) {
- menuClipRect.bottom -= SICN_HEIGHT;
+ menuClipRect.bottom -= SICN_HEIGHT;
}
if (MDEFScrollFlag) {
- scrollDirection = DONT_SCROLL;
- MDEFScrollFlag = 0;
+ scrollDirection = DONT_SCROLL;
+ MDEFScrollFlag = 0;
}
GetClip(utilRgn);
ClipRect(&menuClipRect);
@@ -4465,100 +4328,96 @@ HandleMenuFindItemsMsg (MenuRef menu,
mtdPtr->itemSelected = newItem + 1;
mtdPtr->itemUnderMouse = itemUnderMouse + 1;
mtdPtr->itemRect = itemRect;
-
+
GetGWorld(&macMDEFDrawable.grafPtr, &device);
GetForeColor(&origForeColor);
GetBackColor(&origBackColor);
if (scrollDirection == UP_SCROLL) {
- scrollAmt = menuClipRect.bottom - hitPt.v;
- if (scrollAmt < menuRectPtr->bottom
- - mtdPtr->virtualMenuBottom) {
- scrollAmt = menuRectPtr->bottom - mtdPtr->virtualMenuBottom;
- }
- if (!hasTopScroll && ((mtdPtr->virtualMenuTop + scrollAmt)
- < menuRectPtr->top)) {
- SetRect(&updateRect, menuRectPtr->left,
- mtdPtr->virtualMenuTop, menuRectPtr->right,
- mtdPtr->virtualMenuTop + SICN_HEIGHT);
- EraseRect(&updateRect);
- DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC, menuRectPtr->left
- + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->top);
- menuClipRect.top += SICN_HEIGHT;
- }
+ scrollAmt = menuClipRect.bottom - hitPt.v;
+ if (scrollAmt < menuRectPtr->bottom - mtdPtr->virtualMenuBottom) {
+ scrollAmt = menuRectPtr->bottom - mtdPtr->virtualMenuBottom;
+ }
+ if (!hasTopScroll && ((mtdPtr->virtualMenuTop + scrollAmt)
+ < menuRectPtr->top)) {
+ SetRect(&updateRect, menuRectPtr->left,
+ mtdPtr->virtualMenuTop, menuRectPtr->right,
+ mtdPtr->virtualMenuTop + SICN_HEIGHT);
+ EraseRect(&updateRect);
+ DrawSICN(SICN_RESOURCE_NUMBER, UP_ARROW,
+ (Drawable) &macMDEFDrawable, menuPtr->textGC,
+ menuRectPtr->left + menuPtr->entries[1]->indicatorSpace,
+ menuRectPtr->top);
+ menuClipRect.top += SICN_HEIGHT;
+ }
} else if (scrollDirection == DOWN_SCROLL) {
+ scrollAmt = menuClipRect.top - hitPt.v;
+ if (scrollAmt > menuRectPtr->top - mtdPtr->virtualMenuTop) {
+ scrollAmt = menuRectPtr->top - mtdPtr->virtualMenuTop;
+ }
- scrollAmt = menuClipRect.top - hitPt.v;
- if (scrollAmt > menuRectPtr->top - mtdPtr->virtualMenuTop) {
- scrollAmt = menuRectPtr->top - mtdPtr->virtualMenuTop;
- }
-
- if (!hasBottomScroll && ((mtdPtr->virtualMenuBottom + scrollAmt)
- > menuRectPtr->bottom)) {
- SetRect(&updateRect, menuRectPtr->left,
- mtdPtr->virtualMenuBottom - SICN_HEIGHT,
- menuRectPtr->right, mtdPtr->virtualMenuBottom);
- EraseRect(&updateRect);
- DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW,
- (Drawable) &macMDEFDrawable,
- menuPtr->textGC, menuRectPtr->left
- + menuPtr->entries[1]->indicatorSpace,
- menuRectPtr->bottom - SICN_HEIGHT);
- menuClipRect.bottom -= SICN_HEIGHT;
- }
+ if (!hasBottomScroll && ((mtdPtr->virtualMenuBottom + scrollAmt)
+ > menuRectPtr->bottom)) {
+ SetRect(&updateRect, menuRectPtr->left,
+ mtdPtr->virtualMenuBottom - SICN_HEIGHT,
+ menuRectPtr->right, mtdPtr->virtualMenuBottom);
+ EraseRect(&updateRect);
+ DrawSICN(SICN_RESOURCE_NUMBER, DOWN_ARROW,
+ (Drawable) &macMDEFDrawable,
+ menuPtr->textGC, menuRectPtr->left
+ + menuPtr->entries[1]->indicatorSpace,
+ menuRectPtr->bottom - SICN_HEIGHT);
+ menuClipRect.bottom -= SICN_HEIGHT;
+ }
}
-
+
if (scrollDirection != DONT_SCROLL) {
#if 0
- Tk_Font menuFont;
- RgnHandle updateRgn = NewRgn();
+ Tk_Font menuFont;
+ RgnHandle updateRgn = NewRgn();
#endif
-
- ScrollMenuImage(menu, menuRectPtr, 0, scrollAmt, NULL);
- mtdPtr->virtualMenuTop += scrollAmt;
- mtdPtr->virtualMenuBottom += scrollAmt;
+
+ ScrollMenuImage(menu, menuRectPtr, 0, scrollAmt, NULL);
+ mtdPtr->virtualMenuTop += scrollAmt;
+ mtdPtr->virtualMenuBottom += scrollAmt;
#if 0
- GetRegionBounds(updateRgn,&updateRect);
- DisposeRgn(updateRgn);
- if (mtdPtr->virtualMenuTop == menuRectPtr->top) {
- updateRect.top -= SICN_HEIGHT;
- }
- if (mtdPtr->virtualMenuBottom == menuRectPtr->bottom) {
- updateRect.bottom += SICN_HEIGHT;
- }
- ClipRect(&updateRect);
- EraseRect(&updateRect);
- menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
- Tk_GetFontMetrics(menuFont, &fontMetrics);
- for (i = 0; i < menuPtr->numEntries; i++) {
- mePtr = menuPtr->entries[i];
- if (mtdPtr->virtualMenuTop + mePtr->y + mePtr->height
- < updateRect.top) {
- continue;
- } else if (mtdPtr->virtualMenuTop + mePtr->y
- > updateRect.bottom) {
- continue;
- }
- if (mePtr->fontPtr == NULL) {
- fmPtr = &fontMetrics;
- tkfont = menuFont;
- } else {
- tkfont = Tk_GetFontFromObj(menuPtr->tkwin,
- mePtr->fontPtr);
- Tk_GetFontMetrics(tkfont, &entryMetrics);
- fmPtr = &entryMetrics;
- }
- AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
- (Drawable) &macMDEFDrawable, fmPtr, tkfont,
- menuRectPtr->left + mePtr->x,
- mtdPtr->virtualMenuTop + mePtr->y,
- (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
- menuPtr->totalWidth - mePtr->x : mePtr->width,
- menuPtr->entries[i]->height);
- }
+ GetRegionBounds(updateRgn,&updateRect);
+ DisposeRgn(updateRgn);
+ if (mtdPtr->virtualMenuTop == menuRectPtr->top) {
+ updateRect.top -= SICN_HEIGHT;
+ }
+ if (mtdPtr->virtualMenuBottom == menuRectPtr->bottom) {
+ updateRect.bottom += SICN_HEIGHT;
+ }
+ ClipRect(&updateRect);
+ EraseRect(&updateRect);
+ menuFont = Tk_GetFontFromObj(menuPtr->tkwin, menuPtr->fontPtr);
+ Tk_GetFontMetrics(menuFont, &fontMetrics);
+ for (i = 0; i < menuPtr->numEntries; i++) {
+ mePtr = menuPtr->entries[i];
+ if (mtdPtr->virtualMenuTop + mePtr->y + mePtr->height
+ < updateRect.top) {
+ continue;
+ } else if (mtdPtr->virtualMenuTop+mePtr->y > updateRect.bottom) {
+ continue;
+ }
+
+ if (mePtr->fontPtr == NULL) {
+ fmPtr = &fontMetrics;
+ tkfont = menuFont;
+ } else {
+ tkfont = Tk_GetFontFromObj(menuPtr->tkwin, mePtr->fontPtr);
+ Tk_GetFontMetrics(tkfont, &entryMetrics);
+ fmPtr = &entryMetrics;
+ }
+ AppearanceEntryDrawWrapper(mePtr, menuRectPtr, mtdPtr,
+ (Drawable) &macMDEFDrawable, fmPtr, tkfont,
+ menuRectPtr->left + mePtr->x,
+ mtdPtr->virtualMenuTop + mePtr->y,
+ (mePtr->entryFlags & ENTRY_LAST_COLUMN) ?
+ menuPtr->totalWidth - mePtr->x : mePtr->width,
+ menuPtr->entries[i]->height);
+ }
#endif
}
@@ -4568,95 +4427,95 @@ HandleMenuFindItemsMsg (MenuRef menu,
RGBBackColor(&origBackColor);
/*
- * If the menu is a tearoff, and the mouse is outside the menu,
- * we need to draw the drag rectangle.
- *
- * In order for tearoffs to work properly, we need to set
- * the active member of the containing menubar.
- */
-
+ * If the menu is a tearoff, and the mouse is outside the menu, we need to
+ * draw the drag rectangle.
+ *
+ * In order for tearoffs to work properly, we need to set the active
+ * member of the containing menubar.
+ */
+
menuRefPtr = TkFindMenuReferences(menuPtr->interp,
- Tk_PathName(menuPtr->tkwin));
-
+ Tk_PathName(menuPtr->tkwin));
+
if ((menuRefPtr != NULL) && (menuRefPtr->parentEntryPtr != NULL)) {
- char *name;
- for (parentEntryPtr = menuRefPtr->parentEntryPtr;
- parentEntryPtr != NULL
- ; parentEntryPtr = parentEntryPtr->nextCascadePtr) {
- name = Tcl_GetStringFromObj(parentEntryPtr->namePtr,
- NULL);
- if (strcmp(name, Tk_PathName(menuPtr->tkwin)) != 0) {
- break;
- }
- }
- if (parentEntryPtr != NULL) {
- TkActivateMenuEntry(parentEntryPtr->menuPtr,
- parentEntryPtr->index);
- }
+ for (parentEntryPtr = menuRefPtr->parentEntryPtr;
+ parentEntryPtr != NULL;
+ parentEntryPtr = parentEntryPtr->nextCascadePtr) {
+ char *name = Tcl_GetString(parentEntryPtr->namePtr);
+
+ if (strcmp(name, Tk_PathName(menuPtr->tkwin)) != 0) {
+ break;
+ }
+ }
+ if (parentEntryPtr != NULL) {
+ TkActivateMenuEntry(parentEntryPtr->menuPtr,
+ parentEntryPtr->index);
+ }
}
-
+
if (menuPtr->tearoff) {
- scratchRect = *menuRectPtr;
- if (tearoffStruct.menuPtr == NULL) {
- scratchRect.top -= 10;
- scratchRect.bottom += 10;
- scratchRect.left -= 10;
- scratchRect.right += 10;
- }
-
- windowPart = FindWindow(hitPt, &whichWindow);
- if ((windowPart != inMenuBar) && (newItem == -1)
- && (hitPt.v != 0) && (hitPt.h != 0)
- && (!PtInRect(hitPt, &scratchRect))
- && (!PtInRect(hitPt, &tearoffStruct.excludeRect))) {
- unsigned long dummy;
- oldClipRgn = NewRgn();
- GetClip(oldClipRgn);
- GetForeColor(&origFgColor);
- GetPenState(&origPenState);
- GetForeColor(&fgColor);
- GetBackColor(&bgColor);
- GetGray(device, &bgColor, &fgColor);
- RGBForeColor(&fgColor);
- SetRect(&scratchRect, -32768, -32768, 32767, 32767);
- ClipRect(&scratchRect);
-
- dragRect = *menuRectPtr;
- tearoffStruct.menuPtr = menuPtr;
-
- PenMode(srcXor);
- dragRect = *menuRectPtr;
- OffsetRect(&dragRect, -dragRect.left, -dragRect.top);
- OffsetRect(&dragRect, tearoffStruct.point.h,
- tearoffStruct.point.v);
- if ((dragRect.top != 0) && (dragRect.left != 0)) {
- FrameRect(&dragRect);
- Delay(1, &dummy);
- FrameRect(&dragRect);
- }
- tearoffStruct.point = hitPt;
-
- SetClip(oldClipRgn);
- DisposeRgn(oldClipRgn);
- RGBForeColor(&origFgColor);
- SetPenState(&origPenState);
- } else {
- tearoffStruct.menuPtr = NULL;
- tearoffStruct.point.h = tearoffStruct.point.v = 0;
- }
+ scratchRect = *menuRectPtr;
+ if (tearoffStruct.menuPtr == NULL) {
+ scratchRect.top -= 10;
+ scratchRect.bottom += 10;
+ scratchRect.left -= 10;
+ scratchRect.right += 10;
+ }
+
+ windowPart = FindWindow(hitPt, &whichWindow);
+ if ((windowPart != inMenuBar) && (newItem == -1)
+ && (hitPt.v != 0) && (hitPt.h != 0)
+ && (!PtInRect(hitPt, &scratchRect))
+ && (!PtInRect(hitPt, &tearoffStruct.excludeRect))) {
+ unsigned long dummy;
+
+ oldClipRgn = NewRgn();
+ GetClip(oldClipRgn);
+ GetForeColor(&origFgColor);
+ GetPenState(&origPenState);
+ GetForeColor(&fgColor);
+ GetBackColor(&bgColor);
+ GetGray(device, &bgColor, &fgColor);
+ RGBForeColor(&fgColor);
+ SetRect(&scratchRect, -32768, -32768, 32767, 32767);
+ ClipRect(&scratchRect);
+
+ dragRect = *menuRectPtr;
+ tearoffStruct.menuPtr = menuPtr;
+
+ PenMode(srcXor);
+ dragRect = *menuRectPtr;
+ OffsetRect(&dragRect, -dragRect.left, -dragRect.top);
+ OffsetRect(&dragRect, tearoffStruct.point.h,
+ tearoffStruct.point.v);
+ if ((dragRect.top != 0) && (dragRect.left != 0)) {
+ FrameRect(&dragRect);
+ Delay(1, &dummy);
+ FrameRect(&dragRect);
+ }
+ tearoffStruct.point = hitPt;
+
+ SetClip(oldClipRgn);
+ DisposeRgn(oldClipRgn);
+ RGBForeColor(&origFgColor);
+ SetPenState(&origPenState);
+ } else {
+ tearoffStruct.menuPtr = NULL;
+ tearoffStruct.point.h = tearoffStruct.point.v = 0;
+ }
} else {
- tearoffStruct.menuPtr = NULL;
- tearoffStruct.point.h = tearoffStruct.point.v = 0;
- }
+ tearoffStruct.menuPtr = NULL;
+ tearoffStruct.point.h = tearoffStruct.point.v = 0;
+ }
}
-
+
/*
*----------------------------------------------------------------------
*
- * HandleMenuPopUpMsg --
+ * HandleMenuPopUpMsg --
*
- * It handles the MenuDefProc's PopUp message. The menu is
- * posted with the selected item at the point given in hitPt.
+ * It handles the MenuDefProc's PopUp message. The menu is posted with
+ * the selected item at the point given in hitPt.
*
* Results:
* A menu is posted.
@@ -4666,118 +4525,127 @@ HandleMenuFindItemsMsg (MenuRef menu,
*
*----------------------------------------------------------------------
*/
+
void
-HandleMenuPopUpMsg (MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr)
+HandleMenuPopUpMsg(
+ MenuRef menu,
+ Rect *menuRectPtr,
+ Point hitPt,
+ SInt16 *whichItem,
+ TkMenu *menuPtr)
{
- int maxMenuHeight;
- int oldItem;
+ int maxMenuHeight, oldItem;
Rect portRect;
BitMap screenBits;
/*
- * Note that for some oddball reason, h and v are reversed in the
- * point given to us by the MDEF.
- */
+ * Note that for some oddball reason, h and v are reversed in the point
+ * given to us by the MDEF.
+ */
+
GetQDGlobalsScreenBits(&screenBits);
oldItem = *whichItem;
if (oldItem >= menuPtr->numEntries) {
- oldItem = -1;
+ oldItem = -1;
}
portRect.top = 0;
portRect.bottom = 1280;
maxMenuHeight = screenBits.bounds.bottom
- - screenBits.bounds.top
- - GetMBarHeight() - SCREEN_MARGIN;
+ - screenBits.bounds.top - GetMBarHeight() - SCREEN_MARGIN;
if (menuPtr->totalHeight > maxMenuHeight) {
- menuRectPtr->top = GetMBarHeight();
+ menuRectPtr->top = GetMBarHeight();
} else {
- int delta;
- menuRectPtr->top = hitPt.h;
- if (oldItem >= 0) {
- menuRectPtr->top -= menuPtr->entries[oldItem]->y;
- }
-
- if (menuRectPtr->top < GetMBarHeight()) {
- /* Displace downward if the menu would stick off the
- * top of the screen.
- */
-
- menuRectPtr->top = GetMBarHeight() + SCREEN_MARGIN;
- } else {
- /*
- * Or upward if the menu sticks off the
- * bottom end...
- */
-
- delta = menuRectPtr->top + menuPtr->totalHeight
- - maxMenuHeight;
- if (delta > 0) {
- menuRectPtr->top -= delta;
- }
- }
+ int delta;
+
+ menuRectPtr->top = hitPt.h;
+ if (oldItem >= 0) {
+ menuRectPtr->top -= menuPtr->entries[oldItem]->y;
+ }
+
+ if (menuRectPtr->top < GetMBarHeight()) {
+ /*
+ * Displace downward if the menu would stick off the top of the
+ * screen.
+ */
+
+ menuRectPtr->top = GetMBarHeight() + SCREEN_MARGIN;
+ } else {
+ /*
+ * Or upward if the menu sticks off the bottom end...
+ */
+
+ delta = menuRectPtr->top + menuPtr->totalHeight - maxMenuHeight;
+ if (delta > 0) {
+ menuRectPtr->top -= delta;
+ }
+ }
}
menuRectPtr->left = hitPt.v;
menuRectPtr->right = menuRectPtr->left + menuPtr->totalWidth;
- menuRectPtr->bottom = menuRectPtr->top +
- ((maxMenuHeight < menuPtr->totalHeight)
- ? maxMenuHeight : menuPtr->totalHeight);
+ menuRectPtr->bottom = menuRectPtr->top +
+ ((maxMenuHeight < menuPtr->totalHeight)
+ ? maxMenuHeight : menuPtr->totalHeight);
if (menuRectPtr->top == GetMBarHeight()) {
- *whichItem = hitPt.h;
+ *whichItem = hitPt.h;
} else {
- *whichItem = menuRectPtr->top;
+ *whichItem = menuRectPtr->top;
}
}
-
+
/*
*----------------------------------------------------------------------
*
- * HandleMenuCalcItemMsg --
+ * HandleMenuCalcItemMsg --
*
- * It handles the MenuDefProc's CalcItem message. It is supposed
- * to calculate the Rect of the menu entry in whichItem in the
- * menu, and put that in menuRectPtr. I assume this works, but I
- * have never seen the MenuManager send this message.
+ * It handles the MenuDefProc's CalcItem message. It is supposed to
+ * calculate the Rect of the menu entry in whichItem in the menu, and put
+ * that in menuRectPtr. I assume this works, but I have never seen the
+ * MenuManager send this message.
*
* Results:
- * The Menu Manager is informed of the bounding rect of a
- * menu rect.
+ * The Menu Manager is informed of the bounding rect of a menu rect.
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
+
void
-HandleMenuCalcItemMsg(MenuRef menu,
- Rect *menuRectPtr,
- Point hitPt,
- SInt16 *whichItem,
- TkMenu *menuPtr)
+HandleMenuCalcItemMsg(
+ MenuRef menu,
+ Rect *menuRectPtr,
+ Point hitPt,
+ SInt16 *whichItem,
+ TkMenu *menuPtr)
{
TkMenuEntry *mePtr;
- MenuTrackingData mtd, *mtdPtr = &mtd;
+ MenuTrackingData mtd, *mtdPtr = &mtd;
int err, virtualTop;
-
+
err = GetMenuTrackingData(menu, mtdPtr);
if (err == noErr) {
- virtualTop = mtdPtr->virtualMenuTop;
+ virtualTop = mtdPtr->virtualMenuTop;
} else {
- virtualTop = 0;
+ virtualTop = 0;
}
-
+
mePtr = menuPtr->entries[*whichItem];
menuRectPtr->left = mePtr->x;
menuRectPtr->top = mePtr->y - virtualTop;
if (mePtr->entryFlags & ENTRY_LAST_COLUMN) {
- menuRectPtr->right = menuPtr->totalWidth;
+ menuRectPtr->right = menuPtr->totalWidth;
} else {
- menuRectPtr->right = mePtr->x + mePtr->width;
+ menuRectPtr->right = mePtr->x + mePtr->width;
}
- menuRectPtr->bottom = menuRectPtr->top
- + mePtr->height;
+ menuRectPtr->bottom = menuRectPtr->top + mePtr->height;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXMenubutton.c b/macosx/tkMacOSXMenubutton.c
index 50f2ed5..65c894f 100644
--- a/macosx/tkMacOSXMenubutton.c
+++ b/macosx/tkMacOSXMenubutton.c
@@ -1,16 +1,16 @@
-/*
+/*
* tkMacOSXMenubutton.c --
*
- * This file implements the Macintosh specific portion of the
- * menubutton widget.
+ * This file implements the Macintosh specific portion of the menubutton
+ * widget.
*
* Copyright (c) 1996 by Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXMenubutton.c,v 1.11 2006/07/20 06:25:19 das Exp $
+ * RCS: @(#) $Id: tkMacOSXMenubutton.c,v 1.12 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -24,28 +24,30 @@
#define kMenuAttrDoNotUseUserCommandKeys (1 << 7)
#endif
-#define kShadowOffset (3) /* amount to offset shadow from frame */
-#define kTriangleWidth (11) /* width of the triangle */
-#define kTriangleHeight (6) /* height of the triangle */
-#define kTriangleMargin (5) /* margin around triangle */
+#define kShadowOffset (3) /* amount to offset shadow from frame */
+#define kTriangleWidth (11) /* width of the triangle */
+#define kTriangleHeight (6) /* height of the triangle */
+#define kTriangleMargin (5) /* margin around triangle */
-#define TK_POPUP_OFFSET 32 /* size of popup marker */
+#define TK_POPUP_OFFSET 32 /* size of popup marker */
-MODULE_SCOPE int TkMacOSXGetNewMenuID _ANSI_ARGS_((Tcl_Interp *interp, TkMenu *menuInstPtr, int cascade, short *menuIDPtr));
-MODULE_SCOPE void TkMacOSXFreeMenuID _ANSI_ARGS_((short menuID));
+MODULE_SCOPE int TkMacOSXGetNewMenuID(Tcl_Interp *interp,
+ TkMenu *menuInstPtr, int cascade,
+ short *menuIDPtr);
+MODULE_SCOPE void TkMacOSXFreeMenuID(short menuID);
typedef struct {
SInt16 initialValue;
SInt16 minValue;
SInt16 maxValue;
SInt16 procID;
- int isBevel;
+ int isBevel;
} MenuButtonControlParams;
typedef struct {
- int len;
- Str255 title;
- ControlFontStyleRec style;
+ int len;
+ Str255 title;
+ ControlFontStyleRec style;
} ControlTitleParams;
/*
@@ -53,50 +55,49 @@ typedef struct {
*/
typedef struct MacMenuButton {
- TkMenuButton info; /* Generic button info. */
- WindowRef windowRef;
- ControlRef userPane;
- ControlRef control;
- MenuRef menuRef;
- RGBColor userPaneBackground;
- MenuButtonControlParams params;
- ControlTitleParams titleParams;
+ TkMenuButton info; /* Generic button info. */
+ WindowRef windowRef;
+ ControlRef userPane;
+ ControlRef control;
+ MenuRef menuRef;
+ RGBColor userPaneBackground;
+ MenuButtonControlParams params;
+ ControlTitleParams titleParams;
ControlButtonContentInfo bevelButtonContent;
- OpenCPicParams picParams;
- int flags;
+ OpenCPicParams picParams;
+ int flags;
} MacMenuButton;
/*
* Forward declarations for procedures defined later in this file:
*/
-static OSErr SetUserPaneDrawProc(ControlRef control,
- ControlUserPaneDrawProcPtr upp);
-static OSErr SetUserPaneSetUpSpecialBackgroundProc(ControlRef control,
- ControlUserPaneBackgroundProcPtr upp);
-static void UserPaneDraw(ControlRef control, ControlPartCode cpc);
-static void UserPaneBackgroundProc(ControlHandle,
- ControlBackgroundPtr info);
-static int MenuButtonInitControl ( MacMenuButton *mbPtr, Rect *paneRect, Rect *cntrRect );
-
-static int UpdateControlColors _ANSI_ARGS_((MacMenuButton *mbPtr ));
-static void ComputeMenuButtonControlParams _ANSI_ARGS_((TkMenuButton * mbPtr, MenuButtonControlParams * paramsPtr));
-static void ComputeControlTitleParams _ANSI_ARGS_((TkMenuButton * mbPtr, ControlTitleParams * paramsPtr));
-static void CompareControlTitleParams(
- ControlTitleParams * p1Ptr,
- ControlTitleParams * p2Ptr,
- int * titleChanged,
- int * styleChanged
-);
+static OSErr SetUserPaneDrawProc(ControlRef control,
+ ControlUserPaneDrawProcPtr upp);
+static OSErr SetUserPaneSetUpSpecialBackgroundProc(
+ ControlRef control,
+ ControlUserPaneBackgroundProcPtr upp);
+static void UserPaneDraw(ControlRef control, ControlPartCode cpc);
+static void UserPaneBackgroundProc(ControlHandle,
+ ControlBackgroundPtr info);
+static int MenuButtonInitControl(MacMenuButton *mbPtr,
+ Rect *paneRect, Rect *cntrRect);
+static int UpdateControlColors(MacMenuButton *mbPtr);
+static void ComputeMenuButtonControlParams(TkMenuButton *mbPtr,
+ MenuButtonControlParams *paramsPtr);
+static void ComputeControlTitleParams(TkMenuButton *mbPtr, ControlTitleParams *paramsPtr);
+static void CompareControlTitleParams(ControlTitleParams *p1Ptr,
+ ControlTitleParams *p2Ptr, int *titleChanged,
+ int *styleChanged);
/*
- * The structure below defines menubutton class behavior by means of
- * procedures that can be invoked from generic window code.
+ * The structure below defines menubutton class behavior by means of functions
+ * that can be invoked from generic window code.
*/
Tk_ClassProcs tkpMenubuttonClass = {
- sizeof(Tk_ClassProcs), /* size */
- TkMenuButtonWorldChanged, /* worldChangedProc */
+ sizeof(Tk_ClassProcs), /* size */
+ TkMenuButtonWorldChanged, /* worldChangedProc */
};
/*
@@ -104,13 +105,13 @@ Tk_ClassProcs tkpMenubuttonClass = {
*
* TkpCreateMenuButton --
*
- * Allocate a new TkMenuButton structure.
+ * Allocate a new TkMenuButton structure.
*
* Results:
- * Returns a newly allocated TkMenuButton structure.
+ * Returns a newly allocated TkMenuButton structure.
*
* Side effects:
- * Registers an event handler for the widget.
+ * Registers an event handler for the widget.
*
*----------------------------------------------------------------------
*/
@@ -120,6 +121,7 @@ TkpCreateMenuButton(
Tk_Window tkwin)
{
MacMenuButton *mbPtr = (MacMenuButton *) ckalloc(sizeof(MacMenuButton));
+
mbPtr->userPaneBackground.red = 0;
mbPtr->userPaneBackground.green = 0;
mbPtr->userPaneBackground.blue = ~0;
@@ -146,42 +148,39 @@ TkpCreateMenuButton(
*
* TkpDisplayMenuButton --
*
- * This procedure is invoked to display a menubutton widget.
+ * This procedure is invoked to display a menubutton widget.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Commands are output to X to display the menubutton in its
- * current mode.
+ * Commands are output to X to display the menubutton in its current
+ * mode.
*
*----------------------------------------------------------------------
*/
void
TkpDisplayMenuButton(
- ClientData clientData) /* Information about widget. */
+ ClientData clientData) /* Information about widget. */
{
TkMenuButton *butPtr = (TkMenuButton *) clientData;
Tk_Window tkwin = butPtr->tkwin;
- TkWindow * winPtr;
- Pixmap pixmap;
- MacMenuButton * mbPtr = (MacMenuButton *) butPtr;
+ TkWindow *winPtr;
+ Pixmap pixmap;
+ MacMenuButton *mbPtr = (MacMenuButton *) butPtr;
GWorldPtr dstPort;
CGrafPtr saveWorld;
GDHandle saveDevice;
- int hasImageOrBitmap = 0;
- int width, height;
- int err;
+ int hasImageOrBitmap = 0, width, height, err;
ControlButtonGraphicAlignment theAlignment;
-
Rect paneRect, cntrRect;
butPtr->flags &= ~REDRAW_PENDING;
if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) {
- return;
+ return;
}
- pixmap = ( Pixmap )Tk_WindowId(tkwin);
+ pixmap = (Pixmap) Tk_WindowId(tkwin);
GetGWorld(&saveWorld, &saveDevice);
dstPort = TkMacOSXGetDrawablePort(Tk_WindowId(tkwin));
SetGWorld(dstPort, NULL);
@@ -192,170 +191,167 @@ TkpDisplayMenuButton(
paneRect.top = winPtr->privatePtr->yOff;
paneRect.right = paneRect.left+Tk_Width(butPtr->tkwin)-1;
paneRect.bottom = paneRect.top+Tk_Height(butPtr->tkwin)-1;
-
+
cntrRect = paneRect;
-
+
cntrRect.left += butPtr->inset;
cntrRect.top += butPtr->inset;
cntrRect.right -= butPtr->inset;
cntrRect.bottom -= butPtr->inset;
if (mbPtr->userPane) {
- MenuButtonControlParams params;
- bzero(&params, sizeof(params));
- ComputeMenuButtonControlParams(butPtr, &params );
- if (bcmp(&params,&mbPtr->params,sizeof(params))) {
- if (mbPtr->userPane) {
- DisposeControl(mbPtr->userPane);
- mbPtr->userPane = NULL;
- mbPtr->control = NULL;
- }
- }
- }
- if (!mbPtr->userPane) {
- if (MenuButtonInitControl(mbPtr,&paneRect,&cntrRect ) ) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Init Control failed\n" );
-#endif
- return;
- }
- }
+ MenuButtonControlParams params;
+ bzero(&params, sizeof(params));
+ ComputeMenuButtonControlParams(butPtr, &params );
+ if (bcmp(&params,&mbPtr->params,sizeof(params))) {
+ if (mbPtr->userPane) {
+ DisposeControl(mbPtr->userPane);
+ mbPtr->userPane = NULL;
+ mbPtr->control = NULL;
+ }
+ }
+ }
+ if (!mbPtr->userPane) {
+ if (MenuButtonInitControl(mbPtr,&paneRect,&cntrRect)) {
+ ERR_MSG("Init Control failed");
+ return;
+ }
+ }
SetControlBounds(mbPtr->userPane,&paneRect);
- SetControlBounds(mbPtr->control,&cntrRect);
+ SetControlBounds(mbPtr->control,&cntrRect);
/*
* We need to cache the title and its style
*/
- if (!(mbPtr->flags&2)) {
- ControlTitleParams titleParams;
- int titleChanged;
- int styleChanged;
- ComputeControlTitleParams(butPtr,&titleParams);
- CompareControlTitleParams(&titleParams,&mbPtr->titleParams,
- &titleChanged,&styleChanged);
- if (titleChanged) {
- CFStringRef cf;
- cf = CFStringCreateWithCString(NULL,
- (char*) titleParams.title, kCFStringEncodingUTF8);
- if (hasImageOrBitmap) {
- SetControlTitleWithCFString(mbPtr->control, cf);
- } else {
- SetMenuItemTextWithCFString(mbPtr->menuRef, 1, cf);
- }
- CFRelease(cf);
- bcopy(titleParams.title,mbPtr->titleParams.title,titleParams.len+1);
- mbPtr->titleParams.len = titleParams.len;
- }
- if ((titleChanged||styleChanged) && titleParams .len) {
- if (hasImageOrBitmap) {
- err = SetControlFontStyle(mbPtr->control,&titleParams.style);
- if (err !=noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetControlFontStyle failed %d\n", err);
-#endif
- return;
- }
- }
- bcopy(&titleParams.style,&mbPtr->titleParams.style,sizeof(titleParams.style));
- }
+
+ if (!(mbPtr->flags & 2)) {
+ ControlTitleParams titleParams;
+ int titleChanged;
+ int styleChanged;
+
+ ComputeControlTitleParams(butPtr,&titleParams);
+ CompareControlTitleParams(&titleParams,&mbPtr->titleParams,
+ &titleChanged,&styleChanged);
+ if (titleChanged) {
+ CFStringRef cf = CFStringCreateWithCString(NULL,
+ (char*) titleParams.title, kCFStringEncodingUTF8);
+
+ if (hasImageOrBitmap) {
+ SetControlTitleWithCFString(mbPtr->control, cf);
+ } else {
+ SetMenuItemTextWithCFString(mbPtr->menuRef, 1, cf);
+ }
+ CFRelease(cf);
+ bcopy(titleParams.title, mbPtr->titleParams.title,
+ titleParams.len + 1);
+ mbPtr->titleParams.len = titleParams.len;
+ }
+ if ((titleChanged||styleChanged) && titleParams .len) {
+ if (hasImageOrBitmap) {
+ err = SetControlFontStyle(mbPtr->control,&titleParams.style);
+ LOG_ON_ERROR(SetControlFontStyle);
+ if (err != noErr) {
+ return;
+ }
+ }
+ bcopy(&titleParams.style, &mbPtr->titleParams.style,
+ sizeof(titleParams.style));
+ }
}
if (butPtr->image != None) {
- Tk_SizeOfImage(butPtr->image, &width, &height);
- hasImageOrBitmap = 1;
+ Tk_SizeOfImage(butPtr->image, &width, &height);
+ hasImageOrBitmap = 1;
} else if (butPtr->bitmap != None) {
- Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
- hasImageOrBitmap = 1;
+ Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height);
+ hasImageOrBitmap = 1;
}
if (hasImageOrBitmap) {
- mbPtr->picParams.srcRect.right = width;
- mbPtr->picParams.srcRect.bottom = height;
- /* Set the flag to circumvent clipping and bounds problems with OS 10.0.4 */
- tkPictureIsOpen = 1;
- if (!(mbPtr->bevelButtonContent.u.picture = OpenCPicture(&mbPtr->picParams)) ) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"OpenCPicture failed\n");
-#endif
- }
- /*
- * TO DO - There is one case where XCopyPlane calls CopyDeepMask,
- * which does not get recorded in the picture. So the bitmap code
- * will fail in that case.
- */
- if (butPtr->image != NULL) {
- Tk_RedrawImage(butPtr->image, 0, 0, width,
- height, pixmap, 0, 0);
- } else {
- XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, NULL, 0, 0,
- (unsigned int) width, (unsigned int) height, 0, 0, 1);
- }
- ClosePicture();
-
- tkPictureIsOpen = 0;
+ mbPtr->picParams.srcRect.right = width;
+ mbPtr->picParams.srcRect.bottom = height;
+
+ /*
+ * Set the flag to circumvent clipping and bounds problems with OS
+ * 10.0.4
+ */
+
+ tkPictureIsOpen = 1;
+ mbPtr->bevelButtonContent.u.picture = OpenCPicture(&mbPtr->picParams);
+ if (!mbPtr->bevelButtonContent.u.picture) {
+ ERR_MSG("OpenCPicture failed");
+ }
+
+ /*
+ * TO DO - There is one case where XCopyPlane calls CopyDeepMask,
+ * which does not get recorded in the picture. So the bitmap code will
+ * fail in that case.
+ */
+
+ if (butPtr->image != NULL) {
+ Tk_RedrawImage(butPtr->image, 0, 0, width, height, pixmap, 0, 0);
+ } else {
+ XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, NULL, 0, 0,
+ (unsigned int) width, (unsigned int) height, 0, 0, 1);
+ }
+ ClosePicture();
+
+ tkPictureIsOpen = 0;
err = SetControlData(mbPtr->control, kControlButtonPart,
- kControlBevelButtonContentTag,
- sizeof(ControlButtonContentInfo),
- (char *) &mbPtr->bevelButtonContent);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetControlData BevelButtonContent failed, %d\n", err );
-#endif
- }
- switch (butPtr->anchor) {
- case TK_ANCHOR_N:
- theAlignment = kControlBevelButtonAlignTop;
- break;
- case TK_ANCHOR_NE:
- theAlignment = kControlBevelButtonAlignTopRight;
- break;
- case TK_ANCHOR_E:
- theAlignment = kControlBevelButtonAlignRight;
- break;
- case TK_ANCHOR_SE:
- theAlignment = kControlBevelButtonAlignBottomRight;
- break;
- case TK_ANCHOR_S:
- theAlignment = kControlBevelButtonAlignBottom;
- break;
- case TK_ANCHOR_SW:
- theAlignment = kControlBevelButtonAlignBottomLeft;
- break;
- case TK_ANCHOR_W:
- theAlignment = kControlBevelButtonAlignLeft;
- break;
- case TK_ANCHOR_NW:
- theAlignment = kControlBevelButtonAlignTopLeft;
- break;
- case TK_ANCHOR_CENTER:
- theAlignment = kControlBevelButtonAlignCenter;
- break;
- }
-
+ kControlBevelButtonContentTag,
+ sizeof(ControlButtonContentInfo),
+ (char *) &mbPtr->bevelButtonContent);
+ LOG_ON_ERROR(SetControlData_BevelButtonContent);
+ switch (butPtr->anchor) {
+ case TK_ANCHOR_N:
+ theAlignment = kControlBevelButtonAlignTop;
+ break;
+ case TK_ANCHOR_NE:
+ theAlignment = kControlBevelButtonAlignTopRight;
+ break;
+ case TK_ANCHOR_E:
+ theAlignment = kControlBevelButtonAlignRight;
+ break;
+ case TK_ANCHOR_SE:
+ theAlignment = kControlBevelButtonAlignBottomRight;
+ break;
+ case TK_ANCHOR_S:
+ theAlignment = kControlBevelButtonAlignBottom;
+ break;
+ case TK_ANCHOR_SW:
+ theAlignment = kControlBevelButtonAlignBottomLeft;
+ break;
+ case TK_ANCHOR_W:
+ theAlignment = kControlBevelButtonAlignLeft;
+ break;
+ case TK_ANCHOR_NW:
+ theAlignment = kControlBevelButtonAlignTopLeft;
+ break;
+ case TK_ANCHOR_CENTER:
+ theAlignment = kControlBevelButtonAlignCenter;
+ break;
+ }
+
err = SetControlData(mbPtr->control, kControlButtonPart,
- kControlBevelButtonGraphicAlignTag,
- sizeof(ControlButtonGraphicAlignment),
+ kControlBevelButtonGraphicAlignTag,
+ sizeof(ControlButtonGraphicAlignment),
(char *) &theAlignment);
- if (err != noErr ) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetControlData BevelButtonGraphicAlign failed, %d\n", err );
-#endif
- }
+ LOG_ON_ERROR(SetControlData_BevelButtonGraphicAlign);
}
if (butPtr->flags & GOT_FOCUS) {
- HiliteControl(mbPtr->control,kControlButtonPart);
+ HiliteControl(mbPtr->control,kControlButtonPart);
} else {
- HiliteControl(mbPtr->control,kControlNoPart);
+ HiliteControl(mbPtr->control,kControlNoPart);
}
UpdateControlColors(mbPtr);
if (mbPtr->flags&2) {
- ShowControl(mbPtr->control);
- ShowControl(mbPtr->userPane);
- mbPtr->flags ^= 2;
+ ShowControl(mbPtr->control);
+ ShowControl(mbPtr->userPane);
+ mbPtr->flags ^= 2;
} else {
- Draw1Control(mbPtr->userPane);
- SetControlVisibility(mbPtr->control, true, true);
+ Draw1Control(mbPtr->userPane);
+ SetControlVisibility(mbPtr->control, true, true);
}
if (hasImageOrBitmap) {
- KillPicture(mbPtr->bevelButtonContent.u.picture);
+ KillPicture(mbPtr->bevelButtonContent.u.picture);
}
SetGWorld(saveWorld, saveDevice);
}
@@ -365,13 +361,13 @@ TkpDisplayMenuButton(
*
* TkpDestroyMenuButton --
*
- * Free data structures associated with the menubutton control.
+ * Free data structures associated with the menubutton control.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Restores the default control state.
+ * Restores the default control state.
*
*----------------------------------------------------------------------
*/
@@ -380,17 +376,18 @@ void
TkpDestroyMenuButton(
TkMenuButton *mbPtr)
{
- MacMenuButton * macMbPtr = (MacMenuButton *)mbPtr;
+ MacMenuButton *macMbPtr = (MacMenuButton *) mbPtr;
+
if (macMbPtr->userPane) {
- DisposeControl(macMbPtr->userPane);
- macMbPtr->userPane = NULL;
+ DisposeControl(macMbPtr->userPane);
+ macMbPtr->userPane = NULL;
}
if (macMbPtr->menuRef) {
- short menuID;
- menuID = GetMenuID(macMbPtr->menuRef);
- TkMacOSXFreeMenuID(menuID);
- DisposeMenu(macMbPtr->menuRef);
- macMbPtr->menuRef = NULL;
+ short menuID = GetMenuID(macMbPtr->menuRef);
+
+ TkMacOSXFreeMenuID(menuID);
+ DisposeMenu(macMbPtr->menuRef);
+ macMbPtr->menuRef = NULL;
}
}
@@ -399,82 +396,82 @@ TkpDestroyMenuButton(
*
* TkpComputeMenuButtonGeometry --
*
- * After changes in a menu button's text or bitmap, this procedure
- * recomputes the menu button's geometry and passes this information
- * along to the geometry manager for the window.
+ * After changes in a menu button's text or bitmap, this procedure
+ * recomputes the menu button's geometry and passes this information
+ * along to the geometry manager for the window.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The menu button's window may change size.
+ * The menu button's window may change size.
*
*----------------------------------------------------------------------
*/
void
TkpComputeMenuButtonGeometry(mbPtr)
- register TkMenuButton *mbPtr; /* Widget record for menu button. */
+ register TkMenuButton *mbPtr; /* Widget record for menu button. */
{
int width, height, mm, pixels;
int hasImageOrBitmap = 0;
mbPtr->inset = mbPtr->highlightWidth + mbPtr->borderWidth;
if (mbPtr->image != None) {
- Tk_SizeOfImage(mbPtr->image, &width, &height);
- if (mbPtr->width > 0) {
- width = mbPtr->width;
- }
- if (mbPtr->height > 0) {
- height = mbPtr->height;
- }
- hasImageOrBitmap = 1;
+ Tk_SizeOfImage(mbPtr->image, &width, &height);
+ if (mbPtr->width > 0) {
+ width = mbPtr->width;
+ }
+ if (mbPtr->height > 0) {
+ height = mbPtr->height;
+ }
+ hasImageOrBitmap = 1;
} else if (mbPtr->bitmap != None) {
- Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height);
- if (mbPtr->width > 0) {
- width = mbPtr->width;
- }
- if (mbPtr->height > 0) {
- height = mbPtr->height;
- }
- hasImageOrBitmap = 1;
+ Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height);
+ if (mbPtr->width > 0) {
+ width = mbPtr->width;
+ }
+ if (mbPtr->height > 0) {
+ height = mbPtr->height;
+ }
+ hasImageOrBitmap = 1;
} else {
- hasImageOrBitmap = 0;
- Tk_FreeTextLayout(mbPtr->textLayout);
- mbPtr->textLayout = Tk_ComputeTextLayout(mbPtr->tkfont, mbPtr->text,
- -1, mbPtr->wrapLength, mbPtr->justify, 0, &mbPtr->textWidth,
- &mbPtr->textHeight);
- width = mbPtr->textWidth;
- height = mbPtr->textHeight;
- if (mbPtr->width > 0) {
- width = mbPtr->width * Tk_TextWidth(mbPtr->tkfont, "0", 1);
- }
- if (mbPtr->height > 0) {
- Tk_FontMetrics fm;
-
- Tk_GetFontMetrics(mbPtr->tkfont, &fm);
- height = mbPtr->height * fm.linespace;
- }
- width += 2*mbPtr->padX;
- height += 2*mbPtr->padY;
+ hasImageOrBitmap = 0;
+ Tk_FreeTextLayout(mbPtr->textLayout);
+ mbPtr->textLayout = Tk_ComputeTextLayout(mbPtr->tkfont, mbPtr->text,
+ -1, mbPtr->wrapLength, mbPtr->justify, 0, &mbPtr->textWidth,
+ &mbPtr->textHeight);
+ width = mbPtr->textWidth;
+ height = mbPtr->textHeight;
+ if (mbPtr->width > 0) {
+ width = mbPtr->width * Tk_TextWidth(mbPtr->tkfont, "0", 1);
+ }
+ if (mbPtr->height > 0) {
+ Tk_FontMetrics fm;
+
+ Tk_GetFontMetrics(mbPtr->tkfont, &fm);
+ height = mbPtr->height * fm.linespace;
+ }
+ width += 2*mbPtr->padX;
+ height += 2*mbPtr->padY;
}
if (mbPtr->indicatorOn) {
- mm = WidthMMOfScreen(Tk_Screen(mbPtr->tkwin));
- pixels = WidthOfScreen(Tk_Screen(mbPtr->tkwin));
- mbPtr->indicatorHeight = kTriangleHeight;
- mbPtr->indicatorWidth = kTriangleWidth + kTriangleMargin;
- width += mbPtr->indicatorWidth;
+ mm = WidthMMOfScreen(Tk_Screen(mbPtr->tkwin));
+ pixels = WidthOfScreen(Tk_Screen(mbPtr->tkwin));
+ mbPtr->indicatorHeight = kTriangleHeight;
+ mbPtr->indicatorWidth = kTriangleWidth + kTriangleMargin;
+ width += mbPtr->indicatorWidth;
} else {
- mbPtr->indicatorHeight = 0;
- mbPtr->indicatorWidth = 0;
+ mbPtr->indicatorHeight = 0;
+ mbPtr->indicatorWidth = 0;
}
if (!hasImageOrBitmap) {
- width += TK_POPUP_OFFSET;
+ width += TK_POPUP_OFFSET;
}
Tk_GeometryRequest(mbPtr->tkwin, (int) (width + 2*mbPtr->inset),
- (int) (height + 2*mbPtr->inset));
+ (int) (height + 2*mbPtr->inset));
Tk_SetInternalBorder(mbPtr->tkwin, mbPtr->inset);
}
@@ -483,55 +480,56 @@ TkpComputeMenuButtonGeometry(mbPtr)
*
* ComputeMenuButtonControlParams --
*
- * This procedure computes the various parameters used
- * when creating a Carbon control (NewControl)
- * These are determined by the various tk menu button parameters
+ * This procedure computes the various parameters used when creating a
+ * Carbon control (NewControl). These are determined by the various tk
+ * menu button parameters
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * Sets the control initialisation parameters
+ * Sets the control initialisation parameters
*
*----------------------------------------------------------------------
*/
static void
-ComputeMenuButtonControlParams(TkMenuButton * mbPtr,
- MenuButtonControlParams * paramsPtr )
+ComputeMenuButtonControlParams(
+ TkMenuButton *mbPtr,
+ MenuButtonControlParams *paramsPtr)
{
int fakeMenuID = 256;
- /*
+ /*
* Determine ProcID based on button type and dimensions
*
- * We need to set minValue to some non-zero value,
- * Otherwise, the markers do not show up
+ * We need to set minValue to some non-zero value. Otherwise, the markers
+ * do not show up
*/
paramsPtr->minValue = kControlBehaviorMultiValueMenu;
paramsPtr->maxValue = 0;
if (mbPtr->image || mbPtr->bitmap) {
- paramsPtr->isBevel = 1;
- if (mbPtr->borderWidth <= 2) {
- paramsPtr->procID = kControlBevelButtonSmallBevelProc;
- } else if (mbPtr->borderWidth == 3) {
- paramsPtr->procID = kControlBevelButtonNormalBevelProc;
- } else {
- paramsPtr->procID = kControlBevelButtonLargeBevelProc;
- }
- if (mbPtr->indicatorOn) {
- paramsPtr->initialValue = fakeMenuID;
- } else {
- paramsPtr->initialValue = 0;
- }
+ paramsPtr->isBevel = 1;
+ if (mbPtr->borderWidth <= 2) {
+ paramsPtr->procID = kControlBevelButtonSmallBevelProc;
+ } else if (mbPtr->borderWidth == 3) {
+ paramsPtr->procID = kControlBevelButtonNormalBevelProc;
+ } else {
+ paramsPtr->procID = kControlBevelButtonLargeBevelProc;
+ }
+ if (mbPtr->indicatorOn) {
+ paramsPtr->initialValue = fakeMenuID;
+ } else {
+ paramsPtr->initialValue = 0;
+ }
} else {
- paramsPtr->isBevel = 0;
- paramsPtr->procID = kControlPopupButtonProc
- + kControlPopupVariableWidthVariant;
- paramsPtr->minValue = -12345;
- paramsPtr->maxValue = -1;
- paramsPtr->initialValue = 0;
+ paramsPtr->isBevel = 0;
+ paramsPtr->procID = kControlPopupButtonProc
+ + kControlPopupVariableWidthVariant;
+ paramsPtr->minValue = -12345;
+ paramsPtr->maxValue = -1;
+ paramsPtr->initialValue = 0;
}
}
@@ -541,199 +539,184 @@ ComputeMenuButtonControlParams(TkMenuButton * mbPtr,
* returns 0 if same, 1 otherwise
*----------------------------------------------------------------------
*/
+
static void
-CompareControlTitleParams(
- ControlTitleParams * p1Ptr,
- ControlTitleParams * p2Ptr,
- int * titleChanged,
- int * styleChanged
-)
+CompareControlTitleParams(
+ ControlTitleParams *p1Ptr,
+ ControlTitleParams *p2Ptr,
+ int *titleChanged,
+ int *styleChanged)
{
if (p1Ptr->len != p2Ptr->len) {
- *titleChanged = 1;
+ *titleChanged = 1;
+ } else if (bcmp(p1Ptr->title,p2Ptr->title,p1Ptr->len)) {
+ *titleChanged = 1;
} else {
- if (bcmp(p1Ptr->title,p2Ptr->title,p1Ptr->len)) {
- *titleChanged = 1;
- } else {
- *titleChanged = 0;
- }
+ *titleChanged = 0;
}
+
if (p1Ptr->len && p2Ptr->len) {
- *styleChanged = bcmp(&p1Ptr->style, &p2Ptr->style, sizeof(p2Ptr->style));
+ *styleChanged = bcmp(&p1Ptr->style, &p2Ptr->style,
+ sizeof(p2Ptr->style));
} else {
- *styleChanged = p1Ptr->len||p2Ptr->len;
+ *styleChanged = p1Ptr->len||p2Ptr->len;
}
}
-
+
static void
-ComputeControlTitleParams(TkMenuButton * butPtr, ControlTitleParams * paramsPtr )
+ComputeControlTitleParams(
+ TkMenuButton *butPtr,
+ ControlTitleParams *paramsPtr)
{
Tk_Font font;
- paramsPtr->len =TkFontGetFirstTextLayout(butPtr->textLayout,&font, (char*) paramsPtr->title);
- paramsPtr->title [paramsPtr->len] = 0;
+
+ paramsPtr->len = TkFontGetFirstTextLayout(butPtr->textLayout, &font,
+ (char*) paramsPtr->title);
+ paramsPtr->title[paramsPtr->len] = 0;
if (paramsPtr->len) {
- TkMacOSXInitControlFontStyle(font,&paramsPtr->style);
+ TkMacOSXInitControlFontStyle(font,&paramsPtr->style);
}
}
-
/*
*----------------------------------------------------------------------
*
* MenuButtonInitControl --
*
- * This procedure initialises a Carbon control
+ * This procedure initialises a Carbon control
*
* Results:
- * 0 on success, 1 on failure.
+ * 0 on success, 1 on failure.
*
* Side effects:
- * A background pane control and the control itself is created
- * The contol is embedded in the background control
- * The background control is embedded in the root control
- * of the containing window
- * The creation parameters for the control are also computed
+ * A background pane control and the control itself is created. The
+ * contol is embedded in the background control. The background control
+ * is embedded in the root control of the containing window. The creation
+ * parameters for the control are also computed
*
*----------------------------------------------------------------------
*/
+
int
-MenuButtonInitControl (
- MacMenuButton *mbPtr, /* Mac button. */
- Rect *paneRect,
- Rect *cntrRect
-)
+MenuButtonInitControl(
+ MacMenuButton *mbPtr, /* Mac button. */
+ Rect *paneRect,
+ Rect *cntrRect)
{
- OSStatus err;
- TkMenuButton * butPtr = ( TkMenuButton * )mbPtr;
- ControlRef rootControl;
- SInt16 procID;
- Boolean initiallyVisible;
- SInt16 initialValue;
- SInt16 minValue;
- SInt16 maxValue;
- SInt32 controlReference;
- short menuID;
-
- rootControl = TkMacOSXGetRootControl(Tk_WindowId(butPtr->tkwin));
- mbPtr->windowRef = GetWindowFromPort(TkMacOSXGetDrawablePort(Tk_WindowId(butPtr->tkwin)));
- /*
+ OSStatus err;
+ TkMenuButton *butPtr = (TkMenuButton *) mbPtr;
+ SInt16 procID, initialValue, minValue, maxValue;
+ Boolean initiallyVisible;
+ SInt32 controlReference;
+ short menuID;
+ ControlRef rootControl =
+ TkMacOSXGetRootControl(Tk_WindowId(butPtr->tkwin));
+
+ mbPtr->windowRef = GetWindowFromPort(
+ TkMacOSXGetDrawablePort(Tk_WindowId(butPtr->tkwin)));
+
+ /*
* Set up the user pane
*/
+
initiallyVisible = false;
- initialValue = kControlSupportsEmbedding|
- kControlHasSpecialBackground;
+ initialValue = kControlSupportsEmbedding|kControlHasSpecialBackground;
minValue = 0;
maxValue = 1;
procID = kControlUserPaneProc;
controlReference = (SInt32)mbPtr;
- mbPtr->userPane = NewControl(mbPtr->windowRef,
- paneRect, "\p",
- initiallyVisible,
- initialValue,
- minValue,
- maxValue,
- procID,
- controlReference );
+ mbPtr->userPane = NewControl(mbPtr->windowRef, paneRect, "\p",
+ initiallyVisible, initialValue, minValue, maxValue, procID,
+ controlReference);
if (!mbPtr->userPane) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Failed to create user pane control\n");
-#endif
- return 1;
+ ERR_MSG("Failed to create user pane control");
+ return 1;
}
err = EmbedControl(mbPtr->userPane,rootControl);
+ LOG_ON_ERROR(EmbedControl);
if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Failed to embed user pane control %d\n", (int) err);
-#endif
- return 1;
+ return 1;
}
SetUserPaneSetUpSpecialBackgroundProc(mbPtr->userPane,
- UserPaneBackgroundProc);
+ UserPaneBackgroundProc);
SetUserPaneDrawProc(mbPtr->userPane,UserPaneDraw);
initiallyVisible = false;
ComputeMenuButtonControlParams(butPtr,&mbPtr->params);
- /* Do this only if we are using bevel buttons */
+
+ /*
+ * Do this only if we are using bevel buttons.
+ */
+
ComputeControlTitleParams(butPtr,&mbPtr->titleParams);
mbPtr->control = NewControl(mbPtr->windowRef,
- cntrRect, "\p", //mbPtr->titleParams.title,
- initiallyVisible,
- mbPtr->params.initialValue,
- mbPtr->params.minValue,
- mbPtr->params.maxValue,
- mbPtr->params.procID,
- controlReference );
+ cntrRect, "\p", /*mbPtr->titleParams.title,*/
+ initiallyVisible, mbPtr->params.initialValue,
+ mbPtr->params.minValue, mbPtr->params.maxValue,
+ mbPtr->params.procID, controlReference);
+
if (!mbPtr->control) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"failed to create control of type %d : line %d\n",mbPtr->params.procID, __LINE__);
-#endif
- return 1;
+ ERR_MSG("failed to create control of type %d : line %d",
+ mbPtr->params.procID, __LINE__);
+ return 1;
}
- err = EmbedControl(mbPtr->control,mbPtr->userPane);
- if (err != noErr ) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"failed to embed control of type %d,%d\n",procID, (int) err);
-#endif
- return 1;
+ err = EmbedControl(mbPtr->control, mbPtr->userPane);
+ if (err != noErr) {
+ ERR_MSG("failed to embed control of type %d,%d\n", procID, (int) err);
+ return 1;
}
if (mbPtr->params.isBevel) {
- CFStringRef cf;
- cf = CFStringCreateWithCString(NULL,
- (char*) mbPtr->titleParams.title, kCFStringEncodingUTF8);
- SetControlTitleWithCFString(mbPtr->control, cf);
- CFRelease(cf);
- if (mbPtr->titleParams.len) {
- err = SetControlFontStyle(mbPtr->control,&mbPtr->titleParams.style);
- if (err !=noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetControlFontStyle failed %d\n", (int) err);
-#endif
- return 1;
- }
- }
+ CFStringRef cf = CFStringCreateWithCString(NULL,
+ (char*) mbPtr->titleParams.title, kCFStringEncodingUTF8);
+
+ SetControlTitleWithCFString(mbPtr->control, cf);
+ CFRelease(cf);
+ if (mbPtr->titleParams.len) {
+ err = SetControlFontStyle(mbPtr->control,
+ &mbPtr->titleParams.style);
+ LOG_ON_ERROR(SetControlFontStyle);
+ if (err != noErr) {
+ return 1;
+ }
+ }
} else {
- CFStringRef cfStr;
- err = TkMacOSXGetNewMenuID(mbPtr->info.interp, (TkMenu *)mbPtr, 0, &menuID);
- if (err != TCL_OK) {
- return 1;
- }
- err = CreateNewMenu(menuID, kMenuAttrDoNotUseUserCommandKeys,
- &(mbPtr->menuRef));
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"CreateNewMenu failed, %d.\n", (int) err);
-#endif
- return 1;
- }
- cfStr = CFStringCreateWithCString(NULL, Tk_PathName(mbPtr->info.tkwin),
- kCFStringEncodingUTF8);
- if (!cfStr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"CFStringCreateWithCString failed.\n");
-#endif
- return 1;
- }
- err = SetMenuTitleWithCFString(mbPtr->menuRef, cfStr);
- CFRelease(cfStr);
- if (err != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetMenuTitleWithCFString failed, %d.\n", (int) err);
-#endif
- return 1;
- }
- cfStr = CFStringCreateWithCString(NULL,
- (char*) mbPtr->titleParams.title, kCFStringEncodingUTF8);
- AppendMenuItemText(mbPtr->menuRef, "\px");
- if (cfStr) {
- SetMenuItemTextWithCFString(mbPtr->menuRef, 1, cfStr);
- CFRelease(cfStr);
- }
- err = SetControlData(mbPtr->control,
- kControlNoPart,
- kControlPopupButtonMenuRefTag,
- sizeof(mbPtr->menuRef), &mbPtr->menuRef);
- SetControlMinimum(mbPtr->control, 1);
- SetControlMaximum(mbPtr->control, 1);
- SetControlValue(mbPtr->control, 1);
+ CFStringRef cfStr;
+
+ err = TkMacOSXGetNewMenuID(mbPtr->info.interp, (TkMenu *) mbPtr, 0,
+ &menuID);
+ if (err != TCL_OK) {
+ return 1;
+ }
+ err = CreateNewMenu(menuID, kMenuAttrDoNotUseUserCommandKeys,
+ &(mbPtr->menuRef));
+ LOG_ON_ERROR(CreateNewMenu);
+ if (err != noErr) {
+ return 1;
+ }
+ cfStr = CFStringCreateWithCString(NULL, Tk_PathName(mbPtr->info.tkwin),
+ kCFStringEncodingUTF8);
+ if (!cfStr) {
+ ERR_MSG("CFStringCreateWithCString failed");
+ return 1;
+ }
+ err = SetMenuTitleWithCFString(mbPtr->menuRef, cfStr);
+ LOG_ON_ERROR(SetMenuTitleWithCFString);
+ CFRelease(cfStr);
+ if (err != noErr) {
+ return 1;
+ }
+ cfStr = CFStringCreateWithCString(NULL,
+ (char*) mbPtr->titleParams.title, kCFStringEncodingUTF8);
+ AppendMenuItemText(mbPtr->menuRef, "\px");
+ if (cfStr) {
+ SetMenuItemTextWithCFString(mbPtr->menuRef, 1, cfStr);
+ CFRelease(cfStr);
+ }
+ err = SetControlData(mbPtr->control, kControlNoPart,
+ kControlPopupButtonMenuRefTag,
+ sizeof(mbPtr->menuRef), &mbPtr->menuRef);
+ SetControlMinimum(mbPtr->control, 1);
+ SetControlMaximum(mbPtr->control, 1);
+ SetControlValue(mbPtr->control, 1);
}
mbPtr->flags |= 2;
return 0;
@@ -744,15 +727,14 @@ MenuButtonInitControl (
*
* SetUserPane
*
- * Utility function to add a UserPaneDrawProc
- * to a userPane control. From MoreControls code
- * from Apple DTS.
+ * Utility function to add a UserPaneDrawProc to a userPane control. From
+ * MoreControls code from Apple DTS.
*
* Results:
- * MacOS system error.
+ * MacOS system error.
*
* Side effects:
- * The user pane gets a new UserPaneDrawProc.
+ * The user pane gets a new UserPaneDrawProc.
*
*--------------------------------------------------------------
*/
@@ -760,12 +742,11 @@ OSErr SetUserPaneDrawProc (
ControlRef control,
ControlUserPaneDrawProcPtr upp)
{
- ControlUserPaneDrawUPP myControlUserPaneDrawUPP;
- myControlUserPaneDrawUPP = NewControlUserPaneDrawUPP(upp);
- return SetControlData (control,
- kControlNoPart, kControlUserPaneDrawProcTag,
- sizeof(myControlUserPaneDrawUPP),
- (Ptr) &myControlUserPaneDrawUPP);
+ ControlUserPaneDrawUPP myControlUserPaneDrawUPP =
+ NewControlUserPaneDrawUPP(upp);
+
+ return SetControlData(control, kControlNoPart,kControlUserPaneDrawProcTag,
+ sizeof(myControlUserPaneDrawUPP), (Ptr)&myControlUserPaneDrawUPP);
}
/*
@@ -773,28 +754,29 @@ OSErr SetUserPaneDrawProc (
*
* SetUserPaneSetUpSpecialBackgroundProc --
*
- * Utility function to add a UserPaneBackgroundProc
- * to a userPane control
+ * Utility function to add a UserPaneBackgroundProc to a userPane control
*
* Results:
- * MacOS system error.
+ * MacOS system error.
*
* Side effects:
- * The user pane gets a new UserPaneBackgroundProc.
+ * The user pane gets a new UserPaneBackgroundProc.
*
*--------------------------------------------------------------
*/
+
OSErr
SetUserPaneSetUpSpecialBackgroundProc(
- ControlRef control,
+ ControlRef control,
ControlUserPaneBackgroundProcPtr upp)
{
- ControlUserPaneBackgroundUPP myControlUserPaneBackgroundUPP;
- myControlUserPaneBackgroundUPP = NewControlUserPaneBackgroundUPP(upp);
- return SetControlData (control, kControlNoPart,
- kControlUserPaneBackgroundProcTag,
- sizeof(myControlUserPaneBackgroundUPP),
- (Ptr) &myControlUserPaneBackgroundUPP);
+ ControlUserPaneBackgroundUPP myControlUserPaneBackgroundUPP =
+ NewControlUserPaneBackgroundUPP(upp);
+
+ return SetControlData(control, kControlNoPart,
+ kControlUserPaneBackgroundProcTag,
+ sizeof(myControlUserPaneBackgroundUPP),
+ (Ptr) &myControlUserPaneBackgroundUPP);
}
/*
@@ -802,28 +784,29 @@ SetUserPaneSetUpSpecialBackgroundProc(
*
* UserPaneDraw --
*
- * This function draws the background of the user pane that will
- * lie under checkboxes and radiobuttons.
+ * This function draws the background of the user pane that will lie
+ * under checkboxes and radiobuttons.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The user pane gets updated to the current color.
+ * The user pane gets updated to the current color.
*
*--------------------------------------------------------------
*/
+
void
UserPaneDraw(
ControlRef control,
ControlPartCode cpc)
{
Rect contrlRect;
- MacMenuButton * mbPtr;
- mbPtr = ( MacMenuButton *)GetControlReference(control);
+ MacMenuButton *mbPtr = (MacMenuButton *) GetControlReference(control);
+
GetControlBounds(control,&contrlRect);
- RGBBackColor (&mbPtr->userPaneBackground);
- EraseRect (&contrlRect);
+ RGBBackColor(&mbPtr->userPaneBackground);
+ EraseRect(&contrlRect);
}
/*
@@ -831,14 +814,14 @@ UserPaneDraw(
*
* UserPaneBackgroundProc --
*
- * This function sets up the background of the user pane that will
- * lie under checkboxes and radiobuttons.
+ * This function sets up the background of the user pane that will lie
+ * under checkboxes and radiobuttons.
*
* Results:
- * None.
+ * None.
*
* Side effects:
- * The user pane background gets set to the current color.
+ * The user pane background gets set to the current color.
*
*--------------------------------------------------------------
*/
@@ -848,54 +831,62 @@ UserPaneBackgroundProc(
ControlHandle control,
ControlBackgroundPtr info)
{
- MacMenuButton * mbPtr;
- mbPtr = (MacMenuButton *)GetControlReference(control);
+ MacMenuButton *mbPtr = (MacMenuButton *) GetControlReference(control);
+
if (info->colorDevice) {
- RGBBackColor (&mbPtr->userPaneBackground);
+ RGBBackColor(&mbPtr->userPaneBackground);
}
}
-
-/*
+
+/*
*--------------------------------------------------------------
- *
+ *
* UpdateControlColors --
- *
- * This function will review the colors used to display
- * a Macintosh button. If any non-standard colors are
- * used we create a custom palette for the button, populate
- * with the colors for the button and install the palette.
- *
- * Under Appearance, we just set the pointer that will be
- * used by the UserPaneDrawProc.
- *
+ *
+ * This function will review the colors used to display a Macintosh
+ * button. If any non-standard colors are used we create a custom palette
+ * for the button, populate with the colors for the button and install
+ * the palette.
+ *
+ * Under Appearance, we just set the pointer that will be used by the
+ * UserPaneDrawProc.
+ *
* Results:
- * None.
- *
+ * None.
+ *
* Side effects:
- * The Macintosh control may get a custom palette installed.
+ * The Macintosh control may get a custom palette installed.
*
*--------------------------------------------------------------
*/
static int
-UpdateControlColors(MacMenuButton * mbPtr)
+UpdateControlColors(
+ MacMenuButton *mbPtr)
{
XColor *xcolor;
TkMenuButton * butPtr = ( TkMenuButton * )mbPtr;
-
+
/*
- * Under Appearance we cannot change the background of the
- * button itself. However, the color we are setting is the color
- * of the containing userPane. This will be the color that peeks
- * around the rounded corners of the button.
- * We make this the highlightbackground rather than the background,
- * because if you color the background of a frame containing a
- * button, you usually also color the highlightbackground as well,
- * or you will get a thin grey ring around the button.
+ * Under Appearance we cannot change the background of the button itself.
+ * However, the color we are setting is the color of the containing
+ * userPane. This will be the color that peeks around the rounded corners
+ * of the button. We make this the highlightbackground rather than the
+ * background, because if you color the background of a frame containing a
+ * button, you usually also color the highlightbackground as well, or you
+ * will get a thin grey ring around the button.
*/
xcolor = Tk_3DBorderColor(butPtr->normalBorder);
TkSetMacColor(xcolor->pixel, &mbPtr->userPaneBackground);
-
+
return false;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXMouseEvent.c b/macosx/tkMacOSXMouseEvent.c
index 0fc3473..b43e51d 100644
--- a/macosx/tkMacOSXMouseEvent.c
+++ b/macosx/tkMacOSXMouseEvent.c
@@ -54,7 +54,7 @@
* software in accordance with the terms specified in this
* license.
*
- * RCS: @(#) $Id: tkMacOSXMouseEvent.c,v 1.25 2006/09/10 17:06:32 das Exp $
+ * RCS: @(#) $Id: tkMacOSXMouseEvent.c,v 1.26 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -234,11 +234,8 @@ TkMacOSXProcessMouseEvent(TkMacOSXEvent *eventPtr, MacEventStatus * statusPtr)
status = GetEventParameter(eventPtr->eventRef,
kEventParamMouseWheelDelta, typeLongInteger, NULL,
sizeof(long), NULL, &medPtr->delta);
- if (status != noErr ) {
-#ifdef TK_MAC_DEBUG
- fprintf (stderr,
- "Failed to retrieve mouse wheel delta, %d\n", (int) status);
-#endif
+ if (status != noErr) {
+ ERR_MSG("Failed to retrieve mouse wheel delta, %d", (int) status);
statusPtr->err = 1;
return false;
} else {
@@ -533,21 +530,22 @@ GeneratePollingEvents(MouseEventData * medPtr)
*/
static void
-BringWindowForward(WindowRef wRef, Boolean isFrontProcess)
+BringWindowForward(
+ WindowRef wRef,
+ Boolean isFrontProcess)
{
if (!isFrontProcess) {
ProcessSerialNumber ourPsn = {0, kCurrentProcess};
OSStatus status = SetFrontProcess(&ourPsn);
if (status != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"SetFrontProcess failed, %d\n", (int) status);
-#endif
+ ERR_MSG("SetFrontProcess failed, %d", (int) status);
}
}
-
+
if (!TkpIsWindowFloating(wRef)) {
- if (IsValidWindowPtr(wRef))
+ if (IsValidWindowPtr(wRef)) {
SelectWindow(wRef);
+ }
}
}
diff --git a/macosx/tkMacOSXScale.c b/macosx/tkMacOSXScale.c
index 8c5e694..d90791d 100644
--- a/macosx/tkMacOSXScale.c
+++ b/macosx/tkMacOSXScale.c
@@ -1,16 +1,16 @@
-/*
+/*
* tkMacOSXScale.c --
*
- * This file implements the Macintosh specific portion of the
- * scale widget.
+ * This file implements the Macintosh specific portion of the scale
+ * widget.
*
* Copyright (c) 1996 by Sun Microsystems, Inc.
* Copyright (c) 1998-2000 by Scriptics Corporation.
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXScale.c,v 1.8 2006/04/28 06:02:49 das Exp $
+ * RCS: @(#) $Id: tkMacOSXScale.c,v 1.9 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -19,6 +19,7 @@
/*
* Defines used in this file.
*/
+
#define slider 1110
#define inSlider 1
#define inInc 2
@@ -43,10 +44,10 @@ static ControlActionUPP scaleActionProc = NULL; /* Pointer to func. */
* Forward declarations for procedures defined later in this file:
*/
-static void MacScaleEventProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static pascal void ScaleActionProc _ANSI_ARGS_((ControlRef theControl,
- ControlPartCode partCode));
+static void MacScaleEventProc(ClientData clientData,
+ XEvent *eventPtr);
+static pascal void ScaleActionProc(ControlRef theControl,
+ ControlPartCode partCode);
/*
*----------------------------------------------------------------------
@@ -65,20 +66,19 @@ static pascal void ScaleActionProc _ANSI_ARGS_((ControlRef theControl,
*/
TkScale *
-TkpCreateScale(tkwin)
- Tk_Window tkwin;
+TkpCreateScale(
+ Tk_Window tkwin)
{
- MacScale *macScalePtr;
-
- macScalePtr = (MacScale *) ckalloc(sizeof(MacScale));
+ MacScale *macScalePtr = (MacScale *) ckalloc(sizeof(MacScale));
+
macScalePtr->scaleHandle = NULL;
if (scaleActionProc == NULL) {
scaleActionProc = NewControlActionUPP(ScaleActionProc);
}
-
+
Tk_CreateEventHandler(tkwin, ButtonPressMask,
MacScaleEventProc, (ClientData) macScalePtr);
-
+
return (TkScale *) macScalePtr;
}
@@ -99,14 +99,15 @@ TkpCreateScale(tkwin)
*/
void
-TkpDestroyScale(scalePtr)
- TkScale *scalePtr;
+TkpDestroyScale(
+ TkScale *scalePtr)
{
MacScale *macScalePtr = (MacScale *) scalePtr;
-
+
/*
* Free Macintosh control.
*/
+
if (macScalePtr->scaleHandle != NULL) {
DisposeControl(macScalePtr->scaleHandle);
}
@@ -117,8 +118,8 @@ TkpDestroyScale(scalePtr)
*
* TkpDisplayScale --
*
- * This procedure is invoked as an idle handler to redisplay
- * the contents of a scale widget.
+ * This procedure is invoked as an idle handler to redisplay the contents
+ * of a scale widget.
*
* Results:
* None.
@@ -130,8 +131,8 @@ TkpDestroyScale(scalePtr)
*/
void
-TkpDisplayScale(clientData)
- ClientData clientData; /* Widget record for scale. */
+TkpDisplayScale(
+ ClientData clientData) /* Widget record for scale. */
{
TkScale *scalePtr = (TkScale *) clientData;
Tk_Window tkwin = scalePtr->tkwin;
@@ -141,19 +142,13 @@ TkpDisplayScale(clientData)
MacScale *macScalePtr = (MacScale *) clientData;
Rect r;
WindowRef windowRef;
- CGrafPtr destPort;
- CGrafPtr saveWorld;
+ CGrafPtr destPort, saveWorld;
GDHandle saveDevice;
MacDrawable *macDraw;
- SInt32 initialValue;
- SInt32 minValue;
- SInt32 maxValue;
- UInt16 numTicks;
-
-
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"TkpDisplayScale\n");
-#endif
+ SInt32 initialValue, minValue, maxValue;
+ UInt16 numTicks;
+
+ ERR_MSG("TkpDisplayScale");
scalePtr->flags &= ~REDRAW_PENDING;
if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(scalePtr->tkwin)) {
goto done;
@@ -167,8 +162,7 @@ TkpDisplayScale(clientData)
if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->command != NULL)) {
Tcl_Preserve((ClientData) interp);
sprintf(string, scalePtr->format, scalePtr->value);
- result = Tcl_VarEval(interp, scalePtr->command, " ", string,
- (char *) NULL);
+ result = Tcl_VarEval(interp, scalePtr->command, " ", string, NULL);
if (result != TCL_OK) {
Tcl_AddErrorInfo(interp, "\n (command executed by scale)");
Tcl_BackgroundError(interp);
@@ -183,15 +177,13 @@ TkpDisplayScale(clientData)
Tcl_Release((ClientData) scalePtr);
/*
- * Now handle the part of redisplay that is the same for
- * horizontal and vertical scales: border and traversal
- * highlight.
+ * Now handle the part of redisplay that is the same for horizontal and
+ * vertical scales: border and traversal highlight.
*/
if (scalePtr->highlightWidth != 0) {
- GC gc;
-
- gc = Tk_GCForColor(scalePtr->highlightColorPtr, Tk_WindowId(tkwin));
+ GC gc = Tk_GCForColor(scalePtr->highlightColorPtr,Tk_WindowId(tkwin));
+
Tk_DrawFocusHighlight(tkwin, gc, scalePtr->highlightWidth,
Tk_WindowId(tkwin));
}
@@ -204,6 +196,7 @@ TkpDisplayScale(clientData)
/*
* Set up port for drawing Macintosh control.
*/
+
macDraw = (MacDrawable *) Tk_WindowId(tkwin);
destPort = TkMacOSXGetDrawablePort(Tk_WindowId(tkwin));
windowRef = GetWindowFromPort(destPort);
@@ -218,79 +211,76 @@ TkpDisplayScale(clientData)
#define MAC_OSX_SCROLL_WIDTH 10
if (scalePtr->orient == ORIENT_HORIZONTAL) {
- int offset;
- offset = (Tk_Height(tkwin) - MAC_OSX_SCROLL_WIDTH)/2;
- if (offset < 0) {
- offset = 0;
- }
-
- r.left = macDraw->xOff + scalePtr->inset;
- r.top = macDraw->yOff + offset;
- r.right = macDraw->xOff+Tk_Width(tkwin) - scalePtr->inset;
- r.bottom = macDraw->yOff + offset + MAC_OSX_SCROLL_WIDTH/2;
+ int offset = (Tk_Height(tkwin) - MAC_OSX_SCROLL_WIDTH)/2;
+
+ if (offset < 0) {
+ offset = 0;
+ }
+
+ r.left = macDraw->xOff + scalePtr->inset;
+ r.top = macDraw->yOff + offset;
+ r.right = macDraw->xOff+Tk_Width(tkwin) - scalePtr->inset;
+ r.bottom = macDraw->yOff + offset + MAC_OSX_SCROLL_WIDTH/2;
} else {
- int offset;
-
- offset = (Tk_Width(tkwin) - MAC_OSX_SCROLL_WIDTH)/2;
- if (offset < 0) {
- offset = 0;
- }
-
- r.left = macDraw->xOff + offset;
- r.top = macDraw->yOff + scalePtr->inset;
- r.right = macDraw->xOff + offset + MAC_OSX_SCROLL_WIDTH/2;
- r.bottom = macDraw->yOff+Tk_Height(tkwin) - scalePtr->inset;
+ int offset = (Tk_Width(tkwin) - MAC_OSX_SCROLL_WIDTH)/2;
+
+ if (offset < 0) {
+ offset = 0;
+ }
+
+ r.left = macDraw->xOff + offset;
+ r.top = macDraw->yOff + scalePtr->inset;
+ r.right = macDraw->xOff + offset + MAC_OSX_SCROLL_WIDTH/2;
+ r.bottom = macDraw->yOff+Tk_Height(tkwin) - scalePtr->inset;
}
if (macScalePtr->scaleHandle == NULL) {
-
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Initialising scale\n");
-#endif
-
- initialValue = scalePtr->value;
- if (scalePtr->orient == ORIENT_HORIZONTAL) {
- minValue = scalePtr->fromValue;
- maxValue = scalePtr->toValue;
- } else {
- minValue = scalePtr->fromValue;
- maxValue = scalePtr->toValue;
- }
-
- if (scalePtr->tickInterval == 0) {
- numTicks = 0;
- } else {
- numTicks = (maxValue - minValue)/scalePtr->tickInterval;
- }
-
- CreateSliderControl(windowRef, &r, initialValue, minValue, maxValue,
- kControlSliderPointsDownOrRight, numTicks,
- 1, scaleActionProc,
- &(macScalePtr->scaleHandle));
- SetControlReference(macScalePtr->scaleHandle, (UInt32) scalePtr);
+ ERR_MSG("Initialising scale");
+
+ initialValue = scalePtr->value;
+ if (scalePtr->orient == ORIENT_HORIZONTAL) {
+ minValue = scalePtr->fromValue;
+ maxValue = scalePtr->toValue;
+ } else {
+ minValue = scalePtr->fromValue;
+ maxValue = scalePtr->toValue;
+ }
+
+ if (scalePtr->tickInterval == 0) {
+ numTicks = 0;
+ } else {
+ numTicks = (maxValue - minValue)/scalePtr->tickInterval;
+ }
+
+ CreateSliderControl(windowRef, &r, initialValue, minValue, maxValue,
+ kControlSliderPointsDownOrRight, numTicks, 1, scaleActionProc,
+ &(macScalePtr->scaleHandle));
+ SetControlReference(macScalePtr->scaleHandle, (UInt32) scalePtr);
/*
* If we are foremost than make us active.
*/
+
if (windowRef == FrontWindow()) {
macScalePtr->flags |= ACTIVE;
}
} else {
- SetControlBounds(macScalePtr->scaleHandle, &r);
- SetControl32BitValue(macScalePtr->scaleHandle, scalePtr->value);
- SetControl32BitMinimum(macScalePtr->scaleHandle, scalePtr->fromValue);
- SetControl32BitMaximum(macScalePtr->scaleHandle, scalePtr->toValue);
+ SetControlBounds(macScalePtr->scaleHandle, &r);
+ SetControl32BitValue(macScalePtr->scaleHandle, scalePtr->value);
+ SetControl32BitMinimum(macScalePtr->scaleHandle, scalePtr->fromValue);
+ SetControl32BitMaximum(macScalePtr->scaleHandle, scalePtr->toValue);
}
/*
* Finally draw the control.
*/
+
SetControlVisibility(macScalePtr->scaleHandle,true,true);
HiliteControl(macScalePtr->scaleHandle,0);
Draw1Control(macScalePtr->scaleHandle);
SetGWorld(saveWorld, saveDevice);
-done:
+ done:
scalePtr->flags &= ~REDRAW_ALL;
}
@@ -299,13 +289,12 @@ done:
*
* TkpScaleElement --
*
- * Determine which part of a scale widget lies under a given
- * point.
+ * Determine which part of a scale widget lies under a given point.
*
* Results:
- * The return value is either TROUGH1, SLIDER, TROUGH2, or
- * OTHER, depending on which of the scale's active elements
- * (if any) is under the point at (x,y).
+ * The return value is either TROUGH1, SLIDER, TROUGH2, or OTHER,
+ * depending on which of the scale's active elements (if any) is under
+ * the point at (x,y).
*
* Side effects:
* None.
@@ -314,9 +303,9 @@ done:
*/
int
-TkpScaleElement(scalePtr, x, y)
- TkScale *scalePtr; /* Widget record for scale. */
- int x, y; /* Coordinates within scalePtr's window. */
+TkpScaleElement(
+ TkScale *scalePtr, /* Widget record for scale. */
+ int x, int y) /* Coordinates within scalePtr's window. */
{
MacScale *macScalePtr = (MacScale *) scalePtr;
ControlPartCode part;
@@ -324,10 +313,9 @@ TkpScaleElement(scalePtr, x, y)
Rect bounds;
CGrafPtr saveWorld;
GDHandle saveDevice;
- GWorldPtr destPort;
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"TkpScaleElement\n");
-#endif
+ GWorldPtr destPort;
+
+ ERR_MSG("TkpScaleElement");
destPort = TkMacOSXGetDrawablePort(Tk_WindowId(scalePtr->tkwin));
GetGWorld(&saveWorld, &saveDevice);
@@ -335,37 +323,35 @@ TkpScaleElement(scalePtr, x, y)
/*
* All of the calculations in this procedure mirror those in
- * DisplayScrollbar. Be sure to keep the two consistent.
+ * DisplayScrollbar. Be sure to keep the two consistent.
*/
- TkMacOSXWinBounds((TkWindow *) scalePtr->tkwin, &bounds);
+ TkMacOSXWinBounds((TkWindow *) scalePtr->tkwin, &bounds);
where.h = x + bounds.left;
where.v = y + bounds.top;
part = TestControl(macScalePtr->scaleHandle, where);
-
+
SetGWorld(saveWorld, saveDevice);
-#ifdef TK_MAC_DEBUG
- fprintf (stderr,"ScalePart %d, pos ( %d %d )\n", part, where.h, where.v );
-#endif
-
+ ERR_MSG("ScalePart %d, pos ( %d %d )", part, where.h, where.v);
+
switch (part) {
- case inSlider:
- return SLIDER;
- case inInc:
- if (scalePtr->orient == ORIENT_VERTICAL) {
- return TROUGH1;
- } else {
- return TROUGH2;
- }
- case inDecr:
- if (scalePtr->orient == ORIENT_VERTICAL) {
- return TROUGH2;
- } else {
- return TROUGH1;
- }
- default:
- return OTHER;
+ case inSlider:
+ return SLIDER;
+ case inInc:
+ if (scalePtr->orient == ORIENT_VERTICAL) {
+ return TROUGH1;
+ } else {
+ return TROUGH2;
+ }
+ case inDecr:
+ if (scalePtr->orient == ORIENT_VERTICAL) {
+ return TROUGH2;
+ } else {
+ return TROUGH1;
+ }
+ default:
+ return OTHER;
}
}
@@ -374,23 +360,23 @@ TkpScaleElement(scalePtr, x, y)
*
* MacScaleEventProc --
*
- * This procedure is invoked by the Tk dispatcher for
- * ButtonPress events on scales.
+ * This procedure is invoked by the Tk dispatcher for ButtonPress events
+ * on scales.
*
* Results:
* None.
*
* Side effects:
- * When the window gets deleted, internal structures get
- * cleaned up. When it gets exposed, it is redisplayed.
+ * When the window gets deleted, internal structures get cleaned up. When
+ * it gets exposed, it is redisplayed.
*
*--------------------------------------------------------------
*/
static void
-MacScaleEventProc(clientData, eventPtr)
- ClientData clientData; /* Information about window. */
- XEvent *eventPtr; /* Information about event. */
+MacScaleEventProc(
+ ClientData clientData, /* Information about window. */
+ XEvent *eventPtr) /* Information about event. */
{
MacScale *macScalePtr = (MacScale *) clientData;
Point where;
@@ -400,44 +386,43 @@ MacScaleEventProc(clientData, eventPtr)
GDHandle saveDevice;
GWorldPtr destPort;
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"MacScaleEventProc\n" );
-#endif
+ ERR_MSG("MacScaleEventProc");
+
/*
- * To call Macintosh control routines we must have the port
- * set to the window containing the control. We will then test
- * which part of the control was hit and act accordingly.
+ * To call Macintosh control routines we must have the port set to the
+ * window containing the control. We will then test which part of the
+ * control was hit and act accordingly.
*/
+
destPort = TkMacOSXGetDrawablePort(Tk_WindowId(macScalePtr->info.tkwin));
GetGWorld(&saveWorld, &saveDevice);
SetGWorld(destPort, NULL);
TkMacOSXSetUpClippingRgn(Tk_WindowId(macScalePtr->info.tkwin));
- TkMacOSXWinBounds((TkWindow *) macScalePtr->info.tkwin, &bounds);
+ TkMacOSXWinBounds((TkWindow *) macScalePtr->info.tkwin, &bounds);
where.h = eventPtr->xbutton.x + bounds.left;
where.v = eventPtr->xbutton.y + bounds.top;
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"calling TestControl\n");
-#endif
+ ERR_MSG("calling TestControl");
part = TestControl(macScalePtr->scaleHandle, where);
if (part == 0) {
return;
}
-
+
part = TrackControl(macScalePtr->scaleHandle, where, scaleActionProc);
-
+
/*
* Update the value for the widget.
*/
+
macScalePtr->info.value = GetControlValue(macScalePtr->scaleHandle);
/* TkScaleSetValue(&macScalePtr->info, macScalePtr->info.value, 1, 0); */
/*
- * The TrackControl call will "eat" the ButtonUp event. We now
- * generate a ButtonUp event so Tk will unset implicit grabs etc.
+ * The TrackControl call will "eat" the ButtonUp event. We now generate a
+ * ButtonUp event so Tk will unset implicit grabs etc.
*/
- TkGenerateButtonEventForXPointer(Tk_WindowId(macScalePtr->info.tkwin));
+ TkGenerateButtonEventForXPointer(Tk_WindowId(macScalePtr->info.tkwin));
SetGWorld(saveWorld, saveDevice);
}
@@ -446,9 +431,9 @@ MacScaleEventProc(clientData, eventPtr)
*
* ScaleActionProc --
*
- * Callback procedure used by the Macintosh toolbox call
- * TrackControl. This call will update the display while
- * the scrollbar is being manipulated by the user.
+ * Callback procedure used by the Macintosh toolbox call TrackControl.
+ * This call will update the display while the scrollbar is being
+ * manipulated by the user.
*
* Results:
* None.
@@ -467,13 +452,18 @@ ScaleActionProc(
int value;
TkScale *scalePtr = (TkScale *) GetControlReference(theControl);
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"ScaleActionProc\n");
-#endif
- value = GetControlValue(theControl);
+ ERR_MSG("ScaleActionProc");
+ value = GetControlValue(theControl);
TkScaleSetValue(scalePtr, value, 1, 1);
Tcl_Preserve((ClientData) scalePtr);
Tcl_DoOneEvent(TCL_IDLE_EVENTS);
Tcl_Release((ClientData) scalePtr);
}
-
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/macosx/tkMacOSXWindowEvent.c b/macosx/tkMacOSXWindowEvent.c
index 1796cf3..a20ac8c 100644
--- a/macosx/tkMacOSXWindowEvent.c
+++ b/macosx/tkMacOSXWindowEvent.c
@@ -54,7 +54,7 @@
* software in accordance with the terms specified in this
* license.
*
- * RCS: @(#) $Id: tkMacOSXWindowEvent.c,v 1.18 2006/11/02 15:18:13 das Exp $
+ * RCS: @(#) $Id: tkMacOSXWindowEvent.c,v 1.19 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -203,39 +203,37 @@ TkMacOSXProcessWindowEvent(
sizeof(whichWindow), NULL,
&whichWindow);
if (status != noErr) {
-#ifdef TK_MAC_DEBUG
- fprintf ( stderr, "TkMacOSXHandleWindowEvent:Failed to retrieve window" );
-#endif
+ ERR_MSG("TkMacOSXHandleWindowEvent: Failed to retrieve window");
return 0;
}
-
+
window = TkMacOSXGetXWindow(whichWindow);
switch (eventPtr->eKind) {
- case kEventWindowActivated:
- eventFound |= GenerateActivateEvents(window, 1);
- eventFound |= TkMacOSXGenerateFocusEvent(window, 1);
- break;
- case kEventWindowDeactivated:
- eventFound |= GenerateActivateEvents(window, 0);
- eventFound |= TkMacOSXGenerateFocusEvent(window, 0);
- break;
- case kEventWindowUpdate:
- if (GenerateUpdateEvent(window)) {
- eventFound = true;
- }
- break;
- case kEventWindowExpanded: {
- TkDisplay *dispPtr;
- TkWindow *winPtr;
- dispPtr = TkGetDisplayList();
- winPtr = (TkWindow *)Tk_IdToWindow(dispPtr->display, window);
- if (winPtr) {
- TkpWmSetState(winPtr, TkMacOSXIsWindowZoomed(winPtr) ?
- ZoomState : NormalState);
- }
- break;
- }
+ case kEventWindowActivated:
+ eventFound |= GenerateActivateEvents(window, 1);
+ eventFound |= TkMacOSXGenerateFocusEvent(window, 1);
+ break;
+ case kEventWindowDeactivated:
+ eventFound |= GenerateActivateEvents(window, 0);
+ eventFound |= TkMacOSXGenerateFocusEvent(window, 0);
+ break;
+ case kEventWindowUpdate:
+ if (GenerateUpdateEvent(window)) {
+ eventFound = true;
+ }
+ break;
+ case kEventWindowExpanded: {
+ TkDisplay *dispPtr = TkGetDisplayList();
+ TkWindow *winPtr = (TkWindow *)
+ Tk_IdToWindow(dispPtr->display, window);
+
+ if (winPtr) {
+ TkpWmSetState(winPtr, TkMacOSXIsWindowZoomed(winPtr) ?
+ ZoomState : NormalState);
+ }
+ break;
+ }
}
return 0;
}
@@ -245,10 +243,10 @@ TkMacOSXProcessWindowEvent(
*
* GenerateUpdateEvent --
*
- * Given a Macintosh window update event this function generates
- * all the Expose XEvents needed by Tk.
+ * Given a Macintosh window update event this function generates all the
+ * Expose XEvents needed by Tk.
*
- * Results:
+ * Results:
* True if event(s) are generated - false otherwise.
*
* Side effects:
diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c
index 8d47c4b..d6a78c2 100644
--- a/macosx/tkMacOSXWm.c
+++ b/macosx/tkMacOSXWm.c
@@ -2,18 +2,18 @@
* tkMacOSXWm.c --
*
* This module takes care of the interactions between a Tk-based
- * application and the window manager. Among other things, it
- * implements the "wm" command and passes geometry information
- * to the window manager.
+ * application and the window manager. Among other things, it implements
+ * the "wm" command and passes geometry information to the window
+ * manager.
*
* Copyright (c) 1994-1997 Sun Microsystems, Inc.
* Copyright 2001, Apple Computer, Inc.
* Copyright (c) 2006 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.
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkMacOSXWm.c,v 1.46 2007/01/05 00:00:52 nijtmans Exp $
+ * RCS: @(#) $Id: tkMacOSXWm.c,v 1.47 2007/04/13 14:51:18 dkf Exp $
*/
#include "tkMacOSXInt.h"
@@ -41,21 +41,19 @@
TkMacOSXWindowList *tkMacOSXWindowListPtr = NULL;
/*
- * The variable below is used to enable or disable tracing in this
- * module. If tracing is enabled, then information is printed on
- * standard output about interesting interactions with the window
- * manager.
+ * The variable below is used to enable or disable tracing in this module. If
+ * tracing is enabled, then information is printed on standard output about
+ * interesting interactions with the window manager.
*/
static int wmTracing = 0;
/*
- * The following structure is the official type record for geometry
- * management of top-level windows.
+ * The following structure is the official type record for geometry management
+ * of top-level windows.
*/
-static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
- Tk_Window tkwin));
+static void TopLevelReqProc(ClientData dummy, Tk_Window tkwin);
static const Tk_GeomMgr wmMgrType = {
"wm", /* name */
@@ -80,126 +78,119 @@ static int windowHashInit = false;
* Forward declarations for procedures defined in this file:
*/
-static void InitialWindowBounds _ANSI_ARGS_((TkWindow *winPtr,
- Rect *geometry));
-static int ParseGeometry _ANSI_ARGS_((Tcl_Interp *interp,
- char *string, TkWindow *winPtr));
-static void TopLevelEventProc _ANSI_ARGS_((ClientData clientData,
- XEvent *eventPtr));
-static void WmStackorderToplevelWrapperMap _ANSI_ARGS_((
- TkWindow *winPtr,
- Display *display,
- Tcl_HashTable *table));
-static void TopLevelReqProc _ANSI_ARGS_((ClientData dummy,
- Tk_Window tkwin));
-static void UpdateGeometryInfo _ANSI_ARGS_((
- ClientData clientData));
-static void UpdateSizeHints _ANSI_ARGS_((TkWindow *winPtr));
-static void UpdateVRootGeometry _ANSI_ARGS_((WmInfo *wmPtr));
-static int WmAspectCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmAttributesCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
+static void InitialWindowBounds(TkWindow *winPtr, Rect *geometry);
+static int ParseGeometry(Tcl_Interp *interp,
+ char *string, TkWindow *winPtr);
+static void TopLevelEventProc(ClientData clientData,
+ XEvent *eventPtr);
+static void WmStackorderToplevelWrapperMap(TkWindow *winPtr,
+ Display *display, Tcl_HashTable *table);
+static void TopLevelReqProc(ClientData dummy,
+ Tk_Window tkwin);
+static void UpdateGeometryInfo(ClientData clientData);
+static void UpdateSizeHints(TkWindow *winPtr);
+static void UpdateVRootGeometry(WmInfo *wmPtr);
+static int WmAspectCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmAttributesCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
static Tcl_Obj * WmAttrGetModifiedStatus(WindowRef macWindow);
static Tcl_Obj * WmAttrGetTitlePath(WindowRef macWindow);
static Tcl_Obj * WmAttrGetAlpha(WindowRef macWindow);
static Tcl_Obj * WmAttrGetNotifyStatus(void);
static void WmAttrSetNotifyStatus(int state);
-static int WmClientCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmColormapwindowsCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmCommandCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmDeiconifyCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmFocusmodelCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmFrameCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmGeometryCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmGridCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmGroupCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconbitmapCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconifyCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconmaskCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconnameCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconphotoCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconpositionCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmIconwindowCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmMaxsizeCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmMinsizeCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmOverrideredirectCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmPositionfromCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmProtocolCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmResizableCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmSizefromCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmStackorderCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmStateCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmTitleCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmTransientCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static int WmWithdrawCmd _ANSI_ARGS_((Tk_Window tkwin,
- TkWindow *winPtr, Tcl_Interp *interp, int objc,
- Tcl_Obj *CONST objv[]));
-static void WmUpdateGeom _ANSI_ARGS_((WmInfo *wmPtr,
- TkWindow *winPtr));
-static int WmWinStyle _ANSI_ARGS_((Tcl_Interp *interp,
- TkWindow *winPtr, int objc,
- Tcl_Obj * CONST objv[]));
-static void ApplyWindowAttributeChanges _ANSI_ARGS_((
- TkWindow *winPtr, int newAttributes,
- int oldAttributes, int create));
-
+static int WmClientCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmColormapwindowsCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmCommandCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmDeiconifyCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmFocusmodelCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmFrameCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmGeometryCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmGridCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmGroupCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconbitmapCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconifyCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconmaskCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconnameCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconphotoCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconpositionCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmIconwindowCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmMaxsizeCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmMinsizeCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmOverrideredirectCmd(Tk_Window tkwin, TkWindow*winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmPositionfromCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmProtocolCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmResizableCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmSizefromCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmStackorderCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmStateCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmTitleCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmTransientCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static int WmWithdrawCmd(Tk_Window tkwin, TkWindow *winPtr,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]);
+static void WmUpdateGeom(WmInfo *wmPtr, TkWindow *winPtr);
+static int WmWinStyle(Tcl_Interp *interp, TkWindow *winPtr,
+ int objc, Tcl_Obj *CONST objv[]);
+static void ApplyWindowAttributeChanges(TkWindow *winPtr,
+ int newAttributes, int oldAttributes, int create);
+
/*
*--------------------------------------------------------------
*
@@ -2384,12 +2375,12 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
*/
static int
-WmProtocolCmd(tkwin, winPtr, interp, objc, objv)
-Tk_Window tkwin; /* Main window of the application. */
-TkWindow *winPtr; /* Toplevel to work with */
-Tcl_Interp *interp; /* Current interpreter. */
-int objc; /* Number of arguments. */
-Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmProtocolCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
register ProtocolHandler *protPtr, *prevPtr;
@@ -2405,10 +2396,11 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
/*
* Return a list of all defined protocols for the window.
*/
+
for (protPtr = wmPtr->protPtr; protPtr != NULL;
- protPtr = protPtr->nextPtr) {
+ protPtr = protPtr->nextPtr) {
Tcl_AppendElement(interp,
- Tk_GetAtomName((Tk_Window) winPtr, protPtr->protocol));
+ Tk_GetAtomName((Tk_Window) winPtr, protPtr->protocol));
}
return TCL_OK;
}
@@ -2417,6 +2409,7 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
/*
* Return the command to handle a given protocol.
*/
+
for (protPtr = wmPtr->protPtr; protPtr != NULL;
protPtr = protPtr->nextPtr) {
if (protPtr->protocol == protocol) {
@@ -2428,9 +2421,8 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
}
/*
- * Delete any current protocol handler, then create a new
- * one with the specified command, unless the command is
- * empty.
+ * Delete any current protocol handler, then create a new one with the
+ * specified command, unless the command is empty.
*/
for (protPtr = wmPtr->protPtr, prevPtr = NULL; protPtr != NULL;
@@ -2475,12 +2467,12 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
*/
static int
-WmResizableCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmResizableCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
int width, height;
@@ -2550,12 +2542,12 @@ WmResizableCmd(tkwin, winPtr, interp, objc, objv)
*/
static int
-WmSizefromCmd(tkwin, winPtr, interp, objc, objv)
-Tk_Window tkwin; /* Main window of the application. */
-TkWindow *winPtr; /* Toplevel to work with */
-Tcl_Interp *interp; /* Current interpreter. */
-int objc; /* Number of arguments. */
-Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmSizefromCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
static CONST char *optionStrings[] = {
@@ -2615,12 +2607,12 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
*/
static int
-WmStackorderCmd(tkwin, winPtr, interp, objc, objv)
-Tk_Window tkwin; /* Main window of the application. */
-TkWindow *winPtr; /* Toplevel to work with */
-Tcl_Interp *interp; /* Current interpreter. */
-int objc; /* Number of arguments. */
-Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmStackorderCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
TkWindow **windows, **window_ptr;
static CONST char *optionStrings[] = {
@@ -2673,9 +2665,8 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
}
/*
- * Lookup stacking order of all toplevels that are children
- * of "." and find the position of winPtr and winPtr2
- * in the stacking order.
+ * Lookup stacking order of all toplevels that are children of "." and
+ * find the position of winPtr and winPtr2 in the stacking order.
*/
windows = TkWmStackorderToplevel(winPtr->mainPtr->winPtr);
@@ -2732,16 +2723,16 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
*/
static int
-WmStateCmd(tkwin, winPtr, interp, objc, objv)
-Tk_Window tkwin; /* Main window of the application. */
-TkWindow *winPtr; /* Toplevel to work with */
-Tcl_Interp *interp; /* Current interpreter. */
-int objc; /* Number of arguments. */
-Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmStateCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
static CONST char *optionStrings[] = {
- "normal", "iconic", "withdrawn", "zoomed", (char *) NULL };
+ "normal", "iconic", "withdrawn", "zoomed", NULL };
enum options {
OPT_NORMAL, OPT_ICONIC, OPT_WITHDRAWN, OPT_ZOOMED };
int index;
@@ -2753,41 +2744,37 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
if (objc == 4) {
if (wmPtr->iconFor != NULL) {
Tcl_AppendResult(interp, "can't change state of ",
- Tcl_GetString(objv[2]),
- ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
+ Tcl_GetString(objv[2]), ": it is an icon for ",
+ Tk_PathName(wmPtr->iconFor), NULL);
return TCL_ERROR;
}
if (winPtr->flags & TK_EMBEDDED) {
Tcl_AppendResult(interp, "can't change state of ",
- winPtr->pathName, ": it is an embedded window",
- (char *) NULL);
+ winPtr->pathName, ": it is an embedded window", NULL);
return TCL_ERROR;
}
if (Tcl_GetIndexFromObj(interp, objv[3], optionStrings, "argument", 0,
- &index) != TCL_OK) {
+ &index) != TCL_OK) {
return TCL_ERROR;
}
if (index == OPT_NORMAL) {
TkpWmSetState(winPtr, NormalState);
+
/*
- * This varies from 'wm deiconify' because it does not
- * force the window to be raised and receive focus
+ * This varies from 'wm deiconify' because it does not force the
+ * window to be raised and receive focus
*/
} else if (index == OPT_ICONIC) {
if (Tk_Attributes((Tk_Window) winPtr)->override_redirect) {
- Tcl_AppendResult(interp, "can't iconify \"",
- winPtr->pathName,
- "\": override-redirect flag is set",
- (char *) NULL);
+ Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName,
+ "\": override-redirect flag is set", NULL);
return TCL_ERROR;
}
if (wmPtr->master != None) {
- Tcl_AppendResult(interp, "can't iconify \"",
- winPtr->pathName,
- "\": it is a transient", (char *) NULL);
+ Tcl_AppendResult(interp, "can't iconify \"", winPtr->pathName,
+ "\": it is a transient", NULL);
return TCL_ERROR;
}
TkpWmSetState(winPtr, IconicState);
@@ -2806,18 +2793,18 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
ZoomState : NormalState);
}
switch (wmPtr->hints.initial_state) {
- case NormalState:
- Tcl_SetResult(interp, "normal", TCL_STATIC);
- break;
- case IconicState:
- Tcl_SetResult(interp, "iconic", TCL_STATIC);
- break;
- case WithdrawnState:
- Tcl_SetResult(interp, "withdrawn", TCL_STATIC);
- break;
- case ZoomState:
- Tcl_SetResult(interp, "zoomed", TCL_STATIC);
- break;
+ case NormalState:
+ Tcl_SetResult(interp, "normal", TCL_STATIC);
+ break;
+ case IconicState:
+ Tcl_SetResult(interp, "iconic", TCL_STATIC);
+ break;
+ case WithdrawnState:
+ Tcl_SetResult(interp, "withdrawn", TCL_STATIC);
+ break;
+ case ZoomState:
+ Tcl_SetResult(interp, "zoomed", TCL_STATIC);
+ break;
}
}
}
@@ -2842,12 +2829,12 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
*/
static int
-WmTitleCmd(tkwin, winPtr, interp, objc, objv)
-Tk_Window tkwin; /* Main window of the application. */
-TkWindow *winPtr; /* Toplevel to work with */
-Tcl_Interp *interp; /* Current interpreter. */
-int objc; /* Number of arguments. */
-Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmTitleCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
char *argv3;
@@ -2858,16 +2845,15 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
return TCL_ERROR;
}
if (objc == 3) {
- Tcl_SetResult(interp,
- (char *) ((wmPtr->titleUid != NULL) ? wmPtr->titleUid : winPtr->nameUid),
- TCL_STATIC);
+ Tcl_SetResult(interp, (char *) ((wmPtr->titleUid != NULL)
+ ? wmPtr->titleUid : winPtr->nameUid), TCL_STATIC);
return TCL_OK;
- } else {
- argv3 = Tcl_GetStringFromObj(objv[3], &length);
- wmPtr->titleUid = Tk_GetUid(argv3);
- if (!(wmPtr->flags & WM_NEVER_MAPPED) && !Tk_IsEmbedded(winPtr)) {
- TkSetWMName(winPtr, wmPtr->titleUid);
- }
+ }
+
+ argv3 = Tcl_GetStringFromObj(objv[3], &length);
+ wmPtr->titleUid = Tk_GetUid(argv3);
+ if (!(wmPtr->flags & WM_NEVER_MAPPED) && !Tk_IsEmbedded(winPtr)) {
+ TkSetWMName(winPtr, wmPtr->titleUid);
}
return TCL_OK;
}
@@ -2890,19 +2876,18 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
*/
static int
-WmTransientCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmTransientCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
Tk_Window master;
WmInfo *wmPtr2;
char *argv3;
- int length;
- int oldAttributes = wmPtr->attributes;
+ int length, oldAttributes = wmPtr->attributes;
if ((objc != 3) && (objc != 4)) {
Tcl_WrongNumArgs(interp, 2, objv, "window ?master?");
@@ -2935,11 +2920,9 @@ WmTransientCmd(tkwin, winPtr, interp, objc, objv)
Tk_MakeWindowExist(master);
if (wmPtr->iconFor != NULL) {
- Tcl_AppendResult(interp, "can't make \"",
- Tcl_GetString(objv[2]),
- "\" a transient: it is an icon for ",
- Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
+ Tcl_AppendResult(interp, "can't make \"", Tcl_GetString(objv[2]),
+ "\" a transient: it is an icon for ",
+ Tk_PathName(wmPtr->iconFor), NULL);
return TCL_ERROR;
}
@@ -2960,7 +2943,7 @@ WmTransientCmd(tkwin, winPtr, interp, objc, objv)
"\" its own master", NULL);
return TCL_ERROR;
}
-
+
argv3 = Tcl_GetStringFromObj(objv[3], &length);
wmPtr->master = Tk_WindowId(master);
wmPtr->masterWindowName = ckalloc((unsigned) length+1);
@@ -2996,12 +2979,12 @@ WmTransientCmd(tkwin, winPtr, interp, objc, objv)
*/
static int
-WmWithdrawCmd(tkwin, winPtr, interp, objc, objv)
- Tk_Window tkwin; /* Main window of the application. */
- TkWindow *winPtr; /* Toplevel to work with */
- Tcl_Interp *interp; /* Current interpreter. */
- int objc; /* Number of arguments. */
- Tcl_Obj *CONST objv[]; /* Argument objects. */
+WmWithdrawCmd(
+ Tk_Window tkwin, /* Main window of the application. */
+ TkWindow *winPtr, /* Toplevel to work with */
+ Tcl_Interp *interp, /* Current interpreter. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
{
register WmInfo *wmPtr = winPtr->wmInfoPtr;
@@ -3011,22 +2994,22 @@ WmWithdrawCmd(tkwin, winPtr, interp, objc, objv)
}
if (wmPtr->iconFor != NULL) {
Tcl_AppendResult(interp, "can't withdraw ", Tcl_GetString(objv[2]),
- ": it is an icon for ", Tk_PathName(wmPtr->iconFor),
- (char *) NULL);
+ ": it is an icon for ", Tk_PathName(wmPtr->iconFor), NULL);
return TCL_ERROR;
}
TkpWmSetState(winPtr, WithdrawnState);
return TCL_OK;
}
-
+
/*
- * Invoked by those wm subcommands that affect geometry.
- * Schedules a geometry update.
+ * Invoked by those wm subcommands that affect geometry. Schedules a geometry
+ * update.
*/
+
static void
-WmUpdateGeom(wmPtr, winPtr)
-WmInfo *wmPtr;
-TkWindow *winPtr;
+WmUpdateGeom(
+ WmInfo *wmPtr,
+ TkWindow *winPtr)
{
if (!(wmPtr->flags & (WM_UPDATE_PENDING|WM_NEVER_MAPPED))) {
Tcl_DoWhenIdle(UpdateGeometryInfo, (ClientData) winPtr);
@@ -3039,33 +3022,33 @@ TkWindow *winPtr;
* Tk_SetGrid --
*
* This procedure is invoked by a widget when it wishes to set a grid
- * coordinate system that controls the size of a top-level window.
- * It provides a C interface equivalent to the "wm grid" command and
- * is usually asscoiated with the -setgrid option.
+ * coordinate system that controls the size of a top-level window. It
+ * provides a C interface equivalent to the "wm grid" command and is
+ * usually asscoiated with the -setgrid option.
*
* Results:
* None.
*
* Side effects:
- * Grid-related information will be passed to the window manager, so
- * that the top-level window associated with tkwin will resize on
- * even grid units. If some other window already controls gridding
- * for the top-level window then this procedure call has no effect.
+ * Grid-related information will be passed to the window manager, so that
+ * the top-level window associated with tkwin will resize on even grid
+ * units. If some other window already controls gridding for the
+ * top-level window then this procedure call has no effect.
*
*----------------------------------------------------------------------
*/
void
Tk_SetGrid(
- Tk_Window tkwin, /* Token for window. New window mgr info
- * will be posted for the top-level window
+ Tk_Window tkwin, /* Token for window. New window mgr info will
+ * be posted for the top-level window
* associated with this window. */
- int reqWidth, /* Width (in grid units) corresponding to
- * the requested geometry for tkwin. */
- int reqHeight, /* Height (in grid units) corresponding to
- * the requested geometry for tkwin. */
- int widthInc, int heightInc)/* Pixel increments corresponding to a
- * change of one grid unit. */
+ int reqWidth, /* Width (in grid units) corresponding to the
+ * requested geometry for tkwin. */
+ int reqHeight, /* Height (in grid units) corresponding to the
+ * requested geometry for tkwin. */
+ int widthInc, int heightInc)/* Pixel increments corresponding to a change
+ * of one grid unit. */
{
TkWindow *winPtr = (TkWindow *) tkwin;
WmInfo *wmPtr;
@@ -3073,6 +3056,7 @@ Tk_SetGrid(
/*
* Ensure widthInc and heightInc are greater than 0
*/
+
if (widthInc <= 0) {
widthInc = 1;
}
@@ -3104,15 +3088,15 @@ Tk_SetGrid(
}
/*
- * If gridding was previously off, then forget about any window
- * size requests made by the user or via "wm geometry": these are
- * in pixel units and there's no easy way to translate them to
- * grid units since the new requested size of the top-level window in
- * pixels may not yet have been registered yet (it may filter up
- * the hierarchy in DoWhenIdle handlers). However, if the window
- * has never been mapped yet then just leave the window size alone:
- * assume that it is intended to be in grid units but just happened
- * to have been specified before this procedure was called.
+ * If gridding was previously off, then forget about any window size
+ * requests made by the user or via "wm geometry": these are in pixel
+ * units and there's no easy way to translate them to grid units since the
+ * new requested size of the top-level window in pixels may not yet have
+ * been registered yet (it may filter up the hierarchy in DoWhenIdle
+ * handlers). However, if the window has never been mapped yet then just
+ * leave the window size alone: assume that it is intended to be in grid
+ * units but just happened to have been specified before this procedure
+ * was called.
*/
if ((wmPtr->gridWin == NULL) && !(wmPtr->flags & WM_NEVER_MAPPED)) {
@@ -3120,9 +3104,9 @@ Tk_SetGrid(
wmPtr->height = -1;
}
- /*
- * Set the new gridding information, and start the process of passing
- * all of this information to the window manager.
+ /*
+ * Set the new gridding information, and start the process of passing all
+ * of this information to the window manager.
*/
wmPtr->gridWin = tkwin;
@@ -3143,16 +3127,15 @@ Tk_SetGrid(
*
* Tk_UnsetGrid --
*
- * This procedure cancels the effect of a previous call
- * to Tk_SetGrid.
+ * This procedure cancels the effect of a previous call to Tk_SetGrid.
*
* Results:
* None.
*
* Side effects:
* If tkwin currently controls gridding for its top-level window,
- * gridding is cancelled for that top-level window; if some other
- * window controls gridding then this procedure has no effect.
+ * gridding is cancelled for that top-level window; if some other window
+ * controls gridding then this procedure has no effect.
*
*----------------------------------------------------------------------
*/
@@ -3208,34 +3191,32 @@ Tk_UnsetGrid(
* None.
*
* Side effects:
- * Tk's internal data structures for the window get modified to
- * reflect the structural change.
+ * Tk's internal data structures for the window get modified to reflect
+ * the structural change.
*
*----------------------------------------------------------------------
*/
static void
TopLevelEventProc(
- ClientData clientData, /* Window for which event occurred. */
- XEvent *eventPtr) /* Event that just happened. */
+ ClientData clientData, /* Window for which event occurred. */
+ XEvent *eventPtr) /* Event that just happened. */
{
TkWindow *winPtr = (TkWindow *) clientData;
winPtr->wmInfoPtr->flags |= WM_VROOT_OFFSET_STALE;
if (eventPtr->type == DestroyNotify) {
- Tk_ErrorHandler handler;
-
if (!(winPtr->flags & TK_ALREADY_DEAD)) {
/*
* A top-level window was deleted externally (e.g., by the window
- * manager). This is probably not a good thing, but cleanup as
- * best we can. The error handler is needed because
+ * manager). This is probably not a good thing, but cleanup as
+ * best we can. The error handler is needed because
* Tk_DestroyWindow will try to destroy the window, but of course
* it's already gone.
*/
-
- handler = Tk_CreateErrorHandler(winPtr->display, -1, -1, -1,
- (Tk_ErrorProc *) NULL, (ClientData) NULL);
+
+ Tk_ErrorHandler handler = Tk_CreateErrorHandler(winPtr->display,
+ -1, -1, -1, (Tk_ErrorProc *) NULL, (ClientData) NULL);
Tk_DestroyWindow((Tk_Window) winPtr);
Tk_DeleteErrorHandler(handler);
}
@@ -3252,15 +3233,15 @@ TopLevelEventProc(
*
* TopLevelReqProc --
*
- * This procedure is invoked by the geometry manager whenever
- * the requested size for a top-level window is changed.
+ * This procedure is invoked by the geometry manager whenever the
+ * requested size for a top-level window is changed.
*
* Results:
* None.
*
* Side effects:
- * Arrange for the window to be resized to satisfy the request
- * (this happens as a when-idle action).
+ * Arrange for the window to be resized to satisfy the request (this
+ * happens as a when-idle action).
*
*----------------------------------------------------------------------
*/
@@ -3268,8 +3249,8 @@ TopLevelEventProc(
/* ARGSUSED */
static void
TopLevelReqProc(
- ClientData dummy, /* Not used. */
- Tk_Window tkwin) /* Information about window. */
+ ClientData dummy, /* Not used. */
+ Tk_Window tkwin) /* Information about window. */
{
TkWindow *winPtr = (TkWindow *) tkwin;
WmInfo *wmPtr;
@@ -3287,44 +3268,40 @@ TopLevelReqProc(
*
* UpdateGeometryInfo --
*
- * This procedure is invoked when a top-level window is first
- * mapped, and also as a when-idle procedure, to bring the
- * geometry and/or position of a top-level window back into
- * line with what has been requested by the user and/or widgets.
- * This procedure doesn't return until the window manager has
- * responded to the geometry change.
+ * This procedure is invoked when a top-level window is first mapped, and
+ * also as a when-idle procedure, to bring the geometry and/or position
+ * of a top-level window back into line with what has been requested by
+ * the user and/or widgets. This procedure doesn't return until the
+ * window manager has responded to the geometry change.
*
* Results:
* None.
*
* Side effects:
- * The window's size and location may change, unless the WM prevents
- * that from happening.
+ * The window's size and location may change, unless the WM prevents that
+ * from happening.
*
*----------------------------------------------------------------------
*/
static void
UpdateGeometryInfo(
- ClientData clientData) /* Pointer to the window's record. */
+ ClientData clientData) /* Pointer to the window's record. */
{
TkWindow *winPtr = (TkWindow *) clientData;
WmInfo *wmPtr = winPtr->wmInfoPtr;
- int x, y, width, height;
- int min, max;
+ int x, y, width, height, min, max;
unsigned long serial;
wmPtr->flags &= ~WM_UPDATE_PENDING;
/*
- * Compute the new size for the top-level window. See the
- * user documentation for details on this, but the size
- * requested depends on (a) the size requested internally
- * by the window's widgets, (b) the size requested by the
- * user in a "wm geometry" command or via wm-based interactive
- * resizing (if any), and (c) whether or not the window is
- * gridded. Don't permit sizes <= 0 because this upsets
- * the X server.
+ * Compute the new size for the top-level window. See the user
+ * documentation for details on this, but the size requested depends on
+ * (a) the size requested internally by the window's widgets, (b) the size
+ * requested by the user in a "wm geometry" command or via wm-based
+ * interactive resizing (if any), and (c) whether or not the window is
+ * gridded. Don't permit sizes <= 0 because this upsets the X server.
*/
if (wmPtr->width == -1) {
@@ -3399,10 +3376,10 @@ UpdateGeometryInfo(
/*
* Compute the new position for the upper-left pixel of the window's
- * decorative frame. This is tricky, because we need to include the
- * border widths supplied by a reparented parent in this calculation,
- * but can't use the parent's current overall size since that may
- * change as a result of this code.
+ * decorative frame. This is tricky, because we need to include the border
+ * widths supplied by a reparented parent in this calculation, but can't
+ * use the parent's current overall size since that may change as a result
+ * of this code.
*/
if (wmPtr->flags & WM_NEGATIVE_X) {
@@ -3419,10 +3396,10 @@ UpdateGeometryInfo(
}
/*
- * If the window's size is going to change and the window is
- * supposed to not be resizable by the user, then we have to
- * update the size hints. There may also be a size-hint-update
- * request pending from somewhere else, too.
+ * If the window's size is going to change and the window is supposed to
+ * not be resizable by the user, then we have to update the size hints.
+ * There may also be a size-hint-update request pending from somewhere
+ * else, too.
*/
if (((width != winPtr->changes.width)
@@ -3436,40 +3413,37 @@ UpdateGeometryInfo(
}
/*
- * Reconfigure the window if it isn't already configured correctly.
- * A few tricky points:
+ * Reconfigure the window if it isn't already configured correctly. A few
+ * tricky points:
*
- * 1. If the window is embedded and the container is also in this
- * process, don't actually reconfigure the window; just pass the
- * desired size on to the container. Also, zero out any position
- * information, since embedded windows are not allowed to move.
- * 2. Sometimes the window manager will give us a different size
- * than we asked for (e.g. mwm has a minimum size for windows), so
- * base the size check on what we *asked for* last time, not what we
- * got.
- * 3. Don't move window unless a new position has been requested for
- * it. This is because of "features" in some window managers (e.g.
- * twm, as of 4/24/91) where they don't interpret coordinates
- * according to ICCCM. Moving a window to its current location may
- * cause it to shift position on the screen.
+ * 1. If the window is embedded and the container is also in this process,
+ * don't actually reconfigure the window; just pass the desired size on
+ * to the container. Also, zero out any position information, since
+ * embedded windows are not allowed to move.
+ * 2. Sometimes the window manager will give us a different size than we
+ * asked for (e.g. mwm has a minimum size for windows), so base the
+ * size check on what we *asked for* last time, not what we got.
+ * 3. Don't move window unless a new position has been requested for it.
+ * This is because of "features" in some window managers (e.g. twm, as
+ * of 4/24/91) where they don't interpret coordinates according to
+ * ICCCM. Moving a window to its current location may cause it to shift
+ * position on the screen.
*/
if (Tk_IsEmbedded(winPtr)) {
- TkWindow *contWinPtr;
+ TkWindow *contWinPtr = TkpGetOtherWindow(winPtr);
- contWinPtr = TkpGetOtherWindow(winPtr);
-
/*
* NOTE: Here we should handle out of process embedding.
*/
- if (contWinPtr != NULL) {
+ if (contWinPtr != NULL) {
/*
* This window is embedded and the container is also in this
* process, so we don't need to do anything special about the
- * geometry, except to make sure that the desired size is known
- * by the container. Also, zero out any position information,
- * since embedded windows are not allowed to move.
+ * geometry, except to make sure that the desired size is known by
+ * the container. Also, zero out any position information, since
+ * embedded windows are not allowed to move.
*/
wmPtr->x = wmPtr->y = 0;
@@ -3478,6 +3452,7 @@ UpdateGeometryInfo(
}
return;
}
+
serial = NextRequest(winPtr->display);
if (wmPtr->flags & WM_MOVE_PENDING) {
wmPtr->configWidth = width;
@@ -3508,9 +3483,8 @@ UpdateGeometryInfo(
*
* UpdateSizeHints --
*
- * This procedure is called to update the window manager's
- * size hints information from the information in a WmInfo
- * structure.
+ * This procedure is called to update the window manager's size hints
+ * information from the information in a WmInfo structure.
*
* Results:
* None.
@@ -3537,13 +3511,12 @@ UpdateSizeHints(
*
* ParseGeometry --
*
- * This procedure parses a geometry string and updates
- * information used to control the geometry of a top-level
- * window.
+ * This procedure parses a geometry string and updates information used
+ * to control the geometry of a top-level window.
*
* Results:
- * A standard Tcl return value, plus an error message in
- * the interp's result if an error occurs.
+ * A standard Tcl return value, plus an error message in the interp's
+ * result if an error occurs.
*
* Side effects:
* The size and/or location of winPtr may change.
@@ -3554,10 +3527,10 @@ UpdateSizeHints(
static int
ParseGeometry(
Tcl_Interp *interp, /* Used for error reporting. */
- char *string, /* String containing new geometry. Has the
+ char *string, /* String containing new geometry. Has the
* standard form "=wxh+x+y". */
- TkWindow *winPtr) /* Pointer to top-level window whose
- * geometry is to be changed. */
+ TkWindow *winPtr) /* Pointer to top-level window whose geometry
+ * is to be changed. */
{
WmInfo *wmPtr = winPtr->wmInfoPtr;
int x, y, width, height, flags;
@@ -3573,9 +3546,9 @@ ParseGeometry(
}
/*
- * Parse the width and height, if they are present. Don't
- * actually update any of the fields of wmPtr until we've
- * successfully parsed the entire geometry string.
+ * Parse the width and height, if they are present. Don't actually update
+ * any of the fields of wmPtr until we've successfully parsed the entire
+ * geometry string.
*/
width = wmPtr->width;
@@ -3629,10 +3602,10 @@ ParseGeometry(
}
/*
- * Assume that the geometry information came from the user,
- * unless an explicit source has been specified. Otherwise
- * most window managers assume that the size hints were
- * program-specified and they ignore them.
+ * Assume that the geometry information came from the user, unless an
+ * explicit source has been specified. Otherwise most window managers
+ * assume that the size hints were program-specified and they ignore
+ * them.
*/
if ((wmPtr->sizeHintsFlags & (USPosition|PPosition)) == 0) {
@@ -3642,9 +3615,9 @@ ParseGeometry(
}
/*
- * Everything was parsed OK. Update the fields of *wmPtr and
- * arrange for the appropriate information to be percolated out
- * to the window manager at the next idle moment.
+ * Everything was parsed OK. Update the fields of *wmPtr and arrange for
+ * the appropriate information to be percolated out to the window manager
+ * at the next idle moment.
*/
wmPtr->width = width;
@@ -3674,15 +3647,15 @@ ParseGeometry(
*
* Tk_GetRootCoords --
*
- * Given a token for a window, this procedure traces through the
- * window's lineage to find the (virtual) root-window coordinates
- * corresponding to point (0,0) in the window.
+ * Given a token for a window, this procedure traces through the window's
+ * lineage to find the (virtual) root-window coordinates corresponding to
+ * point (0,0) in the window.
*
* Results:
- * The locations pointed to by xPtr and yPtr are filled in with
- * the root coordinates of the (0,0) point in tkwin. If a virtual
- * root window is in effect for the window, then the coordinates
- * in the virtual root are returned.
+ * The locations pointed to by xPtr and yPtr are filled in with the root
+ * coordinates of the (0,0) point in tkwin. If a virtual root window is
+ * in effect for the window, then the coordinates in the virtual root are
+ * returned.
*
* Side effects:
* None.
@@ -3700,9 +3673,8 @@ Tk_GetRootCoords(
TkWindow *winPtr = (TkWindow *) tkwin;
/*
- * Search back through this window's parents all the way to a
- * top-level window, combining the offsets of each window within
- * its parent.
+ * Search back through this window's parents all the way to a top-level
+ * window, combining the offsets of each window within its parent.
*/
x = y = 0;
@@ -3713,45 +3685,45 @@ Tk_GetRootCoords(
if (!(Tk_IsEmbedded(winPtr))) {
x += winPtr->wmInfoPtr->xInParent;
y += winPtr->wmInfoPtr->yInParent;
- break;
+ break;
} else {
- TkWindow *otherPtr;
-
- otherPtr = TkpGetOtherWindow(winPtr);
+ TkWindow *otherPtr = TkpGetOtherWindow(winPtr);
+
if (otherPtr != NULL) {
/*
- * The container window is in the same application.
- * Query its coordinates.
+ * The container window is in the same application. Query
+ * its coordinates.
*/
+
winPtr = otherPtr;
-
+
/*
- * Remember to offset by the container window here,
- * since at the end of this if branch, we will
- * pop out to the container's parent...
+ * Remember to offset by the container window here, since
+ * at the end of this if branch, we will pop out to the
+ * container's parent...
*/
-
+
x += winPtr->changes.x + winPtr->changes.border_width;
y += winPtr->changes.y + winPtr->changes.border_width;
-
} else {
Point theOffset;
-
+
if (tkMacOSXEmbedHandler->getOffsetProc != NULL) {
/*
- * We do not require that the changes.x & changes.y for
- * a non-Tk master window be kept up to date. So we
- * first subtract off the possibly bogus values that have
- * been added on at the top of this pass through the loop,
- * and then call out to the getOffsetProc to give us
- * the correct offset.
+ * We do not require that the changes.x & changes.y
+ * for a non-Tk master window be kept up to date. So
+ * we first subtract off the possibly bogus values
+ * that have been added on at the top of this pass
+ * through the loop, and then call out to the
+ * getOffsetProc to give us the correct offset.
*/
-
+
x -= winPtr->changes.x + winPtr->changes.border_width;
y -= winPtr->changes.y + winPtr->changes.border_width;
-
- tkMacOSXEmbedHandler->getOffsetProc((Tk_Window) winPtr, &theOffset);
-
+
+ tkMacOSXEmbedHandler->getOffsetProc((Tk_Window) winPtr,
+ &theOffset);
+
x += theOffset.h;
y += theOffset.v;
}
@@ -3770,14 +3742,14 @@ Tk_GetRootCoords(
*
* Tk_CoordsToWindow --
*
- * This is a Macintosh specific implementation of this function.
- * Given the root coordinates of a point, this procedure returns
- * the token for the top-most window covering that point, if
- * there exists such a window in this application.
+ * This is a Macintosh specific implementation of this function. Given
+ * the root coordinates of a point, this procedure returns the token for
+ * the top-most window covering that point, if there exists such a window
+ * in this application.
*
* Results:
- * The return result is either a token for the window corresponding
- * to rootX and rootY, or else NULL to indicate that there is no such
+ * The return result is either a token for the window corresponding to
+ * rootX and rootY, or else NULL to indicate that there is no such
* window.
*
* Side effects:
@@ -3788,19 +3760,19 @@ Tk_GetRootCoords(
Tk_Window
Tk_CoordsToWindow(
- int rootX, int rootY, /* Coordinates of point in root window. If
- * a virtual-root window manager is in use,
+ int rootX, int rootY, /* Coordinates of point in root window. If a
+ * virtual-root window manager is in use,
* these coordinates refer to the virtual
* root, not the real root. */
- Tk_Window tkwin) /* Token for any window in application;
- * used to identify the display. */
+ Tk_Window tkwin) /* Token for any window in application; used
+ * to identify the display. */
{
WindowPtr whichWin;
Point where;
Window rootChild;
TkWindow *winPtr, *childPtr;
- TkWindow *nextPtr; /* Coordinates of highest child found so
- * far that contains point. */
+ TkWindow *nextPtr; /* Coordinates of highest child found so far
+ * that contains point. */
int x, y; /* Coordinates in winPtr. */
int tmpx, tmpy, bd;
TkDisplay *dispPtr;
@@ -3808,7 +3780,7 @@ Tk_CoordsToWindow(
/*
* Step 1: find the top-level window that contains the desired point.
*/
-
+
where.h = rootX;
where.v = rootY;
FindWindow(where, &whichWin);
@@ -3823,10 +3795,10 @@ Tk_CoordsToWindow(
}
/*
- * Step 2: work down through the hierarchy underneath this window.
- * At each level, scan through all the children to find the highest
- * one in the stacking order that contains the point. Then repeat
- * the whole process on that child.
+ * Step 2: work down through the hierarchy underneath this window. At each
+ * level, scan through all the children to find the highest one in the
+ * stacking order that contains the point. Then repeat the whole process
+ * on that child.
*/
x = rootX - winPtr->wmInfoPtr->xInParent;
@@ -3835,12 +3807,12 @@ Tk_CoordsToWindow(
x -= winPtr->changes.x;
y -= winPtr->changes.y;
nextPtr = NULL;
-
+
/*
* Container windows cannot have children. So if it is a container,
* look there, otherwise inspect the children.
*/
-
+
if (Tk_IsContainer(winPtr)) {
childPtr = TkpGetOtherWindow(winPtr);
if (childPtr != NULL) {
@@ -3848,7 +3820,7 @@ Tk_CoordsToWindow(
tmpx = x - childPtr->changes.x;
tmpy = y - childPtr->changes.y;
bd = childPtr->changes.border_width;
-
+
if ((tmpx >= -bd) && (tmpy >= -bd)
&& (tmpx < (childPtr->changes.width + bd))
&& (tmpy < (childPtr->changes.height + bd))) {
@@ -3856,12 +3828,10 @@ Tk_CoordsToWindow(
}
}
}
-
/*
* NOTE: Here we should handle out of process embedding.
*/
-
} else {
for (childPtr = winPtr->childList; childPtr != NULL;
childPtr = childPtr->nextPtr) {
@@ -3893,17 +3863,16 @@ Tk_CoordsToWindow(
* Tk_TopCoordsToWindow --
*
* Given a Tk Window, and coordinates of a point relative to that window
- * this procedure returns the top-most child of the window (excluding
- * toplevels) covering that point, if there exists such a window in this
- * application.
- * It also sets newX, and newY to the coords of the point relative to the
- * window returned.
+ * this procedure returns the top-most child of the window (excluding
+ * toplevels) covering that point, if there exists such a window in this
+ * application. It also sets newX, and newY to the coords of the point
+ * relative to the window returned.
*
* Results:
- * The return result is either a token for the window corresponding
- * to rootX and rootY, or else NULL to indicate that there is no such
- * window. newX and newY are also set to the coords of the point relative
- * to the returned window.
+ * The return result is either a token for the window corresponding to
+ * rootX and rootY, or else NULL to indicate that there is no such
+ * window. newX and newY are also set to the coords of the point relative
+ * to the returned window.
*
* Side effects:
* None.
@@ -3916,12 +3885,12 @@ Tk_TopCoordsToWindow(
Tk_Window tkwin, /* Token for a Tk Window which defines the;
* coordinates for rootX & rootY */
int rootX, int rootY, /* Coordinates of a point in tkWin. */
- int *newX, int *newY) /* Coordinates of point in the upperMost child of
- * tkWin containing (rootX,rootY) */
+ int *newX, int *newY) /* Coordinates of point in the upperMost child
+ * of tkWin containing (rootX,rootY) */
{
TkWindow *winPtr, *childPtr;
- TkWindow *nextPtr; /* Coordinates of highest child found so
- * far that contains point. */
+ TkWindow *nextPtr; /* Coordinates of highest child found so far
+ * that contains point. */
int x, y; /* Coordinates in winPtr. */
Window *children; /* Children of winPtr, or NULL. */
@@ -3933,20 +3902,18 @@ Tk_TopCoordsToWindow(
children = NULL;
/*
- * Container windows cannot have children. So if it is a container,
+ * Container windows cannot have children. So if it is a container,
* look there, otherwise inspect the children.
*/
if (Tk_IsContainer(winPtr)) {
childPtr = TkpGetOtherWindow(winPtr);
if (childPtr != NULL) {
- if (Tk_IsMapped(childPtr) &&
- (x > childPtr->changes.x &&
- x < childPtr->changes.x +
- childPtr->changes.width) &&
- (y > childPtr->changes.y &&
- y < childPtr->changes.y +
- childPtr->changes.height)) {
+ if (Tk_IsMapped(childPtr) &&
+ x > childPtr->changes.x &&
+ x < childPtr->changes.x+childPtr->changes.width &&
+ y > childPtr->changes.y &&
+ y < childPtr->changes.y+childPtr->changes.height)) {
nextPtr = childPtr;
}
}
@@ -3988,8 +3955,8 @@ Tk_TopCoordsToWindow(
*
* UpdateVRootGeometry --
*
- * This procedure is called to update all the virtual root
- * geometry information in wmPtr.
+ * This procedure is called to update all the virtual root geometry
+ * information in wmPtr.
*
* Results:
* None.
@@ -4020,7 +3987,7 @@ UpdateVRootGeometry(
wmPtr->flags &= ~WM_VROOT_OFFSET_STALE;
if (wmPtr->vRoot == None) {
- noVRoot:
+ noVRoot:
wmPtr->vRootX = wmPtr->vRootY = 0;
wmPtr->vRootWidth = DisplayWidth(winPtr->display, winPtr->screenNum);
wmPtr->vRootHeight = DisplayHeight(winPtr->display, winPtr->screenNum);
@@ -4044,7 +4011,7 @@ UpdateVRootGeometry(
Tk_DeleteErrorHandler(handler);
if (status == 0) {
/*
- * The virtual root is gone! Pretend that it never existed.
+ * The virtual root is gone! Pretend that it never existed.
*/
wmPtr->vRoot = None;
@@ -4057,16 +4024,15 @@ UpdateVRootGeometry(
*
* Tk_GetVRootGeometry --
*
- * This procedure returns information about the virtual root
- * window corresponding to a particular Tk window.
+ * This procedure returns information about the virtual root window
+ * corresponding to a particular Tk window.
*
* Results:
- * The values at xPtr, yPtr, widthPtr, and heightPtr are set
- * with the offset and dimensions of the root window corresponding
- * to tkwin. If tkwin is being managed by a virtual root window
- * manager these values correspond to the virtual root window being
- * used for tkwin; otherwise the offsets will be 0 and the
- * dimensions will be those of the screen.
+ * The values at xPtr, yPtr, widthPtr, and heightPtr are set with the
+ * offset and dimensions of the root window corresponding to tkwin. If
+ * tkwin is being managed by a virtual root window manager these values
+ * correspond to the virtual root window being used for tkwin; otherwise
+ * the offsets will be 0 and the dimensions will be those of the screen.
*
* Side effects:
* Vroot window information is refreshed if it is out of date.
@@ -4097,8 +4063,8 @@ Tk_GetVRootGeometry(
wmPtr = winPtr->wmInfoPtr;
/*
- * Make sure that the geometry information is up-to-date, then copy
- * it out to the caller.
+ * Make sure that the geometry information is up-to-date, then copy it out
+ * to the caller.
*/
if (wmPtr->flags & WM_VROOT_OFFSET_STALE) {
@@ -4115,18 +4081,17 @@ Tk_GetVRootGeometry(
*
* Tk_MoveToplevelWindow --
*
- * This procedure is called instead of Tk_MoveWindow to adjust
- * the x-y location of a top-level window. It delays the actual
- * move to a later time and keeps window-manager information
- * up-to-date with the move
+ * This procedure is called instead of Tk_MoveWindow to adjust the x-y
+ * location of a top-level window. It delays the actual move to a later
+ * time and keeps window-manager information up-to-date with the move
*
* Results:
* None.
*
* Side effects:
* The window is eventually moved so that its upper-left corner
- * (actually, the upper-left corner of the window's decorative
- * frame, if there is one) is at (x,y).
+ * (actually, the upper-left corner of the window's decorative frame, if
+ * there is one) is at (x,y).
*
*----------------------------------------------------------------------
*/
@@ -4134,8 +4099,7 @@ Tk_GetVRootGeometry(
void
Tk_MoveToplevelWindow(
Tk_Window tkwin, /* Window to move. */
- int x, int y) /* New location for window (within
- * parent). */
+ int x, int y) /* New location for window (within parent). */
{
TkWindow *winPtr = (TkWindow *) tkwin;
WmInfo *wmPtr = winPtr->wmInfoPtr;
@@ -4154,9 +4118,8 @@ Tk_MoveToplevelWindow(
/*
* If the window has already been mapped, must bring its geometry
- * up-to-date immediately, otherwise an event might arrive from the
- * server that would overwrite wmPtr->x and wmPtr->y and lose the
- * new position.
+ * up-to-date immediately, otherwise an event might arrive from the server
+ * that would overwrite wmPtr->x and wmPtr->y and lose the new position.
*/
if (!(wmPtr->flags & WM_NEVER_MAPPED)) {
@@ -4165,7 +4128,8 @@ Tk_MoveToplevelWindow(
}
UpdateGeometryInfo((ClientData) winPtr);
}
-}
+}
+
/*
*----------------------------------------------------------------------
*
@@ -4177,9 +4141,9 @@ Tk_MoveToplevelWindow(
* None.
*
* Side effects:
- * WinPtr gets restacked as specified by aboveBelow and otherPtr.
- * This procedure doesn't return until the restack has taken
- * effect and the ConfigureNotify event for it has been received.
+ * WinPtr gets restacked as specified by aboveBelow and otherPtr. This
+ * procedure doesn't return until the restack has taken effect and the
+ * ConfigureNotify event for it has been received.
*
*----------------------------------------------------------------------
*/
@@ -4189,9 +4153,9 @@ TkWmRestackToplevel(
TkWindow *winPtr, /* Window to restack. */
int aboveBelow, /* Gives relative position for restacking;
* must be Above or Below. */
- TkWindow *otherPtr) /* Window relative to which to restack;
- * if NULL, then winPtr gets restacked
- * above or below *all* siblings. */
+ TkWindow *otherPtr) /* Window relative to which to restack; if
+ * NULL, then winPtr gets restacked above or
+ * below *all* siblings. */
{
WmInfo *wmPtr;
@@ -4200,17 +4164,17 @@ TkWmRestackToplevel(
wmPtr = winPtr->wmInfoPtr;
/*
- * Get the mac window. Make sure it exists & is mapped.
+ * Get the mac window. Make sure it exists & is mapped.
*/
+
if (winPtr->window == None) {
Tk_MakeWindowExist((Tk_Window) winPtr);
}
if (winPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) {
-
/*
- * Can't set stacking order properly until the window is on the
- * screen (mapping it may give it a reparent window), so make sure
- * it's on the screen.
+ * Can't set stacking order properly until the window is on the screen
+ * (mapping it may give it a reparent window), so make sure it's on
+ * the screen.
*/
TkWmMapWindow(winPtr);
@@ -4220,6 +4184,7 @@ TkWmRestackToplevel(
/*
* Get the window in which a raise or lower is in relation to.
*/
+
if (otherPtr != NULL) {
if (otherPtr->window == None) {
Tk_MakeWindowExist((Tk_Window) otherPtr);
@@ -4227,7 +4192,8 @@ TkWmRestackToplevel(
if (otherPtr->wmInfoPtr->flags & WM_NEVER_MAPPED) {
TkWmMapWindow(otherPtr);
}
- otherMacWindow = GetWindowFromPort(TkMacOSXGetDrawablePort(otherPtr->window));
+ otherMacWindow = GetWindowFromPort(
+ TkMacOSXGetDrawablePort(otherPtr->window));
} else {
otherMacWindow = NULL;
}
@@ -4236,13 +4202,13 @@ TkWmRestackToplevel(
if (aboveBelow == Above) {
if (macWindow == frontWindow) {
- /*
+ /*
* Do nothing - it's already at the top.
*/
} else if (otherMacWindow == frontWindow || otherMacWindow == NULL) {
/*
- * Raise the window to the top. If the window is visible then
- * we also make it the active window.
+ * Raise the window to the top. If the window is visible then we
+ * also make it the active window.
*/
if (wmPtr->hints.initial_state == WithdrawnState) {
@@ -4252,11 +4218,12 @@ TkWmRestackToplevel(
}
} else {
/*
- * Find the window to be above. (Front window will actually be the
- * window to be behind.) Front window is NULL if no other windows.
+ * Find the window to be above. (Front window will actually be the
+ * window to be behind.) Front window is NULL if no other windows.
*/
+
while (frontWindow != NULL &&
- ( tmpWindow = GetNextWindow (frontWindow) ) != otherMacWindow) {
+ (tmpWindow=GetNextWindow(frontWindow)) != otherMacWindow) {
frontWindow = tmpWindow;
}
if (frontWindow != NULL) {
@@ -4265,10 +4232,12 @@ TkWmRestackToplevel(
}
} else {
/*
- * Send behind. If it was in front find another window to make active.
+ * Send behind. If it was in front find another window to make active.
*/
+
if (macWindow == frontWindow) {
- if ( ( tmpWindow = GetNextWindow ( macWindow )) != NULL) {
+ tmpWindow = GetNextWindow(macWindow);
+ if (tmpWindow != NULL) {
SelectWindow(tmpWindow);
}
}
@@ -4282,30 +4251,28 @@ TkWmRestackToplevel(
* TkWmAddToColormapWindows --
*
* This procedure is called to add a given window to the
- * WM_COLORMAP_WINDOWS property for its top-level, if it
- * isn't already there. It is invoked by the Tk code that
- * creates a new colormap, in order to make sure that colormap
- * information is propagated to the window manager by default.
+ * WM_COLORMAP_WINDOWS property for its top-level, if it isn't already
+ * there. It is invoked by the Tk code that creates a new colormap, in
+ * order to make sure that colormap information is propagated to the
+ * window manager by default.
*
* Results:
* None.
*
* Side effects:
- * WinPtr's window gets added to the WM_COLORMAP_WINDOWS
- * property of its nearest top-level ancestor, unless the
- * colormaps have been set explicitly with the
- * "wm colormapwindows" command.
+ * WinPtr's window gets added to the WM_COLORMAP_WINDOWS property of its
+ * nearest top-level ancestor, unless the colormaps have been set
+ * explicitly with the "wm colormapwindows" command.
*
*----------------------------------------------------------------------
*/
void
TkWmAddToColormapWindows(
- TkWindow *winPtr) /* Window with a non-default colormap.
- * Should not be a top-level window. */
+ TkWindow *winPtr) /* Window with a non-default colormap. Should
+ * not be a top-level window. */
{
- TkWindow *topPtr;
- TkWindow **oldPtr, **newPtr;
+ TkWindow *topPtr, **oldPtr, **newPtr;
int count, i;
if (winPtr->window == None) {
@@ -4315,7 +4282,7 @@ TkWmAddToColormapWindows(
for (topPtr = winPtr->parentPtr; ; topPtr = topPtr->parentPtr) {
if (topPtr == NULL) {
/*
- * Window is being deleted. Skip the whole operation.
+ * Window is being deleted. Skip the whole operation.
*/
return;
@@ -4342,9 +4309,8 @@ TkWmAddToColormapWindows(
}
/*
- * Make a new bigger array and use it to reset the property.
- * Automatically add the toplevel itself as the last element
- * of the list.
+ * Make a new bigger array and use it to reset the property. Automatically
+ * add the toplevel itself as the last element of the list.
*/
newPtr = (TkWindow **) ckalloc((unsigned) ((count+2)*sizeof(TkWindow*)));
@@ -4364,9 +4330,8 @@ TkWmAddToColormapWindows(
topPtr->wmInfoPtr->cmapCount = count+1;
/*
- * On the Macintosh all of this is just an excercise
- * in compatability as we don't support colormaps. If
- * we did they would be installed here.
+ * On the Macintosh all of this is just an excercise in compatability as
+ * we don't support colormaps. If we did they would be installed here.
*/
}
@@ -4376,16 +4341,16 @@ TkWmAddToColormapWindows(
* TkWmRemoveFromColormapWindows --
*
* This procedure is called to remove a given window from the
- * WM_COLORMAP_WINDOWS property for its top-level. It is invoked
- * when windows are deleted.
+ * WM_COLORMAP_WINDOWS property for its top-level. It is invoked when
+ * windows are deleted.
*
* Results:
* None.
*
* Side effects:
- * WinPtr's window gets removed from the WM_COLORMAP_WINDOWS
- * property of its nearest top-level ancestor, unless the
- * top-level itself is being deleted too.
+ * WinPtr's window gets removed from the WM_COLORMAP_WINDOWS property of
+ * its nearest top-level ancestor, unless the top-level itself is being
+ * deleted too.
*
*----------------------------------------------------------------------
*/
@@ -4394,18 +4359,17 @@ void
TkWmRemoveFromColormapWindows(
TkWindow *winPtr) /* Window that may be present in
* WM_COLORMAP_WINDOWS property for its
- * top-level. Should not be a top-level
+ * top-level. Should not be a top-level
* window. */
{
- TkWindow *topPtr;
- TkWindow **oldPtr;
+ TkWindow *topPtr, **oldPtr;
int count, i, j;
for (topPtr = winPtr->parentPtr; ; topPtr = topPtr->parentPtr) {
if (topPtr == NULL) {
/*
- * Ancestors have been deleted, so skip the whole operation.
- * Seems like this can't ever happen?
+ * Ancestors have been deleted, so skip the whole operation. Seems
+ * like this can't ever happen?
*/
return;
@@ -4416,16 +4380,15 @@ TkWmRemoveFromColormapWindows(
}
if (topPtr->flags & TK_ALREADY_DEAD) {
/*
- * Top-level is being deleted, so there's no need to cleanup
- * the WM_COLORMAP_WINDOWS property.
+ * Top-level is being deleted, so there's no need to cleanup the
+ * WM_COLORMAP_WINDOWS property.
*/
return;
}
/*
- * Find the window and slide the following ones down to cover
- * it up.
+ * Find the window and slide the following ones down to cover it up.
*/
count = topPtr->wmInfoPtr->cmapCount;
@@ -4449,10 +4412,10 @@ TkWmRemoveFromColormapWindows(
* Fetch the position of the mouse pointer.
*
* Results:
- * *xPtr and *yPtr are filled in with the (virtual) root coordinates
- * of the mouse pointer for tkwin's display. If the pointer isn't
- * on tkwin's screen, then -1 values are returned for both
- * coordinates. The argument tkwin must be a toplevel window.
+ * *xPtr and *yPtr are filled in with the (virtual) root coordinates of
+ * the mouse pointer for tkwin's display. If the pointer isn't on tkwin's
+ * screen, then -1 values are returned for both coordinates. The argument
+ * tkwin must be a toplevel window.
*
* Side effects:
* None.
@@ -4474,10 +4437,10 @@ TkGetPointerCoords(
*
* InitialWindowBounds --
*
- * This function calculates the initial bounds for a new Mac
- * toplevel window. Unless the geometry is specified by the user
- * this code will auto place the windows in a cascade diagonially
- * across the main monitor of the Mac.
+ * This function calculates the initial bounds for a new Mac toplevel
+ * window. Unless the geometry is specified by the user this code will
+ * auto place the windows in a cascade diagonially across the main
+ * monitor of the Mac.
*
* Results:
* The bounds are returned in geometry.
@@ -4498,11 +4461,13 @@ InitialWindowBounds(
static int defaultY = 45;
if (!(wmPtr->sizeHintsFlags & (USPosition | PPosition))) {
- /*
- * We will override the program & hopefully place the
- * window in a "better" location.
+ /*
+ * We will override the program & hopefully place the window in a
+ * "better" location.
*/
+
BitMap screenBits;
+
GetQDGlobalsScreenBits(&screenBits);
if (((screenBits.bounds.right - defaultX) < 30) ||
((screenBits.bounds.bottom - defaultY) < 30)) {
@@ -4526,9 +4491,9 @@ InitialWindowBounds(
*
* TkMacOSXResizable --
*
- * This function determines if the passed in window is part of
- * a toplevel window that is resizable. If the window is
- * resizable in the x, y or both directions, true is returned.
+ * This function determines if the passed in window is part of a toplevel
+ * window that is resizable. If the window is resizable in the x, y or
+ * both directions, true is returned.
*
* Results:
* True if resizable, false otherwise.
@@ -4551,7 +4516,7 @@ TkMacOSXResizable(
while (winPtr->wmInfoPtr == NULL) {
winPtr = winPtr->parentPtr;
}
-
+
wmPtr = winPtr->wmInfoPtr;
if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) &&
(wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) {
@@ -4566,10 +4531,10 @@ TkMacOSXResizable(
*
* TkMacOSXGrowToplevel --
*
- * The function is invoked when the user clicks in the grow region
- * of a Tk window. The function will handle the dragging
- * procedure and not return until completed. Finally, the function
- * may place information Tk's event queue is the window was resized.
+ * The function is invoked when the user clicks in the grow region of a
+ * Tk window. The function will handle the dragging procedure and not
+ * return until completed. Finally, the function may place information
+ * Tk's event queue is the window was resized.
*
* Results:
* True if events were placed on event queue, false otherwise.
@@ -4630,7 +4595,7 @@ TkMacOSXGrowToplevel(
LoWord(growResult), HiWord(growResult), true);
InvalWindowRect(whichWindow, &portRect); /* TODO: may not be needed */
TkMacOSXInvalClipRgns((Tk_Window) winPtr);
- TkGenWMConfigureEvent((Tk_Window) winPtr, -1, -1,
+ TkGenWMConfigureEvent((Tk_Window) winPtr, -1, -1,
(int) LoWord(growResult), (int) HiWord(growResult),
TK_SIZE_CHANGED);
return true;
@@ -4645,8 +4610,8 @@ TkMacOSXGrowToplevel(
*
* TkSetWMName --
*
- * Set the title for a toplevel window. If the window is embedded,
- * do not change the window title.
+ * Set the title for a toplevel window. If the window is embedded, do not
+ * change the window title.
*
* Results:
* None.
@@ -4662,30 +4627,30 @@ TkSetWMName(
TkWindow *winPtr,
Tk_Uid titleUid)
{
- CFStringRef title;
- WindowRef macWin;
-
+ CFStringRef title;
+
if (Tk_IsEmbedded(winPtr)) {
return;
}
-
+
title = CFStringCreateWithBytes(NULL, (unsigned char*) titleUid,
- strlen(titleUid), kCFStringEncodingUTF8, false);
+ strlen(titleUid), kCFStringEncodingUTF8, false);
if (title) {
- macWin = GetWindowFromPort(TkMacOSXGetDrawablePort(winPtr->window));
+ WindowRef macWin = GetWindowFromPort(
+ TkMacOSXGetDrawablePort(winPtr->window));
+
SetWindowTitleWithCFString(macWin, title);
CFRelease(title);
}
}
-
/*
*----------------------------------------------------------------------
*
* TkGetTransientMaster --
*
- * If the passed window has the TRANSIENT_FOR property set this
- * will return the master window. Otherwise it will return None.
+ * If the passed window has the TRANSIENT_FOR property set this will
+ * return the master window. Otherwise it will return None.
*
* Results:
* The master window or None.
@@ -4743,10 +4708,9 @@ TkMacOSXGetXWindow(
*
* TkMacOSXIsWindowZoomed --
*
- * Ask Carbon if the given window is in the zoomed out state.
- * Because dragging & growing a window can change the Carbon
- * zoom state, we cannot rely on wmInfoPtr->hints.initial_state
- * for this information.
+ * Ask Carbon if the given window is in the zoomed out state. Because
+ * dragging & growing a window can change the Carbon zoom state, we
+ * cannot rely on wmInfoPtr->hints.initial_state for this information.
*
* Results:
* True if window is zoomed out, false otherwise.
@@ -4763,7 +4727,7 @@ TkMacOSXIsWindowZoomed(
{
WmInfo *wmPtr = winPtr->wmInfoPtr;
Point idealSize;
-
+
if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) &&
(wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) {
return false;
@@ -4789,11 +4753,10 @@ TkMacOSXIsWindowZoomed(
*
* TkMacOSXZoomToplevel --
*
- * The function is invoked when the user clicks in the zoom region
- * of a Tk window or when the window state is set/unset to "zoomed"
- * manually. If the window is to be zoomed (in or out), the window
- * size is changed and events are generated to let Tk know what
- * happened.
+ * The function is invoked when the user clicks in the zoom region of a
+ * Tk window or when the window state is set/unset to "zoomed" manually.
+ * If the window is to be zoomed (in or out), the window size is changed
+ * and events are generated to let Tk know what happened.
*
* Results:
* True if events were placed on event queue, false otherwise.
@@ -4822,7 +4785,7 @@ TkMacOSXZoomToplevel(
dispPtr = TkGetDisplayList();
winPtr = (TkWindow *) Tk_IdToWindow(dispPtr->display, window);
wmPtr = winPtr->wmInfoPtr;
-
+
if ((wmPtr->flags & WM_WIDTH_NOT_RESIZABLE) &&
(wmPtr->flags & WM_HEIGHT_NOT_RESIZABLE)) {
return false;
@@ -4839,7 +4802,7 @@ TkMacOSXZoomToplevel(
}
/* Do nothing if already in desired zoom state */
- if (!IsWindowInStandardState(whichWindow, &idealSize, NULL) ==
+ if (!IsWindowInStandardState(whichWindow, &idealSize, NULL) ==
(zoomPart == inZoomIn)) {
return false;
}
@@ -4857,7 +4820,7 @@ TkMacOSXZoomToplevel(
location.h -= xOffset;
location.v -= yOffset;
GetPortBounds(GetWindowPort(whichWindow), &portRect);
- TkGenWMConfigureEvent((Tk_Window) winPtr, location.h, location.v,
+ TkGenWMConfigureEvent((Tk_Window) winPtr, location.h, location.v,
portRect.right - portRect.left, portRect.bottom - portRect.top,
TK_BOTH_CHANGED);
return true;
@@ -4871,10 +4834,9 @@ TkMacOSXZoomToplevel(
*
* TkUnsupported1Cmd --
*
- * This procedure is invoked to process the
- * "::tk::unsupported::MacWindowStyle" Tcl command.
- * This command allows you to set the style of decoration
- * for a Macintosh window.
+ * This procedure is invoked to process the
+ * "::tk::unsupported::MacWindowStyle" Tcl command. This command allows
+ * you to set the style of decoration for a Macintosh window.
*
* Results:
* A standard Tcl result.
@@ -4917,12 +4879,12 @@ TkUnsupported1ObjCmd(
if (!(winPtr->flags & TK_TOP_LEVEL)) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "window \"", winPtr->pathName,
- "\" isn't a top-level window", (char *) NULL);
+ "\" isn't a top-level window", NULL);
return TCL_ERROR;
}
- if (Tcl_GetIndexFromObj(interp, objv[1], subcmds, "option",
- 0, &index) != TCL_OK) {
+ if (Tcl_GetIndexFromObj(interp, objv[1], subcmds, "option", 0,
+ &index) != TCL_OK) {
return TCL_ERROR;
}
if (((enum SubCmds) index) == TKMWS_STYLE) {
@@ -4941,10 +4903,9 @@ TkUnsupported1ObjCmd(
*
* WmWinStyle --
*
- * This procedure is invoked to process the
- * "::tk::unsupported::MacWindowStyle style" subcommand.
- * This command allows you to set the style of decoration
- * for a Macintosh window.
+ * This procedure is invoked to process the
+ * "::tk::unsupported::MacWindowStyle style" subcommand. This command
+ * allows you to set the style of decoration for a Macintosh window.
*
* Results:
* A standard Tcl result.
@@ -4954,6 +4915,7 @@ TkUnsupported1ObjCmd(
*
*----------------------------------------------------------------------
*/
+
static int
WmWinStyle(
Tcl_Interp *interp, /* Current interpreter. */
@@ -5044,7 +5006,7 @@ WmWinStyle(
if (wmPtr->style != -1) {
for (i = 0; styleMap[i].strValue != NULL; i++) {
if (wmPtr->style == styleMap[i].intValue) {
- Tcl_SetObjResult(interp,
+ Tcl_SetObjResult(interp,
Tcl_NewStringObj(styleMap[i].strValue, -1));
return TCL_OK;
}
@@ -5070,7 +5032,7 @@ WmWinStyle(
for (i = 0; compositeAttrMap[i].strValue != NULL; i++) {
if (wmPtr->attributes == compositeAttrMap[i].intValue) {
Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj(compositeAttrMap[i].strValue, -1));
+ Tcl_NewStringObj(compositeAttrMap[i].strValue,-1));
usesComposite = 1;
break;
}
@@ -5088,7 +5050,7 @@ WmWinStyle(
}
} else if (objc == 4) {
if (Tcl_GetIndexFromObjStruct(interp, objv[3], styleMap,
- sizeof(struct StrIntMap), "style", 0, &index) != TCL_OK) {
+ sizeof(struct StrIntMap), "style", 0, &index) != TCL_OK) {
return TCL_ERROR;
}
wmPtr->style = styleMap[index].intValue;
@@ -5099,7 +5061,7 @@ WmWinStyle(
int oldAttributes = wmPtr->attributes;
if (Tcl_GetIndexFromObjStruct(interp, objv[3], classMap,
- sizeof(struct StrIntMap), "class", 0, &index) != TCL_OK) {
+ sizeof(struct StrIntMap), "class", 0, &index) != TCL_OK) {
return TCL_ERROR;
}
if (Tcl_ListObjGetElements(interp, objv[4], &attrObjc, &attrObjv)
@@ -5110,12 +5072,11 @@ WmWinStyle(
wmPtr->attributes = kWindowNoAttributes;
for (i = 0; i < attrObjc; i++) {
if (Tcl_GetIndexFromObjStruct(interp, attrObjv[i],
- compositeAttrMap, sizeof(struct StrIntMap),
- "attribute", 0, &index) == TCL_OK) {
+ compositeAttrMap, sizeof(struct StrIntMap), "attribute",
+ 0, &index) == TCL_OK) {
wmPtr->attributes |= compositeAttrMap[index].intValue;
- } else if (Tcl_GetIndexFromObjStruct(interp, attrObjv[i],
- attrMap, sizeof(struct StrIntMap),
- "attribute", 0, &index) == TCL_OK) {
+ } else if (Tcl_GetIndexFromObjStruct(interp, attrObjv[i], attrMap,
+ sizeof(struct StrIntMap), "attribute", 0,&index)==TCL_OK){
Tcl_ResetResult (interp);
wmPtr->attributes |= attrMap[index].intValue;
} else {
@@ -5137,8 +5098,8 @@ WmWinStyle(
*
* TkpMakeMenuWindow --
*
- * Configure the window to be either a undecorated pull-down
- * (or pop-up) menu, or as a toplevel floating menu (palette).
+ * Configure the window to be either a undecorated pull-down (or pop-up)
+ * menu, or as a toplevel floating menu (palette).
*
* Results:
* None.
@@ -5152,19 +5113,21 @@ WmWinStyle(
void
TkpMakeMenuWindow(
Tk_Window tkwin, /* New window. */
- int transient) /* 1 means menu is only posted briefly as
- * a popup or pulldown or cascade. 0 means
- * menu is always visible, e.g. as a
- * floating menu. */
+ int transient) /* 1 means menu is only posted briefly as a
+ * popup or pulldown or cascade. 0 means menu
+ * is always visible, e.g. as a floating
+ * menu. */
{
+ TkWindow *winPtr = (TkWindow *) tkwin;
+
if (transient) {
- ((TkWindow *) tkwin)->wmInfoPtr->macClass = kSimpleWindowClass;
- ((TkWindow *) tkwin)->wmInfoPtr->attributes = kWindowNoActivatesAttribute;
+ winPtr->wmInfoPtr->macClass = kSimpleWindowClass;
+ winPtr->wmInfoPtr->attributes = kWindowNoActivatesAttribute;
} else {
- ((TkWindow *) tkwin)->wmInfoPtr->macClass = kFloatingWindowClass;
- ((TkWindow *) tkwin)->wmInfoPtr->attributes = kWindowStandardFloatingAttributes;
- ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_WIDTH_NOT_RESIZABLE;
- ((TkWindow *) tkwin)->wmInfoPtr->flags |= WM_HEIGHT_NOT_RESIZABLE;
+ winPtr->wmInfoPtr->macClass = kFloatingWindowClass;
+ winPtr->wmInfoPtr->attributes = kWindowStandardFloatingAttributes;
+ winPtr->wmInfoPtr->flags |= WM_WIDTH_NOT_RESIZABLE;
+ winPtr->wmInfoPtr->flags |= WM_HEIGHT_NOT_RESIZABLE;
}
}
@@ -5173,8 +5136,8 @@ TkpMakeMenuWindow(
*
* TkMacOSXMakeRealWindowExist --
*
- * This function finally creates the real Macintosh window that
- * the Mac actually understands.
+ * This function finally creates the real Macintosh window that the Mac
+ * actually understands.
*
* Results:
* None.
@@ -5190,12 +5153,12 @@ TkMacOSXMakeRealWindowExist(
TkWindow *winPtr) /* Tk window. */
{
WmInfo *wmPtr = winPtr->wmInfoPtr;
- WindowRef newWindow = NULL;
+ WindowRef newWindow = NULL;
ControlRef rootControl = NULL;
MacDrawable *macWin;
Rect geometry = {0,0,0,0};
Tcl_HashEntry *valueHashPtr;
- int new;
+ int isNew;
TkMacOSXWindowList *listPtr;
if (TkMacOSXHostToplevelExists(winPtr)) {
@@ -5205,8 +5168,8 @@ TkMacOSXMakeRealWindowExist(
macWin = (MacDrawable *) winPtr->window;
/*
- * If this is embedded, make sure its container's toplevel exists,
- * then return...
+ * If this is embedded, make sure its container's toplevel exists, then
+ * return...
*/
if (Tk_IsEmbedded(winPtr)) {
@@ -5214,36 +5177,40 @@ TkMacOSXMakeRealWindowExist(
contWinPtr = TkpGetOtherWindow(winPtr);
if (contWinPtr != NULL) {
- TkMacOSXMakeRealWindowExist(contWinPtr->privatePtr->toplevel->winPtr);
+ TkMacOSXMakeRealWindowExist(
+ contWinPtr->privatePtr->toplevel->winPtr);
macWin->flags |= TK_HOST_EXISTS;
return;
- } else if (tkMacOSXEmbedHandler != NULL) {
- if (tkMacOSXEmbedHandler->containerExistProc != NULL) {
- if (tkMacOSXEmbedHandler->containerExistProc((Tk_Window) winPtr) != TCL_OK) {
- Tcl_Panic("ContainerExistProc could not make container");
- }
+ }
+
+ if (tkMacOSXEmbedHandler == NULL) {
+ Tcl_Panic("TkMacOSXMakeRealWindowExist could not find container");
+ }
+
+ if (tkMacOSXEmbedHandler->containerExistProc != NULL) {
+ if (tkMacOSXEmbedHandler->containerExistProc((Tk_Window) winPtr)
+ != TCL_OK) {
+ Tcl_Panic("ContainerExistProc could not make container");
}
return;
- } else {
- Tcl_Panic("TkMacOSXMakeRealWindowExist could not find container");
}
/*
* NOTE: Here we should handle out of process embedding.
*/
-
}
InitialWindowBounds(winPtr, &geometry);
if (wmPtr->style == -1) {
OSStatus err;
+
/*
- * There seems to be a bug in CreateNewWindow: If I set the
- * window geometry to be the too small for the structure region,
- * then the whole window is positioned incorrectly.
- * Adding this here makes the positioning work, and the size will
- * get overwritten when you actually map the contents of the window.
+ * There seems to be a bug in CreateNewWindow: If I set the window
+ * geometry to be the too small for the structure region, then the
+ * whole window is positioned incorrectly. Adding this here makes the
+ * positioning work, and the size will get overwritten when you
+ * actually map the contents of the window.
*/
geometry.right += 64;
@@ -5253,7 +5220,6 @@ TkMacOSXMakeRealWindowExist(
if (err != noErr) {
newWindow = NULL;
}
-
} else {
newWindow = NewCWindow(NULL, &geometry, "\p", false,
(short) wmPtr->style, (WindowRef) -1, true, 0);
@@ -5282,9 +5248,10 @@ TkMacOSXMakeRealWindowExist(
if ((wmPtr->master != None) && winPtr->atts.override_redirect) {
/*
- * If we are transient and overrideredirect, use the utility class
- * to ensure we are topmost (for dropdowns).
+ * If we are transient and overrideredirect, use the utility class to
+ * ensure we are topmost (for dropdowns).
*/
+
WindowGroupRef group = GetWindowGroupOfClass(kUtilityWindowClass);
if (group != NULL) {
SetWindowGroup(newWindow, group);
@@ -5297,8 +5264,8 @@ TkMacOSXMakeRealWindowExist(
windowHashInit = true;
}
valueHashPtr = Tcl_CreateHashEntry(&windowTable,
- (char *) newWindow, &new);
- if (!new) {
+ (char *) newWindow, &isNew);
+ if (!isNew) {
Tcl_Panic("same macintosh window allocated twice!");
}
Tcl_SetHashValue(valueHashPtr, macWin);
@@ -5311,11 +5278,10 @@ TkMacOSXMakeRealWindowExist(
*
* TkMacOSXRegisterOffScreenWindow --
*
- * This function adds the passed in Off Screen Port to the
- * hash table that maps Mac windows to root X windows.
+ * This function adds the passed in Off Screen Port to the hash table
+ * that maps Mac windows to root X windows.
*
- * FIXME: This is not currently used. Is there any reason
- * to keep it?
+ * FIXME: This is not currently used. Is there any reason to keep it?
*
* Results:
* None.
@@ -5326,23 +5292,21 @@ TkMacOSXMakeRealWindowExist(
*----------------------------------------------------------------------
*/
-void
+void
TkMacOSXRegisterOffScreenWindow(
- Window window, /* Window structure. */
- GWorldPtr portPtr) /* Pointer to a Mac GWorld. */
+ Window window, /* Window structure. */
+ GWorldPtr portPtr) /* Pointer to a Mac GWorld. */
{
- MacDrawable *macWin;
+ MacDrawable *macWin = (MacDrawable *) window;
Tcl_HashEntry *valueHashPtr;
- int new;
+ int isNew;
- macWin = (MacDrawable *) window;
if (!windowHashInit) {
Tcl_InitHashTable(&windowTable, TCL_ONE_WORD_KEYS);
windowHashInit = true;
}
- valueHashPtr = Tcl_CreateHashEntry(&windowTable,
- (char *) portPtr, &new);
- if (!new) {
+ valueHashPtr = Tcl_CreateHashEntry(&windowTable, (char *)portPtr, &isNew);
+ if (!isNew) {
Tcl_Panic("same macintosh window allocated twice!");
}
Tcl_SetHashValue(valueHashPtr, macWin);
@@ -5353,9 +5317,8 @@ TkMacOSXRegisterOffScreenWindow(
*
* TkMacOSXUnregisterMacWindow --
*
- * Given a macintosh port window, this function removes the
- * association between this window and the root X window that
- * Tk cares about.
+ * Given a macintosh port window, this function removes the association
+ * between this window and the root X window that Tk cares about.
*
* Results:
* None.
@@ -5366,23 +5329,20 @@ TkMacOSXRegisterOffScreenWindow(
*----------------------------------------------------------------------
*/
-void
+void
TkMacOSXUnregisterMacWindow(
WindowRef macWinPtr) /* Reference to a Mac Window */
{
Tcl_HashEntry *entryPtr;
+
if (!windowHashInit) {
Tcl_Panic("TkMacOSXUnregisterMacWindow: unmapping before inited");
}
entryPtr = Tcl_FindHashEntry(&windowTable,(char *) macWinPtr);
if (!entryPtr) {
-#ifdef TK_MAC_DEBUG
- fprintf(stderr,"Unregister:failed to find window %08x\n",
- (int) macWinPtr );
-#endif
- }
- else {
- Tcl_DeleteHashEntry(entryPtr);
+ ERR_MSG("Unregister:failed to find window %08x", (int) macWinPtr);
+ } else {
+ Tcl_DeleteHashEntry(entryPtr);
}
}
@@ -5391,9 +5351,8 @@ TkMacOSXUnregisterMacWindow(
*
* TkMacOSXSetScrollbarGrow --
*
- * Sets a flag for a toplevel window indicating that the passed
- * Tk scrollbar window will display the grow region for the
- * toplevel window.
+ * Sets a flag for a toplevel window indicating that the passed Tk
+ * scrollbar window will display the grow region for the toplevel window.
*
* Results:
* None.
@@ -5404,7 +5363,7 @@ TkMacOSXUnregisterMacWindow(
*----------------------------------------------------------------------
*/
-void
+void
TkMacOSXSetScrollbarGrow(
TkWindow *winPtr, /* Tk scrollbar window. */
int flag) /* Boolean value true or false. */
@@ -5418,22 +5377,22 @@ TkMacOSXSetScrollbarGrow(
winPtr->privatePtr->toplevel->winPtr->wmInfoPtr->scrollWinPtr = NULL;
}
}
-
+
/*
*----------------------------------------------------------------------
*
* TkWmFocusToplevel --
*
* This is a utility procedure invoked by focus-management code. It
- * exists because of the extra wrapper windows that exist under
- * Unix; its job is to map from wrapper windows to the
- * corresponding toplevel windows. On PCs and Macs there are no
- * wrapper windows so no mapping is necessary; this procedure just
- * determines whether a window is a toplevel or not.
+ * exists because of the extra wrapper windows that exist under Unix; its
+ * job is to map from wrapper windows to the corresponding toplevel
+ * windows. On PCs and Macs there are no wrapper windows so no mapping is
+ * necessary; this procedure just determines whether a window is a
+ * toplevel or not.
*
* Results:
- * If winPtr is a toplevel window, returns the pointer to the
- * window; otherwise returns NULL.
+ * If winPtr is a toplevel window, returns the pointer to the window;
+ * otherwise returns NULL.
*
* Side effects:
* None.
@@ -5457,13 +5416,13 @@ TkWmFocusToplevel(
*
* TkpGetWrapperWindow --
*
- * This is a utility procedure invoked by focus-management code. It
- * maps to the wrapper for a top-level, which is just the same
- * as the top-level on Macs and PCs.
+ * This is a utility procedure invoked by focus-management code. It maps
+ * to the wrapper for a top-level, which is just the same as the
+ * top-level on Macs and PCs.
*
* Results:
- * If winPtr is a toplevel window, returns the pointer to the
- * window; otherwise returns NULL.
+ * If winPtr is a toplevel window, returns the pointer to the window;
+ * otherwise returns NULL.
*
* Side effects:
* None.
@@ -5487,8 +5446,8 @@ TkpGetWrapperWindow(
*
* TkpWmSetState --
*
- * Sets the window manager state for the wrapper window of a
- * given toplevel window.
+ * Sets the window manager state for the wrapper window of a given
+ * toplevel window.
*
* Results:
* None.
@@ -5500,14 +5459,14 @@ TkpGetWrapperWindow(
*/
void
-TkpWmSetState(winPtr, state)
- TkWindow *winPtr; /* Toplevel window to operate on. */
- int state; /* One of IconicState, ZoomState, NormalState,
+TkpWmSetState(
+ TkWindow *winPtr, /* Toplevel window to operate on. */
+ int state) /* One of IconicState, ZoomState, NormalState,
* or WithdrawnState. */
{
WmInfo *wmPtr = winPtr->wmInfoPtr;
WindowRef macWin;
-
+
wmPtr->hints.initial_state = state;
if (wmPtr->flags & WM_NEVER_MAPPED) {
return;
@@ -5519,9 +5478,10 @@ TkpWmSetState(winPtr, state)
Tk_UnmapWindow((Tk_Window) winPtr);
} else if (state == IconicState) {
/*
- * The window always gets unmapped. If we can show the
- * icon version of the window we also collapse it.
+ * The window always gets unmapped. If we can show the icon version of
+ * the window we also collapse it.
*/
+
if (IsWindowCollapsable(macWin) && !IsWindowCollapsed(macWin)) {
CollapseWindow(macWin, true);
}
@@ -5558,14 +5518,15 @@ TkpWmSetState(winPtr, state)
*/
int
-TkpIsWindowFloating(WindowRef wRef)
+TkpIsWindowFloating(
+ WindowRef wRef)
{
WindowClass class;
if (wRef == NULL) {
return 0;
}
-
+
GetWindowClass(wRef, &class);
return (class == kFloatingWindowClass);
}
@@ -5587,7 +5548,8 @@ TkpIsWindowFloating(WindowRef wRef)
*/
MODULE_SCOPE WindowClass
-TkMacOSXWindowClass(TkWindow *winPtr)
+TkMacOSXWindowClass(
+ TkWindow *winPtr)
{
WindowRef wRef;
WindowClass class;
@@ -5603,21 +5565,21 @@ TkMacOSXWindowClass(TkWindow *winPtr)
GetWindowClass(wRef, &class);
return class;
}
-
+
/*
*----------------------------------------------------------------------
*
* TkMacOSXWindowOffset --
*
- * Determines the x and y offset from the orgin of the toplevel
- * window dressing (the structure region, ie. title bar) and the
- * orgin of the content area.
+ * Determines the x and y offset from the orgin of the toplevel window
+ * dressing (the structure region, i.e. title bar) and the orgin of the
+ * content area.
*
* Results:
- * The x & y offset in pixels.
+ * The x & y offset in pixels.
*
* Side effects:
- * None.
+ * None.
*
*----------------------------------------------------------------------
*/
@@ -5635,14 +5597,14 @@ TkMacOSXWindowOffset(
*yOffset = widths.top;
return;
}
-
+
/*
*----------------------------------------------------------------------
*
* TkpGetMS --
*
- * Return a relative time in milliseconds. It doesn't matter
- * when the epoch was.
+ * Return a relative time in milliseconds. It doesn't matter when the
+ * epoch was.
*
* Results:
* Number of milliseconds.
@@ -5656,22 +5618,22 @@ TkMacOSXWindowOffset(
unsigned long
TkpGetMS()
{
- long long * int64Ptr;
+ long long *int64Ptr;
UnsignedWide micros;
-
+
Microseconds(&micros);
int64Ptr = (long long *) &micros;
/*
- * We need 64 bit math to do this. This is available in CW 11
- * and on. Other's will need to use a different scheme.
+ * We need 64 bit math to do this. This is available in CW 11 and on.
+ * Other's will need to use a different scheme.
*/
*int64Ptr /= 1000;
return (long) *int64Ptr;
}
-
+
/*
*----------------------------------------------------------------------
*
@@ -5696,7 +5658,7 @@ XSetInputFocus(
Time time)
{
/*
- * Don't need to do a thing. Tk manages the focus for us.
+ * Don't need to do a thing. Tk manages the focus for us.
*/
}
@@ -5705,15 +5667,14 @@ XSetInputFocus(
*
* TkpChangeFocus --
*
- * This procedure is a stub on the Mac because we always own the
- * focus if we are a front most application.
+ * This procedure is a stub on the Mac because we always own the focus
+ * if we are a front most application.
*
* Results:
- * The return value is the serial number of the command that
- * changed the focus. It may be needed by the caller to filter
- * out focus change events that were queued before the command.
- * If the procedure doesn't actually change the focus then
- * it returns 0.
+ * The return value is the serial number of the command that changed
+ * the focus. It may be needed by the caller to filter out focus change
+ * events that were queued before the command. If the procedure doesn't
+ * actually change the focus then it returns 0.
*
* Side effects:
* None.
@@ -5722,15 +5683,15 @@ XSetInputFocus(
*/
int
-TkpChangeFocus(winPtr, force)
- TkWindow *winPtr; /* Window that is to receive the X focus. */
- int force; /* Non-zero means claim the focus even
- * if it didn't originally belong to
- * topLevelPtr's application. */
+TkpChangeFocus(
+ TkWindow *winPtr, /* Window that is to receive the X focus. */
+ int force) /* Non-zero means claim the focus even if it
+ * didn't originally belong to topLevelPtr's
+ * application. */
{
/*
- * We don't really need to do anything on the Mac. Tk will
- * keep all this state for us.
+ * We don't really need to do anything on the Mac. Tk will keep all this
+ * state for us.
*/
if (winPtr->atts.override_redirect) {
@@ -5738,28 +5699,26 @@ TkpChangeFocus(winPtr, force)
}
/*
- * Remember the current serial number for the X server and issue
- * a dummy server request. This marks the position at which we
- * changed the focus, so we can distinguish FocusIn and FocusOut
- * events on either side of the mark.
+ * Remember the current serial number for the X server and issue a dummy
+ * server request. This marks the position at which we changed the focus,
+ * so we can distinguish FocusIn and FocusOut events on either side of the
+ * mark.
*/
return NextRequest(winPtr->display);
}
-
/*
*----------------------------------------------------------------------
*
* WmStackorderToplevelWrapperMap --
*
- * This procedure will create a table that maps the reparent wrapper
- * X id for a toplevel to the TkWindow structure that is wraps.
- * Tk keeps track of a mapping from the window X id to the TkWindow
- * structure but that does us no good here since we only get the X
- * id of the wrapper window. Only those toplevel windows that are
- * mapped have a position in the stacking order.
- *
+ * This procedure will create a table that maps the reparent wrapper X id
+ * for a toplevel to the TkWindow structure that is wraps. Tk keeps track
+ * of a mapping from the window X id to the TkWindow structure but that
+ * does us no good here since we only get the X id of the wrapper window.
+ * Only those toplevel windows that are mapped have a position in the
+ * stacking order.
*
* Results:
* None.
@@ -5769,11 +5728,12 @@ TkpChangeFocus(winPtr, force)
*
*----------------------------------------------------------------------
*/
+
static void
-WmStackorderToplevelWrapperMap(winPtr, display, table)
- TkWindow *winPtr; /* TkWindow to recurse on */
- Display *display; /* X display of parent window */
- Tcl_HashTable *table; /* Maps mac window to TkWindow */
+WmStackorderToplevelWrapperMap(
+ TkWindow *winPtr, /* TkWindow to recurse on */
+ Display *display, /* X display of parent window */
+ Tcl_HashTable *table) /* Maps mac window to TkWindow */
{
TkWindow *childPtr;
Tcl_HashEntry *hPtr;
@@ -5802,8 +5762,8 @@ WmStackorderToplevelWrapperMap(winPtr, display, table)
* This procedure returns the stack order of toplevel windows.
*
* Results:
- * An array of pointers to tk window objects in stacking order
- * or else NULL if there was an error.
+ * An array of pointers to tk window objects in stacking order or else
+ * NULL if there was an error.
*
* Side effects:
* None.
@@ -5812,8 +5772,8 @@ WmStackorderToplevelWrapperMap(winPtr, display, table)
*/
TkWindow **
-TkWmStackorderToplevel(parentPtr)
- TkWindow *parentPtr; /* Parent toplevel window. */
+TkWmStackorderToplevel(
+ TkWindow *parentPtr) /* Parent toplevel window. */
{
WindowRef frontWindow;
TkWindow *childWinPtr, **windows, **window_ptr;
@@ -5828,12 +5788,11 @@ TkWmStackorderToplevel(parentPtr)
Tcl_InitHashTable(&table, TCL_ONE_WORD_KEYS);
WmStackorderToplevelWrapperMap(parentPtr, parentPtr->display, &table);
- windows = (TkWindow **) ckalloc((table.numEntries+1)
- * sizeof(TkWindow *));
+ windows = (TkWindow**) ckalloc((table.numEntries+1) * sizeof(TkWindow*));
/*
- * Special cases: If zero or one toplevels were mapped
- * there is no need to enumerate Windows.
+ * Special cases: If zero or one toplevels were mapped there is no need to
+ * enumerate Windows.
*/
switch (table.numEntries) {
@@ -5889,8 +5848,11 @@ TkWmStackorderToplevel(parentPtr)
*/
static void
-ApplyWindowAttributeChanges(TkWindow *winPtr, int newAttributes,
- int oldAttributes, int create)
+ApplyWindowAttributeChanges(
+ TkWindow *winPtr,
+ int newAttributes,
+ int oldAttributes,
+ int create)
{
if (newAttributes != oldAttributes) {
if (winPtr->window == None) {
@@ -5913,3 +5875,11 @@ ApplyWindowAttributeChanges(TkWindow *winPtr, int newAttributes,
oldAttributes & (newAttributes ^ oldAttributes));
}
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */