Changeset ed1a948 in mainline
- Timestamp:
- 2023-09-20T13:10:28Z (15 months ago)
- Branches:
- master, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8d1bcd7
- Parents:
- 153dd3b
- git-author:
- Jiri Svoboda <jiri@…> (2023-09-19 17:10:04)
- git-committer:
- Jiri Svoboda <jiri@…> (2023-09-20 13:10:28)
- Location:
- uspace/lib/ui
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/ui/include/types/ui/wdecor.h
r153dd3b red1a948 52 52 /** Window has a title bar */ 53 53 ui_wds_titlebar = 0x2, 54 /** Window has a system menu */55 ui_wds_sysmenu = 0x4,54 /** Window has a system menu handle */ 55 ui_wds_sysmenu_hdl = 0x4, 56 56 /** Window has a minimize button */ 57 57 ui_wds_minimize_btn = 0x8, … … 63 63 ui_wds_resizable = 0x40, 64 64 /** Window is decorated (default decoration) */ 65 ui_wds_decorated = ui_wds_frame | ui_wds_titlebar | ui_wds_sysmenu |65 ui_wds_decorated = ui_wds_frame | ui_wds_titlebar | ui_wds_sysmenu_hdl | 66 66 ui_wds_minimize_btn | ui_wds_close_btn 67 67 } ui_wdecor_style_t; -
uspace/lib/ui/include/ui/wdecor.h
r153dd3b red1a948 54 54 extern void ui_wdecor_set_maximized(ui_wdecor_t *, bool); 55 55 extern errno_t ui_wdecor_set_caption(ui_wdecor_t *, const char *); 56 extern void ui_wdecor_sysmenu_hdl_set_active(ui_wdecor_t *, bool); 56 57 extern errno_t ui_wdecor_paint(ui_wdecor_t *); 57 58 extern ui_evclaim_t ui_wdecor_kbd_event(ui_wdecor_t *, kbd_event_t *); -
uspace/lib/ui/private/wdecor.h
r153dd3b red1a948 66 66 /** Window is maximized */ 67 67 bool maximized; 68 /** System menu handle is active */ 69 bool sysmenu_hdl_active; 68 70 /** Minimize button */ 69 71 struct ui_pbutton *btn_min; … … 83 85 /** Title bar rectangle */ 84 86 gfx_rect_t title_bar_rect; 87 /** System menu handle rectangle */ 88 gfx_rect_t sysmenu_hdl_rect; 85 89 /** Window caption rectangle */ 86 90 gfx_rect_t caption_rect; … … 105 109 extern void ui_wdecor_set_cursor(ui_wdecor_t *, ui_stock_cursor_t); 106 110 extern void ui_wdecor_get_geom(ui_wdecor_t *, ui_wdecor_geom_t *); 111 extern errno_t ui_wdecor_sysmenu_hdl_paint_gfx(ui_wdecor_t *, gfx_rect_t *); 112 extern errno_t ui_wdecor_sysmenu_hdl_paint_text(ui_wdecor_t *, gfx_rect_t *); 113 extern errno_t ui_wdecor_sysmenu_hdl_paint(ui_wdecor_t *, gfx_rect_t *); 107 114 extern void ui_wdecor_frame_pos_event(ui_wdecor_t *, pos_event_t *); 108 115 extern ui_wdecor_rsztype_t ui_wdecor_get_rsztype(ui_wdecor_t *, -
uspace/lib/ui/src/wdecor.c
r153dd3b red1a948 104 104 /** Window caption horizontal margin in text mode */ 105 105 wdecor_cap_hmargin_text = 1, 106 /** System menu handle width */ 107 wdecor_sysmenu_hdl_w = 20, 108 /** System menu handle height */ 109 wdecor_sysmenu_hdl_h = 20, 110 /** System menu handle width in text mode */ 111 wdecor_sysmenu_hdl_w_text = 3, 112 /** System menu handle height in text mode */ 113 wdecor_sysmenu_hdl_h_text = 1, 106 114 /** Close button cross leg length */ 107 115 wdecor_close_cross_n = 5, … … 296 304 } 297 305 306 /** Paint system menu handle in graphics mode. 307 * 308 * @param wdecor Window decoration 309 * @param rect System menu handle rectangle 310 * @return EOK on success or an error code 311 */ 312 errno_t ui_wdecor_sysmenu_hdl_paint_gfx(ui_wdecor_t *wdecor, gfx_rect_t *rect) 313 { 314 errno_t rc; 315 gfx_rect_t mrect; 316 gfx_rect_t inside; 317 gfx_coord2_t center; 318 319 rc = gfx_set_color(wdecor->res->gc, wdecor->sysmenu_hdl_active ? 320 wdecor->res->btn_shadow_color : wdecor->res->btn_face_color); 321 if (rc != EOK) 322 return rc; 323 324 rc = gfx_fill_rect(wdecor->res->gc, rect); 325 if (rc != EOK) 326 return rc; 327 328 center.x = (rect->p0.x + rect->p1.x) / 2; 329 center.y = (rect->p0.y + rect->p1.y) / 2; 330 mrect.p0.x = center.x - 7; 331 mrect.p0.y = center.y - 1; 332 mrect.p1.x = center.x + 7; 333 mrect.p1.y = center.y + 1 + 1; 334 335 /* XXX Not really a bevel, just a frame */ 336 rc = ui_paint_bevel(wdecor->res->gc, &mrect, 337 wdecor->res->btn_text_color, wdecor->res->btn_text_color, 1, 338 &inside); 339 if (rc != EOK) 340 return rc; 341 342 rc = gfx_set_color(wdecor->res->gc, wdecor->res->btn_highlight_color); 343 if (rc != EOK) 344 return rc; 345 346 rc = gfx_fill_rect(wdecor->res->gc, &inside); 347 if (rc != EOK) 348 return rc; 349 350 return EOK; 351 } 352 353 /** Paint system menu handle in text mode. 354 * 355 * @param wdecor Window decoration 356 * @param rect System menu handle rectangle 357 * @return EOK on success or an error code 358 */ 359 errno_t ui_wdecor_sysmenu_hdl_paint_text(ui_wdecor_t *wdecor, gfx_rect_t *rect) 360 { 361 errno_t rc; 362 gfx_text_fmt_t fmt; 363 364 gfx_text_fmt_init(&fmt); 365 fmt.font = wdecor->res->font; 366 fmt.color = wdecor->res->tbar_act_text_color; 367 fmt.halign = gfx_halign_left; 368 fmt.valign = gfx_valign_top; 369 370 rc = gfx_puttext(&rect->p0, &fmt, "[\u2261]"); 371 if (rc != EOK) 372 return rc; 373 374 return EOK; 375 } 376 377 /** Paint system menu handle. 378 * 379 * @param wdecor Window decoration 380 * @param rect System menu handle rectangle 381 * @return EOK on success or an error code 382 */ 383 errno_t ui_wdecor_sysmenu_hdl_paint(ui_wdecor_t *wdecor, gfx_rect_t *rect) 384 { 385 errno_t rc; 386 387 if (wdecor->res->textmode) 388 rc = ui_wdecor_sysmenu_hdl_paint_text(wdecor, rect); 389 else 390 rc = ui_wdecor_sysmenu_hdl_paint_gfx(wdecor, rect); 391 392 return rc; 393 } 394 395 /** Set system menu handle active flag. 396 * 397 * @param wdecor Window decoration 398 * @param active @c true iff handle should be active 399 */ 400 void ui_wdecor_sysmenu_hdl_set_active(ui_wdecor_t *wdecor, bool active) 401 { 402 ui_wdecor_geom_t geom; 403 404 wdecor->sysmenu_hdl_active = active; 405 406 ui_wdecor_get_geom(wdecor, &geom); 407 (void) ui_wdecor_sysmenu_hdl_paint(wdecor, &geom.sysmenu_hdl_rect); 408 } 409 298 410 /** Paint window decoration. 299 411 * … … 395 507 return rc; 396 508 509 if ((wdecor->style & ui_wds_sysmenu_hdl) != 0) { 510 rc = ui_wdecor_sysmenu_hdl_paint(wdecor, 511 &geom.sysmenu_hdl_rect); 512 if (rc != EOK) 513 return rc; 514 } 515 397 516 if (wdecor->btn_min != NULL) { 398 517 rc = ui_pbutton_paint(wdecor->btn_min); … … 520 639 gfx_coord_t btn_y; 521 640 gfx_coord_t cap_hmargin; 641 gfx_coord_t cap_x; 642 gfx_coord_t hdl_x_off; 643 gfx_coord_t hdl_y_off; 644 gfx_coord_t hdl_w; 645 gfx_coord_t hdl_h; 522 646 523 647 /* Does window have a frame? */ … … 568 692 } 569 693 694 /* Does window have a sysmenu handle? */ 695 if ((wdecor->style & ui_wds_sysmenu_hdl) != 0) { 696 if (wdecor->res->textmode) { 697 hdl_x_off = 2; 698 hdl_y_off = 0; 699 hdl_w = wdecor_sysmenu_hdl_w_text; 700 hdl_h = wdecor_sysmenu_hdl_h_text; 701 } else { 702 hdl_x_off = 1; 703 hdl_y_off = 1; 704 hdl_w = wdecor_sysmenu_hdl_w; 705 hdl_h = wdecor_sysmenu_hdl_h; 706 } 707 708 geom->sysmenu_hdl_rect.p0.x = geom->title_bar_rect.p0.x + 709 hdl_x_off; 710 geom->sysmenu_hdl_rect.p0.y = geom->title_bar_rect.p0.y + 711 hdl_y_off; 712 geom->sysmenu_hdl_rect.p1.x = geom->sysmenu_hdl_rect.p0.x + 713 hdl_w; 714 geom->sysmenu_hdl_rect.p1.y = geom->sysmenu_hdl_rect.p0.y + 715 hdl_h; 716 cap_x = hdl_w; 717 } else { 718 geom->sysmenu_hdl_rect.p0.x = 0; 719 geom->sysmenu_hdl_rect.p0.y = 0; 720 geom->sysmenu_hdl_rect.p1.x = 0; 721 geom->sysmenu_hdl_rect.p1.y = 0; 722 cap_x = 0; 723 } 724 570 725 /* Does window have a close button? */ 571 726 if ((wdecor->style & ui_wds_close_btn) != 0) { … … 640 795 } 641 796 642 if (wdecor->res->textmode == false) 643 cap_hmargin = wdecor_cap_hmargin; 644 else 645 cap_hmargin = wdecor_cap_hmargin_text; 646 647 geom->caption_rect.p0.x = geom->title_bar_rect.p0.x + 648 cap_hmargin; 649 geom->caption_rect.p0.y = geom->title_bar_rect.p0.y; 650 geom->caption_rect.p1.x = btn_x - cap_hmargin; 651 geom->caption_rect.p1.y = geom->title_bar_rect.p1.y; 797 if ((wdecor->style & ui_wds_titlebar) != 0) { 798 if (wdecor->res->textmode == false) 799 cap_hmargin = wdecor_cap_hmargin; 800 else 801 cap_hmargin = wdecor_cap_hmargin_text; 802 803 geom->caption_rect.p0.x = geom->title_bar_rect.p0.x + 804 cap_hmargin + cap_x; 805 geom->caption_rect.p0.y = geom->title_bar_rect.p0.y; 806 geom->caption_rect.p1.x = btn_x - cap_hmargin; 807 geom->caption_rect.p1.y = geom->title_bar_rect.p1.y; 808 } else { 809 geom->caption_rect.p0.x = 0; 810 geom->caption_rect.p0.y = 0; 811 geom->caption_rect.p1.x = 0; 812 geom->caption_rect.p1.y = 0; 813 } 652 814 } 653 815 … … 828 990 if (event->type == KEY_PRESS && (event->mods & (KM_CTRL | KM_ALT | 829 991 KM_SHIFT)) == 0) { 830 if (event->key == KC_F9) 992 if (event->key == KC_F9) { 993 ui_wdecor_sysmenu_hdl_set_active(wdecor, true); 831 994 ui_wdecor_sysmenu(wdecor, event->kbd_id); 995 } 832 996 } 833 997 … … 881 1045 882 1046 ui_wdecor_get_geom(wdecor, &geom); 1047 1048 if ((wdecor->style & ui_wds_sysmenu_hdl) != 0) { 1049 if (event->type == POS_PRESS && 1050 gfx_pix_inside_rect(&pos, &geom.sysmenu_hdl_rect)) { 1051 ui_wdecor_sysmenu_hdl_set_active(wdecor, true); 1052 ui_wdecor_sysmenu(wdecor, event->pos_id); 1053 return ui_claimed; 1054 } 1055 } 883 1056 884 1057 if (wdecor->btn_min != NULL) { -
uspace/lib/ui/src/window.c
r153dd3b red1a948 1517 1517 static void wnd_sysmenu_close_req(ui_menu_t *sysmenu, void *arg) 1518 1518 { 1519 (void)arg; 1520 1519 ui_window_t *window = (ui_window_t *)arg; 1520 1521 ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false); 1521 1522 ui_menu_close(sysmenu); 1522 1523 } -
uspace/lib/ui/test/wdecor.c
r153dd3b red1a948 119 119 } test_cb_resp_t; 120 120 121 /** Create and destroy button */121 /** Create and destroy window decoration */ 122 122 PCUT_TEST(create_destroy) 123 123 { … … 217 217 } 218 218 219 /** Paint button*/220 PCUT_TEST( paint)219 /** Setting system menu handle as active/inactive */ 220 PCUT_TEST(sysmenu_hdl_set_active) 221 221 { 222 222 errno_t rc; … … 234 234 PCUT_ASSERT_NOT_NULL(resource); 235 235 236 rc = ui_wdecor_create(resource, "Hello", ui_wds_none, &wdecor); 236 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor); 237 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 238 239 PCUT_ASSERT_FALSE(wdecor->sysmenu_hdl_active); 240 ui_wdecor_sysmenu_hdl_set_active(wdecor, true); 241 PCUT_ASSERT_TRUE(wdecor->sysmenu_hdl_active); 242 ui_wdecor_sysmenu_hdl_set_active(wdecor, false); 243 PCUT_ASSERT_FALSE(wdecor->sysmenu_hdl_active); 244 245 ui_wdecor_destroy(wdecor); 246 ui_resource_destroy(resource); 247 248 rc = gfx_context_delete(gc); 249 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 250 } 251 252 /** Paint system menu handle */ 253 PCUT_TEST(sysmenu_hdl_paint) 254 { 255 errno_t rc; 256 gfx_context_t *gc = NULL; 257 test_gc_t tgc; 258 ui_resource_t *resource = NULL; 259 ui_wdecor_t *wdecor; 260 ui_wdecor_geom_t geom; 261 262 memset(&tgc, 0, sizeof(tgc)); 263 rc = gfx_context_new(&ops, &tgc, &gc); 264 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 265 266 rc = ui_resource_create(gc, false, &resource); 267 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 268 PCUT_ASSERT_NOT_NULL(resource); 269 270 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor); 271 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 272 273 ui_wdecor_get_geom(wdecor, &geom); 274 rc = ui_wdecor_sysmenu_hdl_paint(wdecor, &geom.sysmenu_hdl_rect); 275 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 276 277 ui_wdecor_destroy(wdecor); 278 ui_resource_destroy(resource); 279 280 rc = gfx_context_delete(gc); 281 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 282 } 283 284 /** Paint window decoration */ 285 PCUT_TEST(paint) 286 { 287 errno_t rc; 288 gfx_context_t *gc = NULL; 289 test_gc_t tgc; 290 ui_resource_t *resource = NULL; 291 ui_wdecor_t *wdecor; 292 293 memset(&tgc, 0, sizeof(tgc)); 294 rc = gfx_context_new(&ops, &tgc, &gc); 295 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 296 297 rc = ui_resource_create(gc, false, &resource); 298 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 299 PCUT_ASSERT_NOT_NULL(resource); 300 301 rc = ui_wdecor_create(resource, "Hello", ui_wds_decorated, &wdecor); 237 302 PCUT_ASSERT_ERRNO_VAL(EOK, rc); 238 303 … … 676 741 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.y); 677 742 743 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.x); 744 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.y); 745 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.x); 746 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.y); 747 748 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.x); 749 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.y); 750 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.x); 751 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.y); 752 753 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.x); 754 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.y); 755 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.x); 756 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.y); 757 758 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x); 759 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y); 760 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x); 761 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y); 762 678 763 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x); 679 764 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y); … … 733 818 PCUT_ASSERT_INT_EQUALS(0, geom.title_bar_rect.p1.y); 734 819 820 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.x); 821 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.y); 822 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.x); 823 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.y); 824 825 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.x); 826 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p0.y); 827 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.x); 828 PCUT_ASSERT_INT_EQUALS(0, geom.caption_rect.p1.y); 829 830 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.x); 831 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.y); 832 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.x); 833 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.y); 834 835 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x); 836 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y); 837 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x); 838 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y); 839 735 840 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x); 736 841 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y); … … 791 896 PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y); 792 897 898 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.x); 899 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p0.y); 900 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.x); 901 PCUT_ASSERT_INT_EQUALS(0, geom.sysmenu_hdl_rect.p1.y); 902 903 PCUT_ASSERT_INT_EQUALS(18, geom.caption_rect.p0.x); 904 PCUT_ASSERT_INT_EQUALS(24, geom.caption_rect.p0.y); 905 PCUT_ASSERT_INT_EQUALS(91, geom.caption_rect.p1.x); 906 PCUT_ASSERT_INT_EQUALS(46, geom.caption_rect.p1.y); 907 908 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.x); 909 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p0.y); 910 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.x); 911 PCUT_ASSERT_INT_EQUALS(0, geom.btn_min_rect.p1.y); 912 913 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x); 914 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y); 915 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x); 916 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y); 917 793 918 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.x); 794 919 PCUT_ASSERT_INT_EQUALS(0, geom.btn_close_rect.p0.y); … … 847 972 PCUT_ASSERT_INT_EQUALS(96, geom.title_bar_rect.p1.x); 848 973 PCUT_ASSERT_INT_EQUALS(46, geom.title_bar_rect.p1.y); 974 975 PCUT_ASSERT_INT_EQUALS(15, geom.sysmenu_hdl_rect.p0.x); 976 PCUT_ASSERT_INT_EQUALS(25, geom.sysmenu_hdl_rect.p0.y); 977 PCUT_ASSERT_INT_EQUALS(35, geom.sysmenu_hdl_rect.p1.x); 978 PCUT_ASSERT_INT_EQUALS(45, geom.sysmenu_hdl_rect.p1.y); 979 980 PCUT_ASSERT_INT_EQUALS(38, geom.caption_rect.p0.x); 981 PCUT_ASSERT_INT_EQUALS(24, geom.caption_rect.p0.y); 982 PCUT_ASSERT_INT_EQUALS(51, geom.caption_rect.p1.x); 983 PCUT_ASSERT_INT_EQUALS(46, geom.caption_rect.p1.y); 984 985 PCUT_ASSERT_INT_EQUALS(55, geom.btn_min_rect.p0.x); 986 PCUT_ASSERT_INT_EQUALS(25, geom.btn_min_rect.p0.y); 987 PCUT_ASSERT_INT_EQUALS(75, geom.btn_min_rect.p1.x); 988 PCUT_ASSERT_INT_EQUALS(45, geom.btn_min_rect.p1.y); 989 990 /* Maximize button is not in ui_wds_decorated */ 991 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.x); 992 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p0.y); 993 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.x); 994 PCUT_ASSERT_INT_EQUALS(0, geom.btn_max_rect.p1.y); 849 995 850 996 PCUT_ASSERT_INT_EQUALS(75, geom.btn_close_rect.p0.x);
Note:
See TracChangeset
for help on using the changeset viewer.