Initial revision
[ssr] / StraySrc / Libraries / Sapphire / csapph / h / dbox
CommitLineData
2ee739cc 1/*
2 * dbox.h
3 *
4 * [Generated from dbox, 07 February 1998]
5 */
6
7#if !defined(__CC_NORCROFT) || !defined(__arm)
8 #error You must use the Norcroft ARM Compiler for Sapphire programs
9endif
10
11#pragma include_only_once
12#pragma force_top_level
13
14#ifndef __dbox_h
15#define __dbox_h
16
17#ifndef __sapphire_h
18 #include "sapphire.h"
19#endif
20
21/*----- Licensing note ----------------------------------------------------*
22 *
23 * This file is part of Straylight's Sapphire library.
24 *
25 * Sapphire is free software; you can redistribute it and/or modify
26 * it under the terms of the GNU General Public License as published by
27 * the Free Software Foundation; either version 2, or (at your option)
28 * any later version.
29 *
30 * Sapphire is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
33 * GNU General Public License for more details.
34 *
35 * You should have received a copy of the GNU General Public License
36 * along with Sapphire. If not, write to the Free Software Foundation,
37 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
38 */
39
40/*----- Overview ----------------------------------------------------------*
41 *
42 * Functions provided:
43 *
44 * dbox_create
45 * dbox_fromEmbedded
46 * dbox_fromDefn
47 * dbox_destroy
48 * dbox_init
49 * dbox_open
50 * dbox_close
51 * dbox_writePos
52 * dbox_select
53 * dbox_shade
54 * dbox_selectMany
55 * dbox_shadeMany
56 * dbox_isSelected
57 * dbox_radio
58 * dbox_slab
59 * dbox_unslab
60 * dbox_setField
61 * dbox_getField
62 * dbox_eventHandler
63 * dbox_renderTitle
64 * dbox_setEmbeddedTitle
65 * dbox_setClickDrag
66 * dbox_hasTitle
67 * dbox_window
68 * dbox_help
69 */
70
71/* --- dbox_create --- *
72 *
73 * On entry: R0 == pointer to dialogue template name
74 *
75 * On exit: R0 == dialogue box handle for the dialogue
76 * May return an error
77 *
78 * Use: Creates a dialogue box from a template definition.
79 */
80
81extern routine dbox_create;
82
83/* --- dbox_fromEmbedded --- *
84 *
85 * On entry: R0 == pointer to an embedded template
86 *
87 * On exit: R0 == dialogue box handle
88 * May return an error
89 *
90 * Use: Creates a dialogue box from an embedded template definition.
91 */
92
93extern routine dbox_fromEmbedded;
94
95/* --- dbox_fromDefn --- *
96 *
97 * On entry: R0 == pointer to a window definition
98 *
99 * On exit: R0 == dialogue box handle for the dialogue
100 * May return an error
101 *
102 * Use: Creates a dialogue box from an immediate window definition,
103 * rather than a template. There are several things you need
104 * to be aware of when you use this call to create a dialogue
105 * box:
106 *
107 * * The window definition is not copied, but used directly
108 * for the duration the dialogue box exists. It must
109 * not move for this duration. When the dialogue is
110 * destroyed, you can release the memory for the definition,
111 * although this is your responsibility.
112 *
113 * * The indirected data is not copied either, so you'll have
114 * to copy it yourself if you want multiple dialogues from
115 * the same window definition.
116 *
117 * * The window definition and the indirected data must both
118 * be writable.
119 */
120
121extern routine dbox_fromDefn;
122
123/* --- dbox_destroy --- *
124 *
125 * On entry: R0 == dialogue box handle
126 *
127 * On exit: --
128 *
129 * Use: Destroys a dialogue box, freeing all the memory it took
130 * up etc.
131 */
132
133extern routine dbox_destroy;
134
135/* --- dbox_init --- *
136 *
137 * On entry: --
138 *
139 * On exit: --
140 *
141 * Use: Initialises the dbox system.
142 */
143
144extern routine dbox_init;
145
146/* --- dbox_open --- *
147 *
148 * On entry: R0 == dialogue box handle
149 * R1 == how to open the dialogue box
150 * Other registers depend on R1, and are described at the end
151 * of this header file
152 *
153 * On exit: --
154 *
155 * Use: Displays the dialogue box on the screen in the given manner.
156 */
157
158extern routine dbox_open;
159
160/* --- dbox_close --- *
161 *
162 * On entry: R0 == dialogue box handle
163 *
164 * On exit: --
165 *
166 * Use: Closes a dialogue box, by clearing the current menu if
167 * necessary.
168 */
169
170extern routine dbox_close;
171
172/* --- dbox_writePos --- *
173 *
174 * On entry: R0 == dialogue box handle
175 *
176 * On exit: --
177 *
178 * Use: Saves the dialogue's current position so that it will be
179 * opened here the next time it is created. If the dialogue
180 * box was created from a template, the template is updated.
181 * Otherwise, the new state is written back to the definition
182 * supplied to dbox_fromDefn.
183 */
184
185extern routine dbox_writePos;
186
187/* --- dbox_select --- *
188 *
189 * On entry: R0 == dialogue box handle
190 * R1 == icon number
191 * R2 == 0 to deselect the icon, 1 to select it, 2 to toggle
192 * its current selected state
193 *
194 * On exit: --
195 *
196 * Use: Selects or deselects the specified icon in the Acorn sense
197 * (i.e. by flipping its selected bit). The state is only
198 * changed if required, to reduce flicker.
199 */
200
201extern routine dbox_select;
202
203/* --- dbox_shade --- *
204 *
205 * On entry: R0 == dialogue box handle
206 * R1 == icon number
207 * R2 == 0 to unshade the icon, 1 to shade it, 2 to toggle its
208 * current shaded state
209 *
210 * On exit: --
211 *
212 * Use: Makes the icon look dimmer, to indicate that it is not
213 * available. It uses its own shading algorithms, rather than
214 * the WindowManager's, so there are some things you must watch
215 * out for:
216 *
217 * * Don't use any other method of shading icons
218 *
219 * * Don't assume that a shaded icon isn't going to give you
220 * events. At the user level, this should have been tidied
221 * up, but at the Sapphire level, it's still a problem.
222 * There is a routine in winUtils which will tell you if an
223 * icon is shaded.
224 *
225 * This routine has been written so that it only flickers icons
226 * when they actually need it.
227 */
228
229extern routine dbox_shade;
230
231/* --- dbox_selectMany --- *
232 *
233 * On entry: R0 == dialogue box handle
234 * R1 == pointer to icon handle list, -1 terminated
235 * R2 == select action (0 == unselect, 1 == select, 2 == toggle)
236 *
237 * On exit: --
238 *
239 * Use: Changes the select state of a group of icons.
240 */
241
242extern routine dbox_selectMany;
243
244/* --- dbox_shadeMany --- *
245 *
246 * On entry: R0 == dialogue box handle
247 * R1 == pointer to icon handle list, -1 terminated
248 * R2 == shade action (0 == unshade, 1 == shade, 2 == toggle)
249 *
250 * On exit: --
251 *
252 * Use: Changes the shade state of a group of icons.
253 */
254
255extern routine dbox_shadeMany;
256
257/* --- dbox_isSelected --- *
258 *
259 * On entry: R0 == dialogue box handle
260 * R1 == icon number
261 *
262 * On exit: CS if the icon is selected, CC otherwise
263 *
264 * Use: Returns whether an icon is currently selected.
265 */
266
267extern routine dbox_isSelected;
268
269/* --- dbox_radio --- *
270 *
271 * On entry: R0 == dialogue box handle
272 * R1 == icon handle
273 *
274 * On exit: --
275 *
276 * Use: Checks to see if the icon is a radio button as defined by
277 * Sapphire, i.e. button type 3 (debounced) and non-zero ESG.
278 * If it is, it selects it, and deselects all other icons with
279 * this ESG.
280 */
281
282extern routine dbox_radio;
283
284/* --- dbox_slab --- *
285 *
286 * On entry: R0 == dialogue box handle
287 * R1 == icon handle
288 *
289 * On exit: May return an error
290 *
291 * Use: Slabs an icon in properly, to give visual feedback when you
292 * click it.
293 */
294
295extern routine dbox_slab;
296
297/* --- dbox_unslab --- *
298 *
299 * On entry: --
300 *
301 * On exit: CS if there are no more slabbed icons after this one, CC
302 * if there are more left.
303 *
304 * Use: Unslabs an icon slabbed with dbox_slab. Icons are unslabbed
305 * in reverse order to that in which they were slabbed. The
306 * carry flag is returned as an indication of whether there
307 * are any more icons left in the list -- you can unslab all
308 * icons in one go by doing:
309 *
310 * BL dbox_unslab
311 * SUBCC PC,PC,#12 ;Avoids a label!
312 *
313 * It is recommended that, if you are going to close a window,
314 * you unslab icons within it *after* you close, but before you
315 * actually destroy it, e.g.
316 *
317 * LDR R0,my_dbox
318 * BL dbox_close
319 * BL dbox_unslab
320 * BL dbox_destroy
321 */
322
323extern routine dbox_unslab;
324
325/* --- dbox_setField --- *
326 *
327 * On entry: R0 == dialogue box handle
328 * R1 == icon number to write to (may be -1 for title)
329 * flags in top byte if not -1:
330 * dbFlag_dots (bit 31) == add `...' if text overflows
331 * R2 == pointer to string to use
332 *
333 * On exit: --
334 *
335 * Use: Writes the string specified into the indirection buffer
336 * for the given icon. If the icon is not indirected, an
337 * error is generated. If the indirected buffer is too small,
338 * the string is shortened by chopping off the beginning or
339 * the end, according to the setting of the icon's right
340 * justify flag.
341 *
342 * The icon is only flickered if the text has actually changed.
343 * The caret is moved correctly if it is within the icon to
344 * prevent it `falling off' the end and deleting the validation
345 * string, or being positioned incorrectly in centred icons if
346 * the length changes.
347 *
348 * Note that this routine requires a string to already be in
349 * the buffer, and doesn't perform any substitution or other
350 * transformations. This helps to prevent buffer full errors
351 * and similar problems.
352 */
353
354extern routine dbox_setField;
355
356/* --- dbox_getField --- *
357 *
358 * On entry: R0 == dialogue box handle
359 * R1 == icon number to interrogate
360 *
361 * On exit: R0, R1 preserved
362 * R2 == pointer to the icon text
363 *
364 * Use: Returns a pointer to the text associated with an icon.
365 * Note that if the icon is *not* indirected, the text will
366 * be copied into the scratchpad. Otherwise you get a pointer
367 * to the actual indirected data. You shouldn't write to the
368 * string returned at all -- dbox_setField is specially
369 * designed to do that sort of thing very well (i.e. not
370 * flickering the text unless it has to, truncating if it's too
371 * long, and handling the caret correctly). You *are* allowed
372 * to zero terminate the string if you want to, though.
373 *
374 * Despite all the PRM's assurances to the contrary, chances
375 * are the text will be terminated by some weird control char,
376 * so you'll have to handle this, and not just assume it's
377 * going to be null-terminated.
378 *
379 * Note: The indirected case is immensely quick -- just load a
380 * pointer. The non-indirected case has been optimised as much
381 * as possible.
382 */
383
384extern routine dbox_getField;
385
386/* --- dbox_eventHandler --- *
387 *
388 * On entry: R0 == dialogue box handle
389 * R1 == pointer to handler routine
390 * R2 == value to pass to handler in R10
391 * R3 == value to pass to handler in R12
392 *
393 * On exit: R0 preserved
394 * R1 == pointer to old handler
395 * R2 == old R10 value
396 * R3 == old R12 value
397 *
398 * Use: Sets up an event handler for a dialogue box, and returns
399 * the previous one. If the pointer to handler is 0, there is
400 * no dialogue box event handler.
401 */
402
403extern routine dbox_eventHandler;
404
405/* --- dbox_renderTitle --- *
406 *
407 * On entry: R0 == dialogue box handle
408 * R1 == pointer to redraw block
409 *
410 * On exit: --
411 *
412 * Use: Renders a dialogue box's embedded title if there is one.
413 */
414
415extern routine dbox_renderTitle;
416
417/* --- dbox_setEmbeddedTitle --- *
418 *
419 * On entry: R0 == dialogue box handle
420 * R1 == icon which should contain the embedded title
421 *
422 * On exit: --
423 *
424 * Use: Declares a given dialogue box as requiring an embedded title
425 * (rather than the one the WindowManager put on).
426 */
427
428extern routine dbox_setEmbeddedTitle;
429
430/* --- dbox_setClickDrag --- *
431 *
432 * On entry: R0 == dialogue box handle
433 *
434 * On exit: --
435 *
436 * Use: Sets a given dialogue box so that the user can move it by
437 * dragging from any part of the window, not just the title
438 * bar.
439 */
440
441extern routine dbox_setClickDrag;
442
443/* --- dbox_hasTitle --- *
444 *
445 * On entry: R0 == dialogue box handle
446 *
447 * On exit: CS if the dialogue box has a title bar, CC if not
448 *
449 * Use: Informs the caller whether the dialogue box has a title bar.
450 * This is mainly useful for other library sections which
451 * conditionally add in embedded titles etc.
452 */
453
454extern routine dbox_hasTitle;
455
456/* --- dbox_window --- *
457 *
458 * On entry: R0 == dialogue box handle
459 *
460 * On exit: R0 == the dialogue box's window handle
461 *
462 * Use: Returns the Wimp window handle associated with a dialogue
463 * box. This may be useful if you want to perform lowlevel
464 * Wimp operation on it, or to subclass it using win.
465 */
466
467extern routine dbox_window;
468
469/* --- dbox_help --- *
470 *
471 * On entry: --
472 *
473 * On exit: --
474 *
475 * Use: Adds a help line to the current help message, read by
476 * scanning the icon to which the help was sent for an `H'
477 * validation string.
478 */
479
480extern routine dbox_help;
481
482/*----- Useful constants --------------------------------------------------*/
483
484/* --- Ways of opening dialogue boxes --- */
485
486#define dbOpen_current 0
487#define dbOpen_centre 1
488#define dbOpen_pointer 2
489#define dbOpen_givenY 3
490#define dbOpen_givenXY 4
491
492#define dbOpen_trans (0x00)
493#define dbOpen_persist (0x80)
494#define dbOpen_nonSub (0x40)
495
496/* --- Dialogue box event codes --- */
497
498#define dbEvent_close (-2)
499
500#define dbEvent_help (-3)
501
502#define dbEvent_OK (-4)
503
504#define dbEvent_cancel (-5)
505
506#define dbEvent_redraw (-6)
507
508#define dbEvent_menu (-7)
509
510#define dbEvent_drag (-8)
511
512#define dbEvent_save (-9)
513
514#define dbEvent_load (-10)
515
516#define dbEvent_key (-11)
517
518#define dbEvent_hint (-12)
519
520#define dbEvent_enter (-13)
521
522#define dbEvent_leave (-14)
523
524#define dbEvent_lifeCycle (-15)
525
526/* --- Life cycle codes --- */
527
528#define dblc_create 0
529#define dblc_open 1
530#define dblc_close 2
531#define dblc_destroy 3
532
533/* --- Other values --- */
534
535#define dbFlag_dots ((1<<31))
536
537/*----- That's all, folks -------------------------------------------------*/
538
539#endif