summaryrefslogtreecommitdiffstats
path: root/macosx/tkMacOSXWm.c
diff options
context:
space:
mode:
Diffstat (limited to 'macosx/tkMacOSXWm.c')
-rw-r--r--macosx/tkMacOSXWm.c608
1 files changed, 298 insertions, 310 deletions
diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c
index 47c038a..ca54f81 100644
--- a/macosx/tkMacOSXWm.c
+++ b/macosx/tkMacOSXWm.c
@@ -12,7 +12,7 @@
* 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.15 2004/11/11 01:24:32 das Exp $
+ * RCS: @(#) $Id: tkMacOSXWm.c,v 1.16 2005/03/23 22:17:31 wolfsuit Exp $
*/
#include <Carbon/Carbon.h>
@@ -56,6 +56,12 @@ static Tk_GeomMgr wmMgrType = {
};
/*
+ * The following keeps state for Aqua dock icon bounce notification.
+ */
+
+int tkMacOSXWmAttrNotifyVal = 0;
+
+/*
* Hash table for Mac Window -> TkWindow mapping.
*/
@@ -91,6 +97,8 @@ static void WmAttrGetModifiedStatus(WindowRef macWindow, Tcl_Obj
static void WmAttrGetTitlePath(WindowRef macWindow, Tcl_Obj
*result);
static void WmAttrGetAlpha(WindowRef macWindow, Tcl_Obj *result);
+static void WmAttrGetNotifyStatus(Tcl_Obj *result);
+static void WmAttrSetNotifyStatus(int state);
static int WmClientCmd _ANSI_ARGS_((Tk_Window tkwin,
TkWindow *winPtr, Tcl_Interp *interp, int objc,
Tcl_Obj *CONST objv[]));
@@ -177,6 +185,10 @@ static int WmWithdrawCmd _ANSI_ARGS_((Tk_Window tkwin,
Tcl_Obj *CONST objv[]));
static void WmUpdateGeom _ANSI_ARGS_((WmInfo *wmPtr,
TkWindow *winPtr));
+static int TkMacOSXWinStyle _ANSI_ARGS_((Tcl_Interp *interp,
+ TkWindow *winPtr, int objc, Tcl_Obj * CONST
+ objv[]));
+
/*
*--------------------------------------------------------------
@@ -775,18 +787,20 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
"-modified",
"-titlepath",
"-alpha",
+ "-notify",
(char *)NULL
};
enum optionIdx {
WmAttrModifiedIdx,
WmAttrTitlePathIdx,
WmAttrAlphaIdx,
+ WmAttrNotifyIdx,
};
/* Must have objc >= 3 at this point. */
if (objc < 3) {
Tcl_WrongNumArgs(interp, 1, objv,
- "attributes window ?-modified ?bool?? ?-titlepath ?path?? ?-alpha ?double??");
+ "attributes window ?-modified ?bool?? ?-titlepath ?path?? ?-alpha ?double?? ?-notify ?bool??");
return TCL_ERROR;
}
@@ -800,6 +814,8 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
WmAttrGetTitlePath(macWindow, result);
Tcl_AppendToObj(result, " -alpha ", -1);
WmAttrGetAlpha(macWindow, result);
+ Tcl_AppendToObj(result, " -notify ", -1);
+ WmAttrGetNotifyStatus(result);
Tcl_SetObjResult(interp, result);
return TCL_OK;
}
@@ -819,6 +835,9 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
case WmAttrAlphaIdx:
WmAttrGetAlpha(macWindow, result);
break;
+ case WmAttrNotifyIdx:
+ WmAttrGetNotifyStatus(result);
+ break;
}
Tcl_SetObjResult(interp, result);
return TCL_OK;
@@ -885,6 +904,14 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
result = Tcl_NewDoubleObj(dval);
SetWindowAlpha(macWindow, dval);
break;
+ case WmAttrNotifyIdx:
+ if (Tcl_GetBooleanFromObj(interp, objv[i+1], &boolean) !=
+ TCL_OK) {
+ return TCL_ERROR;
+ }
+ result = Tcl_NewBooleanObj(boolean);
+ WmAttrSetNotifyStatus(boolean);
+ break;
}
}
Tcl_SetObjResult(interp, result);
@@ -978,6 +1005,64 @@ static void WmAttrGetAlpha(WindowRef macWindow, Tcl_Obj *result)
/*
*----------------------------------------------------------------------
+ * WmAttrGetNotifyStatus --
+ *
+ * Helper procedure to retrieve the -notify option for the wm
+ * attributes command.
+ *
+ * Results:
+ * Nothing.
+ *
+ * Side effects:
+ * Appends the notify status of the given window to the Tcl_Obj
+ * passed in.
+ *
+ *----------------------------------------------------------------------
+ */
+static void WmAttrGetNotifyStatus(Tcl_Obj *result)
+{
+ Tcl_AppendObjToObj(result,
+ Tcl_NewBooleanObj((tkMacOSXWmAttrNotifyVal != 0)));
+}
+/*
+ *----------------------------------------------------------------------
+ * WmAttrGetNotifyStatus --
+ *
+ * Helper procedure to set the -notify option for the wm
+ * attributes command.
+ *
+ * Results:
+ * Nothing.
+ *
+ * Side effects:
+ * Sets the notify status.
+ *
+ *----------------------------------------------------------------------
+ */
+static void WmAttrSetNotifyStatus(int state)
+{
+ static NMRec notifyRec;
+
+ if (state) {
+ if (tkMacOSXWmAttrNotifyVal == 0) {
+ notifyRec.qType = nmType;
+ notifyRec.nmMark = 1;
+ notifyRec.nmSound = NULL;
+ notifyRec.nmStr = NULL;
+ notifyRec.nmResp = NULL;
+ notifyRec.nmRefCon = 0;
+ NMInstall(&notifyRec);
+ tkMacOSXWmAttrNotifyVal = 1;
+ }
+ } else {
+ if (tkMacOSXWmAttrNotifyVal != 0) {
+ NMRemove(&notifyRec);
+ tkMacOSXWmAttrNotifyVal = 0;
+ }
+ }
+}
+/*
+ *----------------------------------------------------------------------
*
* WmClientCmd --
*
@@ -1814,7 +1899,6 @@ WmIconphotoCmd(tkwin, winPtr, interp, objc, objv)
int objc; /* Number of arguments. */
Tcl_Obj *CONST objv[]; /* Argument objects. */
{
- register WmInfo *wmPtr = winPtr->wmInfoPtr;
Tk_PhotoHandle photo;
int i, width, height, isDefault = 0;
@@ -2612,7 +2696,7 @@ Tcl_Obj *CONST objv[]; /* Argument objects. */
(char *) NULL);
return TCL_ERROR;
}
- if (wmPtr->master != NULL) {
+ if (wmPtr->master != None) {
Tcl_AppendResult(interp, "can't iconify \"",
winPtr->pathName,
"\": it is a transient", (char *) NULL);
@@ -4676,7 +4760,8 @@ TkMacOSXZoomToplevel(
* 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.
+ * for a Macintosh window, and to manipulate Mac specific window
+ * types.
*
* Results:
* A standard Tcl result.
@@ -4689,338 +4774,241 @@ TkMacOSXZoomToplevel(
/* ARGSUSED */
int
-TkUnsupported1Cmd(
+TkUnsupported1ObjCmd(
ClientData clientData, /* Main window associated with
* interpreter. */
Tcl_Interp *interp, /* Current interpreter. */
- int argc, /* Number of arguments. */
- CONST char **argv) /* Argument strings. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj * CONST objv[]) /* Argument objects. */
{
+ static CONST char *subcmds[] = {
+ "style", NULL
+ };
+ enum SubCmds {
+ STYLE
+ };
Tk_Window tkwin = (Tk_Window) clientData;
TkWindow *winPtr;
- WmInfo *wmPtr;
- int c;
- size_t length;
+ int index;
- if (argc < 3) {
- Tcl_AppendResult(interp, "wrong # args: should be \"",
- argv[0], " option window ?arg ...?\"", (char *) NULL);
+ if (objc < 3) {
+ Tcl_WrongNumArgs(interp, 1, objv,
+ "option window ?arg ...?");
return TCL_ERROR;
}
- winPtr = (TkWindow *) Tk_NameToWindow(interp, argv[2], tkwin);
+ winPtr = (TkWindow *) Tk_NameToWindow(interp,
+ Tcl_GetString(objv[2]), tkwin);
if (winPtr == NULL) {
return TCL_ERROR;
}
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", (char *) NULL);
return TCL_ERROR;
}
- wmPtr = winPtr->wmInfoPtr;
- c = argv[1][0];
- length = strlen(argv[1]);
- if ((c == 's') && (strncmp(argv[1], "style", length) == 0)) {
- if ((argc < 3) || (argc > 5)) {
- Tcl_AppendResult(interp, "wrong # arguments: must be \"",
- argv[0], " style window ?windowStyle?\"",
- " or \"", argv[0], "style window ?class attributes?\"",
- (char *) NULL);
- return TCL_ERROR;
- }
-
- if (argc == 3) {
- int appearanceSpec = 0;
-
- switch (wmPtr->style) {
- case -1:
- appearanceSpec = 1;
- break;
- case noGrowDocProc:
- case documentProc:
- Tcl_SetResult(interp, "documentProc", TCL_STATIC);
- break;
- case dBoxProc:
- Tcl_SetResult(interp, "dBoxProc", TCL_STATIC);
- break;
- case plainDBox:
- Tcl_SetResult(interp, "plainDBox", TCL_STATIC);
- break;
- case altDBoxProc:
- Tcl_SetResult(interp, "altDBoxProc", TCL_STATIC);
- break;
- case movableDBoxProc:
- Tcl_SetResult(interp, "movableDBoxProc", TCL_STATIC);
- break;
- case zoomDocProc:
- case zoomNoGrow:
- Tcl_SetResult(interp, "zoomDocProc", TCL_STATIC);
- break;
- /* Not supported in Carbon
- case rDocProc:
- Tcl_SetResult(interp, "rDocProc", TCL_STATIC);
- break;
- */
- case floatProc:
- case floatGrowProc:
- Tcl_SetResult(interp, "floatProc", TCL_STATIC);
- break;
- case floatZoomProc:
- case floatZoomGrowProc:
- Tcl_SetResult(interp, "floatZoomProc", TCL_STATIC);
- break;
- case floatSideProc:
- case floatSideGrowProc:
- Tcl_SetResult(interp, "floatSideProc", TCL_STATIC);
- break;
- case floatSideZoomProc:
- case floatSideZoomGrowProc:
- Tcl_SetResult(interp, "floatSideZoomProc", TCL_STATIC);
+
+ if (Tcl_GetIndexFromObj(interp, objv[1], subcmds, "option",
+ 0, &index) != TCL_OK) {
+ return TCL_ERROR;
+ }
+ switch ((enum SubCmds) index) {
+ case STYLE:
+ if ((objc < 3) || (objc > 5)) {
+ Tcl_WrongNumArgs(interp, 2, objv, "window ?class attributes?");
+ return TCL_ERROR;
+ }
+ return TkMacOSXWinStyle(interp, winPtr, objc, objv);
+ default:
+ Tcl_ResetResult(interp);
+ Tcl_AppendResult(interp, "unknown or ambiguous option \"",
+ Tcl_GetString(objv[1]),
+ "\": must be style",
+ (char *) NULL);
+ return TCL_ERROR;
+ }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkMacOSXWinStyle --
+ *
+ * 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.
+ *
+ * Side effects:
+ * Changes the style of a new Mac window.
+ *
+ *----------------------------------------------------------------------
+ */
+int
+TkMacOSXWinStyle(
+ Tcl_Interp *interp, /* Current interpreter. */
+ TkWindow *winPtr, /* Window to be manipulated. */
+ int objc, /* Number of arguments. */
+ Tcl_Obj * CONST objv[]) /* Argument objects. */
+{
+ struct StrIntMap {
+ char *strValue;
+ int intValue;
+ };
+ static CONST struct StrIntMap styleMap[] = {
+ { "documentProc", documentProc },
+ { "noGrowDocProc", documentProc },
+ { "dBoxProc", dBoxProc },
+ { "plainDBox", plainDBox },
+ { "altDBoxProc", altDBoxProc },
+ { "movableDBoxProc", movableDBoxProc },
+ { "zoomDocProc", zoomDocProc },
+ { "zoomNoGrow", zoomNoGrow },
+ { "floatProc", floatGrowProc },
+ { "floatGrowProc", floatGrowProc },
+ { "floatZoomProc", floatZoomGrowProc },
+ { "floatZoomGrowProc", floatZoomGrowProc },
+ { "floatSideProc", floatSideGrowProc },
+ { "floatSideGrowProc", floatSideGrowProc },
+ { "floatSideZoomProc", floatSideZoomGrowProc },
+ { "floatSideZoomGrowProc", floatSideZoomGrowProc },
+ { NULL, 0 }
+ };
+ static CONST struct StrIntMap classMap[] = {
+ { "alert", kAlertWindowClass },
+ { "moveableAlert", kMovableAlertWindowClass },
+ { "modal", kModalWindowClass },
+ { "moveableModal", kMovableModalWindowClass },
+ { "floating", kFloatingWindowClass },
+ { "document", kDocumentWindowClass },
+ { "help", kHelpWindowClass },
+ { "sheet", kSheetWindowClass },
+ { "toolbar", kToolbarWindowClass },
+ { "plain", kPlainWindowClass },
+ { "overlay", kOverlayWindowClass },
+ { "sheetAlert", kSheetAlertWindowClass },
+ { "altPlain", kAltPlainWindowClass },
+ { "drawer", kDrawerWindowClass },
+ { NULL, 0 }
+ };
+ static CONST struct StrIntMap compositeAttrMap[] = {
+ { "none", kWindowNoAttributes },
+ { "standardDocument", kWindowStandardDocumentAttributes },
+ { "standardFloating", kWindowStandardFloatingAttributes },
+ { NULL, 0 }
+ };
+ static CONST struct StrIntMap attrMap[] = {
+ { "closeBox", kWindowCloseBoxAttribute },
+ { "horizontalZoom", kWindowHorizontalZoomAttribute },
+ { "verticalZoom", kWindowVerticalZoomAttribute },
+ { "collapseBox", kWindowCollapseBoxAttribute },
+ { "resizable", kWindowResizableAttribute },
+ { "sideTitlebar", kWindowSideTitlebarAttribute },
+ { "toolbarButton", kWindowToolbarButtonAttribute },
+ { "metal", kWindowMetalAttribute },
+ { "noActivates", kWindowNoActivatesAttribute },
+ { "noUpdates", kWindowNoUpdatesAttribute },
+ { "compositing", kWindowCompositingAttribute },
+ { "noShadow", kWindowNoShadowAttribute },
+ { "hideOnSuspend", kWindowHideOnSuspendAttribute },
+ { "standardHandler", kWindowStandardHandlerAttribute },
+ { "hideOnFullScreen", kWindowHideOnFullScreenAttribute},
+ { NULL, 0 }
+ };
+ int index, i;
+ WmInfo *wmPtr = winPtr->wmInfoPtr;
+
+ if (objc == 3) {
+ if (wmPtr->style != -1) {
+ for (i = 0; styleMap[i].strValue != NULL; i++) {
+ if (wmPtr->style == styleMap[i].intValue) {
+ Tcl_SetObjResult(interp,
+ Tcl_NewStringObj(styleMap[i].strValue, -1));
+ return TCL_OK;
+ }
+ }
+ Tcl_Panic("invalid style");
+ } else {
+ Tcl_Obj *attributeList, *newResult = NULL;
+ int usesComposite;
+
+ for (i = 0; classMap[i].strValue != NULL; i++) {
+ if (wmPtr->macClass == classMap[i].intValue) {
+ newResult = Tcl_NewStringObj(classMap[i].strValue, -1);
break;
- default:
- Tcl_Panic("invalid style");
+ }
+ }
+ if (newResult == NULL) {
+ Tcl_Panic("invalid class");
}
- if (appearanceSpec) {
- Tcl_Obj *attributeList, *newResult = NULL;
-
- switch (wmPtr->macClass) {
- case kAlertWindowClass:
- newResult = Tcl_NewStringObj("alert", -1);
- break;
- case kMovableAlertWindowClass:
- newResult = Tcl_NewStringObj("moveableAlert", -1);
- break;
- case kModalWindowClass:
- newResult = Tcl_NewStringObj("modal", -1);
- break;
- case kMovableModalWindowClass:
- newResult = Tcl_NewStringObj("moveableModal", -1);
- break;
- case kFloatingWindowClass:
- newResult = Tcl_NewStringObj("floating", -1);
- break;
- case kDocumentWindowClass:
- newResult = Tcl_NewStringObj("document", -1);
- break;
- case kHelpWindowClass:
- newResult = Tcl_NewStringObj("help", -1);
- break;
- case kToolbarWindowClass:
- newResult = Tcl_NewStringObj("toolbar", -1);
- break;
- default:
- Tcl_Panic("invalid class");
- }
- attributeList = Tcl_NewListObj(0, NULL);
- if (wmPtr->attributes == kWindowNoAttributes) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("none", -1));
- } else if (wmPtr->attributes == kWindowStandardDocumentAttributes) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("standardDocument", -1));
- } else if (wmPtr->attributes == kWindowStandardFloatingAttributes) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("standardFloating", -1));
- } else {
- if (wmPtr->attributes & kWindowCloseBoxAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("closeBox", -1));
- }
- if (wmPtr->attributes & kWindowHorizontalZoomAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("horizontalZoom", -1));
- }
- if (wmPtr->attributes & kWindowVerticalZoomAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("verticalZoom", -1));
- }
- if (wmPtr->attributes & kWindowCollapseBoxAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("collapseBox", -1));
- }
- if (wmPtr->attributes & kWindowResizableAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("resizable", -1));
- }
- if (wmPtr->attributes & kWindowSideTitlebarAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("sideTitlebar", -1));
- }
- if (wmPtr->attributes & kWindowNoUpdatesAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("noUpdates", -1));
- }
- if (wmPtr->attributes & kWindowNoActivatesAttribute) {
- Tcl_ListObjAppendElement(interp, attributeList,
- Tcl_NewStringObj("noActivates", -1));
- }
- }
- Tcl_ListObjAppendElement(interp, newResult, attributeList);
- Tcl_SetObjResult(interp, newResult);
+ attributeList = Tcl_NewListObj(0, NULL);
+ usesComposite = 0;
+
+ for (i = 0; compositeAttrMap[i].strValue != NULL; i++) {
+ if (wmPtr->attributes == compositeAttrMap[i].intValue) {
+ Tcl_ListObjAppendElement(interp, attributeList,
+ Tcl_NewStringObj(compositeAttrMap[i].strValue, -1));
+ usesComposite = 1;
+ break;
+ }
}
- return TCL_OK;
- } else if (argc == 4) {
- if (strcmp(argv[3], "documentProc") == 0) {
- wmPtr->style = documentProc;
- } else if (strcmp(argv[3], "noGrowDocProc") == 0) {
- wmPtr->style = documentProc;
- } else if (strcmp(argv[3], "dBoxProc") == 0) {
- wmPtr->style = dBoxProc;
- } else if (strcmp(argv[3], "plainDBox") == 0) {
- wmPtr->style = plainDBox;
- } else if (strcmp(argv[3], "altDBoxProc") == 0) {
- wmPtr->style = altDBoxProc;
- } else if (strcmp(argv[3], "movableDBoxProc") == 0) {
- wmPtr->style = movableDBoxProc;
- } else if (strcmp(argv[3], "zoomDocProc") == 0) {
- wmPtr->style = zoomDocProc;
- } else if (strcmp(argv[3], "zoomNoGrow") == 0) {
- wmPtr->style = zoomNoGrow;
+ if (!usesComposite) {
+ for (i = 0; attrMap[i].strValue != NULL; i++) {
+ if (wmPtr->attributes & attrMap[i].intValue) {
+ Tcl_ListObjAppendElement(interp, attributeList,
+ Tcl_NewStringObj(attrMap[i].strValue, -1));
+ }
+ }
+ }
+ Tcl_ListObjAppendElement(interp, newResult, attributeList);
+ Tcl_SetObjResult(interp, newResult);
}
- /*
- else
- if (strcmp(argv[3], "rDocProc") == 0) {
- wmPtr->style = rDocProc;
+ } else if (objc == 4) {
+ if (Tcl_GetIndexFromObjStruct(interp, objv[3], styleMap,
+ sizeof(struct StrIntMap), "style", 0, &index) != TCL_OK) {
+ return TCL_ERROR;
}
- */
- else if (strcmp(argv[3], "floatProc") == 0) {
- wmPtr->style = floatGrowProc;
- } else if (strcmp(argv[3], "floatGrowProc") == 0) {
- wmPtr->style = floatGrowProc;
- } else if (strcmp(argv[3], "floatZoomProc") == 0) {
- wmPtr->style = floatZoomGrowProc;
- } else if (strcmp(argv[3], "floatZoomGrowProc") == 0) {
- wmPtr->style = floatZoomGrowProc;
- } else if (strcmp(argv[3], "floatSideProc") == 0) {
- wmPtr->style = floatSideGrowProc;
- } else if (strcmp(argv[3], "floatSideGrowProc") == 0) {
- wmPtr->style = floatSideGrowProc;
- } else if (strcmp(argv[3], "floatSideZoomProc") == 0) {
- wmPtr->style = floatSideZoomGrowProc;
- } else if (strcmp(argv[3], "floatSideZoomGrowProc") == 0) {
- wmPtr->style = floatSideZoomGrowProc;
- } else {
- Tcl_AppendResult(interp, "bad style: should be documentProc, ",
- "dBoxProc, plainDBox, altDBoxProc, movableDBoxProc, ",
- "zoomDocProc, rDocProc, floatProc, floatZoomProc, ",
- "floatSideProc, or floatSideZoomProc",
- (char *) NULL);
+ wmPtr->style = styleMap[index].intValue;
+ } else if (objc == 5) {
+ int attrObjc;
+ Tcl_Obj **attrObjv = NULL;
+ int oldClass = wmPtr->macClass;
+ int oldAttributes = wmPtr->attributes;
+
+ if (Tcl_GetIndexFromObjStruct(interp, objv[3], classMap,
+ sizeof(struct StrIntMap), "class", 0, &index) != TCL_OK) {
return TCL_ERROR;
}
- } else if (argc == 5) {
- int oldClass = wmPtr->macClass;
- int oldAttributes = wmPtr->attributes;
-
- if (strcmp(argv[3], "alert") == 0) {
- wmPtr->macClass = kAlertWindowClass;
- } else if (strcmp(argv[3], "moveableAlert") == 0) {
- wmPtr->macClass = kMovableAlertWindowClass;
- } else if (strcmp(argv[3], "modal") == 0) {
- wmPtr->macClass = kModalWindowClass;
- } else if (strcmp(argv[3], "moveableModal") == 0) {
- wmPtr->macClass = kMovableModalWindowClass;
- } else if (strcmp(argv[3], "floating") == 0) {
- wmPtr->macClass = kFloatingWindowClass;
- } else if (strcmp(argv[3], "document") == 0) {
- wmPtr->macClass = kDocumentWindowClass;
- } else if (strcmp(argv[3], "help") == 0) {
- wmPtr->macClass = kHelpWindowClass;
- } else if (strcmp(argv[3], "toolbar") == 0) {
- wmPtr->macClass = kToolbarWindowClass;
- } else {
- wmPtr->macClass = oldClass;
- Tcl_AppendResult(interp, "bad class: should be alert, ",
- "moveableAlert, modal, moveableModal, floating, ",
- "help, or document",
- (char *) NULL);
- return TCL_ERROR;
- }
-
- if (strcmp(argv[4], "none") == 0) {
- wmPtr->attributes = kWindowNoAttributes;
- } else if (strcmp(argv[4], "standardDocument") == 0) {
- wmPtr->attributes = kWindowStandardDocumentAttributes;
- } else if (strcmp(argv[4], "standardFloating") == 0) {
- wmPtr->attributes = kWindowStandardFloatingAttributes;
- } else {
- int foundOne = 0;
- int attrArgc, i;
- CONST char **attrArgv = NULL;
-
- if (Tcl_SplitList(interp, argv[4], &attrArgc, &attrArgv) != TCL_OK) {
- wmPtr->macClass = oldClass;
- Tcl_AppendResult(interp, "Ill-formed attributes list: \"",
- argv[4], "\".", (char *) NULL);
- return TCL_ERROR;
- }
-
- wmPtr->attributes = kWindowNoAttributes;
-
- for (i = 0; i < attrArgc; i++) {
- if ((*attrArgv[i] == 'c')
- && (strcmp(attrArgv[i], "closeBox") == 0)) {
- wmPtr->attributes |= kWindowCloseBoxAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'h')
- && (strcmp(attrArgv[i], "horizontalZoom") == 0)) {
- wmPtr->attributes |= kWindowHorizontalZoomAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'v')
- && (strcmp(attrArgv[i], "verticalZoom") == 0)) {
- wmPtr->attributes |= kWindowVerticalZoomAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'c')
- && (strcmp(attrArgv[i], "collapseBox") == 0)) {
- wmPtr->attributes |= kWindowCollapseBoxAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'r')
- && (strcmp(attrArgv[i], "resizable") == 0)) {
- wmPtr->attributes |= kWindowResizableAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 's')
- && (strcmp(attrArgv[i], "sideTitlebar") == 0)) {
- wmPtr->attributes |= kWindowSideTitlebarAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'n')
- && (strcmp(attrArgv[i], "noActivates") == 0)) {
- wmPtr->attributes |= kWindowNoActivatesAttribute;
- foundOne = 1;
- } else if ((*attrArgv[i] == 'n')
- && (strcmp(attrArgv[i], "noUpdates") == 0)) {
- wmPtr->attributes |= kWindowNoUpdatesAttribute;
- foundOne = 1;
- } else {
- foundOne = 0;
- break;
- }
- }
-
- if (attrArgv != NULL) {
- ckfree ((char *) attrArgv);
- }
-
- if (foundOne != 1) {
- wmPtr->macClass = oldClass;
- wmPtr->attributes = oldAttributes;
-
- Tcl_AppendResult(interp, "bad attribute: \"", argv[4],
- "\", should be standardDocument, ",
- "standardFloating, or some combination of ",
- "closeBox, horizontalZoom, verticalZoom, ",
- "collapseBox, resizable, or sideTitlebar.",
- (char *) NULL);
- return TCL_ERROR;
- }
+ wmPtr->macClass = classMap[index].intValue;
+ if (Tcl_ListObjGetElements(interp, objv[4], &attrObjc, &attrObjv) !=
+ TCL_OK) {
+ wmPtr->macClass = oldClass;
+ return TCL_ERROR;
+ }
+ wmPtr->attributes = kWindowNoAttributes;
+ for (i = 0; i < attrObjc; i++) {
+ if (Tcl_GetIndexFromObjStruct(interp, attrObjv[i], 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) {
+ Tcl_ResetResult (interp);
+ wmPtr->attributes |= attrMap[index].intValue;
+ } else {
+ wmPtr->macClass = oldClass;
+ wmPtr->attributes = oldAttributes;
+ return TCL_ERROR;
}
-
- wmPtr->style = -1;
}
- } else {
- Tcl_AppendResult(interp, "unknown or ambiguous option \"", argv[1],
- "\": must be style",
- (char *) NULL);
- return TCL_ERROR;
+ wmPtr->style = -1;
}
return TCL_OK;