source: mainline/uspace/app/uidemo/uidemo.c@ 9aa51406

Last change on this file since 9aa51406 was 9aa51406, checked in by Jiri Svoboda <jiri@…>, 10 months ago

Create terminal window with the correct size from the start.

  • Property mode set to 100644
File size: 32.6 KB
Line 
1/*
2 * Copyright (c) 2023 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup uidemo
30 * @{
31 */
32/** @file User interface demo
33 */
34
35#include <gfx/bitmap.h>
36#include <gfx/coord.h>
37#include <io/pixelmap.h>
38#include <stdio.h>
39#include <stdlib.h>
40#include <str.h>
41#include <ui/entry.h>
42#include <ui/filedialog.h>
43#include <ui/fixed.h>
44#include <ui/image.h>
45#include <ui/label.h>
46#include <ui/list.h>
47#include <ui/menu.h>
48#include <ui/menubar.h>
49#include <ui/menudd.h>
50#include <ui/menuentry.h>
51#include <ui/msgdialog.h>
52#include <ui/pbutton.h>
53#include <ui/promptdialog.h>
54#include <ui/resource.h>
55#include <ui/selectdialog.h>
56#include <ui/tab.h>
57#include <ui/tabset.h>
58#include <ui/ui.h>
59#include <ui/window.h>
60#include "uidemo.h"
61
62static errno_t bitmap_moire(gfx_bitmap_t *, gfx_coord_t, gfx_coord_t);
63
64static void wnd_close(ui_window_t *, void *);
65
66static ui_window_cb_t window_cb = {
67 .close = wnd_close
68};
69
70static void pb_clicked(ui_pbutton_t *, void *);
71
72static ui_pbutton_cb_t pbutton_cb = {
73 .clicked = pb_clicked
74};
75
76static void checkbox_switched(ui_checkbox_t *, void *, bool);
77
78static ui_checkbox_cb_t checkbox_cb = {
79 .switched = checkbox_switched
80};
81
82static void rb_selected(ui_rbutton_group_t *, void *, void *);
83
84static ui_rbutton_group_cb_t rbutton_group_cb = {
85 .selected = rb_selected
86};
87
88static void slider_moved(ui_slider_t *, void *, gfx_coord_t);
89
90static ui_slider_cb_t slider_cb = {
91 .moved = slider_moved
92};
93
94static void scrollbar_up(ui_scrollbar_t *, void *);
95static void scrollbar_down(ui_scrollbar_t *, void *);
96static void scrollbar_page_up(ui_scrollbar_t *, void *);
97static void scrollbar_page_down(ui_scrollbar_t *, void *);
98static void scrollbar_moved(ui_scrollbar_t *, void *, gfx_coord_t);
99
100static ui_scrollbar_cb_t scrollbar_cb = {
101 .up = scrollbar_up,
102 .down = scrollbar_down,
103 .page_up = scrollbar_page_up,
104 .page_down = scrollbar_page_down,
105 .moved = scrollbar_moved
106};
107
108static void uidemo_file_load(ui_menu_entry_t *, void *);
109static void uidemo_file_message(ui_menu_entry_t *, void *);
110static void uidemo_file_exit(ui_menu_entry_t *, void *);
111static void uidemo_edit_modify(ui_menu_entry_t *, void *);
112static void uidemo_edit_insert_character(ui_menu_entry_t *, void *);
113
114static void file_dialog_bok(ui_file_dialog_t *, void *, const char *);
115static void file_dialog_bcancel(ui_file_dialog_t *, void *);
116static void file_dialog_close(ui_file_dialog_t *, void *);
117
118static ui_file_dialog_cb_t file_dialog_cb = {
119 .bok = file_dialog_bok,
120 .bcancel = file_dialog_bcancel,
121 .close = file_dialog_close
122};
123
124static void prompt_dialog_bok(ui_prompt_dialog_t *, void *, const char *);
125static void prompt_dialog_bcancel(ui_prompt_dialog_t *, void *);
126static void prompt_dialog_close(ui_prompt_dialog_t *, void *);
127
128static ui_prompt_dialog_cb_t prompt_dialog_cb = {
129 .bok = prompt_dialog_bok,
130 .bcancel = prompt_dialog_bcancel,
131 .close = prompt_dialog_close
132};
133
134static void select_dialog_bok(ui_select_dialog_t *, void *, void *);
135static void select_dialog_bcancel(ui_select_dialog_t *, void *);
136static void select_dialog_close(ui_select_dialog_t *, void *);
137
138static ui_select_dialog_cb_t select_dialog_cb = {
139 .bok = select_dialog_bok,
140 .bcancel = select_dialog_bcancel,
141 .close = select_dialog_close
142};
143
144static void msg_dialog_button(ui_msg_dialog_t *, void *, unsigned);
145static void msg_dialog_close(ui_msg_dialog_t *, void *);
146
147static ui_msg_dialog_cb_t msg_dialog_cb = {
148 .button = msg_dialog_button,
149 .close = msg_dialog_close
150};
151
152/** Horizontal alignment selected by each radio button */
153static const gfx_halign_t uidemo_halign[3] = {
154 gfx_halign_left,
155 gfx_halign_center,
156 gfx_halign_right
157};
158
159/** Window close button was clicked.
160 *
161 * @param window Window
162 * @param arg Argument (demo)
163 */
164static void wnd_close(ui_window_t *window, void *arg)
165{
166 ui_demo_t *demo = (ui_demo_t *) arg;
167
168 ui_quit(demo->ui);
169}
170
171/** Push button was clicked.
172 *
173 * @param pbutton Push button
174 * @param arg Argument (demo)
175 */
176static void pb_clicked(ui_pbutton_t *pbutton, void *arg)
177{
178 ui_demo_t *demo = (ui_demo_t *) arg;
179 errno_t rc;
180
181 if (pbutton == demo->pb1) {
182 rc = ui_entry_set_text(demo->entry, "OK pressed");
183 if (rc != EOK)
184 printf("Error changing entry text.\n");
185 } else {
186 rc = ui_entry_set_text(demo->entry, "Cancel pressed");
187 if (rc != EOK)
188 printf("Error changing entry text.\n");
189 }
190}
191
192/** Check box was switched.
193 *
194 * @param checkbox Check box
195 * @param arg Argument (demo)
196 */
197static void checkbox_switched(ui_checkbox_t *checkbox, void *arg, bool enable)
198{
199 ui_demo_t *demo = (ui_demo_t *) arg;
200
201 ui_entry_set_read_only(demo->entry, enable);
202}
203
204/** Radio button was selected.
205 *
206 * @param rbgroup Radio button group
207 * @param garg Group argument (demo)
208 * @param barg Button argument
209 */
210static void rb_selected(ui_rbutton_group_t *rbgroup, void *garg, void *barg)
211{
212 ui_demo_t *demo = (ui_demo_t *) garg;
213 gfx_halign_t halign = *(gfx_halign_t *) barg;
214
215 ui_entry_set_halign(demo->entry, halign);
216 (void) ui_entry_paint(demo->entry);
217}
218
219/** Slider was moved.
220 *
221 * @param slider Slider
222 * @param arg Argument (demo)
223 * @param pos Position
224 */
225static void slider_moved(ui_slider_t *slider, void *arg, gfx_coord_t pos)
226{
227 ui_demo_t *demo = (ui_demo_t *) arg;
228 char *str;
229 errno_t rc;
230 int rv;
231
232 rv = asprintf(&str, "Slider at %d of %d", (int) pos,
233 ui_slider_length(slider));
234 if (rv < 0) {
235 printf("Out of memory.\n");
236 return;
237 }
238
239 rc = ui_entry_set_text(demo->entry, str);
240 if (rc != EOK)
241 printf("Error changing entry text.\n");
242 (void) ui_entry_paint(demo->entry);
243
244 free(str);
245}
246
247/** Scrollbar up button pressed.
248 *
249 * @param scrollbar Scrollbar
250 * @param arg Argument (demo)
251 */
252static void scrollbar_up(ui_scrollbar_t *scrollbar, void *arg)
253{
254 gfx_coord_t pos;
255
256 pos = ui_scrollbar_get_pos(scrollbar);
257 ui_scrollbar_set_pos(scrollbar, pos - 1);
258
259 pos = ui_scrollbar_get_pos(scrollbar);
260 scrollbar_moved(scrollbar, arg, pos);
261}
262
263/** Scrollbar down button pressed.
264 *
265 * @param scrollbar Scrollbar
266 * @param arg Argument (demo)
267 */
268static void scrollbar_down(ui_scrollbar_t *scrollbar, void *arg)
269{
270 gfx_coord_t pos;
271
272 pos = ui_scrollbar_get_pos(scrollbar);
273 ui_scrollbar_set_pos(scrollbar, pos + 1);
274
275 pos = ui_scrollbar_get_pos(scrollbar);
276 scrollbar_moved(scrollbar, arg, pos);
277}
278
279/** Scrollbar page up event.
280 *
281 * @param scrollbar Scrollbar
282 * @param arg Argument (demo)
283 */
284static void scrollbar_page_up(ui_scrollbar_t *scrollbar, void *arg)
285{
286 gfx_coord_t pos;
287
288 pos = ui_scrollbar_get_pos(scrollbar);
289 ui_scrollbar_set_pos(scrollbar, pos -
290 ui_scrollbar_trough_length(scrollbar) / 4);
291
292 pos = ui_scrollbar_get_pos(scrollbar);
293 scrollbar_moved(scrollbar, arg, pos);
294}
295
296/** Scrollbar page down event.
297 *
298 * @param scrollbar Scrollbar
299 * @param arg Argument (demo)
300 */
301static void scrollbar_page_down(ui_scrollbar_t *scrollbar, void *arg)
302{
303 gfx_coord_t pos;
304
305 pos = ui_scrollbar_get_pos(scrollbar);
306 ui_scrollbar_set_pos(scrollbar, pos +
307 ui_scrollbar_trough_length(scrollbar) / 4);
308
309 pos = ui_scrollbar_get_pos(scrollbar);
310 scrollbar_moved(scrollbar, arg, pos);
311}
312
313/** Scrollbar was moved.
314 *
315 * @param scrollbar Scrollbar
316 * @param arg Argument (demo)
317 * @param pos Position
318 */
319static void scrollbar_moved(ui_scrollbar_t *scrollbar, void *arg,
320 gfx_coord_t pos)
321{
322 ui_demo_t *demo = (ui_demo_t *) arg;
323 char *str;
324 errno_t rc;
325 int rv;
326
327 rv = asprintf(&str, "Scrollbar: %d of %d", (int) pos,
328 ui_scrollbar_move_length(scrollbar));
329 if (rv < 0) {
330 printf("Out of memory.\n");
331 return;
332 }
333
334 rc = ui_entry_set_text(demo->entry, str);
335 if (rc != EOK)
336 printf("Error changing entry text.\n");
337 (void) ui_entry_paint(demo->entry);
338
339 free(str);
340}
341
342/** Display a message window.
343 *
344 * @param demo UI demo
345 * @param caption Window caption
346 * @param text Message text
347 */
348static void uidemo_show_message(ui_demo_t *demo, const char *caption,
349 const char *text)
350{
351 ui_msg_dialog_params_t mdparams;
352 ui_msg_dialog_t *dialog;
353 errno_t rc;
354
355 ui_msg_dialog_params_init(&mdparams);
356 mdparams.caption = caption;
357 mdparams.text = text;
358
359 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
360 if (rc != EOK) {
361 printf("Error creating message dialog.\n");
362 return;
363 }
364
365 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
366}
367
368/** File / Load menu entry selected.
369 *
370 * @param mentry Menu entry
371 * @param arg Argument (demo)
372 */
373static void uidemo_file_load(ui_menu_entry_t *mentry, void *arg)
374{
375 ui_demo_t *demo = (ui_demo_t *) arg;
376 ui_file_dialog_params_t fdparams;
377 ui_file_dialog_t *dialog;
378 errno_t rc;
379
380 ui_file_dialog_params_init(&fdparams);
381 fdparams.caption = "Load File";
382
383 rc = ui_file_dialog_create(demo->ui, &fdparams, &dialog);
384 if (rc != EOK) {
385 printf("Error creating message dialog.\n");
386 return;
387 }
388
389 ui_file_dialog_set_cb(dialog, &file_dialog_cb, demo);
390}
391
392/** File / Message menu entry selected.
393 *
394 * @param mentry Menu entry
395 * @param arg Argument (demo)
396 */
397static void uidemo_file_message(ui_menu_entry_t *mentry, void *arg)
398{
399 ui_demo_t *demo = (ui_demo_t *) arg;
400 ui_msg_dialog_params_t mdparams;
401 ui_msg_dialog_t *dialog;
402 errno_t rc;
403
404 ui_msg_dialog_params_init(&mdparams);
405 mdparams.caption = "Message For You";
406 mdparams.text = "Hello, world!";
407
408 rc = ui_msg_dialog_create(demo->ui, &mdparams, &dialog);
409 if (rc != EOK) {
410 printf("Error creating message dialog.\n");
411 return;
412 }
413
414 ui_msg_dialog_set_cb(dialog, &msg_dialog_cb, &demo);
415}
416
417/** File / Exit menu entry selected.
418 *
419 * @param mentry Menu entry
420 * @param arg Argument (demo)
421 */
422static void uidemo_file_exit(ui_menu_entry_t *mentry, void *arg)
423{
424 ui_demo_t *demo = (ui_demo_t *) arg;
425
426 ui_quit(demo->ui);
427}
428
429/** Edit / Modify menu entry selected.
430 *
431 * @param mentry Menu entry
432 * @param arg Argument (demo)
433 */
434static void uidemo_edit_modify(ui_menu_entry_t *mentry, void *arg)
435{
436 ui_demo_t *demo = (ui_demo_t *) arg;
437 ui_prompt_dialog_params_t pdparams;
438 ui_prompt_dialog_t *dialog;
439 errno_t rc;
440
441 ui_prompt_dialog_params_init(&pdparams);
442 pdparams.caption = "Modify Entry Text";
443 pdparams.prompt = "Enter New Text";
444
445 rc = ui_prompt_dialog_create(demo->ui, &pdparams, &dialog);
446 if (rc != EOK) {
447 printf("Error creating prompt dialog.\n");
448 return;
449 }
450
451 ui_prompt_dialog_set_cb(dialog, &prompt_dialog_cb, demo);
452}
453
454/** Edit / Insert Character menu entry selected.
455 *
456 * @param mentry Menu entry
457 * @param arg Argument (demo)
458 */
459static void uidemo_edit_insert_character(ui_menu_entry_t *mentry, void *arg)
460{
461 ui_demo_t *demo = (ui_demo_t *) arg;
462 ui_select_dialog_params_t sdparams;
463 ui_select_dialog_t *dialog;
464 ui_list_entry_attr_t attr;
465 errno_t rc;
466
467 ui_select_dialog_params_init(&sdparams);
468 sdparams.caption = "Insert Character";
469 sdparams.prompt = "Select character to insert";
470
471 rc = ui_select_dialog_create(demo->ui, &sdparams, &dialog);
472 if (rc != EOK) {
473 printf("Error creating select dialog.\n");
474 return;
475 }
476
477 ui_list_entry_attr_init(&attr);
478 attr.caption = "Dollar sign ($)";
479 attr.arg = (void *)'$';
480 rc = ui_select_dialog_append(dialog, &attr);
481 if (rc != EOK) {
482 printf("Error appending entry to list.\n");
483 return;
484 }
485
486 ui_list_entry_attr_init(&attr);
487 attr.caption = "Hash sign (#)";
488 attr.arg = (void *)'#';
489 rc = ui_select_dialog_append(dialog, &attr);
490 if (rc != EOK) {
491 printf("Error appending entry to list.\n");
492 return;
493 }
494
495 ui_list_entry_attr_init(&attr);
496 attr.caption = "Question mark (?)";
497 attr.arg = (void *)'?';
498 rc = ui_select_dialog_append(dialog, &attr);
499 if (rc != EOK) {
500 printf("Error appending entry to list.\n");
501 return;
502 }
503
504 ui_select_dialog_set_cb(dialog, &select_dialog_cb, demo);
505
506 (void) ui_select_dialog_paint(dialog);
507}
508
509/** File dialog OK button press.
510 *
511 * @param dialog File dialog
512 * @param arg Argument (ui_demo_t *)
513 * @param fname File name
514 */
515static void file_dialog_bok(ui_file_dialog_t *dialog, void *arg,
516 const char *fname)
517{
518 ui_demo_t *demo = (ui_demo_t *) arg;
519 char buf[128];
520 char *p;
521 FILE *f;
522
523 ui_file_dialog_destroy(dialog);
524
525 f = fopen(fname, "rt");
526 if (f == NULL) {
527 uidemo_show_message(demo, "Error", "Error opening file.");
528 return;
529 }
530
531 p = fgets(buf, sizeof(buf), f);
532 if (p == NULL) {
533 uidemo_show_message(demo, "Error", "Error reading file.");
534 fclose(f);
535 return;
536 }
537
538 /* Cut string off at the first non-printable character */
539 p = buf;
540 while (*p != '\0') {
541 if (*p < ' ') {
542 *p = '\0';
543 break;
544 }
545 ++p;
546 }
547
548 ui_entry_set_text(demo->entry, buf);
549 fclose(f);
550}
551
552/** File dialog cancel button press.
553 *
554 * @param dialog File dialog
555 * @param arg Argument (ui_demo_t *)
556 */
557static void file_dialog_bcancel(ui_file_dialog_t *dialog, void *arg)
558{
559 ui_demo_t *demo = (ui_demo_t *) arg;
560
561 (void) demo;
562 ui_file_dialog_destroy(dialog);
563}
564
565/** File dialog close request.
566 *
567 * @param dialog File dialog
568 * @param arg Argument (ui_demo_t *)
569 */
570static void file_dialog_close(ui_file_dialog_t *dialog, void *arg)
571{
572 ui_demo_t *demo = (ui_demo_t *) arg;
573
574 (void) demo;
575 ui_file_dialog_destroy(dialog);
576}
577
578/** Prompt dialog OK button press.
579 *
580 * @param dialog Prompt dialog
581 * @param arg Argument (ui_demo_t *)
582 * @param text Submitted text
583 */
584static void prompt_dialog_bok(ui_prompt_dialog_t *dialog, void *arg,
585 const char *text)
586{
587 ui_demo_t *demo = (ui_demo_t *) arg;
588
589 ui_prompt_dialog_destroy(dialog);
590 ui_entry_set_text(demo->entry, text);
591}
592
593/** Prompt dialog cancel button press.
594 *
595 * @param dialog Prompt dialog
596 * @param arg Argument (ui_demo_t *)
597 */
598static void prompt_dialog_bcancel(ui_prompt_dialog_t *dialog, void *arg)
599{
600 ui_demo_t *demo = (ui_demo_t *) arg;
601
602 (void) demo;
603 ui_prompt_dialog_destroy(dialog);
604}
605
606/** Prompt dialog close request.
607 *
608 * @param dialog Prompt dialog
609 * @param arg Argument (ui_demo_t *)
610 */
611static void prompt_dialog_close(ui_prompt_dialog_t *dialog, void *arg)
612{
613 ui_demo_t *demo = (ui_demo_t *) arg;
614
615 (void) demo;
616 ui_prompt_dialog_destroy(dialog);
617}
618
619/** Select dialog OK button press.
620 *
621 * @param dialog Select dialog
622 * @param arg Argument (ui_demo_t *)
623 * @param text Submitted text
624 */
625static void select_dialog_bok(ui_select_dialog_t *dialog, void *arg,
626 void *earg)
627{
628 ui_demo_t *demo = (ui_demo_t *) arg;
629 char str[2];
630
631 ui_select_dialog_destroy(dialog);
632 str[0] = (char)(intptr_t)earg;
633 str[1] = '\0';
634 (void) ui_entry_insert_str(demo->entry, str);
635}
636
637/** Select dialog cancel button press.
638 *
639 * @param dialog Select dialog
640 * @param arg Argument (ui_demo_t *)
641 */
642static void select_dialog_bcancel(ui_select_dialog_t *dialog, void *arg)
643{
644 ui_demo_t *demo = (ui_demo_t *) arg;
645
646 (void) demo;
647 ui_select_dialog_destroy(dialog);
648}
649
650/** Select dialog close request.
651 *
652 * @param dialog Select dialog
653 * @param arg Argument (ui_demo_t *)
654 */
655static void select_dialog_close(ui_select_dialog_t *dialog, void *arg)
656{
657 ui_demo_t *demo = (ui_demo_t *) arg;
658
659 (void) demo;
660 ui_select_dialog_destroy(dialog);
661}
662
663/** Message dialog button press.
664 *
665 * @param dialog Message dialog
666 * @param arg Argument (ui_demo_t *)
667 * @param bnum Button number
668 */
669static void msg_dialog_button(ui_msg_dialog_t *dialog, void *arg,
670 unsigned bnum)
671{
672 ui_demo_t *demo = (ui_demo_t *) arg;
673
674 (void) demo;
675 ui_msg_dialog_destroy(dialog);
676}
677
678/** Message dialog close request.
679 *
680 * @param dialog Message dialog
681 * @param arg Argument (ui_demo_t *)
682 */
683static void msg_dialog_close(ui_msg_dialog_t *dialog, void *arg)
684{
685 ui_demo_t *demo = (ui_demo_t *) arg;
686
687 (void) demo;
688 ui_msg_dialog_destroy(dialog);
689}
690
691/** Run UI demo on display server. */
692static errno_t ui_demo(const char *display_spec)
693{
694 ui_t *ui = NULL;
695 ui_wnd_params_t params;
696 ui_window_t *window = NULL;
697 ui_demo_t demo;
698 gfx_rect_t rect;
699 gfx_context_t *gc;
700 ui_resource_t *ui_res;
701 gfx_bitmap_params_t bparams;
702 gfx_bitmap_t *bitmap;
703 gfx_coord2_t off;
704 ui_menu_entry_t *mmsg;
705 ui_menu_entry_t *mload;
706 ui_menu_entry_t *mfoo;
707 ui_menu_entry_t *mbar;
708 ui_menu_entry_t *mfoobar;
709 ui_menu_entry_t *msep;
710 ui_menu_entry_t *mexit;
711 ui_menu_entry_t *mmodify;
712 ui_menu_entry_t *minsert_char;
713 ui_menu_entry_t *mabout;
714 ui_list_entry_attr_t eattr;
715 errno_t rc;
716
717 rc = ui_create(display_spec, &ui);
718 if (rc != EOK) {
719 printf("Error creating UI on display %s.\n", display_spec);
720 return rc;
721 }
722
723 memset((void *) &demo, 0, sizeof(demo));
724 demo.ui = ui;
725
726 ui_wnd_params_init(&params);
727 params.caption = "UI Demo";
728 params.style |= ui_wds_maximize_btn | ui_wds_resizable;
729
730 /* FIXME: Auto layout */
731 if (ui_is_textmode(ui)) {
732 params.rect.p0.x = 0;
733 params.rect.p0.y = 0;
734 params.rect.p1.x = 46;
735 params.rect.p1.y = 25;
736 } else {
737 params.rect.p0.x = 0;
738 params.rect.p0.y = 0;
739 params.rect.p1.x = 255;
740 params.rect.p1.y = 410;
741 }
742
743 /* Only allow making the window larger */
744 gfx_rect_dims(&params.rect, &params.min_size);
745
746 rc = ui_window_create(ui, &params, &window);
747 if (rc != EOK) {
748 printf("Error creating window.\n");
749 return rc;
750 }
751
752 ui_window_set_cb(window, &window_cb, (void *) &demo);
753 demo.window = window;
754
755 ui_res = ui_window_get_res(window);
756 gc = ui_window_get_gc(window);
757
758 rc = ui_fixed_create(&demo.fixed);
759 if (rc != EOK) {
760 printf("Error creating fixed layout.\n");
761 return rc;
762 }
763
764 rc = ui_menu_bar_create(ui, window, &demo.mbar);
765 if (rc != EOK) {
766 printf("Error creating menu bar.\n");
767 return rc;
768 }
769
770 rc = ui_menu_dd_create(demo.mbar, "~F~ile", NULL, &demo.mfile);
771 if (rc != EOK) {
772 printf("Error creating menu.\n");
773 return rc;
774 }
775
776 rc = ui_menu_entry_create(demo.mfile, "~M~essage", "", &mmsg);
777 if (rc != EOK) {
778 printf("Error creating menu.\n");
779 return rc;
780 }
781
782 ui_menu_entry_set_cb(mmsg, uidemo_file_message, (void *) &demo);
783
784 rc = ui_menu_entry_create(demo.mfile, "~L~oad", "", &mload);
785 if (rc != EOK) {
786 printf("Error creating menu.\n");
787 return rc;
788 }
789
790 ui_menu_entry_set_cb(mload, uidemo_file_load, (void *) &demo);
791
792 rc = ui_menu_entry_create(demo.mfile, "~F~oo", "Ctrl-Alt-Del", &mfoo);
793 if (rc != EOK) {
794 printf("Error creating menu.\n");
795 return rc;
796 }
797
798 rc = ui_menu_entry_create(demo.mfile, "~B~ar", "", &mbar);
799 if (rc != EOK) {
800 printf("Error creating menu.\n");
801 return rc;
802 }
803
804 rc = ui_menu_entry_create(demo.mfile, "F~o~obar", "", &mfoobar);
805 if (rc != EOK) {
806 printf("Error creating menu.\n");
807 return rc;
808 }
809
810 ui_menu_entry_set_disabled(mfoobar, true);
811
812 rc = ui_menu_entry_sep_create(demo.mfile, &msep);
813 if (rc != EOK) {
814 printf("Error creating menu.\n");
815 return rc;
816 }
817
818 rc = ui_menu_entry_create(demo.mfile, "E~x~it", "Alt-F4", &mexit);
819 if (rc != EOK) {
820 printf("Error creating menu.\n");
821 return rc;
822 }
823
824 ui_menu_entry_set_cb(mexit, uidemo_file_exit, (void *) &demo);
825
826 rc = ui_menu_dd_create(demo.mbar, "~E~dit", NULL, &demo.medit);
827 if (rc != EOK) {
828 printf("Error creating menu.\n");
829 return rc;
830 }
831
832 rc = ui_menu_entry_create(demo.medit, "~M~odify", "", &mmodify);
833 if (rc != EOK) {
834 printf("Error creating menu.\n");
835 return rc;
836 }
837
838 ui_menu_entry_set_cb(mmodify, uidemo_edit_modify, (void *) &demo);
839
840 rc = ui_menu_entry_create(demo.medit, "~I~nsert Character",
841 "", &minsert_char);
842 if (rc != EOK) {
843 printf("Error creating menu.\n");
844 return rc;
845 }
846
847 ui_menu_entry_set_cb(minsert_char, uidemo_edit_insert_character,
848 (void *) &demo);
849
850 rc = ui_menu_dd_create(demo.mbar, "~P~references", NULL,
851 &demo.mpreferences);
852 if (rc != EOK) {
853 printf("Error creating menu.\n");
854 return rc;
855 }
856
857 rc = ui_menu_dd_create(demo.mbar, "~H~elp", NULL, &demo.mhelp);
858 if (rc != EOK) {
859 printf("Error creating menu.\n");
860 return rc;
861 }
862
863 rc = ui_menu_entry_create(demo.mhelp, "~A~bout", "Ctrl-H, F1", &mabout);
864 if (rc != EOK) {
865 printf("Error creating menu.\n");
866 return rc;
867 }
868
869 /* FIXME: Auto layout */
870 if (ui_is_textmode(ui)) {
871 rect.p0.x = 1;
872 rect.p0.y = 1;
873 rect.p1.x = 43;
874 rect.p1.y = 2;
875 } else {
876 rect.p0.x = 4;
877 rect.p0.y = 30;
878 rect.p1.x = 251;
879 rect.p1.y = 52;
880 }
881
882 ui_menu_bar_set_rect(demo.mbar, &rect);
883
884 rc = ui_fixed_add(demo.fixed, ui_menu_bar_ctl(demo.mbar));
885 if (rc != EOK) {
886 printf("Error adding control to layout.\n");
887 return rc;
888 }
889
890 rc = ui_tab_set_create(ui_res, &demo.tabset);
891 if (rc != EOK) {
892 printf("Error creating tab set.\n");
893 return rc;
894 }
895
896 /* FIXME: Auto layout */
897 if (ui_is_textmode(ui)) {
898 rect.p0.x = 2;
899 rect.p0.y = 2;
900 rect.p1.x = 44;
901 rect.p1.y = 24;
902 } else {
903 rect.p0.x = 8;
904 rect.p0.y = 53;
905 rect.p1.x = 250;
906 rect.p1.y = 405;
907 }
908
909 ui_tab_set_set_rect(demo.tabset, &rect);
910
911 rc = ui_tab_create(demo.tabset, "Basic", &demo.tbasic);
912 if (rc != EOK) {
913 printf("Error creating tab.\n");
914 return rc;
915 }
916
917 rc = ui_tab_create(demo.tabset, "Lists", &demo.tlists);
918 if (rc != EOK) {
919 printf("Error creating tab.\n");
920 return rc;
921 }
922
923 rc = ui_fixed_add(demo.fixed, ui_tab_set_ctl(demo.tabset));
924 if (rc != EOK) {
925 printf("Error adding control to layout.\n");
926 return rc;
927 }
928
929 rc = ui_fixed_create(&demo.bfixed);
930 if (rc != EOK) {
931 printf("Error creating fixed layout.\n");
932 return rc;
933 }
934
935 rc = ui_entry_create(window, "", &demo.entry);
936 if (rc != EOK) {
937 printf("Error creating entry.\n");
938 return rc;
939 }
940
941 /* FIXME: Auto layout */
942 if (ui_is_textmode(ui)) {
943 rect.p0.x = 4;
944 rect.p0.y = 5;
945 rect.p1.x = 41;
946 rect.p1.y = 6;
947 } else {
948 rect.p0.x = 15;
949 rect.p0.y = 88;
950 rect.p1.x = 205;
951 rect.p1.y = 113;
952 }
953
954 ui_entry_set_rect(demo.entry, &rect);
955 ui_entry_set_halign(demo.entry, gfx_halign_center);
956
957 rc = ui_fixed_add(demo.bfixed, ui_entry_ctl(demo.entry));
958 if (rc != EOK) {
959 printf("Error adding control to layout.\n");
960 return rc;
961 }
962
963 rc = ui_label_create(ui_res, "Text label", &demo.label);
964 if (rc != EOK) {
965 printf("Error creating label.\n");
966 return rc;
967 }
968
969 /* FIXME: Auto layout */
970 if (ui_is_textmode(ui)) {
971 rect.p0.x = 4;
972 rect.p0.y = 7;
973 rect.p1.x = 41;
974 rect.p1.y = 8;
975 } else {
976 rect.p0.x = 60;
977 rect.p0.y = 123;
978 rect.p1.x = 160;
979 rect.p1.y = 136;
980 }
981
982 ui_label_set_rect(demo.label, &rect);
983 ui_label_set_halign(demo.label, gfx_halign_center);
984
985 rc = ui_fixed_add(demo.bfixed, ui_label_ctl(demo.label));
986 if (rc != EOK) {
987 printf("Error adding control to layout.\n");
988 return rc;
989 }
990
991 rc = ui_pbutton_create(ui_res, "OK", &demo.pb1);
992 if (rc != EOK) {
993 printf("Error creating button.\n");
994 return rc;
995 }
996
997 ui_pbutton_set_cb(demo.pb1, &pbutton_cb, (void *) &demo);
998
999 /* FIXME: Auto layout */
1000 if (ui_is_textmode(ui)) {
1001 rect.p0.x = 4;
1002 rect.p0.y = 9;
1003 rect.p1.x = 15;
1004 rect.p1.y = 10;
1005 } else {
1006 rect.p0.x = 15;
1007 rect.p0.y = 146;
1008 rect.p1.x = 105;
1009 rect.p1.y = 174;
1010 }
1011
1012 ui_pbutton_set_rect(demo.pb1, &rect);
1013
1014 ui_pbutton_set_default(demo.pb1, true);
1015
1016 rc = ui_fixed_add(demo.bfixed, ui_pbutton_ctl(demo.pb1));
1017 if (rc != EOK) {
1018 printf("Error adding control to layout.\n");
1019 return rc;
1020 }
1021
1022 rc = ui_pbutton_create(ui_res, "Cancel", &demo.pb2);
1023 if (rc != EOK) {
1024 printf("Error creating button.\n");
1025 return rc;
1026 }
1027
1028 ui_pbutton_set_cb(demo.pb2, &pbutton_cb, (void *) &demo);
1029
1030 if (ui_is_textmode(ui)) {
1031 rect.p0.x = 30;
1032 rect.p0.y = 9;
1033 rect.p1.x = 41;
1034 rect.p1.y = 10;
1035 } else {
1036 rect.p0.x = 115;
1037 rect.p0.y = 146;
1038 rect.p1.x = 205;
1039 rect.p1.y = 174;
1040 }
1041
1042 ui_pbutton_set_rect(demo.pb2, &rect);
1043
1044 rc = ui_fixed_add(demo.bfixed, ui_pbutton_ctl(demo.pb2));
1045 if (rc != EOK) {
1046 printf("Error adding control to layout.\n");
1047 return rc;
1048 }
1049
1050 gfx_bitmap_params_init(&bparams);
1051 if (ui_is_textmode(ui)) {
1052 bparams.rect.p0.x = 0;
1053 bparams.rect.p0.y = 0;
1054 bparams.rect.p1.x = 37;
1055 bparams.rect.p1.y = 2;
1056 } else {
1057 bparams.rect.p0.x = 0;
1058 bparams.rect.p0.y = 0;
1059 bparams.rect.p1.x = 188;
1060 bparams.rect.p1.y = 24;
1061 }
1062
1063 rc = gfx_bitmap_create(gc, &bparams, NULL, &bitmap);
1064 if (rc != EOK)
1065 return rc;
1066
1067 rc = bitmap_moire(bitmap, bparams.rect.p1.x, bparams.rect.p1.y);
1068 if (rc != EOK)
1069 return rc;
1070
1071 rc = ui_image_create(ui_res, bitmap, &params.rect, &demo.image);
1072 if (rc != EOK) {
1073 printf("Error creating label.\n");
1074 return rc;
1075 }
1076
1077 if (ui_is_textmode(ui)) {
1078 off.x = 4;
1079 off.y = 11;
1080 } else {
1081 off.x = 15;
1082 off.y = 190;
1083 }
1084
1085 gfx_rect_translate(&off, &bparams.rect, &rect);
1086
1087 /* Adjust for frame width (2 x 1 pixel) */
1088 if (!ui_is_textmode(ui)) {
1089 ui_image_set_flags(demo.image, ui_imgf_frame);
1090 rect.p1.x += 2;
1091 rect.p1.y += 2;
1092 }
1093
1094 ui_image_set_rect(demo.image, &rect);
1095
1096 rc = ui_fixed_add(demo.bfixed, ui_image_ctl(demo.image));
1097 if (rc != EOK) {
1098 printf("Error adding control to layout.\n");
1099 return rc;
1100 }
1101
1102 rc = ui_checkbox_create(ui_res, "Read only", &demo.checkbox);
1103 if (rc != EOK) {
1104 printf("Error creating check box.\n");
1105 return rc;
1106 }
1107
1108 ui_checkbox_set_cb(demo.checkbox, &checkbox_cb, (void *) &demo);
1109
1110 /* FIXME: Auto layout */
1111 if (ui_is_textmode(ui)) {
1112 rect.p0.x = 4;
1113 rect.p0.y = 14;
1114 rect.p1.x = 14;
1115 rect.p1.y = 15;
1116 } else {
1117 rect.p0.x = 15;
1118 rect.p0.y = 225;
1119 rect.p1.x = 140;
1120 rect.p1.y = 245;
1121 }
1122
1123 ui_checkbox_set_rect(demo.checkbox, &rect);
1124
1125 rc = ui_fixed_add(demo.bfixed, ui_checkbox_ctl(demo.checkbox));
1126 if (rc != EOK) {
1127 printf("Error adding control to layout.\n");
1128 return rc;
1129 }
1130
1131 rc = ui_rbutton_group_create(ui_res, &demo.rbgroup);
1132 if (rc != EOK) {
1133 printf("Error creating radio button group.\n");
1134 return rc;
1135 }
1136
1137 rc = ui_rbutton_create(demo.rbgroup, "Left", (void *) &uidemo_halign[0],
1138 &demo.rbleft);
1139 if (rc != EOK) {
1140 printf("Error creating radio button.\n");
1141 return rc;
1142 }
1143
1144 ui_rbutton_group_set_cb(demo.rbgroup, &rbutton_group_cb,
1145 (void *) &demo);
1146
1147 /* FIXME: Auto layout */
1148 if (ui_is_textmode(ui)) {
1149 rect.p0.x = 4;
1150 rect.p0.y = 16;
1151 rect.p1.x = 14;
1152 rect.p1.y = 17;
1153 } else {
1154 rect.p0.x = 15;
1155 rect.p0.y = 255;
1156 rect.p1.x = 140;
1157 rect.p1.y = 275;
1158 }
1159 ui_rbutton_set_rect(demo.rbleft, &rect);
1160
1161 rc = ui_fixed_add(demo.bfixed, ui_rbutton_ctl(demo.rbleft));
1162 if (rc != EOK) {
1163 printf("Error adding control to layout.\n");
1164 return rc;
1165 }
1166
1167 rc = ui_rbutton_create(demo.rbgroup, "Center", (void *) &uidemo_halign[1],
1168 &demo.rbcenter);
1169 if (rc != EOK) {
1170 printf("Error creating radio button.\n");
1171 return rc;
1172 }
1173
1174 /* FIXME: Auto layout */
1175 if (ui_is_textmode(ui)) {
1176 rect.p0.x = 4;
1177 rect.p0.y = 17;
1178 rect.p1.x = 14;
1179 rect.p1.y = 18;
1180 } else {
1181 rect.p0.x = 15;
1182 rect.p0.y = 285;
1183 rect.p1.x = 140;
1184 rect.p1.y = 305;
1185 }
1186 ui_rbutton_set_rect(demo.rbcenter, &rect);
1187 ui_rbutton_select(demo.rbcenter);
1188
1189 rc = ui_fixed_add(demo.bfixed, ui_rbutton_ctl(demo.rbcenter));
1190 if (rc != EOK) {
1191 printf("Error adding control to layout.\n");
1192 return rc;
1193 }
1194
1195 rc = ui_rbutton_create(demo.rbgroup, "Right", (void *) &uidemo_halign[2],
1196 &demo.rbright);
1197 if (rc != EOK) {
1198 printf("Error creating radio button.\n");
1199 return rc;
1200 }
1201
1202 /* FIXME: Auto layout */
1203 if (ui_is_textmode(ui)) {
1204 rect.p0.x = 4;
1205 rect.p0.y = 18;
1206 rect.p1.x = 14;
1207 rect.p1.y = 19;
1208 } else {
1209 rect.p0.x = 15;
1210 rect.p0.y = 315;
1211 rect.p1.x = 140;
1212 rect.p1.y = 335;
1213 }
1214 ui_rbutton_set_rect(demo.rbright, &rect);
1215
1216 rc = ui_fixed_add(demo.bfixed, ui_rbutton_ctl(demo.rbright));
1217 if (rc != EOK) {
1218 printf("Error adding control to layout.\n");
1219 return rc;
1220 }
1221
1222 rc = ui_slider_create(ui_res, &demo.slider);
1223 if (rc != EOK) {
1224 printf("Error creating button.\n");
1225 return rc;
1226 }
1227
1228 ui_slider_set_cb(demo.slider, &slider_cb, (void *) &demo);
1229
1230 /* FIXME: Auto layout */
1231 if (ui_is_textmode(ui)) {
1232 rect.p0.x = 4;
1233 rect.p0.y = 20;
1234 rect.p1.x = 32;
1235 rect.p1.y = 21;
1236 } else {
1237 rect.p0.x = 15;
1238 rect.p0.y = 345;
1239 rect.p1.x = 130;
1240 rect.p1.y = 365;
1241 }
1242
1243 ui_slider_set_rect(demo.slider, &rect);
1244
1245 rc = ui_fixed_add(demo.bfixed, ui_slider_ctl(demo.slider));
1246 if (rc != EOK) {
1247 printf("Error adding control to layout.\n");
1248 return rc;
1249 }
1250
1251 rc = ui_scrollbar_create(ui, window, ui_sbd_horiz, &demo.hscrollbar);
1252 if (rc != EOK) {
1253 printf("Error creating scrollbar.\n");
1254 return rc;
1255 }
1256
1257 ui_scrollbar_set_cb(demo.hscrollbar, &scrollbar_cb, (void *) &demo);
1258
1259 /* FIXME: Auto layout */
1260 if (ui_is_textmode(ui)) {
1261 rect.p0.x = 4;
1262 rect.p0.y = 22;
1263 rect.p1.x = 42;
1264 rect.p1.y = 23;
1265 } else {
1266 rect.p0.x = 15;
1267 rect.p0.y = 375;
1268 rect.p1.x = 220;
1269 rect.p1.y = 398;
1270 }
1271
1272 ui_scrollbar_set_rect(demo.hscrollbar, &rect);
1273
1274 ui_scrollbar_set_thumb_length(demo.hscrollbar,
1275 ui_scrollbar_trough_length(demo.hscrollbar) / 4);
1276
1277 rc = ui_fixed_add(demo.bfixed, ui_scrollbar_ctl(demo.hscrollbar));
1278 if (rc != EOK) {
1279 printf("Error adding control to layout.\n");
1280 return rc;
1281 }
1282
1283 rc = ui_scrollbar_create(ui, window, ui_sbd_vert, &demo.vscrollbar);
1284 if (rc != EOK) {
1285 printf("Error creating button.\n");
1286 return rc;
1287 }
1288
1289 ui_scrollbar_set_cb(demo.vscrollbar, &scrollbar_cb, (void *) &demo);
1290
1291 /* FIXME: Auto layout */
1292 if (ui_is_textmode(ui)) {
1293 rect.p0.x = 42;
1294 rect.p0.y = 5;
1295 rect.p1.x = 43;
1296 rect.p1.y = 22;
1297 } else {
1298 rect.p0.x = 220;
1299 rect.p0.y = 88;
1300 rect.p1.x = 243;
1301 rect.p1.y = 375;
1302 }
1303
1304 ui_scrollbar_set_rect(demo.vscrollbar, &rect);
1305
1306 ui_scrollbar_set_thumb_length(demo.vscrollbar,
1307 ui_scrollbar_trough_length(demo.vscrollbar) / 4);
1308
1309 rc = ui_fixed_add(demo.bfixed, ui_scrollbar_ctl(demo.vscrollbar));
1310 if (rc != EOK) {
1311 printf("Error adding control to layout.\n");
1312 return rc;
1313 }
1314
1315 ui_tab_add(demo.tbasic, ui_fixed_ctl(demo.bfixed));
1316
1317 rc = ui_fixed_create(&demo.lfixed);
1318 if (rc != EOK) {
1319 printf("Error creating fixed layout.\n");
1320 return rc;
1321 }
1322
1323 rc = ui_list_create(window, false, &demo.list);
1324 if (rc != EOK) {
1325 printf("Error creating list.\n");
1326 return rc;
1327 }
1328
1329 ui_list_entry_attr_init(&eattr);
1330
1331 eattr.caption = "One";
1332 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1333 if (rc != EOK) {
1334 printf("Error adding list entry.\n");
1335 return rc;
1336 }
1337
1338 eattr.caption = "Two";
1339 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1340 if (rc != EOK) {
1341 printf("Error adding list entry.\n");
1342 return rc;
1343 }
1344
1345 eattr.caption = "Three";
1346 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1347 if (rc != EOK) {
1348 printf("Error adding list entry.\n");
1349 return rc;
1350 }
1351
1352 eattr.caption = "Four";
1353 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1354 if (rc != EOK) {
1355 printf("Error adding list entry.\n");
1356 return rc;
1357 }
1358
1359 eattr.caption = "Five";
1360 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1361 if (rc != EOK) {
1362 printf("Error adding list entry.\n");
1363 return rc;
1364 }
1365
1366 eattr.caption = "Six";
1367 rc = ui_list_entry_append(demo.list, &eattr, NULL);
1368 if (rc != EOK) {
1369 printf("Error adding list entry.\n");
1370 return rc;
1371 }
1372
1373 /* FIXME: Auto layout */
1374 if (ui_is_textmode(ui)) {
1375 rect.p0.x = 4;
1376 rect.p0.y = 5;
1377 rect.p1.x = 41;
1378 rect.p1.y = 10;
1379 } else {
1380 rect.p0.x = 15;
1381 rect.p0.y = 88;
1382 rect.p1.x = 245;
1383 rect.p1.y = 173;
1384 }
1385
1386 ui_list_set_rect(demo.list, &rect);
1387
1388 rc = ui_fixed_add(demo.lfixed, ui_list_ctl(demo.list));
1389 if (rc != EOK) {
1390 printf("Error adding control to layout.\n");
1391 return rc;
1392 }
1393
1394 ui_tab_add(demo.tlists, ui_fixed_ctl(demo.lfixed));
1395
1396 ui_window_add(window, ui_fixed_ctl(demo.fixed));
1397
1398 rc = ui_window_paint(window);
1399 if (rc != EOK) {
1400 printf("Error painting window.\n");
1401 return rc;
1402 }
1403
1404 ui_run(ui);
1405
1406 ui_window_destroy(window);
1407 ui_destroy(ui);
1408
1409 return EOK;
1410}
1411
1412/** Fill bitmap with moire pattern.
1413 *
1414 * @param bitmap Bitmap
1415 * @param w Bitmap width
1416 * @param h Bitmap height
1417 * @return EOK on success or an error code
1418 */
1419static errno_t bitmap_moire(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
1420{
1421 int i, j;
1422 int k;
1423 pixelmap_t pixelmap;
1424 gfx_bitmap_alloc_t alloc;
1425 errno_t rc;
1426
1427 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
1428 if (rc != EOK)
1429 return rc;
1430
1431 /* In absence of anything else, use pixelmap */
1432 pixelmap.width = w;
1433 pixelmap.height = h;
1434 pixelmap.data = alloc.pixels;
1435
1436 for (i = 0; i < w; i++) {
1437 for (j = 0; j < h; j++) {
1438 k = i * i + j * j;
1439 pixelmap_put_pixel(&pixelmap, i, j,
1440 PIXEL(0, k, k, 255 - k));
1441 }
1442 }
1443
1444 return EOK;
1445}
1446
1447static void print_syntax(void)
1448{
1449 printf("Syntax: uidemo [-d <display-spec>]\n");
1450}
1451
1452int main(int argc, char *argv[])
1453{
1454 const char *display_spec = UI_ANY_DEFAULT;
1455 errno_t rc;
1456 int i;
1457
1458 i = 1;
1459 while (i < argc && argv[i][0] == '-') {
1460 if (str_cmp(argv[i], "-d") == 0) {
1461 ++i;
1462 if (i >= argc) {
1463 printf("Argument missing.\n");
1464 print_syntax();
1465 return 1;
1466 }
1467
1468 display_spec = argv[i++];
1469 } else {
1470 printf("Invalid option '%s'.\n", argv[i]);
1471 print_syntax();
1472 return 1;
1473 }
1474 }
1475
1476 if (i < argc) {
1477 print_syntax();
1478 return 1;
1479 }
1480
1481 rc = ui_demo(display_spec);
1482 if (rc != EOK)
1483 return 1;
1484
1485 return 0;
1486}
1487
1488/** @}
1489 */
Note: See TracBrowser for help on using the repository browser.