Ignore:
File:
1 edited

Legend:

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

    r77ffa01 r211fd68  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2012 Petr Koupy
    44 * All rights reserved.
     
    4141#include <fbfont/font-8x16.h>
    4242#include <io/chargrid.h>
     43#include <fibril.h>
    4344#include <gfx/bitmap.h>
    4445#include <gfx/context.h>
     
    8788static void term_set_rgb_color(con_srv_t *, pixel_t, pixel_t);
    8889static void term_set_cursor_visibility(con_srv_t *, bool);
     90static errno_t term_set_caption(con_srv_t *, const char *);
    8991static errno_t term_get_event(con_srv_t *, cons_event_t *);
    9092static errno_t term_map(con_srv_t *, sysarg_t, sysarg_t, charfield_t **);
     
    108110        .set_rgb_color = term_set_rgb_color,
    109111        .set_cursor_visibility = term_set_cursor_visibility,
     112        .set_caption = term_set_caption,
    110113        .get_event = term_get_event,
    111114        .map = term_map,
     
    115118
    116119static void terminal_close_event(ui_window_t *, void *);
    117 static void terminal_focus_event(ui_window_t *, void *);
     120static void terminal_focus_event(ui_window_t *, void *, unsigned);
    118121static void terminal_kbd_event(ui_window_t *, void *, kbd_event_t *);
    119122static void terminal_pos_event(ui_window_t *, void *, pos_event_t *);
    120 static void terminal_unfocus_event(ui_window_t *, void *);
     123static void terminal_unfocus_event(ui_window_t *, void *, unsigned);
    121124
    122125static ui_window_cb_t terminal_window_cb = {
     
    128131};
    129132
     133static errno_t terminal_wait_fibril(void *);
     134
    130135static terminal_t *srv_to_terminal(con_srv_t *srv)
    131136{
     
    133138}
    134139
    135 static void getterm(const char *svc, const char *app)
    136 {
    137         task_spawnl(NULL, NULL, APP_GETTERM, APP_GETTERM, svc,
     140static errno_t getterm(task_wait_t *wait, const char *svc, const char *app)
     141{
     142        return task_spawnl(NULL, wait, APP_GETTERM, APP_GETTERM, svc,
    138143            LOCFS_MOUNT_POINT, "--msg", "--wait", "--", app, NULL);
    139144}
     
    141146static pixel_t color_table[16] = {
    142147        [COLOR_BLACK]       = PIXEL(255, 0, 0, 0),
    143         [COLOR_BLUE]        = PIXEL(255, 0, 0, 240),
    144         [COLOR_GREEN]       = PIXEL(255, 0, 240, 0),
    145         [COLOR_CYAN]        = PIXEL(255, 0, 240, 240),
    146         [COLOR_RED]         = PIXEL(255, 240, 0, 0),
    147         [COLOR_MAGENTA]     = PIXEL(255, 240, 0, 240),
    148         [COLOR_YELLOW]      = PIXEL(255, 240, 240, 0),
    149         [COLOR_WHITE]       = PIXEL(255, 240, 240, 240),
    150 
    151         [COLOR_BLACK + 8]   = PIXEL(255, 0, 0, 0),
    152         [COLOR_BLUE + 8]    = PIXEL(255, 0, 0, 255),
    153         [COLOR_GREEN + 8]   = PIXEL(255, 0, 255, 0),
    154         [COLOR_CYAN + 8]    = PIXEL(255, 0, 255, 255),
    155         [COLOR_RED + 8]     = PIXEL(255, 255, 0, 0),
    156         [COLOR_MAGENTA + 8] = PIXEL(255, 255, 0, 255),
    157         [COLOR_YELLOW + 8]  = PIXEL(255, 255, 255, 0),
     148        [COLOR_BLUE]        = PIXEL(255, 0, 0, 170),
     149        [COLOR_GREEN]       = PIXEL(255, 0, 170, 0),
     150        [COLOR_CYAN]        = PIXEL(255, 0, 170, 170),
     151        [COLOR_RED]         = PIXEL(255, 170, 0, 0),
     152        [COLOR_MAGENTA]     = PIXEL(255, 170, 0, 170),
     153        [COLOR_YELLOW]      = PIXEL(255, 170, 85, 0),
     154        [COLOR_WHITE]       = PIXEL(255, 170, 170, 170),
     155
     156        [COLOR_BLACK + 8]   = PIXEL(255, 85, 85, 85),
     157        [COLOR_BLUE + 8]    = PIXEL(255, 85, 85, 255),
     158        [COLOR_GREEN + 8]   = PIXEL(255, 85, 255, 85),
     159        [COLOR_CYAN + 8]    = PIXEL(255, 85, 255, 255),
     160        [COLOR_RED + 8]     = PIXEL(255, 255, 85, 85),
     161        [COLOR_MAGENTA + 8] = PIXEL(255, 255, 85, 255),
     162        [COLOR_YELLOW + 8]  = PIXEL(255, 255, 255, 85),
    158163        [COLOR_WHITE + 8]   = PIXEL(255, 255, 255, 255),
    159164};
     
    165170                switch (attrs.val.style) {
    166171                case STYLE_NORMAL:
    167                         *bgcolor = color_table[COLOR_WHITE];
     172                        *bgcolor = color_table[COLOR_WHITE + 8];
    168173                        *fgcolor = color_table[COLOR_BLACK];
    169174                        break;
    170175                case STYLE_EMPHASIS:
    171                         *bgcolor = color_table[COLOR_WHITE];
    172                         *fgcolor = color_table[COLOR_RED];
     176                        *bgcolor = color_table[COLOR_WHITE + 8];
     177                        *fgcolor = color_table[COLOR_RED + 8];
    173178                        break;
    174179                case STYLE_INVERTED:
    175180                        *bgcolor = color_table[COLOR_BLACK];
    176                         *fgcolor = color_table[COLOR_WHITE];
     181                        *fgcolor = color_table[COLOR_WHITE + 8];
    177182                        break;
    178183                case STYLE_SELECTED:
    179                         *bgcolor = color_table[COLOR_RED];
    180                         *fgcolor = color_table[COLOR_WHITE];
     184                        *bgcolor = color_table[COLOR_RED + 8];
     185                        *fgcolor = color_table[COLOR_WHITE + 8];
    181186                        break;
    182187                }
    183188                break;
    184189        case CHAR_ATTR_INDEX:
    185                 *bgcolor = color_table[(attrs.val.index.bgcolor & 7) |
    186                     ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)];
     190                *bgcolor = color_table[(attrs.val.index.bgcolor & 7)];
    187191                *fgcolor = color_table[(attrs.val.index.fgcolor & 7) |
    188192                    ((attrs.val.index.attr & CATTR_BRIGHT) ? 8 : 0)];
     
    643647}
    644648
     649static errno_t term_set_caption(con_srv_t *srv, const char *caption)
     650{
     651        terminal_t *term = srv_to_terminal(srv);
     652        const char *cap;
     653
     654        fibril_mutex_lock(&term->mtx);
     655
     656        if (str_size(caption) > 0)
     657                cap = caption;
     658        else
     659                cap = "Terminal";
     660
     661        ui_window_set_caption(term->window, cap);
     662        fibril_mutex_unlock(&term->mtx);
     663
     664        term_update(term);
     665        gfx_update(term->gc);
     666        return EOK;
     667}
     668
    645669static errno_t term_get_event(con_srv_t *srv, cons_event_t *event)
    646670{
     
    805829        terminal_t *term = (terminal_t *) arg;
    806830
    807         (void) term;
    808 
    809         // XXX This is not really a clean way of terminating
    810         exit(0);
     831        ui_quit(term->ui);
    811832}
    812833
    813834/** Handle window focus event. */
    814 static void terminal_focus_event(ui_window_t *window, void *arg)
     835static void terminal_focus_event(ui_window_t *window, void *arg,
     836    unsigned nfocus)
    815837{
    816838        terminal_t *term = (terminal_t *) arg;
    817839
     840        (void)nfocus;
    818841        term->is_focused = true;
    819842        term_update(term);
     
    843866        sysarg_t sy = -term->off.y;
    844867
    845         if (event->type == POS_PRESS || event->type == POS_RELEASE) {
     868        if (event->type == POS_PRESS || event->type == POS_RELEASE ||
     869            event->type == POS_DCLICK) {
    846870                cevent.type = CEV_POS;
    847871                cevent.ev.pos.type = event->type;
     
    856880
    857881/** Handle window unfocus event. */
    858 static void terminal_unfocus_event(ui_window_t *window, void *arg)
     882static void terminal_unfocus_event(ui_window_t *window, void *arg,
     883    unsigned nfocus)
    859884{
    860885        terminal_t *term = (terminal_t *) arg;
    861886
    862         term->is_focused = false;
    863         term_update(term);
    864         gfx_update(term->gc);
     887        if (nfocus == 0) {
     888                term->is_focused = false;
     889                term_update(term);
     890                gfx_update(term->gc);
     891        }
    865892}
    866893
     
    888915
    889916errno_t terminal_create(const char *display_spec, sysarg_t width,
    890     sysarg_t height, terminal_flags_t flags, terminal_t **rterm)
     917    sysarg_t height, terminal_flags_t flags, const char *command,
     918    terminal_t **rterm)
    891919{
    892920        terminal_t *term;
     
    946974                wparams.placement = ui_wnd_place_top_left;
    947975
     976        rc = ui_create(display_spec, &term->ui);
     977        if (rc != EOK) {
     978                printf("Error creating UI on %s.\n", display_spec);
     979                goto error;
     980        }
     981
    948982        /*
    949983         * Compute window rectangle such that application area corresponds
    950984         * to rect
    951985         */
    952         ui_wdecor_rect_from_app(wparams.style, &rect, &wrect);
     986        ui_wdecor_rect_from_app(term->ui, wparams.style, &rect, &wrect);
    953987        off = wrect.p0;
    954988        gfx_rect_rtranslate(&off, &wrect, &wparams.rect);
    955989
    956990        term->off = off;
    957 
    958         rc = ui_create(display_spec, &term->ui);
    959         if (rc != EOK) {
    960                 printf("Error creating UI on %s.\n", display_spec);
    961                 goto error;
    962         }
    963991
    964992        rc = ui_window_create(term->ui, &wparams, &term->window);
     
    9941022        term->srvs.sarg = term;
    9951023
    996         rc = loc_server_register(NAME);
     1024        rc = loc_server_register(NAME, &term->srv);
    9971025        if (rc != EOK) {
    9981026                printf("Error registering server.\n");
     
    10051033            task_get_id());
    10061034
    1007         rc = loc_service_register(vc, &term->dsid);
     1035        rc = loc_service_register(term->srv, vc, &term->dsid);
    10081036        if (rc != EOK) {
    10091037                printf("Error registering service.\n");
     
    10131041
    10141042        list_append(&term->link, &terms);
    1015         getterm(vc, "/app/bdsh");
     1043        rc = getterm(&term->wait, vc, command);
     1044        if (rc != EOK)
     1045                goto error;
     1046
     1047        term->wfid = fibril_create(terminal_wait_fibril, term);
     1048        if (term->wfid == 0)
     1049                goto error;
     1050
     1051        fibril_add_ready(term->wfid);
    10161052
    10171053        term->is_focused = true;
     
    10271063        return EOK;
    10281064error:
     1065        if (term->dsid != 0)
     1066                loc_service_unregister(term->srv, term->dsid);
     1067        if (term->srv != NULL)
     1068                loc_server_unregister(term->srv);
    10291069        if (term->window != NULL)
    10301070                ui_window_destroy(term->window);
     
    10391079}
    10401080
     1081static errno_t terminal_wait_fibril(void *arg)
     1082{
     1083        terminal_t *term = (terminal_t *)arg;
     1084        task_exit_t texit;
     1085        int retval;
     1086
     1087        /*
     1088         * XXX There is no way to break the sleep if the task does not
     1089         * exit.
     1090         */
     1091        (void) task_wait(&term->wait, &texit, &retval);
     1092        ui_quit(term->ui);
     1093        return EOK;
     1094}
     1095
    10411096/** @}
    10421097 */
Note: See TracChangeset for help on using the changeset viewer.