1 /*
2  * Author:      William Chia-Wei Cheng (bill.cheng@acm.org)
3  *
4  * Copyright (C) 2001-2009, William Chia-Wei Cheng.
5  *
6  * This file may be distributed under the terms of the Q Public License
7  * as defined by Trolltech AS of Norway and appearing in the file
8  * LICENSE.QPL included in the packaging of this file.
9  *
10  * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING
11  * THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
12  * PURPOSE.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL,
13  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
14  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
15  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
16  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  * @(#)$Header: /mm2/home/cvs/bc-src/tgif/shortcut.c,v 1.47 2011/06/09 16:11:42 cvsps Exp $
19  */
20 
21 #define _INCLUDE_FROM_SHORTCUT_C_
22 
23 #include "tgifdefs.h"
24 #include "cmdids.h"
25 
26 #include "choice.e"
27 #include "msg.e"
28 #include "setup.e"
29 #include "shortcut.e"
30 #include "strtbl.e"
31 #include "tangram2.e"
32 #include "util.e"
33 
34 /*
35  * Note:  the num_args field in shortCutXlateTbl is used by the shortcut
36  *        mechanism.  This includes the call_one_arg_shortcut() internal
37  *        command.
38  */
39 /* do not translate -- program constants */
40 static struct ShortCutRec shortCutXlateTbl[] = {
41 /* Control Keys */
42    { 'a', CNTRL_ONLY, "SelectAll()", 0, CMDID_SELECTALL },
43    { 'b', CNTRL_ONLY, "Back()", 0, CMDID_BACK },
44    { 'c', CNTRL_ONLY, "CopyToCutBuffer()", 0, CMDID_COPY },
45    { 'd', CNTRL_ONLY, "Duplicate()", 0, CMDID_DUPLICATE },
46    { 'e', CNTRL_ONLY, "PushCurChoice()", 0, CMDID_PUSHCURCHOICE },
47    { 'f', CNTRL_ONLY, "Front()", 0, CMDID_FRONT },
48    { 'g', CNTRL_ONLY, "Group()", 0, CMDID_GROUP },
49    { 'i', CNTRL_ONLY, "Instantiate()", 0, CMDID_INSTANTIATE },
50    { 'k', CNTRL_ONLY, "Pop()", 0, CMDID_POP },
51    { 'l', CNTRL_ONLY, "AlignObjs()", 0, CMDID_ALIGNOBJS },
52    { 'n', CNTRL_ONLY, "New()", 0, CMDID_NEW },
53    { 'o', CNTRL_ONLY, "Open()", 1, CMDID_OPEN },
54    { 'p', CNTRL_ONLY, "Print()", 0, CMDID_PRINT },
55    { 'q', CNTRL_ONLY, "Quit()", 0, CMDID_QUIT },
56    { 'r', CNTRL_ONLY, "Redraw()", 0, CMDID_REDRAW },
57    { 's', CNTRL_ONLY, "Save()", 0, CMDID_SAVE },
58    { 't', CNTRL_ONLY, "AlignToGrid()", 0, CMDID_ALIGNTOGRID },
59    { 'u', CNTRL_ONLY, "UnGroup()", 0, CMDID_UNGROUP },
60    { 'v', CNTRL_ONLY, "PasteFromCutBuffer()", 0, CMDID_PASTE },
61    { 'w', CNTRL_ONLY, "DrawText()", 0, CMDID_DRAWTEXT },
62    { '\0', 0, "Delete()", 0, CMDID_DELETE },
63    { 'y', CNTRL_ONLY, "Redo()", 0, CMDID_REDO },
64    { 'z', CNTRL_ONLY, "Undo()", 0, CMDID_UNDO },
65    { ',', CNTRL_ONLY, "ScrollLeft()", 0, CMDID_SCROLLLEFT },
66    { '.', CNTRL_ONLY, "ScrollRight()", 0, CMDID_SCROLLRIGHT },
67    { '-', CNTRL_ONLY, "PrintWithCmd()", 0, CMDID_PRINTWITHCMD },
68    { '1', CNTRL_ONLY, "ScreenCapture()", 0, CMDID_SCREENCAPTURE },
69    { '2', CNTRL_ONLY, "FullScreenCapture()", 0, CMDID_FULLSCREENCAPTURE },
70 /* Meta Keys */
71    { 'a', META_ONLY,  "AttachAttrs()", 0, CMDID_ATTACHATTRS },
72    { 'b', META_ONLY,  "Probe()", 0, CMDID_PROBE },
73    { 'c', META_ONLY,  "RotateCounter()", 0, CMDID_ROTATECOUNTER },
74    { 'd', META_ONLY,  "-Grid()", 0, CMDID_DECGRID },
75    { 'e', META_ONLY,  "AnimateSend()", 0, CMDID_ANIMATESEND },
76    { 'f', META_ONLY,  "AnimateFlash()", 0, CMDID_ANIMATEFLASH },
77    { 'g', META_ONLY,  "ToggleGrid()", 0, CMDID_TOGGLEGRID },
78    { 'h', META_ONLY,  "FlipHorizontal()", 0, CMDID_FLIPHORIZONTAL },
79    { 'i', META_ONLY,  "+Grid()", 0, CMDID_INCGRID },
80    { 'j', META_ONLY,  "HideAttrName()", 0, CMDID_HIDEATTRNAME },
81    { 'k', META_ONLY,  "SelectMode()", 0, CMDID_SELECTMODE },
82    { 'l', META_ONLY,  "DistributeObjs()", 0, CMDID_DISTRIBUTEOBJS },
83    { 'm', META_ONLY,  "Move/JustfyAttr()", 0, CMDID_MOVEJUSTIFYATTR },
84    { 'n', META_ONLY,  "ShowAttrName()", 0, CMDID_SHOWATTRNAME },
85    { 'o', META_ONLY,  "ZoomOut()", 0, CMDID_ZOOMOUT },
86    { 'p', META_ONLY,  "Import()", 0, CMDID_IMPORT },
87    { 'q', META_ONLY,  "DrawPoly()", 0, CMDID_DRAWPOLY },
88    { 'r', META_ONLY,  "DrawBox()", 0, CMDID_DRAWBOX },
89    { 's', META_ONLY,  "Solve()", 0, CMDID_SOLVE },
90    { 't', META_ONLY,  "DetachAttrs()", 0, CMDID_DETACHATTRS },
91    { 'u', META_ONLY,  "Animate()", 0, CMDID_ANIMATE },
92    { 'v', META_ONLY,  "FlipVertical()", 0, CMDID_FLIPVERTICAL },
93    { 'w', META_ONLY,  "RotateClockWise()", 0, CMDID_ROTATECLOCKWISE },
94    { 'x', META_ONLY,  "Escape()", 0, CMDID_ESCAPE },
95    { 'y', META_ONLY,  "Simulate()", 0, CMDID_SIMULATE },
96    { 'z', META_ONLY,  "ZoomIn()", 0, CMDID_ZOOMIN },
97    { '9', META_ONLY,  "SpecifyAnArc()", 0, CMDID_SPECIFYANARC },
98    { '0', META_ONLY,  "Update()", 0, CMDID_UPDATE },
99    { ',', META_ONLY,  "ScrollUp()", 0, CMDID_SCROLLUP },
100    { '.', META_ONLY,  "ScrollDown()", 0, CMDID_SCROLLDOWN },
101    { '-', META_ONLY,  "ShowAttr()", 0, CMDID_SHOWATTR },
102    { '{', META_ONLY,  "AlignObjsTop()", 0, CMDID_ALIGNOBJSTOP },
103    { '+', META_ONLY,  "AlignObjsMiddle()", 0, CMDID_ALIGNOBJSMIDDLE },
104    { '}', META_ONLY,  "AlignObjsBottom()", 0, CMDID_ALIGNOBJSBOTTOM },
105    { '[', META_ONLY,  "AlignObjsLeft()", 0, CMDID_ALIGNOBJSLEFT },
106    { '=', META_ONLY,  "AlignObjsCenter()", 0, CMDID_ALIGNOBJSCENTER },
107    { ']', META_ONLY,  "AlignObjsRight()", 0, CMDID_ALIGNOBJSRIGHT },
108    { '"', META_ONLY,  "MakeRegPolygon()", 0, CMDID_MAKEREGPOLYGON },
109    { '%', META_ONLY,  "SetReduction()", 0, CMDID_SETREDUCTION },
110    { ':', META_ONLY,  "DefaultZoom()", 0, CMDID_DEFAULTZOOM },
111    { '`', META_ONLY,  "ZoomWayOut()", 0, CMDID_ZOOMWAYOUT },
112    { '~', META_ONLY,  "SaveSelectedAs()", 0, CMDID_SAVESELECTEDAS },
113    { ';', META_ONLY,  "CutBit/Pixmap()", 0, CMDID_CUTBITPIXMAP },
114    { '_', META_ONLY,  "AbutHorizontal()", 0, CMDID_ABUTHORIZONTAL },
115    { '|', META_ONLY,  "AbutVertical()", 0, CMDID_ABUTVERTICAL },
116    { '#', META_ONLY,  "BreakUpText()", 1, CMDID_BREAKUPTEXT },
117    { '^', META_ONLY,  "ScrollToOrig()", 0, CMDID_SCROLLTOORIG },
118    { '@', META_ONLY,  "ToggleMoveMode()", 0, CMDID_TOGGLEMOVEMODE },
119    { '$', META_ONLY,  "SelectVertexMode()", 0, CMDID_SELECTVERTEXMODE },
120    { '&', META_ONLY,  "AlignToPage()", 0, CMDID_ALIGNTOPAGE },
121    { '*', META_ONLY,  "ChangeDomain()", 0, CMDID_CHANGEDOMAIN },
122    { '(', META_ONLY,  "ImportEPSFile()", 1, CMDID_IMPORTEPSFILE },
123    { ')', META_ONLY,  "PreciseScale()", 0, CMDID_PRECISESCALE },
124    { '<', META_ONLY,  "Lock()", 0, CMDID_LOCK },
125    { '>', META_ONLY,  "UnLock()", 0, CMDID_UNLOCK },
126 /* Control Meta Keys */
127    { 'a', CNTRL_META, "AddPoint()", 0, CMDID_ADDPOINT },
128    { 'b', CNTRL_META, "Bold()", 0, CMDID_BOLD },
129    { 'c', CNTRL_META, "Center()", 0, CMDID_CENTER },
130    { 'd', CNTRL_META, "DeletePoint()", 0, CMDID_DELETEPOINT },
131    { 'e', CNTRL_META, "DrawRCBox()", 0, CMDID_DRAWRCBOX },
132    { 'f', CNTRL_META, "InvertXBitmap()", 0, CMDID_INVERTXBITMAP },
133    { 'g', CNTRL_META, "ToggleSnap()", 0, CMDID_TOGGLESNAP },
134    { 'h', CNTRL_META, "HideAttr()", 0, CMDID_HIDEATTR },
135    { 'i', CNTRL_META, "MakeIconic()", 0, CMDID_MAKEICONIC },
136    { 'j', CNTRL_META, "UnMakeIconic()", 0, CMDID_UNMAKEICONIC },
137    { 'k', CNTRL_META, "ToggleBW/ColorPS()", 0, CMDID_TOGGLEBWCOLORPS },
138    { 'l', CNTRL_META, "Left()", 0, CMDID_LEFT },
139    { 'm', CNTRL_META, "MakeSymbolic()", 0, CMDID_MAKESYMBOLIC },
140    { 'n', CNTRL_META, "UnMakeSymbolic()", 0, CMDID_UNMAKESYMBOLIC },
141    { 'o', CNTRL_META, "Roman()", 0, CMDID_ROMAN },
142    { 'p', CNTRL_META, "BoldItalic()", 0, CMDID_BOLDITALIC },
143    { 'q', CNTRL_META, "DrawPolygon()", 0, CMDID_DRAWPOLYGON },
144    { 'r', CNTRL_META, "Right()", 0, CMDID_RIGHT },
145    { 's', CNTRL_META, "SaveNew()", 1, CMDID_SAVENEW },
146    { 't', CNTRL_META, "Italic()", 0, CMDID_ITALIC },
147    { 'u', CNTRL_META, "UpdateSymbols()", 0, CMDID_UPDATESYMBOLS },
148    { 'v', CNTRL_META, "DrawOval()", 0, CMDID_DRAWOVAL },
149    { 'w', CNTRL_META, "ToggleLineType()", 0, CMDID_TOGGLELINETYPE },
150    { 'x', CNTRL_META, "CyclePrintFormat()", 0, CMDID_CYCLEPRINFORMAT },
151    { 'y', CNTRL_META, "Push()", 0, CMDID_PUSH },
152    { 'z', CNTRL_META, "DrawArc()", 0, CMDID_DRAWARC },
153    { '.', CNTRL_META, "ImportXBitmap()", 0, CMDID_IMPORTXBITMAP },
154    { ',', CNTRL_META, "ImportXPixmap()", 0, CMDID_IMPORTXPIXMAP },
155    { '-', CNTRL_META, "ToggleGridSystem()", 0, CMDID_TOGGLEGRIDSYSTEM },
156    { '=', CNTRL_META, "FindAgain()", 0, CMDID_FINDAGAIN },
157    { '5', CNTRL_META, "InsertRightSubscript()", 0, CMDID_INSERTRIGHTSUBSCRIPT },
158    { '6', CNTRL_META, "InsertRightSuperscript()", 0,
159                       CMDID_INSERTRIGHTSUPERSCRIPT },
160    { '7', CNTRL_META, "ToggleEqAttrShown()", 0, CMDID_TOGGLEEQATTRSHOWN },
161    { '8', CNTRL_META, "ToggleSlideShow()", 0, CMDID_TOGGLESLIDESHOW },
162    { '9', CNTRL_META, "FindNoCase()", 0, CMDID_FINDNOCASE },
163    { '0', CNTRL_META, "FindCaseSensitive()", 0, CMDID_FINDCASESENSITIVE },
164 /* Miscellaneous */
165    { '\0', 0, "DrawCornerOval()", 0, CMDID_DRAWCORNEROVAL },
166    { '\0', 0, "DrawCenterOval()", 0, CMDID_DRAWCENTEROVAL },
167    { '\0', 0, "DrawEdgeOval()", 0, CMDID_DRAWEDGEOVAL },
168    { '\0', 0, "DrawEdgeArc()", 0, CMDID_DRAWEDGEARC },
169    { '\0', 0, "ScrollPageUp()", 0, CMDID_SCROLLPAGEUP },
170    { '\0', 0, "ScrollPageDown()", 0, CMDID_SCROLLPAGEDOWN },
171    { '\0', 0, "ScrollPageLeft()", 0, CMDID_SCROLLPAGELEFT },
172    { '\0', 0, "ScrollPageRight()", 0, CMDID_SCROLLPAGERIGHT },
173    { '\0', 0, "FlushUndoBuffer()", 0, CMDID_FLUSHUNDOBUFFER },
174    { '\0', 0, "PrintMsgBuffer()", 0, CMDID_PRINTMSGBUFFER },
175    { '\0', 0, "SaveOrigin()", 0, CMDID_SAVEORIGIN },
176    { '\0', 0, "RestoreImageWH()", 0, CMDID_RESTOREIMAGEWH },
177    { '\0', 0, "UpdateEPS()", 0, CMDID_UPDATEEPS },
178    { '\0', 0, "ToggleMapShown()", 0, CMDID_TOGGLEMAPSHOWN },
179    { '\0', 0, "ToggleUseGrayScale()", 0, CMDID_TOGGLEUSEGRAYSCALE },
180    { '\0', 0, "FreeHandMode()", 0, CMDID_FREEHANDMODE },
181    { '\0', 0, "SaveSymInLibrary()", 0, CMDID_SAVESYMINLIBRARY },
182    { '\0', 0, "CenterAnEndPoint()", 0, CMDID_CENTERANENDPOINT },
183    { '\0', 0, "CenterAVertex()", 0, CMDID_CENTERAVERTEX },
184    { '\0', 0, "NextPage()", 0, CMDID_NEXTPAGE },
185    { '\0', 0, "PrevPage()", 0, CMDID_PREVPAGE },
186    { '\0', 0, "NamePages()", 0, CMDID_NAMEPAGES },
187    { '\0', 0, "GotoPage()", 1, CMDID_GOTOPAGE },
188    { '\0', 0, "AddPageBefore()", 0, CMDID_ADDPAGEBEFORE },
189    { '\0', 0, "AddPageAfter()", 0, CMDID_ADDPAGEAFTER },
190    { '\0', 0, "DeleteCurPage()", 0, CMDID_DELETECURPAGE },
191    { '\0', 0, "TogglePageLineShown()", 0, CMDID_TOGGLEPAGELINESHOWN },
192    { '\0', 0, "SpecifyDrawingSize()", 0, CMDID_SPECIFYDRAWINGSIZE },
193    { '\0', 0, "PrintOnePage()", 0, CMDID_PRINTONEPAGE },
194    { '\0', 0, "ToggleNamedAttrShown()", 1, INVALID },
195    { '\0', 0, "AttachFileAttrs()", 0, CMDID_ATTACHFILEATTRS },
196    { '\0', 0, "DetachFileAttrs()", 0, CMDID_DETACHFILEATTRS },
197    { '\0', 0, "EditFileAttrs()", 0, CMDID_EDITFILEATTRS },
198    { '\0', 0, "PrintSelectedObjs()", 0, CMDID_PRINTSELECTEDOBJS },
199    { '\0', 0, "InputPolyPts()", 0, CMDID_INPUTPOLYPTS },
200    { '\0', 0, "InputPolygonPts()", 0, CMDID_INPUTPOLYGONPTS },
201    { '\0', 0, "EditAttrs()", 0, CMDID_EDITATTRS },
202    { '\0', 0, "ConvertIntSpline()", 0, CMDID_CONVERTINTSPLINE },
203    { '\0', 0, "PasteFromFile()", 0, CMDID_PASTEFROMFILE },
204    { '\0', 0, "ToggleShowMeasurement()", 0, CMDID_TOGGLESHOWMEASUREMENT },
205    { '\0', 0, "SetMeasureUnit()", 0, CMDID_SETMEASUREUNIT },
206    { '\0', 0, "Cut()", 0, CMDID_CUT },
207    { '\0', 0, "ToggleSmoothHinge()", 0, CMDID_TOGGLESMOOTHHINGE },
208    { '\0', 0, "ToggleShowMenubar()", 0, CMDID_TOGGLESHOWMENUBAR },
209    { '\0', 0, "ToggleShowStatus()", 0, CMDID_TOGGLESHOWSTATUS },
210    { '\0', 0, "BrowseXBitmap()", 0, CMDID_BROWSEXBITMAP },
211    { '\0', 0, "BrowseXPixmap()", 0, CMDID_BROWSEXPIXMAP },
212    { '\0', 0, "SpecifyPaperSize()", 0, CMDID_SPECIFYPAPERSIZE },
213    { '\0', 0, "ToggleOneMotionSelMove()", 0, CMDID_TOGGLEONEMOTIONSELMOVE },
214    { '\0', 0, "GoBack()", 0, CMDID_GOBACK },
215    { '\0', 0, "GoForward()", 0, CMDID_GOFORWARD },
216    { '\0', 0, "RefreshCurrent()", 0, CMDID_REFRESHCURRENT },
217    { '\0', 0, "HotList()", 0, CMDID_HOTLIST },
218    { '\0', 0, "AddCurrentToHotList()", 0, CMDID_ADDCURRENTTOHOTLIST },
219    { '\0', 0, "SessionHistory()", 0, CMDID_SESSIONHISTORY },
220    { '\0', 0, "ToggleHyperSpace()", 0, CMDID_TOGGLEHYPERSPACE },
221    { '\0', 0, "EmbedEPSFile()", 0, CMDID_EMBEDEPSFILE },
222    { '\0', 0, "SetSelLineWidth()", 0, CMDID_SETSELLINEWIDTH },
223    { '\0', 0, "AddColor()", 0, CMDID_ADDCOLOR },
224    { '\0', 0, "ImportAttrs()", 0, CMDID_IMPORTATTRS },
225    { '\0', 0, "ExportAttrs()", 0, CMDID_EXPORTATTRS },
226    { '\0', 0, "MergeWithTable()", 0, CMDID_MERGEWITHTABLE },
227    { '\0', 0, "ExportToTable()", 0, CMDID_EXPORTTOTABLE },
228    { '\0', 0, "DeletePages()", 0, CMDID_DELETEPAGES },
229    { '\0', 0, "PrintOneFilePerPage()", 0, CMDID_PRINTONEFILEPERPAGE },
230    { '\0', 0, "ImportGIFFile()", 0, CMDID_IMPORTGIFFILE },
231    { '\0', 0, "SetExportPixelTrim()", 0, CMDID_SETEXPORTPIXELTRIM },
232    { '\0', 0, "ToggleColorLayers()", 0, CMDID_TOGGLECOLORLAYERS },
233    { '\0', 0, "ToggleStretchableText()", 0, CMDID_TOGGLESTRETCHABLETEXT },
234    { '\0', 0, "BreakUpBit/Pixmap()", 0, CMDID_BREAKUPBITPIXMAP },
235    { '\0', 0, "LayoutOnArc()", 0, CMDID_LAYOUTONARC },
236    { '\0', 0, "PreciseRotate()", 0, CMDID_PRECISEROTATE },
237    { '\0', 0, "JoinPoly()", 0, CMDID_JOINPOLY },
238    { '\0', 0, "CutPoly()", 0, CMDID_CUTPOLY },
239    { '\0', 0, "GetBoundingBox()", 0, CMDID_GETBOUNDINGBOX },
240    { '\0', 0, "SetTemplate()", 0, CMDID_SETTEMPLATE },
241    { '\0', 0, "MakeGray()", 0, CMDID_MAKEGRAY },
242    { '\0', 0, "InvertColor()", 0, CMDID_INVERTCOLOR },
243    { '\0', 0, "InterpolateColor()", 0, CMDID_INTERPOLATECOLOR },
244    { '\0', 0, "BrightenDarken()", 0, CMDID_BRIGHTENDARKEN },
245    { '\0', 0, "ChangeSaturation()", 0, CMDID_CHANGESATURATION },
246    { '\0', 0, "ChangeHue()", 0, CMDID_CHANGEHUE },
247    { '\0', 0, "ContrastEnhance()", 0, CMDID_CONTRASTENHANCE },
248    { '\0', 0, "ColorBalance()", 0, CMDID_COLORBALANCE },
249    { '\0', 0, "Gamma()", 0, CMDID_GAMMA },
250    { '\0', 0, "EdgeDetect()", 0, CMDID_EDGEDETECT },
251    { '\0', 0, "Emboss()", 0, CMDID_EMBOSS },
252    { '\0', 0, "ReduceColors()", 0, CMDID_REDUCECOLORS },
253    { '\0', 0, "ReduceToPixmapColors()", 0, CMDID_REDUCETOPIXMAPCOLORS },
254    { '\0', 0, "SetDefaultColorLevels()", 0, CMDID_SETDEFAULTCOLORLEVELS },
255    { '\0', 0, "ReduceToDefaultColors()", 0, CMDID_REDUCETODEFAULTCOLORs },
256    { '\0', 0, "DefaultErrorDiffuse()", 0, CMDID_DEFAULTERRORDIFFUSE },
257    { '\0', 0, "Spread()", 0, CMDID_SPREAD },
258    { '\0', 0, "Sharpen()", 0, CMDID_SHARPEN },
259    { '\0', 0, "Blur3()", 0, CMDID_BLUR3 },
260    { '\0', 0, "Blur5()", 0, CMDID_BLUR5 },
261    { '\0', 0, "Blur7()", 0, CMDID_BLUR7 },
262    { '\0', 0, "RunBggen()", 0, CMDID_RUNBGGEN },
263    { '\0', 0, "CircularBggen()", 0, CMDID_CIRCULARBGGEN },
264    { '\0', 0, "SimpleRectBggen()", 0, CMDID_SIMPLERECTBGGEN },
265    { '\0', 0, "RegenerateImage()", 0, CMDID_REGENERATEIMAGE },
266    { '\0', 0, "CropImage()", 0, CMDID_CROPIMAGE },
267    { '\0', 0, "GetColor()", 0, CMDID_GETCOLOR },
268    { '\0', 0, "ReplaceColor()", 0, CMDID_REPLACECOLOR },
269    { '\0', 0, "FloodFill()", 0, CMDID_FLOODFILL },
270    { '\0', 0, "CreateContour()", 0, CMDID_CREATECONTOUR },
271    { '\0', 0, "Subtract()", 0, CMDID_SUBTRACT },
272    { '\0', 0, "AlphaCombine()", 0, CMDID_ALPHACOMBINE },
273    { '\0', 0, "XorColors()", 0, CMDID_XORCOLORS },
274    { '\0', 0, "ImportOtherFile()", 0, CMDID_IMPORTOTHERFILE },
275    { '\0', 0, "ImportOtherFileType()", 1, INVALID },
276    { '\0', 0, "BrowseOther()", 0, CMDID_BROWSEOTHER },
277    { '\0', 0, "BrowseOtherType()", 1, INVALID },
278    { '\0', 0, "ToggleShowCrossHair()", 0, CMDID_TOGGLESHOWCROSSHAIR },
279    { '\0', 0, "SetShapeShadow()", 0, CMDID_SETSHAPESHADOW },
280    { '\0', 0, "NoTransform()", 0, CMDID_NOTRANSFORM },
281    { '\0', 0, "About()", 0, CMDID_ABOUT },
282    { '\0', 0, "Copyright()", 0, CMDID_COPYRIGHT },
283    { '\0', 0, "SetSelFontSize()", 0, CMDID_SETSELFONTSIZE },
284    { '\0', 0, "ZoomInAtCursor()", 0, CMDID_ZOOMINATCURSOR },
285    { '\0', 0, "CenterAtCursor()", 0, CMDID_CENTERATCURSOR },
286    { '\0', 0, "SetEditTextSize()", 0, CMDID_SETEDITTEXTSIZE },
287    { '\0', 0, "SetTextRotation()", 0, CMDID_SETTEXTROTATION },
288    { '\0', 0, "SetRotationIncrement()", 0, CMDID_SETROTATIONINCREMENT },
289    { '\0', 0, "CurrentVersionInfo()", 0, CMDID_CURRENTVERSIONINFO },
290    { '\0', 0, "LatestReleaseInfo()", 0, CMDID_LATESTRELEASEINFO },
291    { '\0', 0, "VectorWarp()", 0, CMDID_VECTORWARP },
292    { '\0', 0, "ConnectPins()", 0, CMDID_CONNECTPINS },
293    { '\0', 0, "PasteCompoundText()", 0, CMDID_PASTECOMPOUNDTEXT },
294    { '\0', 0, "CopyProperties()", 0, CMDID_COPYPROPERTIES },
295    { '\0', 0, "SaveProperties()", 0, CMDID_SAVEPROPERTIES },
296    { '\0', 0, "PasteProperties()", 0, CMDID_PASTEPROPERTIES },
297    { '\0', 0, "RestoreProperties()", 0, CMDID_RESTOREPROPERTIES },
298    { '\0', 0, "RotateShearMode()", 0, CMDID_ROTATESHEARMODE },
299    { '\0', 0, "ChangeAllSelFill()", 0, CMDID_CHANGEALLSELFILL },
300    { '\0', 0, "ChangeAllSelPen()", 0, CMDID_CHANGEALLSELPEN },
301    { '\0', 0, "ChangeAllSelLineWidth()", 0, CMDID_CHANGEALLSELLINEWIDTH },
302    { '\0', 0, "ChangeAllSelLineStyle()", 0, CMDID_CHANGEALLSELLINESTYLE },
303    { '\0', 0, "ChangeAllSelLineType()", 0, CMDID_CHANGEALLSELLINETYPE },
304    { '\0', 0, "ChangeAllSelLineDash()", 0, CMDID_CHANGEALLSELLINEDASH },
305    { '\0', 0, "ChangeAllSelFont()", 0, CMDID_CHANGEALLSELFONT },
306    { '\0', 0, "ChangeAllSelFontSize()", 0, CMDID_CHANGEALLSELFONTSIZE },
307    { '\0', 0, "ChangeAllSelFontStyle()", 0, CMDID_CHANGEALLSELFONTSTYLE },
308    { '\0', 0, "ChangeAllSelFontJust()", 0, CMDID_CHANGEALLSELFONTJUST },
309    { '\0', 0, "ChangeAllSelColor()", 0, CMDID_CHANGEALLSELCOLOR },
310    { '\0', 0, "LanscapeMode()", 0, CMDID_LANDSCAPEMODE },
311    { '\0', 0, "PortraitMode()", 0, CMDID_PORTRAITMODE },
312    { '\0', 0, "SetWhereToPrint()", 0, CMDID_SETWHERETOPRINT },
313    { '\0', 0, "SetHoriAlign()", 0, CMDID_SETHORIZONTALALIGN },
314    { '\0', 0, "SetVertAlign()", 0, CMDID_SETVERTICALALIGN },
315    { '\0', 0, "SetMoveMode()", 0, CMDID_SETMOVEMODE },
316    { '\0', 0, "SetStretchTextMode()", 0, CMDID_SETSTRETCHTEXTMODE },
317    { '\0', 0, "CreateShape()", 0, CMDID_CREATESHAPE },
318    { '\0', 0, "SetPageLayoutMode()", 0, CMDID_SETPAGELAYOUTMODE },
319    { '\0', 0, "SetTransPatMode()", 0, CMDID_SETTRANSPATMODE },
320    { '\0', 0, "ToggleShowMode()", 0, CMDID_TOGGLESHOWMODE },
321    { '\0', 0, "SetSlideShowBorderColor()", 0, CMDID_SETSLIDESHOWBRDRCOLOR },
322    { '\0', 0, "SetSlideShowWindowOffsets()", 0, CMDID_SETSLIDESHOWWINOFFSETS },
323    { '\0', 0, "ExportXPixmapDeckToGIF()", 0, CMDID_EXPORTXPMDECKTOGIF },
324    { '\0', 0, "ImportGIFToXPixmapDeck()", 0, CMDID_IMPORTGIFTOXPMDECK },
325    { '\0', 0, "InsertThinSpace()", 0, CMDID_INSERTTHINSPACE },
326    { '\0', 0, "InsertVerticalOffset()", 0, CMDID_INSERTVERTICALOFFSET },
327    { '\0', 0, "RemoveVerticalOffset()", 0, CMDID_REMOVEVERTICALOFFSET },
328    { '\0', 0, "InsertLeftSuperscript()", 0, CMDID_INSERTLEFTSUPERSCRIPT },
329    { '\0', 0, "InsertLeftSubscript()", 0, CMDID_INSERTLEFTSUBSCRIPT },
330    { '\0', 0, "InsertCenterSuperscript()", 0, CMDID_INSERTCENTERSUPERSCRIPT },
331    { '\0', 0, "InsertCenterSubscript()", 0, CMDID_INSERTCENTERSUBSCRIPT },
332    { '\0', 0, "SetScriptFraction()", 0, CMDID_SETSCRIPTFRACTION },
333    { '\0', 0, "FakeUserAgent()", 1, CMDID_FAKEUSERAGENT },
334    { '\0', 0, "FakeReferer()", 1, CMDID_FAKEREFERER },
335    { '\0', 0, "ToggleKeepAlive()", 0, CMDID_TOGGLEKEEPALIVE },
336    { '\0', 0, "SizeToWidest()", 0, CMDID_SIZETOWIDEST },
337    { '\0', 0, "SizeToNarrowest()", 0, CMDID_SIZETONARROWEST },
338    { '\0', 0, "SizeToTallest()", 0, CMDID_SIZETOTALLEST },
339    { '\0', 0, "SizeToShortest()", 0, CMDID_SIZETOSHORTEST },
340    { '\0', 0, "SizeToGivenWidthHeight()", 0, CMDID_SIZETOGIVENWIDTHHEIGHT },
341    { '\0', 0, "SizeToGivenWidth()", 0, CMDID_SIZETOGIVENWIDTH },
342    { '\0', 0, "SizeToGivenHeight()", 0, CMDID_SIZETOGIVENHEIGHT },
343    { '\0', 0, "ExecCmdsFromFile()", 1, CMDID_EXECCMDSFROMFILE },
344    { '\0', 0, "StartExecCmdsFromFile()", 0, CMDID_STARTEXECCMDSFROMFILE },
345    { '\0', 0, "CopyPlainTextAsObject()", 0, CMDID_COPYPLAINTEXTASOBJECT },
346    { '\0', 0, "SetTextFillPatternColor()", 0, CMDID_SETTEXTFILLPATTERNCOLOR },
347    { '\0', 0, "AlignDirect()", 0, CMDID_ALIGNDIRECT },
348    { '\0', 0, "DistributeDirect()", 0, CMDID_DISTRIBUTEDIRECT },
349    { '\0', 0, "ToggleVisibleGridInSlideShow()",0,CMDID_VISIBLEGRIDINSLIDESHOW },
350    { '\0', 0, "ChangeScrollMode()", 0, CMDID_CHANGESCROLLMODE },
351    { '\0', 0, "SetAltEditTextBgColor()", 0, CMDID_SETALTEDITTEXTBGCOLOR },
352    { '\0', 0, "SetAltEditTextHighlightColor()", 0,
353                CMDID_SETALTEDITTEXTHIGHLIGHTCOLOR },
354    { '\0', 0, "ToggleAltEditTextBgColor()", 0, CMDID_TOGGLEALTEDITTEXTBGCOLOR },
355    { '\0', 0, "ChangeAllSelFontUnderline()",0,CMDID_CHANGEALLSELFONTUNDERLINE },
356    { '\0', 0, "ChangeAllSelFontOverline()",0,CMDID_CHANGEALLSELFONTOVERLINE },
357    { '\0', 0, "EditPageFileNames()", 0, CMDID_EDITPAGEFILENAMES },
358    { '\0', 0, "ExportHalfToneBitmap()", 0, CMDID_EXPORTHALFTONEBITMAP },
359    { '\0', 0, "ExportThresholdBitmap()", 0, CMDID_EXPORTTHRESHOLDBITMAP },
360    { '\0', 0, "SetExportBitmapThreshold()", 1, CMDID_SETEXPORTBITMAPTHRESHOLD },
361    { '\0', 0, "PreciseScaleEverything()", 0, CMDID_PRECISESCALEEVERYTHING },
362    { '\0', 0, "SetPaperColor()", 0, CMDID_SETPAPERCOLOR },
363    { '\0', 0, "DelayedFullScreenCapture()", 0, CMDID_DELAYEDFULLSCREENCAPTURE },
364    { '\0', 0, "ToggleHideDuringCapture()", 0, CMDID_TOGGLEHIDEDURINGCAPTURE },
365    { '\0', 0, "EditDomainPaths()", 0, CMDID_EDITDOMAINPATHS },
366    { '\0', 0, "SelectDefaultDomain()", 0, CMDID_SELECTDEFAULTDOMAIN },
367    { '\0', 0, "AddADomain()", 0, CMDID_ADDADOMAIN },
368    { '\0', 0, "DeleteADomain()", 0, CMDID_DELETEADOMAIN },
369    { '\0', 0, "ReloadDomainInfoFromX()", 0, CMDID_RELOADDOMAININFOFROMX },
370    { '\0', 0, "ImportPNGFile()", 0, CMDID_IMPORTPNGFILE },
371    { '\0', 0, "EditIndexedAttrInEditor()", 0, CMDID_EDITATTRINEDITOR },
372    { '\0', 0, "GetProperty()", 0, CMDID_GETPROPERTY },
373    { '\0', 0, "PeekDimension()", 0, CMDID_PEEKDIMENSION },
374    { '\0', 0, "SetHtmlExportTemplate()", 0, CMDID_SETHTMLEXPORTTEMPLATE },
375    { '\0', 0, "PrintPages()", 0, CMDID_PRINTPAGES },
376    { '\0', 0, "GoHyperSpaceInSlideShow()",0, CMDID_GOHYPERSPACEINSLIDESHOW },
377    { '\0', 0, "FreehandModeInSlideShow()",0, CMDID_FREEHANDMODEINSLIDESHOW },
378    { '\0', 0, "OpenARecentlyUsedFile()", 0, CMDID_RECENTLYUSEDFILES },
379    { '\0', 0, "MoveEditTextBox()", 0, CMDID_MOVEEDITTEXTBOX },
380    { '\0', 0, "ReplaceGraphic()", 0, CMDID_REPLACEGRAPHIC },
381    { '\0', 0, "ToggleShowMeasurementInTooltip()", 0,
382                CMDID_TOGGLESHOWMEASUREMENTINTT },
383    { '\0', 0, "ImportJPEGFile()", 0, CMDID_IMPORTJPEGFILE },
384    { '\0', 0, "ToggleAutoEPSPreviewBitmap()", 0,
385                CMDID_TOGGLEAUTOEPSPREVIEWBITMAP },
386    { '\0', 0, "CreateThumbnails()", 0, CMDID_CREATETHUMBNAILS },
387    { '\0', 0, "ConnectTwoPortsByAWire()", 0, CMDID_CONNECT2PORTSBYWIRE },
388    { '\0', 0, "RenameSignalNameForAPort()", 0, CMDID_RENAMESIGNAMEFORAPORT },
389    { '\0', 0, "ClearSignalNameForAPort()", 0, CMDID_CLEARSIGNAMEFORAPORT },
390    { '\0', 0, "ToggleShowWireSignalName()", 0, CMDID_TOGGLESHOWWIRESIGNALNAME },
391    { '\0', 0, "ToggleShowChoicebar()", 0, CMDID_TOGGLESHOWCHOICEBAR },
392    { '\0', 0, "MergePortsWithAnObject()", 0, CMDID_MERGEPORTSWITHANOBJECT },
393    { '\0', 0, "RenumberObjectIds()", 0, CMDID_RENUMBER_OBJECT_IDS },
394    { '\0', 0, "RepeatConnectTwoPortsByAWire()", 0,
395                CMDID_REPEATCONNECT2PORTSBYWIRE },
396    { '\0', 0, "ConnectPortsToBroadcastWire()", 0,
397                CMDID_CONNECTPORTSTOBROADCAST },
398    { '\0', 0, "ImportMultipageTextFile()", 0, CMDID_IMPORTMULTIPAGETEXTFILE },
399    { '\0', 0, "SetMarginsForImportMultipageTextFile()", 0,
400                CMDID_SETMARGINSONIMPORTTEXT },
401    { '\0', 0, "ToggleWordWrapDuringImportMultipageTextFile()", 0,
402                CMDID_TOGGLEWORDWRAPONIMPORTTEXT },
403    { '\0', 0, "HandleDataInMBuff()", 0, CMDID_DATA_IN_MBUFF },
404    { '\0', 0, "BenchMark()", 0, CMDID_BENCHMARK },
405 
406    { '\0', 0, "ConvertToBezier()", 0, CMDID_CONVERTTOBEZIER },
407    { '\0', 0, "SetBezierConvertNumSegs()", 1, CMDID_SETBEZIERCONVERTNUMSEGS },
408 
409    { '\0', 0, "AddSquareTickMarks()", 0, CMDID_ADDSQUARETICKMARKS },
410    { '\0', 0, "AddTriangleTickMarks()", 0, CMDID_ADDTRIANGLETICKMARKS },
411    { '\0', 0, "AddCircleTickMarks()", 0, CMDID_ADDCIRCLETICKMARKS },
412    { '\0', 0, "AddXTickMarks()", 0, CMDID_ADDXTICKMARKS },
413    { '\0', 0, "AddDiamondTickMarks()", 0, CMDID_ADDDIAMONDTICKMARKS },
414    { '\0', 0, "AddBowtieTickMarks()", 0, CMDID_ADDBOWTIETICKMARKS },
415    { '\0', 0, "AddInvTriangleTickMarks()", 0, CMDID_ADDINVTRIANGLETICKMARKS },
416    { '\0', 0, "AddPlusTickMarks()", 0, CMDID_ADDPLUSTICKMARKS },
417    { '\0', 0, "AddHourGlassTickMarks()", 0, CMDID_ADDHOURGLASSTICKMARKS },
418    { '\0', 0, "SetTickMarkSize()", 1, CMDID_SETTICKMARKSIZE },
419    { '\0', 0, "ToggleShowChat()", 0, CMDID_TOGGLESHOWCHAT },
420    { '\0', 0, "SavePagesAs()", 0, CMDID_SAVEPAGESAS },
421    { '\0', 0, "ImportPPMFile()", 0, CMDID_IMPORTPPMFILE },
422    { '\0', 0, "AddPageBeforeCopyAll()", 0, CMDID_ADDPAGEBEFORECOPYALL },
423    { '\0', 0, "AddPageAfterCopyAll()", 0, CMDID_ADDPAGEAFTERCOPYALL },
424    { '\0', 0, "InsertHexOctalChar()", 0, CMDID_INSERTHEXOCTALCHAR },
425    { '\0', 0, "ResetInputMethod()", 0, CMDID_RESETINMETHOD },
426    { '\0', 0, "ImportPBMFile()", 0, CMDID_IMPORTPBMFILE },
427    { '\0', 0, "ImportPGMFile()", 0, CMDID_IMPORTPGMFILE },
428    { '\0', 0, "EditIndexedAttrGroupInEditor()", 0,
429                CMDID_EDITATTRGROUPINEDITOR },
430    { '\0', 0,  "LinkExtJPEGFile()", 0, CMDID_LINKEXTJPEGFILE },
431    { '\0', 0, "NextSlide()", 0, CMDID_NEXTSLIDE },
432    { '\0', 0, "PrevSlide()", 0, CMDID_PREVSLIDE },
433    { '\0', 0, "SetObjectShadowColor()", 0, CMDID_SETOBJSHADOWCOLOR },
434    { '\0', 0, "SetObjectShadowOffsets()", 0, CMDID_SETOBJSHADOWOFFSETS },
435    { '\0', 0, "AddObjectShadow()", 0, CMDID_ADDOBJSHADOW },
436    { '\0', 0, "RemoveObjectShadow()", 0, CMDID_REMOVEOBJSHADOW },
437    { '\0', 0, "CopyDoubleByteString()", 0, CMDID_COPYUTF8 },
438    { '\0', 0, "PasteDoubleByteString()", 0, CMDID_PASTEUTF8 },
439    { '\0', 0, "ReduceToMobileWebSafeColors()", 0,
440                CMDID_REDUCETOMOBILEWEBCOLORS },
441    { '\0', 0, "CreatePixmapFromSelected()", 0, CMDID_CREATEPIXMAPFROMSEL },
442    { '\0', 0, "ToggleAutoRotatePivot()", 0, CMDID_TOGGLEROTATEPIVOT },
443    { '\0', 0, "SpecifyRotatePivot()", 0, CMDID_SPECIFYROTATEPIVOT },
444    { '\0', 0, "ResetRotatePivot()", 0, CMDID_RESETROTATEPIVOT },
445    { '\0', 0, "NextPolyRotationPivot()", 0, CMDID_NEXTPOLYROTATEPIVOT },
446    { '\0', 0, "MoveRotationPivotToArcCenter()", 0,
447                CMDID_MOVEROTATEPIVOTARCCNTR },
448    { '\0', 0, "MoveRotatePivotCenter()", 0, CMDID_MOVEROTATEPIVOTCENTER },
449    { '\0', 0, "MoveRotatePivotLeftTop()", 0, CMDID_MOVEROTATEPIVOTLT },
450    { '\0', 0, "MoveRotatePivotRightTop()", 0, CMDID_MOVEROTATEPIVOTRT },
451    { '\0', 0, "MoveRotatePivotLeftBottom()", 0, CMDID_MOVEROTATEPIVOTLB },
452    { '\0', 0, "MoveRotatePivotRightBottom()", 0, CMDID_MOVEROTATEPIVOTRB },
453    { '\0', 0, "MoveRotatePivotLeft()", 0, CMDID_MOVEROTATEPIVOTLEFT },
454    { '\0', 0, "MoveRotatePivotRight()", 0, CMDID_MOVEROTATEPIVOTRIGHT },
455    { '\0', 0, "MoveRotatePivotTop()", 0, CMDID_MOVEROTATEPIVOTTOP },
456    { '\0', 0, "MoveRotatePivotBottom()", 0, CMDID_MOVEROTATEPIVOTBOTTOM },
457    { '\0', 0, "ChooseRotatePivot()", 0, CMDID_CHOOSEROTATEPIVOT },
458    { '\0', 0, "ChooseColor()", 0, CMDID_COLORWHEEL },
459    { '\0', 0, "ExtendSegment()", 0, CMDID_EXTENDSEGMENT },
460    { '\0', 0, "InsertSymbol()", 0, CMDID_INSERTSYMBOL },
461    { '\0', 0, "ToggleRightMargin()", 0, CMDID_TOGGLERIGHTMARGIN },
462    { '\0', 0, "SpecifyRightMargin()", 0, CMDID_SPECIFYRIGHTMARGIN },
463    { '\0', 0, "ToggleTighterStructuredSplines()", 0,
464                CMDID_TOGGLETIGHTERSPLINES },
465    { '\0', 0, "ToggleFloodReplaceColorThreshold()", 0,
466                CMDID_TOGGLEFLOODREPLACECOLORTHRESH },
467    { '\0', 0, "SetFloodReplaceColorThreshold()", 0,
468                CMDID_SETFLOODREPLACECOLORTHRESH },
469    { '\0', 0, "RemoveTransparentPixel()", 0, CMDID_REMOVETRANSPIXEL },
470    { '\0', 0, "ReplaceColorWithTrans()", 0, CMDID_REPLACECOLORWITHTRANS },
471    { '\0', 0, "MakeBoxObjFromBoundingBox()", 0, CMDID_NEWRECTFROMBOUNDINGBOX },
472    { '\0', 0, "MakeRCBoxObjFromBoundingBox()", 0, CMDID_NEWRCBOXFROMBOUNDINGBOX },
473    { '\0', 0, "MakeOvalObjFromBoundingBox()", 0, CMDID_NEWOVALFROMBOUNDINGBOX },
474    { '\0', 0, "", 0, 0 }
475 };
476 
477 static int maxShortCuts=0;
478 static int shortCutIndex[256];
479 static char *shortCutArgs[256];
480 
481 typedef struct tagFuncKeyShortCutInfo {
482    char code;
483    unsigned int state;
484    char *name;
485    char *arg;
486 } FuncKeyShortCutInfo;
487 
488 static FuncKeyShortCutInfo funcKeyInfo[13];
489 
490 static int shortCutCmdIdIndex[MAXCMDIDS-CMDID_BASE];
491 
492 static
FunctionKeySpec(buf,pn_code,pn_index_return)493 int FunctionKeySpec(buf, pn_code, pn_index_return)
494    char *buf;
495    int *pn_code, *pn_index_return;
496 {
497    int value=0;
498    char *colon_ptr=strchr(buf, ':');
499 
500    if (colon_ptr == NULL) return FALSE;
501    *colon_ptr = '\0';
502    if (buf[0] != 'F' || sscanf(&buf[1], "%d", &value) != 1) {
503       *colon_ptr = ':';
504       return FALSE;
505    }
506    *colon_ptr++ = ':';
507    if (value < 1 || value > 12) return FALSE;
508 
509    *pn_code = value;
510    *pn_index_return = (int)(colon_ptr-buf);
511 
512    return TRUE;
513 }
514 
InitShortCut()515 void InitShortCut()
516 {
517    int i=0, num_cmdids=MAXCMDIDS-CMDID_BASE;
518    char *c_ptr=NULL;
519 
520    for (i=0; i < 256; i++) {
521       shortCutIndex[i] = INVALID;
522       shortCutArgs[i] = NULL;
523    }
524    memset(funcKeyInfo, 0, 13*sizeof(FuncKeyShortCutInfo));
525 
526    maxShortCuts = 0;
527    if ((c_ptr=XGetDefault(mainDisplay, TOOL_NAME, "ShortCuts")) != NULL) {
528       int j=0, precise_match=0, ok=0, len=0;
529       unsigned int code=0;
530       char *saved_c_ptr=NULL, *tmp_c_ptr=NULL, *buf=NULL;
531 
532       len = strlen(c_ptr);
533       if ((buf=(char *)malloc((len+1)*sizeof(char))) == NULL) {
534          FailAllocMessage();
535          return;
536       }
537       while (*c_ptr!=':' && *c_ptr!='!' && *c_ptr!='<' && *c_ptr!='\0') c_ptr++;
538       while (*c_ptr != '\0') {
539          saved_c_ptr = c_ptr;
540          precise_match = FALSE;
541          ok = TRUE;
542          if ((*c_ptr==':' || *c_ptr=='!') && strncmp(&c_ptr[1],"<Key>",5)==0) {
543             precise_match = TRUE;
544             strcpy(buf, &c_ptr[6]);
545          } else if (strncmp(c_ptr,"<Key>",5)==0) {
546             strcpy(buf, &c_ptr[5]);
547          } else {
548             ok = FALSE;
549          }
550          if (ok) {
551             tmp_c_ptr = buf;
552             while (*tmp_c_ptr != ')' && *tmp_c_ptr != '\n' &&
553                   *tmp_c_ptr != '\0') {
554                tmp_c_ptr++;
555             }
556             if (*tmp_c_ptr == '\0') {
557                ok = FALSE;
558             } else {
559                int func_index=0;
560 
561                if (*tmp_c_ptr == '\n') {
562                   *tmp_c_ptr = '\0';
563                } else {
564                   *(++tmp_c_ptr) = '\0';
565                }
566                code = buf[0]&0xff;
567                if (buf[0] != '\0' && buf[1] == ':' &&
568                      ((code>0x20 && code<=0x7f) || (code>0xa0 && code<=0xff))) {
569                   int found=TRUE;
570                   char *paren_ptr=NULL;
571 
572                   if ((paren_ptr=strchr(&buf[2], '(')) == NULL) {
573                      fprintf(stderr,
574                            TgLoadString(STID_INVALID_SHORTCUT_ENTRY_SKIP), buf);
575                      fprintf(stderr, "\n");
576                      continue;
577                   }
578                   len = paren_ptr-(&buf[2]);
579                   for (j=0; *(shortCutXlateTbl[j].name) != '\0'; j++) {
580                      if (strncmp(shortCutXlateTbl[j].name, &buf[2], len) == 0 &&
581                            shortCutXlateTbl[j].name[len] == '(') {
582                         if (shortCutXlateTbl[j].num_args != 0) {
583                            shortCutArgs[code] = (char*)malloc(
584                                  (strlen(&buf[len+2])+1)*sizeof(char));
585                            if (shortCutArgs[code] == NULL) FailAllocMessage();
586                            strcpy(shortCutArgs[code], ++paren_ptr);
587                         }
588                         if (shortCutIndex[code] != INVALID) {
589                            fprintf(stderr,
590                                  TgLoadString(STID_DUP_SHORTCUT_ENTRY_FOR_CHAR),
591                                  code);
592                            fprintf(stderr, "\n");
593                         }
594                         shortCutIndex[code] = j;
595                         if (!precise_match) {
596                            if (*buf>='a' && *buf<='z') {
597                               code = *buf-'a'+'A';
598                               if (shortCutIndex[code] != INVALID) {
599                                  fprintf(stderr, TgLoadString(
600                                        STID_DUP_SHORTCUT_ENTRY_FOR_CHAR), code);
601                                  fprintf(stderr, "\n");
602                               }
603                               shortCutIndex[code] = j;
604                            } else if (*buf>='A' && *buf<='Z') {
605                               code = *buf-'A'+'a';
606                               if (shortCutIndex[code] != INVALID) {
607                                  fprintf(stderr, TgLoadString(
608                                        STID_DUP_SHORTCUT_ENTRY_FOR_CHAR), code);
609                                  fprintf(stderr, "\n");
610                               }
611                               shortCutIndex[code] = j;
612                            }
613                         }
614                         maxShortCuts++;
615                         break;
616                      }
617                   }
618                   if (*(shortCutXlateTbl[j].name) == '\0') {
619                      if (cmdLineTgrm2) {
620                         int num_args=0;
621                         int index=ValidTangram2CmdName(&buf[2], len, &num_args);
622 
623                         if (index != 0) {
624                            if (num_args != 0) {
625                               shortCutArgs[code] = (char*)malloc(
626                                     (strlen(&buf[len+2])+1)*sizeof(char));
627                               if (shortCutArgs[code] == NULL) {
628                                  FailAllocMessage();
629                               }
630                               strcpy(shortCutArgs[code], ++paren_ptr);
631                            }
632                            if (shortCutIndex[code] != INVALID) {
633                               fprintf(stderr, TgLoadString(
634                                     STID_DUP_SHORTCUT_ENTRY_FOR_CHAR), code);
635                               fprintf(stderr, "\n");
636                            }
637                            shortCutIndex[code] = index;
638                            if (!precise_match) {
639                               if (*buf>='a' && *buf<='z') {
640                                  code = *buf-'a'+'A';
641                                  if (shortCutIndex[code] != INVALID) {
642                                     fprintf(stderr, TgLoadString(
643                                           STID_DUP_SHORTCUT_ENTRY_FOR_CHAR),
644                                           code);
645                                     fprintf(stderr, "\n");
646                                  }
647                                  shortCutIndex[code] = index;
648                               } else if (*buf>='A' && *buf<='Z') {
649                                  code = *buf-'A'+'a';
650                                  if (shortCutIndex[code] != INVALID) {
651                                     fprintf(stderr, TgLoadString(
652                                           STID_DUP_SHORTCUT_ENTRY_FOR_CHAR),
653                                           code);
654                                     fprintf(stderr, "\n");
655                                  }
656                                  shortCutIndex[code] = index;
657                               }
658                            }
659                            maxShortCuts++;
660                         } else {
661                            found = FALSE;
662                         }
663                      } else {
664                         found = FALSE;
665                      }
666                   }
667                   if (!found) {
668                      fprintf(stderr,
669                            TgLoadString(STID_INVALID_SHORTCUT_ENTRY_SKIP), buf);
670                      fprintf(stderr, "\n");
671                   }
672                } else if (FunctionKeySpec(buf, (int*)&code, &func_index)) {
673                   int found=FALSE;
674                   char *paren_ptr=NULL;
675 
676                   if ((paren_ptr=strchr(&buf[func_index], '(')) == NULL) {
677                      fprintf(stderr,
678                            TgLoadString(STID_INVALID_SHORTCUT_ENTRY_SKIP), buf);
679                      fprintf(stderr, "\n");
680                      continue;
681                   }
682                   len = paren_ptr-(&buf[func_index]);
683                   for (j=0; *(shortCutXlateTbl[j].name) != '\0'; j++) {
684                      if (strncmp(shortCutXlateTbl[j].name, &buf[func_index],
685                            len) == 0 && shortCutXlateTbl[j].name[len] == '(') {
686                         if (funcKeyInfo[code].name != NULL) {
687                            fprintf(stderr,
688                                  TgLoadString(STID_DUP_SHORTCUT_FUNCTION_KEY),
689                                  code);
690                            fprintf(stderr, "\n");
691                         }
692                         funcKeyInfo[code].code = shortCutXlateTbl[j].code;
693                         funcKeyInfo[code].state = shortCutXlateTbl[j].state;
694                         funcKeyInfo[code].name =
695                               UtilStrDup(shortCutXlateTbl[j].name);
696                         if (funcKeyInfo[code].name == NULL) {
697                            FailAllocMessage();
698                         }
699                         if (shortCutXlateTbl[j].num_args != 0) {
700                            funcKeyInfo[code].arg = (char*)malloc(
701                                  (strlen(&buf[len+func_index])+1)*sizeof(char));
702                            if (funcKeyInfo[code].arg == NULL) {
703                               FailAllocMessage();
704                            }
705                            strcpy(funcKeyInfo[code].arg, ++paren_ptr);
706                         }
707                         found = TRUE;
708                         break;
709                      }
710                   }
711                   if (!found) {
712                      fprintf(stderr,
713                            TgLoadString(STID_INVALID_SHORTCUT_ENTRY_SKIP), buf);
714                      fprintf(stderr, "\n");
715                   }
716                } else {
717                   fprintf(stderr,
718                         TgLoadString(STID_INVALID_SHORTCUT_ENTRY_SKIP), buf);
719                   fprintf(stderr, "\n");
720                }
721             }
722          }
723          if (ok) {
724             while (*c_ptr!=')' && *c_ptr!='\0') c_ptr++;
725             while (*c_ptr!=':' && *c_ptr!='!' && *c_ptr!='<' && *c_ptr!='\0') {
726                c_ptr++;
727             }
728          } else {
729             fprintf(stderr, TgLoadString(STID_INVALID_SHORTCUT_ENTRY),
730                   saved_c_ptr);
731             fprintf(stderr, "\n");
732             break;
733          }
734       }
735       free(buf);
736    }
737    for (i=0; i < num_cmdids; i++) {
738       shortCutCmdIdIndex[i] = INVALID;
739    }
740    for (i=0; *(shortCutXlateTbl[i].name) != '\0'; i++) {
741       int cmdid=shortCutXlateTbl[i].cmdid;
742 
743       if (cmdid != INVALID) {
744          int index=cmdid-CMDID_BASE;
745 
746          if (shortCutCmdIdIndex[index] == INVALID) {
747             shortCutCmdIdIndex[index] = i;
748          } else {
749             fprintf(stderr, TgLoadString(STID_WARN_DUP_CMDID), cmdid);
750             fprintf(stderr, "\n");
751          }
752       }
753    }
754 }
755 
CleanUpShortCut()756 void CleanUpShortCut()
757 {
758    register int i;
759 
760    for (i=0; i < 256; i++) {
761       if (shortCutArgs[i] != NULL) {
762          free(shortCutArgs[i]);
763       }
764    }
765    for (i=0; i < 13; i++) {
766       UtilFree(funcKeyInfo[i].name);
767       UtilFree(funcKeyInfo[i].arg);
768    }
769 }
770 
FetchShortCut(c,code,state,name,args,args_sz)771 int FetchShortCut(c, code, state, name, args, args_sz)
772    int c, args_sz;
773    char *code, **name, *args;
774    unsigned int *state;
775 {
776    if (shortCutIndex[c] == INVALID) return FALSE;
777 
778    if (cmdLineTgrm2 && (shortCutIndex[c] & CMDID_TANGRAM2_BASE) != 0) {
779       /* for tangram-II, just do it */
780       int num_args=0;
781 
782       if (FetchTangram2ShortCutNumArgs(shortCutIndex[c]-CMDID_TANGRAM2_BASE,
783             &num_args) && num_args > 0) {
784          strcpy(args, shortCutArgs[c]);
785       } else {
786          *args = '\0';
787       }
788       DoTangram2ShortCut(shortCutIndex[c]-CMDID_TANGRAM2_BASE, args);
789 
790       return FALSE;
791    }
792    *code = shortCutXlateTbl[shortCutIndex[c]].code;
793    *state = shortCutXlateTbl[shortCutIndex[c]].state;
794    *name = shortCutXlateTbl[shortCutIndex[c]].name;
795    if (shortCutXlateTbl[shortCutIndex[c]].num_args == 0) {
796       *args = '\0';
797    } else {
798       strcpy(args, shortCutArgs[c]);
799    }
800    return TRUE;
801 }
802 
FetchFuncKeyShortCut(c,code,state,name,args,args_sz)803 int FetchFuncKeyShortCut(c, code, state, name, args, args_sz)
804    int c, args_sz;
805    char *code, **name, *args;
806    unsigned int *state;
807 {
808    int index=0;
809    char buf[MAXSTRING];
810 
811    switch (c) {
812    case XK_F1: index=1; break;
813    case XK_F2: index=2; break;
814    case XK_F3: index=3; break;
815    case XK_F4: index=4; break;
816    case XK_F5: index=5; break;
817    case XK_F6: index=6; break;
818    case XK_F7: index=7; break;
819    case XK_F8: index=8; break;
820    case XK_F9: index=9; break;
821    case XK_F10: index=10; break;
822    case XK_F11: index=11; break;
823    case XK_F12: index=12; break;
824    default: return FALSE;
825    }
826    if (curChoice == DRAWTEXT) {
827       sprintf(buf, "DrawTextFuncKey_F%1d", index);
828       if (XGetDefault(mainDisplay, TOOL_NAME, buf) != NULL) {
829          return FALSE;
830       }
831    }
832    if (funcKeyInfo[index].name == NULL) return FALSE;
833 
834    *code = funcKeyInfo[index].code;
835    *state = funcKeyInfo[index].state;
836    *name = funcKeyInfo[index].name;
837 
838    if (funcKeyInfo[index].arg == NULL) {
839       *args = '\0';
840    } else {
841       strcpy(args, funcKeyInfo[index].arg);
842    }
843    return TRUE;
844 }
845 
FetchCmdById(nCmdId,code,state,name,args)846 int FetchCmdById(nCmdId, code, state, name, args)
847    int nCmdId;
848    char *code, **name, *args;
849    unsigned int *state;
850 {
851    int cmd_index=nCmdId-CMDID_BASE, table_index=INVALID;
852 
853    if (nCmdId >= MAXCMDIDS || shortCutCmdIdIndex[cmd_index] == INVALID) {
854       return FALSE;
855    }
856    table_index = shortCutCmdIdIndex[cmd_index];
857 
858    if (shortCutXlateTbl[table_index].num_args != 0) {
859       strcpy(args, "-1");
860    }
861    *code = shortCutXlateTbl[table_index].code;
862    *state = shortCutXlateTbl[table_index].state;
863    *name = shortCutXlateTbl[table_index].name;
864    return TRUE;
865 }
866 
ValidShortCut(name,num_args,code,state)867 int ValidShortCut(name, num_args, code, state)
868    char *name, *code;
869    int num_args;
870    unsigned int *state;
871 {
872    int j, len=strlen(name);
873 
874    if (len <= 2) return FALSE;
875    for (j=0; *(shortCutXlateTbl[j].name) != '\0'; j++) {
876       if (num_args == ((int)shortCutXlateTbl[j].num_args) &&
877             strncmp(shortCutXlateTbl[j].name, name, len-2) == 0 &&
878             shortCutXlateTbl[j].name[len] == '(' &&
879             shortCutXlateTbl[j].name[len+1] == ')') {
880          *code = shortCutXlateTbl[j].code;
881          *state = shortCutXlateTbl[j].state;
882          return TRUE;
883       }
884    }
885    return FALSE;
886 }
887