Changeset 983052c in mainline


Ignore:
Timestamp:
2023-10-10T12:30:54Z (7 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bd2fab5
Parents:
9bec33a
git-author:
Jiri Svoboda <jiri@…> (2023-10-09 18:30:06)
git-committer:
Jiri Svoboda <jiri@…> (2023-10-10 12:30:54)
Message:

Task bar should not crash when starting in terminal

Firstly, we need to make sure we do not paint anything while
UI is suspended. Also, we were missing calls to ui_lock/unlock()
while delivering kbd/pos events from console.

Location:
uspace
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/taskbar/clock.c

    r9bec33a r983052c  
    322322{
    323323        taskbar_clock_t *clock = (taskbar_clock_t *) arg;
     324        ui_t *ui;
     325
     326        ui = ui_window_get_ui(clock->window);
     327        ui_lock(ui);
    324328
    325329        fibril_mutex_lock(&clock->lock);
    326         (void) taskbar_clock_paint(clock);
     330        if (!ui_is_suspended(ui_window_get_ui(clock->window)))
     331                (void) taskbar_clock_paint(clock);
    327332
    328333        if (!clock->timer_cleanup) {
     
    336341
    337342        fibril_mutex_unlock(&clock->lock);
     343        ui_unlock(ui);
    338344}
    339345
  • uspace/app/taskbar/wndlist.c

    r9bec33a r983052c  
    254254                wndlist_set_entry_rect(wndlist, entry);
    255255                if (paint)
    256                         return ui_pbutton_paint(entry->button);
     256                        return wndlist_paint_entry(entry);
    257257        }
    258258
     
    320320                        wndlist_set_entry_rect(wndlist, e);
    321321                        if (paint) {
    322                                 rc = ui_pbutton_paint(e->button);
     322                                rc = wndlist_paint_entry(e);
    323323                                if (rc != EOK)
    324324                                        return rc;
     
    402402        ui_pbutton_set_light(entry->button, active);
    403403
    404         rc = ui_pbutton_paint(entry->button);
     404        rc = wndlist_paint_entry(entry);
    405405        if (rc != EOK)
    406406                return rc;
    407407
    408         return wndlist_repaint(wndlist);
     408        return EOK;
    409409}
    410410
     
    470470}
    471471
    472 /** Unpaint window list entry.
     472/** Paint window list entry.
    473473 *
    474474 * @param entry Window list entry
    475475 * @return EOK on success or an error code
    476476 */
     477errno_t wndlist_paint_entry(wndlist_entry_t *entry)
     478{
     479        ui_t *ui;
     480
     481        ui = ui_window_get_ui(entry->wndlist->window);
     482        if (ui_is_suspended(ui))
     483                return EOK;
     484
     485        return ui_pbutton_paint(entry->button);
     486}
     487
     488/** Unpaint window list entry.
     489 *
     490 * @param entry Window list entry
     491 * @return EOK on success or an error code
     492 */
    477493errno_t wndlist_unpaint_entry(wndlist_entry_t *entry)
    478494{
    479495        errno_t rc;
     496        ui_t *ui;
    480497        gfx_context_t *gc;
    481498        ui_resource_t *res;
    482499        gfx_color_t *color;
    483500
     501        ui = ui_window_get_ui(entry->wndlist->window);
    484502        gc = ui_window_get_gc(entry->wndlist->window);
    485503        res = ui_window_get_res(entry->wndlist->window);
    486504        color = ui_resource_get_wnd_face_color(res);
    487505
     506        if (ui_is_suspended(ui))
     507                return EOK;
     508
    488509        rc = gfx_set_color(gc, color);
    489510        if (rc != EOK)
     
    510531        wndlist_t *wndlist = (wndlist_t *)arg;
    511532        wndmgt_window_info_t *winfo = NULL;
     533        ui_t *ui;
    512534        errno_t rc;
     535
     536        ui = ui_window_get_ui(wndlist->window);
     537        ui_lock(ui);
    513538
    514539        rc = wndmgt_get_window_info(wndlist->wndmgt, wnd_id, &winfo);
     
    526551
    527552        wndmgt_free_window_info(winfo);
     553        ui_unlock(ui);
    528554        return;
    529555error:
    530556        if (winfo != NULL)
    531557                wndmgt_free_window_info(winfo);
     558        ui_unlock(ui);
    532559}
    533560
     
    541568        wndlist_t *wndlist = (wndlist_t *)arg;
    542569        wndlist_entry_t *entry;
     570        ui_t *ui;
     571
     572        ui = ui_window_get_ui(wndlist->window);
     573        ui_lock(ui);
    543574
    544575        entry = wndlist_entry_by_id(wndlist, wnd_id);
    545         if (entry == NULL)
     576        if (entry == NULL) {
     577                ui_unlock(ui);
    546578                return;
     579        }
    547580
    548581        (void) wndlist_remove(wndlist, entry, true);
     582        ui_unlock(ui);
    549583}
    550584
     
    559593        wndmgt_window_info_t *winfo = NULL;
    560594        wndlist_entry_t *entry;
     595        ui_t *ui;
    561596        errno_t rc;
    562597
     598        ui = ui_window_get_ui(wndlist->window);
     599        ui_lock(ui);
     600
    563601        entry = wndlist_entry_by_id(wndlist, wnd_id);
    564         if (entry == NULL)
     602        if (entry == NULL) {
     603                ui_unlock(ui);
    565604                return;
     605        }
    566606
    567607        rc = wndmgt_get_window_info(wndlist->wndmgt, wnd_id, &winfo);
    568         if (rc != EOK)
     608        if (rc != EOK) {
     609                ui_unlock(ui);
    569610                return;
     611        }
    570612
    571613        (void) wndlist_update(wndlist, entry, winfo->caption,
    572614            winfo->nfocus != 0);
    573615        wndmgt_free_window_info(winfo);
     616        ui_unlock(ui);
    574617}
    575618
     
    660703errno_t wndlist_repaint(wndlist_t *wndlist)
    661704{
     705        if (ui_is_suspended(ui_window_get_ui(wndlist->window)))
     706                return EOK;
     707
    662708        return ui_window_paint(wndlist->window);
    663709}
  • uspace/app/taskbar/wndlist.h

    r9bec33a r983052c  
    6363extern size_t wndlist_count(wndlist_t *);
    6464extern errno_t wndlist_repaint(wndlist_t *);
     65extern errno_t wndlist_paint_entry(wndlist_entry_t *);
    6566extern errno_t wndlist_unpaint_entry(wndlist_entry_t *);
    6667
  • uspace/lib/ui/include/ui/ui.h

    r9bec33a r983052c  
    5757extern errno_t ui_suspend(ui_t *);
    5858extern errno_t ui_resume(ui_t *);
     59extern bool ui_is_suspended(ui_t *);
    5960extern void ui_lock(ui_t *);
    6061extern void ui_unlock(ui_t *);
  • uspace/lib/ui/private/ui.h

    r9bec33a r983052c  
    6161        /** Output owned by UI, clean up when destroying UI */
    6262        bool myoutput;
     63        /** @c true iff UI is suspended */
     64        bool suspended;
    6365        /** @c true if terminating */
    6466        bool quit;
  • uspace/lib/ui/src/ui.c

    r9bec33a r983052c  
    338338        switch (event->type) {
    339339        case CEV_KEY:
     340                ui_lock(ui);
    340341                ui_window_send_kbd(awnd, &event->ev.key);
     342                ui_unlock(ui);
    341343                break;
    342344        case CEV_POS:
     
    348350                claim = ui_wdecor_pos_event(awnd->wdecor, &pos);
    349351                /* Note: If event is claimed, awnd might not be valid anymore */
    350                 if (claim == ui_unclaimed)
     352                if (claim == ui_unclaimed) {
     353                        ui_lock(ui);
    351354                        ui_window_send_pos(awnd, &pos);
     355                        ui_unlock(ui);
     356                }
    352357
    353358                break;
     
    454459errno_t ui_suspend(ui_t *ui)
    455460{
    456         if (ui->cgc == NULL)
     461        errno_t rc;
     462
     463        assert(!ui->suspended);
     464
     465        if (ui->cgc == NULL) {
     466                ui->suspended = true;
    457467                return EOK;
     468        }
    458469
    459470        (void) console_set_caption(ui->console, "");
    460         return console_gc_suspend(ui->cgc);
     471        rc = console_gc_suspend(ui->cgc);
     472        if (rc != EOK)
     473                return rc;
     474
     475        ui->suspended = true;
     476        return EOK;
    461477}
    462478
     
    477493        cons_event_t ev;
    478494
    479         if (ui->cgc == NULL)
     495        assert(ui->suspended);
     496
     497        if (ui->cgc == NULL) {
     498                ui->suspended = false;
    480499                return EOK;
     500        }
    481501
    482502        rc = console_get_pos(ui->console, &col, &row);
     
    510530                return rc;
    511531
     532        ui->suspended = false;
     533
    512534        awnd = ui_window_get_active(ui);
    513535        if (awnd != NULL)
    514536                (void) console_set_caption(ui->console, awnd->wdecor->caption);
    515537
    516         return gfx_cursor_set_visible(console_gc_get_ctx(ui->cgc), false);
     538        rc = gfx_cursor_set_visible(console_gc_get_ctx(ui->cgc), false);
     539        if (rc != EOK)
     540                return rc;
     541
     542        return EOK;
     543}
     544
     545/** Determine if UI is suspended.
     546 *
     547 * @param ui UI
     548 * @return @c true iff UI is suspended
     549 */
     550bool ui_is_suspended(ui_t *ui)
     551{
     552        return ui->suspended;
    517553}
    518554
  • uspace/lib/ui/test/ui.c

    r9bec33a r983052c  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2023 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6969}
    7070
    71 /** ui_suspend() / ui_resume() do nothing if we don't have a console */
     71/** ui_suspend() / ui_resume() do nothing if we don't have a console,
     72 * ui_is_suspended() returns suspend status
     73 */
    7274PCUT_TEST(suspend_resume)
    7375{
     
    7981        PCUT_ASSERT_NOT_NULL(ui);
    8082
     83        PCUT_ASSERT_FALSE(ui_is_suspended(ui));
     84
    8185        rc = ui_suspend(ui);
    8286        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     87
     88        PCUT_ASSERT_TRUE(ui_is_suspended(ui));
     89
    8390        rc = ui_resume(ui);
    8491        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     92
     93        PCUT_ASSERT_FALSE(ui_is_suspended(ui));
    8594
    8695        ui_destroy(ui);
Note: See TracChangeset for help on using the changeset viewer.