Ignore:
File:
1 edited

Legend:

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

    r3d10a2f rdb3895d  
    3939#include <gfx/bitmap.h>
    4040#include <gfx/context.h>
    41 #include <gfx/cursor.h>
    4241#include <gfx/render.h>
    4342#include <io/kbd_event.h>
     
    8988static void ui_window_invalidate(void *, gfx_rect_t *);
    9089static void ui_window_update(void *);
    91 static errno_t ui_window_cursor_get_pos(void *, gfx_coord2_t *);
    92 static errno_t ui_window_cursor_set_pos(void *, gfx_coord2_t *);
    93 static errno_t ui_window_cursor_set_visible(void *, bool);
    94 
    95 /** Window memory GC callbacks */
    96 static 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 
    10490static void ui_window_app_invalidate(void *, gfx_rect_t *);
    10591static void ui_window_app_update(void *);
    106 
    107 /** Application area memory GC callbacks */
    108 static mem_gc_cb_t ui_window_app_mem_gc_cb = {
    109         .invalidate = ui_window_app_invalidate,
    110         .update = ui_window_app_update
    111 };
    112 
    11392static void ui_window_expose_cb(void *);
    11493
     
    132111/** Compute where window should be placed on the screen.
    133112 *
    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
     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
    139118 * @param params Window parameters
    140119 * @param pos Place to store position of top-left corner
    141120 */
    142 static 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));
     121static 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);
    149125
    150126        pos->x = 0;
     
    153129        switch (params->placement) {
    154130        case ui_wnd_place_default:
    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;
     131                assert(false);
    161132        case ui_wnd_place_top_left:
    162133        case ui_wnd_place_full_screen:
    163                 pos->x = drect->p0.x - params->rect.p0.x;
    164                 pos->y = drect->p0.y - params->rect.p0.y;
     134                pos->x = info->rect.p0.x - params->rect.p0.x;
     135                pos->y = info->rect.p0.y - params->rect.p0.y;
    165136                break;
    166137        case ui_wnd_place_top_right:
    167                 pos->x = drect->p1.x - params->rect.p1.x;
    168                 pos->y = drect->p0.y - params->rect.p0.y;
     138                pos->x = info->rect.p1.x - params->rect.p1.x;
     139                pos->y = info->rect.p0.y - params->rect.p0.y;
    169140                break;
    170141        case ui_wnd_place_bottom_left:
    171                 pos->x = drect->p0.x - params->rect.p0.x;
    172                 pos->y = drect->p1.y - params->rect.p1.y;
     142                pos->x = info->rect.p0.x - params->rect.p0.x;
     143                pos->y = info->rect.p1.y - params->rect.p1.y;
    173144                break;
    174145        case ui_wnd_place_bottom_right:
    175                 pos->x = drect->p1.x - params->rect.p1.x;
    176                 pos->y = drect->p1.y - params->rect.p1.y;
     146                pos->x = info->rect.p1.x - params->rect.p1.x;
     147                pos->y = info->rect.p1.y - params->rect.p1.y;
    177148                break;
    178149        case ui_wnd_place_popup:
     
    205176        gfx_bitmap_alloc_t alloc;
    206177        gfx_bitmap_t *bmp = NULL;
    207         gfx_coord2_t off;
    208178        mem_gc_t *memgc = NULL;
    209         xlate_gc_t *xgc = NULL;
    210179        errno_t rc;
    211180
     
    213182        if (window == NULL)
    214183                return ENOMEM;
    215 
    216         window->ui = ui;
    217184
    218185        display_wnd_params_init(&dparams);
     
    240207                if (params->placement != ui_wnd_place_default) {
    241208                        /* Set initial display window position */
    242                         ui_window_place(window, &info.rect, params,
    243                             &dparams.pos);
     209                        ui_window_place(window, ui->display, &info,
     210                            params, &dparams.pos);
    244211
    245212                        dparams.flags |= wndf_setpos;
     
    256223        } else if (ui->console != NULL) {
    257224                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                 }
    265225        } else {
    266226                /* Needed for unit tests */
     
    282242
    283243        /* Move rectangle so that top-left corner is 0,0 */
    284         gfx_rect_rtranslate(&dparams.rect.p0, &dparams.rect, &bparams.rect);
     244        gfx_rect_rtranslate(&params->rect.p0, &params->rect, &bparams.rect);
    285245
    286246        rc = gfx_bitmap_create(gc, &bparams, NULL, &bmp);
     
    295255        }
    296256
    297         rc = mem_gc_create(&bparams.rect, &alloc, &ui_window_mem_gc_cb,
    298             (void *) window, &memgc);
     257        rc = mem_gc_create(&bparams.rect, &alloc, ui_window_invalidate,
     258            ui_window_update, (void *) window, &memgc);
    299259        if (rc != EOK) {
    300260                gfx_bitmap_destroy(window->app_bmp);
     
    306266        window->gc = mem_gc_get_ctx(memgc);
    307267        window->realgc = gc;
    308         (void) off;
    309268#else
    310         /* Server-side rendering */
    311 
    312         /* Full-screen mode? */
    313         if (ui->display == NULL) {
    314                 /* Create translating GC to translate window contents */
    315                 off.x = 0;
    316                 off.y = 0;
    317                 rc = xlate_gc_create(&off, gc, &xgc);
    318                 if (rc != EOK)
    319                         goto error;
    320 
    321                 window->xgc = xgc;
    322                 window->gc = xlate_gc_get_ctx(xgc);
    323                 window->realgc = gc;
    324         } else {
    325                 window->gc = gc;
    326         }
    327 
    328         (void) ui_window_mem_gc_cb;
     269        (void) ui_window_update;
     270        (void) ui_window_invalidate;
    329271        (void) alloc;
    330272        (void) bparams;
     273        window->gc = gc;
    331274#endif
    332         if (ui->display == NULL) {
    333                 ui_window_place(window, &ui->rect, params, &window->dpos);
    334 
    335                 if (window->xgc != NULL)
    336                         xlate_gc_set_off(window->xgc, &window->dpos);
    337         }
    338275
    339276        rc = ui_resource_create(window->gc, ui_is_textmode(ui), &res);
     
    351288        ui_resource_set_expose_cb(res, ui_window_expose_cb, (void *) window);
    352289
     290        window->ui = ui;
    353291        window->rect = dparams.rect;
     292
    354293        window->res = res;
    355294        window->wdecor = wdecor;
     
    366305        if (memgc != NULL)
    367306                mem_gc_delete(memgc);
    368         if (xgc != NULL)
    369                 xlate_gc_delete(xgc);
    370307        if (bmp != NULL)
    371308                gfx_bitmap_destroy(bmp);
     
    403340        if (window->bmp != NULL)
    404341                gfx_bitmap_destroy(window->bmp);
     342        gfx_context_delete(window->gc);
    405343        if (window->dwindow != NULL)
    406344                display_window_destroy(window->dwindow);
     
    601539}
    602540
    603 /** Get window's containing UI.
    604  *
    605  * @param window Window
    606  * @return Containing UI
    607  */
    608 ui_t *ui_window_get_ui(ui_window_t *window)
    609 {
    610         return window->ui;
    611 }
    612 
    613541/** Get UI resource from window.
    614542 *
     
    646574                        return rc;
    647575        } else {
    648                 *pos = window->dpos;
     576                pos->x = 0;
     577                pos->y = 0;
    649578        }
    650579
     
    689618                }
    690619
    691                 rc = mem_gc_create(&params.rect, &alloc,
    692                     &ui_window_app_mem_gc_cb, (void *) window, &memgc);
     620                rc = mem_gc_create(&params.rect, &alloc, ui_window_app_invalidate,
     621                    ui_window_app_update, (void *) window, &memgc);
    693622                if (rc != EOK) {
    694623                        gfx_bitmap_destroy(window->app_bmp);
     
    942871        if (window->cb != NULL && window->cb->kbd != NULL)
    943872                window->cb->kbd(window, window->arg, kbd);
    944         else
    945                 return ui_window_def_kbd(window, kbd);
    946873}
    947874
     
    982909}
    983910
    984 /** Default window keyboard event routine.
    985  *
    986  * @param window Window
    987  */
    988 void ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
    989 {
    990         if (window->control != NULL)
    991                 ui_control_kbd_event(window->control, kbd);
    992 }
    993 
    994911/** Default window paint routine.
    995912 *
     
    1065982        ui_window_t *window = (ui_window_t *) arg;
    1066983
    1067         if (!gfx_rect_is_empty(&window->dirty_rect)) {
    1068                 (void) gfx_bitmap_render(window->bmp, &window->dirty_rect,
    1069                     &window->dpos);
    1070         }
     984        if (!gfx_rect_is_empty(&window->dirty_rect))
     985                (void) gfx_bitmap_render(window->bmp, &window->dirty_rect, NULL);
    1071986
    1072987        window->dirty_rect.p0.x = 0;
     
    1074989        window->dirty_rect.p1.x = 0;
    1075990        window->dirty_rect.p1.y = 0;
    1076 }
    1077 
    1078 /** Window cursor get position callback
    1079  *
    1080  * @param arg Argument (ui_window_t *)
    1081  * @param pos Place to store position
    1082  */
    1083 static errno_t ui_window_cursor_get_pos(void *arg, gfx_coord2_t *pos)
    1084 {
    1085         ui_window_t *window = (ui_window_t *) arg;
    1086         gfx_coord2_t cpos;
    1087         errno_t rc;
    1088 
    1089         rc = gfx_cursor_get_pos(window->realgc, &cpos);
    1090         if (rc != EOK)
    1091                 return rc;
    1092 
    1093         pos->x = cpos.x - window->dpos.x;
    1094         pos->y = cpos.y - window->dpos.y;
    1095         return EOK;
    1096 }
    1097 
    1098 /** Window cursor set position callback
    1099  *
    1100  * @param arg Argument (ui_window_t *)
    1101  * @param pos New position
    1102  */
    1103 static errno_t ui_window_cursor_set_pos(void *arg, gfx_coord2_t *pos)
    1104 {
    1105         ui_window_t *window = (ui_window_t *) arg;
    1106         gfx_coord2_t cpos;
    1107 
    1108         cpos.x = pos->x + window->dpos.x;
    1109         cpos.y = pos->y + window->dpos.y;
    1110 
    1111         return gfx_cursor_set_pos(window->realgc, &cpos);
    1112 }
    1113 
    1114 /** Window cursor set visibility callback
    1115  *
    1116  * @param arg Argument (ui_window_t *)
    1117  * @param visible @c true iff cursor is to be made visible
    1118  */
    1119 static errno_t ui_window_cursor_set_visible(void *arg, bool visible)
    1120 {
    1121         ui_window_t *window = (ui_window_t *) arg;
    1122 
    1123         return gfx_cursor_set_visible(window->realgc, visible);
    1124991}
    1125992
Note: See TracChangeset for help on using the changeset viewer.