Changeset 20d2c6c in mainline


Ignore:
Timestamp:
2020-10-21T20:58:52Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
172188a
Parents:
ba09d06
Message:

Window close button

Location:
uspace
Files:
5 edited

Legend:

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

    rba09d06 r20d2c6c  
    6666};
    6767
     68static void wd_close(ui_wdecor_t *, void *);
    6869static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
    6970
    7071static ui_wdecor_cb_t wdecor_cb = {
     72        .close = wd_close,
    7173        .move = wd_move
    7274};
    7375
    74 static bool quit = false;
    75 
    7676/** Print syntax. */
    7777static void print_syntax(void)
     
    8383static void wnd_close_event(void *arg)
    8484{
     85        ui_demo_t *demo = (ui_demo_t *) arg;
     86
    8587        printf("Close event\n");
    86         quit = true;
     88        demo->quit = true;
    8789}
    8890
     
    101103static void wnd_kbd_event(void *arg, kbd_event_t *event)
    102104{
     105        ui_demo_t *demo = (ui_demo_t *) arg;
     106
     107        (void) demo;
    103108        printf("Keyboard event type=%d key=%d\n", event->type, event->key);
    104         if (event->type == KEY_PRESS)
    105                 quit = true;
    106109}
    107110
     
    156159}
    157160
     161/** Window decoration requested window closure.
     162 *
     163 * @param wdecor Window decoration
     164 * @param arg Argument (demo)
     165 */
     166static void wd_close(ui_wdecor_t *wdecor, void *arg)
     167{
     168        ui_demo_t *demo = (ui_demo_t *) arg;
     169
     170        printf("Close window requested\n");
     171        demo->quit = true;
     172}
     173
    158174/** Window decoration requested window move.
    159175 *
     
    205221        }
    206222
     223        demo.quit = false;
    207224        demo.dwindow = window;
    208225
     
    318335        }
    319336
    320         while (!quit) {
     337        while (!demo.quit) {
    321338                fibril_usleep(100 * 1000);
    322339        }
  • uspace/app/uidemo/uidemo.h

    rba09d06 r20d2c6c  
    4949        ui_pbutton_t *pb1;
    5050        ui_pbutton_t *pb2;
     51        bool quit;
    5152} ui_demo_t;
    5253
  • uspace/lib/ui/private/wdecor.h

    rba09d06 r20d2c6c  
    5656        gfx_rect_t rect;
    5757        /** Caption */
    58         const char *caption;
     58        char *caption;
    5959        /** Window is active */
    6060        bool active;
     61        /** Close button */
     62        struct ui_pbutton *btn_close;
    6163};
    6264
     65extern void ui_wdecor_close(ui_wdecor_t *);
    6366extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
    6467
  • uspace/lib/ui/src/wdecor.c

    rba09d06 r20d2c6c  
    4343#include <str.h>
    4444#include <ui/paint.h>
     45#include <ui/pbutton.h>
    4546#include <ui/wdecor.h>
    4647#include "../private/resource.h"
    4748#include "../private/wdecor.h"
     49
     50static void ui_wdecor_btn_clicked(ui_pbutton_t *, void *);
     51
     52static ui_pbutton_cb_t ui_wdecor_btn_close_cb = {
     53        .clicked = ui_wdecor_btn_clicked
     54};
    4855
    4956/** Create new window decoration.
     
    5865{
    5966        ui_wdecor_t *wdecor;
     67        errno_t rc;
    6068
    6169        wdecor = calloc(1, sizeof(ui_wdecor_t));
     
    6977        }
    7078
     79        rc = ui_pbutton_create(resource, "X", &wdecor->btn_close);
     80        if (rc != EOK) {
     81                free(wdecor->caption);
     82                free(wdecor);
     83                return rc;
     84        }
     85
     86        ui_pbutton_set_cb(wdecor->btn_close, &ui_wdecor_btn_close_cb,
     87            (void *)wdecor);
     88
    7189        wdecor->res = resource;
    7290        wdecor->active = true;
     
    84102                return;
    85103
     104        ui_pbutton_destroy(wdecor->btn_close);
     105        free(wdecor->caption);
    86106        free(wdecor);
    87107}
     
    106126void ui_wdecor_set_rect(ui_wdecor_t *wdecor, gfx_rect_t *rect)
    107127{
     128        gfx_rect_t crect;
     129
    108130        wdecor->rect = *rect;
     131        crect.p0.x = rect->p1.x - 5 - 20;
     132        crect.p0.y = rect->p0.y + 5;
     133        crect.p1.x = rect->p1.x - 5;
     134        crect.p1.y = rect->p0.y + 5 + 20;
     135
     136        ui_pbutton_set_rect(wdecor->btn_close, &crect);
    109137}
    110138
     
    191219                return rc;
    192220
     221        rc = ui_pbutton_paint(wdecor->btn_close);
     222        if (rc != EOK)
     223                return rc;
     224
    193225        return EOK;
     226}
     227
     228/** Send decoration close event.
     229 *
     230 * @param wdecor Window decoration
     231 * @param pos Position where the title bar was pressed
     232 */
     233void ui_wdecor_close(ui_wdecor_t *wdecor)
     234{
     235        if (wdecor->cb != NULL && wdecor->cb->close != NULL)
     236                wdecor->cb->close(wdecor, wdecor->arg);
    194237}
    195238
     
    213256{
    214257        gfx_rect_t trect;
     258        gfx_rect_t cbrect;
    215259        gfx_coord2_t pos;
    216260
     
    220264        trect.p1.y = trect.p0.y + 22;
    221265
     266        cbrect.p0.x = wdecor->rect.p1.x - 5 - 20;
     267        cbrect.p0.y = wdecor->rect.p0.y + 5;
     268        cbrect.p1.x = wdecor->rect.p1.x - 5;
     269        cbrect.p1.y = wdecor->rect.p0.y + 5 + 20;
     270
    222271        pos.x = event->hpos;
    223272        pos.y = event->vpos;
    224273
     274        if (gfx_pix_inside_rect(&pos, &cbrect)) {
     275                ui_pbutton_pos_event(wdecor->btn_close, event);
     276                return;
     277        }
     278
    225279        if (event->type == POS_PRESS && gfx_pix_inside_rect(&pos, &trect))
    226280                ui_wdecor_move(wdecor, &pos);
    227281}
    228282
     283/** Window decoration close button was clicked.
     284 *
     285 * @param pbutton Close button
     286 * @param arg Argument (ui_wdecor_t)
     287 */
     288static void ui_wdecor_btn_clicked(ui_pbutton_t *pbutton, void *arg)
     289{
     290        ui_wdecor_t *wdecor = (ui_wdecor_t *) arg;
     291
     292        (void) pbutton;
     293        ui_wdecor_close(wdecor);
     294}
     295
    229296/** @}
    230297 */
  • uspace/lib/ui/test/wdecor.c

    rba09d06 r20d2c6c  
    3232#include <pcut/pcut.h>
    3333#include <stdbool.h>
     34#include <ui/pbutton.h>
    3435#include <ui/resource.h>
    3536#include <ui/wdecor.h>
     
    5758};
    5859
     60static void test_wdecor_close(ui_wdecor_t *, void *);
    5961static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *);
    6062
    6163static ui_wdecor_cb_t test_wdecor_cb = {
     64        .close = test_wdecor_close,
    6265        .move = test_wdecor_move
    6366};
     
    8487
    8588typedef struct {
     89        bool close;
    8690        bool move;
    8791        gfx_coord2_t pos;
     
    179183        rc = gfx_context_delete(gc);
    180184        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     185}
     186
     187/** Test ui_wdecor_close() */
     188PCUT_TEST(close)
     189{
     190        errno_t rc;
     191        ui_wdecor_t *wdecor;
     192        test_cb_resp_t resp;
     193
     194        rc = ui_wdecor_create(NULL, "Hello", &wdecor);
     195        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     196
     197        /* Close callback with no callbacks set */
     198        ui_wdecor_close(wdecor);
     199
     200        /* Close callback with close callback not implemented */
     201        ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
     202        ui_wdecor_close(wdecor);
     203
     204        /* Close callback with real callback set */
     205        resp.close = false;
     206        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
     207        ui_wdecor_close(wdecor);
     208        PCUT_ASSERT_TRUE(resp.close);
     209
     210        ui_wdecor_destroy(wdecor);
    181211}
    182212
     
    211241        PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
    212242        PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
     243
     244        ui_wdecor_destroy(wdecor);
     245}
     246
     247/** Clicking the close button generates close callback */
     248PCUT_TEST(close_btn_clicked)
     249{
     250        ui_wdecor_t *wdecor;
     251        gfx_rect_t rect;
     252        test_cb_resp_t resp;
     253        errno_t rc;
     254
     255        rc = ui_wdecor_create(NULL, "Hello", &wdecor);
     256        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     257
     258        rect.p0.x = 10;
     259        rect.p0.y = 20;
     260        rect.p1.x = 100;
     261        rect.p1.y = 200;
     262
     263        ui_wdecor_set_rect(wdecor, &rect);
     264
     265        ui_wdecor_set_cb(wdecor, &test_wdecor_cb, (void *) &resp);
     266
     267        resp.close = false;
     268
     269        ui_pbutton_clicked(wdecor->btn_close);
     270        PCUT_ASSERT_TRUE(resp.close);
    213271
    214272        ui_wdecor_destroy(wdecor);
     
    328386}
    329387
     388static void test_wdecor_close(ui_wdecor_t *wdecor, void *arg)
     389{
     390        test_cb_resp_t *resp = (test_cb_resp_t *) arg;
     391
     392        resp->close = true;
     393}
     394
    330395static void test_wdecor_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos)
    331396{
Note: See TracChangeset for help on using the changeset viewer.