(no commit message)
[geda-pcb/pcjc2.git] / src / hid.h
blobf5577eb77856abe050ed1eda59a62c2a265e3a54
1 #ifndef PCB_HID_H
2 #define PCB_HID_H
4 #include <stdarg.h>
6 /* Human Interface Device */
8 /*
10 The way the HID layer works is that you instantiate a HID device
11 structure, and invoke functions through its members. Code in the
12 common part of PCB may *not* rely on *anything* other than what's
13 defined in this file. Code in the HID layers *may* rely on data and
14 functions in the common code (like, board size and such) but it's
15 considered bad form to do so when not needed.
17 Coordinates are ALWAYS in pcb's default resolution (1/100 mil at the
18 moment). Positive X is right, positive Y is down. Angles are
19 degrees, with 0 being right (positive X) and 90 being up (negative Y).
20 All zoom, scaling, panning, and conversions are hidden inside the HID
21 layers.
23 The main structure is at the end of this file.
25 Data structures passed to the HIDs will be copied if the HID needs to
26 save them. Data structures retured from the HIDs must not be freed,
27 and may be changed by the HID in response to new information.
31 #if defined(__cplusplus) && __cplusplus
32 extern "C"
34 #endif
36 /* Like end cap styles. The cap *always* extends beyond the
37 coordinates given, by half the width of the line. Beveled ends can
38 used to make octagonal pads by giving the same x,y coordinate
39 twice. */
40 typedef enum
42 Trace_Cap, /* This means we're drawing a trace, which has round caps. */
43 Square_Cap, /* Square pins or pads. */
44 Round_Cap, /* Round pins or round-ended pads, thermals. */
45 Beveled_Cap /* Octagon pins or bevel-cornered pads. */
46 } EndCapStyle;
48 /* The HID may need something more than an "int" for colors, timers,
49 etc. So it passes/returns one of these, which is castable to a
50 variety of things. */
51 typedef union
53 long lval;
54 void *ptr;
55 } hidval;
57 /* This graphics context is an opaque pointer defined by the HID. GCs
58 are HID-specific; attempts to use one HID's GC for a different HID
59 will result in a fatal error. */
60 typedef struct hid_gc_struct *hidGC;
62 #define HIDCONCAT(a,b) a##b
64 /* This is used to register the action callbacks (for menus and
65 whatnot). HID assumes the following actions are available for its
66 use:
67 SaveAs(filename);
68 Quit();
70 typedef struct
72 /* This is matched against action names in the GUI configuration */
73 char *name;
74 /* If this string is non-NULL, the action needs to know the X,Y
75 coordinates to act on, and this string may be used to prompt
76 the user to select a coordinate. If NULL, the coordinates may
77 be 0,0 if none are known. */
78 const char *need_coord_msg;
79 /* Called when the action is triggered. If this function returns
80 non-zero, no further actions will be invoked for this key/mouse
81 event. */
82 int (*trigger_cb) (int argc, char **argv, Coord x, Coord y);
83 /* Short description that sometimes accompanies the name. */
84 const char *description;
85 /* Full allowed syntax; use \n to separate lines. */
86 const char *syntax;
87 } HID_Action;
89 extern void hid_register_action (HID_Action *);
91 extern void hid_register_actions (HID_Action *, int);
92 #define REGISTER_ACTIONS(a) HIDCONCAT(void register_,a) ()\
93 { hid_register_actions(a, sizeof(a)/sizeof(a[0])); }
95 /* Note that PCB expects the gui to provide the following actions:
97 PCBChanged();
98 RouteStylesChanged()
99 NetlistChanged() (but core should call "void NetlistChanged(int);" in netlist.c)
100 LayersChanged()
101 LibraryChanged()
102 Busy()
105 extern const char pcbchanged_help[];
106 extern const char pcbchanged_syntax[];
107 extern const char routestyleschanged_help[];
108 extern const char routestyleschanged_syntax[];
109 extern const char netlistchanged_help[];
110 extern const char netlistchanged_syntax[];
111 extern const char layerschanged_help[];
112 extern const char layerschanged_syntax[];
113 extern const char librarychanged_help[];
114 extern const char librarychanged_syntax[];
116 int hid_action (const char *action_);
117 int hid_actionl (const char *action_, ...); /* NULL terminated */
118 int hid_actionv (const char *action_, int argc_, char **argv_);
119 void hid_save_settings (int);
120 void hid_load_settings (void);
122 /* Parse the given command string into action calls, and call
123 hid_actionv for each action found. Accepts both "action(arg1,
124 arg2)" and command-style "action arg1 arg2", allowing only one
125 action in the later case. Returns nonzero if the action handler(s)
126 return nonzero. */
127 int hid_parse_command (const char *str_);
129 /* Parse the given string into action calls, and call
130 hid_actionv for each action found. Accepts only
131 "action(arg1, arg2)" */
132 int hid_parse_actions (const char *str_);
134 typedef struct
136 /* Name of the flag */
137 char *name;
138 /* Function to call to get the value of the flag. */
139 int (*function) (void *);
140 /* Additional parameter to pass to that function. */
141 void *parm;
142 } HID_Flag;
144 extern void hid_register_flags (HID_Flag *, int);
145 #define REGISTER_FLAGS(a) HIDCONCAT(void register_,a) ()\
146 { hid_register_flags(a, sizeof(a)/sizeof(a[0])); }
148 /* Looks up one of the flags registered above. If the flag is
149 unknown, returns zero. */
150 int hid_get_flag (const char *name_);
152 /* Used for HID attributes (exporting and printing, mostly).
153 HA_boolean uses int_value, HA_enum sets int_value to the index and
154 str_value to the enumeration string. HID_Label just shows the
155 default str_value. HID_Mixed is a real_value followed by an enum,
156 like 0.5in or 100mm. */
157 typedef struct
159 int int_value;
160 const char *str_value;
161 double real_value;
162 Coord coord_value;
163 } HID_Attr_Val;
165 enum hids
166 { HID_Label, HID_Integer, HID_Real, HID_String,
167 HID_Boolean, HID_Enum, HID_Mixed, HID_Path,
168 HID_Unit, HID_Coord
171 typedef struct
173 char *name;
174 /* If the help_text is this, usage() won't show this option */
175 #define ATTR_UNDOCUMENTED ((char *)(1))
176 char *help_text;
177 enum hids type;
178 int min_val, max_val; /* for integer and real */
179 HID_Attr_Val default_val; /* Also actual value for global attributes. */
180 const char **enumerations;
181 /* If set, this is used for global attributes (i.e. those set
182 statically with REGISTER_ATTRIBUTES below) instead of changing
183 the default_val. Note that a HID_Mixed attribute must specify a
184 pointer to HID_Attr_Val here, and HID_Boolean assumes this is
185 "char *" so the value should be initialized to zero, and may be
186 set to non-zero (not always one). */
187 void *value;
188 int hash; /* for detecting changes. */
189 } HID_Attribute;
191 extern void hid_register_attributes (HID_Attribute *, int);
192 #define REGISTER_ATTRIBUTES(a) HIDCONCAT(void register_,a) ()\
193 { hid_register_attributes(a, sizeof(a)/sizeof(a[0])); }
195 /* These three are set by hid_parse_command_line(). */
196 extern char *program_name;
197 extern char *program_directory;
198 extern char *program_basename;
200 #define SL_0_SIDE 0x0000
201 #define SL_TOP_SIDE 0x0001
202 #define SL_BOTTOM_SIDE 0x0002
203 #define SL_SILK 0x0010
204 #define SL_MASK 0x0020
205 #define SL_PDRILL 0x0030
206 #define SL_UDRILL 0x0040
207 #define SL_PASTE 0x0050
208 #define SL_INVISIBLE 0x0060
209 #define SL_FAB 0x0070
210 #define SL_ASSY 0x0080
211 #define SL_RATS 0x0090
212 /* Callers should use this. */
213 #define SL(type,side) (~0xfff | SL_##type | SL_##side##_SIDE)
215 /* File Watch flags */
216 /* Based upon those in dbus/dbus-connection.h */
217 typedef enum
219 PCB_WATCH_READABLE = 1 << 0, /**< As in POLLIN */
220 PCB_WATCH_WRITABLE = 1 << 1, /**< As in POLLOUT */
221 PCB_WATCH_ERROR = 1 << 2, /**< As in POLLERR */
222 PCB_WATCH_HANGUP = 1 << 3 /**< As in POLLHUP */
223 } PCBWatchFlags;
225 /* DRC GUI Hooks */
226 typedef struct
228 int log_drc_overview;
229 int log_drc_violations;
230 void (*reset_drc_dialog_message) (void);
231 void (*append_drc_violation) (DrcViolationType *violation);
232 int (*throw_drc_dialog) (void);
233 } HID_DRC_GUI;
235 typedef struct hid_st HID;
236 typedef struct hid_draw_st HID_DRAW;
238 /* This is the main HID structure. */
239 struct hid_st
241 /* The size of this structure. We use this as a compatibility
242 check; a HID built with a different hid.h than we're expecting
243 should have a different size here. */
244 int struct_size;
246 /* The name of this HID. This should be suitable for
247 command line options, multi-selection menus, file names,
248 etc. */
249 const char *name;
251 /* Likewise, but allowed to be longer and more descriptive. */
252 const char *description;
254 /* If set, this is the GUI HID. Exactly one of these three flags
255 must be set; setting "gui" lets the expose callback optimize and
256 coordinate itself. */
257 char gui:1;
259 /* If set, this is the printer-class HID. The common part of PCB
260 may use this to do command-line printing, without having
261 instantiated any GUI HIDs. Only one printer HID is normally
262 defined at a time. */
263 char printer:1;
265 /* If set, this HID provides an export option, and should be used as
266 part of the File->Export menu option. Examples are PNG, Gerber,
267 and EPS exporters. */
268 char exporter:1;
270 /* If set, the redraw code will draw polygons before erasing the
271 clearances. */
272 char poly_before:1;
274 /* If set, the redraw code will draw polygons after erasing the
275 clearances. Note that HIDs may set both of these, in which case
276 polygons will be drawn twice. */
277 char poly_after:1;
279 /* Returns a set of resources describing options the export or print
280 HID supports. In GUI mode, the print/export dialogs use this to
281 set up the selectable options. In command line mode, these are
282 used to interpret command line options. If n_ret is non-NULL,
283 the number of attributes is stored there. */
284 HID_Attribute *(*get_export_options) (int *n_ret_);
286 /* Export (or print) the current PCB. The options given represent
287 the choices made from the options returned from
288 get_export_options. Call with options == NULL to start the
289 primary GUI (create a main window, print, export, etc) */
290 void (*do_export) (HID_Attr_Val * options_);
292 /* Parse the command line. Call this early for whatever HID will be
293 the primary HID, as it will set all the registered attributes.
294 The HID should remove all arguments, leaving any possible file
295 names behind. */
296 void (*parse_arguments) (int *argc_, char ***argv_);
298 /* This may be called to ask the GUI to force a redraw of a given area */
299 void (*invalidate_lr) (int left_, int right_, int top_, int bottom_);
300 void (*invalidate_all) (void);
301 void (*notify_crosshair_change) (bool changes_complete);
302 void (*notify_mark_change) (bool changes_complete);
304 /* During redraw or print/export cycles, this is called once per
305 layer (or layer group, for copper layers). If it returns false
306 (zero), the HID does not want that layer, and none of the drawing
307 functions should be called. If it returns true (nonzero), the
308 items in that layer [group] should be drawn using the various
309 drawing functions. In addition to the MAX_GROUP copper layer
310 groups, you may select layers indicated by the macros SL_*
311 defined above, or any others with an index of -1. For copper
312 layer groups, you may pass NULL for name to have a name fetched
313 from the PCB struct. The EMPTY argument is a hint - if set, the
314 layer is empty, if zero it may be non-empty. */
315 int (*set_layer) (const char *name_, int group_, int _empty);
317 /* Tell the GUI the layer last selected has been finished with */
318 void (*end_layer) (void);
321 HID_DRAW *graphics;
323 /* This is for the printer. If you call this for the GUI, xval and
324 yval are ignored, and a dialog pops up to lead you through the
325 calibration procedure. For the printer, if xval and yval are
326 zero, a calibration page is printed with instructions for
327 calibrating your printer. After calibrating, nonzero xval and
328 yval are passed according to the instructions. Metric is nonzero
329 if the user prefers metric units, else inches are used. */
330 void (*calibrate) (double xval_, double yval_);
333 /* GUI layout functions. Not used or defined for print/export
334 HIDs. */
336 /* Temporary */
337 int (*shift_is_pressed) (void);
338 int (*control_is_pressed) (void);
339 int (*mod1_is_pressed) (void);
340 void (*get_coords) (const char *msg_, Coord *x_, Coord *y_);
342 /* Sets the crosshair, which may differ from the pointer depending
343 on grid and pad snap. Note that the HID is responsible for
344 hiding, showing, redrawing, etc. The core just tells it what
345 coordinates it's actually using. Note that this routine may
346 need to know what "pcb units" are so it can display them in mm
347 or mils accordingly. If cursor_action is set, the cursor or
348 screen may be adjusted so that the cursor and the crosshair are
349 at the same point on the screen. */
350 void (*set_crosshair) (int x_, int y_, int cursor_action_);
351 #define HID_SC_DO_NOTHING 0
352 #define HID_SC_WARP_POINTER 1
353 #define HID_SC_PAN_VIEWPORT 2
355 /* Causes func to be called at some point in the future. Timers are
356 only good for *one* call; if you want it to repeat, add another
357 timer during the callback for the first. user_data can be
358 anything, it's just passed to func. Times are not guaranteed to
359 be accurate. */
360 hidval (*add_timer) (void (*func) (hidval user_data_),
361 unsigned long milliseconds_, hidval user_data_);
362 /* Use this to stop a timer that hasn't triggered yet. */
363 void (*stop_timer) (hidval timer_);
365 /* Causes func to be called when some condition occurs on the file
366 descriptor passed. Conditions include data for reading, writing,
367 hangup, and errors. user_data can be anything, it's just passed
368 to func. */
369 hidval (*watch_file) (int fd_, unsigned int condition_, void (*func_) (hidval watch_, int fd_, unsigned int condition_, hidval user_data_),
370 hidval user_data);
371 /* Use this to stop a file watch. */
372 void (*unwatch_file) (hidval watch_);
374 /* Causes func to be called in the mainloop prior to blocking */
375 hidval (*add_block_hook) (void (*func_) (hidval data_), hidval data_);
376 /* Use this to stop a mainloop block hook. */
377 void (*stop_block_hook) (hidval block_hook_);
379 /* Various dialogs */
381 /* Log a message to the log window. */
382 void (*log) (const char *fmt_, ...);
383 void (*logv) (const char *fmt_, va_list args_);
385 /* A generic yes/no dialog. Returns zero if the cancel button is
386 pressed, one for the ok button. If you specify alternate labels
387 for ..., they are used instead of the default OK/Cancel ones, and
388 the return value is the index of the label chosen. You MUST pass
389 NULL as the last parameter to this. */
390 int (*confirm_dialog) (char *msg_, ...);
392 /* A close confirmation dialog for unsaved pages, for example, with
393 options "Close without saving", "Cancel" and "Save". Returns zero
394 if the close is cancelled, or one if it should proceed. The HID
395 is responsible for any "Save" action the user may wish before
396 confirming the close.
398 int (*close_confirm_dialog) ();
399 #define HID_CLOSE_CONFIRM_CANCEL 0
400 #define HID_CLOSE_CONFIRM_OK 1
402 /* Just prints text. */
403 void (*report_dialog) (char *title_, char *msg_);
405 /* Prompts the user to enter a string, returns the string. If
406 default_string isn't NULL, the form is pre-filled with this
407 value. "msg" is like "Enter value:". */
408 char *(*prompt_for) (const char *msg_, const char *default_string_);
410 /* Prompts the user for a filename or directory name. For GUI
411 HID's this would mean a file select dialog box. The 'flags'
412 argument is the bitwise OR of the following values. */
413 #define HID_FILESELECT_READ 0x01
415 /* The function calling hid->fileselect will deal with the case
416 where the selected file already exists. If not given, then the
417 gui will prompt with an "overwrite?" prompt. Only used when
418 writing.
420 #define HID_FILESELECT_MAY_NOT_EXIST 0x02
422 /* The call is supposed to return a file template (for gerber
423 output for example) instead of an actual file. Only used when
424 writing.
426 #define HID_FILESELECT_IS_TEMPLATE 0x04
428 /* title may be used as a dialog box title. Ignored if NULL.
430 * descr is a longer help string. Ignored if NULL.
432 * default_file is the default file name. Ignored if NULL.
434 * default_ext is the default file extension, like ".pdf".
435 * Ignored if NULL.
437 * history_tag may be used by the GUI to keep track of file
438 * history. Examples would be "board", "vendor", "renumber",
439 * etc. If NULL, no specific history is kept.
441 * flags are the bitwise or of the HID_FILESELECT defines above
444 char *(*fileselect) (const char *title_, const char *descr_,
445 char *default_file_, char *default_ext_,
446 const char *history_tag_, int flags_);
448 /* A generic dialog to ask for a set of attributes. If n_attrs is
449 zero, attrs(.name) must be NULL terminated. Returns non-zero if
450 an error occurred (usually, this means the user cancelled the
451 dialog or something). title is the title of the dialog box
452 descr (if not NULL) can be a longer description of what the
453 attributes are used for. The HID may choose to ignore it or it
454 may use it for a tooltip or text in a dialog box, or a help
455 string.
457 int (*attribute_dialog) (HID_Attribute * attrs_,
458 int n_attrs_, HID_Attr_Val * results_,
459 const char * title_, const char * descr_);
461 /* This causes a second window to display, which only shows the
462 selected item. The expose callback is called twice; once to size
463 the extents of the item, and once to draw it. To pass magic
464 values, pass the address of a variable created for this
465 purpose. */
466 void (*show_item) (void *item_);
468 /* Something to alert the user. */
469 void (*beep) (void);
471 /* Used by optimizers and autorouter to show progress to the user.
472 Pass all zeros to flush display and remove any dialogs.
473 Returns nonzero if the user wishes to cancel the operation. */
474 int (*progress) (int so_far_, int total_, const char *message_);
476 HID_DRC_GUI *drc_gui;
478 void (*edit_attributes) (char *owner, AttributeListType *attrlist_);
480 /* Debug drawing support. These APIs must be implemented (non NULL),
481 * but they do not have to be functional. request_debug_draw can
482 * return NULL to indicate debug drawing is not permitted.
484 * Debug drawing is not gauranteed to be re-entrant.
485 * The caller must not nest requests for debug drawing.
488 /* Request permission for debug drawing
490 * Returns a HID pointer which should be used rather than the global
491 * gui-> for making drawing calls. If the return value is NULL, then
492 * permission has been denied, and the drawing must not continue.
494 HID *(*request_debug_draw) (void);
496 /* Flush pending drawing to the screen
498 * May be implemented as a NOOP if the GUI has chosen to send the
499 * debug drawing directly to the screen.
501 void (*flush_debug_draw) (void);
503 /* When finished, the user must inform the GUI to clean up resources
505 * Any remaining rendering will be flushed to the screen.
507 void (*finish_debug_draw) (void);
509 /* Notification to the GUI around saving the PCB file.
511 * Called with a false parameter before the save, called again
512 * with true after the save.
514 * Allows GUIs which watch for file-changes on disk to ignore
515 * our deliberate changes.
517 void (*notify_save_pcb) (const char *filename, bool done);
519 /* Notification to the GUI that the PCB file has been renamed. */
520 void (*notify_filename_changed) (void);
523 /* Call this as soon as possible from main(). No other HID calls are
524 valid until this is called. */
525 void hid_init (void);
527 /* When PCB runs in interactive mode, this is called to instantiate
528 one GUI HID which happens to be the GUI. This HID is the one that
529 interacts with the mouse and keyboard. */
530 HID *hid_find_gui ();
532 /* Finds the one printer HID and instantiates it. */
533 HID *hid_find_printer (void);
535 /* Finds the indicated exporter HID and instantiates it. */
536 HID *hid_find_exporter (const char *);
538 /* This returns a NULL-terminated array of available HIDs. The only
539 real reason to use this is to locate all the export-style HIDs. */
540 HID **hid_enumerate (void);
542 /* This function (in the common code) will be called whenever the GUI
543 needs to redraw the screen, print the board, or export a layer. If
544 item is not NULL, only draw the given item. Item is only non-NULL
545 if the HID was created via show_item.
547 Each time func is called, it should do the following:
549 * allocate any colors needed, via get_color.
551 * cycle through the layers, calling set_layer for each layer to be
552 drawn, and only drawing elements (all or specified) of desired
553 layers.
555 Do *not* assume that the hid that is passed is the GUI hid. This
556 callback is also used for printing and exporting. */
557 struct BoxType;
558 void hid_expose_callback (HID * hid_, struct BoxType *region_, void *item_);
560 /* This is initially set to a "no-gui" gui, and later reset by
561 main. hid_expose_callback also temporarily set it for drawing. */
562 extern HID *gui;
564 /* This is either NULL or points to the current HID that is being called to
565 do the exporting. The gui HIDs set and unset this var.*/
566 extern HID *exporter;
568 /* This is either NULL or points to the current HID_Action that is being
569 called. The action launcher sets and unsets this variable. */
570 extern HID_Action *current_action;
572 /* The GUI may set this to be approximately the PCB size of a pixel,
573 to allow for near-misses in selection and changes in drawing items
574 smaller than a screen pixel. */
575 extern int pixel_slop;
577 #if defined(__cplusplus) && __cplusplus
579 #endif
581 #endif