/[james]/archive/guilib/dialog_riscos.c
ViewVC logotype

Contents of /archive/guilib/dialog_riscos.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (show annotations) (download) (as text)
Mon Feb 10 22:56:40 2003 UTC (21 years, 10 months ago) by james
File MIME type: text/x-csrc
File size: 11937 byte(s)
Initial import.

1 /*
2 * dialog_riscos.c -- dialog creation, RISC OS
3 */
4
5 #include "gui.h"
6
7 /****************************************************************************************/
8 /* Dialog creation functions */
9 /****************************************************************************************/
10
11 #define DIALOG_ICON_CHUNK 10
12 #define DIALOG_NONE 0xffffffff
13
14 static gui_window_id dialog_id = DIALOG_NONE;
15 static wimp_window *dialog_block;
16 static int dialog_block_icons;
17 static int dialog_icons;
18 static int dialog_y;
19 static int dialog_x;
20 static struct gui_dialog_icon *dialog_icon;
21
22 /*
23 * gui_start_dialog -- start creating a dialogue window
24 *
25 * => title -- window title
26 *
27 * <= nothing
28 */
29
30 void gui_start_dialog(char *title, unsigned int width,
31 bool close, const char *help)
32 {
33 assert(dialog_id == DIALOG_NONE);
34
35 #ifdef DEBUG
36 printf("gui_start_dialog: title = '%s'\n", title);
37 fflush(stdout);
38 #endif
39
40 dialog_id = gui_get_free_window_id();
41
42 dialog_block_icons = DIALOG_ICON_CHUNK;
43 dialog_icons = 0;
44 dialog_y = 4;
45 dialog_x = width;
46
47 dialog_icon = malloc(dialog_block_icons * sizeof(struct gui_dialog_icon));
48 if (!dialog_icon) gui_raise_error("memory");
49
50 dialog_block = malloc(wimp_SIZEOF_WINDOW(dialog_block_icons));
51 if (!dialog_block) gui_raise_error("memory");
52
53 dialog_block->flags = wimp_WINDOW_MOVEABLE | wimp_WINDOW_AUTO_REDRAW |
54 wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_BACK_ICON | wimp_WINDOW_TITLE_ICON |
55 (close ? wimp_WINDOW_CLOSE_ICON : 0);
56 dialog_block->title_fg = wimp_COLOUR_BLACK;
57 dialog_block->title_bg = wimp_COLOUR_LIGHT_GREY;
58 dialog_block->work_fg = wimp_COLOUR_BLACK;
59 dialog_block->work_bg = wimp_COLOUR_VERY_LIGHT_GREY;
60 dialog_block->highlight_bg = wimp_COLOUR_CREAM;
61 dialog_block->extent.x0 = dialog_block->extent.y1 = 0;
62 dialog_block->extent.x1 = width;
63 dialog_block->title_flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED |
64 wimp_ICON_INDIRECTED;
65 dialog_block->work_flags = 0;
66 dialog_block->sprite_area = (osspriteop_area *) 1;
67 dialog_block->xmin = dialog_block->ymin = 1;
68 dialog_block->title_data.indirected_text.text = title;
69 dialog_block->title_data.indirected_text.validation = 0;
70
71 gui_window_list[dialog_id].title = title;
72 gui_window_list[dialog_id].help = help;
73 }
74
75
76 /*
77 * gui_create_dialog -- finish creating and open a dialogue window
78 *
79 * => nothing
80 *
81 * <= window id
82 */
83
84 gui_window_id gui_create_dialog()
85 {
86 gui_window_id id = dialog_id;
87 wimp_w handle;
88 wimp_open open;
89
90 assert(dialog_id != DIALOG_NONE);
91
92 dialog_y += 4;
93
94 dialog_block->extent.y0 = -dialog_y;
95 dialog_block->icon_count = dialog_icons;
96
97 gui_error = xwimp_create_window(dialog_block, &handle);
98 gui_check_error();
99
100 gui_window_list[dialog_id].used = DIALOG;
101 gui_window_list[dialog_id].handle = handle;
102 gui_window_list[dialog_id].close_fn = gui_remove_window;
103 gui_window_list[dialog_id].redraw_fn = NULL;
104 gui_window_list[dialog_id].click_fn = NULL;
105 gui_window_list[dialog_id].resize_fn = NULL;
106 gui_window_list[dialog_id].key_fn = NULL;
107 gui_window_list[dialog_id].input_fn = NULL;
108 gui_window_list[dialog_id].menu_fn = NULL;
109 gui_window_list[dialog_id].width = dialog_block->extent.x1;
110 gui_window_list[dialog_id].height = dialog_y;
111 gui_window_list[dialog_id].menu = NULL;
112 gui_window_list[dialog_id].icon = dialog_icon;
113
114 free(dialog_block);
115
116 open.w = handle;
117 open.visible.x0 = open.visible.y0 = 300;
118 open.visible.x1 = 300 + gui_window_list[dialog_id].width;
119 open.visible.y1 = 300 + dialog_y;
120 open.xscroll = open.yscroll = 0;
121 open.next = wimp_TOP;
122 gui_error = xwimp_open_window(&open);
123 gui_check_error();
124
125 dialog_id = DIALOG_NONE;
126
127 #ifdef DEBUG
128 printf("gui_create_dialog: id = 0x%x, handle = 0x%x\n", dialog_id,
129 (unsigned int) handle);
130 fflush(stdout);
131 #endif
132
133 return id;
134 }
135
136
137 /*
138 * ensure_dialog_space -- allocate memory for icons if necessary
139 *
140 * => nothing
141 *
142 * <= nothing
143 */
144
145 void ensure_dialog_space(void)
146 {
147 if (dialog_icons == dialog_block_icons)
148 {
149 dialog_block_icons += DIALOG_ICON_CHUNK;
150 dialog_block = realloc(dialog_block, wimp_SIZEOF_WINDOW(dialog_block_icons));
151 dialog_icon = realloc(dialog_icon, dialog_block_icons * sizeof(struct gui_dialog_icon));
152 if (!dialog_block || !dialog_icon)
153 {
154 /* free(dialog_block);*/
155 dialog_id = DIALOG_NONE;
156 gui_raise_error("memory");
157 }
158 }
159 }
160
161
162 /*
163 * gui_create_label -- create a text label
164 *
165 * => text -- label text
166 *
167 * <= nothing
168 */
169
170 void gui_create_label(char *text, const char *help)
171 {
172 assert(dialog_id != DIALOG_NONE);
173
174 #ifdef DEBUG
175 printf("gui_create_label: text = '%s'\n", text);
176 fflush(stdout);
177 #endif
178
179 ensure_dialog_space();
180
181 dialog_block->icons[dialog_icons].extent.x0 = 0;
182 dialog_block->icons[dialog_icons].extent.y0 = -(dialog_y + 52);
183 dialog_block->icons[dialog_icons].extent.x1 = dialog_block->extent.x1;
184 dialog_block->icons[dialog_icons].extent.y1 = -dialog_y;
185 dialog_block->icons[dialog_icons].flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED |
186 wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED |
187 wimp_BUTTON_NEVER << wimp_ICON_BUTTON_TYPE_SHIFT |
188 wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT |
189 wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT;
190 dialog_block->icons[dialog_icons].data.indirected_text.text = text;
191 dialog_block->icons[dialog_icons].data.indirected_text.validation = 0;
192
193 dialog_icon[dialog_icons].type = ICON_NONE;
194 dialog_icon[dialog_icons].help = help;
195
196 dialog_icons++;
197 dialog_y += 52;
198 }
199
200
201 /*
202 * gui_create_text_box -- create a labelled writeable text box
203 *
204 * => text -- label text
205 * mask -- entry mask (eg. '0-9' etc)
206 *
207 * <= gadget id
208 * 0 if an error occurred
209 */
210
211 gui_gadget_id gui_create_text_box(char *text, const char *mask, const char *help)
212 {
213 assert(dialog_id != DIALOG_NONE);
214
215 #ifdef DEBUG
216 printf("gui_create_text_box: text = '%s', mask = '%s'\n", text, mask);
217 fflush(stdout);
218 #endif
219
220 ensure_dialog_space();
221
222 dialog_block->icons[dialog_icons].extent.x0 = 0;
223 dialog_block->icons[dialog_icons].extent.y0 = -(dialog_y + 60);
224 dialog_block->icons[dialog_icons].extent.x1 = dialog_block->extent.x1 * 0.25;
225 dialog_block->icons[dialog_icons].extent.y1 = -dialog_y;
226 dialog_block->icons[dialog_icons].flags = wimp_ICON_TEXT | wimp_ICON_RJUSTIFIED |
227 wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED |
228 wimp_BUTTON_NEVER << wimp_ICON_BUTTON_TYPE_SHIFT |
229 wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT |
230 wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT;
231 dialog_block->icons[dialog_icons].data.indirected_text.text = text;
232 dialog_block->icons[dialog_icons].data.indirected_text.validation = 0;
233
234 dialog_icon[dialog_icons].type = ICON_NONE;
235 dialog_icon[dialog_icons].help = help;
236
237 dialog_icons++;
238
239 ensure_dialog_space();
240
241 dialog_block->icons[dialog_icons].extent.x0 = dialog_block->extent.x1 * 0.25;
242 dialog_block->icons[dialog_icons].extent.y0 = -(dialog_y + 56);
243 dialog_block->icons[dialog_icons].extent.x1 = dialog_block->extent.x1 - 8;
244 dialog_block->icons[dialog_icons].extent.y1 = -(dialog_y + 4);
245 dialog_block->icons[dialog_icons].flags = wimp_ICON_TEXT | wimp_ICON_VCENTRED |
246 wimp_ICON_INDIRECTED | wimp_ICON_BORDER | wimp_ICON_FILLED |
247 wimp_BUTTON_WRITABLE << wimp_ICON_BUTTON_TYPE_SHIFT |
248 wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT |
249 wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT;
250 if (!(dialog_block->icons[dialog_icons].data.indirected_text.text = calloc(20, 1)))
251 {
252 free(dialog_block);
253 dialog_id = DIALOG_NONE;
254 gui_raise_error("memory");
255 }
256 dialog_block->icons[dialog_icons].data.indirected_text.validation = (char *) "kta;pptr_write,4,4";
257 dialog_block->icons[dialog_icons].data.indirected_text.size = 20;
258
259 dialog_icon[dialog_icons].type = ICON_NONE;
260 dialog_icon[dialog_icons].help = help;
261
262 dialog_icons++;
263 dialog_y += 60;
264
265 return (gui_gadget_id) dialog_icons - 1;
266 }
267
268
269 /*
270 * gui_create_text_box -- create a labelled display text box
271 *
272 * => text -- label text
273 * value -- display text
274 *
275 * <= gadget id
276 * 0 if an error occurred
277 */
278
279 gui_gadget_id gui_create_display_box(char *text, char *value, const char *help)
280 {
281 assert(dialog_id != DIALOG_NONE);
282
283 #ifdef DEBUG
284 printf("gui_create_display_box: text = '%s'\n", text);
285 fflush(stdout);
286 #endif
287
288 ensure_dialog_space();
289
290 dialog_block->icons[dialog_icons].extent.x0 = 0;
291 dialog_block->icons[dialog_icons].extent.y0 = -(dialog_y + 60);
292 dialog_block->icons[dialog_icons].extent.x1 = dialog_block->extent.x1 * 0.25;
293 dialog_block->icons[dialog_icons].extent.y1 = -dialog_y;
294 dialog_block->icons[dialog_icons].flags = wimp_ICON_TEXT | wimp_ICON_RJUSTIFIED |
295 wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED |
296 wimp_BUTTON_NEVER << wimp_ICON_BUTTON_TYPE_SHIFT |
297 wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT |
298 wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT;
299 dialog_block->icons[dialog_icons].data.indirected_text.text = text;
300 dialog_block->icons[dialog_icons].data.indirected_text.validation = 0;
301
302 dialog_icon[dialog_icons].type = ICON_NONE;
303 dialog_icon[dialog_icons].help = help;
304
305 dialog_icons++;
306
307 ensure_dialog_space();
308
309 dialog_block->icons[dialog_icons].extent.x0 = dialog_block->extent.x1 * 0.25;
310 dialog_block->icons[dialog_icons].extent.y0 = -(dialog_y + 56);
311 dialog_block->icons[dialog_icons].extent.x1 = dialog_block->extent.x1 - 8;
312 dialog_block->icons[dialog_icons].extent.y1 = -(dialog_y + 4);
313 dialog_block->icons[dialog_icons].flags = wimp_ICON_TEXT | wimp_ICON_VCENTRED |
314 wimp_ICON_INDIRECTED | wimp_ICON_BORDER | wimp_ICON_FILLED |
315 wimp_BUTTON_NEVER << wimp_ICON_BUTTON_TYPE_SHIFT |
316 wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT |
317 wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT;
318 dialog_block->icons[dialog_icons].data.indirected_text.text = value;
319 dialog_block->icons[dialog_icons].data.indirected_text.validation = (char *) "r2";
320 dialog_block->icons[dialog_icons].data.indirected_text.size = 20;
321
322 dialog_icon[dialog_icons].type = ICON_NONE;
323 dialog_icon[dialog_icons].help = help;
324
325 dialog_icons++;
326 dialog_y += 60;
327
328 return (gui_gadget_id) dialog_icons - 1;
329 }
330
331
332 /*
333 * gui_create_button -- create an action button
334 *
335 * => text -- button text
336 * click_fn -- function called when button is clicked
337 *
338 * <= nothing
339 */
340
341 void gui_create_button(char *text, void (*click_fn)(gui_window_id window_id, gui_gadget_id gadget_id), const char *help)
342 {
343 unsigned const int border = (dialog_x == dialog_block->extent.x1 ? 8 : 0);
344
345 assert(dialog_id != DIALOG_NONE);
346
347 #ifdef DEBUG
348 printf("gui_create_button: text = '%s'\n", text);
349 fflush(stdout);
350 #endif
351
352 ensure_dialog_space();
353
354 if (dialog_x == dialog_block->extent.x1) dialog_y += 84;
355
356 dialog_block->icons[dialog_icons].extent.x0 = dialog_x - 140 - border * 2;
357 dialog_block->icons[dialog_icons].extent.y0 = -(dialog_y - 16 + border);
358 dialog_block->icons[dialog_icons].extent.x1 = dialog_x - 8;
359 dialog_block->icons[dialog_icons].extent.y1 = -(dialog_y - 68 - border);
360 dialog_block->icons[dialog_icons].flags = wimp_ICON_TEXT | wimp_ICON_HCENTRED |
361 wimp_ICON_VCENTRED | wimp_ICON_INDIRECTED | wimp_ICON_BORDER | wimp_ICON_FILLED |
362 wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT |
363 wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT |
364 wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT;
365 dialog_block->icons[dialog_icons].data.indirected_text.text = text;
366 dialog_block->icons[dialog_icons].data.indirected_text.validation =
367 (dialog_x == dialog_block->extent.x1 ? (char *) "r6,3" : (char *) "r5,3");
368
369 dialog_icon[dialog_icons].type = ICON_ACTION;
370 dialog_icon[dialog_icons].click_fn = click_fn;
371 dialog_icon[dialog_icons].help = help;
372
373 dialog_icons++;
374 dialog_x -= 140 + border * 2;
375 }

  ViewVC Help
Powered by ViewVC 1.1.26