~ubuntu-branches/ubuntu/precise/pcb/precise

« back to all changes in this revision

Viewing changes to src/menu.c

  • Committer: Bazaar Package Importer
  • Author(s): Hamish Moffatt
  • Date: 2005-02-20 13:14:00 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20050220131400-pfz66g5vhx0azl8f
Tags: 1.99j+20050127-2
* Improved package description: (closes: #295405)
* Fixed dependency: tk84 -> tk8.4 (closes: #295404)
* Updated README.debian (closes: #269578)
* Applied patch to src/djopt.c to allow compilation with gcc-4.0
  (closes: #294319), thanks to Andreas Jochens for the patch.
* Prevent example files from being compressed

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: menu.c,v 1.35 2005/01/25 18:07:52 djdelorie Exp $ */
 
2
 
1
3
/*
2
4
 *                            COPYRIGHT
3
5
 *
24
26
 *
25
27
 */
26
28
 
27
 
static  char    *rcsid = "$Id: menu.c,v 1.1 1998/02/19 18:06:34 sync Exp $";
28
29
 
29
30
/* initializes menus and handles callbacks
30
31
 */
31
32
 
 
33
#ifdef HAVE_CONFIG_H
 
34
#include "config.h"
 
35
#endif
 
36
 
 
37
#ifdef HAVE_STRING_H
32
38
#include <string.h>
 
39
#endif
33
40
#include <ctype.h>
34
41
#include <sys/types.h>
 
42
#include <X11/Intrinsic.h>
35
43
 
36
44
#include "global.h"
37
45
 
 
46
#include "action.h"
38
47
#include "buffer.h"
39
48
#include "data.h"
40
49
#include "dialog.h"
41
50
#include "draw.h"
 
51
#include "gui.h"
42
52
#include "mymem.h"
43
53
#include "menu.h"
44
54
#include "misc.h"
 
55
#include "output.h"
45
56
#include "sizedialog.h"
 
57
#include "resource.h"
 
58
#include "resmenu.h"
46
59
 
 
60
#include <X11/cursorfont.h>
47
61
#include <X11/Xaw/Form.h>
48
62
#include <X11/Xaw/MenuButton.h>
49
63
#include <X11/Xaw/SimpleMenu.h>
50
64
#include <X11/Xaw/SmeBSB.h>
51
65
#include <X11/Xaw/SmeLine.h>
52
66
 
 
67
#ifdef HAVE_LIBDMALLOC
 
68
#include <dmalloc.h>
 
69
#endif
 
70
 
 
71
RCSID("$Id: menu.c,v 1.35 2005/01/25 18:07:52 djdelorie Exp $");
 
72
 
 
73
 
 
74
 
 
75
 
 
76
#include "pcb-menu.h"
 
77
 
53
78
/* ---------------------------------------------------------------------------
54
79
 * include icon data
55
80
 */
58
83
/* ---------------------------------------------------------------------------
59
84
 * some local prototypes
60
85
 */
61
 
static  void    CBPOPUP_Display(Widget, XtPointer, XtPointer);
62
 
static  void    CBPOPUP_Settings(Widget, XtPointer, XtPointer);
63
 
static  void    CBPOPUP_File(Widget, XtPointer, XtPointer);
64
 
static  void    CBPOPUP_Buffer(Widget, XtPointer, XtPointer);
65
 
static  void    CBPOPUP_Sizes(Widget, XtPointer, XtPointer);
66
 
static  void    CBPOPUP_Window(Widget, XtPointer, XtPointer);
67
 
static  void    CB_Action(Widget, XtPointer, XtPointer);
68
 
static  void    CB_Position(Widget, XtPointer, XtPointer);
69
 
static  void    CB_ElementPosition(Widget, XtPointer, XtPointer);
70
 
static  void    CB_TextPosition(Widget, XtPointer, XtPointer);
71
 
static  void    CB_ObjectPosition(Widget, XtPointer, XtPointer);
72
 
static  void    CB_About(Widget, XtPointer, XtPointer);
73
 
static  void    InitPopupTree(Widget, PopupEntryTypePtr);
74
 
static  void    InitPopupMenu(Widget, PopupMenuTypePtr);
75
 
static  void    DoWindows(Widget, XtPointer, XtPointer);
76
 
static  Widget  InitializeSizesMenu(Widget, Widget, Widget);
77
 
static  Boolean InitCheckPixmap(void);
 
86
static void InitPopupTree (Widget, PopupEntryTypePtr);
 
87
static void InitPopupMenu (Widget, PopupMenuTypePtr);
 
88
static Boolean InitCheckPixmap (void);
78
89
 
79
90
/* ---------------------------------------------------------------------------
80
91
 * some local identifiers
81
92
 */
82
 
static  Pixmap  Check = BadAlloc;
83
 
 
84
 
/*-----------------------------------------------------------------------------
85
 
 * pop up menu for third mouse button
86
 
 */
87
 
static  PopupEntryType  pMenuEntries[] = {
88
 
        { "header", "Operations on Selections", NULL, NULL, NULL },
89
 
        { "unselect", "Unselect All", CB_Action, "Unselect,All", NULL },
90
 
        { "remove", "Remove Selected", CB_Action,
91
 
                "RemoveSelected", NULL },
92
 
        { "copy", "Copy Selection to Buffer", CB_Action,
93
 
                "PasteBuffer,Clear\n"
94
 
                "PasteBuffer,AddSelected\n"
95
 
                "Mode,PasteBuffer",
96
 
                NULL },
97
 
        { "cut", "Cut Selection to Buffer", CB_Action,
98
 
                "PasteBuffer,Clear\n"
99
 
                "PasteBuffer,AddSelected\n"
100
 
                "RemoveSelected\n"
101
 
                "Mode,PasteBuffer",
102
 
                NULL },
103
 
        { "hide", "Toggle Name Visibility", CB_Action,
104
 
                "ToggleHideName,Selected", NULL},
105
 
        { "header", "Operations on This Object", NULL, NULL, NULL },
106
 
        { "edit", "Edit Name", CB_Action, "ChangeName,Object", NULL },
107
 
        { "report", "Object Report", CB_Action, "Report,Object", NULL },
108
 
        { "rotate", "Rotate Object", CB_Action,
109
 
                "Mode,Save\n"
110
 
                "Mode,Rotate\n"
111
 
                "Mode,Notify\n"
112
 
                "Mode,Restore", NULL },
113
 
        { "therm", "Toggle Thermal", CB_Action,
114
 
                "Mode,Save\n"
115
 
                "Mode,Thermal\n"
116
 
                "Mode,Notify\n"
117
 
                "Mode,Restore", NULL },
118
 
        { "lookup", "Lookup Connections", CB_Action,
119
 
                "Connection,Find", NULL },
120
 
        { "reset", "Reset All Connections", CB_Action,
121
 
                "Connection,Reset\n"
122
 
                "Display,Redraw", NULL },
123
 
        { "line", NULL, NULL, NULL, NULL },
124
 
        { "undo", "Undo Last Operation", CB_Action, "Undo", NULL },
125
 
        { "redo", "Redo Last Undone Operation", CB_Action, "Redo", NULL },
126
 
        { "line", NULL, NULL, NULL, NULL },
127
 
        { "lmode", "Line Tool", CB_Action, "Mode,Line", NULL },
128
 
        { "rmode", "Rectangle Tool", CB_Action, "Mode,Rectangle", NULL },
129
 
        { "amode", "Selection Tool", CB_Action, "Mode,Arrow", NULL },
130
 
        { "tmode", "Text Tool", CB_Action, "Mode,Text", NULL },
131
 
        { "nmode", "No Tool", CB_Action, "Mode,None", NULL },
132
 
        { NULL, NULL, NULL, NULL, NULL }};
133
 
static  PopupMenuType   pMenu =
134
 
        { "pmenu", NULL, pMenuEntries, NULL, NULL, NULL};
135
 
static  PopupEntryType  p2MenuEntries[] = {
136
 
        { "nmode", "No Tool", CB_Action, "Mode,None", NULL },
137
 
        { NULL, NULL, NULL, NULL, NULL }};
138
 
static  PopupMenuType   p2Menu =
139
 
        { "p2menu", NULL, p2MenuEntries, NULL, NULL, NULL};
140
 
 
141
 
/* ---------------------------------------------------------------------------
142
 
 * file menu button
143
 
 */
144
 
static  PopupEntryType  FileMenuEntries[] = {
145
 
        { "about", "About...", CB_About, NULL, NULL },
146
 
        { "save", "save layout", CB_Action, "Save,Layout", NULL },
147
 
        { "saveas", "save layout as...", CB_Action, "Save,LayoutAs", NULL },
148
 
        { "load", "load layout", CB_Action, "Load,Layout", NULL },
149
 
        { "loadelement", "load element data to paste-buffer", CB_Action,
150
 
                "PasteBuffer,Clear\n"
151
 
                "Load,ElementToBuffer", NULL },
152
 
        { "loadlayout", "load layout data to paste-buffer", CB_Action,
153
 
                "PasteBuffer,Clear\n"
154
 
                "Load,LayoutToBuffer", NULL },
155
 
        { "loadnetlist", "load netlist file", CB_Action, "Load,Netlist", NULL },
156
 
        { "print", "print layout...", CB_Action, "Print", NULL },
157
 
        { "line", NULL, NULL, NULL, NULL },
158
 
        { "header", "save connection data of", NULL, NULL, NULL },
159
 
        { "savesingle", "a single element", CB_ElementPosition,
160
 
                "Save,ElementConnections", NULL },
161
 
        { "saveall", "all elements", CB_Action, "Save,AllConnections", NULL },
162
 
        { "saveunused", "unused pins", CB_Action, "Save,AllUnusedPins", NULL },
163
 
        { "line", NULL, NULL, NULL, NULL },
164
 
        { "new", "start new layout", CB_Action, "New", NULL },
165
 
        { "line", NULL, NULL, NULL, NULL },
166
 
        { "quit", "quit program", CB_Action, "Quit", NULL },
167
 
        { NULL, NULL, NULL, NULL, NULL }};
168
 
static  PopupMenuType   FileMenu =
169
 
        { "file", NULL, FileMenuEntries, CBPOPUP_File, NULL, NULL};
170
 
static  MenuButtonType  FileMenuButton =
171
 
        { "file", "File", &FileMenu, NULL};
172
 
 
173
 
/* ---------------------------------------------------------------------------
174
 
 * edit menu button
175
 
 */
176
 
static  PopupEntryType  EditMenuEntries[] = {
177
 
        { "undo", "undo last operation", CB_Action, "Undo", NULL },
178
 
        { "redo", "redo last undone operation", CB_Action, "Redo", NULL },
179
 
        { "clear", "clear undo-buffer", CB_Action, "Undo,ClearList", NULL },
180
 
        { "line", NULL, NULL, NULL, NULL },
181
 
        { "cut", "cut selection to buffer", CB_Position,
182
 
                "PasteBuffer,Clear\n"
183
 
                "PasteBuffer,AddSelected\n"
184
 
                "RemoveSelected\n"
185
 
                "Mode,PasteBuffer",
186
 
                NULL },
187
 
        { "copy", "copy selection to buffer", CB_Position,
188
 
                "PasteBuffer,Clear\n"
189
 
                "PasteBuffer,AddSelected\n"
190
 
                "Mode,PasteBuffer",
191
 
                NULL },
192
 
        { "paste", "paste buffer to layout", CB_Action, "Mode,PasteBuffer", NULL },
193
 
        { "line", NULL, NULL, NULL, NULL },
194
 
        { "unselect", "unselect all", CB_Action, "Unselect,All", NULL },
195
 
        { "select", "select all", CB_Action, "Select,All", NULL },
196
 
        { "line", NULL, NULL, NULL, NULL },
197
 
        { "header", "Edit Names", NULL, NULL, NULL },
198
 
        { "edit", "edit text on layout", CB_TextPosition, "ChangeName,Object", NULL },
199
 
        { "layoutname", "edit name of layout", CB_Action, "ChangeName,Layout", NULL },
200
 
        { "layername", "edit name of active layer", CB_Action, "ChangeName,Layer", NULL },
201
 
        { "line", NULL, NULL, NULL, NULL },
202
 
        { "boardSize", "change board size...", CB_Action, "AdjustStyle,0", NULL },
203
 
        { NULL, NULL, NULL, NULL, NULL }};
204
 
static  PopupMenuType   EditMenu =
205
 
        { "edit",  NULL, EditMenuEntries, NULL, NULL, NULL };
206
 
static  MenuButtonType  EditMenuButton =
207
 
        { "edits", "Edit", &EditMenu, NULL};
208
 
 
209
 
/* ---------------------------------------------------------------------------
210
 
 * display menu button
211
 
 */
212
 
static  PopupEntryType  DisplayMenuEntries[] = {
213
 
        { "redraw", "redraw layout", CB_Action, "Display,Redraw", NULL },
214
 
        { "center", "center layout", CB_Position, "Display,Center", NULL },
215
 
        { "line", NULL, NULL, NULL, NULL },
216
 
        { "displayGrid", "display grid", CB_Action, "Display,Grid", NULL },
217
 
        { "toggleGrid", "use absolute grid", CB_Position,
218
 
                "Display,ToggleGrid", NULL },
219
 
        { "solderSide", "view solder side", CB_Position, "SwapSides", NULL },
220
 
        { "line", NULL, NULL, NULL, NULL },
221
 
        { "header", "grid setting", NULL, NULL, NULL },
222
 
        { "grid05", " 5 mil", CB_Action, "SetValue,Grid,5", NULL },
223
 
        { "grid10", "10 mil", CB_Action, "SetValue,Grid,10", NULL },
224
 
        { "grid20", "20 mil", CB_Action, "SetValue,Grid,20", NULL },
225
 
        { "grid25", "25 mil", CB_Action, "SetValue,Grid,25", NULL },
226
 
        { "grid50", "50 mil", CB_Action, "SetValue,Grid,50", NULL },
227
 
        { "grid100", "100 mil", CB_Action, "SetValue,Grid,100", NULL },
228
 
        { "gridInc", "increment by 5", CB_Action, "SetValue,Grid,+5", NULL },
229
 
        { "gridDec", "decrement by 5", CB_Action, "SetValue,Grid,-5", NULL },
230
 
        { "line", NULL, NULL, NULL, NULL },
231
 
        { "header", "zoom setting", NULL, NULL, NULL },
232
 
        { "zoom1", "1 : 1 ", CB_Position, "SetValue,Zoom,0", NULL },
233
 
        { "zoom2", "1 : 2 ", CB_Position, "SetValue,Zoom,1", NULL },
234
 
        { "zoom4", "1 : 4 ", CB_Position, "SetValue,Zoom,2", NULL },
235
 
        { "zoom8", "1 : 8 ", CB_Position, "SetValue,Zoom,3", NULL },
236
 
        { "zoom16", "1 :16 ", CB_Position, "SetValue,Zoom,4", NULL },
237
 
        { "line", NULL, NULL, NULL, NULL },
238
 
        { "header", "displayed element-name", NULL, NULL, NULL },
239
 
        { "description", "description", CB_Action, "Display,Description", NULL },
240
 
        { "onPCB", "name on PCB", CB_Action, "Display,NameOnPCB", NULL },
241
 
        { "value", "value", CB_Action, "Display,Value", NULL },
242
 
        { "line", NULL, NULL, NULL, NULL },
243
 
        { "pinout", "open pinout window", CB_ElementPosition, "Display,Pinout", NULL },
244
 
        { NULL, NULL, NULL, NULL, NULL }};
245
 
static  PopupMenuType   DisplayMenu =
246
 
        { "display", NULL, DisplayMenuEntries, CBPOPUP_Display, NULL, NULL};
247
 
static  MenuButtonType  DisplayMenuButton =
248
 
        { "display", "Screen", &DisplayMenu, NULL};
249
 
 
250
 
/* ----------------------------------------------------------------------
251
 
 * Sizes menu button - contains variable contents
252
 
 */
253
 
static  PopupEntryType  SizesMenuEntries[NUM_STYLES * 2 + 2];
254
 
static PopupMenuType    SizesMenu =
255
 
        { "sizes", NULL, SizesMenuEntries, CBPOPUP_Sizes, NULL, NULL };
256
 
static  MenuButtonType SizesMenuButton =
257
 
        { "sizes", "Sizes", &SizesMenu, NULL};
258
 
 
259
 
/* ---------------------------------------------------------------------------
260
 
 * settings menu button
261
 
 */
262
 
static  PopupEntryType  SettingsMenuEntries[] = {
263
 
        { "header", "layer-groups", NULL, NULL, NULL },
264
 
        { "lgedit", "edit layer-groupings", CB_Action, "EditLayerGroups", NULL },
265
 
        { "line", NULL, NULL, NULL, NULL },
266
 
        { "toggleAllDirections", "'all-direction' lines", CB_Action,
267
 
                "Display,Toggle45Degree", NULL },
268
 
        { "toggleRubberBandMode", "rubber band mode", CB_Action,
269
 
                "Display,ToggleRubberBandMode", NULL },
270
 
        { "toggleSwapStartDirection", "auto swap line start angle", CB_Action,
271
 
                "Display,ToggleStartDirection", NULL },
272
 
        { NULL, NULL, NULL, NULL, NULL }};
273
 
static  PopupMenuType   SettingsMenu =
274
 
        { "settings",  NULL, SettingsMenuEntries, CBPOPUP_Settings, NULL, NULL };
275
 
static  MenuButtonType  SettingsMenuButton =
276
 
        { "settings", "Settings", &SettingsMenu, NULL};
277
 
 
278
 
/* ---------------------------------------------------------------------------
279
 
 * selection menu button
280
 
 */
281
 
static  PopupEntryType  SelectionMenuEntries[] = {
282
 
        { "select", "select all objects", CB_Action, "Select,All", NULL },
283
 
        { "selectconnection", "select all connected objects", CB_Action,
284
 
                "Select,Connection", NULL },
285
 
        { "line", NULL, NULL, NULL, NULL },
286
 
        { "unselect", "unselect all objects", CB_Action, "Unselect,All", NULL },
287
 
        { "unselectconnection", "unselect all connected objects", CB_Action,
288
 
                "Unselect,Connection", NULL },
289
 
#ifdef HAS_REGEX
290
 
        { "line", NULL, NULL, NULL, NULL },
291
 
        { "header", "select by name", NULL, NULL, NULL },
292
 
        { "allByName", "all objects", CB_Action, "Select,ObjectByName", NULL },
293
 
        { "elementByName", "elements", CB_Action, "Select,ElementByName", NULL },
294
 
        { "padByName", "pads", CB_Action, "Select,PadByName", NULL },
295
 
        { "pinByName", "pins", CB_Action, "Select,PinByName", NULL },
296
 
        { "textByName", "text objects", CB_Action, "Select,TextByName", NULL },
297
 
        { "viaByName", "vias", CB_Action, "Select,ViaByName", NULL },
298
 
#endif
299
 
        { "line", NULL, NULL, NULL, NULL },
300
 
        { "remove", "remove selected objects", CB_Action,
301
 
                "RemoveSelected", NULL },
302
 
        { "line", NULL, NULL, NULL, NULL },
303
 
        { "header", "change size of selected objects", NULL, NULL, NULL },
304
 
        { "decrementline", "lines -10 mil", CB_Action,
305
 
                "ChangeSize,SelectedLines,-10", NULL },
306
 
        { "incrementline", "lines +10 mil", CB_Action,
307
 
                "ChangeSize,SelectedLines,+10", NULL },
308
 
        { "decrementpad", "pads -10 mil", CB_Action,
309
 
                "ChangeSize,SelectedPads,-10", NULL },
310
 
        { "incrementpad", "pads +10 mil", CB_Action,
311
 
                "ChangeSize,SelectedPads,+10", NULL },
312
 
        { "decrementpin", "pins -10 mil", CB_Action,
313
 
                "ChangeSize,SelectedPins,-10", NULL },
314
 
        { "incrementpin", "pins +10 mil", CB_Action,
315
 
                "ChangeSize,SelectedPins,+10", NULL },
316
 
        { "decrementtext", "texts -10 mil", CB_Action,
317
 
                "ChangeSize,SelectedTexts,-10", NULL },
318
 
        { "incrementtext", "texts +10 mil", CB_Action,
319
 
                "ChangeSize,SelectedTexts,+10", NULL },
320
 
        { "decrementvia", "vias -10 mil", CB_Action,
321
 
                "ChangeSize,SelectedVias,-10", NULL },
322
 
        { "incrementvia", "vias +10 mil", CB_Action,
323
 
                "ChangeSize,SelectedVias,+10", NULL },
324
 
        { "line", NULL, NULL, NULL, NULL },
325
 
        { "header", "change drilling hole of selected objects", NULL, NULL, NULL },
326
 
        { "decrementviahole", "vias -10 mil", CB_Action,
327
 
                "ChangeDrillSize,SelectedVias,-10", NULL },
328
 
        { "incrementviahole", "vias +10 mil", CB_Action,
329
 
                "ChangeDrillSize,SelectedVias,+10", NULL },
330
 
        { "decrementpinhole", "pins -10 mil", CB_Action,
331
 
                "ChangeDrillSize,SelectedPins,-10", NULL },
332
 
        { "incrementpinhole", "pins +10 mil", CB_Action,
333
 
                "ChangeDrillSize,SelectedPins,+10", NULL },
334
 
        { "line", NULL, NULL, NULL, NULL },
335
 
        { "header", "change square-flag of selected objects", NULL, NULL, NULL },
336
 
        { "elementsquare", "elements", CB_Action,
337
 
                "ChangeSquare,SelectedElements", NULL },
338
 
        { "pinsquare", "pins", CB_Action,
339
 
                "ChangeSquare,SelectedPins", NULL },
340
 
        { NULL, NULL, NULL, NULL, NULL }};
341
 
static  PopupMenuType   SelectionMenu =
342
 
        { "selection",  NULL, SelectionMenuEntries, NULL, NULL, NULL };
343
 
static  MenuButtonType  SelectionMenuButton =
344
 
        { "selection", "Select", &SelectionMenu, NULL};
345
 
 
346
 
/* ---------------------------------------------------------------------------
347
 
 * paste buffer menu button
348
 
 */
349
 
static  PopupEntryType  BufferMenuEntries[] = {
350
 
        { "copy", "copy selection to buffer", CB_Position,
351
 
                "PasteBuffer,Clear\n"
352
 
                "PasteBuffer,AddSelected\n"
353
 
                "Mode,PasteBuffer",
354
 
                NULL },
355
 
        { "cut", "cut selection to buffer", CB_Position,
356
 
                "PasteBuffer,Clear\n"
357
 
                "PasteBuffer,AddSelected\n"
358
 
                "RemoveSelected\n"
359
 
                "Mode,PasteBuffer",
360
 
                NULL },
361
 
        { "paste", "paste buffer to layout", CB_Action, "Mode,PasteBuffer", NULL },
362
 
        { "line", NULL, NULL, NULL, NULL },
363
 
        { "rotate", "rotate buffer 90 deg", CB_Action,
364
 
                "Mode,PasteBuffer\n"
365
 
                "PasteBuffer,Rotate,1",
366
 
                NULL },
367
 
        { "line", NULL, NULL, NULL, NULL },
368
 
        { "clear", "clear buffer", CB_Action, "PasteBuffer,Clear", NULL },
369
 
        { "convert", "convert buffer to element", CB_Action, "PasteBuffer,Convert", NULL },
370
 
        { "line", NULL, NULL, NULL, NULL },
371
 
        { "header", "select current buffer", NULL, NULL, NULL },
372
 
        { "buffer1", "#1", CB_Action, "PasteBuffer,1", NULL },
373
 
        { "buffer2", "#2", CB_Action, "PasteBuffer,2", NULL },
374
 
        { "buffer3", "#3", CB_Action, "PasteBuffer,3", NULL },
375
 
        { "buffer4", "#4", CB_Action, "PasteBuffer,4", NULL },
376
 
        { "buffer5", "#5", CB_Action, "PasteBuffer,5", NULL },
377
 
        { NULL, NULL, NULL, NULL, NULL }};
378
 
static  PopupMenuType   BufferMenu =
379
 
        { "buffer",  NULL, BufferMenuEntries, CBPOPUP_Buffer, NULL, NULL };
380
 
static  MenuButtonType  BufferMenuButton =
381
 
        { "buffer", "Buffer", &BufferMenu, NULL};
382
 
 
383
 
/* ---------------------------------------------------------------------------
384
 
 * connection menu button
385
 
 */
386
 
static  PopupEntryType  ConnectionMenuEntries[] = {
387
 
        { "lookup", "lookup connection to object", CB_ObjectPosition,
388
 
                "Connection,Find", NULL },
389
 
        { "resetPVP", "reset scanned pads/pins/vias", CB_Action,
390
 
                "Connection,ResetPinsViasAndPads\n"
391
 
                "Display,Redraw", NULL },
392
 
        { "resetLR", "reset scanned lines/polygons", CB_Action,
393
 
                "Connection,ResetLinesAndPolygons\n"
394
 
                "Display,Redraw", NULL },
395
 
        { "reset", "reset all connections", CB_Action,
396
 
                "Connection,Reset\n"
397
 
                "Display,Redraw", NULL },
398
 
        { NULL, NULL, NULL, NULL, NULL }};
399
 
static  PopupMenuType   ConnectionMenu =
400
 
        { "connections",  NULL, ConnectionMenuEntries, NULL, NULL, NULL };
401
 
static  MenuButtonType  ConnectionMenuButton =
402
 
        { "connections", "Connects", &ConnectionMenu, NULL};
403
 
 
404
 
/* ---------------------------------------------------------------------------
405
 
 * report menu button
406
 
 */
407
 
static  PopupEntryType  ReportMenuEntries[] = {
408
 
        { "report", "generate object report", CB_Position, "Report,Object", NULL },
409
 
        { "drillreport", "generate drill summary", CB_Action, "Report,DrillReport", NULL },
410
 
        { "foundreport", "report found pins/pads", CB_Action, "Report,FoundPins", NULL },
411
 
        { NULL, NULL, NULL, NULL, NULL }};
412
 
static  PopupMenuType   ReportMenu =
413
 
        { "report",  NULL, ReportMenuEntries, NULL, NULL, NULL };
414
 
static  MenuButtonType  ReportMenuButton =
415
 
        { "report", "Info", &ReportMenu, NULL};
416
 
 
417
 
/* ---------------------------------------------------------------------------
418
 
 * windows menu button
419
 
 */
420
 
static  PopupEntryType  WindowMenuEntries[] = {
421
 
        { "layout", "board layout", DoWindows, "1", NULL },
422
 
        { "library", "library", DoWindows, "2", NULL },
423
 
        { "log", "message log", DoWindows, "3", NULL },
424
 
        { "netlist", "netlist", DoWindows, "4", NULL },
425
 
        { NULL, NULL, NULL, NULL, NULL }};
426
 
static  PopupMenuType   WindowMenu =
427
 
        { "window",  NULL, WindowMenuEntries, CBPOPUP_Window, NULL, NULL };
428
 
static  MenuButtonType  WindowMenuButton =
429
 
        { "window", "Window", &WindowMenu, NULL};
430
 
 
431
 
static void FillSizesMenu(void)
432
 
{
433
 
        static  char    name[NUM_STYLES * 2 + 1][8];
434
 
        static  char    label[NUM_STYLES * 2 + 1][64];
435
 
        static  char    action[NUM_STYLES * 2 + 1][16];
436
 
        int             i;
437
 
 
438
 
        for (i = 0; i < NUM_STYLES; i++)
439
 
        {
440
 
                sprintf(name[i],"size%d", i+1);
441
 
                sprintf(label[i], "use '%s' routing style", PCB->RouteStyle[i].Name);
442
 
                sprintf(action[i], "RouteStyle,%d", i+1);
443
 
                SizesMenuEntries[i].Name = name[i];
444
 
                SizesMenuEntries[i].Label = label[i];
445
 
                SizesMenuEntries[i].Callback = CB_Action;
446
 
                SizesMenuEntries[i].ClientData = (XtPointer) action[i];
447
 
        }
448
 
        for (i = NUM_STYLES; i < 2*NUM_STYLES; i++)
449
 
        {
450
 
                sprintf(name[i],"size%d", i+1);
451
 
                sprintf(label[i], "adjust '%s' sizes ...", PCB->RouteStyle[i - NUM_STYLES].Name);
452
 
                sprintf(action[i], "AdjustStyle,%d", i - NUM_STYLES +1);
453
 
                SizesMenuEntries[i].Name = name[i];
454
 
                SizesMenuEntries[i].Label = label[i];
455
 
                SizesMenuEntries[i].Callback = CB_Action;
456
 
                SizesMenuEntries[i].ClientData = (XtPointer) action[i];
457
 
        }
458
 
        sprintf(name[i],"size%d",i+1);
459
 
        sprintf(label[i],"adjust active sizes ...");
460
 
        sprintf(action[i],"AdjustStyle,0");
461
 
        SizesMenuEntries[i].Name = name[i];
462
 
        SizesMenuEntries[i].Label = label[i];
463
 
        SizesMenuEntries[i].Callback = CB_Action;
464
 
        SizesMenuEntries[i].ClientData = (XtPointer) action[i];
465
 
        i++;
466
 
        SizesMenuEntries[i].Name = NULL;
467
 
        SizesMenuEntries[i].Label = NULL;
468
 
}
469
 
 
470
 
void UpdateSizesMenu(void)
471
 
{
472
 
        int     i;
473
 
 
474
 
        FillSizesMenu();
475
 
        for (i = 0; i < 2*NUM_STYLES + 1; i++)
476
 
                XtVaSetValues(SizesMenuEntries[i].W, XtNlabel, SizesMenuEntries[i].Label, NULL);
477
 
}
478
 
/* ----------------------------------------------------------------------
479
 
 * Initializes the sizes menu with the routing style names etc.
480
 
 */
481
 
static Widget InitializeSizesMenu(Widget Parent, Widget Top, Widget Last)
482
 
{
483
 
        FillSizesMenu();
484
 
        return(InitMenuButton(Parent, &SizesMenuButton, Top, Last));
 
93
static Pixmap Check = BadAlloc;
 
94
 
 
95
/* --------------------------------------------------------------------------- */
 
96
 
 
97
/* FLAG(style,FlagCurrentStyle) */
 
98
int
 
99
FlagCurrentStyle()
 
100
{
 
101
  STYLE_LOOP (PCB);
 
102
  {
 
103
    if (style->Thick == Settings.LineThickness &&
 
104
        style->Diameter == Settings.ViaThickness &&
 
105
        style->Hole == Settings.ViaDrillingHole)
 
106
      return n+1;
 
107
  }
 
108
  END_LOOP;
 
109
  return 0;
 
110
}
 
111
 
 
112
/* MENU(sizes,SizesMenuInclude) */
 
113
void
 
114
SizesMenuInclude(Resource *menu)
 
115
{
 
116
  char tmp[64];
 
117
  int i;
 
118
 
 
119
  for (i = 0; i <  NUM_STYLES; i++)
 
120
    {
 
121
      Resource *acc;
 
122
      Resource *sub = resource_create(menu);
 
123
      resource_add_val (sub, 0, PCB->RouteStyle[i].Name, 0);
 
124
      sprintf(tmp, "SizesLabel(%d,use)", i);
 
125
      resource_add_val (sub, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
126
      sprintf(tmp, "RouteStyle(%d)", i+1);
 
127
      resource_add_val (sub, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
128
      sprintf(tmp, "CheckWhen(style,%d)", i+1);
 
129
      resource_add_val (sub, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
130
      resource_add_val (menu, 0, 0, sub);
 
131
 
 
132
      acc = resource_create(sub);
 
133
      sprintf(tmp, "Ctrl-%d", i+1);
 
134
      resource_add_val (acc, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
135
      sprintf(tmp, "Ctrl<Key>%d", i+1);
 
136
      resource_add_val (acc, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
137
      resource_add_val (sub, "a", 0, acc);
 
138
    }
 
139
  for (i = 0; i <  NUM_STYLES; i++)
 
140
    {
 
141
      Resource *sub = resource_create(menu);
 
142
      resource_add_val (sub, 0, PCB->RouteStyle[i].Name, 0);
 
143
      sprintf(tmp, "SizesLabel(%d,set)", i);
 
144
      resource_add_val (sub, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
145
      sprintf(tmp, "AdjustStyle(%d)", i+1);
 
146
      resource_add_val (sub, 0, MyStrdup(tmp, "SizesMenuInclude"), 0);
 
147
      resource_add_val (menu, 0, 0, sub);
 
148
    }
 
149
}
 
150
 
 
151
/* ACTION(SizesLabel,ActionSizesLabel) POPUP */
 
152
void
 
153
ActionSizesLabel (Widget w, XEvent * e, String * argv, Cardinal * argc)
 
154
{
 
155
  char tmp[64];
 
156
  int i = atoi(argv[0]);
 
157
 
 
158
  if (strcmp(argv[1], "use") == 0)
 
159
    sprintf(tmp, "Use '%s' routing style", PCB->RouteStyle[i].Name);
 
160
  else
 
161
    sprintf(tmp, "Adjust '%s' sizes ...", PCB->RouteStyle[i].Name);
 
162
  XtVaSetValues (w, XtNlabel, tmp, NULL);
485
163
}
486
164
 
487
165
/* ----------------------------------------------------------------------
488
166
 * menu callback for window menu
489
167
 */
490
 
static void DoWindows(Widget W, XtPointer ClientData, XtPointer CallData)
491
 
{
492
 
        int     n = atoi( (char *) ClientData);
493
 
 
494
 
        switch (n)
495
 
        {
496
 
                case 1:
497
 
                        XRaiseWindow(Dpy, XtWindow(Output.Toplevel));
498
 
                        break;
499
 
                case 2:
500
 
                        XMapRaised(Dpy, Library.Wind);
501
 
                        break;
502
 
                case 3:
503
 
                        if (Settings.UseLogWindow)
504
 
                                XMapRaised(Dpy, LogWindID);
505
 
                        break;
506
 
                case 4:
507
 
                        if (PCB->NetlistLib.Wind)
508
 
                                XMapRaised(Dpy, PCB->NetlistLib.Wind);
509
 
                        break;
510
 
        }
511
 
}
512
 
                        
513
 
        
514
 
/* ----------------------------------------------------------------------
515
 
 * menu callback interface for actions routines that don't need
516
 
 * position information
517
 
 *
518
 
 * ClientData passes a pointer to a comma seperated list of arguments.
519
 
 * The first one determines the action routine to be called, the
520
 
 * rest of them are arguments to the action routine
521
 
 *
522
 
 * if more than one action is to be called a new list is seperated
523
 
 * by '\n'
524
 
 */
525
 
static void CB_Action(Widget W, XtPointer ClientData, XtPointer CallData)
526
 
{
527
 
        static  char    **array = NULL;
528
 
        static  size_t  number = 0;
529
 
                        int             n;
530
 
                        char    *copy,
531
 
                                        *current,
532
 
                                        *next,
533
 
                                        *token;
534
 
 
535
 
                /* get a copy of the string and split it */
536
 
        copy = MyStrdup((char *) ClientData, "CB_CallActionWithoutPosition()");
537
 
 
538
 
                /* first loop over all action routines;
539
 
                 * strtok cannot be used in nested loops because it saves
540
 
                 * a pointer in a private data area which would be corrupted
541
 
                 * by the inner loop
542
 
                 */
543
 
        for (current = copy; current; current = next)
544
 
        {
545
 
                        /* lookup seperating '\n' character;
546
 
                         * update pointer if not at the end of the string
547
 
                         */
548
 
                for (next = current; *next && *next != '\n'; next++);
549
 
                if (*next)
550
 
                {
551
 
                        *next = '\0';
552
 
                        next++;
553
 
                }
554
 
                else
555
 
                        next = NULL;
556
 
                
557
 
                token = strtok(current, ",");
558
 
                for (n = 0; token; token = strtok(NULL, ","), n++)
559
 
                {
560
 
                                /* allocate memory if necessary */
561
 
                        if (n >= number)
562
 
                        {
563
 
                                number += 10;
564
 
                                array = MyRealloc(array, number*sizeof(char *),
565
 
                                        "CB_CallActionWithoutPosition()");
566
 
                        }
567
 
                        array[n] = token;
568
 
                }
569
 
                        /* call action routine */
570
 
                XtCallActionProc(Output.Output, array[0], NULL, &array[1], n-1);
571
 
        }
572
 
 
573
 
                /* release memory */
574
 
        SaveFree(copy);
575
 
}
576
 
 
577
 
/* ----------------------------------------------------------------------
578
 
 * menu callback interface for misc actions routines that need
579
 
 * position information
580
 
 */
581
 
static void CB_Position(Widget W, XtPointer ClientData, XtPointer CallData)
582
 
{
583
 
        int TheMode = Settings.Mode;
584
 
        char *asString = (char *) ClientData;
585
 
 
586
 
        if (!TEST_FLAG(ABSOLUTEFLAG, PCB) && strncmp("Display,ToggleGrid", asString, 18) == 0)
587
 
                CB_Action(W, ClientData,CallData);
588
 
        else
589
 
        {
590
 
                Settings.Mode = NO_MODE;
591
 
                if (GetPosition(
592
 
                        "Move the pointer to the appropriate screen position and press a button."))
593
 
                                CB_Action(W, ClientData, CallData);
594
 
                if (Settings.Mode == NO_MODE)
595
 
                        Settings.Mode = TheMode;
596
 
        }
597
 
}
598
 
 
599
 
/* ----------------------------------------------------------------------
600
 
 * menu callback interface for element related actions routines that need
601
 
 * position information
602
 
 */
603
 
static void CB_ElementPosition(Widget W,
604
 
        XtPointer ClientData, XtPointer CallData)
605
 
{
606
 
        if (GetPosition("press a button at the element's location"))
607
 
                CB_Action(W, ClientData, CallData);
608
 
}
609
 
 
610
 
/* ----------------------------------------------------------------------
611
 
 * menu callback interface for text related actions routines that need
612
 
 * position information
613
 
 */
614
 
static void CB_TextPosition(Widget W,
615
 
        XtPointer ClientData, XtPointer CallData)
616
 
{
617
 
        if (GetPosition("press a button at the text location"))
618
 
                CB_Action(W, ClientData, CallData);
619
 
}
620
 
 
621
 
/* ----------------------------------------------------------------------
622
 
 * menu callback interface for pin/via related actions routines that need
623
 
 * position information update
624
 
 */
625
 
static void CB_ObjectPosition(Widget W,
626
 
        XtPointer ClientData, XtPointer CallData)
627
 
{
628
 
        if (GetPosition("press a button at a 'connecting-objects' location"))
629
 
                CB_Action(W, ClientData, CallData);
630
 
}
631
 
 
632
 
/* ---------------------------------------------------------------------- 
633
 
 * called before sizes menu is popped up
634
 
 * used to mark the current route style 
635
 
 */
636
 
static void CBPOPUP_Sizes(Widget W, XtPointer ClientData, XtPointer CallData)
637
 
{
638
 
        int     i;
639
 
        char    menuname[5];
640
 
 
641
 
        RemoveCheckFromMenu(&SizesMenu);
642
 
        for (i = 0; i < NUM_STYLES; i++)
643
 
        {
644
 
                if (PCB->RouteStyle[i].Thick == Settings.LineThickness &&
645
 
                    PCB->RouteStyle[i].Diameter == Settings.ViaThickness &&
646
 
                    PCB->RouteStyle[i].Hole == Settings.ViaDrillingHole)
647
 
                {
648
 
                        sprintf(menuname, "size%d", i+1);
649
 
                        CheckEntry(&SizesMenu, menuname);
650
 
                        break;
651
 
                }
652
 
        }
653
 
}
654
 
                
655
 
/* ---------------------------------------------------------------------- 
656
 
 * called before display menu is popped up
657
 
 * used to mark the current grid-mode, zoom value ...
658
 
 */
659
 
static void CBPOPUP_Display(Widget W, XtPointer ClientData, XtPointer CallData)
660
 
{
661
 
        RemoveCheckFromMenu(&DisplayMenu);
662
 
        XtSetSensitive(XtNameToWidget(DisplayMenu.W, "displayGrid"),
663
 
                GetGridFactor() != 0);
664
 
        if (TEST_FLAG(ABSOLUTEFLAG, PCB))
665
 
                CheckEntry(&DisplayMenu, "toggleGrid");
666
 
        if (Settings.DrawGrid)
667
 
                CheckEntry(&DisplayMenu, "displayGrid");
668
 
        if (Settings.ShowSolderSide)
669
 
                CheckEntry(&DisplayMenu, "solderSide");
670
 
        switch(PCB->Zoom)
671
 
        {
672
 
                case 0: CheckEntry(&DisplayMenu, "zoom1"); break;
673
 
                case 1: CheckEntry(&DisplayMenu, "zoom2"); break;
674
 
                case 2: CheckEntry(&DisplayMenu, "zoom4"); break;
675
 
                case 3: CheckEntry(&DisplayMenu, "zoom8"); break;
676
 
                case 4: CheckEntry(&DisplayMenu, "zoom16"); break;
677
 
        }
678
 
        CheckEntry(&DisplayMenu,
679
 
                TEST_FLAG(NAMEONPCBFLAG, PCB) ? "onPCB" :
680
 
                        TEST_FLAG(DESCRIPTIONFLAG, PCB) ? "description" : "value");
681
 
}
682
 
 
683
 
/* ---------------------------------------------------------------------- 
684
 
 * called before settings menu is popped up
685
 
 * used to mark the boolean settings
686
 
 */
687
 
static void CBPOPUP_Settings(Widget W, XtPointer ClientData, XtPointer CallData)
688
 
{
689
 
        RemoveCheckFromMenu(&SettingsMenu);
690
 
        if (TEST_FLAG(ALLDIRECTIONFLAG, PCB))
691
 
                CheckEntry(&SettingsMenu, "toggleAllDirections");
692
 
        if (TEST_FLAG(RUBBERBANDFLAG, PCB))
693
 
                CheckEntry(&SettingsMenu, "toggleRubberBandMode");
694
 
        if (TEST_FLAG(SWAPSTARTDIRFLAG, PCB))
695
 
                CheckEntry(&SettingsMenu, "toggleSwapStartDirection");
696
 
}
697
 
 
698
 
 
699
 
/* ---------------------------------------------------------------------- 
700
 
 * called before file menu is popped up
701
 
 * enables/disables printing
702
 
 */
703
 
static void CBPOPUP_File(Widget W, XtPointer ClientData, XtPointer CallData)
704
 
{
705
 
        XtSetSensitive(XtNameToWidget(FileMenu.W, "print"),
706
 
                !IsDataEmpty(PCB->Data));
707
 
}
708
 
 
709
 
/* ---------------------------------------------------------------------- 
710
 
 * called before buffer menu is popped up
711
 
 */
712
 
static void CBPOPUP_Buffer(Widget W, XtPointer ClientData, XtPointer CallData)
713
 
{
714
 
        char            name[10];
715
 
 
716
 
        RemoveCheckFromMenu(&BufferMenu);
717
 
        sprintf(name, "buffer%i", Settings.BufferNumber+1);
718
 
        CheckEntry(&BufferMenu, name);
719
 
}
720
 
 
721
 
/* ---------------------------------------------------------------------- 
722
 
 * called before window menu is popped up
723
 
 * enables/disables log window 
724
 
 */
725
 
static void CBPOPUP_Window(Widget W, XtPointer ClientData, XtPointer CallData)
726
 
{
727
 
        XtSetSensitive(XtNameToWidget(WindowMenu.W, "log"),
728
 
                Settings.UseLogWindow);
729
 
        XtSetSensitive(XtNameToWidget(WindowMenu.W, "netlist"),
730
 
                PCB->NetlistLib.Wind != 0);
731
 
}
732
 
 
733
 
 
734
 
/* ---------------------------------------------------------------------- 
735
 
 * callback routine used by about entry
736
 
 */
737
 
static void CB_About(Widget W, XtPointer ClientData, XtPointer CallData)
738
 
{
739
 
        AboutDialog();
 
168
 
 
169
/* ACTION(DoWindows,ActionDoWindows) */
 
170
void
 
171
ActionDoWindows (Widget w, XEvent * e, String * argv, Cardinal * argc)
 
172
{
 
173
  int n;
 
174
 
 
175
  if (*argc == 0)
 
176
    return;
 
177
  n = atoi (argv[0]);
 
178
 
 
179
  switch (n)
 
180
    {
 
181
    case 1:
 
182
      XRaiseWindow (Dpy, XtWindow (Output.Toplevel));
 
183
      break;
 
184
    case 2:
 
185
      XMapRaised (Dpy, Library.Wind);
 
186
      break;
 
187
    case 3:
 
188
      if (Settings.UseLogWindow)
 
189
        XMapRaised (Dpy, LogWindID);
 
190
      break;
 
191
    case 4:
 
192
      if (PCB->NetlistLib.Wind)
 
193
        XMapRaised (Dpy, PCB->NetlistLib.Wind);
 
194
      break;
 
195
    }
 
196
}
 
197
 
 
198
 
 
199
 
 
200
 
 
201
/* FLAG(grid,FlagGrid) */
 
202
int
 
203
FlagGrid()
 
204
{
 
205
  return (int)PCB->Grid;
 
206
}
 
207
 
 
208
/* FLAG(zoom,FlagZoom) */
 
209
int
 
210
FlagZoom()
 
211
{
 
212
  int zoom = (int)(PCB->Zoom + (PCB->Zoom < 0 ? -0.5 : 0.5));
 
213
  if (abs(PCB->Zoom - zoom) > 0.1)
 
214
    zoom = -8; /* not close enough to integer value */
 
215
  return zoom;
 
216
}
 
217
 
 
218
/* FLAG(elementname,FlagElementName) */
 
219
int
 
220
FlagElementName()
 
221
{
 
222
  if (TEST_FLAG (NAMEONPCBFLAG, PCB))
 
223
    return 2;
 
224
  if (TEST_FLAG (DESCRIPTIONFLAG, PCB))
 
225
    return 1;
 
226
  return 3;
 
227
}
 
228
 
 
229
/* FLAG(gridfactor,FlagGridFactor) */
 
230
int
 
231
FlagGridFactor()
 
232
{
 
233
  return GetGridFactor() != 0;
 
234
}
 
235
 
 
236
/* FLAG(shownumber,FlagTESTFLAG,SHOWNUMBERFLAG) */
 
237
/* FLAG(localref,FlagTESTFLAG,LOCALREFFLAG) */
 
238
/* FLAG(checkplanes,FlagTESTFLAG,CHECKPLANESFLAG) */
 
239
/* FLAG(showdrc,FlagTESTFLAG,SHOWDRCFLAG) */
 
240
/* FLAG(rubberband,FlagTESTFLAG,RUBBERBANDFLAG) */
 
241
/* FLAG(description,FlagTESTFLAG,DESCRIPTIONFLAG) */
 
242
/* FLAG(nameonpcb,FlagTESTFLAG,NAMEONPCBFLAG) */
 
243
/* FLAG(autodrc,FlagTESTFLAG,AUTODRCFLAG) */
 
244
/* FLAG(alldirection,FlagTESTFLAG,ALLDIRECTIONFLAG) */
 
245
/* FLAG(swapstartdir,FlagTESTFLAG,SWAPSTARTDIRFLAG) */
 
246
/* FLAG(uniquename,FlagTESTFLAG,UNIQUENAMEFLAG) */
 
247
/* FLAG(clearnew,FlagTESTFLAG,CLEARNEWFLAG) */
 
248
/* FLAG(snappin,FlagTESTFLAG,SNAPPINFLAG) */
 
249
/* FLAG(showmask,FlagTESTFLAG,SHOWMASKFLAG) */
 
250
/* FLAG(thindraw,FlagTESTFLAG,THINDRAWFLAG) */
 
251
/* FLAG(orthomove,FlagTESTFLAG,ORTHOMOVEFLAG) */
 
252
/* FLAG(liveroute,FlagTESTFLAG,LIVEROUTEFLAG) */
 
253
int
 
254
FlagTESTFLAG(int bit)
 
255
{
 
256
  return TEST_FLAG(bit, PCB) ? 1 : 0;
 
257
}
 
258
 
 
259
/* FLAG(clearline,FlagSETTINGS,XtOffsetOf(SettingType,ClearLine)) */
 
260
/* FLAG(uniquenames,FlagSETTINGS,XtOffsetOf(SettingType,UniqueNames)) */
 
261
/* FLAG(uselogwindow,FlagSETTINGS,XtOffsetOf(SettingType,UseLogWindow)) */
 
262
/* FLAG(raiselogwindow,FlagSETTINGS,XtOffsetOf(SettingType,RaiseLogWindow)) */
 
263
/* FLAG(showsolderside,FlagSETTINGS,XtOffsetOf(SettingType,ShowSolderSide)) */
 
264
/* FLAG(savelastcommand,FlagSETTINGS,XtOffsetOf(SettingType,SaveLastCommand)) */
 
265
/* FLAG(saveintmp,FlagSETTINGS,XtOffsetOf(SettingType,SaveInTMP)) */
 
266
/* FLAG(drawgrid,FlagSETTINGS,XtOffsetOf(SettingType,DrawGrid)) */
 
267
/* FLAG(ratwarn,FlagSETTINGS,XtOffsetOf(SettingType,RatWarn)) */
 
268
/* FLAG(stipplepolygons,FlagSETTINGS,XtOffsetOf(SettingType,StipplePolygons)) */
 
269
/* FLAG(alldirectionlines,FlagSETTINGS,XtOffsetOf(SettingType,AllDirectionLines)) */
 
270
/* FLAG(rubberbandmode,FlagSETTINGS,XtOffsetOf(SettingType,RubberBandMode)) */
 
271
/* FLAG(swapstartdirection,FlagSETTINGS,XtOffsetOf(SettingType,SwapStartDirection)) */
 
272
/* FLAG(showdrc,FlagSETTINGS,XtOffsetOf(SettingType,ShowDRC)) */
 
273
/* FLAG(liveroute,FlagSETTINGS,XtOffsetOf(SettingType,liveRouting)) */
 
274
/* FLAG(resetafterelement,FlagSETTINGS,XtOffsetOf(SettingType,ResetAfterElement)) */
 
275
/* FLAG(ringbellwhenfinished,FlagSETTINGS,XtOffsetOf(SettingType,RingBellWhenFinished)) */
 
276
int
 
277
FlagSETTINGS(int ofs)
 
278
{
 
279
  return *(Boolean *)((char *)(&Settings) + ofs);
 
280
}
 
281
 
 
282
/* FLAG(netlist,FlagNetlist) */
 
283
int
 
284
FlagNetlist()
 
285
{
 
286
  return PCB->NetlistLib.Wind != 0;
740
287
}
741
288
 
742
289
/* ---------------------------------------------------------------------------
743
290
 * remove all 'check' symbols from menu entries
744
291
 */
745
 
void RemoveCheckFromMenu(PopupMenuTypePtr MenuPtr)
 
292
void
 
293
RemoveCheckFromMenu (PopupMenuTypePtr MenuPtr)
746
294
{
747
 
        PopupEntryTypePtr       entries = MenuPtr->Entries;
 
295
  PopupEntryTypePtr entries = MenuPtr->Entries;
748
296
 
749
 
        for (; entries->Name; entries++)
750
 
                if (entries->Label)
751
 
                        XtVaSetValues(entries->W, XtNleftBitmap, None, NULL);
 
297
  for (; entries->Name; entries++)
 
298
    if (entries->Label)
 
299
      XtVaSetValues (entries->W, XtNleftBitmap, None, NULL);
752
300
}
753
301
 
754
302
/* ---------------------------------------------------------------------------
755
303
 * add 'check' symbol to menu entry
756
304
 */
757
 
void CheckEntry(PopupMenuTypePtr MenuPtr, String WidgetName)
 
305
void
 
306
CheckEntry (PopupMenuTypePtr MenuPtr, String WidgetName)
758
307
{
759
 
        PopupEntryTypePtr       entries = MenuPtr->Entries;
 
308
  PopupEntryTypePtr entries = MenuPtr->Entries;
760
309
 
761
 
        if (InitCheckPixmap())
762
 
                for (; entries->Name; entries++)
763
 
                        if (entries->Label && !strcmp(entries->Name, (char *) WidgetName))
764
 
                        {
765
 
                                XtVaSetValues(entries->W, XtNleftBitmap, Check, NULL);
766
 
                                return;
767
 
                        }
 
310
  if (InitCheckPixmap ())
 
311
    for (; entries->Name; entries++)
 
312
      if (entries->Label && !strcmp (entries->Name, (char *) WidgetName))
 
313
        {
 
314
          XtVaSetValues (entries->W, XtNleftBitmap, Check, NULL);
 
315
          return;
 
316
        }
768
317
}
769
318
 
770
319
/* ---------------------------------------------------------------------------
773
322
 * smeLine widget is created. If a callback routine is defined for the
774
323
 * smeBSB widget it will be registered else the entry will be disabled
775
324
 */
776
 
static void InitPopupTree(Widget Parent, PopupEntryTypePtr EntryPtr)
 
325
static void
 
326
InitPopupTree (Widget Parent, PopupEntryTypePtr EntryPtr)
777
327
{
778
 
        for (; EntryPtr->Name; EntryPtr++)
 
328
  for (; EntryPtr->Name; EntryPtr++)
 
329
    {
 
330
      /* check if it's only a seperator */
 
331
      if (EntryPtr->Label)
779
332
        {
780
 
                        /* check if it's only a seperator */
781
 
                if (EntryPtr->Label)
782
 
                {
783
 
                        EntryPtr->W = XtVaCreateManagedWidget(EntryPtr->Name, smeBSBObjectClass,
784
 
                                Parent,
785
 
                                XtNlabel, EntryPtr->Label,
786
 
                                XtNleftMargin, 12, 
787
 
                                XtNsensitive, True,
788
 
                                NULL);
789
 
                        if (EntryPtr->Callback)
790
 
                                XtAddCallback(EntryPtr->W, XtNcallback,
791
 
                                        EntryPtr->Callback, (XtPointer) EntryPtr->ClientData);
792
 
                        else
793
 
                                        /* entry is not selectable */
794
 
                                XtVaSetValues(EntryPtr->W,
795
 
                                        XtNsensitive, False,
796
 
                                        XtNvertSpace, 60,
797
 
                                        NULL);
798
 
                }
799
 
                else
800
 
                        XtVaCreateManagedWidget("menuLine",smeLineObjectClass,Parent,NULL);
 
333
          EntryPtr->W =
 
334
            XtVaCreateManagedWidget (EntryPtr->Name, smeBSBObjectClass,
 
335
                                     Parent, XtNlabel, EntryPtr->Label,
 
336
                                     XtNleftMargin, 12, XtNsensitive, True,
 
337
                                     NULL);
 
338
          if (EntryPtr->Callback)
 
339
            XtAddCallback (EntryPtr->W, XtNcallback,
 
340
                           EntryPtr->Callback,
 
341
                           (XtPointer) EntryPtr->ClientData);
 
342
          else
 
343
            /* entry is not selectable */
 
344
            XtVaSetValues (EntryPtr->W,
 
345
                           XtNsensitive, False, XtNvertSpace, 60, NULL);
801
346
        }
 
347
      else
 
348
        XtVaCreateManagedWidget ("menuLine", smeLineObjectClass, Parent,
 
349
                                 NULL);
 
350
    }
802
351
}
803
352
 
804
353
/* ---------------------------------------------------------------------------
806
355
 * create a popup shell, add all entries to it and register the popup and
807
356
 * popdown callback functions if required
808
357
 */
809
 
static void InitPopupMenu(Widget Parent, PopupMenuTypePtr MenuPtr)
 
358
static void
 
359
InitPopupMenu (Widget Parent, PopupMenuTypePtr MenuPtr)
810
360
{
811
 
        Cursor point = XCreateFontCursor(Dpy, XC_left_ptr);
812
 
        MenuPtr->W = XtVaCreatePopupShell(MenuPtr->Name, simpleMenuWidgetClass,
813
 
                Parent,
814
 
                XtNlabel, MenuPtr->Label,
815
 
                XtNsensitive, True,
816
 
                XtNcursor, point,
817
 
                NULL);
818
 
        InitPopupTree(MenuPtr->W, MenuPtr->Entries);
 
361
  Cursor point = XCreateFontCursor (Dpy, XC_left_ptr);
 
362
  MenuPtr->W = XtVaCreatePopupShell (MenuPtr->Name, simpleMenuWidgetClass,
 
363
                                     Parent,
 
364
                                     XtNlabel, MenuPtr->Label,
 
365
                                     XtNsensitive, True,
 
366
                                     XtNcursor, point, NULL);
 
367
  InitPopupTree (MenuPtr->W, MenuPtr->Entries);
819
368
 
820
 
                /* install popup and popdown callbacks */
821
 
        if (MenuPtr->CB_Popup)
822
 
                XtAddCallback(MenuPtr->W, XtNpopupCallback, MenuPtr->CB_Popup, NULL);
823
 
        if (MenuPtr->CB_Popdown)
824
 
                XtAddCallback(MenuPtr->W, XtNpopupCallback, MenuPtr->CB_Popdown, NULL);
 
369
  /* install popup and popdown callbacks */
 
370
  if (MenuPtr->CB_Popup)
 
371
    XtAddCallback (MenuPtr->W, XtNpopupCallback, MenuPtr->CB_Popup, NULL);
 
372
  if (MenuPtr->CB_Popdown)
 
373
    XtAddCallback (MenuPtr->W, XtNpopupCallback, MenuPtr->CB_Popdown, NULL);
825
374
}
826
375
 
827
376
/* ---------------------------------------------------------------------------
828
377
 * initializes one menubutton plus it's menu
829
378
 * create a menu button widget first than add the popup shell to it
830
379
 */
831
 
Widget InitMenuButton(Widget Parent,
832
 
        MenuButtonTypePtr MenuButtonPtr, Widget Top, Widget Left)
 
380
Widget
 
381
InitMenuButton (Widget Parent,
 
382
                MenuButtonTypePtr MenuButtonPtr, Widget Top, Widget Left)
833
383
{
834
 
        MenuButtonPtr->W = XtVaCreateManagedWidget(MenuButtonPtr->Name, menuButtonWidgetClass,
835
 
                Parent,
836
 
                XtNlabel, MenuButtonPtr->Label,
837
 
                XtNmenuName, MenuButtonPtr->PopupMenu->Name,
838
 
                XtNfromHoriz, Left,
839
 
                XtNfromVert, Top,
840
 
                LAYOUT_TOP,
841
 
                NULL);
842
 
        InitPopupMenu(MenuButtonPtr->W, MenuButtonPtr->PopupMenu);
 
384
  MenuButtonPtr->W =
 
385
    XtVaCreateManagedWidget (MenuButtonPtr->Name, menuButtonWidgetClass,
 
386
                             Parent, XtNlabel, MenuButtonPtr->Label,
 
387
                             XtNmenuName, MenuButtonPtr->PopupMenu->Name,
 
388
                             XtNfromHoriz, Left, XtNfromVert, Top, LAYOUT_TOP,
 
389
                             NULL);
 
390
  XtAddEventHandler (MenuButtonPtr->W, EnterWindowMask, False, CB_StopScroll,
 
391
                     NULL);
 
392
  InitPopupMenu (MenuButtonPtr->W, MenuButtonPtr->PopupMenu);
843
393
 
844
 
                /* return the created button widget to position some others */
845
 
        return(MenuButtonPtr->W);
 
394
  /* return the created button widget to position some others */
 
395
  return (MenuButtonPtr->W);
846
396
}
847
397
 
848
398
/* ---------------------------------------------------------------------------
849
399
 * initializes 'check' pixmap if not already done
850
400
 */
851
 
static Boolean InitCheckPixmap(void)
 
401
static Boolean
 
402
InitCheckPixmap (void)
852
403
{
853
 
        if (Check == BadAlloc)
854
 
                Check = XCreateBitmapFromData(Dpy,
855
 
                                        RootWindowOfScreen(XtScreen(Output.Toplevel)),
856
 
                                        check_icon_bits, check_icon_width, check_icon_height);
857
 
        return(Check != BadAlloc ? True : False);
 
404
  if (Check == BadAlloc)
 
405
    Check = XCreateBitmapFromData (Dpy,
 
406
                                   RootWindowOfScreen (XtScreen
 
407
                                                       (Output.Toplevel)),
 
408
                                   check_icon_bits, check_icon_width,
 
409
                                   check_icon_height);
 
410
  return (Check != BadAlloc ? True : False);
858
411
}
859
412
 
860
413
/* ---------------------------------------------------------------------------
861
414
 * initializes button related menus
862
 
 * also initializes control panel
863
415
 */
864
 
void InitMenu(Widget Parent, Widget Top, Widget Left)
865
 
{
866
 
        Widget  last;
867
 
 
868
 
        last = InitMenuButton(Parent, &FileMenuButton, Top, Left);
869
 
        last = InitMenuButton(Parent, &EditMenuButton, Top, last);
870
 
        last = InitMenuButton(Parent, &DisplayMenuButton, Top, last);
871
 
        last = InitializeSizesMenu(Parent, Top, last);
872
 
        last = InitMenuButton(Parent, &SettingsMenuButton, Top, last);
873
 
        last = InitMenuButton(Parent, &SelectionMenuButton, Top, last);
874
 
        last = InitMenuButton(Parent, &BufferMenuButton, Top, last);
875
 
        last = InitMenuButton(Parent, &ConnectionMenuButton, Top, last);
876
 
        last = InitMenuButton(Parent, &ReportMenuButton, Top, last);
877
 
        last = InitMenuButton(Parent, &WindowMenuButton, Top, last);
878
 
        InitPopupMenu(Parent, &pMenu);
879
 
        InitPopupMenu(Parent, &p2Menu);
880
 
        Output.Menu = last;
881
 
}
882
 
 
 
416
 
 
417
void
 
418
InitMenu (Widget Parent, Widget Top, Widget Left)
 
419
{
 
420
  Widget last;
 
421
  Resource *res, *mres, *pres;
 
422
  char *home = getenv("HOME");
 
423
  char *menu_file = 0;
 
424
 
 
425
  if (FileExists("pcb-menu.res"))
 
426
    menu_file = "pcb-menu.res";
 
427
  if (home && !menu_file)
 
428
    {
 
429
      menu_file = Concat (home, "/.pcb-menu.res", 0);
 
430
      if (! FileExists(menu_file))
 
431
        menu_file = 0;
 
432
    }
 
433
  if (!menu_file && FileExists(Settings.MenuFile))
 
434
    menu_file = Settings.MenuFile;
 
435
 
 
436
  if (menu_file)
 
437
    res = resource_parse(menu_file, 0);
 
438
  else
 
439
    {
 
440
      menu_file = "<internal default>";
 
441
      res = resource_parse (0, pcb_menu_default);
 
442
    }
 
443
 
 
444
  if (!res)
 
445
    {
 
446
      fprintf(stderr, "Unable to parse menu file %s\n", menu_file);
 
447
      return;
 
448
    }
 
449
  mres = resource_subres (res, "MainMenu");
 
450
  if (!mres)
 
451
    {
 
452
      fprintf(stderr, "Cannot find MainMenu resource in %s, trying internal defaults\n", menu_file);
 
453
      menu_file = "<internal default>";
 
454
      res = resource_parse (0, pcb_menu_default);
 
455
      mres = resource_subres (res, "MainMenu");
 
456
      if (!mres)
 
457
        {
 
458
          fprintf (stderr, "Cannot find MainMenu resource internally either\n");
 
459
          exit (1);
 
460
        }
 
461
    }
 
462
  last = MenuCreateFromResource (Parent, mres, Top, Left, 1);
 
463
 
 
464
  pres = resource_subres (res, "PopupMenu");
 
465
  if (pres)
 
466
    MenuCreatePopup(Parent, pres);
 
467
 
 
468
  Output.Menu = last;
 
469
}
 
470
 
 
471
void
 
472
DumpMenu()
 
473
{
 
474
  int i;
 
475
  for (i=0; pcb_menu_default[i]; i++)
 
476
    puts(pcb_menu_default[i]);
 
477
  exit (0);
 
478
}