source: mainline/uspace/app/uidemo/uidemo.c@ 37087c8

ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 37087c8 was c0757e1f, checked in by Jiri Svoboda <jiri@…>, 2 years ago

UI display configuration utility

In addition to the command-line utility 'disp', we introduce its UI
equivalent 'display-cfg'. Currently this allows the user to configure
seats in a very comfortable way.

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