Changeset 252d03c in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2021-04-28T09:22:39Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7470d97
Parents:
de227aba
Message:

Popping up a message, in text mode as well

Location:
uspace/lib/ui/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/msgdialog.c

    rde227aba r252d03c  
    4242#include <ui/pbutton.h>
    4343#include <ui/resource.h>
     44#include <ui/ui.h>
    4445#include <ui/window.h>
    4546#include "../private/msgdialog.h"
     
    9798        ui_wnd_params_init(&wparams);
    9899        wparams.caption = params->caption;
    99         wparams.rect.p0.x = 0;
    100         wparams.rect.p0.y = 0;
    101         wparams.rect.p1.x = 200;
    102         wparams.rect.p1.y = 110;
     100
     101        /* FIXME: Auto layout */
     102        if (ui_is_textmode(ui)) {
     103                wparams.rect.p0.x = 0;
     104                wparams.rect.p0.y = 0;
     105                wparams.rect.p1.x = 20;
     106                wparams.rect.p1.y = 7;
     107        } else {
     108                wparams.rect.p0.x = 0;
     109                wparams.rect.p0.y = 0;
     110                wparams.rect.p1.x = 200;
     111                wparams.rect.p1.y = 110;
     112        }
    103113
    104114        rc = ui_window_create(ui, &wparams, &window);
     
    118128                goto error;
    119129
    120         rect.p0.x = 10;
    121         rect.p0.y = 35;
    122         rect.p1.x = 190;
    123         rect.p1.y = 50;
     130        /* FIXME: Auto layout */
     131        if (ui_is_textmode(ui)) {
     132                rect.p0.x = 3;
     133                rect.p0.y = 2;
     134                rect.p1.x = 17;
     135                rect.p1.y = 3;
     136        } else {
     137                rect.p0.x = 10;
     138                rect.p0.y = 35;
     139                rect.p1.x = 190;
     140                rect.p1.y = 50;
     141        }
     142
    124143        ui_label_set_rect(label, &rect);
    125144        ui_label_set_halign(label, gfx_halign_center);
     
    137156        ui_pbutton_set_cb(bok, &ui_msg_dialog_btn_cb, dialog);
    138157
    139         rect.p0.x = 55;
    140         rect.p0.y = 60;
    141         rect.p1.x = 145;
    142         rect.p1.y = 88;
     158        /* FIXME: Auto layout */
     159        if (ui_is_textmode(ui)) {
     160                rect.p0.x = 8;
     161                rect.p0.y = 4;
     162                rect.p1.x = 12;
     163                rect.p1.y = 5;
     164        } else {
     165                rect.p0.x = 55;
     166                rect.p0.y = 60;
     167                rect.p1.x = 145;
     168                rect.p1.y = 88;
     169        }
     170
    143171        ui_pbutton_set_rect(bok, &rect);
    144172
  • uspace/lib/ui/src/ui.c

    rde227aba r252d03c  
    3434 */
    3535
     36#include <adt/list.h>
    3637#include <ctype.h>
    3738#include <display.h>
     
    4546#include <ui/ui.h>
    4647#include <ui/wdecor.h>
     48#include <ui/window.h>
    4749#include "../private/window.h"
    4850#include "../private/ui.h"
     
    104106        display_t *display;
    105107        console_ctrl_t *console;
     108        console_gc_t *cgc;
    106109        ui_winsys_t ws;
    107110        const char *osvc;
     
    131134                        return rc;
    132135                }
     136
     137                rc = console_gc_create(console, NULL, &cgc);
     138                if (rc != EOK) {
     139                        ui_destroy(ui);
     140                        console_done(console);
     141                        return rc;
     142                }
     143
     144                ui->cgc = cgc;
    133145        } else {
    134146                return EINVAL;
     
    154166
    155167        ui->console = console;
     168        list_initialize(&ui->windows);
    156169        *rui = ui;
    157170        return EOK;
     
    173186
    174187        ui->display = disp;
     188        list_initialize(&ui->windows);
    175189        *rui = ui;
    176190        return EOK;
     
    187201
    188202        if (ui->myoutput) {
     203                if (ui->cgc != NULL)
     204                        console_gc_delete(ui->cgc);
    189205                if (ui->console != NULL)
    190206                        console_done(ui->console);
     
    198214static void ui_cons_event_process(ui_t *ui, cons_event_t *event)
    199215{
    200         if (ui->root_wnd == NULL)
     216        ui_window_t *awnd;
     217        ui_evclaim_t claim;
     218
     219        awnd = ui_window_get_active(ui);
     220        if (awnd == NULL)
    201221                return;
    202222
    203223        switch (event->type) {
    204224        case CEV_KEY:
    205                 ui_window_send_kbd(ui->root_wnd, &event->ev.key);
     225                ui_window_send_kbd(awnd, &event->ev.key);
    206226                break;
    207227        case CEV_POS:
    208                 ui_wdecor_pos_event(ui->root_wnd->wdecor, &event->ev.pos);
    209                 ui_window_send_pos(ui->root_wnd, &event->ev.pos);
     228                claim = ui_wdecor_pos_event(awnd->wdecor, &event->ev.pos);
     229                /* Note: If event is claimed, awnd might not be valid anymore */
     230                if (claim == ui_unclaimed)
     231                        ui_window_send_pos(awnd, &event->ev.pos);
    210232                break;
    211233        }
     
    248270}
    249271
     272/** Repaint UI (only used in fullscreen mode).
     273 *
     274 * This is used when an area is exposed in fullscreen mode.
     275 *
     276 * @param ui UI
     277 * @return @c EOK on success or an error code
     278 */
     279errno_t ui_paint(ui_t *ui)
     280{
     281        errno_t rc;
     282        ui_window_t *awnd;
     283
     284        /* XXX Should repaint all windows */
     285        awnd = ui_window_get_active(ui);
     286        if (awnd == NULL)
     287                return EOK;
     288
     289        rc = ui_wdecor_paint(awnd->wdecor);
     290        if (rc != EOK)
     291                return rc;
     292
     293        return ui_window_paint(awnd);
     294}
     295
    250296/** Terminate user interface.
    251297 *
     
    275321}
    276322
     323/** Determine if we are emulating windows.
     324 *
     325 * @param ui User interface
     326 * @return @c true iff we are running in text mode
     327 */
     328bool ui_is_fullscreen(ui_t *ui)
     329{
     330        return (ui->display == NULL);
     331}
     332
    277333/** @}
    278334 */
  • uspace/lib/ui/src/wdecor.c

    rde227aba r252d03c  
    556556 * @param wdecor Window decoration
    557557 * @param pos_event Position event
    558  */
    559 void ui_wdecor_pos_event(ui_wdecor_t *wdecor, pos_event_t *event)
     558 * @return @c ui_claimed iff event was claimed
     559 */
     560ui_evclaim_t ui_wdecor_pos_event(ui_wdecor_t *wdecor, pos_event_t *event)
    560561{
    561562        gfx_coord2_t pos;
     
    571572                claim = ui_pbutton_pos_event(wdecor->btn_close, event);
    572573                if (claim == ui_claimed)
    573                         return;
     574                        return ui_claimed;
    574575        }
    575576
    576577        ui_wdecor_frame_pos_event(wdecor, event);
    577578
    578         if ((wdecor->style & ui_wds_titlebar) != 0)  {
     579        if ((wdecor->style & ui_wds_titlebar) != 0) {
    579580                if (event->type == POS_PRESS &&
    580                     gfx_pix_inside_rect(&pos, &geom.title_bar_rect))
     581                    gfx_pix_inside_rect(&pos, &geom.title_bar_rect)) {
    581582                        ui_wdecor_move(wdecor, &pos);
    582         }
     583                        return ui_claimed;
     584                }
     585        }
     586
     587        return ui_unclaimed;
    583588}
    584589
  • uspace/lib/ui/src/window.c

    rde227aba r252d03c  
    133133        gfx_bitmap_t *bmp = NULL;
    134134        mem_gc_t *memgc = NULL;
    135         console_gc_t *cgc = NULL;
    136135        errno_t rc;
    137 
    138         if (ui->root_wnd != NULL)
    139                 return EEXIST;
    140136
    141137        window = calloc(1, sizeof(ui_window_t));
     
    202198                        goto error;
    203199        } else if (ui->console != NULL) {
    204                 rc = console_gc_create(ui->console, NULL, &cgc);
    205                 if (rc != EOK)
    206                         goto error;
    207 
    208                 gc = console_gc_get_ctx(cgc);
     200                gc = console_gc_get_ctx(ui->cgc);
    209201        } else {
    210202                /* Needed for unit tests */
     
    257249        window->gc = gc;
    258250#endif
    259         window->cgc = cgc;
    260251
    261252        rc = ui_resource_create(window->gc, ui_is_textmode(ui), &res);
     
    282273        *rwindow = window;
    283274
    284         ui->root_wnd = window;
     275        list_append(&window->lwindows, &ui->windows);
    285276        return EOK;
    286277error:
     
    295286        if (dgc != NULL)
    296287                dummygc_destroy(dgc);
    297         if (cgc != NULL)
    298                 console_gc_delete(cgc);
    299288        if (dwindow != NULL)
    300289                display_window_destroy(dwindow);
     
    309298void ui_window_destroy(ui_window_t *window)
    310299{
     300        ui_t *ui;
     301
    311302        if (window == NULL)
    312303                return;
    313304
     305        ui = window->ui;
     306
     307        list_remove(&window->lwindows);
    314308        ui_control_destroy(window->control);
    315309        ui_wdecor_destroy(window->wdecor);
     
    328322        if (window->dwindow != NULL)
    329323                display_window_destroy(window->dwindow);
    330         if (window->cgc != NULL)
    331                 console_gc_delete(window->cgc);
     324
    332325        free(window);
     326
     327        /* Need to repaint if windows are emulated */
     328        if (ui_is_fullscreen(ui)) {
     329                ui_paint(ui);
     330        }
    333331}
    334332
     
    362360        window->control = NULL;
    363361        control->elemp = NULL;
     362}
     363
     364/** Get active window (only valid in fullscreen mode).
     365 *
     366 * @param ui User interface
     367 * @return Active window
     368 */
     369ui_window_t *ui_window_get_active(ui_t *ui)
     370{
     371        link_t *link;
     372
     373        link = list_last(&ui->windows);
     374        if (link == NULL)
     375                return NULL;
     376
     377        return list_get_instance(link, ui_window_t, lwindows);
    364378}
    365379
Note: See TracChangeset for help on using the changeset viewer.