Changes in uspace/lib/ui/src/window.c [3d10a2f:db3895d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/src/window.c
r3d10a2f rdb3895d 39 39 #include <gfx/bitmap.h> 40 40 #include <gfx/context.h> 41 #include <gfx/cursor.h>42 41 #include <gfx/render.h> 43 42 #include <io/kbd_event.h> … … 89 88 static void ui_window_invalidate(void *, gfx_rect_t *); 90 89 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_visible102 };103 104 90 static void ui_window_app_invalidate(void *, gfx_rect_t *); 105 91 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_update111 };112 113 92 static void ui_window_expose_cb(void *); 114 93 … … 132 111 /** Compute where window should be placed on the screen. 133 112 * 134 * This only applies to windows that do not use default placement or135 * if we are running in full-screen mode.136 * 137 * @param window Window138 * @param drect Display rectangle113 * 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 139 118 * @param params Window parameters 140 119 * @param pos Place to store position of top-left corner 141 120 */ 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)); 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); 149 125 150 126 pos->x = 0; … … 153 129 switch (params->placement) { 154 130 case ui_wnd_place_default: 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; 131 assert(false); 161 132 case ui_wnd_place_top_left: 162 133 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; 165 136 break; 166 137 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; 169 140 break; 170 141 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; 173 144 break; 174 145 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; 177 148 break; 178 149 case ui_wnd_place_popup: … … 205 176 gfx_bitmap_alloc_t alloc; 206 177 gfx_bitmap_t *bmp = NULL; 207 gfx_coord2_t off;208 178 mem_gc_t *memgc = NULL; 209 xlate_gc_t *xgc = NULL;210 179 errno_t rc; 211 180 … … 213 182 if (window == NULL) 214 183 return ENOMEM; 215 216 window->ui = ui;217 184 218 185 display_wnd_params_init(&dparams); … … 240 207 if (params->placement != ui_wnd_place_default) { 241 208 /* 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); 244 211 245 212 dparams.flags |= wndf_setpos; … … 256 223 } else if (ui->console != NULL) { 257 224 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 }265 225 } else { 266 226 /* Needed for unit tests */ … … 282 242 283 243 /* 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(¶ms->rect.p0, ¶ms->rect, &bparams.rect); 285 245 286 246 rc = gfx_bitmap_create(gc, &bparams, NULL, &bmp); … … 295 255 } 296 256 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); 299 259 if (rc != EOK) { 300 260 gfx_bitmap_destroy(window->app_bmp); … … 306 266 window->gc = mem_gc_get_ctx(memgc); 307 267 window->realgc = gc; 308 (void) off;309 268 #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; 329 271 (void) alloc; 330 272 (void) bparams; 273 window->gc = gc; 331 274 #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 }338 275 339 276 rc = ui_resource_create(window->gc, ui_is_textmode(ui), &res); … … 351 288 ui_resource_set_expose_cb(res, ui_window_expose_cb, (void *) window); 352 289 290 window->ui = ui; 353 291 window->rect = dparams.rect; 292 354 293 window->res = res; 355 294 window->wdecor = wdecor; … … 366 305 if (memgc != NULL) 367 306 mem_gc_delete(memgc); 368 if (xgc != NULL)369 xlate_gc_delete(xgc);370 307 if (bmp != NULL) 371 308 gfx_bitmap_destroy(bmp); … … 403 340 if (window->bmp != NULL) 404 341 gfx_bitmap_destroy(window->bmp); 342 gfx_context_delete(window->gc); 405 343 if (window->dwindow != NULL) 406 344 display_window_destroy(window->dwindow); … … 601 539 } 602 540 603 /** Get window's containing UI.604 *605 * @param window Window606 * @return Containing UI607 */608 ui_t *ui_window_get_ui(ui_window_t *window)609 {610 return window->ui;611 }612 613 541 /** Get UI resource from window. 614 542 * … … 646 574 return rc; 647 575 } else { 648 *pos = window->dpos; 576 pos->x = 0; 577 pos->y = 0; 649 578 } 650 579 … … 689 618 } 690 619 691 rc = mem_gc_create(¶ms.rect, &alloc, 692 &ui_window_app_mem_gc_cb, (void *) window, &memgc);620 rc = mem_gc_create(¶ms.rect, &alloc, ui_window_app_invalidate, 621 ui_window_app_update, (void *) window, &memgc); 693 622 if (rc != EOK) { 694 623 gfx_bitmap_destroy(window->app_bmp); … … 942 871 if (window->cb != NULL && window->cb->kbd != NULL) 943 872 window->cb->kbd(window, window->arg, kbd); 944 else945 return ui_window_def_kbd(window, kbd);946 873 } 947 874 … … 982 909 } 983 910 984 /** Default window keyboard event routine.985 *986 * @param window Window987 */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 994 911 /** Default window paint routine. 995 912 * … … 1065 982 ui_window_t *window = (ui_window_t *) arg; 1066 983 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); 1071 986 1072 987 window->dirty_rect.p0.x = 0; … … 1074 989 window->dirty_rect.p1.x = 0; 1075 990 window->dirty_rect.p1.y = 0; 1076 }1077 1078 /** Window cursor get position callback1079 *1080 * @param arg Argument (ui_window_t *)1081 * @param pos Place to store position1082 */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 callback1099 *1100 * @param arg Argument (ui_window_t *)1101 * @param pos New position1102 */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 callback1115 *1116 * @param arg Argument (ui_window_t *)1117 * @param visible @c true iff cursor is to be made visible1118 */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);1124 991 } 1125 992
Note:
See TracChangeset
for help on using the changeset viewer.