Changeset 20d2c6c in mainline for uspace/lib/ui/src


Ignore:
Timestamp:
2020-10-21T20:58:52Z (5 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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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 */
Note: See TracChangeset for help on using the changeset viewer.