Changes in uspace/lib/ui/src/window.c [db3895d:3d10a2f] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
rdb3895d r3d10a2f 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 } 225 265 } else { 226 266 /* Needed for unit tests */ … … 242 282 243 283 /* Move rectangle so that top-left corner is 0,0 */ 244 gfx_rect_rtranslate(& params->rect.p0, ¶ms->rect, &bparams.rect);284 gfx_rect_rtranslate(&dparams.rect.p0, &dparams.rect, &bparams.rect); 245 285 246 286 rc = gfx_bitmap_create(gc, &bparams, NULL, &bmp); … … 255 295 } 256 296 257 rc = mem_gc_create(&bparams.rect, &alloc, ui_window_invalidate,258 ui_window_update,(void *) window, &memgc);297 rc = mem_gc_create(&bparams.rect, &alloc, &ui_window_mem_gc_cb, 298 (void *) window, &memgc); 259 299 if (rc != EOK) { 260 300 gfx_bitmap_destroy(window->app_bmp); … … 266 306 window->gc = mem_gc_get_ctx(memgc); 267 307 window->realgc = gc; 308 (void) off; 268 309 #else 269 (void) ui_window_update; 270 (void) ui_window_invalidate; 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; 271 329 (void) alloc; 272 330 (void) bparams; 273 window->gc = gc;274 331 #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 } 275 338 276 339 rc = ui_resource_create(window->gc, ui_is_textmode(ui), &res); … … 288 351 ui_resource_set_expose_cb(res, ui_window_expose_cb, (void *) window); 289 352 290 window->ui = ui;291 353 window->rect = dparams.rect; 292 293 354 window->res = res; 294 355 window->wdecor = wdecor; … … 305 366 if (memgc != NULL) 306 367 mem_gc_delete(memgc); 368 if (xgc != NULL) 369 xlate_gc_delete(xgc); 307 370 if (bmp != NULL) 308 371 gfx_bitmap_destroy(bmp); … … 340 403 if (window->bmp != NULL) 341 404 gfx_bitmap_destroy(window->bmp); 342 gfx_context_delete(window->gc);343 405 if (window->dwindow != NULL) 344 406 display_window_destroy(window->dwindow); … … 539 601 } 540 602 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 541 613 /** Get UI resource from window. 542 614 * … … 574 646 return rc; 575 647 } else { 576 pos->x = 0; 577 pos->y = 0; 648 *pos = window->dpos; 578 649 } 579 650 … … 618 689 } 619 690 620 rc = mem_gc_create(¶ms.rect, &alloc, ui_window_app_invalidate,621 ui_window_app_update, (void *) window, &memgc);691 rc = mem_gc_create(¶ms.rect, &alloc, 692 &ui_window_app_mem_gc_cb, (void *) window, &memgc); 622 693 if (rc != EOK) { 623 694 gfx_bitmap_destroy(window->app_bmp); … … 871 942 if (window->cb != NULL && window->cb->kbd != NULL) 872 943 window->cb->kbd(window, window->arg, kbd); 944 else 945 return ui_window_def_kbd(window, kbd); 873 946 } 874 947 … … 909 982 } 910 983 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 911 994 /** Default window paint routine. 912 995 * … … 982 1065 ui_window_t *window = (ui_window_t *) arg; 983 1066 984 if (!gfx_rect_is_empty(&window->dirty_rect)) 985 (void) gfx_bitmap_render(window->bmp, &window->dirty_rect, NULL); 1067 if (!gfx_rect_is_empty(&window->dirty_rect)) { 1068 (void) gfx_bitmap_render(window->bmp, &window->dirty_rect, 1069 &window->dpos); 1070 } 986 1071 987 1072 window->dirty_rect.p0.x = 0; … … 989 1074 window->dirty_rect.p1.x = 0; 990 1075 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); 991 1124 } 992 1125
Note:
See TracChangeset
for help on using the changeset viewer.