Changes in uspace/srv/hid/compositor/compositor.c [071fefec:fbb2d0d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/compositor/compositor.c
r071fefec rfbb2d0d 58 58 59 59 #include <event.h> 60 #include < graph_iface.h>60 #include <device/graph_dev.h> 61 61 #include <io/keycode.h> 62 62 #include <io/mode.h> … … 72 72 #include <codec/tga.h> 73 73 74 #include "images.h" 74 75 #include "compositor.h" 75 76 … … 161 162 static void input_disconnect(void); 162 163 164 163 165 static pointer_t *input_pointer(input_t *input) 164 166 { … … 166 168 } 167 169 168 static pointer_t *pointer_create( void)170 static pointer_t *pointer_create() 169 171 { 170 172 pointer_t *p = (pointer_t *) malloc(sizeof(pointer_t)); 171 if (!p) 173 if (!p) { 172 174 return NULL; 173 175 } 176 174 177 link_initialize(&p->link); 175 178 p->pos.x = coord_origin; … … 183 186 p->state = 0; 184 187 cursor_init(&p->cursor, CURSOR_DECODER_EMBEDDED, NULL); 185 188 186 189 /* Ghost window for transformation animation. */ 187 190 transform_identity(&p->ghost.transform); … … 196 199 p->accum_ghost.x = 0; 197 200 p->accum_ghost.y = 0; 198 201 199 202 return p; 200 203 } … … 208 211 } 209 212 210 static window_t *window_create( void)213 static window_t *window_create(sysarg_t x_offset, sysarg_t y_offset) 211 214 { 212 215 window_t *win = (window_t *) malloc(sizeof(window_t)); 213 if (!win) 216 if (!win) { 214 217 return NULL; 215 218 } 219 216 220 link_initialize(&win->link); 217 221 atomic_set(&win->ref_cnt, 0); 218 222 prodcons_initialize(&win->queue); 219 223 transform_identity(&win->transform); 220 transform_translate(&win->transform, coord_origin, coord_origin); 221 win->dx = coord_origin; 222 win->dy = coord_origin; 224 transform_translate(&win->transform, 225 coord_origin + x_offset, coord_origin + y_offset); 226 win->dx = coord_origin + x_offset; 227 win->dy = coord_origin + y_offset; 223 228 win->fx = 1; 224 229 win->fy = 1; … … 226 231 win->opacity = 255; 227 232 win->surface = NULL; 228 233 229 234 return win; 230 235 } … … 289 294 sysarg_t *x_out, sysarg_t *y_out, sysarg_t *w_out, sysarg_t *h_out) 290 295 { 291 if ( (w_in > 0) && (h_in > 0)) {296 if (w_in > 0 && h_in > 0) { 292 297 sysarg_t x[4]; 293 298 sysarg_t y[4]; 294 295 299 comp_coord_from_client(x_in, y_in, win_trans, &x[0], &y[0]); 296 300 comp_coord_from_client(x_in + w_in - 1, y_in, win_trans, &x[1], &y[1]); 297 301 comp_coord_from_client(x_in + w_in - 1, y_in + h_in - 1, win_trans, &x[2], &y[2]); 298 302 comp_coord_from_client(x_in, y_in + h_in - 1, win_trans, &x[3], &y[3]); 299 300 303 (*x_out) = x[0]; 301 304 (*y_out) = y[0]; 302 305 (*w_out) = x[0]; 303 306 (*h_out) = y[0]; 304 305 for (unsigned int i = 1; i < 4; ++i) { 307 for (int i = 1; i < 4; ++i) { 306 308 (*x_out) = (x[i] < (*x_out)) ? x[i] : (*x_out); 307 309 (*y_out) = (y[i] < (*y_out)) ? y[i] : (*y_out); … … 309 311 (*h_out) = (y[i] > (*h_out)) ? y[i] : (*h_out); 310 312 } 311 312 313 (*w_out) = (*w_out) - (*x_out) + 1; 313 314 (*h_out) = (*h_out) - (*y_out) + 1; … … 320 321 } 321 322 322 static void comp_ update_viewport_bound_rect(void)323 static void comp_restrict_pointers(void) 323 324 { 324 325 fibril_mutex_lock(&viewport_list_mtx); 325 326 326 327 sysarg_t x_res = coord_origin; 327 328 sysarg_t y_res = coord_origin; 328 329 sysarg_t w_res = 0; 329 330 sysarg_t h_res = 0; 330 331 331 332 if (!list_empty(&viewport_list)) { 332 333 viewport_t *vp = (viewport_t *) list_first(&viewport_list); … … 335 336 surface_get_resolution(vp->surface, &w_res, &h_res); 336 337 } 337 338 338 339 list_foreach(viewport_list, link, viewport_t, vp) { 339 340 sysarg_t w_vp, h_vp; 340 341 surface_get_resolution(vp->surface, &w_vp, &h_vp); 341 rectangle_union(x_res, y_res, w_res, h_res, 342 rectangle_union( 343 x_res, y_res, w_res, h_res, 342 344 vp->pos.x, vp->pos.y, w_vp, h_vp, 343 345 &x_res, &y_res, &w_res, &h_res); 344 346 } 345 347 346 348 viewport_bound_rect.x = x_res; 347 349 viewport_bound_rect.y = y_res; 348 350 viewport_bound_rect.w = w_res; 349 351 viewport_bound_rect.h = h_res; 350 352 351 353 fibril_mutex_unlock(&viewport_list_mtx); 352 } 353 354 static void comp_restrict_pointers(void) 355 { 356 comp_update_viewport_bound_rect(); 357 354 358 355 fibril_mutex_lock(&pointer_list_mtx); 359 356 360 357 list_foreach(pointer_list, link, pointer_t, ptr) { 361 358 ptr->pos.x = ptr->pos.x > viewport_bound_rect.x ? ptr->pos.x : viewport_bound_rect.x; … … 366 363 ptr->pos.y : viewport_bound_rect.y + viewport_bound_rect.h; 367 364 } 368 365 369 366 fibril_mutex_unlock(&pointer_list_mtx); 370 367 } … … 645 642 } 646 643 647 static void comp_recalc_transform(window_t *win)648 {649 transform_t translate;650 transform_identity(&translate);651 transform_translate(&translate, win->dx, win->dy);652 653 transform_t scale;654 transform_identity(&scale);655 if ((win->fx != 1) || (win->fy != 1))656 transform_scale(&scale, win->fx, win->fy);657 658 transform_t rotate;659 transform_identity(&rotate);660 if (win->angle != 0)661 transform_rotate(&rotate, win->angle);662 663 transform_t transform;664 transform_t temp;665 transform_identity(&transform);666 temp = transform;667 transform_product(&transform, &temp, &translate);668 temp = transform;669 transform_product(&transform, &temp, &rotate);670 temp = transform;671 transform_product(&transform, &temp, &scale);672 673 win->transform = transform;674 }675 676 644 static void comp_window_resize(window_t *win, ipc_callid_t iid, ipc_call_t *icall) 677 645 { 646 int rc; 647 678 648 ipc_callid_t callid; 679 649 size_t size; 680 650 unsigned int flags; 681 651 682 652 /* Start sharing resized window with client. */ 683 653 if (!async_share_out_receive(&callid, &size, &flags)) { … … 685 655 return; 686 656 } 687 688 657 void *new_cell_storage; 689 intrc = async_share_out_finalize(callid, &new_cell_storage);658 rc = async_share_out_finalize(callid, &new_cell_storage); 690 659 if ((rc != EOK) || (new_cell_storage == AS_MAP_FAILED)) { 691 660 async_answer_0(iid, ENOMEM); 692 661 return; 693 662 } 694 663 695 664 /* Create new surface for the resized window. */ 696 surface_t *new_surface = surface_create(IPC_GET_ARG3(*icall), 697 IPC_GET_ARG4(*icall), new_cell_storage, SURFACE_FLAG_SHARED); 665 surface_t *new_surface = surface_create( 666 IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall), 667 new_cell_storage, SURFACE_FLAG_SHARED); 698 668 if (!new_surface) { 699 669 as_area_destroy(new_cell_storage); … … 701 671 return; 702 672 } 703 704 sysarg_t offset_x = IPC_GET_ARG1(*icall); 705 sysarg_t offset_y = IPC_GET_ARG2(*icall); 706 window_placement_flags_t placement_flags = 707 (window_placement_flags_t) IPC_GET_ARG5(*icall); 708 709 comp_update_viewport_bound_rect(); 710 673 711 674 /* Switch new surface with old surface and calculate damage. */ 712 675 fibril_mutex_lock(&window_list_mtx); 713 676 714 677 sysarg_t old_width = 0; 715 678 sysarg_t old_height = 0; 716 717 679 if (win->surface) { 718 680 surface_get_resolution(win->surface, &old_width, &old_height); 719 681 surface_destroy(win->surface); 720 682 } 721 683 722 684 win->surface = new_surface; 723 685 724 686 sysarg_t new_width = 0; 725 687 sysarg_t new_height = 0; 726 688 surface_get_resolution(win->surface, &new_width, &new_height); 727 728 if (placement_flags & WINDOW_PLACEMENT_CENTER_X) 729 win->dx = viewport_bound_rect.x + viewport_bound_rect.w / 2 - 730 new_width / 2; 731 732 if (placement_flags & WINDOW_PLACEMENT_CENTER_Y) 733 win->dy = viewport_bound_rect.y + viewport_bound_rect.h / 2 - 734 new_height / 2; 735 736 if (placement_flags & WINDOW_PLACEMENT_LEFT) 737 win->dx = viewport_bound_rect.x; 738 739 if (placement_flags & WINDOW_PLACEMENT_TOP) 740 win->dy = viewport_bound_rect.y; 741 742 if (placement_flags & WINDOW_PLACEMENT_RIGHT) 743 win->dx = viewport_bound_rect.x + viewport_bound_rect.w - 744 new_width; 745 746 if (placement_flags & WINDOW_PLACEMENT_BOTTOM) 747 win->dy = viewport_bound_rect.y + viewport_bound_rect.h - 748 new_height; 749 750 if (placement_flags & WINDOW_PLACEMENT_ABSOLUTE_X) 751 win->dx = coord_origin + offset_x; 752 753 if (placement_flags & WINDOW_PLACEMENT_ABSOLUTE_Y) 754 win->dy = coord_origin + offset_y; 755 756 /* Transform the window and calculate damage. */ 757 sysarg_t x1; 758 sysarg_t y1; 759 sysarg_t width1; 760 sysarg_t height1; 761 762 comp_coord_bounding_rect(0, 0, old_width, old_height, win->transform, 763 &x1, &y1, &width1, &height1); 764 765 comp_recalc_transform(win); 766 767 sysarg_t x2; 768 sysarg_t y2; 769 sysarg_t width2; 770 sysarg_t height2; 771 772 comp_coord_bounding_rect(0, 0, new_width, new_height, win->transform, 773 &x2, &y2, &width2, &height2); 774 775 sysarg_t x; 776 sysarg_t y; 777 sysarg_t width; 778 sysarg_t height; 779 780 rectangle_union(x1, y1, width1, height1, x2, y2, width2, height2, 781 &x, &y, &width, &height); 782 689 690 sysarg_t x, y; 691 sysarg_t width = old_width > new_width ? old_width : new_width; 692 sysarg_t height = old_height > new_height ? old_height : new_height; 693 comp_coord_bounding_rect(0, 0, width, height, win->transform, &x, &y, &width, &height); 694 783 695 fibril_mutex_unlock(&window_list_mtx); 784 696 785 697 comp_damage(x, y, width, height); 786 698 787 699 async_answer_0(iid, EOK); 788 700 } … … 791 703 { 792 704 fibril_mutex_lock(&window_list_mtx); 793 705 794 706 list_foreach(window_list, link, window_t, window) { 795 707 if (window == target) { … … 799 711 } 800 712 } 801 713 802 714 fibril_mutex_unlock(&window_list_mtx); 803 715 free(event); … … 807 719 { 808 720 fibril_mutex_lock(&window_list_mtx); 809 810 721 window_t *win = (window_t *) list_first(&window_list); 811 if (win) 722 if (win) { 812 723 prodcons_produce(&win->queue, &event->link); 813 else724 } else { 814 725 free(event); 815 726 } 816 727 fibril_mutex_unlock(&window_list_mtx); 817 728 } … … 890 801 fibril_mutex_lock(&window_list_mtx); 891 802 892 window_t *win = window_create( );803 window_t *win = window_create(IPC_GET_ARG1(call), IPC_GET_ARG2(call)); 893 804 if (!win) { 894 805 async_answer_2(callid, ENOMEM, 0, 0); … … 1262 1173 } 1263 1174 1175 static void comp_recalc_transform(window_t *win) 1176 { 1177 transform_t translate; 1178 transform_identity(&translate); 1179 transform_translate(&translate, win->dx, win->dy); 1180 1181 transform_t scale; 1182 transform_identity(&scale); 1183 if (win->fx != 1 || win->fy != 1) { 1184 transform_scale(&scale, win->fx, win->fy); 1185 } 1186 1187 transform_t rotate; 1188 transform_identity(&rotate); 1189 if (win->angle != 0) { 1190 transform_rotate(&rotate, win->angle); 1191 } 1192 1193 transform_t transform; 1194 transform_t temp; 1195 transform_identity(&transform); 1196 temp = transform; 1197 transform_multiply(&transform, &temp, &translate); 1198 temp = transform; 1199 transform_multiply(&transform, &temp, &rotate); 1200 temp = transform; 1201 transform_multiply(&transform, &temp, &scale); 1202 1203 1204 win->transform = transform; 1205 } 1206 1264 1207 static void comp_window_animate(pointer_t *pointer, window_t *win, 1265 1208 sysarg_t *dmg_x, sysarg_t *dmg_y, sysarg_t *dmg_width, sysarg_t *dmg_height) … … 1283 1226 double cx = 0; 1284 1227 double cy = 0; 1285 1286 if (pointer->grab_flags & GF_MOVE_X) 1228 if (pointer->grab_flags & GF_MOVE_X) { 1287 1229 cx = 1; 1288 1289 if (pointer->grab_flags & GF_MOVE_Y) 1230 } 1231 if (pointer->grab_flags & GF_MOVE_Y) { 1290 1232 cy = 1; 1291 1292 if (((scale) || (resize)) && (win->angle != 0)) { 1233 } 1234 1235 if ((scale || resize) && (win->angle != 0)) { 1293 1236 transform_t rotate; 1294 1237 transform_identity(&rotate); 1295 1296 1238 transform_rotate(&rotate, win->angle); 1297 1239 transform_apply_linear(&rotate, &cx, &cy); 1298 1240 } 1299 1241 1300 cx = (cx < 0) ? (-1 * cx) : cx; 1242 cx = (cx < 0) ? (-1 * cx) : cx; 1301 1243 cy = (cy < 0) ? (-1 * cy) : cy; 1302 1244 1303 1245 win->dx += (cx * dx); 1304 1246 win->dy += (cy * dy); 1305 1247 } 1306 1248 1307 if ( (scale) || (resize)) {1249 if (scale || resize) { 1308 1250 double _dx = dx; 1309 1251 double _dy = dy; … … 1321 1263 if (fx > 0) { 1322 1264 #if ANIMATE_WINDOW_TRANSFORMS == 0 1323 if (scale) 1324 win->fx *= fx; 1265 if (scale) win->fx *= fx; 1325 1266 #endif 1326 1267 #if ANIMATE_WINDOW_TRANSFORMS == 1 … … 1503 1444 { 1504 1445 pointer_t *pointer = input_pointer(input); 1505 1506 comp_update_viewport_bound_rect(); 1507 1446 1508 1447 /* Update pointer position. */ 1509 1448 fibril_mutex_lock(&pointer_list_mtx); 1510 1511 1449 desktop_point_t old_pos = pointer->pos; 1512 1513 1450 sysarg_t cursor_width; 1514 1451 sysarg_t cursor_height; 1515 surface_get_resolution(pointer->cursor.states[pointer->state], 1452 surface_get_resolution(pointer->cursor.states[pointer->state], 1516 1453 &cursor_width, &cursor_height); 1517 1518 if (pointer->pos.x + dx < viewport_bound_rect.x) 1454 if (pointer->pos.x + dx < viewport_bound_rect.x) { 1519 1455 dx = -1 * (pointer->pos.x - viewport_bound_rect.x); 1520 1521 if (pointer->pos.y + dy < viewport_bound_rect.y) 1456 } 1457 if (pointer->pos.y + dy < viewport_bound_rect.y) { 1522 1458 dy = -1 * (pointer->pos.y - viewport_bound_rect.y); 1523 1524 if (pointer->pos.x + dx > viewport_bound_rect.x + viewport_bound_rect.w) 1459 } 1460 if (pointer->pos.x + dx > viewport_bound_rect.x + viewport_bound_rect.w) { 1525 1461 dx = (viewport_bound_rect.x + viewport_bound_rect.w - pointer->pos.x); 1526 1527 if (pointer->pos.y + dy > viewport_bound_rect.y + viewport_bound_rect.h) 1462 } 1463 if (pointer->pos.y + dy > viewport_bound_rect.y + viewport_bound_rect.h) { 1528 1464 dy = (viewport_bound_rect.y + viewport_bound_rect.h - pointer->pos.y); 1529 1465 } 1530 1466 pointer->pos.x += dx; 1531 1467 pointer->pos.y += dy; … … 1533 1469 comp_damage(old_pos.x, old_pos.y, cursor_width, cursor_height); 1534 1470 comp_damage(old_pos.x + dx, old_pos.y + dy, cursor_width, cursor_height); 1535 1471 1536 1472 fibril_mutex_lock(&window_list_mtx); 1537 1473 fibril_mutex_lock(&pointer_list_mtx); … … 1694 1630 1695 1631 #if ANIMATE_WINDOW_TRANSFORMS == 0 1696 sysarg_t pre_x = 0; 1632 sysarg_t pre_x = 0; 1697 1633 sysarg_t pre_y = 0; 1698 1634 sysarg_t pre_width = 0; … … 1726 1662 link_initialize(&event_top->link); 1727 1663 event_top->type = ET_WINDOW_RESIZE; 1728 1729 event_top->data.resize.offset_x = 0; 1730 event_top->data.resize.offset_y = 0; 1731 1664 1732 1665 int dx = (int) (((double) width) * (scale_back_x - 1.0)); 1733 1666 int dy = (int) (((double) height) * (scale_back_y - 1.0)); 1734 1735 if (pointer->grab_flags & GF_RESIZE_X) 1736 event_top->data.resize.width = 1737 ((((int) width) + dx) >= 0) ? (width + dx) : 0; 1738 else 1739 event_top->data.resize.width = width; 1740 1741 if (pointer->grab_flags & GF_RESIZE_Y) 1742 event_top->data.resize.height = 1743 ((((int) height) + dy) >= 0) ? (height + dy) : 0; 1744 else 1745 event_top->data.resize.height = height; 1746 1747 event_top->data.resize.placement_flags = 1748 WINDOW_PLACEMENT_ANY; 1667 1668 if (pointer->grab_flags & GF_RESIZE_X) { 1669 event_top->data.rsz.width = 1670 ((((int) width) + dx) >= 0) ? (width + dx) : 0; 1671 } else { 1672 event_top->data.rsz.width = width; 1673 } 1674 1675 if (pointer->grab_flags & GF_RESIZE_Y) { 1676 event_top->data.rsz.height = 1677 ((((int) height) + dy) >= 0) ? (height + dy) : 0; 1678 } else { 1679 event_top->data.rsz.height = height; 1680 } 1749 1681 } 1750 1682 … … 1814 1746 key == KC_O || key == KC_P); 1815 1747 bool kconsole_switch = (mods & KM_ALT) && (key == KC_M); 1748 bool compositor_test = (mods & KM_ALT) && (key == KC_H); 1816 1749 1817 1750 bool filter = (type == KEY_RELEASE) && (win_transform || win_resize || 1818 1751 win_opacity || win_close || win_switch || viewport_move || 1819 viewport_change || kconsole_switch );1752 viewport_change || kconsole_switch || compositor_test); 1820 1753 1821 1754 if (filter) { … … 1839 1772 break; 1840 1773 case KC_Q: 1841 win->angle += 0.1;1774 win->angle += (PI / 2); 1842 1775 break; 1843 1776 case KC_E: 1844 win->angle -= 0.1;1777 win->angle += -(PI / 2); 1845 1778 break; 1846 1779 case KC_R: … … 1883 1816 return ENOMEM; 1884 1817 } 1885 1818 1886 1819 sysarg_t width, height; 1887 1820 surface_get_resolution(win->surface, &width, &height); 1888 1821 1889 1822 link_initialize(&event->link); 1890 1823 event->type = ET_WINDOW_RESIZE; 1891 1892 event->data.resize.offset_x = 0; 1893 event->data.resize.offset_y = 0; 1894 1824 1895 1825 switch (key) { 1896 1826 case KC_T: 1897 event->data.r esize.width = width;1898 event->data.r esize.height = (height >= 20) ? height - 20 : 0;1827 event->data.rsz.width = width; 1828 event->data.rsz.height = (height >= 20) ? height - 20 : 0; 1899 1829 break; 1900 1830 case KC_G: 1901 event->data.r esize.width = width;1902 event->data.r esize.height = height + 20;1831 event->data.rsz.width = width; 1832 event->data.rsz.height = height + 20; 1903 1833 break; 1904 1834 case KC_B: 1905 event->data.r esize.width = (width >= 20) ? width - 20 : 0;;1906 event->data.r esize.height = height;1835 event->data.rsz.width = (width >= 20) ? width - 20 : 0;; 1836 event->data.rsz.height = height; 1907 1837 break; 1908 1838 case KC_N: 1909 event->data.r esize.width = width + 20;1910 event->data.r esize.height = height;1839 event->data.rsz.width = width + 20; 1840 event->data.rsz.height = height; 1911 1841 break; 1912 1842 default: 1913 event->data.resize.width = 0; 1914 event->data.resize.height = 0; 1915 break; 1916 } 1917 1918 event->data.resize.placement_flags = WINDOW_PLACEMENT_ANY; 1919 1843 event->data.rsz.width = 0; 1844 event->data.rsz.height = 0; 1845 break; 1846 } 1847 1920 1848 fibril_mutex_unlock(&window_list_mtx); 1921 1849 comp_post_event_top(event); … … 2086 2014 } else if (kconsole_switch) { 2087 2015 __SYSCALL0(SYS_DEBUG_ACTIVATE_CONSOLE); 2016 } else if (compositor_test) { 2017 fibril_mutex_lock(&window_list_mtx); 2018 2019 window_t *red_win = window_create(0, 0); 2020 red_win->surface = surface_create(250, 150, NULL, 0); 2021 pixel_t red_pix = PIXEL(255, 240, 0, 0); 2022 for (sysarg_t y = 0; y < 150; ++y) { 2023 for (sysarg_t x = 0; x < 250; ++x) { 2024 surface_put_pixel(red_win->surface, x, y, red_pix); 2025 } 2026 } 2027 list_prepend(&red_win->link, &window_list); 2028 2029 window_t *blue_win = window_create(0, 0); 2030 blue_win->surface = surface_create(200, 100, NULL, 0); 2031 pixel_t blue_pix = PIXEL(255, 0, 0, 240); 2032 for (sysarg_t y = 0; y < 100; ++y) { 2033 for (sysarg_t x = 0; x < 200; ++x) { 2034 surface_put_pixel(blue_win->surface, x, y, blue_pix); 2035 } 2036 } 2037 list_prepend(&blue_win->link, &window_list); 2038 2039 window_t *nameic_win = window_create(0, 0); 2040 nameic_win->surface = decode_tga((void *) nameic_tga, nameic_tga_size, 0); 2041 list_prepend(&nameic_win->link, &window_list); 2042 2043 fibril_mutex_unlock(&window_list_mtx); 2044 comp_damage(0, 0, UINT32_MAX, UINT32_MAX); 2088 2045 } else { 2089 2046 window_event_t *event = (window_event_t *) malloc(sizeof(window_event_t));
Note:
See TracChangeset
for help on using the changeset viewer.