Changeset d284ce9 in mainline for uspace/lib/ui/src/window.c


Ignore:
Timestamp:
2020-10-27T21:56:15Z (4 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f03d1308
Parents:
f7a90df
Message:

Let ui_window handle window decoration, display window

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ui/src/window.c

    rf7a90df rd284ce9  
    3737#include <errno.h>
    3838#include <gfx/context.h>
     39#include <io/pos_event.h>
    3940#include <mem.h>
    4041#include <stdlib.h>
     
    4445#include "../private/dummygc.h"
    4546#include "../private/ui.h"
     47#include "../private/wdecor.h"
    4648#include "../private/window.h"
     49
     50static void dwnd_close_event(void *);
     51static void dwnd_focus_event(void *);
     52static void dwnd_kbd_event(void *, kbd_event_t *);
     53static void dwnd_pos_event(void *, pos_event_t *);
     54static void dwnd_unfocus_event(void *);
     55
     56static display_wnd_cb_t dwnd_cb = {
     57        .close_event = dwnd_close_event,
     58        .focus_event = dwnd_focus_event,
     59        .kbd_event = dwnd_kbd_event,
     60        .pos_event = dwnd_pos_event,
     61        .unfocus_event = dwnd_unfocus_event
     62};
     63
     64static void wd_close(ui_wdecor_t *, void *);
     65static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
     66
     67static ui_wdecor_cb_t wdecor_cb = {
     68        .close = wd_close,
     69        .move = wd_move
     70};
    4771
    4872/** Initialize window parameters structure.
     
    5377 * @param params Window parameters structure
    5478 */
    55 void ui_window_params_init(ui_window_params_t *params)
    56 {
    57         memset(params, 0, sizeof(ui_window_params_t));
     79void ui_wnd_params_init(ui_wnd_params_t *params)
     80{
     81        memset(params, 0, sizeof(ui_wnd_params_t));
    5882}
    5983
     
    6589 * @return EOK on success or an error code
    6690 */
    67 errno_t ui_window_create(ui_t *ui, ui_window_params_t *params,
     91errno_t ui_window_create(ui_t *ui, ui_wnd_params_t *params,
    6892    ui_window_t **rwindow)
    6993{
     
    82106
    83107        display_wnd_params_init(&dparams);
     108        dparams.rect = params->rect;
    84109
    85110        if (ui->display != NULL) {
    86                 rc = display_window_create(ui->display, &dparams, NULL, NULL,
    87                     &dwindow);
     111                rc = display_window_create(ui->display, &dparams, &dwnd_cb,
     112                    (void *) window, &dwindow);
    88113                if (rc != EOK)
    89114                        goto error;
     
    108133        if (rc != EOK)
    109134                goto error;
     135
     136        ui_wdecor_set_rect(wdecor, &params->rect);
     137        ui_wdecor_set_cb(wdecor, &wdecor_cb, (void *) window);
     138        ui_wdecor_paint(wdecor);
    110139
    111140        window->ui = ui;
     
    145174}
    146175
     176/** Set window callbacks.
     177 *
     178 * @param window Window
     179 * @param cb Window decoration callbacks
     180 * @param arg Callback argument
     181 */
     182void ui_window_set_cb(ui_window_t *window, ui_window_cb_t *cb, void *arg)
     183{
     184        window->cb = cb;
     185        window->arg = arg;
     186}
     187
     188ui_resource_t *ui_window_get_res(ui_window_t *window)
     189{
     190        return window->res;
     191}
     192
     193gfx_context_t *ui_window_get_gc(ui_window_t *window)
     194{
     195        return window->gc;
     196}
     197
     198void ui_window_get_app_rect(ui_window_t *window, gfx_rect_t *rect)
     199{
     200        ui_wdecor_geom_t geom;
     201
     202        ui_wdecor_get_geom(window->wdecor, &geom);
     203        *rect = geom.app_area_rect;
     204}
     205
     206/** Handle window close event. */
     207static void dwnd_close_event(void *arg)
     208{
     209        ui_window_t *window = (ui_window_t *) arg;
     210
     211        ui_window_close(window);
     212}
     213
     214/** Handle window focus event. */
     215static void dwnd_focus_event(void *arg)
     216{
     217        ui_window_t *window = (ui_window_t *) arg;
     218
     219        if (window->wdecor != NULL) {
     220                ui_wdecor_set_active(window->wdecor, true);
     221                ui_wdecor_paint(window->wdecor);
     222        }
     223}
     224
     225/** Handle window keyboard event */
     226static void dwnd_kbd_event(void *arg, kbd_event_t *kbd_event)
     227{
     228        ui_window_t *window = (ui_window_t *) arg;
     229
     230        (void) window;
     231        (void) kbd_event;
     232}
     233
     234/** Handle window position event */
     235static void dwnd_pos_event(void *arg, pos_event_t *event)
     236{
     237        ui_window_t *window = (ui_window_t *) arg;
     238
     239        /* Make sure we don't process events until fully initialized */
     240        if (window->wdecor == NULL)
     241                return;
     242
     243        ui_wdecor_pos_event(window->wdecor, event);
     244        ui_window_pos(window, event);
     245}
     246
     247/** Handle window unfocus event. */
     248static void dwnd_unfocus_event(void *arg)
     249{
     250        ui_window_t *window = (ui_window_t *) arg;
     251
     252        if (window->wdecor != NULL) {
     253                ui_wdecor_set_active(window->wdecor, false);
     254                ui_wdecor_paint(window->wdecor);
     255        }
     256}
     257
     258/** Window decoration requested window closure.
     259 *
     260 * @param wdecor Window decoration
     261 * @param arg Argument (demo)
     262 */
     263static void wd_close(ui_wdecor_t *wdecor, void *arg)
     264{
     265        ui_window_t *window = (ui_window_t *) arg;
     266
     267        ui_window_close(window);
     268}
     269
     270/** Window decoration requested window move.
     271 *
     272 * @param wdecor Window decoration
     273 * @param arg Argument (demo)
     274 * @param pos Position where the title bar was pressed
     275 */
     276static void wd_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos)
     277{
     278        ui_window_t *window = (ui_window_t *) arg;
     279
     280        (void) display_window_move_req(window->dwindow, pos);
     281}
     282
     283/** Send window close event.
     284 *
     285 * @param window Window
     286 */
     287void ui_window_close(ui_window_t *window)
     288{
     289        if (window->cb != NULL && window->cb->close != NULL)
     290                window->cb->close(window, window->arg);
     291}
     292
     293/** Send window position event.
     294 *
     295 * @param window Window
     296 */
     297void ui_window_pos(ui_window_t *window, pos_event_t *pos)
     298{
     299        if (window->cb != NULL && window->cb->pos != NULL)
     300                window->cb->pos(window, window->arg, pos);
     301}
     302
    147303/** @}
    148304 */
Note: See TracChangeset for help on using the changeset viewer.