Ignore:
File:
1 edited

Legend:

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

    rdb3895d rb48e680f  
    3939#include <gfx/bitmap.h>
    4040#include <gfx/context.h>
     41#include <gfx/cursor.h>
    4142#include <gfx/render.h>
    4243#include <io/kbd_event.h>
     
    8889static void ui_window_invalidate(void *, gfx_rect_t *);
    8990static void ui_window_update(void *);
     91static errno_t ui_window_cursor_get_pos(void *, gfx_coord2_t *);
     92static errno_t ui_window_cursor_set_pos(void *, gfx_coord2_t *);
     93static errno_t ui_window_cursor_set_visible(void *, bool);
     94
     95/** Window memory GC callbacks */
     96static mem_gc_cb_t ui_window_mem_gc_cb = {
     97        .invalidate = ui_window_invalidate,
     98        .update = ui_window_update,
     99        .cursor_get_pos = ui_window_cursor_get_pos,
     100        .cursor_set_pos = ui_window_cursor_set_pos,
     101        .cursor_set_visible = ui_window_cursor_set_visible
     102};
     103
    90104static void ui_window_app_invalidate(void *, gfx_rect_t *);
    91105static void ui_window_app_update(void *);
     106
     107/** Application area memory GC callbacks */
     108static mem_gc_cb_t ui_window_app_mem_gc_cb = {
     109        .invalidate = ui_window_app_invalidate,
     110        .update = ui_window_app_update
     111};
     112
    92113static void ui_window_expose_cb(void *);
    93114
     
    111132/** Compute where window should be placed on the screen.
    112133 *
    113  * This only applies to windows that do not use default placement.
    114  *
    115  * @param window Window
    116  * @param display Display
    117  * @param info Display info
     134 * This only applies to windows that do not use default placement or
     135 * if we are running in full-screen mode.
     136 *
     137 * @param window Window
     138 * @param drect Display rectangle
    118139 * @param params Window parameters
    119140 * @param pos Place to store position of top-left corner
    120141 */
    121 static void ui_window_place(ui_window_t *window, display_t *display,
    122     display_info_t *info, ui_wnd_params_t *params, gfx_coord2_t *pos)
    123 {
    124         assert(params->placement != ui_wnd_place_default);
     142static void ui_window_place(ui_window_t *window, gfx_rect_t *drect,
     143    ui_wnd_params_t *params, gfx_coord2_t *pos)
     144{
     145        gfx_coord2_t dims;
     146
     147        assert(params->placement != ui_wnd_place_default ||
     148            ui_is_fullscreen(window->ui));
    125149
    126150        pos->x = 0;
     
    129153        switch (params->placement) {
    130154        case ui_wnd_place_default:
    131                 assert(false);
     155                assert(ui_is_fullscreen(window->ui));
     156                /* Center window */
     157                gfx_rect_dims(&params->rect, &dims);
     158                pos->x = (drect->p0.x + drect->p1.x) / 2 - dims.x / 2;
     159                pos->y = (drect->p0.y + drect->p1.y) / 2 - dims.y / 2;
     160                break;
    132161        case ui_wnd_place_top_left:
    133162        case ui_wnd_place_full_screen:
    134                 pos->x = info->rect.p0.x - params->rect.p0.x;
    135                 pos->y = info->rect.p0.y - params->rect.p0.y;
     163                pos->x = drect->p0.x - params->rect.p0.x;
     164                pos->y = drect->p0.y - params->rect.p0.y;
    136165                break;
    137166        case ui_wnd_place_top_right:
    138                 pos->x = info->rect.p1.x - params->rect.p1.x;
    139                 pos->y = info->rect.p0.y - params->rect.p0.y;
     167                pos->x = drect->p1.x - params->rect.p1.x;
     168                pos->y = drect->p0.y - params->rect.p0.y;
    140169                break;
    141170        case ui_wnd_place_bottom_left:
    142                 pos->x = info->rect.p0.x - params->rect.p0.x;
    143                 pos->y = info->rect.p1.y - params->rect.p1.y;
     171                pos->x = drect->p0.x - params->rect.p0.x;
     172                pos->y = drect->p1.y - params->rect.p1.y;
    144173                break;
    145174        case ui_wnd_place_bottom_right:
    146                 pos->x = info->rect.p1.x - params->rect.p1.x;
    147                 pos->y = info->rect.p1.y - params->rect.p1.y;
     175                pos->x = drect->p1.x - params->rect.p1.x;
     176                pos->y = drect->p1.y - params->rect.p1.y;
    148177                break;
    149178        case ui_wnd_place_popup:
     
    176205        gfx_bitmap_alloc_t alloc;
    177206        gfx_bitmap_t *bmp = NULL;
     207        gfx_coord2_t off;
    178208        mem_gc_t *memgc = NULL;
     209        xlate_gc_t *xgc = NULL;
    179210        errno_t rc;
    180211
     
    182213        if (window == NULL)
    183214                return ENOMEM;
     215
     216        window->ui = ui;
    184217
    185218        display_wnd_params_init(&dparams);
     
    207240                if (params->placement != ui_wnd_place_default) {
    208241                        /* Set initial display window position */
    209                         ui_window_place(window, ui->display, &info,
    210                             params, &dparams.pos);
     242                        ui_window_place(window, &info.rect, params,
     243                            &dparams.pos);
    211244
    212245                        dparams.flags |= wndf_setpos;
     
    223256        } else if (ui->console != NULL) {
    224257                gc = console_gc_get_ctx(ui->cgc);
     258
     259                if (params->placement == ui_wnd_place_full_screen) {
     260                        /* Make window the size of the screen */
     261                        gfx_rect_dims(&ui->rect, &scr_dims);
     262                        gfx_coord2_add(&dparams.rect.p0, &scr_dims,
     263                            &dparams.rect.p1);
     264                        (void) console_set_caption(ui->console,
     265                            params->caption);
     266                }
    225267        } else {
    226268                /* Needed for unit tests */
     
    242284
    243285        /* Move rectangle so that top-left corner is 0,0 */
    244         gfx_rect_rtranslate(&params->rect.p0, &params->rect, &bparams.rect);
     286        gfx_rect_rtranslate(&dparams.rect.p0, &dparams.rect, &bparams.rect);
    245287
    246288        rc = gfx_bitmap_create(gc, &bparams, NULL, &bmp);
     
    255297        }
    256298
    257         rc = mem_gc_create(&bparams.rect, &alloc, ui_window_invalidate,
    258             ui_window_update, (void *) window, &memgc);
     299        rc = mem_gc_create(&bparams.rect, &alloc, &ui_window_mem_gc_cb,
     300            (void *) window, &memgc);
    259301        if (rc != EOK) {
    260302                gfx_bitmap_destroy(window->app_bmp);
     
    266308        window->gc = mem_gc_get_ctx(memgc);
    267309        window->realgc = gc;
     310        (void) off;
    268311#else
    269         (void) ui_window_update;
    270         (void) ui_window_invalidate;
     312        /* Server-side rendering */
     313
     314        /* Full-screen mode? */
     315        if (ui->display == NULL) {
     316                /* Create translating GC to translate window contents */
     317                off.x = 0;
     318                off.y = 0;
     319                rc = xlate_gc_create(&off, gc, &xgc);
     320                if (rc != EOK)
     321                        goto error;
     322
     323                window->xgc = xgc;
     324                window->gc = xlate_gc_get_ctx(xgc);
     325                window->realgc = gc;
     326        } else {
     327                window->gc = gc;
     328        }
     329
     330        (void) ui_window_mem_gc_cb;
    271331        (void) alloc;
    272332        (void) bparams;
    273         window->gc = gc;
    274333#endif
     334        if (ui->display == NULL) {
     335                ui_window_place(window, &ui->rect, params, &window->dpos);
     336
     337                if (window->xgc != NULL)
     338                        xlate_gc_set_off(window->xgc, &window->dpos);
     339        }
    275340
    276341        rc = ui_resource_create(window->gc, ui_is_textmode(ui), &res);
     
    288353        ui_resource_set_expose_cb(res, ui_window_expose_cb, (void *) window);
    289354
    290         window->ui = ui;
    291355        window->rect = dparams.rect;
    292 
    293356        window->res = res;
    294357        window->wdecor = wdecor;
    295358        window->cursor = ui_curs_arrow;
     359        window->placement = params->placement;
    296360        *rwindow = window;
    297361
     
    305369        if (memgc != NULL)
    306370                mem_gc_delete(memgc);
     371        if (xgc != NULL)
     372                xlate_gc_delete(xgc);
    307373        if (bmp != NULL)
    308374                gfx_bitmap_destroy(bmp);
     
    340406        if (window->bmp != NULL)
    341407                gfx_bitmap_destroy(window->bmp);
    342         gfx_context_delete(window->gc);
    343408        if (window->dwindow != NULL)
    344409                display_window_destroy(window->dwindow);
     
    349414        if (ui_is_fullscreen(ui)) {
    350415                ui_paint(ui);
     416        }
     417
     418        if (ui->console != NULL &&
     419            window->placement == ui_wnd_place_full_screen) {
     420                (void) console_set_caption(ui->console, "");
    351421        }
    352422}
     
    539609}
    540610
     611/** Change window caption.
     612 *
     613 * @param window Window
     614 * @param caption New caption
     615 *
     616 * @return EOK on success or an error code
     617 */
     618errno_t ui_window_set_caption(ui_window_t *window, const char *caption)
     619{
     620        return ui_wdecor_set_caption(window->wdecor, caption);
     621}
     622
     623/** Get window's containing UI.
     624 *
     625 * @param window Window
     626 * @return Containing UI
     627 */
     628ui_t *ui_window_get_ui(ui_window_t *window)
     629{
     630        return window->ui;
     631}
     632
    541633/** Get UI resource from window.
    542634 *
     
    574666                        return rc;
    575667        } else {
    576                 pos->x = 0;
    577                 pos->y = 0;
     668                *pos = window->dpos;
    578669        }
    579670
     
    618709                }
    619710
    620                 rc = mem_gc_create(&params.rect, &alloc, ui_window_app_invalidate,
    621                     ui_window_app_update, (void *) window, &memgc);
     711                rc = mem_gc_create(&params.rect, &alloc,
     712                    &ui_window_app_mem_gc_cb, (void *) window, &memgc);
    622713                if (rc != EOK) {
    623714                        gfx_bitmap_destroy(window->app_bmp);
     
    871962        if (window->cb != NULL && window->cb->kbd != NULL)
    872963                window->cb->kbd(window, window->arg, kbd);
     964        else
     965                return ui_window_def_kbd(window, kbd);
    873966}
    874967
     
    9091002}
    9101003
     1004/** Default window keyboard event routine.
     1005 *
     1006 * @param window Window
     1007 */
     1008void ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
     1009{
     1010        if (window->control != NULL)
     1011                ui_control_kbd_event(window->control, kbd);
     1012}
     1013
    9111014/** Default window paint routine.
    9121015 *
     
    9821085        ui_window_t *window = (ui_window_t *) arg;
    9831086
    984         if (!gfx_rect_is_empty(&window->dirty_rect))
    985                 (void) gfx_bitmap_render(window->bmp, &window->dirty_rect, NULL);
     1087        if (!gfx_rect_is_empty(&window->dirty_rect)) {
     1088                (void) gfx_bitmap_render(window->bmp, &window->dirty_rect,
     1089                    &window->dpos);
     1090        }
    9861091
    9871092        window->dirty_rect.p0.x = 0;
     
    9891094        window->dirty_rect.p1.x = 0;
    9901095        window->dirty_rect.p1.y = 0;
     1096}
     1097
     1098/** Window cursor get position callback
     1099 *
     1100 * @param arg Argument (ui_window_t *)
     1101 * @param pos Place to store position
     1102 */
     1103static errno_t ui_window_cursor_get_pos(void *arg, gfx_coord2_t *pos)
     1104{
     1105        ui_window_t *window = (ui_window_t *) arg;
     1106        gfx_coord2_t cpos;
     1107        errno_t rc;
     1108
     1109        rc = gfx_cursor_get_pos(window->realgc, &cpos);
     1110        if (rc != EOK)
     1111                return rc;
     1112
     1113        pos->x = cpos.x - window->dpos.x;
     1114        pos->y = cpos.y - window->dpos.y;
     1115        return EOK;
     1116}
     1117
     1118/** Window cursor set position callback
     1119 *
     1120 * @param arg Argument (ui_window_t *)
     1121 * @param pos New position
     1122 */
     1123static errno_t ui_window_cursor_set_pos(void *arg, gfx_coord2_t *pos)
     1124{
     1125        ui_window_t *window = (ui_window_t *) arg;
     1126        gfx_coord2_t cpos;
     1127
     1128        cpos.x = pos->x + window->dpos.x;
     1129        cpos.y = pos->y + window->dpos.y;
     1130
     1131        return gfx_cursor_set_pos(window->realgc, &cpos);
     1132}
     1133
     1134/** Window cursor set visibility callback
     1135 *
     1136 * @param arg Argument (ui_window_t *)
     1137 * @param visible @c true iff cursor is to be made visible
     1138 */
     1139static errno_t ui_window_cursor_set_visible(void *arg, bool visible)
     1140{
     1141        ui_window_t *window = (ui_window_t *) arg;
     1142
     1143        return gfx_cursor_set_visible(window->realgc, visible);
    9911144}
    9921145
Note: See TracChangeset for help on using the changeset viewer.