Changes in uspace/lib/ui/src/window.c [db3895d:b48e680f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
rdb3895d rb48e680f 39 39 #include <gfx/bitmap.h> 40 40 #include <gfx/context.h> 41 #include <gfx/cursor.h> 41 42 #include <gfx/render.h> 42 43 #include <io/kbd_event.h> … … 88 89 static void ui_window_invalidate(void *, gfx_rect_t *); 89 90 static 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 90 104 static void ui_window_app_invalidate(void *, gfx_rect_t *); 91 105 static 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 92 113 static void ui_window_expose_cb(void *); 93 114 … … 111 132 /** Compute where window should be placed on the screen. 112 133 * 113 * This only applies to windows that do not use default placement .114 * 115 * @param window Window116 * @param display Display117 * @param info Display info134 * 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 118 139 * @param params Window parameters 119 140 * @param pos Place to store position of top-left corner 120 141 */ 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); 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)); 125 149 126 150 pos->x = 0; … … 129 153 switch (params->placement) { 130 154 case ui_wnd_place_default: 131 assert(false); 155 assert(ui_is_fullscreen(window->ui)); 156 /* Center window */ 157 gfx_rect_dims(¶ms->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; 132 161 case ui_wnd_place_top_left: 133 162 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; 136 165 break; 137 166 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; 140 169 break; 141 170 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; 144 173 break; 145 174 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; 148 177 break; 149 178 case ui_wnd_place_popup: … … 176 205 gfx_bitmap_alloc_t alloc; 177 206 gfx_bitmap_t *bmp = NULL; 207 gfx_coord2_t off; 178 208 mem_gc_t *memgc = NULL; 209 xlate_gc_t *xgc = NULL; 179 210 errno_t rc; 180 211 … … 182 213 if (window == NULL) 183 214 return ENOMEM; 215 216 window->ui = ui; 184 217 185 218 display_wnd_params_init(&dparams); … … 207 240 if (params->placement != ui_wnd_place_default) { 208 241 /* 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); 211 244 212 245 dparams.flags |= wndf_setpos; … … 223 256 } else if (ui->console != NULL) { 224 257 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 } 225 267 } else { 226 268 /* Needed for unit tests */ … … 242 284 243 285 /* Move rectangle so that top-left corner is 0,0 */ 244 gfx_rect_rtranslate(& params->rect.p0, ¶ms->rect, &bparams.rect);286 gfx_rect_rtranslate(&dparams.rect.p0, &dparams.rect, &bparams.rect); 245 287 246 288 rc = gfx_bitmap_create(gc, &bparams, NULL, &bmp); … … 255 297 } 256 298 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); 259 301 if (rc != EOK) { 260 302 gfx_bitmap_destroy(window->app_bmp); … … 266 308 window->gc = mem_gc_get_ctx(memgc); 267 309 window->realgc = gc; 310 (void) off; 268 311 #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; 271 331 (void) alloc; 272 332 (void) bparams; 273 window->gc = gc;274 333 #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 } 275 340 276 341 rc = ui_resource_create(window->gc, ui_is_textmode(ui), &res); … … 288 353 ui_resource_set_expose_cb(res, ui_window_expose_cb, (void *) window); 289 354 290 window->ui = ui;291 355 window->rect = dparams.rect; 292 293 356 window->res = res; 294 357 window->wdecor = wdecor; 295 358 window->cursor = ui_curs_arrow; 359 window->placement = params->placement; 296 360 *rwindow = window; 297 361 … … 305 369 if (memgc != NULL) 306 370 mem_gc_delete(memgc); 371 if (xgc != NULL) 372 xlate_gc_delete(xgc); 307 373 if (bmp != NULL) 308 374 gfx_bitmap_destroy(bmp); … … 340 406 if (window->bmp != NULL) 341 407 gfx_bitmap_destroy(window->bmp); 342 gfx_context_delete(window->gc);343 408 if (window->dwindow != NULL) 344 409 display_window_destroy(window->dwindow); … … 349 414 if (ui_is_fullscreen(ui)) { 350 415 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, ""); 351 421 } 352 422 } … … 539 609 } 540 610 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 */ 618 errno_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 */ 628 ui_t *ui_window_get_ui(ui_window_t *window) 629 { 630 return window->ui; 631 } 632 541 633 /** Get UI resource from window. 542 634 * … … 574 666 return rc; 575 667 } else { 576 pos->x = 0; 577 pos->y = 0; 668 *pos = window->dpos; 578 669 } 579 670 … … 618 709 } 619 710 620 rc = mem_gc_create(¶ms.rect, &alloc, ui_window_app_invalidate,621 ui_window_app_update, (void *) window, &memgc);711 rc = mem_gc_create(¶ms.rect, &alloc, 712 &ui_window_app_mem_gc_cb, (void *) window, &memgc); 622 713 if (rc != EOK) { 623 714 gfx_bitmap_destroy(window->app_bmp); … … 871 962 if (window->cb != NULL && window->cb->kbd != NULL) 872 963 window->cb->kbd(window, window->arg, kbd); 964 else 965 return ui_window_def_kbd(window, kbd); 873 966 } 874 967 … … 909 1002 } 910 1003 1004 /** Default window keyboard event routine. 1005 * 1006 * @param window Window 1007 */ 1008 void 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 911 1014 /** Default window paint routine. 912 1015 * … … 982 1085 ui_window_t *window = (ui_window_t *) arg; 983 1086 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 } 986 1091 987 1092 window->dirty_rect.p0.x = 0; … … 989 1094 window->dirty_rect.p1.x = 0; 990 1095 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 */ 1103 static 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 */ 1123 static 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 */ 1139 static 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); 991 1144 } 992 1145
Note:
See TracChangeset
for help on using the changeset viewer.