Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/tetris/screen.c

    r28a5ebd r09f41d3  
    11/*
     2 * Copyright (c) 2024 Jiri Svoboda
    23 * Copyright (c) 2011 Martin Decky
    34 * All rights reserved.
     
    5455 */
    5556
     57#include <errno.h>
    5658#include <stdio.h>
    5759#include <stdlib.h>
     
    7173static int isset;               /* true => terminal is in game mode */
    7274
    73 static bool use_color;          /* true => use colors */
     75static bool use_rgb;          /* true => use RGB colors */
     76static bool use_color;          /* true => use indexed colors */
    7477
    7578static const struct shape *lastshape;
     
    7780static usec_t timeleft = 0;
    7881
     82bool size_changed;
    7983console_ctrl_t *console;
    8084
     
    9195static void start_standout(uint32_t color)
    9296{
     97        uint8_t bg;
     98        uint8_t attr;
     99
    93100        console_flush(console);
    94         console_set_rgb_color(console, use_color ? color : 0x000000,
    95             0xffffff);
     101        if (use_rgb) {
     102                console_set_rgb_color(console, color, 0xffffff);
     103        } else if (use_color) {
     104                bg = 0x00;
     105                attr = 0;
     106                if ((color & 0xff0000) != 0)
     107                        bg |= 0x4;
     108                if ((color & 0x00ff00) != 0)
     109                        bg |= 0x2;
     110                if ((color & 0x0000ff) != 0)
     111                        bg |= 0x1;
     112                console_set_color(console, bg, 0x00, attr);
     113        }
    96114}
    97115
     
    126144        console_cursor_visibility(console, 0);
    127145        resume_normal();
    128         scr_clear();
     146        scr_set();
    129147}
    130148
     
    142160}
    143161
    144 static bool get_display_color_sup(void)
     162static void get_display_color_sup(bool *rgb, bool *color)
    145163{
    146164        sysarg_t ccap;
    147165        errno_t rc = console_get_color_cap(console, &ccap);
    148166
    149         if (rc != EOK)
    150                 return false;
    151 
    152         return ((ccap & CONSOLE_CAP_RGB) == CONSOLE_CAP_RGB);
     167        if (rc != EOK) {
     168                *rgb = false;
     169                *color = false;
     170                return;
     171        }
     172
     173        if ((ccap & CONSOLE_CAP_CURSORCTL) == 0) {
     174                stop("Your screen does not support cursor control.\n");
     175                return;
     176        }
     177        *rgb = ((ccap & CONSOLE_CAP_RGB) == CONSOLE_CAP_RGB);
     178        *color = ((ccap & CONSOLE_CAP_INDEXED) == CONSOLE_CAP_INDEXED);
    153179}
    154180
     
    168194        }
    169195
    170         use_color = get_display_color_sup();
     196        get_display_color_sup(&use_rgb, &use_color);
    171197
    172198        if ((Rows < MINROWS) || (Cols < MINCOLS)) {
     
    174200
    175201                snprintf(smallscr, sizeof(smallscr),
    176                     "the screen is too small (must be at least %dx%d)",
     202                    "the screen is too small (must be at least %dx%d)\n",
    177203                    MINROWS, MINCOLS);
    178204                stop(smallscr);
     
    197223
    198224        fprintf(stderr, "aborting: %s", why);
    199         abort();
     225        exit(1);
    200226}
    201227
     
    340366{
    341367        usec_t timeout = fallrate;
     368        errno_t rc;
    342369
    343370        while (timeout > 0) {
    344371                cons_event_t event;
    345372
    346                 if (!console_get_event_timeout(console, &event, &timeout))
     373                rc = console_get_event_timeout(console, &event, &timeout);
     374                if (rc == ETIMEOUT)
    347375                        break;
     376                if (rc != EOK)
     377                        exit(1);
    348378        }
    349379}
     
    354384int tgetchar(void)
    355385{
     386        errno_t rc;
     387
    356388        /*
    357389         * Reset timeleft to fallrate whenever it is not positive
     
    376408                cons_event_t event;
    377409
    378                 if (!console_get_event_timeout(console, &event, &timeleft)) {
     410                rc = console_get_event_timeout(console, &event, &timeleft);
     411                if (rc == ETIMEOUT) {
    379412                        timeleft = 0;
    380413                        return -1;
    381414                }
     415                if (rc != EOK)
     416                        exit(1);
     417
     418                if (event.type == CEV_RESIZE)
     419                        size_changed = true;
    382420
    383421                if (event.type == CEV_KEY && event.ev.key.type == KEY_PRESS)
     
    394432{
    395433        char32_t c = 0;
     434        errno_t rc;
    396435
    397436        while (c == 0) {
    398437                cons_event_t event;
    399438
    400                 if (!console_get_event(console, &event))
     439                rc = console_get_event(console, &event);
     440                if (rc == ETIMEOUT)
    401441                        return -1;
     442                if (rc != EOK)
     443                        exit(1);
    402444
    403445                if (event.type == CEV_KEY && event.ev.key.type == KEY_PRESS)
Note: See TracChangeset for help on using the changeset viewer.