Changeset fa01c05 in mainline


Ignore:
Timestamp:
2020-11-03T18:46:35Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b71c0fc
Parents:
4ac11ff
Message:

UI window should fill the application are background

Except for applications that want to do their own drawing without the
use of UI control hierarchy. We solve this by doing it in a default
paint callback that the application can override with its own
paint routine.

Location:
uspace
Files:
6 edited

Legend:

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

    r4ac11ff rfa01c05  
    3333 */
    3434
    35 #include <gfx/color.h>
    3635#include <gfx/coord.h>
    37 #include <gfx/render.h>
    3836#include <io/pos_event.h>
    3937#include <stdio.h>
     
    5048
    5149static void wnd_close(ui_window_t *, void *);
     50static errno_t wnd_paint(ui_window_t *, void *);
    5251static void wnd_pos(ui_window_t *, void *, pos_event_t *pos);
    5352
    5453static ui_window_cb_t window_cb = {
    5554        .close = wnd_close,
     55        .paint = wnd_paint,
    5656        .pos = wnd_pos
    5757};
     
    7373
    7474        ui_quit(demo->ui);
     75}
     76
     77/** Window paint request.
     78 *
     79 * @param window Window
     80 * @param arg Argument (demo)
     81 * @return EOK on success or an error code
     82 */
     83static errno_t wnd_paint(ui_window_t *window, void *arg)
     84{
     85        ui_demo_t *demo = (ui_demo_t *) arg;
     86        errno_t rc;
     87
     88        /* Let window paint its background */
     89        rc = ui_window_def_paint(window);
     90        if (rc != EOK)
     91                return rc;
     92
     93        return ui_fixed_paint(demo->fixed);
    7594}
    7695
     
    122141        ui_demo_t demo;
    123142        gfx_rect_t rect;
    124         gfx_rect_t app_rect;
    125         gfx_color_t *color;
    126143        ui_resource_t *ui_res;
    127         gfx_context_t *gc;
    128144        errno_t rc;
    129145
     
    156172
    157173        ui_res = ui_window_get_res(window);
    158         gc = ui_window_get_gc(window);
    159         ui_window_get_app_rect(window, &app_rect);
    160174
    161175        rc = ui_fixed_create(&demo.fixed);
     
    226240        }
    227241
    228         rc = gfx_color_new_rgb_i16(0xc8c8, 0xc8c8, 0xc8c8, &color);
    229         if (rc != EOK) {
    230                 printf("Error allocating color.\n");
    231                 return rc;
    232         }
    233 
    234         rc = gfx_set_color(gc, color);
    235         if (rc != EOK) {
    236                 printf("Error setting color.\n");
    237                 return rc;
    238         }
    239 
    240         rc = gfx_fill_rect(gc, &app_rect);
    241         if (rc != EOK) {
    242                 printf("Error filling background.\n");
    243                 return rc;
    244         }
    245 
    246         rc = ui_fixed_paint(demo.fixed);
    247         if (rc != EOK) {
    248                 printf("Error painting UI controls.\n");
     242        rc = ui_window_paint(window);
     243        if (rc != EOK) {
     244                printf("Error painting window.\n");
    249245                return rc;
    250246        }
  • uspace/lib/ui/include/types/ui/window.h

    r4ac11ff rfa01c05  
    3737#define _UI_TYPES_WINDOW_H
    3838
     39#include <errno.h>
    3940#include <io/kbd_event.h>
    4041#include <io/pos_event.h>
     
    5657        void (*focus)(ui_window_t *, void *);
    5758        void (*kbd)(ui_window_t *, void *, kbd_event_t *);
     59        errno_t (*paint)(ui_window_t *, void *);
    5860        void (*pos)(ui_window_t *, void *, pos_event_t *);
    5961        void (*unfocus)(ui_window_t *, void *);
  • uspace/lib/ui/include/ui/window.h

    r4ac11ff rfa01c05  
    5252extern gfx_context_t *ui_window_get_gc(ui_window_t *);
    5353extern void ui_window_get_app_rect(ui_window_t *, gfx_rect_t *);
     54extern errno_t ui_window_paint(ui_window_t *);
     55extern errno_t ui_window_def_paint(ui_window_t *);
    5456
    5557#endif
  • uspace/lib/ui/private/window.h

    r4ac11ff rfa01c05  
    3838#define _UI_PRIVATE_WINDOW_H
    3939
     40#include <errno.h>
    4041#include <display.h>
    4142#include <gfx/context.h>
     
    6465};
    6566
    66 extern void ui_window_close(ui_window_t *);
    67 extern void ui_window_focus(ui_window_t *);
    68 extern void ui_window_kbd(ui_window_t *, kbd_event_t *);
    69 extern void ui_window_pos(ui_window_t *, pos_event_t *);
    70 extern void ui_window_unfocus(ui_window_t *);
     67extern void ui_window_send_close(ui_window_t *);
     68extern void ui_window_send_focus(ui_window_t *);
     69extern void ui_window_send_kbd(ui_window_t *, kbd_event_t *);
     70extern errno_t ui_window_send_paint(ui_window_t *);
     71extern void ui_window_send_pos(ui_window_t *, pos_event_t *);
     72extern void ui_window_send_unfocus(ui_window_t *);
    7173
    7274#endif
  • uspace/lib/ui/src/window.c

    r4ac11ff rfa01c05  
    3737#include <errno.h>
    3838#include <gfx/context.h>
     39#include <gfx/render.h>
    3940#include <io/kbd_event.h>
    4041#include <io/pos_event.h>
     
    4546#include <ui/window.h>
    4647#include "../private/dummygc.h"
     48#include "../private/resource.h"
    4749#include "../private/ui.h"
    4850#include "../private/wdecor.h"
     
    205207}
    206208
     209errno_t ui_window_paint(ui_window_t *window)
     210{
     211        return ui_window_send_paint(window);
     212}
     213
    207214/** Handle window close event. */
    208215static void dwnd_close_event(void *arg)
     
    210217        ui_window_t *window = (ui_window_t *) arg;
    211218
    212         ui_window_close(window);
     219        ui_window_send_close(window);
    213220}
    214221
     
    223230        }
    224231
    225         ui_window_focus(window);
     232        ui_window_send_focus(window);
    226233}
    227234
     
    232239
    233240        (void) window;
    234         ui_window_kbd(window, kbd_event);
     241        ui_window_send_kbd(window, kbd_event);
    235242}
    236243
     
    245252
    246253        ui_wdecor_pos_event(window->wdecor, event);
    247         ui_window_pos(window, event);
     254        ui_window_send_pos(window, event);
    248255}
    249256
     
    258265        }
    259266
    260         ui_window_unfocus(window);
     267        ui_window_send_unfocus(window);
    261268}
    262269
     
    270277        ui_window_t *window = (ui_window_t *) arg;
    271278
    272         ui_window_close(window);
     279        ui_window_send_close(window);
    273280}
    274281
     
    290297 * @param window Window
    291298 */
    292 void ui_window_close(ui_window_t *window)
     299void ui_window_send_close(ui_window_t *window)
    293300{
    294301        if (window->cb != NULL && window->cb->close != NULL)
     
    300307 * @param window Window
    301308 */
    302 void ui_window_focus(ui_window_t *window)
     309void ui_window_send_focus(ui_window_t *window)
    303310{
    304311        if (window->cb != NULL && window->cb->focus != NULL)
     
    310317 * @param window Window
    311318 */
    312 void ui_window_kbd(ui_window_t *window, kbd_event_t *kbd)
     319void ui_window_send_kbd(ui_window_t *window, kbd_event_t *kbd)
    313320{
    314321        if (window->cb != NULL && window->cb->kbd != NULL)
     
    316323}
    317324
     325/** Send window paint event.
     326 *
     327 * @param window Window
     328 */
     329errno_t ui_window_send_paint(ui_window_t *window)
     330{
     331        if (window->cb != NULL && window->cb->paint != NULL)
     332                return window->cb->paint(window, window->arg);
     333        else
     334                return ui_window_def_paint(window);
     335}
     336
    318337/** Send window position event.
    319338 *
    320339 * @param window Window
    321340 */
    322 void ui_window_pos(ui_window_t *window, pos_event_t *pos)
     341void ui_window_send_pos(ui_window_t *window, pos_event_t *pos)
    323342{
    324343        if (window->cb != NULL && window->cb->pos != NULL)
     
    330349 * @param window Window
    331350 */
    332 void ui_window_unfocus(ui_window_t *window)
     351void ui_window_send_unfocus(ui_window_t *window)
    333352{
    334353        if (window->cb != NULL && window->cb->unfocus != NULL)
     
    336355}
    337356
     357/** Default window paint routine.
     358 *
     359 * @param window Window
     360 * @return EOK on success or an error code
     361 */
     362errno_t ui_window_def_paint(ui_window_t *window)
     363{
     364        gfx_rect_t app_rect;
     365        errno_t rc;
     366
     367        rc = gfx_set_color(window->gc, window->res->wnd_face_color);
     368        if (rc != EOK)
     369                return rc;
     370
     371        ui_window_get_app_rect(window, &app_rect);
     372
     373        rc = gfx_fill_rect(window->gc, &app_rect);
     374        if (rc != EOK)
     375                return rc;
     376
     377        return EOK;
     378}
     379
    338380/** @}
    339381 */
  • uspace/lib/ui/test/window.c

    r4ac11ff rfa01c05  
    4646static void test_window_focus(ui_window_t *, void *);
    4747static void test_window_kbd(ui_window_t *, void *, kbd_event_t *);
     48static errno_t test_window_paint(ui_window_t *, void *);
    4849static void test_window_pos(ui_window_t *, void *, pos_event_t *);
    4950static void test_window_unfocus(ui_window_t *, void *);
     
    5354        .focus = test_window_focus,
    5455        .kbd = test_window_kbd,
     56        .paint = test_window_paint,
    5557        .pos = test_window_pos,
    5658        .unfocus = test_window_unfocus
     
    6163
    6264typedef struct {
     65        errno_t rc;
    6366        bool close;
    6467        bool focus;
    6568        bool kbd;
    6669        kbd_event_t kbd_event;
     70        bool paint;
    6771        bool pos;
    6872        pos_event_t pos_event;
     
    131135}
    132136
    133 /** ui_window_close() calls close callback set via ui_window_set_cb() */
    134 PCUT_TEST(close)
     137/** Test ui_window_paint() */
     138PCUT_TEST(paint)
     139{
     140        errno_t rc;
     141        ui_t *ui = NULL;
     142        ui_wnd_params_t params;
     143        ui_window_t *window = NULL;
     144
     145        rc = ui_create_disp(NULL, &ui);
     146        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     147
     148        ui_wnd_params_init(&params);
     149        params.caption = "Hello";
     150
     151        rc = ui_window_create(ui, &params, &window);
     152        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     153        PCUT_ASSERT_NOT_NULL(window);
     154
     155        ui_window_paint(window);
     156
     157        ui_window_destroy(window);
     158        ui_destroy(ui);
     159}
     160
     161/** Test ui_window_def_paint() */
     162PCUT_TEST(def_paint)
     163{
     164        errno_t rc;
     165        ui_t *ui = NULL;
     166        ui_wnd_params_t params;
     167        ui_window_t *window = NULL;
     168
     169        rc = ui_create_disp(NULL, &ui);
     170        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     171
     172        ui_wnd_params_init(&params);
     173        params.caption = "Hello";
     174
     175        rc = ui_window_create(ui, &params, &window);
     176        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     177        PCUT_ASSERT_NOT_NULL(window);
     178
     179        ui_window_def_paint(window);
     180
     181        ui_window_destroy(window);
     182        ui_destroy(ui);
     183}
     184
     185/** ui_window_send_close() calls close callback set via ui_window_set_cb() */
     186PCUT_TEST(send_close)
    135187{
    136188        errno_t rc;
     
    151203
    152204        /* Close callback with no callbacks set */
    153         ui_window_close(window);
     205        ui_window_send_close(window);
    154206
    155207        /* Close callback with close callback not implemented */
    156208        ui_window_set_cb(window, &dummy_window_cb, NULL);
    157         ui_window_close(window);
     209        ui_window_send_close(window);
    158210
    159211        /* Close callback with real callback set */
    160212        resp.close = false;
    161213        ui_window_set_cb(window, &test_window_cb, &resp);
    162         ui_window_close(window);
     214        ui_window_send_close(window);
    163215        PCUT_ASSERT_TRUE(resp.close);
    164216
     
    167219}
    168220
    169 /** ui_window_focus() calls focus callback set via ui_window_set_cb() */
    170 PCUT_TEST(focus)
     221/** ui_window_send_focus() calls focus callback set via ui_window_set_cb() */
     222PCUT_TEST(send_focus)
    171223{
    172224        errno_t rc;
     
    187239
    188240        /* Focus callback with no callbacks set */
    189         ui_window_focus(window);
     241        ui_window_send_focus(window);
    190242
    191243        /* Focus callback with focus callback not implemented */
    192244        ui_window_set_cb(window, &dummy_window_cb, NULL);
    193         ui_window_focus(window);
     245        ui_window_send_focus(window);
    194246
    195247        /* Focus callback with real callback set */
    196         resp.close = false;
    197         ui_window_set_cb(window, &test_window_cb, &resp);
    198         ui_window_focus(window);
     248        resp.focus = false;
     249        ui_window_set_cb(window, &test_window_cb, &resp);
     250        ui_window_send_focus(window);
    199251        PCUT_ASSERT_TRUE(resp.focus);
    200252
     
    203255}
    204256
    205 /** ui_window_kbd() calls kbd callback set via ui_window_set_cb() */
    206 PCUT_TEST(kbd)
     257/** ui_window_send_kbd() calls kbd callback set via ui_window_set_cb() */
     258PCUT_TEST(send_kbd)
    207259{
    208260        errno_t rc;
     
    229281
    230282        /* Kbd callback with no callbacks set */
    231         ui_window_kbd(window, &kbd_event);
     283        ui_window_send_kbd(window, &kbd_event);
    232284
    233285        /* Kbd callback with kbd callback not implemented */
    234286        ui_window_set_cb(window, &dummy_window_cb, NULL);
    235         ui_window_kbd(window, &kbd_event);
     287        ui_window_send_kbd(window, &kbd_event);
    236288
    237289        /* Kbd callback with real callback set */
    238290        resp.kbd = false;
    239291        ui_window_set_cb(window, &test_window_cb, &resp);
    240         ui_window_kbd(window, &kbd_event);
     292        ui_window_send_kbd(window, &kbd_event);
    241293        PCUT_ASSERT_TRUE(resp.kbd);
    242294        PCUT_ASSERT_EQUALS(kbd_event.type, resp.kbd_event.type);
     
    249301}
    250302
    251 /** ui_window_pos() calls pos callback set via ui_window_set_cb() */
    252 PCUT_TEST(pos)
     303/** ui_window_send_paint() calls paint callback set via ui_window_set_cb() */
     304PCUT_TEST(send_paint)
     305{
     306        errno_t rc;
     307        ui_t *ui = NULL;
     308        ui_wnd_params_t params;
     309        ui_window_t *window = NULL;
     310        test_cb_resp_t resp;
     311
     312        rc = ui_create_disp(NULL, &ui);
     313        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     314
     315        ui_wnd_params_init(&params);
     316        params.caption = "Hello";
     317
     318        rc = ui_window_create(ui, &params, &window);
     319        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     320        PCUT_ASSERT_NOT_NULL(window);
     321
     322        /* Paint callback with no callbacks set */
     323        ui_window_send_paint(window);
     324
     325        /* Paint callback with paint callback not implemented */
     326        ui_window_set_cb(window, &dummy_window_cb, NULL);
     327        ui_window_send_paint(window);
     328
     329        /* Paint callback with real callback set */
     330        resp.paint = false;
     331        resp.rc = EOK;
     332        ui_window_set_cb(window, &test_window_cb, &resp);
     333        rc = ui_window_send_paint(window);
     334        PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
     335        PCUT_ASSERT_TRUE(resp.paint);
     336
     337        ui_window_destroy(window);
     338        ui_destroy(ui);
     339}
     340
     341/** ui_window_send_pos() calls pos callback set via ui_window_set_cb() */
     342PCUT_TEST(send_pos)
    253343{
    254344        errno_t rc;
     
    276366
    277367        /* Pos callback with no callbacks set */
    278         ui_window_pos(window, &pos_event);
     368        ui_window_send_pos(window, &pos_event);
    279369
    280370        /* Pos callback with pos callback not implemented */
    281371        ui_window_set_cb(window, &dummy_window_cb, NULL);
    282         ui_window_pos(window, &pos_event);
     372        ui_window_send_pos(window, &pos_event);
    283373
    284374        /* Pos callback with real callback set */
    285375        resp.pos = false;
    286376        ui_window_set_cb(window, &test_window_cb, &resp);
    287         ui_window_pos(window, &pos_event);
     377        ui_window_send_pos(window, &pos_event);
    288378        PCUT_ASSERT_TRUE(resp.pos);
    289379        PCUT_ASSERT_INT_EQUALS(pos_event.pos_id, resp.pos_event.pos_id);
     
    297387}
    298388
    299 /** ui_window_unfocus() calls unfocus callback set via ui_window_set_cb() */
    300 PCUT_TEST(unfocus)
     389/** ui_window_send_unfocus() calls unfocus callback set via ui_window_set_cb() */
     390PCUT_TEST(send_unfocus)
    301391{
    302392        errno_t rc;
     
    317407
    318408        /* Unfocus callback with no callbacks set */
    319         ui_window_unfocus(window);
     409        ui_window_send_unfocus(window);
    320410
    321411        /* Unfocus callback with unfocus callback not implemented */
    322412        ui_window_set_cb(window, &dummy_window_cb, NULL);
    323         ui_window_unfocus(window);
     413        ui_window_send_unfocus(window);
    324414
    325415        /* Unfocus callback with real callback set */
    326416        resp.close = false;
    327417        ui_window_set_cb(window, &test_window_cb, &resp);
    328         ui_window_unfocus(window);
     418        ui_window_send_unfocus(window);
    329419        PCUT_ASSERT_TRUE(resp.unfocus);
    330420
     
    356446}
    357447
     448static errno_t test_window_paint(ui_window_t *window, void *arg)
     449{
     450        test_cb_resp_t *resp = (test_cb_resp_t *) arg;
     451
     452        resp->paint = true;
     453        return resp->rc;
     454}
     455
    358456static void test_window_pos(ui_window_t *window, void *arg,
    359457    pos_event_t *event)
Note: See TracChangeset for help on using the changeset viewer.