Changeset 8965860c in mainline


Ignore:
Timestamp:
2022-03-23T18:35:16Z (2 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7ca7215
Parents:
d4ea1f6
Message:

Clickmatic

A class that periodically generates when held, after initial delay.
This is quite similar to the typematic feature found in PC keyboards.
We use it to automatically scroll when scrollbar button or through
is held.

Location:
uspace
Files:
5 added
12 edited

Legend:

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

    rd4ea1f6 r8965860c  
    10701070        }
    10711071
    1072         rc = ui_scrollbar_create(ui_res, &demo.scrollbar);
     1072        rc = ui_scrollbar_create(ui, window, &demo.scrollbar);
    10731073        if (rc != EOK) {
    10741074                printf("Error creating button.\n");
  • uspace/lib/ui/include/ui/scrollbar.h

    rd4ea1f6 r8965860c  
    4343#include <types/ui/control.h>
    4444#include <types/ui/event.h>
    45 #include <types/ui/resource.h>
    4645#include <types/ui/scrollbar.h>
     46#include <types/ui/ui.h>
     47#include <types/ui/window.h>
    4748
    48 extern errno_t ui_scrollbar_create(ui_resource_t *, ui_scrollbar_t **);
     49extern errno_t ui_scrollbar_create(ui_t *, ui_window_t *, ui_scrollbar_t **);
    4950extern void ui_scrollbar_destroy(ui_scrollbar_t *);
    5051extern ui_control_t *ui_scrollbar_ctl(ui_scrollbar_t *);
     
    6263extern void ui_scrollbar_release(ui_scrollbar_t *, gfx_coord2_t *);
    6364extern void ui_scrollbar_update(ui_scrollbar_t *, gfx_coord2_t *);
     65extern void ui_scrollbar_throughs_update(ui_scrollbar_t *, gfx_coord2_t *);
    6466extern void ui_scrollbar_up(ui_scrollbar_t *);
    6567extern void ui_scrollbar_down(ui_scrollbar_t *);
  • uspace/lib/ui/include/ui/ui.h

    rd4ea1f6 r8965860c  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <io/console.h>
    4242#include <stdbool.h>
     43#include <types/ui/clickmatic.h>
    4344#include <types/ui/ui.h>
    4445
     
    5455extern errno_t ui_suspend(ui_t *);
    5556extern errno_t ui_resume(ui_t *);
     57extern void ui_lock(ui_t *);
     58extern void ui_unlock(ui_t *);
     59extern ui_clickmatic_t *ui_get_clickmatic(ui_t *);
    5660
    5761#endif
  • uspace/lib/ui/meson.build

    rd4ea1f6 r8965860c  
    11#
    2 # Copyright (c) 2021 Jiri Svoboda
     2# Copyright (c) 2022 Jiri Svoboda
    33# All rights reserved.
    44#
     
    3131        'src/accel.c',
    3232        'src/checkbox.c',
     33        'src/clickmatic.c',
    3334        'src/control.c',
    3435        'src/dummygc.c',
     
    5859        'test/accel.c',
    5960        'test/checkbox.c',
     61        'test/clickmatic.c',
    6062        'test/control.c',
    6163        'test/entry.c',
  • uspace/lib/ui/private/scrollbar.h

    rd4ea1f6 r8965860c  
    4848        /** Base control object */
    4949        struct ui_control *control;
    50         /** UI resource */
    51         struct ui_resource *res;
     50        /** UI */
     51        struct ui *ui;
     52        /** UI window containing scrollbar */
     53        struct ui_window *window;
    5254        /** Callbacks */
    5355        struct ui_scrollbar_cb *cb;
     
    6668        /** Up through is currently held down */
    6769        bool up_through_held;
     70        /** Pointer is inside up through */
     71        bool up_through_inside;
    6872        /** Down through is currently held down */
    6973        bool down_through_held;
     74        /** Pointer is inside down through */
     75        bool down_through_inside;
    7076        /** Position where thumb was pressed */
    7177        gfx_coord2_t press_pos;
     
    7480        /** Thumb position */
    7581        gfx_coord_t pos;
     82        /** Last cursor position (when through is held) */
     83        gfx_coord2_t last_curs_pos;
    7684};
    7785
     
    97105extern errno_t ui_scrollbar_paint_gfx(ui_scrollbar_t *);
    98106extern errno_t ui_scrollbar_paint_text(ui_scrollbar_t *);
    99 extern errno_t ui_scrollbar_thumb_clear(ui_scrollbar_t *);
    100107extern void ui_scrollbar_get_geom(ui_scrollbar_t *, ui_scrollbar_geom_t *);
    101108
  • uspace/lib/ui/private/ui.h

    rd4ea1f6 r8965860c  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <gfx/coord.h>
    4242#include <display.h>
     43#include <fibril_synch.h>
    4344#include <io/console.h>
    4445#include <stdbool.h>
     
    6364        /** Windows (in stacking order, ui_window_t) */
    6465        list_t windows;
     66        /** UI lock */
     67        fibril_mutex_t lock;
     68        /** Clickmatic */
     69        struct ui_clickmatic *clickmatic;
    6570};
    6671
  • uspace/lib/ui/src/scrollbar.c

    rd4ea1f6 r8965860c  
    5353 * button on the up/down through generates page up / page down events.
    5454 *
    55  * TODO: Up/down buttons/throughs should be equipped with an autorepeat
    56  * mechanism: after an initial delay, start repeating at a preset rate.
     55 * Pressing and holding down mouse button on up / down button or up / down
     56 * through will auto-scroll (using clickmatic).
    5757 */
    5858
     
    6565#include <stdlib.h>
    6666#include <str.h>
     67#include <ui/clickmatic.h>
    6768#include <ui/control.h>
    6869#include <ui/paint.h>
    6970#include <ui/pbutton.h>
    7071#include <ui/scrollbar.h>
     72#include <ui/ui.h>
     73#include <ui/window.h>
     74#include "../private/pbutton.h"
    7175#include "../private/resource.h"
    7276#include "../private/scrollbar.h"
     
    9296
    9397static void ui_scrollbar_up_btn_down(ui_pbutton_t *, void *);
     98static void ui_scrollbar_up_btn_up(ui_pbutton_t *, void *);
    9499static void ui_scrollbar_down_btn_down(ui_pbutton_t *, void *);
     100static void ui_scrollbar_down_btn_up(ui_pbutton_t *, void *);
    95101static void ui_scrollbar_ctl_destroy(void *);
    96102static errno_t ui_scrollbar_ctl_paint(void *);
    97103static ui_evclaim_t ui_scrollbar_ctl_pos_event(void *, pos_event_t *);
    98104
    99 ui_pbutton_cb_t ui_scrollbar_up_btn_cb = {
    100         .down = ui_scrollbar_up_btn_down
     105static ui_pbutton_cb_t ui_scrollbar_up_btn_cb = {
     106        .down = ui_scrollbar_up_btn_down,
     107        .up = ui_scrollbar_up_btn_up
    101108};
    102109
    103 ui_pbutton_cb_t ui_scrollbar_down_btn_cb = {
    104         .down = ui_scrollbar_down_btn_down
     110static ui_pbutton_cb_t ui_scrollbar_down_btn_cb = {
     111        .down = ui_scrollbar_down_btn_down,
     112        .up = ui_scrollbar_down_btn_up
    105113};
    106114
    107115/** Scrollbar control ops */
    108 ui_control_ops_t ui_scrollbar_ops = {
     116static ui_control_ops_t ui_scrollbar_ops = {
    109117        .destroy = ui_scrollbar_ctl_destroy,
    110118        .paint = ui_scrollbar_ctl_paint,
     
    112120};
    113121
     122static void ui_scrollbar_cm_up(ui_clickmatic_t *, void *);
     123static void ui_scrollbar_cm_down(ui_clickmatic_t *, void *);
     124static void ui_scrollbar_cm_page_up(ui_clickmatic_t *, void *);
     125static void ui_scrollbar_cm_page_down(ui_clickmatic_t *, void *);
     126
     127/** Scrollbar clickmatic up callbacks */
     128ui_clickmatic_cb_t ui_scrollbar_clickmatic_up_cb = {
     129        .clicked = ui_scrollbar_cm_up
     130};
     131
     132/** Scrollbar clickmatic down callbacks */
     133ui_clickmatic_cb_t ui_scrollbar_clickmatic_down_cb = {
     134        .clicked = ui_scrollbar_cm_down
     135};
     136
     137/** Scrollbar clickmatic page up callbacks */
     138ui_clickmatic_cb_t ui_scrollbar_clickmatic_page_up_cb = {
     139        .clicked = ui_scrollbar_cm_page_up
     140};
     141
     142/** Scrollbar clickmatic page down callbacks */
     143ui_clickmatic_cb_t ui_scrollbar_clickmatic_page_down_cb = {
     144        .clicked = ui_scrollbar_cm_page_down
     145};
     146
    114147/** Create new scrollbar.
    115148 *
    116  * @param resource UI resource
     149 * @param ui UI
     150 * @param window Window containing scrollbar
    117151 * @param rscrollbar Place to store pointer to new scrollbar
    118152 * @return EOK on success, ENOMEM if out of memory
    119153 */
    120 errno_t ui_scrollbar_create(ui_resource_t *resource,
     154errno_t ui_scrollbar_create(ui_t *ui, ui_window_t *window,
    121155    ui_scrollbar_t **rscrollbar)
    122156{
    123157        ui_scrollbar_t *scrollbar;
     158        ui_resource_t *resource;
    124159        errno_t rc;
     160
     161        resource = ui_window_get_res(window);
    125162
    126163        scrollbar = calloc(1, sizeof(ui_scrollbar_t));
     
    155192            ui_scrollbar_def_thumb_len;
    156193
    157         scrollbar->res = resource;
     194        scrollbar->ui = ui;
     195        scrollbar->window = window;
    158196        *rscrollbar = scrollbar;
    159197        return EOK;
     
    283321    gfx_rect_t *rect, gfx_rect_t *inside)
    284322{
    285         return ui_paint_bevel(scrollbar->res->gc, rect,
    286             scrollbar->res->btn_highlight_color,
    287             scrollbar->res->btn_shadow_color, ui_scrollbar_thumb_bevel_width, inside);
    288 }
    289 
    290 /** Determine scrollbar thumb rectagle.
    291  *
    292  * @param scrollbar Scrollbar
    293  */
    294 static void ui_scrollbar_thumb_rect(ui_scrollbar_t *scrollbar, gfx_rect_t *rect)
    295 {
    296         ui_scrollbar_geom_t geom;
    297 
    298         ui_scrollbar_get_geom(scrollbar, &geom);
    299         *rect = geom.thumb_rect;
     323        ui_resource_t *resource = ui_window_get_res(scrollbar->window);
     324
     325        return ui_paint_bevel(resource->gc, rect,
     326            resource->btn_highlight_color,
     327            resource->btn_shadow_color, ui_scrollbar_thumb_bevel_width, inside);
    300328}
    301329
     
    310338gfx_coord_t ui_scrollbar_through_length(ui_scrollbar_t *scrollbar)
    311339{
     340        ui_resource_t *resource;
    312341        gfx_coord2_t dims;
    313342        gfx_coord_t w;
    314343
     344        resource = ui_window_get_res(scrollbar->window);
     345
    315346        gfx_rect_dims(&scrollbar->rect, &dims);
    316         w = scrollbar->res->textmode ? ui_scrollbar_btn_len_text :
     347        w = resource->textmode ? ui_scrollbar_btn_len_text :
    317348            ui_scrollbar_btn_len;
    318349        return dims.x - 2 * w;
     
    339370void ui_scrollbar_set_thumb_length(ui_scrollbar_t *scrollbar, gfx_coord_t len)
    340371{
     372        ui_resource_t *resource;
    341373        gfx_coord_t min_len;
    342374        gfx_coord_t max_len;
    343375
    344         min_len = scrollbar->res->textmode ?
     376        resource = ui_window_get_res(scrollbar->window);
     377
     378        min_len = resource->textmode ?
    345379            ui_scrollbar_min_thumb_len_text :
    346380            ui_scrollbar_min_thumb_len;
     
    353387
    354388        if (len != scrollbar->thumb_len) {
    355                 (void) ui_scrollbar_thumb_clear(scrollbar);
    356389                scrollbar->thumb_len = len;
    357390                (void) ui_scrollbar_paint(scrollbar);
     
    387420
    388421        if (pos != scrollbar->pos) {
    389                 (void) ui_scrollbar_thumb_clear(scrollbar);
    390422                scrollbar->pos = pos;
    391423                (void) ui_scrollbar_paint(scrollbar);
     424                ui_scrollbar_throughs_update(scrollbar,
     425                    &scrollbar->last_curs_pos);
    392426                ui_scrollbar_moved(scrollbar, pos);
    393427        }
     
    401435errno_t ui_scrollbar_paint_gfx(ui_scrollbar_t *scrollbar)
    402436{
     437        ui_resource_t *resource;
    403438        ui_scrollbar_geom_t geom;
    404439        gfx_rect_t brect;
     
    406441        errno_t rc;
    407442
     443        resource = ui_window_get_res(scrollbar->window);
     444
    408445        ui_scrollbar_get_geom(scrollbar, &geom);
    409446
    410447        /* Paint scrollbar frame */
    411448
    412         rc = ui_paint_inset_frame(scrollbar->res, &scrollbar->rect, NULL);
     449        rc = ui_paint_inset_frame(resource, &scrollbar->rect, NULL);
    413450        if (rc != EOK)
    414451                goto error;
    415452
    416453        /* Paint scrollbar up through */
    417         rc = gfx_set_color(scrollbar->res->gc,
    418             scrollbar->up_through_held ?
    419             scrollbar->res->sbar_act_through_color :
    420             scrollbar->res->sbar_through_color);
    421         if (rc != EOK)
    422                 goto error;
    423 
    424         rc = gfx_fill_rect(scrollbar->res->gc, &geom.up_through_rect);
     454        rc = gfx_set_color(resource->gc,
     455            scrollbar->up_through_held && scrollbar->up_through_inside ?
     456            resource->sbar_act_through_color :
     457            resource->sbar_through_color);
     458        if (rc != EOK)
     459                goto error;
     460
     461        rc = gfx_fill_rect(resource->gc, &geom.up_through_rect);
    425462        if (rc != EOK)
    426463                goto error;
     
    428465        /* Paint scrollbar down through */
    429466
    430         rc = gfx_set_color(scrollbar->res->gc,
    431             scrollbar->down_through_held ?
    432             scrollbar->res->sbar_act_through_color :
    433             scrollbar->res->sbar_through_color);
    434         if (rc != EOK)
    435                 goto error;
    436 
    437         rc = gfx_fill_rect(scrollbar->res->gc, &geom.down_through_rect);
     467        rc = gfx_set_color(resource->gc,
     468            scrollbar->down_through_held && scrollbar->down_through_inside ?
     469            resource->sbar_act_through_color :
     470            resource->sbar_through_color);
     471        if (rc != EOK)
     472                goto error;
     473
     474        rc = gfx_fill_rect(resource->gc, &geom.down_through_rect);
    438475        if (rc != EOK)
    439476                goto error;
     
    441478        /* Paint scrollbar thumb */
    442479
    443         rc = ui_scrollbar_paint_thumb_frame(scrollbar->res, &geom.thumb_rect,
     480        rc = ui_scrollbar_paint_thumb_frame(resource, &geom.thumb_rect,
    444481            ui_scrollbar_thumb_frame_thickness, &brect);
    445482        if (rc != EOK)
     
    450487                goto error;
    451488
    452         rc = gfx_set_color(scrollbar->res->gc, scrollbar->res->btn_face_color);
    453         if (rc != EOK)
    454                 goto error;
    455 
    456         rc = gfx_fill_rect(scrollbar->res->gc, &irect);
     489        rc = gfx_set_color(resource->gc, resource->btn_face_color);
     490        if (rc != EOK)
     491                goto error;
     492
     493        rc = gfx_fill_rect(resource->gc, &irect);
    457494        if (rc != EOK)
    458495                goto error;
     
    466503                goto error;
    467504
    468         rc = gfx_update(scrollbar->res->gc);
     505        rc = gfx_update(resource->gc);
    469506        if (rc != EOK)
    470507                goto error;
     
    482519errno_t ui_scrollbar_paint_text(ui_scrollbar_t *scrollbar)
    483520{
     521        ui_resource_t *resource;
    484522        gfx_coord2_t pos;
    485523        gfx_text_fmt_t fmt;
     
    490528        errno_t rc;
    491529
     530        resource = ui_window_get_res(scrollbar->window);
     531
    492532        /* Paint scrollbar through */
    493533
     
    496536
    497537        gfx_text_fmt_init(&fmt);
    498         fmt.font = scrollbar->res->font;
    499         fmt.color = scrollbar->res->sbar_through_color;
     538        fmt.font = resource->font;
     539        fmt.color = resource->sbar_through_color;
    500540        fmt.halign = gfx_halign_left;
    501541        fmt.valign = gfx_valign_top;
     
    552592                goto error;
    553593
    554         rc = gfx_update(scrollbar->res->gc);
     594        rc = gfx_update(resource->gc);
    555595        if (rc != EOK)
    556596                goto error;
     
    568608errno_t ui_scrollbar_paint(ui_scrollbar_t *scrollbar)
    569609{
    570         if (scrollbar->res->textmode)
     610        ui_resource_t *resource = ui_window_get_res(scrollbar->window);
     611
     612        if (resource->textmode)
    571613                return ui_scrollbar_paint_text(scrollbar);
    572614        else
     
    581623void ui_scrollbar_get_geom(ui_scrollbar_t *scrollbar, ui_scrollbar_geom_t *geom)
    582624{
     625        ui_resource_t *resource;
    583626        gfx_coord_t btn_len;
    584627        gfx_rect_t orect;
    585628        gfx_rect_t irect;
    586629
    587         if (scrollbar->res->textmode) {
     630        resource = ui_window_get_res(scrollbar->window);
     631
     632        if (resource->textmode) {
    588633                btn_len = ui_scrollbar_btn_len_text;
    589634        } else {
     
    591636        }
    592637
    593         if (scrollbar->res->textmode) {
     638        if (resource->textmode) {
    594639                irect = scrollbar->rect;
    595640                orect = scrollbar->rect;
    596641        } else {
    597                 ui_paint_get_inset_frame_inside(scrollbar->res,
     642                ui_paint_get_inset_frame_inside(resource,
    598643                    &scrollbar->rect, &irect);
    599                 ui_paint_get_bevel_inside(scrollbar->res->gc,
     644                ui_paint_get_bevel_inside(resource->gc,
    600645                    &scrollbar->rect, 1, &orect);
    601646        }
     
    636681}
    637682
    638 /** Clear scrollbar thumb.
    639  *
    640  * @param scrollbar Scrollbar
    641  * @return EOK on success or an error code
    642  */
    643 errno_t ui_scrollbar_thumb_clear(ui_scrollbar_t *scrollbar)
    644 {
    645         gfx_rect_t rect;
    646         errno_t rc;
    647 
    648         /* No need to clear thumb in text mode */
    649         if (scrollbar->res->textmode)
    650                 return EOK;
    651 
    652         ui_scrollbar_thumb_rect(scrollbar, &rect);
    653 
    654         rc = gfx_set_color(scrollbar->res->gc, scrollbar->res->wnd_face_color);
    655         if (rc != EOK)
    656                 goto error;
    657 
    658         rc = gfx_fill_rect(scrollbar->res->gc, &rect);
    659         if (rc != EOK)
    660                 goto error;
    661 
    662         return EOK;
    663 error:
    664         return rc;
    665 }
    666 
    667683/** Press down scrollbar thumb.
    668684 *
     
    688704void ui_scrollbar_up_through_press(ui_scrollbar_t *scrollbar)
    689705{
    690         if (scrollbar->up_through_held)
    691                 return;
     706        ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui);
    692707
    693708        scrollbar->up_through_held = true;
    694         (void) ui_scrollbar_paint(scrollbar);
    695 
    696         ui_scrollbar_page_up(scrollbar);
     709        scrollbar->up_through_inside = true;
     710
     711        ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_page_up_cb,
     712            (void *) scrollbar);
     713        ui_clickmatic_press(clickmatic);
    697714}
    698715
     
    703720void ui_scrollbar_down_through_press(ui_scrollbar_t *scrollbar)
    704721{
    705         if (scrollbar->down_through_held)
    706                 return;
     722        ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui);
    707723
    708724        scrollbar->down_through_held = true;
    709         (void) ui_scrollbar_paint(scrollbar);
    710 
    711         ui_scrollbar_page_down(scrollbar);
     725        scrollbar->down_through_inside = true;
     726
     727        ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_page_down_cb,
     728            (void *) scrollbar);
     729        ui_clickmatic_press(clickmatic);
    712730}
    713731
     
    719737void ui_scrollbar_release(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
    720738{
     739        ui_clickmatic_t *clickmatic;
     740
    721741        if (scrollbar->thumb_held) {
    722742                ui_scrollbar_update(scrollbar, pos);
     
    725745
    726746        if (scrollbar->up_through_held || scrollbar->down_through_held) {
     747                clickmatic = ui_get_clickmatic(scrollbar->ui);
     748                ui_clickmatic_release(clickmatic);
     749                ui_clickmatic_set_cb(clickmatic, NULL, NULL);
     750
    727751                scrollbar->up_through_held = false;
    728752                scrollbar->down_through_held = false;
     
    731755}
    732756
     757/** Update state of scrollbar throuhgs.
     758 *
     759 * Update state of scrollbar throughs after mouse cursor or thumb has moved.
     760 *
     761 * @param scrollbar Scrollbar
     762 * @param pos Mouse cursor position
     763 */
     764void ui_scrollbar_throughs_update(ui_scrollbar_t *scrollbar, gfx_coord2_t *pos)
     765{
     766        ui_scrollbar_geom_t geom;
     767        bool inside_up;
     768        bool inside_down;
     769
     770        ui_scrollbar_get_geom(scrollbar, &geom);
     771
     772        inside_up = gfx_pix_inside_rect(pos, &geom.up_through_rect);
     773        inside_down = gfx_pix_inside_rect(pos, &geom.down_through_rect);
     774
     775        if (inside_up && !scrollbar->up_through_inside) {
     776                scrollbar->up_through_inside = true;
     777                (void) ui_scrollbar_paint(scrollbar);
     778        } else if (!inside_up && scrollbar->up_through_inside) {
     779                scrollbar->up_through_inside = false;
     780                (void) ui_scrollbar_paint(scrollbar);
     781        }
     782
     783        if (inside_down && !scrollbar->down_through_inside) {
     784                scrollbar->down_through_inside = true;
     785                (void) ui_scrollbar_paint(scrollbar);
     786        } else if (!inside_down && scrollbar->down_through_inside) {
     787                scrollbar->down_through_inside = false;
     788                (void) ui_scrollbar_paint(scrollbar);
     789        }
     790}
     791
    733792/** Pointer moved.
    734793 *
     
    744803                ui_scrollbar_set_pos(scrollbar, spos);
    745804        }
     805
     806        ui_scrollbar_throughs_update(scrollbar, pos);
    746807}
    747808
     
    845906        case POS_UPDATE:
    846907                ui_scrollbar_update(scrollbar, &pos);
     908                scrollbar->last_curs_pos = pos;
    847909                break;
    848910        case POS_DCLICK:
     
    861923{
    862924        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
    863 
    864         ui_scrollbar_up(scrollbar);
     925        ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui);
     926
     927        ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_up_cb,
     928            (void *) scrollbar);
     929        ui_clickmatic_press(clickmatic);
     930}
     931
     932/** Scrollbar up button released.
     933 *
     934 * @param pbutton Up button
     935 * @param arg Argument (ui_scrollbar_t *)
     936 */
     937static void ui_scrollbar_up_btn_up(ui_pbutton_t *pbutton, void *arg)
     938{
     939        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
     940        ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui);
     941
     942        ui_clickmatic_release(clickmatic);
     943        ui_clickmatic_set_cb(clickmatic, NULL, NULL);
    865944}
    866945
     
    873952{
    874953        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
    875 
    876         ui_scrollbar_down(scrollbar);
     954        ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui);
     955
     956        ui_clickmatic_set_cb(clickmatic, &ui_scrollbar_clickmatic_down_cb,
     957            (void *) scrollbar);
     958        ui_clickmatic_press(clickmatic);
     959}
     960
     961/** Scrollbar down button released.
     962 *
     963 * @param pbutton Down button
     964 * @param arg Argument (ui_scrollbar_t *)
     965 */
     966static void ui_scrollbar_down_btn_up(ui_pbutton_t *pbutton, void *arg)
     967{
     968        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
     969        ui_clickmatic_t *clickmatic = ui_get_clickmatic(scrollbar->ui);
     970
     971        ui_clickmatic_release(clickmatic);
     972        ui_clickmatic_set_cb(clickmatic, NULL, NULL);
    877973}
    878974
     
    9081004ui_evclaim_t ui_scrollbar_ctl_pos_event(void *arg, pos_event_t *event)
    9091005{
    910         ui_scrollbar_t *scrollbar = (ui_scrollbar_t *) arg;
     1006        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
    9111007
    9121008        return ui_scrollbar_pos_event(scrollbar, event);
    9131009}
    9141010
     1011/** Scrollbar clickmatic up button click event.
     1012 *
     1013 * @param clickmatic Clickmatic
     1014 * @param arg Argument (ui_scrollbar_t *)
     1015 */
     1016static void ui_scrollbar_cm_up(ui_clickmatic_t *clickmatic, void *arg)
     1017{
     1018        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
     1019
     1020        if (scrollbar->up_btn->inside)
     1021                ui_scrollbar_up(scrollbar);
     1022}
     1023
     1024/** Scrollbar clickmatic down button click event.
     1025 *
     1026 * @param clickmatic Clickmatic
     1027 * @param arg Argument (ui_scrollbar_t *)
     1028 */
     1029static void ui_scrollbar_cm_down(ui_clickmatic_t *clickmatic, void *arg)
     1030{
     1031        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
     1032
     1033        if (scrollbar->down_btn->inside)
     1034                ui_scrollbar_down(scrollbar);
     1035}
     1036
     1037/** Scrollbar clickmatic up through click event.
     1038 *
     1039 * @param clickmatic Clickmatic
     1040 * @param arg Argument (ui_scrollbar_t *)
     1041 */
     1042static void ui_scrollbar_cm_page_up(ui_clickmatic_t *clickmatic, void *arg)
     1043{
     1044        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
     1045
     1046        if (scrollbar->up_through_inside)
     1047                ui_scrollbar_page_up(scrollbar);
     1048}
     1049
     1050/** Scrollbar clickmatic down through click event.
     1051 *
     1052 * @param clickmatic Clickmatic
     1053 * @param arg Argument (ui_scrollbar_t *)
     1054 */
     1055static void ui_scrollbar_cm_page_down(ui_clickmatic_t *clickmatic, void *arg)
     1056{
     1057        ui_scrollbar_t *scrollbar = (ui_scrollbar_t *)arg;
     1058
     1059        if (scrollbar->down_through_inside)
     1060                ui_scrollbar_page_down(scrollbar);
     1061}
     1062
    9151063/** @}
    9161064 */
  • uspace/lib/ui/src/ui.c

    rd4ea1f6 r8965860c  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    3939#include <errno.h>
    4040#include <fibril.h>
     41#include <fibril_synch.h>
    4142#include <gfx/color.h>
    4243#include <gfx/cursor.h>
     
    4748#include <str.h>
    4849#include <task.h>
     50#include <ui/clickmatic.h>
    4951#include <ui/ui.h>
    5052#include <ui/wdecor.h>
     
    198200{
    199201        ui_t *ui;
     202        errno_t rc;
    200203
    201204        ui = calloc(1, sizeof(ui_t));
     
    203206                return ENOMEM;
    204207
     208        rc = ui_clickmatic_create(ui, &ui->clickmatic);
     209        if (rc != EOK) {
     210                free(ui);
     211                return rc;
     212        }
     213
    205214        ui->console = console;
    206215        list_initialize(&ui->windows);
     216        fibril_mutex_initialize(&ui->lock);
    207217        *rui = ui;
    208218        return EOK;
     
    218228{
    219229        ui_t *ui;
     230        errno_t rc;
    220231
    221232        ui = calloc(1, sizeof(ui_t));
     
    223234                return ENOMEM;
    224235
     236        rc = ui_clickmatic_create(ui, &ui->clickmatic);
     237        if (rc != EOK) {
     238                free(ui);
     239                return rc;
     240        }
     241
    225242        ui->display = disp;
    226243        list_initialize(&ui->windows);
     244        fibril_mutex_initialize(&ui->lock);
    227245        *rui = ui;
    228246        return EOK;
     
    443461}
    444462
     463/** Lock UI.
     464 *
     465 * Block UI from calling window callbacks. @c ui_lock() and @c ui_unlock()
     466 * must be used when accessing UI resources from a fibril (as opposed to
     467 * from a window callback).
     468 *
     469 * @param ui UI
     470 */
     471void ui_lock(ui_t *ui)
     472{
     473        fibril_mutex_lock(&ui->lock);
     474}
     475
     476/** Unlock UI.
     477 *
     478 * Allow UI to call window callbacks. @c ui_lock() and @c ui_unlock()
     479 * must be used when accessing window resources from a fibril (as opposed to
     480 * from a window callback).
     481 *
     482 * @param ui UI
     483 */
     484void ui_unlock(ui_t *ui)
     485{
     486        fibril_mutex_unlock(&ui->lock);
     487}
     488
    445489/** Terminate user interface.
    446490 *
     
    480524}
    481525
     526/** Get clickmatic from UI.
     527 *
     528 * @pararm ui UI
     529 * @return Clickmatic
     530 */
     531ui_clickmatic_t *ui_get_clickmatic(ui_t *ui)
     532{
     533        return ui->clickmatic;
     534}
     535
    482536/** @}
    483537 */
  • uspace/lib/ui/src/window.c

    rd4ea1f6 r8965860c  
    11/*
    2  * Copyright (c) 2021 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    766766{
    767767        ui_window_t *window = (ui_window_t *) arg;
    768 
     768        ui_t *ui = window->ui;
     769
     770        ui_lock(ui);
    769771        ui_window_send_close(window);
     772        ui_unlock(ui);
    770773}
    771774
     
    774777{
    775778        ui_window_t *window = (ui_window_t *) arg;
     779
     780        ui_lock(window->ui);
    776781
    777782        if (window->wdecor != NULL) {
     
    781786
    782787        ui_window_send_focus(window);
     788        ui_unlock(window->ui);
    783789}
    784790
     
    788794        ui_window_t *window = (ui_window_t *) arg;
    789795
    790         (void) window;
     796        ui_lock(window->ui);
    791797        ui_window_send_kbd(window, kbd_event);
     798        ui_unlock(window->ui);
    792799}
    793800
     
    801808                return;
    802809
     810        ui_lock(window->ui);
    803811        ui_wdecor_pos_event(window->wdecor, event);
    804812        ui_window_send_pos(window, event);
     813        ui_unlock(window->ui);
    805814}
    806815
     
    817826                return;
    818827
     828        ui_lock(window->ui);
    819829        (void) ui_window_resize(window, rect);
    820830        (void) ui_window_paint(window);
     831        ui_unlock(window->ui);
    821832}
    822833
     
    825836{
    826837        ui_window_t *window = (ui_window_t *) arg;
     838
     839        ui_lock(window->ui);
    827840
    828841        if (window->wdecor != NULL) {
     
    832845
    833846        ui_window_send_unfocus(window);
     847        ui_unlock(window->ui);
    834848}
    835849
  • uspace/lib/ui/test/main.c

    rd4ea1f6 r8965860c  
    3434PCUT_IMPORT(control);
    3535PCUT_IMPORT(checkbox);
     36PCUT_IMPORT(clickmatic);
    3637PCUT_IMPORT(entry);
    3738PCUT_IMPORT(file_dialog);
  • uspace/lib/ui/test/scrollbar.c

    rd4ea1f6 r8965860c  
    3535#include <ui/scrollbar.h>
    3636#include <ui/resource.h>
     37#include <ui/ui.h>
     38#include <ui/window.h>
    3739#include "../private/pbutton.h"
    3840#include "../private/scrollbar.h"
     
    4143
    4244PCUT_TEST_SUITE(scrollbar);
    43 
    44 static errno_t testgc_set_clip_rect(void *, gfx_rect_t *);
    45 static errno_t testgc_set_color(void *, gfx_color_t *);
    46 static errno_t testgc_fill_rect(void *, gfx_rect_t *);
    47 static errno_t testgc_update(void *);
    48 static errno_t testgc_bitmap_create(void *, gfx_bitmap_params_t *,
    49     gfx_bitmap_alloc_t *, void **);
    50 static errno_t testgc_bitmap_destroy(void *);
    51 static errno_t testgc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
    52 static errno_t testgc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
    53 
    54 static gfx_context_ops_t ops = {
    55         .set_clip_rect = testgc_set_clip_rect,
    56         .set_color = testgc_set_color,
    57         .fill_rect = testgc_fill_rect,
    58         .update = testgc_update,
    59         .bitmap_create = testgc_bitmap_create,
    60         .bitmap_destroy = testgc_bitmap_destroy,
    61         .bitmap_render = testgc_bitmap_render,
    62         .bitmap_get_alloc = testgc_bitmap_get_alloc
    63 };
    6445
    6546static void test_scrollbar_up(ui_scrollbar_t *, void *);
     
    7960static ui_scrollbar_cb_t dummy_scrollbar_cb = {
    8061};
    81 
    82 typedef struct {
    83         bool bm_created;
    84         bool bm_destroyed;
    85         gfx_bitmap_params_t bm_params;
    86         void *bm_pixels;
    87         gfx_rect_t bm_srect;
    88         gfx_coord2_t bm_offs;
    89         bool bm_rendered;
    90         bool bm_got_alloc;
    91 } test_gc_t;
    92 
    93 typedef struct {
    94         test_gc_t *tgc;
    95         gfx_bitmap_alloc_t alloc;
    96         bool myalloc;
    97 } testgc_bitmap_t;
    9862
    9963typedef struct {
     
    10973PCUT_TEST(create_destroy)
    11074{
    111         errno_t rc;
    112         gfx_context_t *gc = NULL;
    113         test_gc_t tgc;
    114         ui_resource_t *resource = NULL;
     75        ui_t *ui = NULL;
     76        ui_window_t *window = NULL;
     77        ui_wnd_params_t params;
    11578        ui_scrollbar_t *scrollbar = NULL;
    116 
    117         memset(&tgc, 0, sizeof(tgc));
    118         rc = gfx_context_new(&ops, &tgc, &gc);
    119         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    120 
    121         rc = ui_resource_create(gc, false, &resource);
    122         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    123         PCUT_ASSERT_NOT_NULL(resource);
    124 
    125         rc = ui_scrollbar_create(resource, &scrollbar);
     79        errno_t rc;
     80
     81        rc = ui_create_disp(NULL, &ui);
     82        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     83
     84        ui_wnd_params_init(&params);
     85        params.caption = "Hello";
     86
     87        rc = ui_window_create(ui, &params, &window);
     88        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     89        PCUT_ASSERT_NOT_NULL(window);
     90
     91        rc = ui_scrollbar_create(ui, window, &scrollbar);
    12692        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    12793        PCUT_ASSERT_NOT_NULL(scrollbar);
    12894
    12995        ui_scrollbar_destroy(scrollbar);
    130         ui_resource_destroy(resource);
    131 
    132         rc = gfx_context_delete(gc);
    133         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     96        ui_window_destroy(window);
     97        ui_destroy(ui);
    13498}
    13599
     
    143107PCUT_TEST(ctl)
    144108{
    145         errno_t rc;
    146         gfx_context_t *gc = NULL;
    147         test_gc_t tgc;
    148         ui_resource_t *resource = NULL;
     109        ui_t *ui = NULL;
     110        ui_window_t *window = NULL;
     111        ui_wnd_params_t params;
    149112        ui_scrollbar_t *scrollbar = NULL;
    150113        ui_control_t *control;
    151 
    152         memset(&tgc, 0, sizeof(tgc));
    153         rc = gfx_context_new(&ops, &tgc, &gc);
    154         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    155 
    156         rc = ui_resource_create(gc, false, &resource);
    157         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    158         PCUT_ASSERT_NOT_NULL(resource);
    159 
    160         rc = ui_scrollbar_create(resource, &scrollbar);
     114        errno_t rc;
     115
     116        rc = ui_create_disp(NULL, &ui);
     117        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     118
     119        ui_wnd_params_init(&params);
     120        params.caption = "Hello";
     121
     122        rc = ui_window_create(ui, &params, &window);
     123        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     124        PCUT_ASSERT_NOT_NULL(window);
     125
     126        rc = ui_scrollbar_create(ui, window, &scrollbar);
    161127        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    162128        PCUT_ASSERT_NOT_NULL(scrollbar);
     
    166132
    167133        ui_control_destroy(control);
    168         ui_resource_destroy(resource);
    169 
    170         rc = gfx_context_delete(gc);
    171         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     134        ui_window_destroy(window);
     135        ui_destroy(ui);
    172136}
    173137
     
    175139PCUT_TEST(set_rect)
    176140{
    177         errno_t rc;
    178         gfx_context_t *gc = NULL;
    179         test_gc_t tgc;
    180         ui_resource_t *resource = NULL;
     141        ui_t *ui = NULL;
     142        ui_window_t *window = NULL;
     143        ui_wnd_params_t params;
    181144        ui_scrollbar_t *scrollbar = NULL;
    182145        gfx_rect_t rect;
    183 
    184         memset(&tgc, 0, sizeof(tgc));
    185         rc = gfx_context_new(&ops, &tgc, &gc);
    186         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    187 
    188         rc = ui_resource_create(gc, false, &resource);
    189         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    190         PCUT_ASSERT_NOT_NULL(resource);
    191 
    192         rc = ui_scrollbar_create(resource, &scrollbar);
     146        errno_t rc;
     147
     148        rc = ui_create_disp(NULL, &ui);
     149        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     150
     151        ui_wnd_params_init(&params);
     152        params.caption = "Hello";
     153
     154        rc = ui_window_create(ui, &params, &window);
     155        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     156        PCUT_ASSERT_NOT_NULL(window);
     157
     158        rc = ui_scrollbar_create(ui, window, &scrollbar);
    193159        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    194160        PCUT_ASSERT_NOT_NULL(scrollbar);
     
    206172
    207173        ui_scrollbar_destroy(scrollbar);
    208         ui_resource_destroy(resource);
    209 
    210         rc = gfx_context_delete(gc);
    211         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     174        ui_window_destroy(window);
     175        ui_destroy(ui);
    212176}
    213177
     
    215179PCUT_TEST(paint_gfx)
    216180{
    217         errno_t rc;
    218         gfx_context_t *gc = NULL;
    219         test_gc_t tgc;
    220         ui_resource_t *resource = NULL;
    221         ui_scrollbar_t *scrollbar;
    222 
    223         memset(&tgc, 0, sizeof(tgc));
    224         rc = gfx_context_new(&ops, &tgc, &gc);
    225         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    226 
    227         rc = ui_resource_create(gc, false, &resource);
    228         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    229         PCUT_ASSERT_NOT_NULL(resource);
    230 
    231         rc = ui_scrollbar_create(resource, &scrollbar);
     181        ui_t *ui = NULL;
     182        ui_window_t *window = NULL;
     183        ui_wnd_params_t params;
     184        ui_scrollbar_t *scrollbar;
     185        errno_t rc;
     186
     187        rc = ui_create_disp(NULL, &ui);
     188        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     189
     190        ui_wnd_params_init(&params);
     191        params.caption = "Hello";
     192
     193        rc = ui_window_create(ui, &params, &window);
     194        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     195        PCUT_ASSERT_NOT_NULL(window);
     196
     197        rc = ui_scrollbar_create(ui, window, &scrollbar);
    232198        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    233199
     
    236202
    237203        ui_scrollbar_destroy(scrollbar);
    238         ui_resource_destroy(resource);
    239 
    240         rc = gfx_context_delete(gc);
    241         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     204        ui_window_destroy(window);
     205        ui_destroy(ui);
    242206}
    243207
     
    245209PCUT_TEST(paint_text)
    246210{
    247         errno_t rc;
    248         gfx_context_t *gc = NULL;
    249         test_gc_t tgc;
    250         ui_resource_t *resource = NULL;
    251         ui_scrollbar_t *scrollbar;
    252         gfx_rect_t rect;
    253 
    254         memset(&tgc, 0, sizeof(tgc));
    255         rc = gfx_context_new(&ops, &tgc, &gc);
    256         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    257 
    258         rc = ui_resource_create(gc, true, &resource);
    259         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    260         PCUT_ASSERT_NOT_NULL(resource);
    261 
    262         rc = ui_scrollbar_create(resource, &scrollbar);
     211        ui_t *ui = NULL;
     212        ui_window_t *window = NULL;
     213        ui_wnd_params_t params;
     214        ui_scrollbar_t *scrollbar;
     215        gfx_rect_t rect;
     216        errno_t rc;
     217
     218        rc = ui_create_disp(NULL, &ui);
     219        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     220
     221        ui_wnd_params_init(&params);
     222        params.caption = "Hello";
     223
     224        rc = ui_window_create(ui, &params, &window);
     225        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     226        PCUT_ASSERT_NOT_NULL(window);
     227
     228        rc = ui_scrollbar_create(ui, window, &scrollbar);
    263229        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    264230
     
    273239
    274240        ui_scrollbar_destroy(scrollbar);
    275         ui_resource_destroy(resource);
    276 
    277         rc = gfx_context_delete(gc);
    278         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     241        ui_window_destroy(window);
     242        ui_destroy(ui);
     243}
     244
     245/** ui_scrollbar_get_geom() returns scrollbar geometry */
     246PCUT_TEST(get_geom)
     247{
     248        ui_t *ui = NULL;
     249        ui_window_t *window = NULL;
     250        ui_wnd_params_t params;
     251        ui_scrollbar_t *scrollbar;
     252        ui_scrollbar_geom_t geom;
     253        gfx_rect_t rect;
     254        errno_t rc;
     255
     256        rc = ui_create_disp(NULL, &ui);
     257        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     258
     259        ui_wnd_params_init(&params);
     260        params.caption = "Hello";
     261
     262        rc = ui_window_create(ui, &params, &window);
     263        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     264        PCUT_ASSERT_NOT_NULL(window);
     265
     266        rc = ui_scrollbar_create(ui, window, &scrollbar);
     267        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     268
     269        rect.p0.x = 10;
     270        rect.p0.y = 10;
     271        rect.p1.x = 100;
     272        rect.p1.y = 30;
     273        ui_scrollbar_set_rect(scrollbar, &rect);
     274
     275        ui_scrollbar_get_geom(scrollbar, &geom);
     276        PCUT_ASSERT_INT_EQUALS(11, geom.up_btn_rect.p0.x);
     277        PCUT_ASSERT_INT_EQUALS(11, geom.up_btn_rect.p0.y);
     278        PCUT_ASSERT_INT_EQUALS(99, geom.down_btn_rect.p1.x);
     279        PCUT_ASSERT_INT_EQUALS(29, geom.down_btn_rect.p1.y);
     280
     281        ui_scrollbar_destroy(scrollbar);
     282        ui_window_destroy(window);
     283        ui_destroy(ui);
    279284}
    280285
     
    282287PCUT_TEST(through_length)
    283288{
    284         errno_t rc;
    285         gfx_context_t *gc = NULL;
    286         test_gc_t tgc;
    287         ui_resource_t *resource = NULL;
     289        ui_t *ui = NULL;
     290        ui_window_t *window = NULL;
     291        ui_wnd_params_t params;
    288292        ui_scrollbar_t *scrollbar;
    289293        gfx_coord_t length;
    290294        gfx_rect_t rect;
    291 
    292         memset(&tgc, 0, sizeof(tgc));
    293         rc = gfx_context_new(&ops, &tgc, &gc);
    294         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    295 
    296         rc = ui_resource_create(gc, false, &resource);
    297         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    298         PCUT_ASSERT_NOT_NULL(resource);
    299 
    300         rc = ui_scrollbar_create(resource, &scrollbar);
     295        errno_t rc;
     296
     297        rc = ui_create_disp(NULL, &ui);
     298        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     299
     300        ui_wnd_params_init(&params);
     301        params.caption = "Hello";
     302
     303        rc = ui_window_create(ui, &params, &window);
     304        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     305        PCUT_ASSERT_NOT_NULL(window);
     306
     307        rc = ui_scrollbar_create(ui, window, &scrollbar);
    301308        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    302309
     
    315322
    316323        ui_scrollbar_destroy(scrollbar);
    317         ui_resource_destroy(resource);
    318 
    319         rc = gfx_context_delete(gc);
    320         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     324        ui_window_destroy(window);
     325        ui_destroy(ui);
    321326}
    322327
     
    324329PCUT_TEST(move_length)
    325330{
    326         errno_t rc;
    327         gfx_context_t *gc = NULL;
    328         test_gc_t tgc;
    329         ui_resource_t *resource = NULL;
     331        ui_t *ui = NULL;
     332        ui_window_t *window = NULL;
     333        ui_wnd_params_t params;
    330334        ui_scrollbar_t *scrollbar;
    331335        gfx_coord_t length;
    332336        gfx_rect_t rect;
    333 
    334         memset(&tgc, 0, sizeof(tgc));
    335         rc = gfx_context_new(&ops, &tgc, &gc);
    336         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    337 
    338         rc = ui_resource_create(gc, false, &resource);
    339         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    340         PCUT_ASSERT_NOT_NULL(resource);
    341 
    342         rc = ui_scrollbar_create(resource, &scrollbar);
     337        errno_t rc;
     338
     339        rc = ui_create_disp(NULL, &ui);
     340        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     341
     342        ui_wnd_params_init(&params);
     343        params.caption = "Hello";
     344
     345        rc = ui_window_create(ui, &params, &window);
     346        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     347        PCUT_ASSERT_NOT_NULL(window);
     348
     349        rc = ui_scrollbar_create(ui, window, &scrollbar);
    343350        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    344351
     
    357364
    358365        ui_scrollbar_destroy(scrollbar);
    359         ui_resource_destroy(resource);
    360 
    361         rc = gfx_context_delete(gc);
    362         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     366        ui_window_destroy(window);
     367        ui_destroy(ui);
    363368}
    364369
     
    366371PCUT_TEST(get_pos)
    367372{
    368         errno_t rc;
    369         gfx_context_t *gc = NULL;
    370         test_gc_t tgc;
    371         ui_resource_t *resource = NULL;
     373        ui_t *ui = NULL;
     374        ui_window_t *window = NULL;
     375        ui_wnd_params_t params;
    372376        ui_scrollbar_t *scrollbar;
    373377        gfx_coord_t pos;
    374378        gfx_rect_t rect;
    375 
    376         memset(&tgc, 0, sizeof(tgc));
    377         rc = gfx_context_new(&ops, &tgc, &gc);
    378         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    379 
    380         rc = ui_resource_create(gc, false, &resource);
    381         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    382         PCUT_ASSERT_NOT_NULL(resource);
    383 
    384         rc = ui_scrollbar_create(resource, &scrollbar);
     379        errno_t rc;
     380
     381        rc = ui_create_disp(NULL, &ui);
     382        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     383
     384        ui_wnd_params_init(&params);
     385        params.caption = "Hello";
     386
     387        rc = ui_window_create(ui, &params, &window);
     388        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     389        PCUT_ASSERT_NOT_NULL(window);
     390
     391        rc = ui_scrollbar_create(ui, window, &scrollbar);
    385392        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    386393
     
    398405
    399406        ui_scrollbar_destroy(scrollbar);
    400         ui_resource_destroy(resource);
    401 
    402         rc = gfx_context_delete(gc);
    403         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     407        ui_window_destroy(window);
     408        ui_destroy(ui);
    404409}
    405410
     
    407412PCUT_TEST(set_thumb_length)
    408413{
    409         errno_t rc;
    410         gfx_context_t *gc = NULL;
    411         test_gc_t tgc;
    412         ui_resource_t *resource = NULL;
    413         ui_scrollbar_t *scrollbar;
    414         gfx_rect_t rect;
    415 
    416         memset(&tgc, 0, sizeof(tgc));
    417         rc = gfx_context_new(&ops, &tgc, &gc);
    418         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    419 
    420         rc = ui_resource_create(gc, false, &resource);
    421         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    422         PCUT_ASSERT_NOT_NULL(resource);
    423 
    424         rc = ui_scrollbar_create(resource, &scrollbar);
     414        ui_t *ui = NULL;
     415        ui_window_t *window = NULL;
     416        ui_wnd_params_t params;
     417        ui_scrollbar_t *scrollbar;
     418        gfx_rect_t rect;
     419        errno_t rc;
     420
     421        rc = ui_create_disp(NULL, &ui);
     422        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     423
     424        ui_wnd_params_init(&params);
     425        params.caption = "Hello";
     426
     427        rc = ui_window_create(ui, &params, &window);
     428        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     429        PCUT_ASSERT_NOT_NULL(window);
     430
     431        rc = ui_scrollbar_create(ui, window, &scrollbar);
    425432        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    426433
     
    437444
    438445        ui_scrollbar_destroy(scrollbar);
    439         ui_resource_destroy(resource);
    440 
    441         rc = gfx_context_delete(gc);
    442         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     446        ui_window_destroy(window);
     447        ui_destroy(ui);
    443448}
    444449
     
    446451PCUT_TEST(set_pos)
    447452{
    448         errno_t rc;
    449         gfx_context_t *gc = NULL;
    450         test_gc_t tgc;
    451         ui_resource_t *resource = NULL;
     453        ui_t *ui = NULL;
     454        ui_window_t *window = NULL;
     455        ui_wnd_params_t params;
    452456        ui_scrollbar_t *scrollbar;
    453457        gfx_coord_t pos;
    454458        gfx_rect_t rect;
    455 
    456         memset(&tgc, 0, sizeof(tgc));
    457         rc = gfx_context_new(&ops, &tgc, &gc);
    458         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    459 
    460         rc = ui_resource_create(gc, false, &resource);
    461         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    462         PCUT_ASSERT_NOT_NULL(resource);
    463 
    464         rc = ui_scrollbar_create(resource, &scrollbar);
     459        errno_t rc;
     460
     461        rc = ui_create_disp(NULL, &ui);
     462        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     463
     464        ui_wnd_params_init(&params);
     465        params.caption = "Hello";
     466
     467        rc = ui_window_create(ui, &params, &window);
     468        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     469        PCUT_ASSERT_NOT_NULL(window);
     470
     471        rc = ui_scrollbar_create(ui, window, &scrollbar);
    465472        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    466473
     
    489496
    490497        ui_scrollbar_destroy(scrollbar);
    491         ui_resource_destroy(resource);
    492 
    493         rc = gfx_context_delete(gc);
    494         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     498        ui_window_destroy(window);
     499        ui_destroy(ui);
    495500}
    496501
     
    498503PCUT_TEST(thumb_press_release)
    499504{
    500         errno_t rc;
    501         gfx_context_t *gc = NULL;
    502         test_gc_t tgc;
    503         ui_resource_t *resource = NULL;
     505        ui_t *ui = NULL;
     506        ui_window_t *window = NULL;
     507        ui_wnd_params_t params;
    504508        gfx_coord2_t pos;
    505509        gfx_rect_t rect;
    506510        ui_scrollbar_t *scrollbar;
    507511        test_cb_resp_t resp;
    508 
    509         memset(&tgc, 0, sizeof(tgc));
    510         rc = gfx_context_new(&ops, &tgc, &gc);
    511         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    512 
    513         rc = ui_resource_create(gc, false, &resource);
    514         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    515         PCUT_ASSERT_NOT_NULL(resource);
    516 
    517         rc = ui_scrollbar_create(resource, &scrollbar);
     512        errno_t rc;
     513
     514        rc = ui_create_disp(NULL, &ui);
     515        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     516
     517        ui_wnd_params_init(&params);
     518        params.caption = "Hello";
     519
     520        rc = ui_window_create(ui, &params, &window);
     521        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     522        PCUT_ASSERT_NOT_NULL(window);
     523
     524        rc = ui_scrollbar_create(ui, window, &scrollbar);
    518525        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    519526
     
    545552
    546553        ui_scrollbar_destroy(scrollbar);
    547         ui_resource_destroy(resource);
    548 
    549         rc = gfx_context_delete(gc);
    550         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     554        ui_window_destroy(window);
     555        ui_destroy(ui);
    551556}
    552557
     
    554559PCUT_TEST(thumb_press_update_release)
    555560{
    556         errno_t rc;
    557         gfx_context_t *gc = NULL;
    558         test_gc_t tgc;
    559         ui_resource_t *resource = NULL;
     561        ui_t *ui = NULL;
     562        ui_window_t *window = NULL;
     563        ui_wnd_params_t params;
    560564        gfx_coord2_t pos;
    561565        gfx_rect_t rect;
    562566        ui_scrollbar_t *scrollbar;
    563567        test_cb_resp_t resp;
    564 
    565         memset(&tgc, 0, sizeof(tgc));
    566         rc = gfx_context_new(&ops, &tgc, &gc);
    567         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    568 
    569         rc = ui_resource_create(gc, false, &resource);
    570         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    571         PCUT_ASSERT_NOT_NULL(resource);
    572 
    573         rc = ui_scrollbar_create(resource, &scrollbar);
     568        errno_t rc;
     569
     570        rc = ui_create_disp(NULL, &ui);
     571        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     572
     573        ui_wnd_params_init(&params);
     574        params.caption = "Hello";
     575
     576        rc = ui_window_create(ui, &params, &window);
     577        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     578        PCUT_ASSERT_NOT_NULL(window);
     579
     580        rc = ui_scrollbar_create(ui, window, &scrollbar);
    574581        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    575582
     
    609616
    610617        ui_scrollbar_destroy(scrollbar);
    611         ui_resource_destroy(resource);
    612 
    613         rc = gfx_context_delete(gc);
    614         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     618        ui_window_destroy(window);
     619        ui_destroy(ui);
    615620}
    616621
     
    618623PCUT_TEST(up_through_press_release)
    619624{
    620         errno_t rc;
    621         gfx_context_t *gc = NULL;
    622         test_gc_t tgc;
    623         ui_resource_t *resource = NULL;
     625        ui_t *ui = NULL;
     626        ui_window_t *window = NULL;
     627        ui_wnd_params_t params;
    624628        gfx_coord2_t pos;
    625629        gfx_rect_t rect;
    626630        ui_scrollbar_t *scrollbar;
    627631        test_cb_resp_t resp;
    628 
    629         memset(&tgc, 0, sizeof(tgc));
    630         rc = gfx_context_new(&ops, &tgc, &gc);
    631         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    632 
    633         rc = ui_resource_create(gc, false, &resource);
    634         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    635         PCUT_ASSERT_NOT_NULL(resource);
    636 
    637         rc = ui_scrollbar_create(resource, &scrollbar);
     632        errno_t rc;
     633
     634        rc = ui_create_disp(NULL, &ui);
     635        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     636
     637        ui_wnd_params_init(&params);
     638        params.caption = "Hello";
     639
     640        rc = ui_window_create(ui, &params, &window);
     641        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     642        PCUT_ASSERT_NOT_NULL(window);
     643
     644        rc = ui_scrollbar_create(ui, window, &scrollbar);
    638645        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    639646
     
    661668
    662669        ui_scrollbar_destroy(scrollbar);
    663         ui_resource_destroy(resource);
    664 
    665         rc = gfx_context_delete(gc);
    666         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     670        ui_window_destroy(window);
     671        ui_destroy(ui);
    667672}
    668673
     
    670675PCUT_TEST(down_through_press_release)
    671676{
    672         errno_t rc;
    673         gfx_context_t *gc = NULL;
    674         test_gc_t tgc;
    675         ui_resource_t *resource = NULL;
     677        ui_t *ui = NULL;
     678        ui_window_t *window = NULL;
     679        ui_wnd_params_t params;
    676680        gfx_coord2_t pos;
    677681        gfx_rect_t rect;
    678682        ui_scrollbar_t *scrollbar;
    679683        test_cb_resp_t resp;
    680 
    681         memset(&tgc, 0, sizeof(tgc));
    682         rc = gfx_context_new(&ops, &tgc, &gc);
    683         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    684 
    685         rc = ui_resource_create(gc, false, &resource);
    686         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    687         PCUT_ASSERT_NOT_NULL(resource);
    688 
    689         rc = ui_scrollbar_create(resource, &scrollbar);
     684        errno_t rc;
     685
     686        rc = ui_create_disp(NULL, &ui);
     687        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     688
     689        ui_wnd_params_init(&params);
     690        params.caption = "Hello";
     691
     692        rc = ui_window_create(ui, &params, &window);
     693        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     694        PCUT_ASSERT_NOT_NULL(window);
     695
     696        rc = ui_scrollbar_create(ui, window, &scrollbar);
    690697        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    691698
     
    713720
    714721        ui_scrollbar_destroy(scrollbar);
    715         ui_resource_destroy(resource);
    716 
    717         rc = gfx_context_delete(gc);
    718         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     722        ui_window_destroy(window);
     723        ui_destroy(ui);
     724}
     725
     726/** Updating state of throughs when cursor or thumb moves */
     727PCUT_TEST(throughs_update)
     728{
     729        ui_t *ui = NULL;
     730        ui_window_t *window = NULL;
     731        ui_wnd_params_t params;
     732        gfx_coord2_t pos;
     733        gfx_rect_t rect;
     734        ui_scrollbar_t *scrollbar;
     735        errno_t rc;
     736
     737        rc = ui_create_disp(NULL, &ui);
     738        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     739
     740        ui_wnd_params_init(&params);
     741        params.caption = "Hello";
     742
     743        rc = ui_window_create(ui, &params, &window);
     744        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     745        PCUT_ASSERT_NOT_NULL(window);
     746
     747        rc = ui_scrollbar_create(ui, window, &scrollbar);
     748        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     749
     750        rect.p0.x = 10;
     751        rect.p0.y = 20;
     752        rect.p1.x = 110;
     753        rect.p1.y = 120;
     754        ui_scrollbar_set_rect(scrollbar, &rect);
     755
     756        PCUT_ASSERT_FALSE(scrollbar->down_through_inside);
     757
     758        pos.x = 60;
     759        pos.y = 22;
     760
     761        ui_scrollbar_throughs_update(scrollbar, &pos);
     762        PCUT_ASSERT_TRUE(scrollbar->down_through_inside);
     763
     764        ui_scrollbar_destroy(scrollbar);
     765        ui_window_destroy(window);
     766        ui_destroy(ui);
    719767}
    720768
     
    722770PCUT_TEST(up)
    723771{
    724         ui_scrollbar_t *scrollbar;
    725         errno_t rc;
    726         gfx_context_t *gc = NULL;
    727         test_gc_t tgc;
    728         ui_resource_t *resource = NULL;
     772        ui_t *ui = NULL;
     773        ui_window_t *window = NULL;
     774        ui_wnd_params_t params;
     775        ui_scrollbar_t *scrollbar;
    729776        test_cb_resp_t resp;
    730 
    731         memset(&tgc, 0, sizeof(tgc));
    732         rc = gfx_context_new(&ops, &tgc, &gc);
    733         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    734 
    735         rc = ui_resource_create(gc, false, &resource);
    736         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    737         PCUT_ASSERT_NOT_NULL(resource);
    738 
    739         rc = ui_scrollbar_create(resource, &scrollbar);
     777        errno_t rc;
     778
     779        rc = ui_create_disp(NULL, &ui);
     780        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     781
     782        ui_wnd_params_init(&params);
     783        params.caption = "Hello";
     784
     785        rc = ui_window_create(ui, &params, &window);
     786        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     787        PCUT_ASSERT_NOT_NULL(window);
     788
     789        rc = ui_scrollbar_create(ui, window, &scrollbar);
    740790        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    741791
     
    754804
    755805        ui_scrollbar_destroy(scrollbar);
    756         ui_resource_destroy(resource);
    757 
    758         rc = gfx_context_delete(gc);
    759         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     806        ui_window_destroy(window);
     807        ui_destroy(ui);
    760808}
    761809
     
    763811PCUT_TEST(down)
    764812{
    765         ui_scrollbar_t *scrollbar;
    766         errno_t rc;
    767         gfx_context_t *gc = NULL;
    768         test_gc_t tgc;
    769         ui_resource_t *resource = NULL;
     813        ui_t *ui = NULL;
     814        ui_window_t *window = NULL;
     815        ui_wnd_params_t params;
     816        ui_scrollbar_t *scrollbar;
    770817        test_cb_resp_t resp;
    771 
    772         memset(&tgc, 0, sizeof(tgc));
    773         rc = gfx_context_new(&ops, &tgc, &gc);
    774         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    775 
    776         rc = ui_resource_create(gc, false, &resource);
    777         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    778         PCUT_ASSERT_NOT_NULL(resource);
    779 
    780         rc = ui_scrollbar_create(resource, &scrollbar);
     818        errno_t rc;
     819
     820        rc = ui_create_disp(NULL, &ui);
     821        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     822
     823        ui_wnd_params_init(&params);
     824        params.caption = "Hello";
     825
     826        rc = ui_window_create(ui, &params, &window);
     827        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     828        PCUT_ASSERT_NOT_NULL(window);
     829
     830        rc = ui_scrollbar_create(ui, window, &scrollbar);
    781831        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    782832
     
    795845
    796846        ui_scrollbar_destroy(scrollbar);
    797         ui_resource_destroy(resource);
    798 
    799         rc = gfx_context_delete(gc);
    800         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     847        ui_window_destroy(window);
     848        ui_destroy(ui);
    801849}
    802850
     
    804852PCUT_TEST(page_up)
    805853{
    806         ui_scrollbar_t *scrollbar;
    807         errno_t rc;
    808         gfx_context_t *gc = NULL;
    809         test_gc_t tgc;
    810         ui_resource_t *resource = NULL;
     854        ui_t *ui = NULL;
     855        ui_window_t *window = NULL;
     856        ui_wnd_params_t params;
     857        ui_scrollbar_t *scrollbar;
    811858        test_cb_resp_t resp;
    812 
    813         memset(&tgc, 0, sizeof(tgc));
    814         rc = gfx_context_new(&ops, &tgc, &gc);
    815         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    816 
    817         rc = ui_resource_create(gc, false, &resource);
    818         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    819         PCUT_ASSERT_NOT_NULL(resource);
    820 
    821         rc = ui_scrollbar_create(resource, &scrollbar);
     859        errno_t rc;
     860
     861        rc = ui_create_disp(NULL, &ui);
     862        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     863
     864        ui_wnd_params_init(&params);
     865        params.caption = "Hello";
     866
     867        rc = ui_window_create(ui, &params, &window);
     868        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     869        PCUT_ASSERT_NOT_NULL(window);
     870
     871        rc = ui_scrollbar_create(ui, window, &scrollbar);
    822872        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    823873
     
    836886
    837887        ui_scrollbar_destroy(scrollbar);
    838         ui_resource_destroy(resource);
    839 
    840         rc = gfx_context_delete(gc);
    841         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     888        ui_window_destroy(window);
     889        ui_destroy(ui);
    842890}
    843891
     
    845893PCUT_TEST(page_down)
    846894{
    847         ui_scrollbar_t *scrollbar;
    848         errno_t rc;
    849         gfx_context_t *gc = NULL;
    850         test_gc_t tgc;
    851         ui_resource_t *resource = NULL;
     895        ui_t *ui = NULL;
     896        ui_window_t *window = NULL;
     897        ui_wnd_params_t params;
     898        ui_scrollbar_t *scrollbar;
    852899        test_cb_resp_t resp;
    853 
    854         memset(&tgc, 0, sizeof(tgc));
    855         rc = gfx_context_new(&ops, &tgc, &gc);
    856         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    857 
    858         rc = ui_resource_create(gc, false, &resource);
    859         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    860         PCUT_ASSERT_NOT_NULL(resource);
    861 
    862         rc = ui_scrollbar_create(resource, &scrollbar);
     900        errno_t rc;
     901
     902        rc = ui_create_disp(NULL, &ui);
     903        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     904
     905        ui_wnd_params_init(&params);
     906        params.caption = "Hello";
     907
     908        rc = ui_window_create(ui, &params, &window);
     909        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     910        PCUT_ASSERT_NOT_NULL(window);
     911
     912        rc = ui_scrollbar_create(ui, window, &scrollbar);
    863913        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    864914
     
    877927
    878928        ui_scrollbar_destroy(scrollbar);
    879         ui_resource_destroy(resource);
    880 
    881         rc = gfx_context_delete(gc);
    882         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     929        ui_window_destroy(window);
     930        ui_destroy(ui);
    883931}
    884932
     
    886934PCUT_TEST(moved)
    887935{
    888         ui_scrollbar_t *scrollbar;
    889         errno_t rc;
    890         gfx_context_t *gc = NULL;
    891         test_gc_t tgc;
    892         ui_resource_t *resource = NULL;
     936        ui_t *ui = NULL;
     937        ui_window_t *window = NULL;
     938        ui_wnd_params_t params;
     939        ui_scrollbar_t *scrollbar;
    893940        test_cb_resp_t resp;
    894 
    895         memset(&tgc, 0, sizeof(tgc));
    896         rc = gfx_context_new(&ops, &tgc, &gc);
    897         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    898 
    899         rc = ui_resource_create(gc, false, &resource);
    900         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    901         PCUT_ASSERT_NOT_NULL(resource);
    902 
    903         rc = ui_scrollbar_create(resource, &scrollbar);
     941        errno_t rc;
     942
     943        rc = ui_create_disp(NULL, &ui);
     944        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     945
     946        ui_wnd_params_init(&params);
     947        params.caption = "Hello";
     948
     949        rc = ui_window_create(ui, &params, &window);
     950        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     951        PCUT_ASSERT_NOT_NULL(window);
     952
     953        rc = ui_scrollbar_create(ui, window, &scrollbar);
    904954        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    905955
     
    920970
    921971        ui_scrollbar_destroy(scrollbar);
    922         ui_resource_destroy(resource);
    923 
    924         rc = gfx_context_delete(gc);
    925         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     972        ui_window_destroy(window);
     973        ui_destroy(ui);
    926974}
    927975
     
    929977PCUT_TEST(pos_event_press_release_thumb)
    930978{
    931         errno_t rc;
    932         gfx_context_t *gc = NULL;
    933         test_gc_t tgc;
    934         ui_resource_t *resource = NULL;
     979        ui_t *ui = NULL;
     980        ui_window_t *window = NULL;
     981        ui_wnd_params_t params;
    935982        ui_scrollbar_t *scrollbar;
    936983        ui_evclaim_t claim;
    937984        pos_event_t event;
    938985        gfx_rect_t rect;
    939 
    940         memset(&tgc, 0, sizeof(tgc));
    941         rc = gfx_context_new(&ops, &tgc, &gc);
    942         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    943 
    944         rc = ui_resource_create(gc, false, &resource);
    945         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    946         PCUT_ASSERT_NOT_NULL(resource);
    947 
    948         rc = ui_scrollbar_create(resource, &scrollbar);
     986        errno_t rc;
     987
     988        rc = ui_create_disp(NULL, &ui);
     989        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     990
     991        ui_wnd_params_init(&params);
     992        params.caption = "Hello";
     993
     994        rc = ui_window_create(ui, &params, &window);
     995        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     996        PCUT_ASSERT_NOT_NULL(window);
     997
     998        rc = ui_scrollbar_create(ui, window, &scrollbar);
    949999        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    9501000
     
    9821032
    9831033        ui_scrollbar_destroy(scrollbar);
    984         ui_resource_destroy(resource);
    985 
    986         rc = gfx_context_delete(gc);
    987         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1034        ui_window_destroy(window);
     1035        ui_destroy(ui);
    9881036}
    9891037
     
    9911039PCUT_TEST(pos_event_press_release_up_btn)
    9921040{
    993         errno_t rc;
    994         gfx_context_t *gc = NULL;
    995         test_gc_t tgc;
    996         ui_resource_t *resource = NULL;
     1041        ui_t *ui = NULL;
     1042        ui_window_t *window = NULL;
     1043        ui_wnd_params_t params;
    9971044        ui_scrollbar_t *scrollbar;
    9981045        ui_evclaim_t claim;
    9991046        pos_event_t event;
    10001047        gfx_rect_t rect;
    1001 
    1002         memset(&tgc, 0, sizeof(tgc));
    1003         rc = gfx_context_new(&ops, &tgc, &gc);
    1004         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1005 
    1006         rc = ui_resource_create(gc, false, &resource);
    1007         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1008         PCUT_ASSERT_NOT_NULL(resource);
    1009 
    1010         rc = ui_scrollbar_create(resource, &scrollbar);
     1048        errno_t rc;
     1049
     1050        rc = ui_create_disp(NULL, &ui);
     1051        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1052
     1053        ui_wnd_params_init(&params);
     1054        params.caption = "Hello";
     1055
     1056        rc = ui_window_create(ui, &params, &window);
     1057        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1058        PCUT_ASSERT_NOT_NULL(window);
     1059
     1060        rc = ui_scrollbar_create(ui, window, &scrollbar);
    10111061        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    10121062
     
    10281078
    10291079        ui_scrollbar_destroy(scrollbar);
    1030         ui_resource_destroy(resource);
    1031 
    1032         rc = gfx_context_delete(gc);
    1033         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1080        ui_window_destroy(window);
     1081        ui_destroy(ui);
    10341082}
    10351083
     
    10371085PCUT_TEST(pos_event_press_release_up_through)
    10381086{
    1039         errno_t rc;
    1040         gfx_context_t *gc = NULL;
    1041         test_gc_t tgc;
    1042         ui_resource_t *resource = NULL;
     1087        ui_t *ui = NULL;
     1088        ui_window_t *window = NULL;
     1089        ui_wnd_params_t params;
    10431090        ui_scrollbar_t *scrollbar;
    10441091        ui_evclaim_t claim;
    10451092        pos_event_t event;
    10461093        gfx_rect_t rect;
    1047 
    1048         memset(&tgc, 0, sizeof(tgc));
    1049         rc = gfx_context_new(&ops, &tgc, &gc);
    1050         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1051 
    1052         rc = ui_resource_create(gc, false, &resource);
    1053         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1054         PCUT_ASSERT_NOT_NULL(resource);
    1055 
    1056         rc = ui_scrollbar_create(resource, &scrollbar);
     1094        errno_t rc;
     1095
     1096        rc = ui_create_disp(NULL, &ui);
     1097        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1098
     1099        ui_wnd_params_init(&params);
     1100        params.caption = "Hello";
     1101
     1102        rc = ui_window_create(ui, &params, &window);
     1103        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1104        PCUT_ASSERT_NOT_NULL(window);
     1105
     1106        rc = ui_scrollbar_create(ui, window, &scrollbar);
    10571107        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    10581108
     
    10851135
    10861136        ui_scrollbar_destroy(scrollbar);
    1087         ui_resource_destroy(resource);
    1088 
    1089         rc = gfx_context_delete(gc);
    1090         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1137        ui_window_destroy(window);
     1138        ui_destroy(ui);
    10911139}
    10921140
     
    10941142PCUT_TEST(pos_event_press_release_down_through)
    10951143{
    1096         errno_t rc;
    1097         gfx_context_t *gc = NULL;
    1098         test_gc_t tgc;
    1099         ui_resource_t *resource = NULL;
     1144        ui_t *ui = NULL;
     1145        ui_window_t *window = NULL;
     1146        ui_wnd_params_t params;
    11001147        ui_scrollbar_t *scrollbar;
    11011148        ui_evclaim_t claim;
    11021149        pos_event_t event;
    11031150        gfx_rect_t rect;
    1104 
    1105         memset(&tgc, 0, sizeof(tgc));
    1106         rc = gfx_context_new(&ops, &tgc, &gc);
    1107         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1108 
    1109         rc = ui_resource_create(gc, false, &resource);
    1110         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1111         PCUT_ASSERT_NOT_NULL(resource);
    1112 
    1113         rc = ui_scrollbar_create(resource, &scrollbar);
     1151        errno_t rc;
     1152
     1153        rc = ui_create_disp(NULL, &ui);
     1154        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1155
     1156        ui_wnd_params_init(&params);
     1157        params.caption = "Hello";
     1158
     1159        rc = ui_window_create(ui, &params, &window);
     1160        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1161        PCUT_ASSERT_NOT_NULL(window);
     1162
     1163        rc = ui_scrollbar_create(ui, window, &scrollbar);
    11141164        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    11151165
     
    11391189
    11401190        ui_scrollbar_destroy(scrollbar);
    1141         ui_resource_destroy(resource);
    1142 
    1143         rc = gfx_context_delete(gc);
    1144         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1191        ui_window_destroy(window);
     1192        ui_destroy(ui);
    11451193}
    11461194
     
    11481196PCUT_TEST(pos_event_press_relese_down_btn)
    11491197{
    1150         errno_t rc;
    1151         gfx_context_t *gc = NULL;
    1152         test_gc_t tgc;
    1153         ui_resource_t *resource = NULL;
     1198        ui_t *ui = NULL;
     1199        ui_window_t *window = NULL;
     1200        ui_wnd_params_t params;
    11541201        ui_scrollbar_t *scrollbar;
    11551202        ui_evclaim_t claim;
    11561203        pos_event_t event;
    11571204        gfx_rect_t rect;
    1158 
    1159         memset(&tgc, 0, sizeof(tgc));
    1160         rc = gfx_context_new(&ops, &tgc, &gc);
    1161         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1162 
    1163         rc = ui_resource_create(gc, false, &resource);
    1164         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1165         PCUT_ASSERT_NOT_NULL(resource);
    1166 
    1167         rc = ui_scrollbar_create(resource, &scrollbar);
     1205        errno_t rc;
     1206
     1207        rc = ui_create_disp(NULL, &ui);
     1208        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1209
     1210        ui_wnd_params_init(&params);
     1211        params.caption = "Hello";
     1212
     1213        rc = ui_window_create(ui, &params, &window);
     1214        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1215        PCUT_ASSERT_NOT_NULL(window);
     1216
     1217        rc = ui_scrollbar_create(ui, window, &scrollbar);
    11681218        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    11691219
     
    11851235
    11861236        ui_scrollbar_destroy(scrollbar);
    1187         ui_resource_destroy(resource);
    1188 
    1189         rc = gfx_context_delete(gc);
    1190         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1191 }
    1192 
    1193 static errno_t testgc_set_clip_rect(void *arg, gfx_rect_t *rect)
    1194 {
    1195         (void) arg;
    1196         (void) rect;
    1197         return EOK;
    1198 }
    1199 
    1200 static errno_t testgc_set_color(void *arg, gfx_color_t *color)
    1201 {
    1202         (void) arg;
    1203         (void) color;
    1204         return EOK;
    1205 }
    1206 
    1207 static errno_t testgc_fill_rect(void *arg, gfx_rect_t *rect)
    1208 {
    1209         (void) arg;
    1210         (void) rect;
    1211         return EOK;
    1212 }
    1213 
    1214 static errno_t testgc_update(void *arg)
    1215 {
    1216         (void) arg;
    1217         return EOK;
    1218 }
    1219 
    1220 static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
    1221     gfx_bitmap_alloc_t *alloc, void **rbm)
    1222 {
    1223         test_gc_t *tgc = (test_gc_t *) arg;
    1224         testgc_bitmap_t *tbm;
    1225 
    1226         tbm = calloc(1, sizeof(testgc_bitmap_t));
    1227         if (tbm == NULL)
    1228                 return ENOMEM;
    1229 
    1230         if (alloc == NULL) {
    1231                 tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
    1232                     sizeof(uint32_t);
    1233                 tbm->alloc.off0 = 0;
    1234                 tbm->alloc.pixels = calloc(sizeof(uint32_t),
    1235                     (params->rect.p1.x - params->rect.p0.x) *
    1236                     (params->rect.p1.y - params->rect.p0.y));
    1237                 tbm->myalloc = true;
    1238                 if (tbm->alloc.pixels == NULL) {
    1239                         free(tbm);
    1240                         return ENOMEM;
    1241                 }
    1242         } else {
    1243                 tbm->alloc = *alloc;
    1244         }
    1245 
    1246         tbm->tgc = tgc;
    1247         tgc->bm_created = true;
    1248         tgc->bm_params = *params;
    1249         tgc->bm_pixels = tbm->alloc.pixels;
    1250         *rbm = (void *)tbm;
    1251         return EOK;
    1252 }
    1253 
    1254 static errno_t testgc_bitmap_destroy(void *bm)
    1255 {
    1256         testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
    1257         if (tbm->myalloc)
    1258                 free(tbm->alloc.pixels);
    1259         tbm->tgc->bm_destroyed = true;
    1260         free(tbm);
    1261         return EOK;
    1262 }
    1263 
    1264 static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
    1265     gfx_coord2_t *offs)
    1266 {
    1267         testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
    1268 
    1269         tbm->tgc->bm_rendered = true;
    1270         if (srect != NULL)
    1271                 tbm->tgc->bm_srect = *srect;
    1272         if (offs != NULL)
    1273                 tbm->tgc->bm_offs = *offs;
    1274         return EOK;
    1275 }
    1276 
    1277 static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
    1278 {
    1279         testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
    1280         *alloc = tbm->alloc;
    1281         tbm->tgc->bm_got_alloc = true;
    1282         return EOK;
     1237        ui_window_destroy(window);
     1238        ui_destroy(ui);
    12831239}
    12841240
  • uspace/lib/ui/test/ui.c

    rd4ea1f6 r8965860c  
    11/*
    2  * Copyright (c) 2020 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    169169}
    170170
     171/** ui_lock(), ui_unlock() */
     172PCUT_TEST(lock_unlock)
     173{
     174        ui_t *ui = NULL;
     175        errno_t rc;
     176
     177        rc = ui_create_disp((display_t *)(-1), &ui);
     178        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     179        PCUT_ASSERT_NOT_NULL(ui);
     180
     181        ui_lock(ui);
     182        ui_unlock(ui);
     183
     184        ui_destroy(ui);
     185}
     186
    171187PCUT_EXPORT(ui);
Note: See TracChangeset for help on using the changeset viewer.