Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/gfxdemo/gfxdemo.c

    r0a411bbf rd0dfbba  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2026 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3636#include <display.h>
    3737#include <fibril.h>
     38#include <fibril_synch.h>
    3839#include <gfx/bitmap.h>
    3940#include <gfx/color.h>
     
    6162};
    6263
     64static void uiwnd_resize_event(ui_window_t *, void *);
    6365static void uiwnd_close_event(ui_window_t *, void *);
    6466static void uiwnd_kbd_event(ui_window_t *, void *, kbd_event_t *);
    6567
    6668static ui_window_cb_t ui_window_cb = {
     69        .resize = uiwnd_resize_event,
    6770        .close = uiwnd_close_event,
    6871        .kbd = uiwnd_kbd_event
     
    7881static gfx_coord_t vpad;
    7982static console_ctrl_t *con = NULL;
     83static bool textmode;
     84static console_gc_t *cgc = NULL;
     85static unsigned scr_width, scr_height;
    8086static ui_t *ui;
    8187
    8288/** Determine if we are running in text mode.
    8389 *
    84  * @param w Screen width
    85  * @param h Screen height
    8690 * @return @c true iff we are running in text mode
    8791 */
    88 static bool demo_is_text(gfx_coord_t w, gfx_coord_t h)
    89 {
    90         // XXX Need a proper way to determine text mode
    91         return w <= 80;
     92static bool demo_is_text(void)
     93{
     94        return textmode;
    9295}
    9396
     
    101104        usec_t usec;
    102105        cons_event_t cevent;
     106        sysarg_t cols, rows;
    103107
    104108        if (ui != NULL)
     
    115119                                                demo_kbd_event(&cevent.ev.key);
    116120                                                fibril_mutex_lock(&quit_lock);
     121                                        } else if (cevent.type == CEV_RESIZE) {
     122                                                rc = console_get_size(con,
     123                                                    &cols, &rows);
     124                                                if (rc == EOK) {
     125                                                        scr_width = cols;
     126                                                        scr_height = rows;
     127                                                }
     128                                                rc = console_gc_resize(cgc);
     129                                                if (rc != EOK)
     130                                                        exit(1);
    117131                                        }
    118132                                }
     
    181195
    182196        /* XXX Crude way of detecting text mode */
    183         if (w < 256) {
     197        if (demo_is_text()) {
    184198                /* Create dummy font for text mode */
    185199                rc = gfx_typeface_create(gc, &tface);
     
    270284
    271285        if (font != NULL) {
    272                 if (demo_is_text(w, h)) {
     286                if (demo_is_text()) {
    273287                        rc = gfx_color_new_ega(0x1e, &color);
    274288                        if (rc != EOK)
     
    719733        gfx_color_delete(color);
    720734
    721         if (demo_is_text(w, h)) {
     735        if (demo_is_text()) {
    722736                rc = gfx_color_new_ega(0x1f, &color);
    723737                if (rc != EOK)
     
    807821
    808822        for (i = 0; i < 8; i++) {
    809                 if (demo_is_text(w, h)) {
     823                if (demo_is_text()) {
    810824                        rc = gfx_color_new_ega(i != 0 ? i : 0x10, &color);
    811825                        if (rc != EOK)
     
    884898                gfx_color_delete(color);
    885899
    886                 if (demo_is_text(w, h)) {
     900                if (demo_is_text()) {
    887901                        rc = gfx_color_new_ega(0x1f, &color);
    888902                        if (rc != EOK)
     
    10261040 *
    10271041 * @param gc Graphic context
    1028  * @param w Width
    1029  * @param h Height
    1030  */
    1031 static errno_t demo_loop(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
    1032 {
    1033         errno_t rc;
    1034 
    1035         (void) demo_font_init(gc, w, h);
     1042 */
     1043static errno_t demo_loop(gfx_context_t *gc)
     1044{
     1045        errno_t rc;
     1046
     1047        (void) demo_font_init(gc, scr_width, scr_height);
    10361048
    10371049        while (!quit) {
    1038                 rc = demo_rects(gc, w, h);
    1039                 if (rc != EOK)
    1040                         goto error;
    1041 
    1042                 rc = demo_bitmap(gc, w, h);
    1043                 if (rc != EOK)
    1044                         goto error;
    1045 
    1046                 rc = demo_bitmap2(gc, w, h);
    1047                 if (rc != EOK)
    1048                         goto error;
    1049 
    1050                 rc = demo_bitmap_kc(gc, w, h);
    1051                 if (rc != EOK)
    1052                         goto error;
    1053 
    1054                 rc = demo_text(gc, w, h);
    1055                 if (rc != EOK)
    1056                         goto error;
    1057 
    1058                 rc = demo_text_abbr(gc, w, h);
    1059                 if (rc != EOK)
    1060                         goto error;
    1061 
    1062                 rc = demo_clip(gc, w, h);
     1050                rc = demo_rects(gc, scr_width, scr_height);
     1051                if (rc != EOK)
     1052                        goto error;
     1053
     1054                rc = demo_bitmap(gc, scr_width, scr_height);
     1055                if (rc != EOK)
     1056                        goto error;
     1057
     1058                rc = demo_bitmap2(gc, scr_width, scr_height);
     1059                if (rc != EOK)
     1060                        goto error;
     1061
     1062                rc = demo_bitmap_kc(gc, scr_width, scr_height);
     1063                if (rc != EOK)
     1064                        goto error;
     1065
     1066                rc = demo_text(gc, scr_width, scr_height);
     1067                if (rc != EOK)
     1068                        goto error;
     1069
     1070                rc = demo_text_abbr(gc, scr_width, scr_height);
     1071                if (rc != EOK)
     1072                        goto error;
     1073
     1074                rc = demo_clip(gc, scr_width, scr_height);
    10631075                if (rc != EOK)
    10641076                        goto error;
     
    10751087static errno_t demo_console(void)
    10761088{
    1077         console_gc_t *cgc = NULL;
    10781089        gfx_context_t *gc;
    10791090        sysarg_t cols, rows;
     
    10941105        gc = console_gc_get_ctx(cgc);
    10951106
    1096         rc = demo_loop(gc, cols, rows);
     1107        /* Currently console is always text. */
     1108        textmode = true;
     1109
     1110        scr_width = cols;
     1111        scr_height = rows;
     1112
     1113        rc = demo_loop(gc);
    10971114        if (rc != EOK)
    10981115                return rc;
     
    11111128
    11121129        ui_lock(args->ui);
    1113         rc = demo_loop(args->gc, args->dims.x, args->dims.y);
     1130        scr_width = args->dims.x;
     1131        scr_height = args->dims.y;
     1132        rc = demo_loop(args->gc);
    11141133        ui_unlock(args->ui);
    11151134        ui_quit(args->ui);
     
    11531172
    11541173        /* Do not decorate the window in fullscreen mode */
    1155         if (ui_is_fullscreen(ui))
     1174        if (ui_is_fullscreen(ui)) {
    11561175                params.style &= ~ui_wds_decorated;
     1176                params.placement = ui_wnd_place_full_screen;
     1177        }
    11571178
    11581179        /*
     
    11921213                task_retval(0);
    11931214
     1215        textmode = ui_is_textmode(ui);
     1216
    11941217        args.gc = gc;
    11951218        args.dims = dims;
     
    12531276        task_retval(0);
    12541277
    1255         rc = demo_loop(gc, 400, 300);
     1278        /* FIXME Assuming display service is not text mode. */
     1279        textmode = false;
     1280
     1281        scr_width = 400;
     1282        scr_height = 300;
     1283        rc = demo_loop(gc);
    12561284        if (rc != EOK)
    12571285                return rc;
     
    13051333        (void)arg;
    13061334        demo_kbd_event(event);
     1335}
     1336
     1337static void uiwnd_resize_event(ui_window_t *window, void *arg)
     1338{
     1339        gfx_rect_t rect;
     1340        gfx_coord2_t dims;
     1341
     1342        ui_window_get_app_rect(window, &rect);
     1343        gfx_rect_dims(&rect, &dims);
     1344        scr_width = dims.x;
     1345        scr_height = dims.y;
    13071346}
    13081347
     
    13491388        }
    13501389
    1351         if (i >= argc || str_cmp(argv[i], "display") == 0) {
    1352                 rc = demo_display(display_svc);
     1390        if (i >= argc || str_cmp(argv[i], "ui") == 0) {
     1391                rc = demo_ui(ui_display_spec);
    13531392                if (rc != EOK)
    13541393                        return 1;
     
    13571396                if (rc != EOK)
    13581397                        return 1;
    1359         } else if (str_cmp(argv[i], "ui") == 0) {
    1360                 rc = demo_ui(ui_display_spec);
     1398        } else if (str_cmp(argv[i], "display") == 0) {
     1399                rc = demo_display(display_svc);
    13611400                if (rc != EOK)
    13621401                        return 1;
Note: See TracChangeset for help on using the changeset viewer.