summaryrefslogtreecommitdiffstats
path: root/generic/qebind.c
diff options
context:
space:
mode:
authortreectrl <treectrl>2002-12-31 06:40:18 (GMT)
committertreectrl <treectrl>2002-12-31 06:40:18 (GMT)
commit5dcc733d605a3fa5392081e069872a50d4fbbd5b (patch)
treea278e9c45ac18d189292562b23be971d97529fde /generic/qebind.c
parent326cbf95d4f45ed2ab889ce88472ae1c08a0836b (diff)
downloadtktreectrl-5dcc733d605a3fa5392081e069872a50d4fbbd5b.zip
tktreectrl-5dcc733d605a3fa5392081e069872a50d4fbbd5b.tar.gz
tktreectrl-5dcc733d605a3fa5392081e069872a50d4fbbd5b.tar.bz2
'generate' command now takes char-value list instead of option-value pairs.
Diffstat (limited to 'generic/qebind.c')
-rw-r--r--generic/qebind.c93
1 files changed, 53 insertions, 40 deletions
diff --git a/generic/qebind.c b/generic/qebind.c
index 7d0ce29..d186d93 100644
--- a/generic/qebind.c
+++ b/generic/qebind.c
@@ -1496,7 +1496,7 @@ int QE_BindCmd(QE_BindingTable bindingTable, int objOffset, int objc,
/*
* qegenerate -- Generate events from scripts.
- * Usage: qegenerate pattern ?field value ...?
+ * Usage: qegenerate pattern {char value ...}
* Desciption: Scripts can generate "fake" quasi-events by providing
* a quasi-event pattern and option field/value pairs.
*/
@@ -1556,19 +1556,20 @@ QE_GenerateCmd(QE_BindingTable bindingTable, int objOffset, int objc,
BindingTable *bindPtr = (BindingTable *) bindingTable;
QE_Event fakeEvent;
QE_ExpandProc oldExpandProc;
- Tcl_Obj *CONST *objPtr;
EventInfo *eiPtr;
Detail *dPtr;
GenerateData genData;
GenerateField *fieldPtr;
char *p, *t;
+ int listObjc;
+ Tcl_Obj **listObjv;
Pattern pats;
int result;
- if (objc - objOffset < 2)
+ if (objc - objOffset < 2 || objc - objOffset > 3)
{
Tcl_WrongNumArgs(bindPtr->interp, objOffset + 1, objv,
- "pattern ?field value ...?");
+ "pattern ?charMap?");
return TCL_ERROR;
}
@@ -1576,7 +1577,7 @@ QE_GenerateCmd(QE_BindingTable bindingTable, int objOffset, int objc,
if (ParseEventDescription(bindPtr, p, &pats, &eiPtr, &dPtr) != TCL_OK)
return TCL_ERROR;
- /* Can't generate an event without a detail*/
+ /* Can't generate an event without a detail */
if ((dPtr == NULL) && (eiPtr->detailList != NULL))
{
Tcl_AppendResult(bindPtr->interp, "cannot generate \"", p,
@@ -1584,43 +1585,52 @@ QE_GenerateCmd(QE_BindingTable bindingTable, int objOffset, int objc,
return TCL_ERROR;
}
- objPtr = objv + objOffset + 2;
- objc -= objOffset + 2;
-
- genData.count = objc / 2;
- genData.field = genData.staticField;
- if (genData.count > sizeof(genData.staticField) /
- sizeof(genData.staticField[0]))
+ if (objc - objOffset == 3)
{
- genData.field = (GenerateField *) Tcl_Alloc(sizeof(GenerateField) *
- genData.count);
- }
- fieldPtr = &genData.field[0];
+ if (Tcl_ListObjGetElements(bindPtr->interp, objv[objOffset + 2],
+ &listObjc, &listObjv) != TCL_OK)
+ return TCL_ERROR;
- while (objc > 1)
- {
- int length;
+ if (listObjc & 1)
+ {
+ Tcl_AppendResult(bindPtr->interp,
+ "char map must have even number of elements", (char *) NULL);
+ return TCL_ERROR;
+ }
- t = Tcl_GetStringFromObj(objPtr[0], &length);
- if ((length != 2) || (t[0] != '-'))
+ genData.count = listObjc / 2;
+ genData.field = genData.staticField;
+ if (genData.count > sizeof(genData.staticField) /
+ sizeof(genData.staticField[0]))
{
- Tcl_AppendResult(bindPtr->interp, "invalid percent char \"", t,
- "\"", NULL);
- result = TCL_ERROR;
- goto done;
+ genData.field = (GenerateField *) Tcl_Alloc(sizeof(GenerateField) *
+ genData.count);
}
- fieldPtr->which = t[1];
- fieldPtr->string = Tcl_GetStringFromObj(objPtr[1], NULL);
- fieldPtr++;
- objPtr += 2;
- objc -= 2;
- }
+ fieldPtr = &genData.field[0];
+
+ while (listObjc > 1)
+ {
+ int length;
- if (objc != 0)
+ t = Tcl_GetStringFromObj(listObjv[0], &length);
+ if (length != 1)
+ {
+ Tcl_AppendResult(bindPtr->interp, "invalid percent char \"", t,
+ "\"", NULL);
+ result = TCL_ERROR;
+ goto done;
+ }
+ fieldPtr->which = t[0];
+ fieldPtr->string = Tcl_GetStringFromObj(listObjv[1], NULL);
+ fieldPtr++;
+ listObjv += 2;
+ listObjc -= 2;
+ }
+ }
+ else
{
- Tcl_WrongNumArgs(bindPtr->interp, 2, objv, "pattern ?field value ...?");
- result = TCL_ERROR;
- goto done;
+ genData.count = 0;
+ genData.field = genData.staticField;
}
/*
@@ -1747,7 +1757,7 @@ QE_ConfigureCmd(QE_BindingTable bindingTable, int objOffset, int objc,
qeinstall detail <Setting> show_icons 500 QEExpandCmd_Setting
-proc QEExpandCmd_Setting {char object event detail} {
+proc QEExpandCmd_Setting {char object event detail charMap} {
switch -- $char {
c {
@@ -1791,6 +1801,7 @@ static void Percents_Install(QE_ExpandArgs *args)
Tcl_DStringAppend(&command, dPtr->name, -1);
else
Tcl_DStringAppend(&command, "{}", -1);
+ Tcl_DStringStartSublist(&command);
if ((eiPtr->expandProc == Percents_Generate) ||
((dPtr != NULL) && (dPtr->expandProc == Percents_Generate)))
{
@@ -1799,12 +1810,14 @@ static void Percents_Install(QE_ExpandArgs *args)
for (i = 0; i < genData->count; i++)
{
GenerateField *genField = &genData->field[i];
- Tcl_DStringAppend(&command, " ", 1);
- Tcl_DStringAppend(&command, &genField->which, 1);
- Tcl_DStringAppend(&command, " ", 1);
- Tcl_DStringAppend(&command, genField->string, -1);
+ char string[2];
+ string[0] = genField->which;
+ string[1] = '\0';
+ Tcl_DStringAppendElement(&command, string);
+ Tcl_DStringAppendElement(&command, genField->string);
}
}
+ Tcl_DStringEndSublist(&command);
Tcl_SaveResult(interp, &state);
if (Tcl_EvalEx(interp, Tcl_DStringValue(&command),
Tcl_DStringLength(&command), TCL_EVAL_GLOBAL) == TCL_OK)