Changes in / [e4cc266:34aad53d] in mainline


Ignore:
Files:
36 added
5 deleted
49 edited

Legend:

Unmodified
Added
Removed
  • README.md

    re4cc266 r34aad53d  
    1010extensible, fault tolerant and easy to understand.
    1111
    12 ![screenshot](http://www.helenos.org/raw-attachment/wiki/Screenshots/newgui-aio.png "Screenshot")
     12![screenshot](http://www.helenos.org/raw-attachment/wiki/Screenshots/gui-14.1-aio.png "Screenshot")
    1313
    1414HelenOS aims to be compatible with the C11 and C++14 standards, but does not
  • abi/include/abi/ipc/interfaces.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2014 Martin Decky
    44 * All rights reserved.
     
    201201        INTERFACE_WNDMGT_CB =
    202202            FOURCC_COMPACT('w', 'm', 'g', 't') | IFACE_EXCHANGE_SERIALIZE | IFACE_MOD_CALLBACK,
     203        INTERFACE_TBARCFG_NOTIFY =
     204            FOURCC_COMPACT('t', 'b', 'c', 'f') | IFACE_EXCHANGE_SERIALIZE,
    203205        INTERFACE_PCAP_CONTROL =
    204206            FOURCC_COMPACT('p', 'c', 't', 'l') | IFACE_EXCHANGE_SERIALIZE,
  • defaults/ia64/Makefile.config

    re4cc266 r34aad53d  
    5151
    5252# Optimization level
    53 OPTIMIZATION = 3
     53OPTIMIZATION = 2
  • meson/part/initrd_manifest/meson.build

    re4cc266 r34aad53d  
    6868if CONFIG_FB
    6969        rd_essential += [
    70                 'app/launcher',
     70                'app/taskbar',
    7171                'app/terminal',
    7272
  • tools/export.sh

    re4cc266 r34aad53d  
    4343        uspace/lib/libc.a \
    4444        uspace/lib/libcongfx.a \
     45        uspace/lib/libconsole.a \
    4546        uspace/lib/libcpp.a \
    4647        uspace/lib/libdisplay.a \
     
    4849        uspace/lib/libgfxfont.a \
    4950        uspace/lib/libgfximage.a \
     51        uspace/lib/libinput.a \
    5052        uspace/lib/libhound.a \
    5153        uspace/lib/libipcgfx.a \
    5254        uspace/lib/libmath.a \
    5355        uspace/lib/libmemgfx.a \
     56        uspace/lib/liboutput.a \
    5457        uspace/lib/libpcm.a \
    5558        uspace/lib/libpixconv.a \
  • tools/mkarray.py

    re4cc266 r34aad53d  
    3939def usage(prname):
    4040        "Print usage syntax"
    41         print("%s [--deflate] <DESTINATION> <LABEL> <AS_PROLOG> <SECTION> [SOURCE ...]" % prname)
     41        print("%s [--deflate] <DESTINATION> <TYPENAME> <LABEL> <AS_PROLOG> <SECTION> [SOURCE ...]" % prname)
    4242
    4343def arg_check():
    44         if (len(sys.argv) < 5):
     44        if (len(sys.argv) < 6):
    4545                usage(sys.argv[0])
    4646                sys.exit()
     
    6666
    6767        dest = sys.argv[1]
    68         label = sys.argv[2]
    69         as_prolog = sys.argv[3]
    70         section = sys.argv[4]
     68        typename = sys.argv[2]
     69        label = sys.argv[3]
     70        as_prolog = sys.argv[4]
     71        section = sys.argv[5]
    7172
    7273        timestamp = (1980, 1, 1, 0, 0, 0)
     
    8182        archive = zipfile.ZipFile("%s.zip" % dest, "w", zipfile.ZIP_STORED)
    8283
    83         for src in sys.argv[5:]:
     84        for src in sys.argv[6:]:
    8485                basename = os.path.basename(src)
    8586                plainname = os.path.splitext(basename)[0]
     
    147148        data += "#include <stdbool.h>\n\n"
    148149        data += "#define %sS  %u\n\n" % (label.upper(), src_cnt)
     150        data += "#ifndef %sS_T_\n" % typename.upper()
     151        data += "#define %sS_T_\n\n" % typename.upper()
    149152        data += "typedef struct {\n"
    150153        data += "\tconst char *name;\n"
     
    153156        data += "\tsize_t inflated;\n"
    154157        data += "\tbool compressed;\n"
    155         data += "} %s_t;\n\n" % label
    156         data += "extern %s_t %ss[];\n\n" % (label, label)
     158        data += "} %s_t;\n\n" % typename
     159        data += "#endif\n"
     160        data += "extern %s_t %ss[];\n\n" % (typename, label)
    157161        data += "\n".join(header_ctx)
    158162        data += "\n\n"
     
    179183        data += ' */\n\n'
    180184        data += "#include \"%s.h\"\n\n" % dest
    181         data += "%s_t %ss[] = {\n" % (label, label)
     185        data += "%s_t %ss[] = {\n" % (typename, label)
    182186        data += ",\n".join(desc_ctx)
    183187        data += "\n"
  • tools/mkarray_for_meson.sh

    re4cc266 r34aad53d  
    4242_arg3="$4"
    4343_arg4="$5"
     44_arg5="$6"
    4445_inputs=""
    4546
    46 shift 5
     47shift 6
    4748
    4849for file in "$@"; do
     
    5152
    5253cd $_outdir
    53 $TOOLS_DIR/mkarray.py "$_arg1" "$_arg2" "$_arg3" "$_arg4" $_inputs > /dev/null
     54$TOOLS_DIR/mkarray.py "$_arg1" "$_arg2" "$_arg3" "$_arg4" "$_arg5" $_inputs > /dev/null
  • tools/xcw/bin/helenos-pkg-config

    re4cc266 r34aad53d  
    9393    config = args.parse_args()
    9494
    95     export_dir = os.getenv('EXPORT_DIR', get_build_root())
     95    export_dir = os.getenv('EXPORT_DIR', get_build_root() + '/export')
    9696
    9797    result = []
  • uspace/app/barber/barber.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2020 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2014 Martin Decky
    44 * All rights reserved.
     
    5050#include <ui/image.h>
    5151#include "images.h"
     52#include "images_tiny.h"
    5253
    5354#define NAME  "barber"
     
    6061#define MIN_LOAD  (LOAD_UNIT / 4)
    6162#define MAX_LOAD  (LOAD_UNIT / 3)
    62 
    63 #define FRAME_WIDTH   59
    64 #define FRAME_HEIGHT  192
    6563
    6664#define LED_PERIOD  1000000
     
    9795static unsigned int frame = 0;
    9896static unsigned int fps = MIN_FPS;
     97static gfx_coord_t frame_width;
     98static gfx_coord_t frame_height;
    9999
    100100static void led_timer_callback(void *);
     
    102102
    103103static void wnd_close(ui_window_t *, void *);
     104static void wnd_kbd_event(ui_window_t *, void *, kbd_event_t *);
    104105
    105106static ui_window_cb_t window_cb = {
    106         .close = wnd_close
     107        .close = wnd_close,
     108        .kbd = wnd_kbd_event
    107109};
    108110
     
    110112 *
    111113 * @param window Window
    112  * @param arg Argument (launcher)
     114 * @param arg Argument (barber)
    113115 */
    114116static void wnd_close(ui_window_t *window, void *arg)
     
    119121}
    120122
    121 static bool decode_frames(gfx_context_t *gc)
     123/** Barber unmodified key press.
     124 *
     125 * @param barber Barber
     126 * @param event Keyboard event
     127 */
     128static void barber_kbd_event_unmod(barber_t *barber, kbd_event_t *event)
     129{
     130        if (event->key == KC_ESCAPE)
     131                ui_quit(barber->ui);
     132}
     133
     134/** Barber ctrl-key key press.
     135 *
     136 * @param barber Barber
     137 * @param event Keyboard event
     138 */
     139static void barber_kbd_event_ctrl(barber_t *barber, kbd_event_t *event)
     140{
     141        if (event->key == KC_Q)
     142                ui_quit(barber->ui);
     143}
     144
     145/** Barber window keyboard event.
     146 *
     147 * @param window UI window
     148 * @param arg Argument (barber_t *)
     149 * @param event Keyboard event
     150 */
     151static void wnd_kbd_event(ui_window_t *window, void *arg, kbd_event_t *event)
     152{
     153        barber_t *barber = (barber_t *)arg;
     154
     155        if (event->type != KEY_PRESS)
     156                return;
     157
     158        if ((event->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
     159                barber_kbd_event_unmod(barber, event);
     160
     161        if ((event->mods & KM_CTRL) != 0 &&
     162            (event->mods & (KM_ALT | KM_SHIFT)) == 0)
     163                barber_kbd_event_ctrl(barber, event);
     164
     165        ui_window_def_kbd(window, event);
     166}
     167
     168static bool decode_frames(gfx_context_t *gc, image_t *img)
    122169{
    123170        gfx_rect_t rect;
     
    125172
    126173        for (unsigned int i = 0; i < FRAMES; i++) {
    127                 rc = decode_tga_gz(gc, images[i].addr, images[i].size,
     174                rc = decode_tga_gz(gc, img[i].addr, img[i].size,
    128175                    &frame_bmp[i], &rect);
    129176                if (rc != EOK) {
     
    132179                }
    133180
    134                 (void) rect;
     181                (void)rect;
    135182        }
    136183
     
    238285        rect.p0.x = 0;
    239286        rect.p0.y = 0;
    240         rect.p1.x = FRAME_WIDTH;
    241         rect.p1.y = FRAME_HEIGHT;
     287        rect.p1.x = frame_width;
     288        rect.p1.y = frame_height;
    242289
    243290        ui_image_set_bmp(frame_img, frame_bmp[frame], &rect);
     
    299346int main(int argc, char *argv[])
    300347{
    301         const char *display_spec = UI_DISPLAY_DEFAULT;
     348        const char *display_spec = UI_ANY_DEFAULT;
    302349        barber_t barber;
    303350        ui_t *ui;
     
    310357        gfx_context_t *gc;
    311358        gfx_coord2_t off;
     359        image_t *img;
    312360        int i;
    313361
     
    355403        }
    356404
     405        if (ui_is_textmode(ui)) {
     406                frame_width = 10;
     407                frame_height = 16;
     408        } else {
     409                frame_width = 59;
     410                frame_height = 192;
     411        }
     412
    357413        rect.p0.x = 0;
    358414        rect.p0.y = 0;
    359         rect.p1.x = FRAME_WIDTH;
    360         rect.p1.y = FRAME_HEIGHT;
     415        rect.p1.x = frame_width;
     416        rect.p1.y = frame_height;
    361417
    362418        ui_wnd_params_init(&params);
     
    367423         * to rect
    368424         */
    369         ui_wdecor_rect_from_app(params.style, &rect, &wrect);
     425        ui_wdecor_rect_from_app(ui, params.style, &rect, &wrect);
    370426        off = wrect.p0;
    371427        gfx_rect_rtranslate(&off, &wrect, &params.rect);
     
    384440        ui_window_set_cb(window, &window_cb, (void *) &barber);
    385441
    386         if (!decode_frames(gc))
     442        img = ui_is_textmode(ui) ? image_tinys : images;
     443
     444        if (!decode_frames(gc, img))
    387445                return 1;
    388446
  • uspace/app/barber/meson.build

    re4cc266 r34aad53d  
    6262)
    6363
     64_images_tiny = files(
     65        'gfx-tiny/frame01t.tga.gz',
     66        'gfx-tiny/frame02t.tga.gz',
     67        'gfx-tiny/frame03t.tga.gz',
     68        'gfx-tiny/frame04t.tga.gz',
     69        'gfx-tiny/frame05t.tga.gz',
     70        'gfx-tiny/frame06t.tga.gz',
     71        'gfx-tiny/frame07t.tga.gz',
     72        'gfx-tiny/frame08t.tga.gz',
     73        'gfx-tiny/frame09t.tga.gz',
     74        'gfx-tiny/frame10t.tga.gz',
     75        'gfx-tiny/frame11t.tga.gz',
     76        'gfx-tiny/frame12t.tga.gz',
     77        'gfx-tiny/frame13t.tga.gz',
     78        'gfx-tiny/frame14t.tga.gz',
     79        'gfx-tiny/frame15t.tga.gz',
     80        'gfx-tiny/frame16t.tga.gz',
     81        'gfx-tiny/frame17t.tga.gz',
     82        'gfx-tiny/frame18t.tga.gz',
     83        'gfx-tiny/frame19t.tga.gz',
     84        'gfx-tiny/frame20t.tga.gz',
     85        'gfx-tiny/frame21t.tga.gz',
     86        'gfx-tiny/frame22t.tga.gz',
     87        'gfx-tiny/frame23t.tga.gz',
     88        'gfx-tiny/frame24t.tga.gz',
     89        'gfx-tiny/frame25t.tga.gz',
     90        'gfx-tiny/frame26t.tga.gz',
     91        'gfx-tiny/frame27t.tga.gz',
     92        'gfx-tiny/frame28t.tga.gz',
     93        'gfx-tiny/frame29t.tga.gz',
     94        'gfx-tiny/frame30t.tga.gz',
     95)
     96
    6497_tarball = custom_target('barber_images.tar',
    6598        input: _images,
     
    70103# TODO
    71104
     105# Normal images
     106
    72107_images_zip = custom_target('barber_images.zip',
    73108        input : _images,
    74109        output : [ 'images.zip' ],
    75         command : [ mkarray, '@OUTDIR@', 'images', 'image', uspace_as_prolog, '.data', '@INPUT@' ],
     110        command : [ mkarray, '@OUTDIR@', 'images', 'image', 'image', uspace_as_prolog, '.data', '@INPUT@' ],
    76111)
    77112_imgs_s = custom_target('barber_images.s',
     
    94129)
    95130
    96 src = [ files('barber.c'), _imgs_s, _imgs_h, _imgs_desc_c ]
     131# Tiny images
     132
     133_images_tiny_zip = custom_target('barber_images_tiny.zip',
     134        input : _images_tiny,
     135        output : [ 'images_tiny.zip' ],
     136        command : [ mkarray, '@OUTDIR@', 'images_tiny', 'image', 'image_tiny', uspace_as_prolog, '.data', '@INPUT@' ],
     137)
     138_imgs_tiny_s = custom_target('barber_images_tiny.s',
     139        input : _images_tiny_zip,
     140        output : [ 'images_tiny.s' ],
     141        command : [ unzip, '-p', '@INPUT@', 'images_tiny.s' ],
     142        capture : true,
     143)
     144_imgs_tiny_h = custom_target('barber_images_tiny.h',
     145        input : _images_tiny_zip,
     146        output : [ 'images_tiny.h' ],
     147        command : [ unzip, '-p', '@INPUT@', 'images_tiny.h' ],
     148        capture : true,
     149)
     150_imgs_tiny_desc_c = custom_target('barber_images_tiny_desc.c',
     151        input : _images_tiny_zip,
     152        output : [ 'images_tiny_desc.c' ],
     153        command : [ unzip, '-p', '@INPUT@', 'images_tiny_desc.c' ],
     154        capture : true,
     155)
     156
     157src = [ files('barber.c'), _imgs_s, _imgs_h, _imgs_desc_c,
     158    _imgs_tiny_s, _imgs_tiny_h, _imgs_tiny_desc_c ]
  • uspace/app/fontedit/fontedit.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    787787         * to rect
    788788         */
    789         ui_wdecor_rect_from_app(params.style, &rect, &wrect);
     789        ui_wdecor_rect_from_app(ui, params.style, &rect, &wrect);
    790790        off = wrect.p0;
    791791        gfx_rect_rtranslate(&off, &wrect, &params.rect);
  • uspace/app/gfxdemo/gfxdemo.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    393393                for (j = 0; j < h; j++) {
    394394                        pixelmap_put_pixel(&pixelmap, i, j,
    395                             PIXEL(0, (i % 30) < 3 ? 255 : 0,
     395                            PIXEL(255, (i % 30) < 3 ? 255 : 0,
    396396                            (j % 30) < 3 ? 255 : 0, i / 2));
    397397                }
     
    429429                        k = i * i + j * j;
    430430                        pixelmap_put_pixel(&pixelmap, i, j,
    431                             PIXEL(0, k, k, k));
     431                            PIXEL(255, k, k, k));
    432432                }
    433433        }
     
    464464                        k = i * i + j * j;
    465465                        pixelmap_put_pixel(&pixelmap, i, j,
    466                             k < w * w / 2 ? PIXEL(0, 0, 255, 0) :
    467                             PIXEL(0, 255, 0, 255));
     466                            k < w * w / 2 ? PIXEL(255, 0, 255, 0) :
     467                            PIXEL(255, 255, 0, 255));
    468468                }
    469469        }
     
    621621        params.rect.p1.y = 40;
    622622        params.flags = bmpf_color_key;
    623         params.key_color = PIXEL(0, 255, 0, 255);
     623        params.key_color = PIXEL(255, 255, 0, 255);
    624624
    625625        rc = gfx_bitmap_create(gc, &params, NULL, &bitmap);
     
    11601160         * to rect
    11611161         */
    1162         ui_wdecor_rect_from_app(params.style, &rect, &wrect);
     1162        ui_wdecor_rect_from_app(ui, params.style, &rect, &wrect);
    11631163        off = wrect.p0;
    11641164        gfx_rect_rtranslate(&off, &wrect, &params.rect);
  • uspace/app/init/init.c

    re4cc266 r34aad53d  
    476476                rc = display_server();
    477477                if (rc == EOK) {
    478                         app_start("/app/launcher", NULL);
    479478                        app_start("/app/taskbar", NULL);
    480479                        app_start("/app/terminal", "-topleft");
  • uspace/app/meson.build

    re4cc266 r34aad53d  
    2828
    2929apps = [
     30        'aboutos',
    3031        'barber',
    3132        'bdsh',
     
    5758        'killall',
    5859        'kio',
    59         'launcher',
    6060        'loc',
    6161        'logset',
  • uspace/app/nav/test/panel.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2022 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5555PCUT_TEST(create_destroy)
    5656{
    57         panel_t *panel;
    58         errno_t rc;
    59 
    60         rc = panel_create(NULL, true, &panel);
    61         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    62 
    63         panel_destroy(panel);
     57        ui_t *ui;
     58        ui_window_t *window;
     59        ui_wnd_params_t params;
     60        panel_t *panel;
     61        errno_t rc;
     62
     63        rc = ui_create_disp(NULL, &ui);
     64        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     65
     66        ui_wnd_params_init(&params);
     67        params.caption = "Test";
     68
     69        rc = ui_window_create(ui, &params, &window);
     70        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     71
     72        rc = panel_create(window, true, &panel);
     73        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     74
     75        panel_destroy(panel);
     76        ui_window_destroy(window);
     77        ui_destroy(ui);
    6478}
    6579
     
    6781PCUT_TEST(set_cb)
    6882{
     83        ui_t *ui;
     84        ui_window_t *window;
     85        ui_wnd_params_t params;
    6986        panel_t *panel;
    7087        errno_t rc;
    7188        test_resp_t resp;
    7289
    73         rc = panel_create(NULL, true, &panel);
     90        rc = ui_create_disp(NULL, &ui);
     91        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     92
     93        ui_wnd_params_init(&params);
     94        params.caption = "Test";
     95
     96        rc = ui_window_create(ui, &params, &window);
     97        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     98
     99        rc = panel_create(window, true, &panel);
    74100        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    75101
     
    79105
    80106        panel_destroy(panel);
     107        ui_window_destroy(window);
     108        ui_destroy(ui);
    81109}
    82110
     
    113141PCUT_TEST(ctl)
    114142{
     143        ui_t *ui;
     144        ui_window_t *window;
     145        ui_wnd_params_t params;
    115146        panel_t *panel;
    116147        ui_control_t *control;
    117148        errno_t rc;
    118149
    119         rc = panel_create(NULL, true, &panel);
     150        rc = ui_create_disp(NULL, &ui);
     151        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     152
     153        ui_wnd_params_init(&params);
     154        params.caption = "Test";
     155
     156        rc = ui_window_create(ui, &params, &window);
     157        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     158
     159        rc = panel_create(window, true, &panel);
    120160        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    121161
     
    124164
    125165        panel_destroy(panel);
     166        ui_window_destroy(window);
     167        ui_destroy(ui);
    126168}
    127169
     
    129171PCUT_TEST(kbd_event)
    130172{
     173        ui_t *ui;
     174        ui_window_t *window;
     175        ui_wnd_params_t params;
    131176        panel_t *panel;
    132177        ui_evclaim_t claimed;
     
    136181        /* Active panel should claim events */
    137182
    138         rc = panel_create(NULL, true, &panel);
     183        rc = ui_create_disp(NULL, &ui);
     184        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     185
     186        ui_wnd_params_init(&params);
     187        params.caption = "Test";
     188
     189        rc = ui_window_create(ui, &params, &window);
     190        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     191
     192        rc = panel_create(window, true, &panel);
    139193        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    140194
     
    151205        /* Inactive panel should not claim events */
    152206
    153         rc = panel_create(NULL, false, &panel);
     207        rc = panel_create(window, false, &panel);
    154208        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    155209
     
    163217
    164218        panel_destroy(panel);
     219        ui_window_destroy(window);
     220        ui_destroy(ui);
    165221}
    166222
     
    173229PCUT_TEST(set_rect)
    174230{
     231        ui_t *ui;
     232        ui_window_t *window;
     233        ui_wnd_params_t params;
    175234        panel_t *panel;
    176235        gfx_rect_t rect;
    177236        errno_t rc;
    178237
    179         rc = panel_create(NULL, true, &panel);
     238        rc = ui_create_disp(NULL, &ui);
     239        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     240
     241        ui_wnd_params_init(&params);
     242        params.caption = "Test";
     243
     244        rc = ui_window_create(ui, &params, &window);
     245        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     246
     247        rc = panel_create(window, true, &panel);
    180248        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    181249
     
    192260
    193261        panel_destroy(panel);
     262        ui_window_destroy(window);
     263        ui_destroy(ui);
    194264}
    195265
     
    197267PCUT_TEST(is_active)
    198268{
    199         panel_t *panel;
    200         errno_t rc;
    201 
    202         rc = panel_create(NULL, true, &panel);
     269        ui_t *ui;
     270        ui_window_t *window;
     271        ui_wnd_params_t params;
     272        panel_t *panel;
     273        errno_t rc;
     274
     275        rc = ui_create_disp(NULL, &ui);
     276        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     277
     278        ui_wnd_params_init(&params);
     279        params.caption = "Test";
     280
     281        rc = ui_window_create(ui, &params, &window);
     282        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     283
     284        rc = panel_create(window, true, &panel);
    203285        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    204286        PCUT_ASSERT_TRUE(panel_is_active(panel));
    205287        panel_destroy(panel);
    206288
    207         rc = panel_create(NULL, false, &panel);
     289        rc = panel_create(window, false, &panel);
    208290        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    209291        PCUT_ASSERT_FALSE(panel_is_active(panel));
    210292        panel_destroy(panel);
     293        ui_window_destroy(window);
     294        ui_destroy(ui);
    211295}
    212296
     
    275359PCUT_TEST(activate_req)
    276360{
     361        ui_t *ui;
     362        ui_window_t *window;
     363        ui_wnd_params_t params;
    277364        panel_t *panel;
    278365        errno_t rc;
    279366        test_resp_t resp;
    280367
    281         rc = panel_create(NULL, true, &panel);
     368        rc = ui_create_disp(NULL, &ui);
     369        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     370
     371        ui_wnd_params_init(&params);
     372        params.caption = "Test";
     373
     374        rc = ui_window_create(ui, &params, &window);
     375        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     376
     377        rc = panel_create(window, true, &panel);
    282378        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    283379
     
    292388
    293389        panel_destroy(panel);
     390        ui_window_destroy(window);
     391        ui_destroy(ui);
    294392}
    295393
  • uspace/app/taskbar-cfg/smeedit.c

    re4cc266 r34aad53d  
    403403
    404404                startmenu_repaint(smee->startmenu);
     405                (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    405406        } else {
    406407                /* Edit existing entry */
     
    419420                (void)smenu_entry_save(smee->smentry->entry);
    420421                startmenu_entry_update(smee->smentry);
     422                (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    421423        }
    422424
  • uspace/app/taskbar-cfg/startmenu.c

    re4cc266 r34aad53d  
    515515
    516516        (void)smee;
     517        (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    517518}
    518519
     
    533534        (void)startmenu_insert(smenu, entry, &smentry);
    534535        (void)ui_control_paint(ui_list_ctl(smenu->entries_list));
     536        (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    535537}
    536538
     
    633635        free(smentry);
    634636        (void)ui_control_paint(ui_list_ctl(smenu->entries_list));
     637        (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    635638}
    636639
     
    685688
    686689        (void)ui_control_paint(ui_list_ctl(smenu->entries_list));
     690        (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    687691}
    688692
     
    704708                return;
    705709
    706         rc = smenu_entry_move_up(smentry->entry);
     710        rc = smenu_entry_move_down(smentry->entry);
    707711        if (rc != EOK)
    708712                return;
     
    711715
    712716        (void)ui_control_paint(ui_list_ctl(smenu->entries_list));
     717        (void)tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
    713718}
    714719
  • uspace/app/taskbar/meson.build

    re4cc266 r34aad53d  
    4848)
    4949
    50 if install_nonessential_data
    51         installed_data += { 'name': 'taskbar.sif', 'dir': '/cfg' }
    52 endif
     50installed_data += { 'name': 'taskbar.sif', 'dir': '/cfg' }
  • uspace/app/taskbar/taskbar.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4848#include "wndlist.h"
    4949
     50#define TASKBAR_CONFIG_FILE "/cfg/taskbar.sif"
     51
    5052static void taskbar_wnd_close(ui_window_t *, void *);
    5153static void taskbar_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
    5254static void taskbar_wnd_pos(ui_window_t *, void *, pos_event_t *);
     55static void taskbar_notif_cb(void *);
    5356
    5457static ui_window_cb_t window_cb = {
     
    128131        gfx_rect_t scr_rect;
    129132        gfx_rect_t rect;
     133        char *dspec = NULL;
     134        char *qmark;
    130135        errno_t rc;
    131136
    132137        taskbar = calloc(1, sizeof(taskbar_t));
    133138        if (taskbar == NULL) {
     139                printf("Out of memory.\n");
    134140                rc = ENOMEM;
    135141                goto error;
    136142        }
     143
     144        dspec = str_dup(display_spec);
     145        if (dspec == NULL) {
     146                printf("Out of memory.\n");
     147                rc = ENOMEM;
     148                goto error;
     149        }
     150
     151        /* Remove additional arguments */
     152        qmark = str_chr(dspec, '?');
     153        if (qmark != NULL)
     154                *qmark = '\0';
    137155
    138156        rc = ui_create(display_spec, &taskbar->ui);
     
    195213        }
    196214
    197         rc = tbsmenu_create(taskbar->window, taskbar->fixed, &taskbar->tbsmenu);
     215        rc = tbsmenu_create(taskbar->window, taskbar->fixed, dspec,
     216            &taskbar->tbsmenu);
    198217        if (rc != EOK) {
    199218                printf("Error creating start menu.\n");
     
    201220        }
    202221
    203         rc = tbsmenu_load(taskbar->tbsmenu, "/cfg/taskbar.sif");
     222        rc = tbsmenu_load(taskbar->tbsmenu, TASKBAR_CONFIG_FILE);
    204223        if (rc != EOK) {
    205224                printf("Error loading start menu from '%s'.\n",
    206                     "/cfg/taskbar.sif");
     225                    TASKBAR_CONFIG_FILE);
     226        }
     227
     228        rc = tbarcfg_listener_create(TBARCFG_NOTIFY_DEFAULT,
     229            taskbar_notif_cb, (void *)taskbar, &taskbar->lst);
     230        if (rc != EOK) {
     231                printf("Error listening for configuration changes.\n");
    207232        }
    208233
     
    284309        }
    285310
     311        free(dspec);
    286312        *rtaskbar = taskbar;
    287313        return EOK;
    288314error:
     315        if (dspec != NULL)
     316                free(dspec);
     317        if (taskbar->lst != NULL)
     318                tbarcfg_listener_destroy(taskbar->lst);
    289319        if (taskbar->clock != NULL)
    290320                taskbar_clock_destroy(taskbar->clock);
     
    297327        if (taskbar->ui != NULL)
    298328                ui_destroy(taskbar->ui);
     329        free(taskbar);
    299330        return rc;
    300331
     
    304335void taskbar_destroy(taskbar_t *taskbar)
    305336{
     337        if (taskbar->lst != NULL)
     338                tbarcfg_listener_destroy(taskbar->lst);
    306339        ui_fixed_remove(taskbar->fixed, taskbar_clock_ctl(taskbar->clock));
    307340        taskbar_clock_destroy(taskbar->clock);
     
    312345}
    313346
     347/** Configuration change notification callback.
     348 *
     349 * Called when configuration changed.
     350 *
     351 * @param arg Argument (taskbar_t *)
     352 */
     353static void taskbar_notif_cb(void *arg)
     354{
     355        taskbar_t *taskbar = (taskbar_t *)arg;
     356
     357        ui_lock(taskbar->ui);
     358        tbsmenu_reload(taskbar->tbsmenu);
     359        ui_unlock(taskbar->ui);
     360}
     361
    314362/** @}
    315363 */
  • uspace/app/taskbar/taskbar.sif

    re4cc266 r34aad53d  
    1 [sif](){[entries](){[entry]([caption]=[~N~avigator][cmd]=[/app/nav][terminal]=[y]){}[entry]([caption]=[Text ~E~ditor][cmd]=[/app/edit][terminal]=[y]){}[entry]([caption]=[Co~m~mand Line][cmd]=[/app/bdsh][terminal]=[y]){}[entry]([caption]=[~C~alculator][cmd]=[/app/calculator][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[~U~I Demo][cmd]=[/app/uidemo][terminal]=[n]){}[entry]([caption]=[~G~FX Demo][cmd]=[/app/gfxdemo ui][terminal]=[n]){}[entry]([caption]=[~B~arber Pole][cmd]=[/app/barber][terminal]=[n]){}[entry]([caption]=[~T~etris][cmd]=[/app/tetris][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~D~isplay Configuration][cmd]=[/app/display-cfg][terminal]=[n]){}[entry]([caption]=[Ta~s~kbar Configuration][cmd]=[/app/taskbar-cfg][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[Tas~k~ Monitor (top)][cmd]=[/app/top][terminal]=[y]){}[entry]([caption]=[~F~disk Disk Editor][cmd]=[/app/fdisk][terminal]=[y]){}}}
     1[sif](){[entries](){[entry]([caption]=[~N~avigator][cmd]=[/app/nav][terminal]=[y]){}[entry]([caption]=[Text ~E~ditor][cmd]=[/app/edit][terminal]=[y]){}[entry]([caption]=[Co~m~mand Line][cmd]=[/app/bdsh][terminal]=[y]){}[entry]([caption]=[~C~alculator][cmd]=[/app/calculator -d %d][terminal]=[n]){}[entry]([caption]=[~I~mage Viewer][cmd]=[/app/viewer -d %d][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[~U~I Demo][cmd]=[/app/uidemo -d %d][terminal]=[n]){}[entry]([caption]=[~G~FX Demo][cmd]=[/app/gfxdemo -d %d ui][terminal]=[n]){}[entry]([caption]=[~B~arber Pole][cmd]=[/app/barber -d %d][terminal]=[n]){}[entry]([caption]=[~T~etris][cmd]=[/app/tetris][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~D~isplay Configuration][cmd]=[/app/display-cfg -d %d][terminal]=[n]){}[entry]([caption]=[Ta~s~kbar Configuration][cmd]=[/app/taskbar-cfg -d %d][terminal]=[n]){}[entry]([separator]=[y]){}[entry]([caption]=[Tas~k~ Monitor (top)][cmd]=[/app/top][terminal]=[y]){}[entry]([caption]=[~F~disk Disk Editor][cmd]=[/app/fdisk][terminal]=[y]){}[entry]([separator]=[y]){}[entry]([caption]=[~A~bout HelenOS][cmd]=[/app/aboutos -d %d][terminal]=[n]){}}}
  • uspace/app/taskbar/tbsmenu.c

    re4cc266 r34aad53d  
    6464static void tbsmenu_smenu_entry_cb(ui_menu_entry_t *, void *);
    6565static errno_t tbsmenu_entry_start(tbsmenu_entry_t *);
     66static void tbsmenu_cmd_fini(tbsmenu_cmd_t *);
    6667
    6768/** Create taskbar start menu.
     
    6970 * @param window Containing window
    7071 * @param fixed Fixed layout to which start button will be added
     72 * @param dspec Display specification (for passing to applications)
    7173 * @param rtbsmenu Place to store pointer to new start menu
    7274 * @return @c EOK on success or an error code
    7375 */
    7476errno_t tbsmenu_create(ui_window_t *window, ui_fixed_t *fixed,
    75     tbsmenu_t **rtbsmenu)
     77    const char *dspec, tbsmenu_t **rtbsmenu)
    7678{
    7779        ui_resource_t *res = ui_window_get_res(window);
     
    8587        }
    8688
     89        tbsmenu->display_spec = str_dup(dspec);
     90        if (tbsmenu->display_spec == NULL) {
     91                rc = ENOMEM;
     92                goto error;
     93        }
     94
    8795        rc = ui_pbutton_create(res, "Start", &tbsmenu->sbutton);
    8896        if (rc != EOK)
     
    111119        return EOK;
    112120error:
     121        if (tbsmenu != NULL && tbsmenu->display_spec != NULL)
     122                free(tbsmenu->display_spec);
    113123        if (tbsmenu != NULL)
    114124                ui_pbutton_destroy(tbsmenu->sbutton);
     
    134144        bool terminal;
    135145        errno_t rc;
     146
     147        if (tbsmenu->repopath != NULL)
     148                free(tbsmenu->repopath);
     149
     150        tbsmenu->repopath = str_dup(repopath);
     151        if (tbsmenu->repopath == NULL)
     152                return ENOMEM;
     153
     154        /* Remove existing entries */
     155        tentry = tbsmenu_first(tbsmenu);
     156        while (tentry != NULL) {
     157                tbsmenu_remove(tbsmenu, tentry, false);
     158                tentry = tbsmenu_first(tbsmenu);
     159        }
    136160
    137161        rc = tbarcfg_open(repopath, &tbcfg);
     
    170194}
    171195
     196/** Reload start menu from repository (or schedule reload).
     197 *
     198 * @param tbsmenu Start menu
     199 */
     200void tbsmenu_reload(tbsmenu_t *tbsmenu)
     201{
     202        if (!tbsmenu_is_open(tbsmenu))
     203                (void) tbsmenu_load(tbsmenu, tbsmenu->repopath);
     204        else
     205                tbsmenu->needs_reload = true;
     206}
     207
    172208/** Set start menu rectangle.
    173209 *
     
    198234{
    199235        ui_menu_close(tbsmenu->smenu);
     236
     237        if (tbsmenu->needs_reload)
     238                (void) tbsmenu_load(tbsmenu, tbsmenu->repopath);
    200239}
    201240
     
    447486static errno_t tbsmenu_cmd_split(const char *str, tbsmenu_cmd_t *cmd)
    448487{
     488        char *buf;
    449489        char *arg;
    450490        char *next;
    451491        size_t cnt;
    452492
    453         cmd->buf = str_dup(str);
    454         if (cmd->buf == NULL)
     493        buf = str_dup(str);
     494        if (buf == NULL)
    455495                return ENOMEM;
    456496
    457497        /* Count the entries */
    458498        cnt = 0;
    459         arg = str_tok(cmd->buf, " ", &next);
     499        arg = str_tok(buf, " ", &next);
    460500        while (arg != NULL) {
    461501                ++cnt;
     
    464504
    465505        /* Need to copy again as buf was mangled */
    466         free(cmd->buf);
    467         cmd->buf = str_dup(str);
    468         if (cmd->buf == NULL)
     506        free(buf);
     507        buf = str_dup(str);
     508        if (buf == NULL)
    469509                return ENOMEM;
    470510
    471511        cmd->argv = calloc(cnt + 1, sizeof(char *));
    472512        if (cmd->argv == NULL) {
    473                 free(cmd->buf);
     513                free(buf);
    474514                return ENOMEM;
    475515        }
    476516
    477         /* Fill in pointers */
     517        /* Copy individual arguments */
    478518        cnt = 0;
    479         arg = str_tok(cmd->buf, " ", &next);
     519        arg = str_tok(buf, " ", &next);
    480520        while (arg != NULL) {
    481                 cmd->argv[cnt++] = arg;
     521                cmd->argv[cnt] = str_dup(arg);
     522                if (cmd->argv[cnt] == NULL) {
     523                        tbsmenu_cmd_fini(cmd);
     524                        return ENOMEM;
     525                }
     526                ++cnt;
     527
    482528                arg = str_tok(next, " ", &next);
    483529        }
     
    494540static void tbsmenu_cmd_fini(tbsmenu_cmd_t *cmd)
    495541{
     542        char **cp;
     543
     544        /* Free all pointers in NULL-terminated list */
     545        cp = cmd->argv;
     546        while (*cp != NULL) {
     547                free(*cp);
     548                ++cp;
     549        }
     550
     551        /* Free the array of pointers */
    496552        free(cmd->argv);
    497         free(cmd->buf);
     553}
     554
     555/** Free command structure.
     556 *
     557 * @param cmd Command
     558 * @param entry Start menu entry
     559 * @param dspec Display specification
     560 * @return EOK on success or an error code
     561 */
     562static errno_t tbsmenu_cmd_subst(tbsmenu_cmd_t *cmd, tbsmenu_entry_t *entry,
     563    const char *dspec)
     564{
     565        char **cp;
     566
     567        (void)entry;
     568
     569        /* Walk NULL-terminated list of arguments */
     570        cp = cmd->argv;
     571        while (*cp != NULL) {
     572                if (str_cmp(*cp, "%d") == 0) {
     573                        /* Display specification */
     574                        free(*cp);
     575                        *cp = str_dup(dspec);
     576                        if (*cp == NULL)
     577                                return ENOMEM;
     578                }
     579                ++cp;
     580        }
     581
     582        return EOK;
    498583}
    499584
     
    516601        char **cp;
    517602        const char **targv = NULL;
     603        char *dspec = NULL;
     604        sysarg_t idev_id;
     605        int rv;
    518606        errno_t rc;
    519607        ui_t *ui;
     
    522610        suspended = false;
    523611
     612        idev_id = ui_menu_get_idev_id(entry->tbsmenu->smenu);
     613
     614        rv = asprintf(&dspec, "%s?idev=%zu",
     615            entry->tbsmenu->display_spec, (size_t)idev_id);
     616        if (rv < 0)
     617                return ENOMEM;
     618
     619        /* Split command string into individual arguments */
    524620        rc = tbsmenu_cmd_split(entry->cmd, &cmd);
    525         if (rc != EOK)
     621        if (rc != EOK) {
     622                free(dspec);
    526623                return rc;
     624        }
     625
     626        /* Substitute metacharacters in command */
     627        rc = tbsmenu_cmd_subst(&cmd, entry, dspec);
     628        if (rc != EOK)
     629                goto error;
    527630
    528631        /* Free up and clean console for the child task. */
     
    542645                }
    543646
    544                 targv = calloc(cnt + 3, sizeof(char **));
     647                targv = calloc(cnt + 5, sizeof(char **));
    545648                if (targv == NULL)
    546649                        goto error;
    547650
    548651                targv[0] = "/app/terminal";
    549                 targv[1] = "-c";
     652                targv[1] = "-d";
     653                targv[2] = dspec;
     654                targv[3] = "-c";
    550655
    551656                for (i = 0; i <= cnt; i++) {
    552                         targv[2 + i] = cmd.argv[i];
     657                        targv[4 + i] = cmd.argv[i];
    553658                }
    554659
     
    578683        return EOK;
    579684error:
     685        free(dspec);
    580686        if (targv != NULL)
    581687                free(targv);
  • uspace/app/taskbar/tbsmenu.h

    re4cc266 r34aad53d  
    4646#include "types/tbsmenu.h"
    4747
    48 extern errno_t tbsmenu_create(ui_window_t *, ui_fixed_t *, tbsmenu_t **);
     48extern errno_t tbsmenu_create(ui_window_t *, ui_fixed_t *, const char *,
     49    tbsmenu_t **);
    4950extern errno_t tbsmenu_load(tbsmenu_t *, const char *);
     51extern void tbsmenu_reload(tbsmenu_t *);
    5052extern void tbsmenu_set_rect(tbsmenu_t *, gfx_rect_t *);
    5153extern void tbsmenu_open(tbsmenu_t *);
  • uspace/app/taskbar/test/tbsmenu.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6161        ui_window_add(window, ui_fixed_ctl(fixed));
    6262
    63         rc = tbsmenu_create(window, fixed, &tbsmenu);
     63        rc = tbsmenu_create(window, fixed, UI_DISPLAY_DEFAULT, &tbsmenu);
    6464        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    6565
     
    9292        ui_window_add(window, ui_fixed_ctl(fixed));
    9393
    94         rc = tbsmenu_create(window, fixed, &tbsmenu);
     94        rc = tbsmenu_create(window, fixed, UI_DISPLAY_DEFAULT, &tbsmenu);
    9595        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    9696
  • uspace/app/taskbar/types/taskbar.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6060        /** Clock */
    6161        taskbar_clock_t *clock;
     62        /** Configuration change listener */
     63        tbarcfg_listener_t *lst;
    6264} taskbar_t;
    6365
  • uspace/app/taskbar/types/tbsmenu.h

    re4cc266 r34aad53d  
    4040#include <gfx/coord.h>
    4141#include <stdbool.h>
     42#include <tbarcfg/tbarcfg.h>
    4243#include <ui/pbutton.h>
    4344#include <ui/fixed.h>
     
    8485        /** Device ID of last input event */
    8586        sysarg_t ev_idev_id;
     87
     88        /** Repository path name */
     89        char *repopath;
     90
     91        /** Need to reload menu when possible */
     92        bool needs_reload;
     93
     94        /** Display specification */
     95        char *display_spec;
    8696} tbsmenu_t;
    8797
    8898/** Command split into individual parts */
    8999typedef struct {
    90         /** Buffer holding broken down command */
    91         char *buf;
    92100        /** NULL-terminated array of string pointers */
    93101        char **argv;
  • uspace/app/terminal/terminal.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2012 Petr Koupy
    44 * All rights reserved.
     
    974974                wparams.placement = ui_wnd_place_top_left;
    975975
     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
    976982        /*
    977983         * Compute window rectangle such that application area corresponds
    978984         * to rect
    979985         */
    980         ui_wdecor_rect_from_app(wparams.style, &rect, &wrect);
     986        ui_wdecor_rect_from_app(term->ui, wparams.style, &rect, &wrect);
    981987        off = wrect.p0;
    982988        gfx_rect_rtranslate(&off, &wrect, &wparams.rect);
    983989
    984990        term->off = off;
    985 
    986         rc = ui_create(display_spec, &term->ui);
    987         if (rc != EOK) {
    988                 printf("Error creating UI on %s.\n", display_spec);
    989                 goto error;
    990         }
    991991
    992992        rc = ui_window_create(term->ui, &wparams, &term->window);
  • uspace/app/viewer/viewer.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2020 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2013 Martin Decky
    44 * All rights reserved.
     
    4040#include <stdlib.h>
    4141#include <str.h>
     42#include <ui/filedialog.h>
    4243#include <ui/image.h>
    4344#include <ui/ui.h>
     
    5051typedef struct {
    5152        ui_t *ui;
     53
     54        size_t imgs_count;
     55        size_t imgs_current;
     56        char **imgs;
     57
     58        bool fullscreen;
     59        ui_window_t *window;
     60        gfx_bitmap_t *bitmap;
     61        ui_image_t *image;
     62        gfx_context_t *window_gc;
     63        ui_file_dialog_t *dialog;
     64
     65        gfx_rect_t img_rect;
    5266} viewer_t;
    5367
    54 static size_t imgs_count;
    55 static size_t imgs_current = 0;
    56 static char **imgs;
    57 
    58 static ui_window_t *window;
    59 static gfx_bitmap_t *bitmap = NULL;
    60 static ui_image_t *image = NULL;
    61 static gfx_context_t *window_gc;
    62 
    63 static gfx_rect_t img_rect;
    64 
    65 static bool img_load(gfx_context_t *gc, const char *, gfx_bitmap_t **,
     68static bool viewer_img_load(viewer_t *, const char *, gfx_bitmap_t **,
    6669    gfx_rect_t *);
    67 static bool img_setup(gfx_context_t *, gfx_bitmap_t *, gfx_rect_t *);
     70static bool viewer_img_setup(viewer_t *, gfx_bitmap_t *, gfx_rect_t *);
     71static errno_t viewer_window_create(viewer_t *);
     72static void viewer_window_destroy(viewer_t *);
    6873
    6974static void wnd_close(ui_window_t *, void *);
     
    7580};
    7681
     82static void file_dialog_bok(ui_file_dialog_t *, void *, const char *);
     83static void file_dialog_bcancel(ui_file_dialog_t *, void *);
     84static void file_dialog_close(ui_file_dialog_t *, void *);
     85
     86static ui_file_dialog_cb_t file_dialog_cb = {
     87        .bok = file_dialog_bok,
     88        .bcancel = file_dialog_bcancel,
     89        .close = file_dialog_close
     90};
     91
    7792/** Window close request
    7893 *
     
    87102}
    88103
    89 static void wnd_kbd_event(ui_window_t *window, void *arg,
    90     kbd_event_t *event)
     104/** Viewer unmodified key press.
     105 *
     106 * @param viewer Viewer
     107 * @param event Keyboard event
     108 */
     109static void viewer_kbd_event_unmod(viewer_t *viewer, kbd_event_t *event)
    91110{
    92111        bool update = false;
    93112
    94         if ((event->type == KEY_PRESS) && (event->c == 'q'))
    95                 exit(0);
    96 
    97         if ((event->type == KEY_PRESS) && (event->key == KC_PAGE_DOWN)) {
    98                 if (imgs_current == imgs_count - 1)
    99                         imgs_current = 0;
     113        if (event->key == KC_Q || event->key == KC_ESCAPE)
     114                ui_quit(viewer->ui);
     115
     116        if (event->key == KC_PAGE_DOWN) {
     117                if (viewer->imgs_current == viewer->imgs_count - 1)
     118                        viewer->imgs_current = 0;
    100119                else
    101                         imgs_current++;
     120                        viewer->imgs_current++;
    102121
    103122                update = true;
    104123        }
    105124
    106         if ((event->type == KEY_PRESS) && (event->key == KC_PAGE_UP)) {
    107                 if (imgs_current == 0)
    108                         imgs_current = imgs_count - 1;
     125        if (event->key == KC_PAGE_UP) {
     126                if (viewer->imgs_current == 0)
     127                        viewer->imgs_current = viewer->imgs_count - 1;
    109128                else
    110                         imgs_current--;
     129                        viewer->imgs_current--;
    111130
    112131                update = true;
     
    117136                gfx_rect_t lrect;
    118137
    119                 if (!img_load(window_gc, imgs[imgs_current], &lbitmap, &lrect)) {
    120                         printf("Cannot load image \"%s\".\n", imgs[imgs_current]);
     138                if (!viewer_img_load(viewer, viewer->imgs[viewer->imgs_current],
     139                    &lbitmap, &lrect)) {
     140                        printf("Cannot load image \"%s\".\n",
     141                            viewer->imgs[viewer->imgs_current]);
    121142                        exit(4);
    122143                }
    123                 if (!img_setup(window_gc, lbitmap, &lrect)) {
    124                         printf("Cannot setup image \"%s\".\n", imgs[imgs_current]);
     144                if (!viewer_img_setup(viewer, lbitmap, &lrect)) {
     145                        printf("Cannot setup image \"%s\".\n",
     146                            viewer->imgs[viewer->imgs_current]);
    125147                        exit(6);
    126148                }
     
    128150}
    129151
    130 static bool img_load(gfx_context_t *gc, const char *fname,
     152/** Viewer ctrl-key key press.
     153 *
     154 * @param viewer Viewer
     155 * @param event Keyboard event
     156 */
     157static void viewer_kbd_event_ctrl(viewer_t *viewer, kbd_event_t *event)
     158{
     159        if (event->key == KC_Q)
     160                ui_quit(viewer->ui);
     161}
     162
     163/** Viewer window keyboard event.
     164 *
     165 * @param window UI window
     166 * @param arg Argument (viewer_t *)
     167 * @param event Keyboard event
     168 */
     169static void wnd_kbd_event(ui_window_t *window, void *arg,
     170    kbd_event_t *event)
     171{
     172        viewer_t *viewer = (viewer_t *)arg;
     173
     174        if (event->type != KEY_PRESS)
     175                return;
     176
     177        if ((event->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
     178                viewer_kbd_event_unmod(viewer, event);
     179
     180        if ((event->mods & KM_CTRL) != 0 &&
     181            (event->mods & (KM_ALT | KM_SHIFT)) == 0)
     182                viewer_kbd_event_ctrl(viewer, event);
     183
     184        ui_window_def_kbd(window, event);
     185}
     186
     187/** File dialog OK button press.
     188 *
     189 * @param dialog File dialog
     190 * @param arg Argument (viewer_t *)
     191 * @param fname File name
     192 */
     193static void file_dialog_bok(ui_file_dialog_t *dialog, void *arg,
     194    const char *fname)
     195{
     196        viewer_t *viewer = (viewer_t *) arg;
     197        errno_t rc;
     198
     199        viewer->imgs_count = 1;
     200        viewer->imgs = calloc(viewer->imgs_count, sizeof(char *));
     201        if (viewer->imgs == NULL) {
     202                printf("Out of memory.\n");
     203                ui_quit(viewer->ui);
     204                return;
     205        }
     206
     207        viewer->imgs[0] = str_dup(fname);
     208        if (viewer->imgs[0] == NULL) {
     209                printf("Out of memory.\n");
     210                ui_quit(viewer->ui);
     211                return;
     212        }
     213
     214        rc = viewer_window_create(viewer);
     215        if (rc != EOK)
     216                ui_quit(viewer->ui);
     217
     218        ui_file_dialog_destroy(dialog);
     219        viewer->dialog = NULL;
     220}
     221
     222/** File dialog cancel button press.
     223 *
     224 * @param dialog File dialog
     225 * @param arg Argument (viewer_t *)
     226 */
     227static void file_dialog_bcancel(ui_file_dialog_t *dialog, void *arg)
     228{
     229        viewer_t *viewer = (viewer_t *) arg;
     230
     231        ui_file_dialog_destroy(dialog);
     232        ui_quit(viewer->ui);
     233}
     234
     235/** File dialog close request.
     236 *
     237 * @param dialog File dialog
     238 * @param arg Argument (viewer_t *)
     239 */
     240static void file_dialog_close(ui_file_dialog_t *dialog, void *arg)
     241{
     242        viewer_t *viewer = (viewer_t *) arg;
     243
     244        ui_file_dialog_destroy(dialog);
     245        ui_quit(viewer->ui);
     246}
     247
     248static bool viewer_img_load(viewer_t *viewer, const char *fname,
    131249    gfx_bitmap_t **rbitmap, gfx_rect_t *rect)
    132250{
     
    159277        vfs_put(fd);
    160278
    161         rc = decode_tga(gc, tga, stat.size, rbitmap, rect);
     279        rc = decode_tga(viewer->window_gc, tga, stat.size, rbitmap, rect);
    162280        if (rc != EOK) {
    163281                free(tga);
     
    167285        free(tga);
    168286
    169         img_rect = *rect;
     287        viewer->img_rect = *rect;
    170288        return true;
    171289}
    172290
    173 static bool img_setup(gfx_context_t *gc, gfx_bitmap_t *bmp, gfx_rect_t *rect)
     291static bool viewer_img_setup(viewer_t *viewer, gfx_bitmap_t *bmp,
     292    gfx_rect_t *rect)
    174293{
    175294        gfx_rect_t arect;
     
    178297        errno_t rc;
    179298
    180         ui_res = ui_window_get_res(window);
    181 
    182         ui_window_get_app_rect(window, &arect);
     299        ui_res = ui_window_get_res(viewer->window);
     300
     301        ui_window_get_app_rect(viewer->window, &arect);
    183302
    184303        /* Center image on application area */
    185304        gfx_rect_ctr_on_rect(rect, &arect, &irect);
    186305
    187         if (image != NULL) {
    188                 ui_image_set_bmp(image, bmp, rect);
    189                 (void) ui_image_paint(image);
    190                 ui_image_set_rect(image, &irect);
     306        if (viewer->image != NULL) {
     307                ui_image_set_bmp(viewer->image, bmp, rect);
     308                (void) ui_image_paint(viewer->image);
     309                ui_image_set_rect(viewer->image, &irect);
    191310        } else {
    192                 rc = ui_image_create(ui_res, bmp, rect, &image);
     311                rc = ui_image_create(ui_res, bmp, rect, &viewer->image);
    193312                if (rc != EOK) {
    194313                        gfx_bitmap_destroy(bmp);
     
    196315                }
    197316
    198                 ui_image_set_rect(image, &irect);
    199                 ui_window_add(window, ui_image_ctl(image));
    200         }
    201 
    202         if (bitmap != NULL)
    203                 gfx_bitmap_destroy(bitmap);
    204 
    205         bitmap = bmp;
     317                ui_image_set_rect(viewer->image, &irect);
     318                ui_window_add(viewer->window, ui_image_ctl(viewer->image));
     319        }
     320
     321        if (viewer->bitmap != NULL)
     322                gfx_bitmap_destroy(viewer->bitmap);
     323
     324        viewer->bitmap = bmp;
    206325        return true;
    207326}
     
    214333}
    215334
    216 int main(int argc, char *argv[])
    217 {
    218         const char *display_spec = UI_DISPLAY_DEFAULT;
     335static errno_t viewer_window_create(viewer_t *viewer)
     336{
     337        ui_wnd_params_t params;
    219338        gfx_bitmap_t *lbitmap;
    220339        gfx_rect_t lrect;
    221         bool fullscreen = false;
    222         gfx_rect_t rect;
    223340        gfx_rect_t wrect;
    224341        gfx_coord2_t off;
    225         ui_t *ui;
    226         ui_wnd_params_t params;
    227         viewer_t viewer;
     342        gfx_rect_t rect;
    228343        errno_t rc;
    229         int i;
    230 
    231         i = 1;
    232         while (i < argc && argv[i][0] == '-') {
    233                 if (str_cmp(argv[i], "-d") == 0) {
    234                         ++i;
    235                         if (i >= argc) {
    236                                 printf("Argument missing.\n");
    237                                 print_syntax();
    238                                 return 1;
    239                         }
    240 
    241                         display_spec = argv[i++];
    242                 } else if (str_cmp(argv[i], "-f") == 0) {
    243                         ++i;
    244                         fullscreen = true;
    245                 } else {
    246                         printf("Invalid option '%s'.\n", argv[i]);
    247                         print_syntax();
    248                         return 1;
    249                 }
    250         }
    251 
    252         if (i >= argc) {
    253                 printf("No image files specified.\n");
    254                 print_syntax();
    255                 return 1;
    256         }
    257 
    258         imgs_count = argc - i;
    259         imgs = calloc(imgs_count, sizeof(char *));
    260         if (imgs == NULL) {
    261                 printf("Out of memory.\n");
    262                 return 1;
    263         }
    264 
    265         for (int j = 0; j < argc - i; j++) {
    266                 imgs[j] = str_dup(argv[i + j]);
    267                 if (imgs[j] == NULL) {
    268                         printf("Out of memory.\n");
    269                         return 3;
    270                 }
    271         }
    272 
    273         rc = ui_create(display_spec, &ui);
    274         if (rc != EOK) {
    275                 printf("Error creating UI on display %s.\n", display_spec);
    276                 return 1;
    277         }
    278 
    279         viewer.ui = ui;
    280344
    281345        /*
     
    290354        params.rect.p1.y = 1;
    291355
    292         if (fullscreen) {
     356        if (viewer->fullscreen) {
    293357                params.style &= ~ui_wds_decorated;
    294358                params.placement = ui_wnd_place_full_screen;
    295359        }
    296360
    297         rc = ui_window_create(ui, &params, &window);
     361        rc = ui_window_create(viewer->ui, &params, &viewer->window);
    298362        if (rc != EOK) {
    299363                printf("Error creating window.\n");
    300                 return 1;
    301         }
    302 
    303         window_gc = ui_window_get_gc(window);
    304 
    305         ui_window_set_cb(window, &window_cb, (void *) &viewer);
    306 
    307         if (!img_load(window_gc, imgs[imgs_current], &lbitmap, &lrect)) {
    308                 printf("Cannot load image \"%s\".\n", imgs[imgs_current]);
    309                 return 1;
     364                goto error;
     365        }
     366
     367        viewer->window_gc = ui_window_get_gc(viewer->window);
     368
     369        ui_window_set_cb(viewer->window, &window_cb, (void *)viewer);
     370
     371        if (!viewer_img_load(viewer, viewer->imgs[viewer->imgs_current],
     372            &lbitmap, &lrect)) {
     373                printf("Cannot load image \"%s\".\n",
     374                    viewer->imgs[viewer->imgs_current]);
     375                goto error;
    310376        }
    311377
     
    314380         * to rect
    315381         */
    316         ui_wdecor_rect_from_app(params.style, &lrect, &wrect);
     382        ui_wdecor_rect_from_app(viewer->ui, params.style, &lrect, &wrect);
    317383        off = wrect.p0;
    318384        gfx_rect_rtranslate(&off, &wrect, &rect);
    319385
    320         if (!fullscreen) {
    321                 rc = ui_window_resize(window, &rect);
     386        if (!viewer->fullscreen) {
     387                rc = ui_window_resize(viewer->window, &rect);
    322388                if (rc != EOK) {
    323389                        printf("Error resizing window.\n");
    324                         return 1;
    325                 }
    326         }
    327 
    328         if (!img_setup(window_gc, lbitmap, &lrect)) {
    329                 printf("Cannot setup image \"%s\".\n", imgs[imgs_current]);
    330                 return 1;
    331         }
    332 
    333         rc = ui_window_paint(window);
     390                        goto error;
     391                }
     392        }
     393
     394        if (!viewer_img_setup(viewer, lbitmap, &lrect)) {
     395                printf("Cannot setup image \"%s\".\n",
     396                    viewer->imgs[viewer->imgs_current]);
     397                goto error;
     398        }
     399
     400        rc = ui_window_paint(viewer->window);
    334401        if (rc != EOK) {
    335402                printf("Error painting window.\n");
    336                 return 1;
     403                goto error;
     404        }
     405
     406        return EOK;
     407error:
     408        viewer_window_destroy(viewer);
     409        ui_quit(viewer->ui);
     410        return rc;
     411}
     412
     413static void viewer_window_destroy(viewer_t *viewer)
     414{
     415        if (viewer->window != NULL)
     416                ui_window_destroy(viewer->window);
     417        viewer->window = NULL;
     418}
     419
     420int main(int argc, char *argv[])
     421{
     422        const char *display_spec = UI_ANY_DEFAULT;
     423        ui_t *ui = NULL;
     424        viewer_t *viewer;
     425        errno_t rc;
     426        int i;
     427        unsigned u;
     428        ui_file_dialog_params_t fdparams;
     429
     430        viewer = calloc(1, sizeof(viewer_t));
     431        if (viewer == NULL) {
     432                printf("Out of memory.\n");
     433                goto error;
     434        }
     435
     436        i = 1;
     437        while (i < argc && argv[i][0] == '-') {
     438                if (str_cmp(argv[i], "-d") == 0) {
     439                        ++i;
     440                        if (i >= argc) {
     441                                printf("Argument missing.\n");
     442                                print_syntax();
     443                                goto error;
     444                        }
     445
     446                        display_spec = argv[i++];
     447                } else if (str_cmp(argv[i], "-f") == 0) {
     448                        ++i;
     449                        viewer->fullscreen = true;
     450                } else {
     451                        printf("Invalid option '%s'.\n", argv[i]);
     452                        print_syntax();
     453                        goto error;
     454                }
     455        }
     456
     457        /* Images specified? */
     458        if (i < argc) {
     459                viewer->imgs_count = argc - i;
     460                viewer->imgs = calloc(viewer->imgs_count, sizeof(char *));
     461                if (viewer->imgs == NULL) {
     462                        printf("Out of memory.\n");
     463                        goto error;
     464                }
     465
     466                for (int j = 0; j < argc - i; j++) {
     467                        viewer->imgs[j] = str_dup(argv[i + j]);
     468                        if (viewer->imgs[j] == NULL) {
     469                                printf("Out of memory.\n");
     470                                goto error;
     471                        }
     472                }
     473        }
     474
     475        rc = ui_create(display_spec, &ui);
     476        if (rc != EOK) {
     477                printf("Error creating UI on display %s.\n", display_spec);
     478                goto error;
     479        }
     480
     481        if (ui_is_fullscreen(ui))
     482                viewer->fullscreen = true;
     483
     484        viewer->ui = ui;
     485
     486        if (viewer->imgs != NULL) {
     487                /* We have images, create viewer window. */
     488                rc = viewer_window_create(viewer);
     489                if (rc != EOK)
     490                        goto error;
     491        } else {
     492                /* No images specified, browse for one. */
     493                ui_file_dialog_params_init(&fdparams);
     494                fdparams.caption = "Open Image";
     495
     496                rc = ui_file_dialog_create(viewer->ui, &fdparams,
     497                    &viewer->dialog);
     498                if (rc != EOK) {
     499                        printf("Error creating file dialog.\n");
     500                        goto error;
     501                }
     502
     503                ui_file_dialog_set_cb(viewer->dialog, &file_dialog_cb,
     504                    (void *)viewer);
    337505        }
    338506
    339507        ui_run(ui);
    340508
     509        ui_window_destroy(viewer->window);
     510        ui_destroy(ui);
     511        free(viewer);
     512
    341513        return 0;
     514error:
     515        if (viewer != NULL && viewer->dialog != NULL)
     516                ui_file_dialog_destroy(viewer->dialog);
     517        if (viewer != NULL && viewer->imgs != NULL) {
     518                for (u = 0; u < viewer->imgs_count; u++) {
     519                        if (viewer->imgs[i] != NULL)
     520                                free(viewer->imgs[i]);
     521                }
     522                free(viewer->imgs);
     523        }
     524        if (viewer != NULL)
     525                viewer_window_destroy(viewer);
     526        if (ui != NULL)
     527                ui_destroy(ui);
     528        if (viewer != NULL)
     529                free(viewer);
     530        return 1;
    342531}
    343532
  • uspace/lib/congfx/src/console.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    9191        uint8_t attr;
    9292
    93         if ((clr >> 24) == 0) {
     93        if ((clr >> 24) == 0xff) {
    9494                /* RGB (no text) */
    9595                ch->ch = 0;
    9696                ch->flags = CHAR_FLAG_DIRTY;
    9797                ch->attrs.type = CHAR_ATTR_RGB;
    98                 ch->attrs.val.rgb.fgcolor = clr ^ 0xffffff;
     98                ch->attrs.val.rgb.fgcolor = clr;
    9999                ch->attrs.val.rgb.bgcolor = clr;
    100100        } else {
  • uspace/lib/gfx/src/color.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    6464        color->g = g;
    6565        color->b = b;
     66        color->attr = 0xff;
    6667
    6768        *rcolor = color;
  • uspace/lib/meson.build

    re4cc266 r34aad53d  
    3333        'c',
    3434        'math',
     35        'console',
    3536        'display',
     37        'input',
     38        'output',
    3639        'pixconv',
    3740        'posix',
  • uspace/lib/tbarcfg/include/tbarcfg/tbarcfg.h

    re4cc266 r34aad53d  
    4242#include <types/tbarcfg/tbarcfg.h>
    4343
     44#define TBARCFG_NOTIFY_DEFAULT "tbarcfg-notif"
     45
    4446extern errno_t tbarcfg_create(const char *, tbarcfg_t **);
    4547extern errno_t tbarcfg_open(const char *, tbarcfg_t **);
     
    6365extern errno_t smenu_entry_move_up(smenu_entry_t *);
    6466extern errno_t smenu_entry_move_down(smenu_entry_t *);
     67extern errno_t tbarcfg_listener_create(const char *, void (*)(void *),
     68    void *, tbarcfg_listener_t **);
     69extern void tbarcfg_listener_destroy(tbarcfg_listener_t *);
     70extern errno_t tbarcfg_notify(const char *);
    6571
    6672#endif
  • uspace/lib/tbarcfg/include/types/tbarcfg/tbarcfg.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4343typedef struct smenu_entry smenu_entry_t;
    4444
     45struct tbarcfg_listener;
     46typedef struct tbarcfg_listener tbarcfg_listener_t;
     47
    4548#endif
    4649
  • uspace/lib/tbarcfg/private/tbarcfg.h

    re4cc266 r34aad53d  
    7171};
    7272
     73/** Taskbar configuration listener */
     74typedef struct tbarcfg_listener {
     75        /** Notification callback */
     76        void (*cb)(void *);
     77        /** Callback argument */
     78        void *arg;
     79} tbarcfg_listener_t;
     80
    7381extern errno_t smenu_entry_new(tbarcfg_t *, sif_node_t *, const char *,
    7482    const char *, bool, smenu_entry_t **);
  • uspace/lib/tbarcfg/src/tbarcfg.c

    re4cc266 r34aad53d  
    3434 */
    3535
     36#include <async.h>
    3637#include <errno.h>
    3738#include <sif.h>
     39#include <ipc/tbarcfg.h>
     40#include <loc.h>
     41#include <task.h>
    3842#include <tbarcfg/tbarcfg.h>
     43#include <stdio.h>
    3944#include <stdlib.h>
    4045#include <str.h>
    4146#include "../private/tbarcfg.h"
     47
     48static void tbarcfg_notify_conn(ipc_call_t *, void *);
    4249
    4350/** Create taskbar configuration.
     
    784791}
    785792
     793/** Create taskbar configuration listener.
     794 *
     795 * Listens for taskbar configuration change notifications.
     796 *
     797 * @param nchan Notification channel (TBARCFG_NOTIFY_DEFAULT)
     798 * @param rlst Place to store pointer to new listener
     799 * @return EOK on success or an error code
     800 */
     801errno_t tbarcfg_listener_create(const char *nchan, void (*cb)(void *),
     802    void *arg, tbarcfg_listener_t **rlst)
     803{
     804        tbarcfg_listener_t *lst;
     805        service_id_t svcid = 0;
     806        loc_srv_t *srv = NULL;
     807        task_id_t taskid;
     808        char *svcname = NULL;
     809        category_id_t catid;
     810        port_id_t port;
     811        int rv;
     812        errno_t rc;
     813
     814        lst = calloc(1, sizeof(tbarcfg_listener_t));
     815        if (lst == NULL)
     816                return ENOMEM;
     817
     818        lst->cb = cb;
     819        lst->arg = arg;
     820
     821        rc = async_create_port(INTERFACE_TBARCFG_NOTIFY,
     822            tbarcfg_notify_conn, (void *)lst, &port);
     823        if (rc != EOK)
     824                goto error;
     825
     826        rc = loc_server_register("tbarcfg-listener", &srv);
     827        if (rc != EOK)
     828                goto error;
     829
     830        taskid = task_get_id();
     831
     832        rv = asprintf(&svcname, "tbarcfg/%u", (unsigned)taskid);
     833        if (rv < 0) {
     834                rc = ENOMEM;
     835                goto error;
     836        }
     837
     838        rc = loc_service_register(srv, svcname, &svcid);
     839        if (rc != EOK)
     840                goto error;
     841
     842        rc = loc_category_get_id(nchan, &catid, 0);
     843        if (rc != EOK)
     844                goto error;
     845
     846        rc = loc_service_add_to_cat(srv, svcid, catid);
     847        if (rc != EOK)
     848                goto error;
     849
     850        *rlst = lst;
     851        return EOK;
     852error:
     853        if (svcid != 0)
     854                loc_service_unregister(srv, svcid);
     855        if (srv != NULL)
     856                loc_server_unregister(srv);
     857        if (svcname != NULL)
     858                free(svcname);
     859        return rc;
     860}
     861
     862/** Destroy taskbar configuration listener.
     863 *
     864 * @param lst Listener
     865 */
     866void tbarcfg_listener_destroy(tbarcfg_listener_t *lst)
     867{
     868        free(lst);
     869}
     870
     871/** Send taskbar configuration notification to a particular service ID.
     872 *
     873 * @param svcid Service ID
     874 * @return EOK on success or an error code
     875 */
     876static errno_t tbarcfg_notify_svc(service_id_t svcid)
     877{
     878        async_sess_t *sess;
     879        async_exch_t *exch;
     880        errno_t rc;
     881
     882        sess = loc_service_connect(svcid, INTERFACE_TBARCFG_NOTIFY, 0);
     883        if (sess == NULL)
     884                return EIO;
     885
     886        exch = async_exchange_begin(sess);
     887        rc = async_req_0_0(exch, TBARCFG_NOTIFY_NOTIFY);
     888        if (rc != EOK) {
     889                async_exchange_end(exch);
     890                async_hangup(sess);
     891                return rc;
     892        }
     893
     894        async_exchange_end(exch);
     895        async_hangup(sess);
     896        return EOK;
     897}
     898
     899/** Send taskbar configuration change notification.
     900 *
     901 * @param nchan Notification channel (TBARCFG_NOTIFY_DEFAULT)
     902 */
     903errno_t tbarcfg_notify(const char *nchan)
     904{
     905        errno_t rc;
     906        category_id_t catid;
     907        service_id_t *svcs = NULL;
     908        size_t count, i;
     909
     910        rc = loc_category_get_id(nchan, &catid, 0);
     911        if (rc != EOK)
     912                return rc;
     913
     914        rc = loc_category_get_svcs(catid, &svcs, &count);
     915        if (rc != EOK)
     916                return rc;
     917
     918        for (i = 0; i < count; i++) {
     919                rc = tbarcfg_notify_svc(svcs[i]);
     920                if (rc != EOK)
     921                        goto error;
     922        }
     923
     924        free(svcs);
     925        return EOK;
     926error:
     927        free(svcs);
     928        return rc;
     929}
     930
     931/** Taskbar configuration connection handler.
     932 *
     933 * @param icall Initial call
     934 * @param arg Argument (tbarcfg_listener_t *)
     935 */
     936static void tbarcfg_notify_conn(ipc_call_t *icall, void *arg)
     937{
     938        tbarcfg_listener_t *lst = (tbarcfg_listener_t *)arg;
     939
     940        /* Accept the connection */
     941        async_accept_0(icall);
     942
     943        while (true) {
     944                ipc_call_t call;
     945                async_get_call(&call);
     946                sysarg_t method = ipc_get_imethod(&call);
     947
     948                if (!method) {
     949                        /* The other side has hung up */
     950                        async_answer_0(&call, EOK);
     951                        return;
     952                }
     953
     954                switch (method) {
     955                case TBARCFG_NOTIFY_NOTIFY:
     956                        lst->cb(lst->arg);
     957                        async_answer_0(&call, EOK);
     958                        break;
     959                default:
     960                        async_answer_0(&call, EINVAL);
     961                }
     962        }
     963}
     964
    786965/** @}
    787966 */
  • uspace/lib/tbarcfg/test/tbarcfg.c

    re4cc266 r34aad53d  
    3030#include <pcut/pcut.h>
    3131#include <tbarcfg/tbarcfg.h>
     32#include <stdbool.h>
    3233#include <stdio.h>
    3334
     
    3536
    3637PCUT_TEST_SUITE(tbarcfg);
     38
     39typedef struct {
     40        bool notified;
     41} tbarcfg_test_resp_t;
     42
     43static void test_cb(void *);
    3744
    3845/** Creating, opening and closing taskbar configuration */
     
    554561}
    555562
     563/** Notifications can be delivered from tbarcfg_notify() to a listener. */
     564PCUT_TEST(notify)
     565{
     566        errno_t rc;
     567        tbarcfg_listener_t *lst;
     568        tbarcfg_test_resp_t test_resp;
     569
     570        test_resp.notified = false;
     571
     572        printf("create listener resp=%p\n", (void *)&test_resp);
     573        rc = tbarcfg_listener_create(TBARCFG_NOTIFY_DEFAULT,
     574            test_cb, &test_resp, &lst);
     575        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     576
     577        rc = tbarcfg_notify(TBARCFG_NOTIFY_DEFAULT);
     578        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     579
     580        PCUT_ASSERT_TRUE(test_resp.notified);
     581        tbarcfg_listener_destroy(lst);
     582}
     583
     584static void test_cb(void *arg)
     585{
     586        tbarcfg_test_resp_t *resp = (tbarcfg_test_resp_t *)arg;
     587
     588        printf("test_cb: executing resp=%p\n", (void *)resp);
     589        resp->notified = true;
     590}
     591
    556592PCUT_EXPORT(tbarcfg);
  • uspace/lib/ui/include/ui/menu.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5959extern ui_evclaim_t ui_menu_pos_event(ui_menu_t *, gfx_coord2_t *,
    6060    pos_event_t *);
     61extern sysarg_t ui_menu_get_idev_id(ui_menu_t *);
    6162
    6263#endif
  • uspace/lib/ui/include/ui/popup.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5454extern ui_resource_t *ui_popup_get_res(ui_popup_t *);
    5555extern gfx_context_t *ui_popup_get_gc(ui_popup_t *);
     56extern sysarg_t ui_popup_get_idev_id(ui_popup_t *);
    5657
    5758#endif
  • uspace/lib/ui/include/ui/wdecor.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4444#include <types/ui/event.h>
    4545#include <types/ui/resource.h>
     46#include <types/ui/ui.h>
    4647#include <types/ui/wdecor.h>
    4748
     
    5859extern ui_evclaim_t ui_wdecor_kbd_event(ui_wdecor_t *, kbd_event_t *);
    5960extern ui_evclaim_t ui_wdecor_pos_event(ui_wdecor_t *, pos_event_t *);
    60 extern void ui_wdecor_rect_from_app(ui_wdecor_style_t, gfx_rect_t *,
     61extern void ui_wdecor_rect_from_app(ui_t *, ui_wdecor_style_t, gfx_rect_t *,
    6162    gfx_rect_t *);
    6263extern void ui_wdecor_app_from_rect(ui_wdecor_style_t, gfx_rect_t *,
  • uspace/lib/ui/private/menu.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    7070        /** Callback argument */
    7171        void *arg;
     72        /** ID of device that activated entry */
     73        sysarg_t idev_id;
    7274};
    7375
  • uspace/lib/ui/private/popup.h

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    5858        /** Placement rectangle */
    5959        gfx_rect_t place;
     60        /** ID of device that sent input event */
     61        sysarg_t idev_id;
    6062};
    6163
  • uspace/lib/ui/src/menu.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    578578        ui_menu_t *menu = (ui_menu_t *)arg;
    579579
     580        menu->idev_id = ui_popup_get_idev_id(menu->popup);
    580581        ui_menu_kbd_event(menu, event);
    581582}
     
    592593        gfx_coord2_t spos;
    593594
     595        menu->idev_id = ui_popup_get_idev_id(menu->popup);
     596
    594597        spos.x = 0;
    595598        spos.y = 0;
     
    641644}
    642645
     646/** Get ID of last device that input event.
     647 *
     648 * @param menu Menu
     649 * @return Input device ID
     650 */
     651sysarg_t ui_menu_get_idev_id(ui_menu_t *menu)
     652{
     653        return menu->idev_id;
     654}
     655
    643656/** @}
    644657 */
  • uspace/lib/ui/src/menuentry.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    145145                return;
    146146
     147        mentry->menu->total_h -= ui_menu_entry_height(mentry);
     148        /* NOTE: max_caption_w/max_shortcut_w not updated (speed) */
     149
    147150        list_remove(&mentry->lentries);
     151
     152        /*
     153         * If we emptied the menu, reset accumulated dims so they
     154         * can be correctly calculated when (if) the menu is
     155         * re-populated.
     156         */
     157        if (list_empty(&mentry->menu->entries)) {
     158                mentry->menu->total_h = 0;
     159                mentry->menu->max_caption_w = 0;
     160                mentry->menu->max_shortcut_w = 0;
     161        }
     162
    148163        free(mentry->caption);
    149164        free(mentry);
  • uspace/lib/ui/src/popup.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    190190}
    191191
     192/** Get ID of device that sent the last position event.
     193 *
     194 * @param popup Popup window
     195 * @return Input device ID
     196 */
     197sysarg_t ui_popup_get_idev_id(ui_popup_t *popup)
     198{
     199        return popup->idev_id;
     200}
     201
    192202/** Handle close event in popup window.
    193203 *
     
    214224        ui_popup_t *popup = (ui_popup_t *)arg;
    215225
     226        /* Remember ID of device that sent the last event */
     227        popup->idev_id = event->kbd_id;
     228
    216229        if (popup->cb != NULL && popup->cb->kbd != NULL)
    217230                popup->cb->kbd(popup, popup->arg, event);
     
    229242        ui_popup_t *popup = (ui_popup_t *)arg;
    230243
     244        /* Remember ID of device that sent the last event */
     245        popup->idev_id = event->pos_id;
     246
    231247        if (popup->cb != NULL && popup->cb->pos != NULL)
    232248                popup->cb->pos(popup, popup->arg, event);
  • uspace/lib/ui/src/wdecor.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4545#include <ui/paint.h>
    4646#include <ui/pbutton.h>
     47#include <ui/ui.h>
    4748#include <ui/wdecor.h>
    4849#include "../private/resource.h"
     
    9495        /** Window resizing edge height */
    9596        wdecor_edge_h = 4,
     97        /** Window resizing edge witdth */
     98        wdecor_edge_w_text = 1,
     99        /** Window resizing edge height */
     100        wdecor_edge_h_text = 1,
    96101        /** Title bar height */
    97102        wdecor_tbar_h = 22,
     
    860865 * and its decoration.
    861866 *
     867 * @param ui UI
    862868 * @param style Decoration style
    863869 * @param app Application area rectangle
    864870 * @param rect Place to store (outer) window decoration rectangle
    865871 */
    866 void ui_wdecor_rect_from_app(ui_wdecor_style_t style, gfx_rect_t *app,
    867     gfx_rect_t *rect)
    868 {
     872void ui_wdecor_rect_from_app(ui_t *ui, ui_wdecor_style_t style,
     873    gfx_rect_t *app, gfx_rect_t *rect)
     874{
     875        bool textmode;
     876        gfx_coord_t edge_w, edge_h;
    869877        *rect = *app;
    870878
     879        textmode = ui_is_textmode(ui);
     880        if (textmode) {
     881                edge_w = wdecor_edge_w_text;
     882                edge_h = wdecor_edge_h_text;
     883        } else {
     884                edge_w = wdecor_edge_w;
     885                edge_h = wdecor_edge_h;
     886        }
     887
    871888        if ((style & ui_wds_frame) != 0) {
    872                 rect->p0.x -= wdecor_edge_w;
    873                 rect->p0.y -= wdecor_edge_h;
    874                 rect->p1.x += wdecor_edge_w;
    875                 rect->p1.y += wdecor_edge_h;
    876         }
    877 
    878         if ((style & ui_wds_titlebar) != 0)
    879                 rect->p0.y -= 22;
     889                rect->p0.x -= edge_w;
     890                rect->p0.y -= edge_h;
     891                rect->p1.x += edge_w;
     892                rect->p1.y += edge_h;
     893        }
     894
     895        if ((style & ui_wds_titlebar) != 0 && !textmode)
     896                rect->p0.y -= wdecor_tbar_h;
    880897}
    881898
  • uspace/lib/ui/test/wdecor.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2023 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3434#include <ui/pbutton.h>
    3535#include <ui/resource.h>
     36#include <ui/ui.h>
    3637#include <ui/wdecor.h>
    3738#include "../private/wdecor.h"
     
    13221323PCUT_TEST(rect_from_app)
    13231324{
     1325        errno_t rc;
     1326        ui_t *ui = NULL;
    13241327        gfx_rect_t arect;
    13251328        gfx_rect_t rect;
     1329
     1330        rc = ui_create_disp(NULL, &ui);
     1331        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    13261332
    13271333        arect.p0.x = 14;
     
    13301336        arect.p1.y = 196;
    13311337
    1332         ui_wdecor_rect_from_app(ui_wds_none, &arect, &rect);
     1338        ui_wdecor_rect_from_app(ui, ui_wds_none, &arect, &rect);
    13331339
    13341340        PCUT_ASSERT_INT_EQUALS(14, rect.p0.x);
     
    13371343        PCUT_ASSERT_INT_EQUALS(196, rect.p1.y);
    13381344
    1339         ui_wdecor_rect_from_app(ui_wds_frame, &arect, &rect);
     1345        ui_wdecor_rect_from_app(ui, ui_wds_frame, &arect, &rect);
    13401346
    13411347        PCUT_ASSERT_INT_EQUALS(10, rect.p0.x);
     
    13441350        PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
    13451351
    1346         ui_wdecor_rect_from_app(ui_wds_decorated, &arect, &rect);
     1352        ui_wdecor_rect_from_app(ui, ui_wds_decorated, &arect, &rect);
    13471353
    13481354        PCUT_ASSERT_INT_EQUALS(10, rect.p0.x);
     
    13511357        PCUT_ASSERT_INT_EQUALS(200, rect.p1.y);
    13521358
     1359        ui_destroy(ui);
    13531360}
    13541361
  • uspace/lib/usbhid/src/hidparser.c

    re4cc266 r34aad53d  
    225225        /* Than we take the higher bits from the LSB */
    226226        const unsigned bit_offset = item->offset % 8;
    227         const int lsb_bits = min(bits, 8);
     227        const int lsb_bits = min((unsigned)bits, 8 - bit_offset);
    228228
    229229        value |= (*data >> bit_offset) & BIT_RRANGE(uint8_t, lsb_bits);
  • uspace/srv/hid/output/port/ega.c

    re4cc266 r34aad53d  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2024 Jiri Svoboda
    33 * Copyright (c) 2011 Martin Decky
    44 * All rights reserved.
     
    9090                break;
    9191        case CHAR_ATTR_RGB:
    92                 attr = (attrs.val.rgb.bgcolor < attrs.val.rgb.fgcolor) ?
    93                     ega.style_inverted : ega.style_normal;
     92                attr =
     93                    ((RED(attrs.val.rgb.fgcolor) >= 0x80) ? 0x40 : 0) |
     94                    ((GREEN(attrs.val.rgb.fgcolor) >= 0x80) ? 0x20 : 0) |
     95                    ((BLUE(attrs.val.rgb.fgcolor) >= 0x80) ? 0x10 : 0) |
     96                    ((RED(attrs.val.rgb.bgcolor) >= 0x80) ? 0x04 : 0) |
     97                    ((GREEN(attrs.val.rgb.bgcolor) >= 0x80) ? 0x02 : 0) |
     98                    ((BLUE(attrs.val.rgb.bgcolor) >= 0x80) ? 0x01 : 0);
    9499                break;
    95100        }
  • uspace/srv/locsrv/locsrv.c

    re4cc266 r34aad53d  
    11/*
     2 * Copyright (c) 2024 Jiri Svoboda
    23 * Copyright (c) 2007 Josef Cejka
    3  * Copyright (c) 2011 Jiri Svoboda
    44 * All rights reserved.
    55 *
     
    13541354        categ_dir_add_cat(&cdir, cat);
    13551355
     1356        cat = category_new("tbarcfg-notif");
     1357        categ_dir_add_cat(&cdir, cat);
     1358
    13561359        cat = category_new("test3");
    13571360        categ_dir_add_cat(&cdir, cat);
  • version

    re4cc266 r34aad53d  
    2828
    2929
    30 HELENOS_RELEASE = 0.12.1
    31 HELENOS_CODENAME = Cathode
    32 HELENOS_COPYRIGHT = Copyright (c) 2001-2022 HelenOS project
     30HELENOS_RELEASE = 0.14.1
     31HELENOS_CODENAME = Aladar
     32HELENOS_COPYRIGHT = Copyright (c) 2001-2024 HelenOS project
Note: See TracChangeset for help on using the changeset viewer.