diff --git a/VERSION b/VERSION index fe52a0f1..06768c81 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.3.140 +8.3.141 diff --git a/commands/CmdLQ.c b/commands/CmdLQ.c index e4b99d48..20045d85 100644 --- a/commands/CmdLQ.c +++ b/commands/CmdLQ.c @@ -50,6 +50,9 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/ void CmdPaintEraseButton(); +/* See the SetLabel command */ + +extern Label *DefaultLabel; /* * ---------------------------------------------------------------------------- @@ -169,8 +172,8 @@ CmdLabel(w, cmd) MagWindow *w; TxCommand *cmd; { - TileType type; - int pos, font = -1, size = 0, rotate = 0, offx = 0, offy = 0; + TileType type = (TileType)(-1); + int pos = -1, font = -1, size = 0, rotate = 0, offx = 0, offy = 0; bool sticky = FALSE; int option; char *p; @@ -185,6 +188,22 @@ CmdLabel(w, cmd) p = cmd->tx_argv[1]; + /* + * If the "setlabel" command has been used to set defaults, pick up + * the default values from DefaultLabel. + */ + if (DefaultLabel != NULL) + { + pos = DefaultLabel->lab_just; + font = DefaultLabel->lab_font; + size = DefaultLabel->lab_size; + rotate = DefaultLabel->lab_rotate; + offx = DefaultLabel->lab_offset.p_x; + offy = DefaultLabel->lab_offset.p_y; + sticky = (DefaultLabel->lab_flags & LABEL_STICKY) ? 1 : 0; + type = DefaultLabel->lab_type; + } + /* * Find and check validity of position. */ @@ -220,13 +239,14 @@ CmdLabel(w, cmd) else pos = GeoTransPos(&RootToEditTransform, pos); } - else pos = -1; if (font >= 0) { char *yp = NULL; - size = DBLambda[1]; + if (DefaultLabel == NULL) + size = DBLambda[1]; + if (cmd->tx_argc > 3) if (StrIsNumeric(cmd->tx_argv[3])) size = cmdScaleCoord(w, cmd->tx_argv[3], TRUE, TRUE, 8); @@ -304,7 +324,7 @@ CmdLabel(w, cmd) TxError("Unknown layer: %s\n", cmd->tx_argv[cmd->tx_argc - 1]); return; } - } else type = -1; + } CmdLabelProc(p, font, size, rotate, offx, offy, pos, sticky, type); } diff --git a/commands/CmdRS.c b/commands/CmdRS.c index ac5ea67f..37f9a58c 100644 --- a/commands/CmdRS.c +++ b/commands/CmdRS.c @@ -54,6 +54,9 @@ static char rcsid[] __attribute__ ((unused)) = "$Header: /usr/cvsroot/magic-8.0/ extern void DisplayWindow(); +/* Used by CmdSetLabel() */ +Label *DefaultLabel; + /* * ---------------------------------------------------------------------------- * @@ -1892,8 +1895,7 @@ cmdLabelFontFunc(label, cellUse, transform, font) * Query or change properties of a (selected) label in the edit cell * * Usage: - * setlabel option [name] - * + * setlabel [-default] option [name] * * Option may be one of: * text @@ -1913,6 +1915,11 @@ cmdLabelFontFunc(label, cellUse, transform, font) * "setlabel font " can be used without any select to load fonts * from a startup script. * + * Use with "-default" causes the DefaultLabel structure to be created + * (if not existing already) and set with the given value. Subsequent + * use of the "label" command will start with the given defaults, then + * apply whatever non-default values are specified in the command. + * * ---------------------------------------------------------------------------- */ @@ -1933,10 +1940,12 @@ CmdSetLabel(w, cmd) TxCommand *cmd; { int pos = -1, font = -1, size = 0, rotate = 0, flags = 0; + int locargc, argstart = 1; char **msg; Point offset; TileType ttype; int option; + bool doDefault = FALSE; #ifdef MAGIC_WRAPPER Tcl_Obj *lobj; #endif @@ -1959,10 +1968,34 @@ CmdSetLabel(w, cmd) NULL }; - if (cmd->tx_argc < 2 || cmd->tx_argc > 4) + locargc = cmd->tx_argc; + if (locargc > 2) + { + if (!strncmp(cmd->tx_argv[1], "-def", 4)) + { + if (DefaultLabel == NULL) + { + DefaultLabel = (Label *)mallocMagic(sizeof(Label)); + /* Set default defaults (lab_text is ignored) */ + DefaultLabel->lab_just = -1; + DefaultLabel->lab_size = 0; + DefaultLabel->lab_font = -1; + DefaultLabel->lab_rotate = 0; + DefaultLabel->lab_flags = 0; + DefaultLabel->lab_offset.p_x = 0; + DefaultLabel->lab_offset.p_y = 0; + DefaultLabel->lab_type = (TileType)(-1); + } + doDefault = TRUE; + locargc--; + argstart++; + } + } + + if (locargc < 2 || locargc > 4) option = SETLABEL_HELP; else - option = Lookup(cmd->tx_argv[1], cmdLabelSetOption); + option = Lookup(cmd->tx_argv[argstart], cmdLabelSetOption); switch (option) { @@ -1981,20 +2014,27 @@ CmdSetLabel(w, cmd) break; case SETLABEL_TEXT: - if (EditCellUse) + if (doDefault) + { + TxError("Cannot set a default label text.\n"); + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelTextFunc, (cmd->tx_argc == 3) ? - (ClientData)cmd->tx_argv[2] : (ClientData)NULL); + cmdLabelTextFunc, (locargc == 3) ? + (ClientData)cmd->tx_argv[argstart + 1] : (ClientData)NULL); } break; case SETLABEL_FONT: - if (cmd->tx_argc >= 2 && cmd->tx_argc <= 4) + if (locargc >= 2 && locargc <= 4) { - if ((cmd->tx_argc == 3) && StrIsInt(cmd->tx_argv[2])) + /* This option is used to see the font name corresponding + * to a font number. + */ + if ((locargc == 3) && StrIsInt(cmd->tx_argv[argstart + 1])) { - int font = atoi(cmd->tx_argv[2]); + int font = atoi(cmd->tx_argv[argstart + 1]); if (font < -1 || font >= DBNumFonts) { if (DBNumFonts == 0) @@ -2008,67 +2048,118 @@ CmdSetLabel(w, cmd) else TxPrintf("%s\n", DBFontList[font]->mf_name); } - else if ((cmd->tx_argc == 3 || cmd->tx_argc == 4) && - !StrIsInt(cmd->tx_argv[2])) + else if ((locargc == 3 || locargc == 4) && + !StrIsInt(cmd->tx_argv[argstart + 1])) { - font = DBNameToFont(cmd->tx_argv[2]); + font = DBNameToFont(cmd->tx_argv[argstart + 1]); if (font < -1) { float scale = 1.0; - if ((cmd->tx_argc == 4) && StrIsNumeric(cmd->tx_argv[3])) - scale = (float)atof(cmd->tx_argv[3]); - if (DBLoadFont(cmd->tx_argv[2], scale) != 0) - TxError("Error loading font \"%s\"\n", cmd->tx_argv[2]); - font = DBNameToFont(cmd->tx_argv[2]); + if ((locargc == 4) && StrIsNumeric(cmd->tx_argv[argstart + 2])) + scale = (float)atof(cmd->tx_argv[argstart + 2]); + if (DBLoadFont(cmd->tx_argv[argstart + 1], scale) != 0) + TxError("Error loading font \"%s\"\n", cmd->tx_argv[argstart + 1]); + font = DBNameToFont(cmd->tx_argv[argstart + 1]); if (font < -1) break; } } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { + font = DefaultLabel->lab_font; + if (font == -1) +#ifdef MAGIC_WRAPPER + Tcl_SetResult(magicinterp, "default", TCL_VOLATILE); +#else + TxPrintf("default\n"); +#endif + else +#ifdef MAGIC_WRAPPER + Tcl_SetObjResult(magicinterp, + Tcl_NewStringObj(DBFontList[font]->mf_name, -1)); +#else + TxPrintf("%s\n", DBFontList[font]->mf_name); +#endif + } + else + DefaultLabel->lab_font = font; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelFontFunc, (cmd->tx_argc == 3) ? + cmdLabelFontFunc, (locargc == 3) ? (ClientData)&font : (ClientData)NULL); } } break; case SETLABEL_JUSTIFY: - if (cmd->tx_argc == 3) + if (locargc == 3) { - pos = GeoNameToPos(cmd->tx_argv[2], FALSE, TRUE); + pos = GeoNameToPos(cmd->tx_argv[argstart + 1], FALSE, TRUE); if (pos < 0) break; } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { +#ifdef MAGIC_WRAPPER + Tcl_SetObjResult(magicinterp, + Tcl_NewStringObj(GeoPosToName(DefaultLabel->lab_just), + -1)); +#else + TxPrintf("%s\n", GeoPosToName(DefaultLabel->lab_just)); +#endif + } + else + DefaultLabel->lab_just = pos; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelJustFunc, (cmd->tx_argc == 3) ? + cmdLabelJustFunc, (locargc == 3) ? (ClientData)&pos : (ClientData)NULL); } break; case SETLABEL_SIZE: - if (cmd->tx_argc == 3) + if (locargc == 3) { - if (StrIsNumeric(cmd->tx_argv[2])) - size = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8); + if (StrIsNumeric(cmd->tx_argv[argstart + 1])) + size = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8); if (size <= 0) break; } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { +#ifdef MAGIC_WRAPPER + Tcl_SetObjResult(magicinterp, + Tcl_NewIntObj(DefaultLabel->lab_size)); +#else + TxPrintf("%d\n", DefaultLabel->lab_size); +#endif + } + else + DefaultLabel->lab_size = size; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelSizeFunc, (cmd->tx_argc == 3) ? + cmdLabelSizeFunc, (locargc == 3) ? (ClientData)&size : (ClientData)NULL); } break; case SETLABEL_OFFSET: - if (cmd->tx_argc == 3) + if (locargc == 3) { char *yp; - if ((yp = strchr(cmd->tx_argv[2], ' ')) != NULL) + if ((yp = strchr(cmd->tx_argv[argstart + 1], ' ')) != NULL) { - offset.p_x = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8); + offset.p_x = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8); offset.p_y = cmdScaleCoord(w, yp, TRUE, FALSE, 8); } else @@ -2077,67 +2168,138 @@ CmdSetLabel(w, cmd) return; } } - else if (cmd->tx_argc == 4) + else if (locargc == 4) { - offset.p_x = cmdScaleCoord(w, cmd->tx_argv[2], TRUE, TRUE, 8); - offset.p_y = cmdScaleCoord(w, cmd->tx_argv[3], TRUE, FALSE, 8); + offset.p_x = cmdScaleCoord(w, cmd->tx_argv[argstart + 1], TRUE, TRUE, 8); + offset.p_y = cmdScaleCoord(w, cmd->tx_argv[argstart + 2], TRUE, FALSE, 8); } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { +#ifdef MAGIC_WRAPPER + Tcl_Obj *lobj; + Tcl_NewListObj(0, NULL); + Tcl_ListObjAppendElement(magicinterp, lobj, + Tcl_NewIntObj(DefaultLabel->lab_offset.p_x)); + Tcl_ListObjAppendElement(magicinterp, lobj, + Tcl_NewIntObj(DefaultLabel->lab_offset.p_y)); + Tcl_SetObjResult(magicinterp, lobj); +#else + TxPrintf("%d %d\n", DefaultLabel->lab_offset.p_x, + DefaultLabel->lab_offset.p_y); +#endif + } + else + DefaultLabel->lab_offset = offset; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelOffsetFunc, (cmd->tx_argc != 2) ? + cmdLabelOffsetFunc, (locargc != 2) ? (ClientData)&offset : (ClientData)NULL); } break; case SETLABEL_ROTATE: - if (cmd->tx_argc == 3) + if (locargc == 3) { - if (StrIsInt(cmd->tx_argv[2])) - rotate = atoi(cmd->tx_argv[2]); + if (StrIsInt(cmd->tx_argv[argstart + 1])) + rotate = atoi(cmd->tx_argv[argstart + 1]); } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { +#ifdef MAGIC_WRAPPER + Tcl_SetObjResult(magicinterp, + Tcl_NewIntObj(DefaultLabel->lab_rotate)); +#else + TxPrintf("%d\n", DefaultLabel->lab_rotate); +#endif + } + else + DefaultLabel->lab_rotate = rotate; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelRotateFunc, (cmd->tx_argc == 3) ? + cmdLabelRotateFunc, (locargc == 3) ? (ClientData)&rotate : (ClientData)NULL); } break; case SETLABEL_STICKY: - if (cmd->tx_argc == 3) + if (locargc == 3) { - option = Lookup(cmd->tx_argv[2], cmdLabelYesNo); + option = Lookup(cmd->tx_argv[argstart + 1], cmdLabelYesNo); if (option < 0) { - TxError("Unknown sticky option \"%s\"\n", cmd->tx_argv[2]); + TxError("Unknown sticky option \"%s\"\n", cmd->tx_argv[argstart + 1]); break; } flags = (option <= 3) ? 0 : LABEL_STICKY; } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { +#ifdef MAGIC_WRAPPER + Tcl_SetObjResult(magicinterp, + Tcl_NewBooleanObj((DefaultLabel->lab_flags & + LABEL_STICKY) ? TRUE : FALSE)); +#else + TxPrintf("%d\n", (DefaultLabel->lab_flags & LABEL_STICKY) ? 1 : 0); +#endif + } + else + DefaultLabel->lab_flags = flags; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelStickyFunc, (cmd->tx_argc == 3) ? + cmdLabelStickyFunc, (locargc == 3) ? (ClientData)&flags : (ClientData)NULL); } break; case SETLABEL_LAYER: - if (cmd->tx_argc == 3) + if (locargc == 3) { - if (!strcasecmp(cmd->tx_argv[2], "default")) + if (!strcasecmp(cmd->tx_argv[argstart + 1], "default")) ttype = -1; else { - ttype = DBTechNoisyNameType(cmd->tx_argv[2]); + ttype = DBTechNoisyNameType(cmd->tx_argv[argstart + 1]); if (ttype < 0) break; } } - if (EditCellUse) + if (doDefault) + { + if (locargc == 2) + { + if (DefaultLabel->lab_type == (TileType)(-1)) +#ifdef MAGIC_WRAPPER + Tcl_SetResult(magicinterp, "default", TCL_VOLATILE); +#else + TxPrintf("default\n"); +#endif + else +#ifdef MAGIC_WRAPPER + Tcl_SetResult(magicinterp, + DBTypeLongNameTbl[DefaultLabel->lab_type], + TCL_VOLATILE); +#else + TxPrintf("%s\n", DBTypeLongNameTbl[DefaultLabel->lab_type]); +#endif + } + else + DefaultLabel->lab_type = ttype; + } + else if (EditCellUse) { SelEnumLabels(&DBAllTypeBits, TRUE, (bool *)NULL, - cmdLabelLayerFunc, (cmd->tx_argc == 3) ? + cmdLabelLayerFunc, (locargc == 3) ? (ClientData)&ttype : (ClientData)NULL); } break; @@ -2151,7 +2313,7 @@ CmdSetLabel(w, cmd) break; default: - TxError("Unknown setlabel option \"%s\"\n", cmd->tx_argv[1]); + TxError("Unknown setlabel option \"%s\"\n", cmd->tx_argv[argstart]); break; } }