1 /* Copyright (C) 2007,2008 by George Williams */
2 /*
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are met:
5 
6  * Redistributions of source code must retain the above copyright notice, this
7  * list of conditions and the following disclaimer.
8 
9  * Redistributions in binary form must reproduce the above copyright notice,
10  * this list of conditions and the following disclaimer in the documentation
11  * and/or other materials provided with the distribution.
12 
13  * The name of the author may not be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15 
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 #ifndef _UIINTERFACE_H
28 #define _UIINTERFACE_H
29 # include "basics.h"
30 /* This encapsulates a set of callbacks and stubs. The callbacks get activated*/
31 /*  when an event happens (a glyph in a font changes for example, then all */
32 /*  charviews looking at it must be updated), and the stubs provide some simple*/
33 /*  UI routines: Post an error, etc. */
34 
35 /* ************************************************************************** */
36 /* Basic, low-level UI routines for events we discover deep inside script code*/
37 /* ************************************************************************** */
38 
39 struct ui_interface {
40    /* The following is used to post a fontforge internal error */
41    /* currently it puts up a dlg displaying the error text */
42     void (*ierror)(const char *fmt,...);
43 
44    /* The following is a simple dialog to alert the user that s/he has */
45    /*  made an error. Currently it posts a modal dlg and waits for the */
46    /*  user to dismiss it */
47    /* The title argument is the window's title. The error argument is the */
48    /*  text of the message. It may contain printf formatting. It may contain */
49    /*  newlines to force line breaks -- even if it doesn't contain new lines */
50    /*  the routine will wrap the text if a line is too long */
51     void (*post_error)(const char *title,const char *error,...);
52 
53    /* The following is used to post a warning message in such a way that it */
54    /*  will not impede the user. Currently it creates a little window at the */
55    /*  bottom right of the screen and writes successive messages there */
56     void (*logwarning)(const char *fmt,...);
57 
58    /* The following is another way to post a warning message in such a way */
59    /*  that it will not impede the user. Currently it pops up a little */
60    /*  non-modal dlg which vanishes after a minute or two (or if the user */
61    /*  dismisses it, of course */
62     void (*post_warning)(const char *title,const char *statement,...);
63 
64    /* Occasionally we we be deep in a non-ui routine and we find we must ask */
65    /*  the user a question. In this routine the choices are displayed as */
66    /*  buttons, one button is the default, another is a cancel choice */
67     int (*ask)(const char *title, const char **answers,
68 	    int def, int cancel,const char *question,...);
69 
70    /* Similar to the above, except here the choices are presented as a */
71    /*  scrolled list. Return -1 if the user cancels */
72     int (*choose)(const char *title, const char **answers,
73 	    int def, int cancel,const char *question,...);
74 
75     /* Multiple things can be selected, sel is an in/out parameter, one byte */
76     /*  per entry in the choice array. 0=> not selected, 1=>selected */
77     int (*choose_multiple)(char *title, const char **choices,char *sel,
78 	    int cnt, char *buts[2], const char *question,...);
79 
80    /* Here we want a string. We are passed a default answer (or NULL) */
81    /* The return is NULL on cancel, otherwise a string which must be freed */
82     char *(*ask_string)(const char *title,
83 	    const char *def,const char *question,...);
84    /* Same as above, except for entering a password */
85     char *(*ask_password)(const char *title,
86 	    const char *def,const char *question,...);
87 
88    /* The next two routines are only used in the python interface to provide */
89    /*  a python script running in ff a way to open a file */
90    /* Arguments are a window title for the dlg, a default file (or NULL), and */
91    /*  an initial filter (unix wildcards) or NULL */
92     char *(*open_file)(const char *title, const char *defaultfile,
93 	const char *initial_filter);
94     char *(*saveas_file)(const char *title, const char *defaultfile,
95 	const char *initial_filter);
96 
97     /* These routines are for a progress indicator */
98     void (*progress_start)(int delay, const char *title, const char *line1,
99 	const char *line2, int tot, int stages);
100     void (*progress_end)(void);
101     void (*progress_show)(void);
102     void (*progress_enable_stop)(int);
103     int (*progress_next)(void);
104     int (*progress_next_stage)(void);
105     int (*progress_increment)(int);
106     void (*progress_change_line1)(const char *);
107     void (*progress_change_line2)(const char *);
108     void (*progress_pause)(void);
109     void (*progress_resume)(void);
110     void (*progress_change_stages)(int);
111     void (*progress_change_total)(int);
112     int  (*progress_reset)(void);
113 
114     void (*allow_events)(void);
115 
116    /* These next few provide friendly names of various opentype tags */
117    /*  The ui version will probably be translated, while the non-ui list */
118    /*  will probably not. The distinction isn't necessary, but is present in ff*/
119     const char *(*strid)(int);
120     const char *(*mslang)(int);
121 
122    /* pops up a dlg asking user whether to do remove overlap (and other stuff)*/
123    /*  when loading an eps file with strokes, etc. */
124     int (*stroke_flags)(void);
125 };
126 extern struct ui_interface *ui_interface;
127 
128 #define IError			(ui_interface->ierror)
129 #define LogError		(ui_interface->logwarning)
130 #define ff_post_notice		(ui_interface->post_warning)
131 #define ff_post_error		(ui_interface->post_error)
132 #define ff_ask			(ui_interface->ask)
133 #define ff_choose		(ui_interface->choose)
134 #define ff_choose_multiple	(ui_interface->choose_multiple)
135 #define ff_ask_string		(ui_interface->ask_string)
136 #define ff_ask_password		(ui_interface->ask_password)
137 
138 #define ff_open_filename	(ui_interface->open_file)
139 #define ff_save_filename	(ui_interface->saveas_file)
140 
141 #define ff_progress_start_indicator	(ui_interface->progress_start)
142 #define ff_progress_end_indicator	(ui_interface->progress_end)
143 #define ff_progress_show		(ui_interface->progress_show)
144 #define ff_progress_enable_stop		(ui_interface->progress_enable_stop)
145 #define ff_progress_next		(ui_interface->progress_next)
146 #define ff_progress_next_stage		(ui_interface->progress_next_stage)
147 #define ff_progress_increment		(ui_interface->progress_increment)
148 #define ff_progress_change_line1	(ui_interface->progress_change_line1)
149 #define ff_progress_change_line2	(ui_interface->progress_change_line2)
150 #define ff_progress_pause_timer		(ui_interface->progress_pause)
151 #define ff_progress_resume_timer	(ui_interface->progress_resume)
152 #define ff_progress_change_stages	(ui_interface->progress_change_stages)
153 #define ff_progress_change_total	(ui_interface->progress_change_total)
154 #define ff_progress_reset		(ui_interface->progress_reset)
155 
156 #define ff_progress_allow_events	(ui_interface->allow_events)
157 
158 #define TTFNameIds			(ui_interface->strid)
159 #define MSLangString			(ui_interface->mslang)
160 
161 #define PsStrokeFlagsDlg		(ui_interface->stroke_flags)
162 
163 void FF_SetUiInterface(struct ui_interface *uii);
164 
165 /* ************************************************************************** */
166 /*                                Preferences                                 */
167 /* ************************************************************************** */
168 struct val;
169 
170 struct prefs_interface {
171     void  (*save_prefs)(int not_if_running_script);
172     void  (*load_prefs)(void);
173     int   (*get_prefs)(char *name,struct val *value);
174     int   (*set_prefs)(char *name,struct val *val1, struct val *val2);
175     char *(*get_exe_share_dir)(void);
176     void  (*init_prefs)(void);
177 };
178 extern struct prefs_interface *prefs_interface;
179 
180 #define SavePrefs		(prefs_interface->save_prefs)
181 #define LoadPrefs		(prefs_interface->load_prefs)
182 #define GetPrefs		(prefs_interface->get_prefs)
183 #define SetPrefs		(prefs_interface->set_prefs)
184 #define getFontForgeShareDir	(prefs_interface->get_exe_share_dir)
185 #define SetDefaults		(prefs_interface->init_prefs)
186 
187 void FF_SetPrefsInterface(struct prefs_interface *prefsi);
188 
189 /* ************************************************************************** */
190 /*                          Updating glyph windows                            */
191 /* ************************************************************************** */
192 
193 struct splinechar;
194 struct layer;
195 
196 struct sc_interface {
197    /* Update all windows looking at this glyph */
198     void  (*update_all)(struct splinechar *);
199 
200    /* Background images or kerning info have changed for this glyph and */
201    /*  all windows displaying them need to be refreshed */
202     void  (*out_of_date_background)(struct splinechar *);
203 
204    /* The name or code point or encoding of this glyph has changed */
205    /*  update all window titles of any windows looking at us */
206     void (*refresh_titles)(struct splinechar *);
207 
208    /* The hints of the glyph have changed */
209     void (*hints_changed)(struct splinechar *);
210 
211    /* Mark the glyph as changed, and force an update */
212     void (*glyph_changed_update)(struct splinechar *,int layer);
213 
214    /* As above, except this time the change might take the glyph back to */
215    /*  an "unchanged" state (ie. an Undo) */
216     void (*glyph__changed_update)(struct splinechar *,int layer,int);
217 
218    /* The glyph's instructions have changed, so any dlgs looking at */
219    /*  our instructions need to be updated */
220     void (*instructions_changed)(struct splinechar *sc);
221 
222    /* We are removing this glyph (or something like it), get rid of any */
223    /* glyph outline windows which display it */
224     void (*close_all_windows)(struct splinechar *);
225 
226    /* Called when a multilayered glyph increases its layer count */
227    /*  the charview needs to add more layers to its layer window, etc. */
228     void (*more_layers)(struct splinechar *, struct layer *);
229 };
230 extern struct sc_interface *sc_interface;
231 
232 #define SCUpdateAll			(sc_interface->update_all)
233 #define SCOutOfDateBackground		(sc_interface->out_of_date_background)
234 #define SCRefreshTitles			(sc_interface->refresh_titles)
235 #define SCHintsChanged			(sc_interface->hints_changed)
236 #define _SCCharChangedUpdate		(sc_interface->glyph__changed_update)
237 #define SCCharChangedUpdate		(sc_interface->glyph_changed_update)
238 #define SCMarkInstrDlgAsChanged		(sc_interface->instructions_changed)
239 #define SCCloseAllViews			(sc_interface->close_all_windows)
240 #define SCMoreLayers			(sc_interface->more_layers)
241 
242 void FF_SetSCInterface(struct sc_interface *sci);
243 
244 /* ************************************************************************** */
245 /*                         Updating glyph windows 2                           */
246 /* ************************************************************************** */
247 
248 struct charviewbase;
249 struct splinefont;
250 
251 struct cv_interface {
252    /* Update all windows looking at what this char window looks at */
253    /*  which might be a glyph, or perhaps the grid layer */
254    /* And mark as changed */
255     void (*glyph_changed_update)(struct charviewbase *);
256     void (*_glyph_changed_update)(struct charviewbase *, int);
257 
258    /* A glyph's name has changed find all charviews with tabs with that name */
259    /*  and update those tabs */
260     void (*glyph_name_change)(struct splinefont *sf, char *oldname, char *newname);
261 
262    /* We've added a layer to a font */
263     void (*layer_palette_check)(struct splinefont *sf);
264 };
265 extern struct cv_interface *cv_interface;
266 
267 #define CVCharChangedUpdate		(cv_interface->glyph_changed_update)
268 #define _CVCharChangedUpdate		(cv_interface->_glyph_changed_update)
269 #define CVGlyphRenameFixup		(cv_interface->glyph_name_change)
270 #define CVLayerPaletteCheck		(cv_interface->layer_palette_check)
271 
272 void FF_SetCVInterface(struct cv_interface *cvi);
273 
274 /* ************************************************************************** */
275 /*                         Updating bitmap windows                            */
276 /* ************************************************************************** */
277 
278 struct bdfchar;
279 
280 struct bc_interface {
281    /* Update all windows looking at this bitmap glyph */
282    /* And mark as changed */
283     void (*glyph_changed_update)(struct bdfchar *);
284 
285    /* Force a refresh on all open bitmap windows of this glyph */
286     void (*refresh_all)(struct bdfchar *);
287 
288    /* Destroy all open bitmap windows of this glyph */
289     void (*destroy_all)(struct bdfchar *);
290 };
291 extern struct bc_interface *bc_interface;
292 
293 #define BCCharChangedUpdate		(bc_interface->glyph_changed_update)
294 #define BCRefreshAll			(bc_interface->refresh_all)
295 #define BCDestroyAll			(bc_interface->destroy_all)
296 
297 void FF_SetBCInterface(struct bc_interface *bci);
298 
299 /* ************************************************************************** */
300 /*                          Access to metrics views                           */
301 /* ************************************************************************** */
302 
303 struct metricsview;
304 struct splinefont;
305 
306 struct mv_interface {
307    /* Number of glyphs displayed in the view */
308     int (*glyph_cnt)(struct metricsview *);
309 
310    /* Access to the i'th member */
311     struct splinechar *(*get_glyph)(struct metricsview *,int);
312 
313    /* Kerning information for this font has changed. Remetric the metric views*/
314    /* Now-a-days, call this when any kind of lookup information changes, not */
315    /*  just kerning */
316     void (*rekern)(struct splinefont *);
317 
318    /* Close any metrics views associated with this font */
319     void (*sf_close_metrics)(struct splinefont *sf);
320 };
321 extern struct mv_interface *mv_interface;
322 
323 #define MVGlyphCount			(mv_interface->glyph_cnt)
324 #define MVGlyphIndex			(mv_interface->get_glyph)
325 #define MVReKernAll			(mv_interface->rekern)
326 #define MVDestroyAll			(mv_interface->sf_close_metrics)
327 
328 void FF_SetMVInterface(struct mv_interface *mvi);
329 
330 /* ************************************************************************** */
331 /*                             Access to font info                            */
332 /* ************************************************************************** */
333 struct otlookup;
334 
335 struct fi_interface {
336    /* Insert a new lookup into the fontinfo lookup list */
337     void (*insert_lookup)(struct splinefont *, struct otlookup *);
338 
339    /* Merge lookup in from another font */
340     void (*copy_into)(struct splinefont *, struct splinefont *,
341 	    struct otlookup *, struct otlookup *, int, struct otlookup *);
342 
343    /* Removes any font info window for this font */
344     void (*destroy)(struct splinefont *);
345 };
346 extern struct fi_interface *fi_interface;
347 
348 #define FISortInsertLookup			(fi_interface->insert_lookup)
349 #define FIOTLookupCopyInto			(fi_interface->copy_into)
350 #define FontInfo_Destroy			(fi_interface->destroy)
351 
352 void FF_SetFIInterface(struct fi_interface *fii);
353 
354 /* ************************************************************************** */
355 /*                           Updating font windows                            */
356 /* ************************************************************************** */
357 
358 struct fontviewbase;
359 struct bdffont;
360 
361 struct fv_interface {
362    /* Create a new font view. Whatever that may entail */
363     struct fontviewbase *(*create)(struct splinefont *,int hide);
364 
365    /* Create a new font view but without attaching it to a window */
366     struct fontviewbase *(*_create)(struct splinefont *);
367 
368    /* Free a font view (we assume all windows have already been destroyed) */
369     void (*close)(struct fontviewbase *);
370 
371    /* Free a font view (we assume all windows have already been destroyed) */
372     void (*free)(struct fontviewbase *);
373 
374    /* Set the window title of this fontview */
375     void (*set_title)(struct fontviewbase *);
376 
377    /* Set the window title of all fontviews associated with this font */
378     void (*set_titles)(struct splinefont *);
379 
380    /* Refresh all displays of all fontviews associated with this font */
381     void (*refresh_all)(struct splinefont *);
382 
383    /* Reformat this particular fontview (after encoding change, etc) */
384     void (*reformat_one)(struct fontviewbase *);
385 
386    /* Reformat all fontviews associated with this font */
387     void (*reformat_all)(struct splinefont *);
388 
389    /* The active layer has changed. Possibly because the old one was deleted */
390     void (*layer_changed)(struct fontviewbase *);
391 
392    /* toggle the change indicator of this glyph in the font view */
393     void (*flag_glyph_changed)(struct splinechar *);
394 
395    /* Retrieve the window's size in rows and columns */
396     int  (*win_info)(struct fontviewbase *, int *cols, int *rows);
397 
398    /* Is this font currently open? (It was open once, this check is to make   */
399    /*  sure the user hasn't closed it since they copied from it -- so we can  */
400    /*  follow references appropriately if the font we are pasting into doesn't*/
401    /*  have the needed glyph */
402     int  (*font_is_active)(struct splinefont *);
403 
404    /* Sometimes we just need a fontview, any fontview as a last resort fallback*/
405     struct fontviewbase *(*first_font)(void);
406 
407    /* Append this fontview to the list of them */
408     struct fontviewbase *(*append)(struct fontviewbase *);
409 
410    /* Look through all loaded fontviews and see if any contains a font */
411    /*  which lives in the given filename */
412     struct splinefont *(*font_of_filename)(const char *);
413 
414    /* We've just added some extra encoding slots, which means we may need */
415    /*  to increase the number of rows in the fontview display and perhaps */
416    /*  adjust its scrollbar */
417     void (*extra_enc_slots)(struct fontviewbase *,int new_enc_max);
418 
419    /* My fontviews contain a glyph cache (a BDFPieceMeal font) whenever */
420    /*  more glyphs are added to the font, more bitmap glyph slots need to */
421    /*  be added to the font cache */
422     void (*bigger_glyph_cache)(struct fontviewbase *,int new_glyph_cnt);
423 
424    /* If we want to change the font displayed in a fontview */
425     void (*change_display_bitmap)(struct fontviewbase *, struct bdffont *);
426 
427    /* We just deleted the active bitmap, so switch to a rasteriztion of the outlines */
428     void (*display_filled)(struct fontviewbase *);
429 
430    /* When we revert a font we need to change the alegence of all outline */
431    /*  glyph windows to the new value of the font */
432     void (*reattach_cvs)(struct splinefont *old, struct splinefont *new);
433 
434    /* deselect any selected glyphs */
435     void (*deselect_all)(struct fontviewbase *);
436 
437    /* Scroll (or whatever) the fontview so that the desired */
438    /*  gid is displayed */
439     void (*display_gid)(struct fontviewbase *,int gid);
440 
441    /* Scroll (or whatever) the fontview so that the desired */
442    /*  encoding is displayed */
443     void (*display_enc)(struct fontviewbase *,int enc);
444 
445    /* Scroll (or whatever) the fontview so that the desired */
446    /*  glyph is displayed */
447     void (*select_gid)(struct fontviewbase *,int gid);
448 
449    /* Close any open glyph instruction windows in the font */
450     int (*close_all_instrs)(struct splinefont *);
451 };
452 extern struct fv_interface *fv_interface;
453 
454 #define FontViewCreate		(fv_interface->create)
455 #define _FontViewCreate		(fv_interface->_create)
456 #define FontViewClose		(fv_interface->close)
457 #define FontViewFree		(fv_interface->free)
458 #define FVSetTitle		(fv_interface->set_title)
459 #define FVSetTitles		(fv_interface->set_titles)
460 #define FVRefreshAll		(fv_interface->refresh_all)
461 #define FontViewReformatOne	(fv_interface->reformat_one)
462 #define FontViewReformatAll	(fv_interface->reformat_all)
463 #define FontViewLayerChanged	(fv_interface->layer_changed)
464 #define FVToggleCharChanged	(fv_interface->flag_glyph_changed)
465 #define FVWinInfo		(fv_interface->win_info)
466 #define SFIsActive		(fv_interface->font_is_active)
467 #define FontViewFirst		(fv_interface->first_font)
468 #define FVAppend		(fv_interface->append)
469 #define FontWithThisFilename	(fv_interface->font_of_filename)
470 #define FVAdjustScrollBarRows	(fv_interface->extra_enc_slots)
471 #define FVBiggerGlyphCache	(fv_interface->bigger_glyph_cache)
472 #define FVChangeDisplayBitmap	(fv_interface->change_display_bitmap)
473 #define FVShowFilled		(fv_interface->display_filled)
474 #define FVReattachCVs		(fv_interface->reattach_cvs)
475 #define FVDisplayGID		(fv_interface->display_gid)
476 #define FVDisplayEnc		(fv_interface->display_enc)
477 #define FVChangeGID		(fv_interface->select_gid)
478 #define SFCloseAllInstrs	(fv_interface->close_all_instrs)
479 
480 void FF_SetFVInterface(struct fv_interface *fvi);
481 
482 /* ************************************************************************** */
483 /*                       Clibboard access (copy/paste)                        */
484 /* ************************************************************************** */
485 
486 struct clip_interface {
487    /* Announce we own the clipboard selection */
488     void  (*grab_clip)(void);
489    /* Either place data in the clipboard of a given type, or */
490    /*  provide a routine to call which will give data on demand */
491    /*  (and another routine to clean things up) */
492     void  (*add_data_type)(const char *type, void *data, int cnt, int size,
493 	void *(*gendata)(void *,int32 *len), void (*freedata)(void *));
494    /* Does the clipboard contain something of the given type? */
495     int   (*clip_has_type)(const char *mimetype);
496    /* Ask for the clipboard, and waits (and returns) for the response */
497     void *(*request_clip)(const char *mimetype,int *len);
498 
499 };
500 extern struct clip_interface *clip_interface;
501 
502 #define ClipboardGrab		(clip_interface->grab_clip)
503 #define ClipboardAddDataType	(clip_interface->add_data_type)
504 #define ClipboardRequest	(clip_interface->request_clip)
505 #define ClipboardHasType	(clip_interface->clip_has_type)
506 
507 void FF_SetClipInterface(struct clip_interface *clipi);
508 
509 extern const char *NOUI_TTFNameIds(int id);
510 extern const char *NOUI_MSLangString(int language);
511 #endif
512