From 5a31b4e7b805280bbbf4d0b165d442f637ed2bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 22 Nov 2024 16:11:33 +0100 Subject: [PATCH] tests/cursor: Add test for transform cursor surfaces Part-of: --- src/tests/cursor-tests.c | 115 +++++++++++++++++- ...ckends_native_cursor_transform_0_0.ref.png | Bin 0 -> 9166 bytes ...ckends_native_cursor_transform_0_1.ref.png | Bin 0 -> 9166 bytes ...ckends_native_cursor_transform_0_2.ref.png | Bin 0 -> 8915 bytes ...ckends_native_cursor_transform_1_0.ref.png | Bin 0 -> 9166 bytes ...ckends_native_cursor_transform_1_1.ref.png | Bin 0 -> 9166 bytes ...ckends_native_cursor_transform_1_2.ref.png | Bin 0 -> 8915 bytes ...ckends_native_cursor_transform_2_0.ref.png | Bin 0 -> 10112 bytes ...ckends_native_cursor_transform_2_1.ref.png | Bin 0 -> 10130 bytes ...ckends_native_cursor_transform_2_2.ref.png | Bin 0 -> 9281 bytes ...ckends_native_cursor_transform_3_0.ref.png | Bin 0 -> 10117 bytes ...ckends_native_cursor_transform_3_1.ref.png | Bin 0 -> 10120 bytes ...ckends_native_cursor_transform_3_2.ref.png | Bin 0 -> 9272 bytes ...ckends_native_cursor_transform_4_0.ref.png | Bin 0 -> 7198 bytes ...ckends_native_cursor_transform_4_1.ref.png | Bin 0 -> 7195 bytes ...ckends_native_cursor_transform_4_2.ref.png | Bin 0 -> 6640 bytes ...ckends_native_cursor_transform_5_0.ref.png | Bin 0 -> 7891 bytes ...ckends_native_cursor_transform_5_1.ref.png | Bin 0 -> 8221 bytes ...ckends_native_cursor_transform_5_2.ref.png | Bin 0 -> 7320 bytes .../cursor-tests-client.c | 84 ++++++++++--- src/tests/wayland-test-clients/meson.build | 2 + 21 files changed, 178 insertions(+), 23 deletions(-) create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_0_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_0_1.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_0_2.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_1_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_1_1.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_1_2.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_2_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_2_1.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_2_2.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_3_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_3_1.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_3_2.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_4_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_4_1.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_4_2.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_5_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_5_1.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_transform_5_2.ref.png diff --git a/src/tests/cursor-tests.c b/src/tests/cursor-tests.c index 7a8be1ced..83341c736 100644 --- a/src/tests/cursor-tests.c +++ b/src/tests/cursor-tests.c @@ -330,14 +330,16 @@ meta_wait_for_window_cursor (void) } static void -test_client_cursor (ClutterStageView *view, - const char *scale_method, - MetaCursor cursor, - const char *ref_test_name, - int ref_test_seq, - MetaReftestFlag ref_test_flags) +test_client_cursor (ClutterStageView *view, + const char *scale_method, + MetaCursor cursor, + MtkMonitorTransform transform, + const char *ref_test_name, + int ref_test_seq, + MetaReftestFlag ref_test_flags) { const char *cursor_name; + const char *transform_name; MetaWaylandTestClient *test_client; MetaWindow *window; MetaWindowActor *window_actor; @@ -345,11 +347,13 @@ test_client_cursor (ClutterStageView *view, g_debug ("Testing cursor with client using %s", scale_method); cursor_name = meta_cursor_get_name (cursor); + transform_name = mtk_monitor_transform_to_string (transform); test_client = meta_wayland_test_client_new_with_args (test_context, "cursor-tests-client", scale_method, cursor_name, + transform_name, NULL); meta_wayland_test_driver_wait_for_sync_point (test_driver, 0); @@ -460,11 +464,13 @@ meta_test_native_cursor_scaling (void) test_client_cursor (view, CURSOR_SCALE_METHOD_BUFFER_SCALE, cursor, + MTK_MONITOR_TRANSFORM_NORMAL, ref_test_name, 1, meta_ref_test_determine_ref_test_flag ()); test_client_cursor (view, CURSOR_SCALE_METHOD_VIEWPORT, cursor, + MTK_MONITOR_TRANSFORM_NORMAL, ref_test_name, 0, META_REFTEST_FLAG_NONE); } @@ -540,6 +546,7 @@ meta_test_native_cursor_cropping (void) test_client_cursor (view, CURSOR_SCALE_METHOD_VIEWPORT_CROPPED, META_CURSOR_MOVE_OR_RESIZE_WINDOW, + MTK_MONITOR_TRANSFORM_NORMAL, ref_test_name, 0, meta_ref_test_determine_ref_test_flag ()); } @@ -547,6 +554,100 @@ meta_test_native_cursor_cropping (void) clutter_actor_destroy (overlay_actor); } +static void +meta_test_native_cursor_transform (void) +{ + MetaBackend *backend = meta_context_get_backend (test_context); + MetaDisplay *display = meta_context_get_display (test_context); + ClutterSeat *seat = meta_backend_get_default_seat (backend); + g_autoptr (ClutterVirtualInputDevice) virtual_pointer = NULL; + ClutterActor *overlay_actor; + ClutterStageView *view; + struct { + int width; + int height; + float scale; + MetaLogicalMonitorLayoutMode layout_mode; + MtkMonitorTransform transform; + } test_cases[] = { + { + .width = 1920, .height = 1080, .scale = 1.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + .transform = MTK_MONITOR_TRANSFORM_90, + }, + { + .width = 1920, .height = 1080, .scale = 1.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL, + .transform = MTK_MONITOR_TRANSFORM_90, + }, + { + .width = 1920, .height = 1080, .scale = 2.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + .transform = MTK_MONITOR_TRANSFORM_90, + }, + { + .width = 1920, .height = 1080, .scale = 2.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL, + .transform = MTK_MONITOR_TRANSFORM_90, + }, + { + .width = 1440, .height = 900, .scale = 1.5, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + }, + { + .width = 1440, .height = 900, .scale = 2.25, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + .transform = MTK_MONITOR_TRANSFORM_270, + }, + }; + int i; + + meta_display_set_cursor (display, META_CURSOR_DEFAULT); + virtual_pointer = clutter_seat_create_virtual_device (seat, + CLUTTER_POINTER_DEVICE); + overlay_actor = create_overlay_actor (); + + for (i = 0; i < G_N_ELEMENTS (test_cases); i++) + { + g_autofree char *ref_test_name = NULL; + + g_debug ("Testing monitor resolution %dx%d with scale %f and " + "%s layout mode", + test_cases[i].width, test_cases[i].height, test_cases[i].scale, + layout_mode_to_string (test_cases[i].layout_mode)); + + wait_for_no_windows (); + + ref_test_name = g_strdup_printf ("%s/%d", g_test_get_path (), i); + + view = setup_test_case (test_cases[i].width, test_cases[i].height, + test_cases[i].scale, + test_cases[i].layout_mode, + virtual_pointer); + + test_client_cursor (view, + CURSOR_SCALE_METHOD_BUFFER_SCALE, + META_CURSOR_DEFAULT, + test_cases[i].transform, + ref_test_name, 0, + meta_ref_test_determine_ref_test_flag ()); + test_client_cursor (view, + CURSOR_SCALE_METHOD_VIEWPORT, + META_CURSOR_DEFAULT, + test_cases[i].transform, + ref_test_name, 1, + meta_ref_test_determine_ref_test_flag ()); + test_client_cursor (view, + CURSOR_SCALE_METHOD_VIEWPORT_CROPPED, + META_CURSOR_MOVE_OR_RESIZE_WINDOW, + test_cases[i].transform, + ref_test_name, 2, + meta_ref_test_determine_ref_test_flag ()); + } + + clutter_actor_destroy (overlay_actor); +} + static void init_tests (void) { @@ -554,6 +655,8 @@ init_tests (void) meta_test_native_cursor_scaling); g_test_add_func ("/backends/native/cursor/cropping", meta_test_native_cursor_cropping); + g_test_add_func ("/backends/native/cursor/transform", + meta_test_native_cursor_transform); } static void diff --git a/src/tests/ref-tests/backends_native_cursor_transform_0_0.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_0_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..77b3bca87b829a592513ef86913bbfc8d948b5e5 GIT binary patch literal 9166 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}0*a(>3=;uTY)RhkE)4%caKYZ?lNlHk z7(87ZLn`LHxw|_n^e$7|!!xOTDk?|fHw5dv;knny3 zE;?5_jyVhQXn)pEd7mVIXX4xJ3pW0?Vl_`6q#9f|=zGk=z)-+(*kFe}GsA(0zI|0d zdx4-{jZq3jH?%PDf@lY)1~w3_pyI#4jJB+RSz)wQIodn`6^Wz0iP7c(C>@OU zB1fACpmflAbFmzd+JEZ@fBXNF20VuirYr`DgMh`Hhwb-j85j<{&#SMm&(3~*cDA{= zUd)Wyv#tN|^YigtyMEo=-28MY1H%XRkG#N9iN5J4Q#S3{V>8o7&aP(1-o3R?PfdMT zzq97&r{(_hzkU1m?*9JzE1ww|9+WEq$2JP~_^3@jdi1Dq`nfgh*4fql`SI@V?(p?- zf6x8&p01ahlXC_L&Y%B(XeQ7Cb8mRief;uvcW&JHkl|& zv9R#tkxt?LHJS_zf9|FAg9carC_T35d%R=+{{5Rbe|~tl{rdX&|6i}iKR-9O`pb)p z^?%Z*)UP~$*g)oJ76ZeNUQXcfij4T>mtRg#*N={l&cDAeHZn3YI(m2c`+Go-&$p@k z^uGOSI#B8VpDgSQ49Ab2J9qB$^Yi!jR&U?7ZQIVBl^-7+eSLksedVVViMH(P>uf7N zJeaQz)}grvIHvPp$BnypYkz)v`s>%PR&MdQJr#z=#+x^6D0qCV_xASu^XJaZv#tJi z+wiL-14EsdKFGgr`>sAol<=EpQ~CPZT42!J-C3M&H8(FWug-db9dH!M{|PH_5a{^P zM~@!OG)@O;|MK#3qQtiC+uIW(qN0BN`uh6MpFO{T15fsIful8}EgQpwCLl==Sc+r9nu`*-cywPC}DzrSpF-kk@=8*>cE zAMci3etGcV!4#vJK5F;tf9n8a{{VksBO61*VIiRWgLa?M(J)|w9c`fj+Tm}l_W45T>l7~f@dxVtpyluM*xFjw4pHCPyi+a`ZN>-Igfo) U);bycA7~?kr>mdKI;Vst0Lh^BFaQ7m literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_0_1.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_0_1.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..77b3bca87b829a592513ef86913bbfc8d948b5e5 GIT binary patch literal 9166 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}0*a(>3=;uTY)RhkE)4%caKYZ?lNlHk z7(87ZLn`LHxw|_n^e$7|!!xOTDk?|fHw5dv;knny3 zE;?5_jyVhQXn)pEd7mVIXX4xJ3pW0?Vl_`6q#9f|=zGk=z)-+(*kFe}GsA(0zI|0d zdx4-{jZq3jH?%PDf@lY)1~w3_pyI#4jJB+RSz)wQIodn`6^Wz0iP7c(C>@OU zB1fACpmflAbFmzd+JEZ@fBXNF20VuirYr`DgMh`Hhwb-j85j<{&#SMm&(3~*cDA{= zUd)Wyv#tN|^YigtyMEo=-28MY1H%XRkG#N9iN5J4Q#S3{V>8o7&aP(1-o3R?PfdMT zzq97&r{(_hzkU1m?*9JzE1ww|9+WEq$2JP~_^3@jdi1Dq`nfgh*4fql`SI@V?(p?- zf6x8&p01ahlXC_L&Y%B(XeQ7Cb8mRief;uvcW&JHkl|& zv9R#tkxt?LHJS_zf9|FAg9carC_T35d%R=+{{5Rbe|~tl{rdX&|6i}iKR-9O`pb)p z^?%Z*)UP~$*g)oJ76ZeNUQXcfij4T>mtRg#*N={l&cDAeHZn3YI(m2c`+Go-&$p@k z^uGOSI#B8VpDgSQ49Ab2J9qB$^Yi!jR&U?7ZQIVBl^-7+eSLksedVVViMH(P>uf7N zJeaQz)}grvIHvPp$BnypYkz)v`s>%PR&MdQJr#z=#+x^6D0qCV_xASu^XJaZv#tJi z+wiL-14EsdKFGgr`>sAol<=EpQ~CPZT42!J-C3M&H8(FWug-db9dH!M{|PH_5a{^P zM~@!OG)@O;|MK#3qQtiC+uIW(qN0BN`uh6MpFO{T15fsIful8}EgQpwCLl==Sc+r9nu`*-cywPC}DzrSpF-kk@=8*>cE zAMci3etGcV!4#vJK5F;tf9n8a{{VksBO61*VIiRWgLa?M(J)|w9c`fj+Tm}l_W45T>l7~f@dxVtpyluM*xFjw4pHCPyi+a`ZN>-Igfo) U);bycA7~?kr>mdKI;Vst0Lh^BFaQ7m literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_0_2.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_0_2.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..2458c57609e8c7dba66f9098a72ab7a0281aa924 GIT binary patch literal 8915 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}0*a(>3=;uTY)RhkE)4%caKYZ?lNlHk z7(87ZLn`LHxohb6Btpa?aJNH8!xXkgk81u6(OJ5_P5~2~nf9_yi1K*Ar(?*GW#Us1 z`sIw}#J65?8L@kR$t};6Vqj?SmpFd$w=n}l&Ap_{%s^`x7(U!raR9R>2rOU(33zZ^ z08tDoEE!;0h{*&@b20)A02=imyggeE7%=-*ynXw2^5n_Q&CR=a z?=F;Co_XumEvdGLKYv!vT4w2%U**QY@Z(YraNOZQ)$!xUmoH!5ee}_9`*}V)BSS;^GhwrN z^X5IfJ$?H0yLay(V8o%l5!Xpwv01KTwGD{92oA`=^{6y>fPOSsMw0_Dvowt667claXz4IoXacjtXsI|_Dh|O? tan04hGYkw&HK4Tsqb;D(I&A=2yso-Yt&R&$t_8QoJzf1=);T3K0RX)PRsjG2 literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_1_0.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_1_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..77b3bca87b829a592513ef86913bbfc8d948b5e5 GIT binary patch literal 9166 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}0*a(>3=;uTY)RhkE)4%caKYZ?lNlHk z7(87ZLn`LHxw|_n^e$7|!!xOTDk?|fHw5dv;knny3 zE;?5_jyVhQXn)pEd7mVIXX4xJ3pW0?Vl_`6q#9f|=zGk=z)-+(*kFe}GsA(0zI|0d zdx4-{jZq3jH?%PDf@lY)1~w3_pyI#4jJB+RSz)wQIodn`6^Wz0iP7c(C>@OU zB1fACpmflAbFmzd+JEZ@fBXNF20VuirYr`DgMh`Hhwb-j85j<{&#SMm&(3~*cDA{= zUd)Wyv#tN|^YigtyMEo=-28MY1H%XRkG#N9iN5J4Q#S3{V>8o7&aP(1-o3R?PfdMT zzq97&r{(_hzkU1m?*9JzE1ww|9+WEq$2JP~_^3@jdi1Dq`nfgh*4fql`SI@V?(p?- zf6x8&p01ahlXC_L&Y%B(XeQ7Cb8mRief;uvcW&JHkl|& zv9R#tkxt?LHJS_zf9|FAg9carC_T35d%R=+{{5Rbe|~tl{rdX&|6i}iKR-9O`pb)p z^?%Z*)UP~$*g)oJ76ZeNUQXcfij4T>mtRg#*N={l&cDAeHZn3YI(m2c`+Go-&$p@k z^uGOSI#B8VpDgSQ49Ab2J9qB$^Yi!jR&U?7ZQIVBl^-7+eSLksedVVViMH(P>uf7N zJeaQz)}grvIHvPp$BnypYkz)v`s>%PR&MdQJr#z=#+x^6D0qCV_xASu^XJaZv#tJi z+wiL-14EsdKFGgr`>sAol<=EpQ~CPZT42!J-C3M&H8(FWug-db9dH!M{|PH_5a{^P zM~@!OG)@O;|MK#3qQtiC+uIW(qN0BN`uh6MpFO{T15fsIful8}EgQpwCLl==Sc+r9nu`*-cywPC}DzrSpF-kk@=8*>cE zAMci3etGcV!4#vJK5F;tf9n8a{{VksBO61*VIiRWgLa?M(J)|w9c`fj+Tm}l_W45T>l7~f@dxVtpyluM*xFjw4pHCPyi+a`ZN>-Igfo) U);bycA7~?kr>mdKI;Vst0Lh^BFaQ7m literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_1_1.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_1_1.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..77b3bca87b829a592513ef86913bbfc8d948b5e5 GIT binary patch literal 9166 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}0*a(>3=;uTY)RhkE)4%caKYZ?lNlHk z7(87ZLn`LHxw|_n^e$7|!!xOTDk?|fHw5dv;knny3 zE;?5_jyVhQXn)pEd7mVIXX4xJ3pW0?Vl_`6q#9f|=zGk=z)-+(*kFe}GsA(0zI|0d zdx4-{jZq3jH?%PDf@lY)1~w3_pyI#4jJB+RSz)wQIodn`6^Wz0iP7c(C>@OU zB1fACpmflAbFmzd+JEZ@fBXNF20VuirYr`DgMh`Hhwb-j85j<{&#SMm&(3~*cDA{= zUd)Wyv#tN|^YigtyMEo=-28MY1H%XRkG#N9iN5J4Q#S3{V>8o7&aP(1-o3R?PfdMT zzq97&r{(_hzkU1m?*9JzE1ww|9+WEq$2JP~_^3@jdi1Dq`nfgh*4fql`SI@V?(p?- zf6x8&p01ahlXC_L&Y%B(XeQ7Cb8mRief;uvcW&JHkl|& zv9R#tkxt?LHJS_zf9|FAg9carC_T35d%R=+{{5Rbe|~tl{rdX&|6i}iKR-9O`pb)p z^?%Z*)UP~$*g)oJ76ZeNUQXcfij4T>mtRg#*N={l&cDAeHZn3YI(m2c`+Go-&$p@k z^uGOSI#B8VpDgSQ49Ab2J9qB$^Yi!jR&U?7ZQIVBl^-7+eSLksedVVViMH(P>uf7N zJeaQz)}grvIHvPp$BnypYkz)v`s>%PR&MdQJr#z=#+x^6D0qCV_xASu^XJaZv#tJi z+wiL-14EsdKFGgr`>sAol<=EpQ~CPZT42!J-C3M&H8(FWug-db9dH!M{|PH_5a{^P zM~@!OG)@O;|MK#3qQtiC+uIW(qN0BN`uh6MpFO{T15fsIful8}EgQpwCLl==Sc+r9nu`*-cywPC}DzrSpF-kk@=8*>cE zAMci3etGcV!4#vJK5F;tf9n8a{{VksBO61*VIiRWgLa?M(J)|w9c`fj+Tm}l_W45T>l7~f@dxVtpyluM*xFjw4pHCPyi+a`ZN>-Igfo) U);bycA7~?kr>mdKI;Vst0Lh^BFaQ7m literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_1_2.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_1_2.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..2458c57609e8c7dba66f9098a72ab7a0281aa924 GIT binary patch literal 8915 zcmeAS@N?(olHy`uVBq!ia0y~yU~gbxV6os}0*a(>3=;uTY)RhkE)4%caKYZ?lNlHk z7(87ZLn`LHxohb6Btpa?aJNH8!xXkgk81u6(OJ5_P5~2~nf9_yi1K*Ar(?*GW#Us1 z`sIw}#J65?8L@kR$t};6Vqj?SmpFd$w=n}l&Ap_{%s^`x7(U!raR9R>2rOU(33zZ^ z08tDoEE!;0h{*&@b20)A02=imyggeE7%=-*ynXw2^5n_Q&CR=a z?=F;Co_XumEvdGLKYv!vT4w2%U**QY@Z(YraNOZQ)$!xUmoH!5ee}_9`*}V)BSS;^GhwrN z^X5IfJ$?H0yLay(V8o%l5!Xpwv01KTwGD{92oA`=^{6y>fPOSsMw0_Dvowt667claXz4IoXacjtXsI|_Dh|O? tan04hGYkw&HK4Tsqb;D(I&A=2yso-Yt&R&$t_8QoJzf1=);T3K0RX)PRsjG2 literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_2_0.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_2_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a4021ea1d94d585bd55f03b554e14698d1ebd7 GIT binary patch literal 10112 zcmeHNYfw{X8vYO#sDjWbg%(-Ru0nUAP!~dM2saB-st}PzgaE-CXu%{bkN^U~Dzc?g zW|kdmZ9}-ItU;0mR4!=<7J*6#sUifIgzJ_FAwe!77;@R~;Lh&;-u=;;?s@a$oH;q~ zm-q5K&-cwc`TTHngzZ-6tpEVq$dAH~0AN)NfWM^`~zpT9;Yx|H^3oPMdukj@`_U^}2NVY=4^SOIbpX`? zR0mKUKy?7s0aOQ29YA#e)d5roer6r0#m!s6c}2hxX->AG*{e=z4!ZWbhnR!+E7v-* za3PB^wPs+l+TsiVse~kHP7-&&9V8M-f?pY!o<6a9tMbt)9E;AEcjMRWVMMIGbN~jbn!WgP zwM-`a{0)zU#t|oSK~qyxj6=`8bm?GKAZdJ0+Tgb@=NouswQp7Q@%eo5g-ZZ*8DIMm z@jcowJeNJIP!Ou{dAilPWS;g}8r#ybzR0f96sp-#&5s? z_h{U1F|QqRADX+%Rl;OHy?42LYJPq`7f*3sy|5N)3f4SZO9NotiBneuJ2c8O-I2gD z<6RfkYW2cG29;`OdGSHYVd8L$BT@G^7Q9@M1Wzb* z8+Rn)G#>28UkO{_D9ty;C$Qo`-4v~@r6o%_(kK>-Nv)LkyuE{#fB20^BnppNP^*j9 zr%D&UTN#9XUK6exwL#mUKW*nLf4nQfz4BH7{AJio2&UNjXjU+@2v+RfvhwnB?F7># z(2j4+)w8$XUB2K>wf?v7mYo%RL=vK>ERLwwjHSqu~}<;pTX^A`Q#?AbY;M#&_x z-SVH;w2tR1HBz!rQFZ?MgCFC#iS4;d(`@fp#E-V=_b2AohlD`QQCRAae4G)1uKBTeYb3^l{(Rpla6;~;8;C9J#>EH*N1v%GGlAC^pLR)h~QEJ z!bHov35`WUvO{?5SYYP#!!v$5*lb8w;lyG#PEKJQKVHM(EZapTQtl2k$}A0cXbsBt0Cv9-KOq$E$xOcL9^e5UeP-Izu@2nQ#IOz zw7Y93QyH`1c?AH+EpXq5XRZ=RGH5BgpwdG-W)06+(9o~ZvY>E4X@IH&qK5yiD#}N$ z_`pN>Z;}53p!$kb65UtOedT{36iOnLMCh6I7kgHJ{bM`U#jv69JqXGp!=uBv`%^yq E2l*c>K>z>% literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_2_1.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_2_1.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..a8df6adf289c42c08a0c56a8f2bea278e29f7da8 GIT binary patch literal 10130 zcmeHNX;hO}8op>*jw6eOLu#NwYeza2!BckG#Ii`)tDwjd7C8_ZR%J~>D0GGb6Vr3B zIv5BDQ<#HeGFW3^VnR98NdX~h(6A*zQWPWvfyNe>SV0tV#M#_MVX z;1CE43OrZVtdIzE>^B?)s;0?Fhp@(pcu{<8%qP_sjV-G`s(#X8s4~O-)QC}in?sY< zf8#lD2P4E4)wN5*0~<^OV-DCQQp2!65K2nWJXDBBH74Uwz7#@j~jIgQ*C zEshr_i;Lr65S}1{e-}TFUQ9~Tt&OKUEsi0q`OX`)t0lg)Ih0ivAGN zarf?BS*3P)_`73tI$h}d_OVV!TJMyr%06p?d2NDyET@jZ%4XUw_j|(3#F!hIEHS;Q z$-C&6GjVZvlIqda)Wukvo6gB6%hxWI)0@2t=kBohpVp_lVV4z(2>h8|Sw9W{i-Sg3 zP&N3c?(RH}kB<*=ec`EGKvQe=LVxXV$z*+hA~B zIMcb7{&1&2lMnNi6FD?GJya&j^{K))`=Q~a*HdOSQlJk;oz zKX02$u3Q^(EG;eNa5zL>N|%VRLey580-)=++C_iLM6$FoWkQyb)#fHO(f*oCxw*@> zcI)^3Ia#e*J%4*Y0G!iRCSW$^a#rDE7($_olhf6cE%Wp9Y&M(Dc%*v0{gB6#yvQ1a z;LOICG2p`m**hmRgJr&qh@+9Bb8uLm7kDM5q~NF_xiwOe_k!We)(jhsV<|bkLYgru65zH?9DDeLYg7 zP(x&A@oeE8IF~YL1vWDij8+{d}aMp&>X{p-_;vUe>NW zd^`4i_{}_$ipL<^LLgJ4--8sjxc@ZU4M&?+K7WYSl*#!4Ic(A#n zUFla#iEyMujCg+CkR8H!MIA5)KYmrB-`4CIUq`J3l=AObZ5vx{A=jFy(;^>gq& zids?{ur*sVIy%}<>2VslnNmR@5EdU{@H#CeKTr7s%mRpWzy2Bk`|RaksQ60FJfyU% zt1Ij+Db@z#lHyC*(SsdvkqpoE5v7 ziHS00-|PBzuTtgAbbh~{CioU(Yb!02Q$1y*w_lm!wm8Pmv!ISL{@ML;T($E^QCix| zwfPalg;s}(h1(oy#nOft-~XCHoEmt7aZd6gZYuE3XIqWHY}ES*3+;D~TLo;4pA8QW zcj?y^ai)*gr$ad)Exw}XzYvQJ@3-wXGuW+{LILVLi<3*al7Z9{O%Wa*9#JhPiaTs(t$fYZVUnp&ZjwEJ!9M z)54?%lTvouX=LQ4i)Z8&gI>+~yxr5&vvx2oSsWJ!HT)MQb7ytX@;obryv!C)@k!h_ zSBO2Kh%W_(6hJp?E9Od?nwl~M*VuA*=cL}%i3}R7tNWAsB{2)nEy;Dm!Y4EuO;ndF zjuzSxo7mpv*w#XZBG7*X-MOGGF3$af{q^k&8x^6~>?b7>y^_09!IP$*SSaE0Qu6ci zn9QX$%iJVpceiNq{;@v`0r)Ha9qtc~2*<`=6#GF_!BVF_g;q#>)+btwaLl-#nGhG3 zaHBXGx=e}j#z6o!8xXbyiWjfm>ReQ7msjUK+&BmS=C|R?E2=Q7IPn2gILD#;-?9^& z@@S`{@xV*3b8&}hA#otTOA2ZcbI|T8$7(CweTVbSjD_rv&=xD!vlClu2XF7*|GpV_ z*a(`|UBazS!r$epv9U3wGB4oI z(c1_PC@d%)APrEJpziQryP`Tv0l$5i`XK)WK$(NiE66;8&Zp=y1JVFpUZKlM#17D9 d<$qjO1{;U9d{_9Jy+H_8VZl*B%+smW{{V;LHi`fM literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_2_2.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_2_2.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..05c0fc0c242cff6da09973fe6334ffd8d5f79ec4 GIT binary patch literal 9281 zcmeHNZBtW66ka65iv}v{01YV6Y2kylq#6R1mmmd!0>O41WuOpf!Jv&0iw0;ylF?#I z5$MQ=mP#5rOrkl5E>zXgcu|tyeAMycjHX|LThLDemHk_@9y0_ z=honsZA%18 zU*dN+Ll|!^j1NT*>`;R*<+n6?`j;2>eq+$g4YZwHG4tTNT(c-77kTC$7XUt^M9e$F zDgdUe)c{ri5E&(OK-SkU(jM6__tx1V8|U;88SpA0*Jk(aqS&mn9SK?Cr?@+I9fl3s z3wX<5xi&y5>o{cpmizB$} z3uIz&{v^*h)tfw;+%RnB$>K)joJ7K!JraPYxD%Lnd0I)qzvH|E}FV8-RDUlUu2g$_4w$fjD@D{ycSah*et z#105)H7`TGh26u`3Ob-3qf|J#!cO;D)U;L2wm88jf|ug2(`a)ksp;wAzc@Mqp}KNE z>_N87CS9|-b$x`8^-nRWvk6e=;T^mBVc4NShvR_(p@A~qj-|NsTux5TVo!yp_NhoD zsxN~2kSWO-j$=#`?hLt_$#5K@^mgnv9LgA)dgww%ZCM0+V627lm0HjaC$^J~bRh33 z^NO}@d_k}JS*23JRvLSt+#`_RX?vpbJPOS8z0yTVQ*(2(L?UTwf}!x4xbijhfiYk| zRG2bT7!0+#?xpjKEEtx|K%^>N*InLBzs9%jY_q6a%NhlQQB44Y@Qk(s(v4Ee!$$4)W*s3Dpm>kJjAif3j2*MygmBU(fKgD*DPj3OSrgg9lv5 z;;%N~(8Uqb4e!{$MOl^u^3CXscl!}^a}&K1 z7EJt@_z@0XT;j)*NAdgjG;dSa!BBTJ1<%?1@GnYA-O&B(gy)L<9y^IlQ$-B2m?&s|5x&M X5`-tv>7_9owA%&UI`#^Vx@ literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_3_0.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_3_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..f87f9bce65bc7ee59f2b5747824f08acb27b1065 GIT binary patch literal 10117 zcmeHN`BPI_7QTp0)B)7dk{)1!RM|pL)4~WPX%w&{oEo~T}A?y)C680TpjA2O#nfq}5g8pTyX5LBFyDu+yJKy=v zcTzXGcOf{yVwd$U0D#5WGkzBVz+?ch9k*i}d_t`GdOvK;zBwP@2aL$8Tu_w{z(H`< z@8qSFM~iY%Y=qXXRh_i#y&BMasBxe%bpNIMbK`+^psVx(K%+gOJb;*x=txwY1 zD`VisqU_ph>(k9ZhGD^0YXSEIK!VrK?yVcY9cYUHf#QJj0ObLi2dEC9I)Lf`sspGF zpgMr+0ICD14xl=K>cD?d2QCHBP2qV(SaIb&7NH=TOa}lb-hKms?|LJXgE6z-=iC6W z{SjDzSBo*ll`+L~xm+OfwYvEv=}JNAgE0ym9JLMhajguJ@OV5*gp}f48tiMqb?T^f z;>qLj&|*H490uBG)$VIkgaII#?Y$T-)lN@O-*B_eYt1{Zo4vQs!E&azqocz;e#FJx z8i19y^u61F%lUTY=l8!kT9mdvRXCx>(dBdGt5R)eiF=>bHjpvlmth8?R(^~gQmxKR zPX|B3^~{llYvVaut@g1aiy&ewk2Jq0{CQ<@h%MATcf8MKaX6e+?3t8)5f-|6XUnxY zvWFm (Yrw&hoaFtO%lO!~^u4L92RHV1ZiGcuYd`nkxJ$bxUiUT1Mx4*6%IOGkH1wNYCI*RT=Fj zkw}bm+49>B8sFA3HWSHeyp3YZ@9F3{I@$rr?!`6<0j{RAmCdW;Rti z>;_l7)u;LPXi?x{IKzZG#S0sT*S>4n?XxzT8GYqgkVf5VM-Zm1Ya~9(8J+&6WNEyH zuoHmRTnmI(QO@3~#l^tG`PJ3cG7gCp7dIlLrzR$&OPSt9#ZN-+1yyKsHk}CI4G4W(~X8zMXIXR zF5RoU9aGG=KLNe?%UgJLF@@aGEU-oKa8WKLmQJVRY>#VxafN~P4^3N@C#!_|WsF^# z3pUTV@ut>^K%1+0`0$|>Ax$k&VadyNkX!&WZvR&Re#xM|7fXDM8+{=@ot>TD#tk?{ zIFGvYeyYQc{-LLa7Pcur8Lwh8XwlJAQ-y?O zEzLjlZ>OJ-gzM7~4Q%e|^c~&vt`Onku23aR>kSel1x+xP&;%u*rly9^Pn+wlXtXBq zQxYi@?QlaZ%)Og`u$rZ=CrT z3Z`;x+>0xljhlLzeGjD0(V|QEfjM#`hXeZw;p1zZc)`kW>@9*&uM00&K^y?5699}H zO`sSV8F}`ns$sQt7(0@_p>8cKEX;Y_lr+<|B;zb_p;I|IIr8{qkJ3SkykJ(aue%EY zZtNr6rNKm;?E(KD)oREiTuoh_W{IO*(Hq7R-Y#f$hRxTnPvP-Xq~WHKIWkus&%3QN z2Ov8HNlLT&-+#|wz~oq8U+1!9e~7^2Q+uH_G=AP3Q(WuhSsHw$0FSpY%cOpy{T<9? zCZa%bvs7MCpE-QEE6Ju?_Gk`L$3r<l zd^yVH^5x4nFv(95{|{{iP;B>Ht@NLyu8AQEZTSu|omWv{KM|@`+LU5!FKo>aHUG|| zG@e9)`L(5=sRD)K@3XvTlIR#CbO#e<3U`*+=hnGQ8cwuLFWYC3Am`Z$2amz4t?$y2 zWN2(p;}_T6kwtNPTp{OhcZNse#u0LS356=-`gs~W8h82WMc;pl7vPteBglUNAd^siMe7Qr0a{nkx`NgfG!1@zUHPA`CEGu(JaOU$4)+=K O5}fr9_G6ujy8Uk-@By&^ literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_3_1.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_3_1.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..799e765f50664041773efb514237ea4fbf4e96f4 GIT binary patch literal 10120 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 JLAWR3{J&*wY?uH5 literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_4_2.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_4_2.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1b05060aff219a8574781bf427a8ffe547a8ac GIT binary patch literal 6640 zcmeHK?N5_e6h8$K=L8a+0**l3WZg2dlEG}_7~K$~gsm9CHIs={Vi{=>OQB`9q|9w4 z#!*a6tf2-Pi1>j7lrE)fOM$_FDAGv-T_TpkGpysSbS?IUw$E<258MB+``qL?xi{zB z{O&z(zkBTz>qOk{gS!DBuHa<;X@D3tK=gOJqR`53G|Kl#?7UETA|J@eP!Ha_36OlZ zApet+hCA!?4|wM;rVYD$vFu|!b|RHM!hCDR z{_7Z1-FfP4=8dt#6N`V!_ck#u}^{;e735EUEE&uC04@ zUrLrrrQ-2;R4TP590PXezKHJab9u>fjzl6sXBhW>fZhcY0&Sg0q*W(Vn(n4w1`uZT zB$bwyYC4okCH?b0B|^kA3NF6}c2d}Qm5?o+*@05ypRfEKU1tv^knU zFj$r!H5!eMLTO4r9Kj)yN{#*f@9!B6ZF~EQgr8cnKeM)afR#o{upR%>E*2HfZGh==lAQ#i0{u~;}sHW?Y3 zotG6X86hpLmRr=@+skE_aJ|KHj;`#W ze6g!FS1)u-FFlWeTMr+0#sb_LD`JK`bEP$nWXS6@ZEvi-*)?$KnLfA66>%r&dik`5 zDS639&hq&ho)kwzVV*tW`Q=B-2%y+B>E>hlg3)V}kkwD08N?mAjRE_}w*)~X(#nE{ ztSBgaw0}Q3&Jj9Y7TU6=$%3xY1g24^^Q~#jWrJ7hE6jmFz-F^iJEXOBb)KbPuD7(b z{2enYf#}cyu&33Ak`>1jq97xSU4p#Xl=DqA5|b!O@C4rhjsu(vxE|n|i2DL=hnNyz fTJ*oChQ=Yd=-zp};W literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_5_0.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_5_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..c98086ce204634976f15de4e19e9cde8089f3b1b GIT binary patch literal 7891 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 X<=WVtbSwdy1kSsn&y{}T|MPzVfgS*n literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_transform_5_2.ref.png b/src/tests/ref-tests/backends_native_cursor_transform_5_2.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb0d05008db5248625cc2d0bf1dddb5a031a2f2 GIT binary patch literal 7320 zcmeI0iBnTo6o)UH*j9+uDJW&Ji!dDuvBUx;K&+*r1xamd#Uh)6(P0U)2of|PI?;(~ zst#a;5Ctn^p3z<$|3u%-Oy1sD+xbu>>Aj+`FP^a_s92NyIjKX zcPhPj`A*5k8*yQFCu|v2GM_`@OUHJIlROp1?xNM=_~mti@WT!*f%wTn<4IK_J6$_4 zPQiHI?C}JJ^pm@`rH(iC?6e0Nha9ka#5yn>Awv#JwvO<72NC^&YJhTp#saz@pnD>k z7tnNwmIP>7^gk&Lhv)lPxCY+Z%bbzefYzUs6;u!D6adn!?ZHFe#>U26>3Kb$sh09BDc*Y6?~G-hT^V_zzP=YXms=~ z4#z@2UEGz>CO(mvm>6i3MqEdnLKNj4u>&%Gvb{afU~Yv*X9v4;@VV)2SUL8ZP_FFL zN@x99k&*&!|6-nTwwxSiT(Ji4GTdCjlY9r7pu4+!W@bhyVZf^-9O>lA`i`Yucv5_7 zw>#6KXf3>!Fz1}6%f7}QvSQ>2nI44fx##0e zPzd>xBAXQby-3d3Cn1KVXISjuxK$zJgoZ|mw*qGG!Ky_}=9$-B9g@1i=D(fZ0SU3M z+UD!EoCm+1Em&JtHt@}BP^5ClR}c{4k8XqV$L&8rQ4@9)lX(QS8#LH5(S5PK~+uP3S?vrGEFB0l*~6Zx3vXr+qAD* zoDp~o0x9bo8X6j`Arb@9H_-&EtE=Ku**zm~fz&;(ksygGL-I5-XjEHkYimYBu-r}AE0 z^{UK&`GC%k1_?G>;380;B>8P;3Tta?`A`)Wj$}SQp5%A*=+V!zX8Y89OQ<`uMvlYb zm?64RoG3VJ=w+n@0HN6)KCHGe3-1cW5!i za1lfwFoQE!hK_gyWzXFthMtoZ+4~OoK^h_vX_AwZXFBx~JdCyFB9|2AkU=*=hEj3; zRS=;DIK#M5S-d~IT5N)`Ds;<*Q6ZpVsJbx{4(A&M6&8GI3%3oyv}Rd3i0xed^X?b4 z;SG?;-rn9txo~8kPBo!N(5AjPwL9OqC{!pELir+*V9JK5^dvnxzpi`jL^0w-4vY!p zZg_clp;2TuYDH9k)n5<3t%+g>S?YxDlvMqzsqz4_8E#E_wUpq(XeLX2GXS89WLU{} z81V4IVEOmQG68TN(qv*G+Yq?_Nm@et5M;U0eiYRJ)c}1(jg|!e cl>}-k*#D94preoU9Fimtd>Iv1zc=CHKRc9Y`~Uy| literal 0 HcmV?d00001 diff --git a/src/tests/wayland-test-clients/cursor-tests-client.c b/src/tests/wayland-test-clients/cursor-tests-client.c index 6a79b8c49..c5d743ed1 100644 --- a/src/tests/wayland-test-clients/cursor-tests-client.c +++ b/src/tests/wayland-test-clients/cursor-tests-client.c @@ -20,6 +20,7 @@ #include +#include "mtk/mtk.h" #include "wayland-test-client-utils.h" typedef enum _CursorScaleMethod @@ -31,6 +32,33 @@ typedef enum _CursorScaleMethod static CursorScaleMethod scale_method; static char *cursor_name; +static MtkMonitorTransform cursor_transform; + +static enum wl_output_transform +wl_output_transform_from_monitor_transform (MtkMonitorTransform transform) +{ + switch (transform) + { + case MTK_MONITOR_TRANSFORM_NORMAL: + return WL_OUTPUT_TRANSFORM_NORMAL; + case MTK_MONITOR_TRANSFORM_90: + return WL_OUTPUT_TRANSFORM_90; + case MTK_MONITOR_TRANSFORM_180: + return WL_OUTPUT_TRANSFORM_180; + case MTK_MONITOR_TRANSFORM_270: + return WL_OUTPUT_TRANSFORM_270; + case MTK_MONITOR_TRANSFORM_FLIPPED: + return WL_OUTPUT_TRANSFORM_FLIPPED; + case MTK_MONITOR_TRANSFORM_FLIPPED_90: + return WL_OUTPUT_TRANSFORM_FLIPPED_90; + case MTK_MONITOR_TRANSFORM_FLIPPED_180: + return WL_OUTPUT_TRANSFORM_FLIPPED_180; + case MTK_MONITOR_TRANSFORM_FLIPPED_270: + return WL_OUTPUT_TRANSFORM_FLIPPED_270; + } + + g_assert_not_reached (); +} static struct wl_surface *cursor_surface; static struct wp_viewport *cursor_viewport; @@ -51,8 +79,14 @@ on_pointer_enter (WaylandSurface *surface, int ceiled_scale; int effective_theme_size = 0; float image_scale; + int image_width; + int image_height; + int image_hotspot_x; + int image_hotspot_y; + MtkMonitorTransform hotspot_transform; int hotspot_x = 0; int hotspot_y = 0; + enum wl_output_transform buffer_transform; if (!cursor_surface) cursor_surface = wl_compositor_create_surface (display->compositor); @@ -103,30 +137,45 @@ on_pointer_enter (WaylandSurface *surface, image_scale = ((float) image->width / theme_size); + image_width = image->width; + image_height = image->height; + image_hotspot_x = image->hotspot_x; + image_hotspot_y = image->hotspot_y; + hotspot_transform = mtk_monitor_transform_invert (cursor_transform); + mtk_monitor_transform_transform_point (hotspot_transform, + &image_width, + &image_height, + &image_hotspot_x, + &image_hotspot_y); + switch (scale_method) { case CURSOR_SCALE_METHOD_BUFFER_SCALE: - hotspot_x = (int) roundf (image->hotspot_x / ceiled_scale); - hotspot_y = (int) roundf (image->hotspot_y / ceiled_scale); + hotspot_x = (int) roundf (image_hotspot_x / ceiled_scale); + hotspot_y = (int) roundf (image_hotspot_y / ceiled_scale); break; case CURSOR_SCALE_METHOD_VIEWPORT: - hotspot_x = (int) roundf (image->hotspot_x / image_scale); - hotspot_y = (int) roundf (image->hotspot_y / image_scale); + hotspot_x = (int) roundf (image_hotspot_x / image_scale); + hotspot_y = (int) roundf (image_hotspot_y / image_scale); break; case CURSOR_SCALE_METHOD_VIEWPORT_CROPPED: - hotspot_x = (int) roundf ((image->hotspot_x - - (image->width / 4)) / image_scale); - hotspot_y = (int) roundf ((image->hotspot_y - - (image->height / 4)) / image_scale); + hotspot_x = (int) roundf ((image_hotspot_x - + (image_width / 4)) / image_scale); + hotspot_y = (int) roundf ((image_hotspot_y - + (image_height / 4)) / image_scale); break; } + buffer_transform = + wl_output_transform_from_monitor_transform (cursor_transform); + wl_surface_set_buffer_transform (cursor_surface, buffer_transform); + wl_pointer_set_cursor (pointer, serial, cursor_surface, hotspot_x, hotspot_y); wl_surface_attach (cursor_surface, buffer, 0, 0); wl_surface_damage_buffer (cursor_surface, 0, 0, - image->width, image->height); + image_width, image_height); switch (scale_method) { @@ -136,18 +185,18 @@ on_pointer_enter (WaylandSurface *surface, break; case CURSOR_SCALE_METHOD_VIEWPORT: wp_viewport_set_destination (cursor_viewport, - (int) roundf (image->width / image_scale), - (int) roundf (image->height / image_scale)); + (int) roundf (image_width / image_scale), + (int) roundf (image_height / image_scale)); break; case CURSOR_SCALE_METHOD_VIEWPORT_CROPPED: wp_viewport_set_source (cursor_viewport, - wl_fixed_from_int (image->width / 4), - wl_fixed_from_int (image->height / 4), - wl_fixed_from_int (image->width / 2), - wl_fixed_from_int (image->height / 2)); + wl_fixed_from_int (image_width / 4), + wl_fixed_from_int (image_height / 4), + wl_fixed_from_int (image_width / 2), + wl_fixed_from_int (image_height / 2)); wp_viewport_set_destination (cursor_viewport, - (int) roundf (image->width / 2 / image_scale), - (int) roundf (image->height / 2 / image_scale)); + (int) roundf (image_width / 2 / image_scale), + (int) roundf (image_height / 2 / image_scale)); break; } @@ -175,6 +224,7 @@ main (int argc, g_error ("Missing scale method"); cursor_name = argv[2]; + cursor_transform = mtk_monitor_transform_from_string (argv[3]); display = wayland_display_new (WAYLAND_DISPLAY_CAPABILITY_TEST_DRIVER); surface = wayland_surface_new (display, diff --git a/src/tests/wayland-test-clients/meson.build b/src/tests/wayland-test-clients/meson.build index 122912d39..0d76ac1bb 100644 --- a/src/tests/wayland-test-clients/meson.build +++ b/src/tests/wayland-test-clients/meson.build @@ -106,6 +106,7 @@ wayland_test_clients = [ 'name': 'cursor-tests-client', 'extra_deps': [ wayland_cursor_dep, + libmutter_mtk_dep, ], }, ] @@ -141,6 +142,7 @@ foreach test : wayland_test_clients dependencies: deps, install: have_installed_tests, install_dir: wayland_test_client_installed_tests_libexecdir, + install_rpath: pkglibdir, ) test_client_executables += { test['name']: test_executable }