Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset bb14312 in mainline


Ignore:
Timestamp:
2021-06-26T16:40:28Z (4 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
1215db9
Parents:
69511176
Message:

Use hardware cursor in text mode

We extend GC with cursor control operations. This will also allow to
control the HW cursor when running display server in text mode in
the future (provided that we implement the missing bits in the rest
of the stack, i.e. in IPC GC and in the display server).

Location:
uspace/lib
Files:
3 added
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/congfx/src/console.c

    r69511176 rbb14312  
    5757static errno_t console_gc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
    5858static errno_t console_gc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
     59static errno_t console_gc_cursor_get_pos(void *, gfx_coord2_t *);
     60static errno_t console_gc_cursor_set_pos(void *, gfx_coord2_t *);
     61static errno_t console_gc_cursor_set_visible(void *, bool);
    5962
    6063gfx_context_ops_t console_gc_ops = {
     
    6669        .bitmap_destroy = console_gc_bitmap_destroy,
    6770        .bitmap_render = console_gc_bitmap_render,
    68         .bitmap_get_alloc = console_gc_bitmap_get_alloc
     71        .bitmap_get_alloc = console_gc_bitmap_get_alloc,
     72        .cursor_get_pos = console_gc_cursor_get_pos,
     73        .cursor_set_pos = console_gc_cursor_set_pos,
     74        .cursor_set_visible = console_gc_cursor_set_visible
    6975};
    7076
     
    435441}
    436442
     443/** Get cursor position on console GC.
     444 *
     445 * @param arg Console GC
     446 * @param pos Place to store position
     447 *
     448 * @return EOK on success or an error code
     449 */
     450static errno_t console_gc_cursor_get_pos(void *arg, gfx_coord2_t *pos)
     451{
     452        console_gc_t *cgc = (console_gc_t *) arg;
     453        sysarg_t col;
     454        sysarg_t row;
     455        errno_t rc;
     456
     457        rc = console_get_pos(cgc->con, &col, &row);
     458        if (rc != EOK)
     459                return rc;
     460
     461        pos->x = col;
     462        pos->y = row;
     463        return EOK;
     464}
     465
     466/** Set cursor position on console GC.
     467 *
     468 * @param arg Console GC
     469 * @param pos New cursor position
     470 *
     471 * @return EOK on success or an error code
     472 */
     473static errno_t console_gc_cursor_set_pos(void *arg, gfx_coord2_t *pos)
     474{
     475        console_gc_t *cgc = (console_gc_t *) arg;
     476
     477        console_set_pos(cgc->con, pos->x, pos->y);
     478        return EOK;
     479}
     480
     481/** Set cursor visibility on console GC.
     482 *
     483 * @param arg Console GC
     484 * @param visible @c true iff cursor should be made visible
     485 *
     486 * @return EOK on success or an error code
     487 */
     488static errno_t console_gc_cursor_set_visible(void *arg, bool visible)
     489{
     490        console_gc_t *cgc = (console_gc_t *) arg;
     491
     492        console_cursor_visibility(cgc->con, visible);
     493        return EOK;
     494}
     495
    437496/** @}
    438497 */
  • uspace/lib/gfx/include/types/gfx/ops/context.h

    r69511176 rbb14312  
    4444#include <types/gfx/coord.h>
    4545#include <types/gfx/context.h>
     46#include <stdbool.h>
    4647
    4748/** Graphics context ops */
     
    6465        /** Get bitmap allocation info */
    6566        errno_t (*bitmap_get_alloc)(void *, gfx_bitmap_alloc_t *);
     67        /** Get hardware cursor position */
     68        errno_t (*cursor_get_pos)(void *, gfx_coord2_t *);
     69        /** Set hardware cursor position */
     70        errno_t (*cursor_set_pos)(void *, gfx_coord2_t *);
     71        /** Set hardware cursor visibility */
     72        errno_t (*cursor_set_visible)(void *, bool);
    6673} gfx_context_ops_t;
    6774
  • uspace/lib/gfx/meson.build

    r69511176 rbb14312  
    11#
    2 # Copyright (c) 2019 Jiri Svoboda
     2# Copyright (c) 2021 Jiri Svoboda
    33# All rights reserved.
    44#
     
    3232        'src/coord.c',
    3333        'src/context.c',
     34        'src/cursor.c',
    3435        'src/render.c'
    3536)
     
    3940        'test/color.c',
    4041        'test/coord.c',
     42        'test/cursor.c',
    4143        'test/main.c',
    4244        'test/render.c',
  • uspace/lib/gfx/test/main.c

    r69511176 rbb14312  
    11/*
    2  * Copyright (c) 2017 Jiri Svoboda
     2 * Copyright (c) 2021 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434PCUT_IMPORT(color);
    3535PCUT_IMPORT(coord);
     36PCUT_IMPORT(cursor);
    3637PCUT_IMPORT(render);
    3738
  • uspace/lib/ui/private/entry.h

    r69511176 rbb14312  
    6767extern void ui_entry_backspace(ui_entry_t *);
    6868extern ui_evclaim_t ui_entry_key_press_unmod(ui_entry_t *, kbd_event_t *);
     69extern void ui_entry_activate(ui_entry_t *);
     70extern void ui_entry_deactivate(ui_entry_t *);
    6971
    7072#endif
  • uspace/lib/ui/src/entry.c

    r69511176 rbb14312  
    3939#include <errno.h>
    4040#include <gfx/context.h>
     41#include <gfx/cursor.h>
    4142#include <gfx/render.h>
    4243#include <gfx/text.h>
     
    6263        ui_entry_vpad_text = 0,
    6364        ui_entry_cursor_overshoot = 1,
    64         ui_entry_cursor_width = 2,
    65         ui_entry_cursor_width_text = 1
     65        ui_entry_cursor_width = 2
    6666};
    6767
     
    107107        entry->halign = gfx_halign_left;
    108108        *rentry = entry;
     109
    109110        return EOK;
    110111}
     
    194195        gfx_rect_t rect;
    195196        gfx_font_metrics_t metrics;
    196         gfx_coord_t w;
    197197        errno_t rc;
    198198
    199199        res = ui_window_get_res(entry->window);
    200200
     201        if (res->textmode) {
     202                rc = gfx_cursor_set_pos(res->gc, pos);
     203                return rc;
     204        }
     205
    201206        gfx_font_get_metrics(res->font, &metrics);
    202 
    203         w = res->textmode ? ui_entry_cursor_width_text :
    204             ui_entry_cursor_width;
    205207
    206208        rect.p0.x = pos->x;
    207209        rect.p0.y = pos->y - ui_entry_cursor_overshoot;
    208         rect.p1.x = pos->x + w;
     210        rect.p1.x = pos->x + ui_entry_cursor_width;
    209211        rect.p1.y = pos->y + metrics.ascent + metrics.descent + 1 +
    210212            ui_entry_cursor_overshoot;
     
    399401                ui_entry_backspace(entry);
    400402
    401         if (event->key == KC_ESCAPE) {
    402                 entry->active = false;
    403                 (void) ui_entry_paint(entry);
    404         }
     403        if (event->key == KC_ESCAPE)
     404                ui_entry_deactivate(entry);
    405405
    406406        return ui_claimed;
     
    475475
    476476                if (gfx_pix_inside_rect(&pos, &entry->rect)) {
    477                         if (!entry->active) {
    478                                 entry->active = true;
    479                                 (void) ui_entry_paint(entry);
    480                         }
     477                        ui_entry_activate(entry);
    481478
    482479                        return ui_claimed;
    483480                } else {
    484                         if (entry->active) {
    485                                 entry->active = false;
    486                                 (void) ui_entry_paint(entry);
    487                         }
     481                        ui_entry_deactivate(entry);
    488482                }
    489483        }
     
    518512}
    519513
     514/** Activate text entry.
     515 *
     516 * @param entry Text entry
     517 */
     518void ui_entry_activate(ui_entry_t *entry)
     519{
     520        ui_resource_t *res;
     521
     522        res = ui_window_get_res(entry->window);
     523
     524        if (entry->active)
     525                return;
     526
     527        entry->active = true;
     528        (void) ui_entry_paint(entry);
     529
     530        if (res->textmode)
     531                gfx_cursor_set_visible(res->gc, true);
     532}
     533
     534/** Deactivate text entry.
     535 *
     536 * @param entry Text entry
     537 */
     538void ui_entry_deactivate(ui_entry_t *entry)
     539{
     540        ui_resource_t *res;
     541
     542        res = ui_window_get_res(entry->window);
     543
     544        if (!entry->active)
     545                return;
     546
     547        entry->active = false;
     548        (void) ui_entry_paint(entry);
     549
     550        if (res->textmode)
     551                gfx_cursor_set_visible(res->gc, false);
     552}
     553
    520554/** @}
    521555 */
  • uspace/lib/ui/src/ui.c

    r69511176 rbb14312  
    128128                        return EIO;
    129129
     130                console_cursor_visibility(console, false);
     131
    130132                /* ws == ui_ws_console */
    131133                rc = ui_create_cons(console, &ui);
     
    203205                if (ui->cgc != NULL)
    204206                        console_gc_delete(ui->cgc);
    205                 if (ui->console != NULL)
     207                if (ui->console != NULL) {
     208                        console_cursor_visibility(ui->console, true);
    206209                        console_done(ui->console);
     210                }
    207211                if (ui->display != NULL)
    208212                        display_close(ui->display);
  • uspace/lib/ui/test/entry.c

    r69511176 rbb14312  
    270270}
    271271
     272/** ui_entry_activate() / ui_entry_deactivate() */
     273PCUT_TEST(activate_deactivate)
     274{
     275        errno_t rc;
     276        ui_t *ui = NULL;
     277        ui_window_t *window = NULL;
     278        ui_wnd_params_t params;
     279        ui_entry_t *entry;
     280
     281        rc = ui_create_disp(NULL, &ui);
     282        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     283
     284        ui_wnd_params_init(&params);
     285        params.caption = "Hello";
     286
     287        rc = ui_window_create(ui, &params, &window);
     288        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     289        PCUT_ASSERT_NOT_NULL(window);
     290
     291        rc = ui_entry_create(window, "ABC", &entry);
     292        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     293
     294        PCUT_ASSERT_FALSE(entry->active);
     295
     296        ui_entry_activate(entry);
     297        PCUT_ASSERT_TRUE(entry->active);
     298
     299        ui_entry_deactivate(entry);
     300        PCUT_ASSERT_FALSE(entry->active);
     301
     302        ui_entry_destroy(entry);
     303        ui_window_destroy(window);
     304        ui_destroy(ui);
     305}
     306
    272307PCUT_EXPORT(entry);
Note: See TracChangeset for help on using the changeset viewer.