Compare commits
486 Commits
Author | SHA1 | Date |
---|---|---|
![]() |
ca05d6232f | |
![]() |
1c7d007165 | |
![]() |
a973b4581b | |
![]() |
d27f69b6d7 | |
![]() |
4111b80d4a | |
![]() |
772492471f | |
![]() |
359c7372d2 | |
![]() |
2b0670e64c | |
![]() |
54125f8d5a | |
![]() |
0ddea8b00f | |
![]() |
9378033a14 | |
![]() |
a5c3cbf8be | |
![]() |
ac7c6a315e | |
![]() |
da0a8f36c9 | |
![]() |
482563fd8b | |
![]() |
45c7f77462 | |
![]() |
60508f5b4f | |
![]() |
6f22435096 | |
![]() |
6782fa55c5 | |
![]() |
7b5416ae89 | |
![]() |
edc170a2ab | |
![]() |
298548a5cd | |
![]() |
50c3d6f579 | |
![]() |
a4dadd7327 | |
![]() |
e3a3122018 | |
![]() |
b647037025 | |
![]() |
b7fb114872 | |
![]() |
6c2116316f | |
![]() |
a32215951f | |
![]() |
e5313626b7 | |
![]() |
3118978af2 | |
![]() |
b3880f6bce | |
![]() |
a32456618a | |
![]() |
5049dd2337 | |
![]() |
3f5543e5c5 | |
![]() |
f852077bec | |
![]() |
faa148572e | |
![]() |
84a27399b2 | |
![]() |
1b804ce55e | |
![]() |
8726ba4114 | |
![]() |
8ab3dab869 | |
![]() |
f3e305af2a | |
![]() |
2bbf56a59b | |
![]() |
ea6eb02c5a | |
![]() |
0d8832dc7c | |
![]() |
499ea077e4 | |
![]() |
96d718f936 | |
![]() |
5d9a0aa892 | |
![]() |
7267a17ea0 | |
![]() |
10af8375ee | |
![]() |
a31561c392 | |
![]() |
a5a1eac97f | |
![]() |
8219d3714e | |
![]() |
fbd780186c | |
![]() |
94401d00fb | |
![]() |
750fd5e8de | |
![]() |
fe5089925a | |
![]() |
fc3a2d0d5d | |
![]() |
f76b1947b1 | |
![]() |
68532f178d | |
![]() |
a516e9e6cd | |
![]() |
61217e1c8f | |
![]() |
2d68d150dd | |
![]() |
979c04335d | |
![]() |
a69fb4b958 | |
![]() |
16bac3dbe5 | |
![]() |
4bf2a5dd86 | |
![]() |
a941323e25 | |
![]() |
6e4fae02c3 | |
![]() |
81ef5d3500 | |
![]() |
4bcf3d6ad5 | |
![]() |
b8c7f8d339 | |
![]() |
615177749e | |
![]() |
9720ef2e23 | |
![]() |
19ffe2ac41 | |
![]() |
4919a8f007 | |
![]() |
8b2ddc447e | |
![]() |
135a9355ce | |
![]() |
24e4a90637 | |
![]() |
fc659638f6 | |
![]() |
93a168df94 | |
![]() |
9e89fe7e13 | |
![]() |
fcbeeb0581 | |
![]() |
f53c62494a | |
![]() |
bb4262a621 | |
![]() |
238dec820f | |
![]() |
8706a9356d | |
![]() |
8597caf132 | |
![]() |
4e33f715d3 | |
![]() |
f4289cd853 | |
![]() |
fbb1705649 | |
![]() |
166988cef7 | |
![]() |
09e638ff55 | |
![]() |
45fbfb7222 | |
![]() |
6e9f1f3eeb | |
![]() |
f4230e4a09 | |
![]() |
ee0dd6c8c5 | |
![]() |
c9b94bbac0 | |
![]() |
13e31baca8 | |
![]() |
74060343a0 | |
![]() |
501ab30677 | |
![]() |
f38fd572db | |
![]() |
551100b469 | |
![]() |
a1d0105836 | |
![]() |
91d0849250 | |
![]() |
760e35065e | |
![]() |
d8019dbf16 | |
![]() |
f2a7876178 | |
![]() |
9a029a423e | |
![]() |
ac831f0b97 | |
![]() |
79fa595d25 | |
![]() |
2d0117de92 | |
![]() |
3bb54d629f | |
![]() |
5af86d18f4 | |
![]() |
045199f3a4 | |
![]() |
e378a35d05 | |
![]() |
ea8fa09e2d | |
![]() |
0dbbcd83fe | |
![]() |
e2aec38015 | |
![]() |
c1c7de07aa | |
![]() |
d38a8d48a9 | |
![]() |
37ae820b29 | |
![]() |
0b2d8901ab | |
![]() |
fe1c814ee1 | |
![]() |
bb1507eadf | |
![]() |
5521920d31 | |
![]() |
6000cca756 | |
![]() |
5164f6969e | |
![]() |
90e070d004 | |
![]() |
abeec73a47 | |
![]() |
46d6ad9e94 | |
![]() |
bd681c3c72 | |
![]() |
808ff015ad | |
![]() |
745625f04d | |
![]() |
5fd10faeca | |
![]() |
e8f567b055 | |
![]() |
f1c132d329 | |
![]() |
26537fecfe | |
![]() |
24610e67a3 | |
![]() |
84412b22df | |
![]() |
be43a33002 | |
![]() |
e83e8503d6 | |
![]() |
05ad71e9fc | |
![]() |
783a63e594 | |
![]() |
61f65ce98d | |
![]() |
29bfd35585 | |
![]() |
a54cd2ded4 | |
![]() |
d549fee89e | |
![]() |
b225e135a2 | |
![]() |
369c3cbd7d | |
![]() |
cc7d710476 | |
![]() |
aef8796c72 | |
![]() |
18882eefde | |
![]() |
ab8345a24c | |
![]() |
dbf1edcc41 | |
![]() |
99cfa50a8d | |
![]() |
673f9a0ac5 | |
![]() |
4a78a5417b | |
![]() |
29838e1e5b | |
![]() |
6d5a0ed4d2 | |
![]() |
b3925a9460 | |
![]() |
7db7c97e41 | |
![]() |
9e4d7e54c5 | |
![]() |
18e6256dd6 | |
![]() |
e516aed779 | |
![]() |
26cacb79c8 | |
![]() |
fdcc9be2ce | |
![]() |
7da6ecb3df | |
![]() |
63a39646ea | |
![]() |
42eca26802 | |
![]() |
456ed767e6 | |
![]() |
be9d2fd7d0 | |
![]() |
84b4bd3ae8 | |
![]() |
d161f042f6 | |
![]() |
e89919227f | |
![]() |
b352c5b9ef | |
![]() |
c707d87b4d | |
![]() |
098a374fab | |
![]() |
565faf1713 | |
![]() |
ee3d84dffc | |
![]() |
aa741db0e7 | |
![]() |
27d215357c | |
![]() |
803009848c | |
![]() |
63d7a29e84 | |
![]() |
69b64ef78d | |
![]() |
4145d4a26d | |
![]() |
5aea602058 | |
![]() |
85e7e617f5 | |
![]() |
73d2860647 | |
![]() |
ee4b772007 | |
![]() |
018a1d35db | |
![]() |
14b96e67e9 | |
![]() |
f20ce6244c | |
![]() |
75b741128e | |
![]() |
5bf74d9384 | |
![]() |
5b263b41d5 | |
![]() |
4ae0f0cd65 | |
![]() |
7a36938672 | |
![]() |
ebce0e3c33 | |
![]() |
bd71e48327 | |
![]() |
9844badc93 | |
![]() |
fbe35105ac | |
![]() |
3397b86108 | |
![]() |
866b0bf142 | |
![]() |
10eac23ed2 | |
![]() |
66af39ec9e | |
![]() |
515f60cb7f | |
![]() |
111cd842f1 | |
![]() |
6de7a85083 | |
![]() |
df4b125506 | |
![]() |
cb3dadf283 | |
![]() |
80e30821af | |
![]() |
2f4480e60b | |
![]() |
47973b4f1c | |
![]() |
1ddcb4e288 | |
![]() |
adf58ef8d3 | |
![]() |
961a2d7041 | |
![]() |
2b8d404a31 | |
![]() |
fff63dadd4 | |
![]() |
8a2d77e0a5 | |
![]() |
38a03f3d3d | |
![]() |
d26d95ed3b | |
![]() |
09e4243513 | |
![]() |
04ef67ef16 | |
![]() |
26ce318518 | |
![]() |
6e7088d047 | |
![]() |
5e3d9fa52a | |
![]() |
dde3219c69 | |
![]() |
d062ce8750 | |
![]() |
cc057c5865 | |
![]() |
454f48f345 | |
![]() |
d1b5062709 | |
![]() |
9c63c04c13 | |
![]() |
e9004f723a | |
![]() |
e4443c32b3 | |
![]() |
84e9a6e69b | |
![]() |
dc05316de8 | |
![]() |
4f6daadf83 | |
![]() |
19c49093f2 | |
![]() |
42e57a852f | |
![]() |
09fbf4dac7 | |
![]() |
c84739d51e | |
![]() |
9e4c3b525a | |
![]() |
58f33b03a2 | |
![]() |
8756591037 | |
![]() |
6394a32162 | |
![]() |
c707ce77d7 | |
![]() |
deeb0672bf | |
![]() |
1ce25f7137 | |
![]() |
60849214b3 | |
![]() |
a706490763 | |
![]() |
58f38ff522 | |
![]() |
cc3d5ea89d | |
![]() |
8becf3cd68 | |
![]() |
5bf066ff11 | |
![]() |
0aaf3e8c84 | |
![]() |
160aa7dcba | |
![]() |
6fff1c9d2c | |
![]() |
668f6a6978 | |
![]() |
e1bf40976c | |
![]() |
cab4fdaad2 | |
![]() |
bae9233f7a | |
![]() |
4727a7d956 | |
![]() |
b9bf9d7d41 | |
![]() |
4b7614f04a | |
![]() |
7f4535490c | |
![]() |
6ff5b6361c | |
![]() |
e4f53d983c | |
![]() |
2e8d386042 | |
![]() |
26b605d4d9 | |
![]() |
d265fe2ad5 | |
![]() |
5f0c20503e | |
![]() |
7f099cac6c | |
![]() |
ad71ff1dfa | |
![]() |
ad3268b0b8 | |
![]() |
168e25ee38 | |
![]() |
7644499e20 | |
![]() |
8b73147fa9 | |
![]() |
16031795c0 | |
![]() |
f231f22546 | |
![]() |
b1f9379266 | |
![]() |
2d099d6603 | |
![]() |
dd54b03aaf | |
![]() |
89688db8e9 | |
![]() |
25f5cbcc15 | |
![]() |
7f8cf985af | |
![]() |
4f430bcc7e | |
![]() |
7d456cd63a | |
![]() |
c34aec1c7b | |
![]() |
6168b5dd54 | |
![]() |
e824ab00a3 | |
![]() |
38201e5edd | |
![]() |
43f223afe2 | |
![]() |
590055e8ff | |
![]() |
e4244c8056 | |
![]() |
c3eb4ecd04 | |
![]() |
d174a6ba33 | |
![]() |
001865d37f | |
![]() |
b49eb3d396 | |
![]() |
c9f36137ec | |
![]() |
ca9e55be49 | |
![]() |
8a932da1f4 | |
![]() |
f6a2821698 | |
![]() |
7927351bcb | |
![]() |
bb7d2152ba | |
![]() |
f94e4d16dd | |
![]() |
f1e7776cb6 | |
![]() |
e29f765635 | |
![]() |
e658d5ee02 | |
![]() |
1a6d8d265c | |
![]() |
9e4d6f4389 | |
![]() |
66df775a53 | |
![]() |
0e96bc341f | |
![]() |
23af6cb5f1 | |
![]() |
065ce0475f | |
![]() |
d3fbe753ea | |
![]() |
158d557683 | |
![]() |
0bdc3e73aa | |
![]() |
d296e10803 | |
![]() |
8e46556fff | |
![]() |
8c03472f8c | |
![]() |
1688463cfb | |
![]() |
aafce3b54e | |
![]() |
23fa0041aa | |
![]() |
e566bdfcd7 | |
![]() |
e40366b750 | |
![]() |
74ab969c72 | |
![]() |
63868e4dd4 | |
![]() |
8ed28586d9 | |
![]() |
19d665b216 | |
![]() |
9180693c50 | |
![]() |
babc295b3c | |
![]() |
7bcdd78a89 | |
![]() |
1cab899c5a | |
![]() |
44325842b8 | |
![]() |
416ed6479d | |
![]() |
09529f60f6 | |
![]() |
d2d054b921 | |
![]() |
fe2ead7644 | |
![]() |
10612ba279 | |
![]() |
19a0a0118e | |
![]() |
ba0ce9ec1a | |
![]() |
a47d6ffe9b | |
![]() |
604924b8a9 | |
![]() |
ee606a1fc6 | |
![]() |
184522822f | |
![]() |
0691a973f8 | |
![]() |
33f1cd8e81 | |
![]() |
d28e89cc6f | |
![]() |
9dd0943b0a | |
![]() |
655733d834 | |
![]() |
aa5fbb7bbb | |
![]() |
2b03587364 | |
![]() |
c51a53f93b | |
![]() |
7d99853edc | |
![]() |
91b01d66b4 | |
![]() |
70ddead9d2 | |
![]() |
80cd4bdbb5 | |
![]() |
1264672374 | |
![]() |
08b3643153 | |
![]() |
e241e3eb9f | |
![]() |
d1083a4db0 | |
![]() |
8ee4484548 | |
![]() |
be9bd4caea | |
![]() |
a787b39845 | |
![]() |
c67601c20b | |
![]() |
8e6648ecf0 | |
![]() |
615fbac7ee | |
![]() |
67e154b101 | |
![]() |
ef3d1f2629 | |
![]() |
9b964088dc | |
![]() |
7f8c41bedc | |
![]() |
063d0ab81a | |
![]() |
6fba02a75f | |
![]() |
6ef84f8451 | |
![]() |
824b38a8fd | |
![]() |
56a65284e2 | |
![]() |
d6202dcc60 | |
![]() |
ae23df1f53 | |
![]() |
dd03140289 | |
![]() |
13c3a499cd | |
![]() |
e6685c0d21 | |
![]() |
bf33a3de15 | |
![]() |
2849f66f97 | |
![]() |
5e691497c1 | |
![]() |
de36aad203 | |
![]() |
424ba7d0fc | |
![]() |
b0f9cdccdc | |
![]() |
e572246ed7 | |
![]() |
0fe9e7ac0c | |
![]() |
e674014d9d | |
![]() |
2d08593522 | |
![]() |
d22e6a1977 | |
![]() |
a26d171c78 | |
![]() |
101a3d075e | |
![]() |
e289c81284 | |
![]() |
1b4898c2de | |
![]() |
96e85597da | |
![]() |
7ba44593fe | |
![]() |
ab4264a6df | |
![]() |
264a41cff3 | |
![]() |
219ec5f385 | |
![]() |
40a9533578 | |
![]() |
5a0f716236 | |
![]() |
a619fc095e | |
![]() |
617acb537f | |
![]() |
6c6be75fdf | |
![]() |
444b51d95e | |
![]() |
22b5634f99 | |
![]() |
4e0b7b343e | |
![]() |
0f8893f532 | |
![]() |
84c8f4a4e0 | |
![]() |
afeee286f5 | |
![]() |
c9b6c5439a | |
![]() |
e6b8c5318d | |
![]() |
0050f1443e | |
![]() |
f1a70c459d | |
![]() |
558c87c359 | |
![]() |
daf7afb68a | |
![]() |
94ab3cdb66 | |
![]() |
a18c712282 | |
![]() |
b5884bc721 | |
![]() |
b57c31a896 | |
![]() |
f143003647 | |
![]() |
947d8c5e59 | |
![]() |
7e6876cc63 | |
![]() |
8fb0363432 | |
![]() |
c297b54c6f | |
![]() |
cc75f86e4b | |
![]() |
33077cb81c | |
![]() |
74da1f01a5 | |
![]() |
37d2a79143 | |
![]() |
0e62379248 | |
![]() |
6e8f56f713 | |
![]() |
8c318194eb | |
![]() |
f5e552c07b | |
![]() |
e20c953b8a | |
![]() |
3569eaab15 | |
![]() |
12c3197ca6 | |
![]() |
228ef989b4 | |
![]() |
3a3ea5d23a | |
![]() |
c115b793a9 | |
![]() |
5b557a6ada | |
![]() |
49ced6dcdd | |
![]() |
3f5f1ce9ba | |
![]() |
b813b9879a | |
![]() |
484e7c94e6 | |
![]() |
05de026fd2 | |
![]() |
f05f1a29d0 | |
![]() |
9a09ebe673 | |
![]() |
b62d212a58 | |
![]() |
3a37f8dbb2 | |
![]() |
fc7a92096b | |
![]() |
e87dcd4cd9 | |
![]() |
f0387d2f85 | |
![]() |
1ac4a2498d | |
![]() |
ef7664a647 | |
![]() |
ffb13a1cd8 | |
![]() |
97df214487 | |
![]() |
eca4049ef6 | |
![]() |
b08547968d | |
![]() |
7bd9fe6827 | |
![]() |
3fa088af00 | |
![]() |
0dd9f0a31f | |
![]() |
df4657c963 | |
![]() |
4b4852463f | |
![]() |
4a674e6726 | |
![]() |
fc4a6ab4ff | |
![]() |
37b6092aef | |
![]() |
e7870f0841 | |
![]() |
d1d1b52bed | |
![]() |
d02cf12f13 | |
![]() |
a5437f9af7 | |
![]() |
88d19feec4 | |
![]() |
fe5e3a4ce2 | |
![]() |
a7f1c284a0 | |
![]() |
2292ad8bd0 | |
![]() |
0da6354bce | |
![]() |
e3e4547392 | |
![]() |
680a759852 | |
![]() |
fce26936d0 | |
![]() |
62ac1f86d1 | |
![]() |
0b1759076c | |
![]() |
bce1047080 | |
![]() |
3298ae3405 | |
![]() |
9a73beecdd |
autotests
integration
effects
libinput
wayland
client
server
examples/quick-effect/package
po
as
be@latin
|
@ -5,10 +5,10 @@ include:
|
|||
- project: sysadmin/ci-utilities
|
||||
file:
|
||||
- /gitlab-templates/linux-qt6.yml
|
||||
- /gitlab-templates/freebsd-qt6.yml
|
||||
# - /gitlab-templates/freebsd-qt6.yml
|
||||
|
||||
suse_tumbleweed_qt66_reduced_featureset:
|
||||
extends: suse_tumbleweed_qt66
|
||||
suse_tumbleweed_qt67_reduced_featureset:
|
||||
extends: suse_tumbleweed_qt67
|
||||
script:
|
||||
- git config --global --add safe.directory $CI_PROJECT_DIR
|
||||
- python3 -u ci-utilities/run-ci-build.py --project $CI_PROJECT_NAME --branch $CI_COMMIT_REF_NAME --platform Linux --extra-cmake-args="-DKWIN_BUILD_KCMS=OFF -DKWIN_BUILD_SCREENLOCKER=OFF -DKWIN_BUILD_TABBOX=OFF -DKWIN_BUILD_ACTIVITIES=OFF -DKWIN_BUILD_RUNNERS=OFF -DKWIN_BUILD_NOTIFICATIONS=OFF -DKWIN_BUILD_GLOBALSHORTCUTS=OFF" --skip-publishing
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
set(PROJECT_VERSION "5.92.0") # Handled by release scripts
|
||||
set(PROJECT_VERSION "6.0.5") # Handled by release scripts
|
||||
project(KWin VERSION ${PROJECT_VERSION})
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
@ -8,7 +8,7 @@ set(CMAKE_CXX_STANDARD 20)
|
|||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(QT_MIN_VERSION "6.6.0")
|
||||
set(KF6_MIN_VERSION "5.240.0")
|
||||
set(KF6_MIN_VERSION "6.0.0")
|
||||
set(KDE_COMPILERSETTINGS_LEVEL "5.82")
|
||||
|
||||
find_package(ECM ${KF6_MIN_VERSION} REQUIRED NO_MODULE)
|
||||
|
@ -71,7 +71,7 @@ if (NOT Qt6Test_FOUND)
|
|||
endif()
|
||||
|
||||
if (BUILD_TESTING)
|
||||
find_package(KPipeWire)
|
||||
pkg_check_modules(PipeWire IMPORTED_TARGET libpipewire-0.3 REQUIRED)
|
||||
endif()
|
||||
|
||||
# required frameworks by Core
|
||||
|
|
|
@ -6,5 +6,5 @@ set(KWIN_EFFECTS_INTERFACE "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@/org.kde.kwin.
|
|||
set(KWIN_VIRTUALKEYBOARD_INTERFACE "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@/org.kde.kwin.VirtualKeyboard.xml")
|
||||
set(KWIN_TABLETMODE_INTERFACE "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@/org.kde.KWin.TabletModeManager.xml")
|
||||
set(KWIN_INPUTDEVICE_INTERFACE "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@/org.kde.kwin.InputDevice.xml")
|
||||
set(KWIN_COLORCORRECT_INTERFACE "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@/org.kde.kwin.ColorCorrect.xml")
|
||||
set(KWIN_NIGHTLIGHT_INTERFACE "@PACKAGE_KDE_INSTALL_DBUSINTERFACEDIR@/org.kde.KWin.NightLight.xml")
|
||||
set(KWIN_WAYLAND_BIN_PATH "@CMAKE_INSTALL_FULL_BINDIR@/kwin_wayland")
|
||||
|
|
|
@ -131,6 +131,7 @@ integrationTest(NAME testXwaylandServerRestart SRCS xwaylandserver_restart_test.
|
|||
integrationTest(NAME testFakeInput SRCS fakeinput_test.cpp)
|
||||
integrationTest(NAME testSecurityContext SRCS security_context_test.cpp)
|
||||
integrationTest(NAME testStickyKeys SRCS sticky_keys_test.cpp)
|
||||
integrationTest(NAME testXinerama SRCS xinerama_test.cpp)
|
||||
|
||||
qt_add_dbus_interfaces(DBUS_SRCS ${CMAKE_BINARY_DIR}/src/org.kde.kwin.VirtualKeyboard.xml)
|
||||
integrationTest(NAME testVirtualKeyboardDBus SRCS test_virtualkeyboard_dbus.cpp ${DBUS_SRCS})
|
||||
|
@ -139,8 +140,8 @@ if (KWIN_BUILD_GLOBALSHORTCUTS)
|
|||
integrationTest(NAME testGlobalShortcuts SRCS globalshortcuts_test.cpp LIBS XCB::ICCCM KF6::GlobalAccel KF6::I18n XKB::XKB)
|
||||
integrationTest(NAME testKWinBindings SRCS kwinbindings_test.cpp LIBS KF6::I18n)
|
||||
endif()
|
||||
if (TARGET K::KPipeWire)
|
||||
integrationTest(NAME testScreencasting SRCS screencasting_test.cpp LIBS K::KPipeWire)
|
||||
if (TARGET PkgConfig::PipeWire)
|
||||
integrationTest(NAME testScreencasting SRCS screencasting_test.cpp pipewirecore.cpp pipewiresourcestream.cpp LIBS Qt::GuiPrivate PkgConfig::PipeWire)
|
||||
endif()
|
||||
|
||||
if (KWIN_BUILD_ACTIVITIES)
|
||||
|
|
|
@ -140,6 +140,7 @@ void TestDbusInterface::testGetWindowInfoXdgShellClient()
|
|||
#if KWIN_BUILD_ACTIVITIES
|
||||
{QStringLiteral("activities"), QStringList()},
|
||||
#endif
|
||||
{QStringLiteral("layer"), NormalLayer},
|
||||
};
|
||||
|
||||
// let's get the window info
|
||||
|
@ -276,6 +277,7 @@ void TestDbusInterface::testGetWindowInfoX11Client()
|
|||
#if KWIN_BUILD_ACTIVITIES
|
||||
{QStringLiteral("activities"), QStringList()},
|
||||
#endif
|
||||
{QStringLiteral("layer"), NormalLayer},
|
||||
};
|
||||
|
||||
// let's get the window info
|
||||
|
|
|
@ -119,8 +119,8 @@ void WobblyWindowsShadeTest::testShadeMove()
|
|||
QVERIFY(!window->isShade());
|
||||
QVERIFY(window->isActive());
|
||||
|
||||
QSignalSpy windowShownSpy(window, &Window::windowShown);
|
||||
QVERIFY(windowShownSpy.wait());
|
||||
QSignalSpy readyForPaintingChangedSpy(window, &Window::readyForPaintingChanged);
|
||||
QVERIFY(readyForPaintingChangedSpy.wait());
|
||||
|
||||
// now shade the window
|
||||
workspace()->slotWindowShade();
|
||||
|
|
|
@ -49,6 +49,7 @@ private Q_SLOTS:
|
|||
void testUserActionsMenu();
|
||||
void testMetaShiftW();
|
||||
void testComponseKey();
|
||||
void testKeypad();
|
||||
void testX11WindowShortcut();
|
||||
void testWaylandWindowShortcut();
|
||||
void testSetupWindowShortcut();
|
||||
|
@ -275,6 +276,44 @@ void GlobalShortcutsTest::testComponseKey()
|
|||
QTRY_COMPARE(triggeredSpy.count(), 0);
|
||||
}
|
||||
|
||||
void GlobalShortcutsTest::testKeypad()
|
||||
{
|
||||
auto zeroAction = std::make_unique<QAction>();
|
||||
zeroAction->setProperty("componentName", QStringLiteral("kwin"));
|
||||
zeroAction->setObjectName(QStringLiteral("globalshortcuts-test-keypad-0"));
|
||||
QSignalSpy zeroActionTriggeredSpy(zeroAction.get(), &QAction::triggered);
|
||||
KGlobalAccel::self()->setShortcut(zeroAction.get(), QList<QKeySequence>{Qt::MetaModifier | Qt::KeypadModifier | Qt::Key_0}, KGlobalAccel::NoAutoloading);
|
||||
|
||||
auto insertAction = std::make_unique<QAction>();
|
||||
insertAction->setProperty("componentName", QStringLiteral("kwin"));
|
||||
insertAction->setObjectName(QStringLiteral("globalshortcuts-test-keypad-ins"));
|
||||
QSignalSpy insertActionTriggeredSpy(insertAction.get(), &QAction::triggered);
|
||||
KGlobalAccel::self()->setShortcut(insertAction.get(), QList<QKeySequence>{Qt::MetaModifier | Qt::KeypadModifier | Qt::Key_Insert}, KGlobalAccel::NoAutoloading);
|
||||
|
||||
// Turn on numlock
|
||||
quint32 timestamp = 0;
|
||||
Test::keyboardKeyPressed(KEY_NUMLOCK, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_NUMLOCK, timestamp++);
|
||||
|
||||
Test::keyboardKeyPressed(KEY_LEFTMETA, timestamp++);
|
||||
Test::keyboardKeyPressed(KEY_KP0, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_KP0, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_LEFTMETA, timestamp++);
|
||||
QTRY_COMPARE(zeroActionTriggeredSpy.count(), 1);
|
||||
QCOMPARE(insertActionTriggeredSpy.count(), 0);
|
||||
|
||||
// Turn off numlock
|
||||
Test::keyboardKeyPressed(KEY_NUMLOCK, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_NUMLOCK, timestamp++);
|
||||
|
||||
Test::keyboardKeyPressed(KEY_LEFTMETA, timestamp++);
|
||||
Test::keyboardKeyPressed(KEY_KP0, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_KP0, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_LEFTMETA, timestamp++);
|
||||
QTRY_COMPARE(insertActionTriggeredSpy.count(), 1);
|
||||
QCOMPARE(zeroActionTriggeredSpy.count(), 1);
|
||||
}
|
||||
|
||||
void GlobalShortcutsTest::testX11WindowShortcut()
|
||||
{
|
||||
// create an X11 window
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include "core/output.h"
|
||||
#include "inputmethod.h"
|
||||
#include "inputpanelv1window.h"
|
||||
#include "keyboard_input.h"
|
||||
#include "pointer_input.h"
|
||||
#include "qwayland-input-method-unstable-v1.h"
|
||||
|
@ -63,6 +64,8 @@ private Q_SLOTS:
|
|||
void testDisableShowInputPanel();
|
||||
void testModifierForwarding();
|
||||
void testFakeEventFallback();
|
||||
void testOverlayPositioning_data();
|
||||
void testOverlayPositioning();
|
||||
|
||||
private:
|
||||
void touchNow()
|
||||
|
@ -552,6 +555,10 @@ void InputMethodTest::testV3Styling()
|
|||
// Merged range should be [1,6).
|
||||
QCOMPARE(textInputPreeditSpy.last().at(1), 1);
|
||||
QCOMPARE(textInputPreeditSpy.last().at(2), 6);
|
||||
|
||||
shellSurface.reset();
|
||||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
QVERIFY(!kwinApp()->inputMethod()->isActive());
|
||||
}
|
||||
|
||||
void InputMethodTest::testDisableShowInputPanel()
|
||||
|
@ -584,6 +591,9 @@ void InputMethodTest::testDisableShowInputPanel()
|
|||
textInputV2->showInputPanel();
|
||||
QVERIFY(requestShowInputPanelSpy.count() || requestShowInputPanelSpy.wait());
|
||||
QVERIFY(!kwinApp()->inputMethod()->isActive());
|
||||
|
||||
shellSurface.reset();
|
||||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
}
|
||||
|
||||
void InputMethodTest::testModifierForwarding()
|
||||
|
@ -655,6 +665,10 @@ void InputMethodTest::testModifierForwarding()
|
|||
QVERIFY(modifierSpy.count() == 3 || modifierSpy.wait());
|
||||
disconnect(keyChangedConnection);
|
||||
disconnect(modifiersChangedConnection);
|
||||
|
||||
shellSurface.reset();
|
||||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
QVERIFY(!kwinApp()->inputMethod()->isActive());
|
||||
}
|
||||
|
||||
void InputMethodTest::testFakeEventFallback()
|
||||
|
@ -726,6 +740,71 @@ void InputMethodTest::testFakeEventFallback()
|
|||
|
||||
compare(keySpy.at(0), KEY_ENTER, KWayland::Client::Keyboard::KeyState::Pressed);
|
||||
compare(keySpy.at(1), KEY_ENTER, KWayland::Client::Keyboard::KeyState::Released);
|
||||
|
||||
shellSurface.reset();
|
||||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
kwinApp()->inputMethod()->setActive(false);
|
||||
QVERIFY(!kwinApp()->inputMethod()->isActive());
|
||||
}
|
||||
|
||||
void InputMethodTest::testOverlayPositioning_data()
|
||||
{
|
||||
QTest::addColumn<QRect>("cursorRectangle");
|
||||
QTest::addColumn<QRect>("result");
|
||||
|
||||
QTest::newRow("regular") << QRect(10, 20, 30, 40) << QRect(60, 160, 200, 50);
|
||||
QTest::newRow("offscreen-left") << QRect(-200, 40, 30, 40) << QRect(0, 180, 200, 50);
|
||||
QTest::newRow("offscreen-right") << QRect(1200, 40, 30, 40) << QRect(1080, 180, 200, 50);
|
||||
QTest::newRow("offscreen-top") << QRect(1200, -400, 30, 40) << QRect(1080, 0, 200, 50);
|
||||
// Check it is flipped near the bottom of screen (anchor point 844 + 100 + 40 = 1024 - 40)
|
||||
QTest::newRow("offscreen-bottom-flip") << QRect(1200, 844, 30, 40) << QRect(1080, 894, 200, 50);
|
||||
// Top is (screen height 1024 - window height 50) = 984
|
||||
QTest::newRow("offscreen-bottom-slide") << QRect(1200, 1200, 30, 40) << QRect(1080, 974, 200, 50);
|
||||
}
|
||||
|
||||
void InputMethodTest::testOverlayPositioning()
|
||||
{
|
||||
QFETCH(QRect, cursorRectangle);
|
||||
QFETCH(QRect, result);
|
||||
Test::inputMethod()->setMode(Test::MockInputMethod::Mode::Overlay);
|
||||
QVERIFY(!kwinApp()->inputMethod()->isActive());
|
||||
|
||||
touchNow();
|
||||
QSignalSpy windowAddedSpy(workspace(), &Workspace::windowAdded);
|
||||
QSignalSpy windowRemovedSpy(workspace(), &Workspace::windowRemoved);
|
||||
|
||||
QSignalSpy activateSpy(kwinApp()->inputMethod(), &InputMethod::activeChanged);
|
||||
std::unique_ptr<KWayland::Client::TextInput> textInput(Test::waylandTextInputManager()->createTextInput(Test::waylandSeat()));
|
||||
|
||||
// Create an xdg_toplevel surface and wait for the compositor to catch up.
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
|
||||
// Make the window smaller than the screen and move it.
|
||||
Window *window = Test::renderAndWaitForShown(surface.get(), QSize(1080, 824), Qt::red);
|
||||
window->move(QPointF(50, 100));
|
||||
waylandServer()->seat()->setFocusedTextInputSurface(window->surface());
|
||||
|
||||
textInput->setCursorRectangle(cursorRectangle);
|
||||
textInput->enable(surface.get());
|
||||
// Overlay is shown upon activate
|
||||
QVERIFY(windowAddedSpy.wait());
|
||||
|
||||
QCOMPARE(workspace()->activeWindow(), window);
|
||||
|
||||
QCOMPARE(windowAddedSpy.count(), 2);
|
||||
QVERIFY(activateSpy.count() || activateSpy.wait());
|
||||
QVERIFY(kwinApp()->inputMethod()->isActive());
|
||||
|
||||
auto keyboardWindow = kwinApp()->inputMethod()->panel();
|
||||
QVERIFY(keyboardWindow);
|
||||
// Check the overlay window is placed with cursor rectangle + window position.
|
||||
QCOMPARE(keyboardWindow->frameGeometry(), result);
|
||||
|
||||
// Destroy the test window.
|
||||
shellSurface.reset();
|
||||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
|
||||
Test::inputMethod()->setMode(Test::MockInputMethod::Mode::TopLevel);
|
||||
}
|
||||
|
||||
WAYLANDTEST_MAIN(InputMethodTest)
|
||||
|
|
|
@ -58,7 +58,6 @@ private Q_SLOTS:
|
|||
void testReconfigure();
|
||||
void testChangeLayoutThroughDBus();
|
||||
void testPerLayoutShortcut();
|
||||
void testDBusServiceExport();
|
||||
void testVirtualDesktopPolicy();
|
||||
void testWindowPolicy();
|
||||
void testApplicationPolicy();
|
||||
|
@ -307,36 +306,6 @@ void KeyboardLayoutTest::testPerLayoutShortcut()
|
|||
Test::keyboardKeyReleased(KEY_LEFTCTRL, timestamp++);
|
||||
}
|
||||
|
||||
void KeyboardLayoutTest::testDBusServiceExport()
|
||||
{
|
||||
// verifies that the dbus service is only exported if there are at least two layouts
|
||||
|
||||
// first configure layouts, with just one layout
|
||||
layoutGroup.writeEntry("LayoutList", QStringLiteral("us"));
|
||||
layoutGroup.sync();
|
||||
reconfigureLayouts();
|
||||
auto xkb = input()->keyboard()->xkb();
|
||||
QCOMPARE(xkb->numberOfLayouts(), 1u);
|
||||
// default layout is English
|
||||
QCOMPARE(xkb->layoutName(), QStringLiteral("English (US)"));
|
||||
// with one layout we should not have the dbus interface
|
||||
QVERIFY(!QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.keyboard")).value());
|
||||
|
||||
// reconfigure to two layouts
|
||||
layoutGroup.writeEntry("LayoutList", QStringLiteral("us,de"));
|
||||
layoutGroup.sync();
|
||||
reconfigureLayouts();
|
||||
QCOMPARE(xkb->numberOfLayouts(), 2u);
|
||||
QVERIFY(QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.keyboard")).value());
|
||||
|
||||
// and back to one layout
|
||||
layoutGroup.writeEntry("LayoutList", QStringLiteral("us"));
|
||||
layoutGroup.sync();
|
||||
reconfigureLayouts();
|
||||
QCOMPARE(xkb->numberOfLayouts(), 1u);
|
||||
QVERIFY(!QDBusConnection::sessionBus().interface()->isServiceRegistered(QStringLiteral("org.kde.keyboard")).value());
|
||||
}
|
||||
|
||||
void KeyboardLayoutTest::testVirtualDesktopPolicy()
|
||||
{
|
||||
layoutGroup.writeEntry("LayoutList", QStringLiteral("us,de,de(neo)"));
|
||||
|
|
|
@ -71,6 +71,10 @@ WaylandTestApplication::WaylandTestApplication(OperationMode mode, int &argc, ch
|
|||
qunsetenv("XKB_DEFAULT_VARIANT");
|
||||
qunsetenv("XKB_DEFAULT_OPTIONS");
|
||||
|
||||
auto breezerc = KSharedConfig::openConfig(QStringLiteral("breezerc"));
|
||||
breezerc->group(QStringLiteral("Common")).writeEntry(QStringLiteral("OutlineIntensity"), QStringLiteral("OutlineOff"));
|
||||
breezerc->sync();
|
||||
|
||||
auto config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
|
||||
KConfigGroup windowsGroup = config->group(QStringLiteral("Windows"));
|
||||
windowsGroup.writeEntry("Placement", Placement::policyToString(PlacementSmart));
|
||||
|
|
|
@ -446,6 +446,11 @@ class MockInputMethod : public QObject, QtWayland::zwp_input_method_v1
|
|||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum class Mode {
|
||||
TopLevel,
|
||||
Overlay,
|
||||
};
|
||||
|
||||
MockInputMethod(struct wl_registry *registry, int id, int version);
|
||||
~MockInputMethod();
|
||||
|
||||
|
@ -458,6 +463,8 @@ public:
|
|||
return m_context;
|
||||
}
|
||||
|
||||
void setMode(Mode mode);
|
||||
|
||||
Q_SIGNALS:
|
||||
void activate();
|
||||
|
||||
|
@ -469,6 +476,7 @@ private:
|
|||
std::unique_ptr<KWayland::Client::Surface> m_inputSurface;
|
||||
QtWayland::zwp_input_panel_surface_v1 *m_inputMethodSurface = nullptr;
|
||||
struct ::zwp_input_method_context_v1 *m_context = nullptr;
|
||||
Mode m_mode = Mode::TopLevel;
|
||||
};
|
||||
|
||||
class FractionalScaleManagerV1 : public QObject, public QtWayland::wp_fractional_scale_manager_v1
|
||||
|
@ -683,7 +691,8 @@ enum class CreationSetup {
|
|||
};
|
||||
|
||||
QtWayland::zwp_input_panel_surface_v1 *createInputPanelSurfaceV1(KWayland::Client::Surface *surface,
|
||||
KWayland::Client::Output *output);
|
||||
KWayland::Client::Output *output,
|
||||
MockInputMethod::Mode mode);
|
||||
|
||||
FractionalScaleV1 *createFractionalScaleV1(KWayland::Client::Surface *surface);
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "kwin_wayland_test.h"
|
||||
|
||||
#include "core/output.h"
|
||||
#include "core/outputconfiguration.h"
|
||||
#include "main.h"
|
||||
#include "pointer_input.h"
|
||||
#include "screenedge.h"
|
||||
|
@ -44,6 +45,7 @@ private Q_SLOTS:
|
|||
void testChangeLayer();
|
||||
void testPlacementArea_data();
|
||||
void testPlacementArea();
|
||||
void testPlacementAreaAfterOutputLayoutChange();
|
||||
void testFill_data();
|
||||
void testFill();
|
||||
void testStack();
|
||||
|
@ -52,6 +54,7 @@ private Q_SLOTS:
|
|||
void testActivate_data();
|
||||
void testActivate();
|
||||
void testUnmap();
|
||||
void testScreenEdge_data();
|
||||
void testScreenEdge();
|
||||
};
|
||||
|
||||
|
@ -263,7 +266,7 @@ void LayerShellV1WindowTest::testLayer_data()
|
|||
QTest::addColumn<int>("protocolLayer");
|
||||
QTest::addColumn<Layer>("compositorLayer");
|
||||
|
||||
QTest::addRow("overlay") << int(Test::LayerShellV1::layer_overlay) << UnmanagedLayer;
|
||||
QTest::addRow("overlay") << int(Test::LayerShellV1::layer_overlay) << OverlayLayer;
|
||||
QTest::addRow("top") << int(Test::LayerShellV1::layer_top) << AboveLayer;
|
||||
QTest::addRow("bottom") << int(Test::LayerShellV1::layer_bottom) << BelowLayer;
|
||||
QTest::addRow("background") << int(Test::LayerShellV1::layer_background) << DesktopLayer;
|
||||
|
@ -356,22 +359,42 @@ void LayerShellV1WindowTest::testPlacementArea_data()
|
|||
QTest::addColumn<int>("anchor");
|
||||
QTest::addColumn<QMargins>("margins");
|
||||
QTest::addColumn<int>("exclusiveZone");
|
||||
QTest::addColumn<int>("exclusiveEdge");
|
||||
QTest::addColumn<QRectF>("placementArea");
|
||||
|
||||
QTest::addRow("left") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << QRectF(300, 0, 980, 1024);
|
||||
QTest::addRow("top") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, 0, 0, 0) << 300 << QRectF(0, 300, 1280, 724);
|
||||
QTest::addRow("right") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << QRectF(0, 0, 980, 1024);
|
||||
QTest::addRow("bottom") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, 0) << 300 << QRectF(0, 0, 1280, 724);
|
||||
QTest::addRow("left") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(300, 0, 980, 1024);
|
||||
QTest::addRow("top") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 300, 1280, 724);
|
||||
QTest::addRow("right") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 0, 980, 1024);
|
||||
QTest::addRow("bottom") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 0, 1280, 724);
|
||||
|
||||
QTest::addRow("left, negative margin") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(-5, 0, 0, 0) << 300 << QRectF(295, 0, 985, 1024);
|
||||
QTest::addRow("top, negative margin") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, -5, 0, 0) << 300 << QRectF(0, 295, 1280, 729);
|
||||
QTest::addRow("right, negative margin") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, -5, 0) << 300 << QRectF(0, 0, 985, 1024);
|
||||
QTest::addRow("bottom, negative margin") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, -5) << 300 << QRectF(0, 0, 1280, 729);
|
||||
QTest::addRow("top | left") << int(Test::LayerSurfaceV1::anchor_top | Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 0, 1280, 1024);
|
||||
QTest::addRow("top | right") << int(Test::LayerSurfaceV1::anchor_top | Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 0, 1280, 1024);
|
||||
QTest::addRow("bottom | left") << int(Test::LayerSurfaceV1::anchor_bottom | Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 0, 1280, 1024);
|
||||
QTest::addRow("bottom | right") << int(Test::LayerSurfaceV1::anchor_bottom | Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << 0 << QRectF(0, 0, 1280, 1024);
|
||||
|
||||
QTest::addRow("left, positive margin") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(5, 0, 0, 0) << 300 << QRectF(305, 0, 975, 1024);
|
||||
QTest::addRow("top, positive margin") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, 5, 0, 0) << 300 << QRectF(0, 305, 1280, 719);
|
||||
QTest::addRow("right, positive margin") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 5, 0) << 300 << QRectF(0, 0, 975, 1024);
|
||||
QTest::addRow("bottom, positive margin") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, 5) << 300 << QRectF(0, 0, 1280, 719);
|
||||
QTest::addRow("left, negative margin") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(-5, 0, 0, 0) << 300 << 0 << QRectF(295, 0, 985, 1024);
|
||||
QTest::addRow("top, negative margin") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, -5, 0, 0) << 300 << 0 << QRectF(0, 295, 1280, 729);
|
||||
QTest::addRow("right, negative margin") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, -5, 0) << 300 << 0 << QRectF(0, 0, 985, 1024);
|
||||
QTest::addRow("bottom, negative margin") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, -5) << 300 << 0 << QRectF(0, 0, 1280, 729);
|
||||
|
||||
QTest::addRow("left, positive margin") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(5, 0, 0, 0) << 300 << 0 << QRectF(305, 0, 975, 1024);
|
||||
QTest::addRow("top, positive margin") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, 5, 0, 0) << 300 << 0 << QRectF(0, 305, 1280, 719);
|
||||
QTest::addRow("right, positive margin") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 5, 0) << 300 << 0 << QRectF(0, 0, 975, 1024);
|
||||
QTest::addRow("bottom, positive margin") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, 5) << 300 << 0 << QRectF(0, 0, 1280, 719);
|
||||
|
||||
QTest::addRow("left + left exclusive edge") << int(Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_left) << QRectF(300, 0, 980, 1024);
|
||||
QTest::addRow("top + top exclusive edge") << int(Test::LayerSurfaceV1::anchor_top) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_top) << QRectF(0, 300, 1280, 724);
|
||||
QTest::addRow("right + right exclusive edge") << int(Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_right) << QRectF(0, 0, 980, 1024);
|
||||
QTest::addRow("bottom + bottom exclusive edge") << int(Test::LayerSurfaceV1::anchor_bottom) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_bottom) << QRectF(0, 0, 1280, 724);
|
||||
|
||||
QTest::addRow("top | left + top exclusive edge") << int(Test::LayerSurfaceV1::anchor_top | Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_top) << QRectF(0, 300, 1280, 724);
|
||||
QTest::addRow("top | left + left exclusive edge") << int(Test::LayerSurfaceV1::anchor_top | Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_left) << QRectF(300, 0, 980, 1024);
|
||||
QTest::addRow("top | right + top exclusive edge") << int(Test::LayerSurfaceV1::anchor_top | Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_top) << QRectF(0, 300, 1280, 724);
|
||||
QTest::addRow("top | right + right exclusive edge") << int(Test::LayerSurfaceV1::anchor_top | Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_right) << QRectF(0, 0, 980, 1024);
|
||||
QTest::addRow("bottom | left + bottom exclusive edge") << int(Test::LayerSurfaceV1::anchor_bottom | Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_bottom) << QRectF(0, 0, 1280, 724);
|
||||
QTest::addRow("bottom | left + left exclusive edge") << int(Test::LayerSurfaceV1::anchor_bottom | Test::LayerSurfaceV1::anchor_left) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_left) << QRectF(300, 0, 980, 1024);
|
||||
QTest::addRow("bottom | right + bottom exclusive edge") << int(Test::LayerSurfaceV1::anchor_bottom | Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_bottom) << QRectF(0, 0, 1280, 724);
|
||||
QTest::addRow("bottom | right + right exclusive edge") << int(Test::LayerSurfaceV1::anchor_bottom | Test::LayerSurfaceV1::anchor_right) << QMargins(0, 0, 0, 0) << 300 << int(Test::LayerSurfaceV1::anchor_right) << QRectF(0, 0, 980, 1024);
|
||||
}
|
||||
|
||||
void LayerShellV1WindowTest::testPlacementArea()
|
||||
|
@ -384,9 +407,11 @@ void LayerShellV1WindowTest::testPlacementArea()
|
|||
QFETCH(int, anchor);
|
||||
QFETCH(QMargins, margins);
|
||||
QFETCH(int, exclusiveZone);
|
||||
QFETCH(int, exclusiveEdge);
|
||||
shellSurface->set_anchor(anchor);
|
||||
shellSurface->set_margin(margins.top(), margins.right(), margins.bottom(), margins.left());
|
||||
shellSurface->set_exclusive_zone(exclusiveZone);
|
||||
shellSurface->set_exclusive_edge(exclusiveEdge);
|
||||
shellSurface->set_size(280, 124);
|
||||
surface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
|
||||
|
@ -408,6 +433,54 @@ void LayerShellV1WindowTest::testPlacementArea()
|
|||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
}
|
||||
|
||||
void LayerShellV1WindowTest::testPlacementAreaAfterOutputLayoutChange()
|
||||
{
|
||||
// This test verifies that layer shell windows correctly react to output layout changes.
|
||||
|
||||
// The output where the layer surface should be placed.
|
||||
Output *output = workspace()->activeOutput();
|
||||
|
||||
// Create a layer surface with an exclusive zone.
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::LayerSurfaceV1> shellSurface(Test::createLayerSurfaceV1(surface.get(), QStringLiteral("dock"), Test::waylandOutput(output->name())));
|
||||
shellSurface->set_layer(Test::LayerShellV1::layer_top);
|
||||
shellSurface->set_anchor(Test::LayerSurfaceV1::anchor_bottom);
|
||||
shellSurface->set_size(100, 50);
|
||||
shellSurface->set_exclusive_edge(Test::LayerSurfaceV1::anchor_bottom);
|
||||
shellSurface->set_exclusive_zone(50);
|
||||
surface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
|
||||
// Wait for the compositor to position the layer surface.
|
||||
QSignalSpy configureRequestedSpy(shellSurface.get(), &Test::LayerSurfaceV1::configureRequested);
|
||||
QVERIFY(configureRequestedSpy.wait());
|
||||
shellSurface->ack_configure(configureRequestedSpy.last().at(0).toUInt());
|
||||
Window *window = Test::renderAndWaitForShown(surface.get(), configureRequestedSpy.last().at(1).toSize(), Qt::red);
|
||||
QVERIFY(window);
|
||||
QCOMPARE(workspace()->clientArea(PlacementArea, window), output->geometry().adjusted(0, 0, 0, -50));
|
||||
|
||||
// Move the output 100px down.
|
||||
OutputConfiguration config1;
|
||||
{
|
||||
auto changeSet = config1.changeSet(output);
|
||||
changeSet->pos = output->geometry().topLeft() + QPoint(0, 100);
|
||||
}
|
||||
workspace()->applyOutputConfiguration(config1);
|
||||
QCOMPARE(workspace()->clientArea(PlacementArea, window), output->geometry().adjusted(0, 0, 0, -50));
|
||||
|
||||
// Move the output back to its original position.
|
||||
OutputConfiguration config2;
|
||||
{
|
||||
auto changeSet = config2.changeSet(output);
|
||||
changeSet->pos = output->geometry().topLeft() - QPoint(0, 100);
|
||||
}
|
||||
workspace()->applyOutputConfiguration(config2);
|
||||
QCOMPARE(workspace()->clientArea(PlacementArea, window), output->geometry().adjusted(0, 0, 0, -50));
|
||||
|
||||
// Destroy the window.
|
||||
shellSurface.reset();
|
||||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
}
|
||||
|
||||
void LayerShellV1WindowTest::testFill_data()
|
||||
{
|
||||
QTest::addColumn<int>("anchor");
|
||||
|
@ -672,10 +745,18 @@ void LayerShellV1WindowTest::testUnmap()
|
|||
QVERIFY(Test::waitForWindowClosed(window));
|
||||
}
|
||||
|
||||
void LayerShellV1WindowTest::testScreenEdge_data()
|
||||
{
|
||||
QTest::addColumn<QMargins>("margins");
|
||||
|
||||
QTest::addRow("normal") << QMargins(0, 0, 0, 0);
|
||||
QTest::addRow("with margin") << QMargins(0, 0, 0, 10);
|
||||
}
|
||||
|
||||
void LayerShellV1WindowTest::testScreenEdge()
|
||||
{
|
||||
auto config = kwinApp()->config();
|
||||
config->group(QStringLiteral("Windows")).writeEntry("ElectricBorderDelay", 150);
|
||||
config->group(QStringLiteral("Windows")).writeEntry("ElectricBorderDelay", 75);
|
||||
config->sync();
|
||||
workspace()->slotReconfigure();
|
||||
|
||||
|
@ -685,9 +766,11 @@ void LayerShellV1WindowTest::testScreenEdge()
|
|||
std::unique_ptr<Test::AutoHideScreenEdgeV1> screenEdge(Test::createAutoHideScreenEdgeV1(surface.get(), Test::ScreenEdgeManagerV1::border_bottom));
|
||||
|
||||
// Set the initial state of the layer surface.
|
||||
QFETCH(QMargins, margins);
|
||||
shellSurface->set_layer(Test::LayerShellV1::layer_top);
|
||||
shellSurface->set_anchor(Test::LayerSurfaceV1::anchor_bottom);
|
||||
shellSurface->set_size(100, 50);
|
||||
shellSurface->set_margin(margins.top(), margins.right(), margins.bottom(), margins.left());
|
||||
surface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
|
||||
// Wait for the compositor to position the surface.
|
||||
|
|
|
@ -223,7 +223,7 @@ void LockScreenTest::testStackingOrder()
|
|||
Window *window = windowAddedSpy.first().first().value<Window *>();
|
||||
QVERIFY(window);
|
||||
QVERIFY(window->isLockScreen());
|
||||
QCOMPARE(window->layer(), UnmanagedLayer);
|
||||
QCOMPARE(window->layer(), OverlayLayer);
|
||||
|
||||
UNLOCK;
|
||||
}
|
||||
|
|
|
@ -266,14 +266,14 @@ void ModifierOnlyShortcutTest::testCapsLock()
|
|||
// now capslock
|
||||
Test::keyboardKeyPressed(KEY_CAPSLOCK, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_CAPSLOCK, timestamp++);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::ShiftModifier);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::NoModifier);
|
||||
QCOMPARE(triggeredSpy.count(), 1);
|
||||
|
||||
// currently caps lock is on
|
||||
// shift still triggers
|
||||
Test::keyboardKeyPressed(modifier, timestamp++);
|
||||
Test::keyboardKeyReleased(modifier, timestamp++);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::ShiftModifier);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::NoModifier);
|
||||
QCOMPARE(triggeredSpy.count(), 2);
|
||||
|
||||
// meta should also trigger
|
||||
|
@ -284,7 +284,7 @@ void ModifierOnlyShortcutTest::testCapsLock()
|
|||
group.sync();
|
||||
workspace()->slotReconfigure();
|
||||
Test::keyboardKeyPressed(KEY_LEFTMETA, timestamp++);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::ShiftModifier | Qt::MetaModifier);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::MetaModifier);
|
||||
QCOMPARE(input()->keyboard()->xkb()->modifiersRelevantForGlobalShortcuts(), Qt::MetaModifier);
|
||||
Test::keyboardKeyReleased(KEY_LEFTMETA, timestamp++);
|
||||
QCOMPARE(triggeredSpy.count(), 3);
|
||||
|
|
|
@ -576,7 +576,7 @@ void MoveResizeWindowTest::testNetMove()
|
|||
|
||||
// use NETRootInfo to trigger a move request
|
||||
NETRootInfo root(c.get(), NET::Properties());
|
||||
root.moveResizeRequest(windowId, origGeo.center().x(), origGeo.center().y(), NET::Move);
|
||||
root.moveResizeRequest(windowId, origGeo.center().x(), origGeo.center().y(), NET::Move, XCB_BUTTON_INDEX_1);
|
||||
xcb_flush(c.get());
|
||||
|
||||
QVERIFY(interactiveMoveResizeStartedSpy.wait());
|
||||
|
@ -591,7 +591,7 @@ void MoveResizeWindowTest::testNetMove()
|
|||
QCOMPARE(interactiveMoveResizeSteppedSpy.first().last(), origGeo.translated(10, 10));
|
||||
|
||||
// let's cancel the move resize again through the net API
|
||||
root.moveResizeRequest(windowId, window->frameGeometry().center().x(), window->frameGeometry().center().y(), NET::MoveResizeCancel);
|
||||
root.moveResizeRequest(windowId, window->frameGeometry().center().x(), window->frameGeometry().center().y(), NET::MoveResizeCancel, XCB_BUTTON_INDEX_1);
|
||||
xcb_flush(c.get());
|
||||
QVERIFY(interactiveMoveResizeFinishedSpy.wait());
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "core/outputbackend.h"
|
||||
#include "core/outputconfiguration.h"
|
||||
#include "pointer_input.h"
|
||||
#include "tiles/tilemanager.h"
|
||||
#include "wayland_server.h"
|
||||
#include "window.h"
|
||||
#include "workspace.h"
|
||||
|
@ -41,8 +42,15 @@ private Q_SLOTS:
|
|||
void testWindowRestoredAfterEnablingOutput();
|
||||
void testMaximizedWindowRestoredAfterEnablingOutput();
|
||||
void testFullScreenWindowRestoredAfterEnablingOutput();
|
||||
void testQuickTiledWindowRestoredAfterEnablingOutput();
|
||||
void testCustomTiledWindowRestoredAfterEnablingOutput_data();
|
||||
void testCustomTiledWindowRestoredAfterEnablingOutput();
|
||||
void testWindowRestoredAfterChangingScale();
|
||||
void testMaximizeStateRestoredAfterEnablingOutput_data();
|
||||
void testMaximizeStateRestoredAfterEnablingOutput();
|
||||
void testInvalidGeometryRestoreAfterEnablingOutput();
|
||||
void testMaximizedWindowDoesntDisappear_data();
|
||||
void testMaximizedWindowDoesntDisappear();
|
||||
|
||||
void testWindowNotRestoredAfterMovingWindowAndEnablingOutput();
|
||||
void testLaptopLidClosed();
|
||||
|
@ -458,6 +466,177 @@ void OutputChangesTest::testFullScreenWindowRestoredAfterEnablingOutput()
|
|||
QCOMPARE(window->fullscreenGeometryRestore(), QRectF(1280 + 50, 100, 100, 50));
|
||||
}
|
||||
|
||||
void OutputChangesTest::testQuickTiledWindowRestoredAfterEnablingOutput()
|
||||
{
|
||||
// This test verifies that a quick tiled window will be moved to
|
||||
// its original output and tile when the output is re-enabled
|
||||
|
||||
const auto outputs = kwinApp()->outputBackend()->outputs();
|
||||
|
||||
// Create a window.
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
|
||||
auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
|
||||
QVERIFY(window);
|
||||
|
||||
// kwin will send a configure event with the actived state.
|
||||
QSignalSpy toplevelConfigureRequestedSpy(shellSurface.get(), &Test::XdgToplevel::configureRequested);
|
||||
QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
|
||||
// Move the window to the right monitor and tile it to the right.
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
window->move(QPointF(1280 + 50, 100));
|
||||
window->setQuickTileMode(QuickTileFlag::Right, true);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), QSize(1280 / 2, 1024));
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), QSize(1280 / 2, 1024), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
const QRectF rightQuickTileGeom = QRectF(1280 + 1280 / 2, 0, 1280 / 2, 1024);
|
||||
QCOMPARE(window->frameGeometry(), rightQuickTileGeom);
|
||||
QCOMPARE(window->moveResizeGeometry(), rightQuickTileGeom);
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->quickTileMode(), QuickTileFlag::Right);
|
||||
QCOMPARE(window->geometryRestore(), QRectF(1280 + 50, 100, 100, 50));
|
||||
|
||||
// Disable the right output.
|
||||
OutputConfiguration config1;
|
||||
{
|
||||
auto changeSet = config1.changeSet(outputs[1]);
|
||||
changeSet->enabled = false;
|
||||
}
|
||||
workspace()->applyOutputConfiguration(config1);
|
||||
|
||||
// The window will be moved to the left monitor
|
||||
QCOMPARE(window->output(), outputs[0]);
|
||||
|
||||
// Enable the right monitor again
|
||||
OutputConfiguration config2;
|
||||
{
|
||||
auto changeSet = config2.changeSet(outputs[1]);
|
||||
changeSet->enabled = true;
|
||||
}
|
||||
workspace()->applyOutputConfiguration(config2);
|
||||
|
||||
// The window will be moved back to the right monitor, and put in the correct tile
|
||||
QCOMPARE(window->frameGeometry(), rightQuickTileGeom);
|
||||
QCOMPARE(window->moveResizeGeometry(), rightQuickTileGeom);
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->quickTileMode(), QuickTileFlag::Right);
|
||||
QCOMPARE(window->geometryRestore(), QRectF(1280 + 50, 100, 100, 50));
|
||||
}
|
||||
|
||||
void OutputChangesTest::testCustomTiledWindowRestoredAfterEnablingOutput_data()
|
||||
{
|
||||
const auto outputs = kwinApp()->outputBackend()->outputs();
|
||||
const size_t tileCount = workspace()->tileManager(outputs[1])->rootTile()->childTiles().size();
|
||||
|
||||
QTest::addColumn<size_t>("tileIndex");
|
||||
for (size_t i = 0; i < tileCount; i++) {
|
||||
QTest::addRow("tile %lu", i) << i;
|
||||
}
|
||||
}
|
||||
|
||||
void OutputChangesTest::testCustomTiledWindowRestoredAfterEnablingOutput()
|
||||
{
|
||||
// This test verifies that a custom tiled window will be moved to
|
||||
// its original output and tile when the output is re-enabled
|
||||
|
||||
const auto outputs = kwinApp()->outputBackend()->outputs();
|
||||
|
||||
// start with only one output
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = false;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// Create a window.
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
|
||||
const auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
|
||||
QVERIFY(window);
|
||||
|
||||
// kwin will send a configure event with the actived state.
|
||||
QSignalSpy toplevelConfigureRequestedSpy(shellSurface.get(), &Test::XdgToplevel::configureRequested);
|
||||
QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
|
||||
const QRectF originalGeometry = window->moveResizeGeometry();
|
||||
|
||||
// Enable the right output
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = true;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
QFETCH(size_t, tileIndex);
|
||||
const QRectF customTileGeom = workspace()->tileManager(outputs[1])->rootTile()->childTiles()[tileIndex]->windowGeometry();
|
||||
|
||||
// Move the window to the right monitor and put it in the middle tile.
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
window->move(customTileGeom.topLeft() + QPointF(50, 50));
|
||||
const auto geomBeforeTiling = window->moveResizeGeometry();
|
||||
window->setQuickTileMode(QuickTileFlag::Custom, true);
|
||||
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), customTileGeom.size().toSize());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), customTileGeom.size().toSize(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
QCOMPARE(window->frameGeometry(), customTileGeom);
|
||||
QCOMPARE(window->moveResizeGeometry(), customTileGeom);
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->quickTileMode(), QuickTileFlag::Custom);
|
||||
QCOMPARE(window->geometryRestore(), geomBeforeTiling);
|
||||
|
||||
// Disable the right output.
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = false;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// The window will be moved to the left monitor, and the original geometry restored
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), originalGeometry.size().toSize());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), originalGeometry.size().toSize(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
QCOMPARE(window->frameGeometry(), originalGeometry);
|
||||
QCOMPARE(window->moveResizeGeometry(), originalGeometry);
|
||||
QCOMPARE(window->output(), outputs[0]);
|
||||
QCOMPARE(window->quickTileMode(), QuickTileFlag::None);
|
||||
|
||||
// Enable the right monitor again
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = true;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// The window will be moved back to the right monitor, and put in the correct tile
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), customTileGeom.size().toSize());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), customTileGeom.size().toSize(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
QCOMPARE(window->frameGeometry(), customTileGeom);
|
||||
QCOMPARE(window->moveResizeGeometry(), customTileGeom);
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->quickTileMode(), QuickTileFlag::Custom);
|
||||
QCOMPARE(window->geometryRestore(), geomBeforeTiling);
|
||||
}
|
||||
|
||||
void OutputChangesTest::testWindowRestoredAfterChangingScale()
|
||||
{
|
||||
// This test verifies that a window will be moved to its original position after changing the scale of an output
|
||||
|
@ -501,11 +680,21 @@ void OutputChangesTest::testWindowRestoredAfterChangingScale()
|
|||
QCOMPARE(window->output(), output);
|
||||
}
|
||||
|
||||
void OutputChangesTest::testMaximizeStateRestoredAfterEnablingOutput_data()
|
||||
{
|
||||
QTest::addColumn<MaximizeMode>("maximizeMode");
|
||||
QTest::addRow("Vertical Maximization") << MaximizeMode::MaximizeVertical;
|
||||
QTest::addRow("Horizontal Maximization") << MaximizeMode::MaximizeHorizontal;
|
||||
QTest::addRow("Full Maximization") << MaximizeMode::MaximizeFull;
|
||||
}
|
||||
|
||||
void OutputChangesTest::testMaximizeStateRestoredAfterEnablingOutput()
|
||||
{
|
||||
// This test verifies that the window state will get restored after disabling and enabling an output,
|
||||
// even if its maximize state changed in the process
|
||||
|
||||
QFETCH(MaximizeMode, maximizeMode);
|
||||
|
||||
const auto outputs = kwinApp()->outputBackend()->outputs();
|
||||
|
||||
// Disable the right output
|
||||
|
@ -540,17 +729,16 @@ void OutputChangesTest::testMaximizeStateRestoredAfterEnablingOutput()
|
|||
// Move the window to the right monitor and make it maximized.
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
window->move(QPointF(1280 + 50, 100));
|
||||
window->maximize(MaximizeFull);
|
||||
window->maximize(maximizeMode);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), QSize(1280, 1024));
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), QSize(1280, 1024), Qt::blue);
|
||||
Test::render(surface.get(), toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->frameGeometry(), QRectF(1280, 0, 1280, 1024));
|
||||
QCOMPARE(window->moveResizeGeometry(), QRectF(1280, 0, 1280, 1024));
|
||||
const auto maximizedGeometry = window->moveResizeGeometry();
|
||||
QCOMPARE(window->frameGeometry(), maximizedGeometry);
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->maximizeMode(), MaximizeFull);
|
||||
QCOMPARE(window->requestedMaximizeMode(), MaximizeFull);
|
||||
QCOMPARE(window->maximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->requestedMaximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->geometryRestore(), QRectF(1280 + 50, 100, 100, 50));
|
||||
|
||||
// Disable the right output
|
||||
|
@ -581,23 +769,199 @@ void OutputChangesTest::testMaximizeStateRestoredAfterEnablingOutput()
|
|||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// The window will be moved back to the right monitor, maximized and the geometry restore will be updated
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), maximizedGeometry.size());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->frameGeometry(), maximizedGeometry);
|
||||
QCOMPARE(window->moveResizeGeometry(), maximizedGeometry);
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->maximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->requestedMaximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->geometryRestore(), QRectF(1280 + 50, 100, 100, 50));
|
||||
}
|
||||
|
||||
void OutputChangesTest::testInvalidGeometryRestoreAfterEnablingOutput()
|
||||
{
|
||||
// This test verifies that the geometry restore gets restore correctly, even if it's invalid
|
||||
|
||||
const auto outputs = kwinApp()->outputBackend()->outputs();
|
||||
|
||||
// Disable the right output
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = false;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// Create a window.
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get(), Test::CreationSetup::CreateOnly));
|
||||
shellSurface->set_maximized();
|
||||
{
|
||||
QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
|
||||
shellSurface->xdgSurface()->surface()->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().first().toUInt());
|
||||
}
|
||||
auto window = Test::renderAndWaitForShown(surface.get(), QSize(1280, 1024), Qt::blue);
|
||||
QVERIFY(window);
|
||||
QCOMPARE(window->maximizeMode(), MaximizeFull);
|
||||
|
||||
const QRectF originalGeometry = window->moveResizeGeometry();
|
||||
const QRectF originalGeometryRestore = window->geometryRestore();
|
||||
|
||||
// Enable the right output
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = true;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// Move the window to the right monitor
|
||||
window->sendToOutput(outputs[1]);
|
||||
surface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
QCOMPARE(window->frameGeometry(), QRectF(1280, 0, 1280, 1024));
|
||||
QCOMPARE(window->moveResizeGeometry(), QRectF(1280, 0, 1280, 1024));
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->requestedMaximizeMode(), MaximizeFull);
|
||||
QVERIFY(outputs[1]->geometry().contains(window->geometryRestore().topLeft().toPoint()));
|
||||
QCOMPARE(window->geometryRestore().size(), QSizeF(0, 0));
|
||||
|
||||
const QRectF rightGeometryRestore = window->geometryRestore();
|
||||
|
||||
// Disable the right output
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = false;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
QSignalSpy toplevelConfigureRequestedSpy(shellSurface.get(), &Test::XdgToplevel::configureRequested);
|
||||
QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
|
||||
// The window will be moved to its prior position on the left monitor, and still maximized
|
||||
QCOMPARE(window->frameGeometry(), originalGeometry);
|
||||
QCOMPARE(window->moveResizeGeometry(), originalGeometry);
|
||||
QCOMPARE(window->output(), outputs[0]);
|
||||
QCOMPARE(window->maximizeMode(), MaximizeFull);
|
||||
QCOMPARE(window->requestedMaximizeMode(), MaximizeFull);
|
||||
QVERIFY(outputs[0]->geometry().contains(window->geometryRestore().topLeft().toPoint()));
|
||||
QCOMPARE(window->geometryRestore(), originalGeometryRestore);
|
||||
|
||||
// Enable the right output again
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = true;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// The window will be moved back to the right monitor, maximized and the geometry restore will be updated
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), outputs[1]->geometry().size());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), outputs[1]->geometry().size(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->frameGeometry(), QRectF(1280, 0, 1280, 1024));
|
||||
QCOMPARE(window->moveResizeGeometry(), QRectF(1280, 0, 1280, 1024));
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
QCOMPARE(window->maximizeMode(), MaximizeFull);
|
||||
QCOMPARE(window->requestedMaximizeMode(), MaximizeFull);
|
||||
QCOMPARE(window->geometryRestore(), QRectF(1280 + 50, 100, 100, 50));
|
||||
QCOMPARE(window->geometryRestore(), rightGeometryRestore);
|
||||
}
|
||||
|
||||
void OutputChangesTest::testMaximizedWindowDoesntDisappear_data()
|
||||
{
|
||||
QTest::addColumn<MaximizeMode>("maximizeMode");
|
||||
QTest::addRow("Vertical Maximization") << MaximizeMode::MaximizeVertical;
|
||||
QTest::addRow("Horizontal Maximization") << MaximizeMode::MaximizeHorizontal;
|
||||
QTest::addRow("Full Maximization") << MaximizeMode::MaximizeFull;
|
||||
}
|
||||
|
||||
void OutputChangesTest::testMaximizedWindowDoesntDisappear()
|
||||
{
|
||||
// This test verifies that (vertically, horizontally) maximized windows don't get placed out of the screen
|
||||
// when the output they're on gets disabled or removed
|
||||
|
||||
Test::setOutputConfig({
|
||||
Test::OutputInfo{
|
||||
.geometry = QRect(5120 / 3, 1440, 2256 / 1.3, 1504 / 1.3),
|
||||
.scale = 1.3,
|
||||
.internal = true,
|
||||
},
|
||||
Test::OutputInfo{
|
||||
.geometry = QRect(0, 0, 5120, 1440),
|
||||
.scale = 1,
|
||||
.internal = false,
|
||||
},
|
||||
});
|
||||
const auto outputs = kwinApp()->outputBackend()->outputs();
|
||||
QFETCH(MaximizeMode, maximizeMode);
|
||||
|
||||
workspace()->setActiveOutput(outputs[1]);
|
||||
|
||||
// Create a window.
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
|
||||
auto window = Test::renderAndWaitForShown(surface.get(), QSize(500, 300), Qt::blue);
|
||||
QVERIFY(window);
|
||||
|
||||
// kwin will send a configure event with the actived state.
|
||||
QSignalSpy toplevelConfigureRequestedSpy(shellSurface.get(), &Test::XdgToplevel::configureRequested);
|
||||
QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
|
||||
window->move(outputs[1]->geometry().topLeft() + QPoint(3500, 500));
|
||||
const QRectF originalGeometry = window->frameGeometry();
|
||||
QVERIFY(outputs[1]->geometryF().contains(originalGeometry));
|
||||
|
||||
// vertically maximize the window
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
window->maximize(maximizeMode);
|
||||
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
QCOMPARE(window->output(), outputs[1]);
|
||||
const auto maximizedGeometry = window->moveResizeGeometry();
|
||||
QCOMPARE(window->frameGeometry(), maximizedGeometry);
|
||||
QCOMPARE(window->maximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->requestedMaximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->geometryRestore(), originalGeometry);
|
||||
|
||||
// Disable the top output
|
||||
{
|
||||
OutputConfiguration config;
|
||||
auto changeSet0 = config.changeSet(outputs[0]);
|
||||
changeSet0->pos = QPoint(0, 0);
|
||||
auto changeSet = config.changeSet(outputs[1]);
|
||||
changeSet->enabled = false;
|
||||
workspace()->applyOutputConfiguration(config);
|
||||
}
|
||||
|
||||
// The window should be moved to the left output
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), toplevelConfigureRequestedSpy.last().at(0).value<QSize>(), Qt::blue);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
QCOMPARE(window->output(), outputs[0]);
|
||||
QVERIFY(outputs[0]->geometryF().contains(window->frameGeometry()));
|
||||
QVERIFY(outputs[0]->geometryF().contains(window->moveResizeGeometry()));
|
||||
QCOMPARE(window->maximizeMode(), maximizeMode);
|
||||
QCOMPARE(window->requestedMaximizeMode(), maximizeMode);
|
||||
}
|
||||
|
||||
void OutputChangesTest::testLaptopLidClosed()
|
||||
{
|
||||
QSKIP("Laptop lid handling is disabled until config writing is moved into KWin");
|
||||
Test::setOutputConfig({
|
||||
Test::OutputInfo{
|
||||
.geometry = QRect(0, 0, 1280, 1024),
|
||||
|
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
SPDX-FileContributor: Jan Grulich <jgrulich@redhat.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include "pipewirecore_p.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QSocketNotifier>
|
||||
#include <QThread>
|
||||
#include <QThreadStorage>
|
||||
#include <mutex>
|
||||
#include <spa/utils/result.h>
|
||||
|
||||
pw_core_events PipeWireCore::s_pwCoreEvents = {
|
||||
.version = PW_VERSION_CORE_EVENTS,
|
||||
.info = &PipeWireCore::onCoreInfo,
|
||||
.done = nullptr,
|
||||
.ping = nullptr,
|
||||
.error = &PipeWireCore::onCoreError,
|
||||
.remove_id = nullptr,
|
||||
.bound_id = nullptr,
|
||||
.add_mem = nullptr,
|
||||
.remove_mem = nullptr,
|
||||
};
|
||||
|
||||
PipeWireCore::PipeWireCore()
|
||||
{
|
||||
static std::once_flag pwInitOnce;
|
||||
std::call_once(pwInitOnce, [] {
|
||||
pw_init(nullptr, nullptr);
|
||||
});
|
||||
}
|
||||
|
||||
void PipeWireCore::onCoreError(void *data, uint32_t id, int seq, int res, const char *message)
|
||||
{
|
||||
Q_UNUSED(seq)
|
||||
|
||||
qWarning() << "PipeWire remote error: " << res << message;
|
||||
if (id == PW_ID_CORE) {
|
||||
PipeWireCore *pw = static_cast<PipeWireCore *>(data);
|
||||
Q_EMIT pw->pipewireFailed(QString::fromUtf8(message));
|
||||
|
||||
if (res == -EPIPE) {
|
||||
// Broken pipe, need reconnecting
|
||||
if (pw->m_pwCore) {
|
||||
Q_EMIT pw->pipeBroken();
|
||||
spa_hook_remove(&pw->m_coreListener);
|
||||
pw_core_disconnect(pw->m_pwCore);
|
||||
pw->init_core();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PipeWireCore::onCoreInfo(void *data, const struct pw_core_info *info)
|
||||
{
|
||||
PipeWireCore *pw = static_cast<PipeWireCore *>(data);
|
||||
pw->m_serverVersion = QVersionNumber::fromString(QString::fromUtf8(info->version));
|
||||
}
|
||||
|
||||
PipeWireCore::~PipeWireCore()
|
||||
{
|
||||
if (m_pwMainLoop) {
|
||||
pw_loop_leave(m_pwMainLoop);
|
||||
}
|
||||
|
||||
if (m_pwCore) {
|
||||
pw_core_disconnect(m_pwCore);
|
||||
}
|
||||
|
||||
if (m_pwContext) {
|
||||
pw_context_destroy(m_pwContext);
|
||||
}
|
||||
|
||||
if (m_pwMainLoop) {
|
||||
pw_loop_destroy(m_pwMainLoop);
|
||||
}
|
||||
}
|
||||
|
||||
bool PipeWireCore::init(int fd)
|
||||
{
|
||||
m_pwMainLoop = pw_loop_new(nullptr);
|
||||
pw_loop_enter(m_pwMainLoop);
|
||||
|
||||
QSocketNotifier *notifier = new QSocketNotifier(pw_loop_get_fd(m_pwMainLoop), QSocketNotifier::Read, this);
|
||||
connect(notifier, &QSocketNotifier::activated, this, [this] {
|
||||
int result = pw_loop_iterate(m_pwMainLoop, 0);
|
||||
if (result < 0)
|
||||
qWarning() << "pipewire_loop_iterate failed: " << spa_strerror(result);
|
||||
});
|
||||
|
||||
m_pwContext = pw_context_new(m_pwMainLoop, nullptr, 0);
|
||||
if (!m_pwContext) {
|
||||
qWarning() << "Failed to create PipeWire context";
|
||||
m_error = QStringLiteral("Failed to create PipeWire context");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_fd = fd;
|
||||
|
||||
return init_core();
|
||||
}
|
||||
|
||||
bool PipeWireCore::init_core()
|
||||
{
|
||||
if (m_fd > 0) {
|
||||
m_pwCore = pw_context_connect_fd(m_pwContext, m_fd, nullptr, 0);
|
||||
} else {
|
||||
m_pwCore = pw_context_connect(m_pwContext, nullptr, 0);
|
||||
}
|
||||
if (!m_pwCore) {
|
||||
m_error = QStringLiteral("Failed to connect to PipeWire");
|
||||
qWarning() << "error:" << m_error << m_fd;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (pw_loop_iterate(m_pwMainLoop, 0) < 0) {
|
||||
qWarning() << "Failed to start main PipeWire loop";
|
||||
m_error = QStringLiteral("Failed to start main PipeWire loop");
|
||||
return false;
|
||||
}
|
||||
|
||||
pw_core_add_listener(m_pwCore, &m_coreListener, &s_pwCoreEvents, this);
|
||||
return true;
|
||||
}
|
||||
|
||||
QSharedPointer<PipeWireCore> PipeWireCore::fetch(int fd)
|
||||
{
|
||||
static QThreadStorage<QHash<int, QWeakPointer<PipeWireCore>>> global;
|
||||
QSharedPointer<PipeWireCore> ret = global.localData().value(fd).toStrongRef();
|
||||
if (!ret) {
|
||||
ret.reset(new PipeWireCore);
|
||||
if (ret->init(fd)) {
|
||||
global.localData().insert(fd, ret);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
QString PipeWireCore::error() const
|
||||
{
|
||||
return m_error;
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
SPDX-FileContributor: Jan Grulich <jgrulich@redhat.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QVersionNumber>
|
||||
#include <pipewire/pipewire.h>
|
||||
|
||||
class PipeWireCore : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
PipeWireCore();
|
||||
|
||||
static void onCoreError(void *data, uint32_t id, int seq, int res, const char *message);
|
||||
static void onCoreInfo(void *data, const struct pw_core_info *info);
|
||||
|
||||
~PipeWireCore();
|
||||
|
||||
bool init(int fd);
|
||||
bool init_core();
|
||||
QString error() const;
|
||||
QVersionNumber serverVersion() const
|
||||
{
|
||||
return m_serverVersion;
|
||||
}
|
||||
|
||||
pw_loop *loop() const
|
||||
{
|
||||
return m_pwMainLoop;
|
||||
}
|
||||
|
||||
pw_core *operator*() const
|
||||
{
|
||||
return m_pwCore;
|
||||
};
|
||||
static QSharedPointer<PipeWireCore> fetch(int fd);
|
||||
|
||||
private:
|
||||
int m_fd = 0;
|
||||
pw_core *m_pwCore = nullptr;
|
||||
pw_context *m_pwContext = nullptr;
|
||||
pw_loop *m_pwMainLoop = nullptr;
|
||||
spa_hook m_coreListener;
|
||||
QString m_error;
|
||||
QVersionNumber m_serverVersion;
|
||||
|
||||
static pw_core_events s_pwCoreEvents;
|
||||
|
||||
Q_SIGNALS:
|
||||
void pipewireFailed(const QString &message);
|
||||
|
||||
/**
|
||||
* Clients should disconnect from the core and reconnect to it on receiving this signal
|
||||
*/
|
||||
void pipeBroken();
|
||||
};
|
|
@ -0,0 +1,643 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2018-2020 Red Hat Inc
|
||||
SPDX-FileCopyrightText: 2020-2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
SPDX-FileContributor: Jan Grulich <jgrulich@redhat.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include <epoxy/egl.h>
|
||||
|
||||
#include "pipewirecore_p.h"
|
||||
#include "pipewiresourcestream.h"
|
||||
|
||||
#include <libdrm/drm_fourcc.h>
|
||||
#include <spa/utils/result.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QOpenGLTexture>
|
||||
#include <QSocketNotifier>
|
||||
#include <QThread>
|
||||
#include <QVersionNumber>
|
||||
#include <qpa/qplatformnativeinterface.h>
|
||||
|
||||
#undef Status
|
||||
|
||||
#if !PW_CHECK_VERSION(0, 3, 29)
|
||||
#define SPA_POD_PROP_FLAG_MANDATORY (1u << 3)
|
||||
#endif
|
||||
#if !PW_CHECK_VERSION(0, 3, 33)
|
||||
#define SPA_POD_PROP_FLAG_DONT_FIXATE (1u << 4)
|
||||
#endif
|
||||
|
||||
#define CURSOR_BPP 4
|
||||
#define CURSOR_META_SIZE(w, h) (sizeof(struct spa_meta_cursor) + sizeof(struct spa_meta_bitmap) + w * h * CURSOR_BPP)
|
||||
|
||||
pw_stream_events pwStreamEvents = {};
|
||||
|
||||
static QImage SpaBufferToQImage(const uchar *data, int width, int height, qsizetype bytesPerLine, spa_video_format format)
|
||||
{
|
||||
switch (format) {
|
||||
case SPA_VIDEO_FORMAT_BGRx:
|
||||
case SPA_VIDEO_FORMAT_BGRA:
|
||||
case SPA_VIDEO_FORMAT_xBGR:
|
||||
case SPA_VIDEO_FORMAT_ABGR: {
|
||||
// This is needed because QImage does not support BGRA
|
||||
// This is obviously a much slower path, it makes sense to avoid it as much as possible
|
||||
return QImage(data, width, height, bytesPerLine, SpaToQImageFormat(format)).rgbSwapped();
|
||||
}
|
||||
case SPA_VIDEO_FORMAT_BGR:
|
||||
case SPA_VIDEO_FORMAT_RGBx:
|
||||
case SPA_VIDEO_FORMAT_RGB:
|
||||
case SPA_VIDEO_FORMAT_RGBA:
|
||||
default:
|
||||
return QImage(data, width, height, bytesPerLine, SpaToQImageFormat(format));
|
||||
}
|
||||
}
|
||||
|
||||
QImage::Format SpaToQImageFormat(quint32 format)
|
||||
{
|
||||
switch (format) {
|
||||
case SPA_VIDEO_FORMAT_BGRx:
|
||||
case SPA_VIDEO_FORMAT_BGRA:
|
||||
return QImage::Format_RGBA8888_Premultiplied; // Handled in SpaBufferToQImage
|
||||
case SPA_VIDEO_FORMAT_ABGR:
|
||||
case SPA_VIDEO_FORMAT_xBGR:
|
||||
return QImage::Format_ARGB32; // Handled in SpaBufferToQImage
|
||||
case SPA_VIDEO_FORMAT_BGR:
|
||||
return QImage::Format_BGR888;
|
||||
case SPA_VIDEO_FORMAT_RGBx:
|
||||
return QImage::Format_RGBX8888;
|
||||
case SPA_VIDEO_FORMAT_RGB:
|
||||
return QImage::Format_RGB888;
|
||||
case SPA_VIDEO_FORMAT_RGBA:
|
||||
return QImage::Format_RGBA8888_Premultiplied;
|
||||
default:
|
||||
qWarning() << "cannot convert spa format to QImage" << format;
|
||||
return QImage::Format_RGB32;
|
||||
}
|
||||
}
|
||||
|
||||
struct PipeWireSourceStreamPrivate
|
||||
{
|
||||
QSharedPointer<PipeWireCore> pwCore;
|
||||
pw_stream *pwStream = nullptr;
|
||||
spa_hook streamListener;
|
||||
|
||||
uint32_t pwNodeId = 0;
|
||||
std::optional<std::chrono::nanoseconds> m_currentPresentationTimestamp;
|
||||
|
||||
QAtomicInt m_stopped = false;
|
||||
pw_stream_state m_state = PW_STREAM_STATE_UNCONNECTED;
|
||||
|
||||
spa_video_info_raw videoFormat;
|
||||
QString m_error;
|
||||
bool m_allowDmaBuf = true;
|
||||
bool m_usingDmaBuf = false;
|
||||
|
||||
QHash<spa_video_format, QList<uint64_t>> m_availableModifiers;
|
||||
spa_source *m_renegotiateEvent = nullptr;
|
||||
|
||||
bool m_withDamage = false;
|
||||
Fraction maxFramerate;
|
||||
};
|
||||
|
||||
static const QVersionNumber pwClientVersion = QVersionNumber::fromString(QString::fromUtf8(pw_get_library_version()));
|
||||
static const QVersionNumber kDmaBufMinVersion = {0, 3, 24};
|
||||
static const QVersionNumber kDmaBufModifierMinVersion = {0, 3, 33};
|
||||
static const QVersionNumber kDropSingleModifierMinVersion = {0, 3, 40};
|
||||
|
||||
uint32_t PipeWireSourceStream::spaVideoFormatToDrmFormat(spa_video_format spa_format)
|
||||
{
|
||||
switch (spa_format) {
|
||||
case SPA_VIDEO_FORMAT_RGBA:
|
||||
return DRM_FORMAT_ABGR8888;
|
||||
case SPA_VIDEO_FORMAT_RGBx:
|
||||
return DRM_FORMAT_XBGR8888;
|
||||
case SPA_VIDEO_FORMAT_BGRA:
|
||||
return DRM_FORMAT_ARGB8888;
|
||||
case SPA_VIDEO_FORMAT_BGRx:
|
||||
return DRM_FORMAT_XRGB8888;
|
||||
case SPA_VIDEO_FORMAT_BGR:
|
||||
return DRM_FORMAT_BGR888;
|
||||
case SPA_VIDEO_FORMAT_RGB:
|
||||
return DRM_FORMAT_RGB888;
|
||||
case SPA_VIDEO_FORMAT_xBGR:
|
||||
return DRM_FORMAT_RGBX8888;
|
||||
case SPA_VIDEO_FORMAT_ABGR:
|
||||
return DRM_FORMAT_RGBA8888;
|
||||
default:
|
||||
qWarning() << "cannot convert spa format to fourcc" << spa_format;
|
||||
return DRM_FORMAT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
static QHash<spa_video_format, QList<uint64_t>> queryDmaBufModifiers(EGLDisplay display, const QList<spa_video_format> &formats)
|
||||
{
|
||||
QHash<spa_video_format, QList<uint64_t>> ret;
|
||||
ret.reserve(formats.size());
|
||||
const bool hasEglImageDmaBufImportExt = epoxy_has_egl_extension(display, "EGL_EXT_image_dma_buf_import");
|
||||
static auto eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)eglGetProcAddress("eglQueryDmaBufModifiersEXT");
|
||||
static auto eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC)eglGetProcAddress("eglQueryDmaBufFormatsEXT");
|
||||
|
||||
EGLint count = 0;
|
||||
EGLBoolean successFormats = eglQueryDmaBufFormatsEXT(display, 0, nullptr, &count);
|
||||
|
||||
QList<uint32_t> drmFormats(count);
|
||||
successFormats &= eglQueryDmaBufFormatsEXT(display, count, reinterpret_cast<EGLint *>(drmFormats.data()), &count);
|
||||
if (!successFormats)
|
||||
qWarning() << "Failed to query DMA-BUF formats.";
|
||||
|
||||
const QList<uint64_t> mods = hasEglImageDmaBufImportExt ? QList<uint64_t>{DRM_FORMAT_MOD_INVALID} : QList<uint64_t>{};
|
||||
if (!eglQueryDmaBufFormatsEXT || !eglQueryDmaBufModifiersEXT || !hasEglImageDmaBufImportExt || !successFormats) {
|
||||
for (spa_video_format format : formats) {
|
||||
ret[format] = mods;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (spa_video_format format : formats) {
|
||||
uint32_t drm_format = PipeWireSourceStream::spaVideoFormatToDrmFormat(format);
|
||||
if (drm_format == DRM_FORMAT_INVALID) {
|
||||
qDebug() << "Failed to find matching DRM format." << format;
|
||||
break;
|
||||
}
|
||||
|
||||
if (std::find(drmFormats.begin(), drmFormats.end(), drm_format) == drmFormats.end()) {
|
||||
qDebug() << "Format " << drm_format << " not supported for modifiers.";
|
||||
ret[format] = mods;
|
||||
break;
|
||||
}
|
||||
|
||||
successFormats = eglQueryDmaBufModifiersEXT(display, drm_format, 0, nullptr, nullptr, &count);
|
||||
if (!successFormats) {
|
||||
qWarning() << "Failed to query DMA-BUF modifier count.";
|
||||
ret[format] = mods;
|
||||
break;
|
||||
}
|
||||
|
||||
QList<uint64_t> modifiers(count);
|
||||
if (count > 0) {
|
||||
if (!eglQueryDmaBufModifiersEXT(display, drm_format, count, modifiers.data(), nullptr, &count)) {
|
||||
qWarning() << "Failed to query DMA-BUF modifiers.";
|
||||
}
|
||||
}
|
||||
|
||||
// Support modifier-less buffers
|
||||
modifiers.push_back(DRM_FORMAT_MOD_INVALID);
|
||||
ret[format] = modifiers;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::onStreamStateChanged(void *data, pw_stream_state old, pw_stream_state state, const char *error_message)
|
||||
{
|
||||
PipeWireSourceStream *pw = static_cast<PipeWireSourceStream *>(data);
|
||||
qDebug() << "state changed" << pw_stream_state_as_string(old) << "->" << pw_stream_state_as_string(state) << error_message;
|
||||
pw->d->m_state = state;
|
||||
Q_EMIT pw->stateChanged(state, old);
|
||||
|
||||
switch (state) {
|
||||
case PW_STREAM_STATE_ERROR:
|
||||
qWarning() << "Stream error: " << error_message;
|
||||
break;
|
||||
case PW_STREAM_STATE_PAUSED:
|
||||
Q_EMIT pw->streamReady();
|
||||
break;
|
||||
case PW_STREAM_STATE_STREAMING:
|
||||
Q_EMIT pw->startStreaming();
|
||||
break;
|
||||
case PW_STREAM_STATE_CONNECTING:
|
||||
break;
|
||||
case PW_STREAM_STATE_UNCONNECTED:
|
||||
if (!pw->d->m_stopped) {
|
||||
Q_EMIT pw->stopStreaming();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::onRenegotiate(void *data, uint64_t)
|
||||
{
|
||||
PipeWireSourceStream *pw = static_cast<PipeWireSourceStream *>(data);
|
||||
uint8_t buffer[4096];
|
||||
spa_pod_builder podBuilder = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
|
||||
auto params = pw->createFormatsParams(podBuilder);
|
||||
pw_stream_update_params(pw->d->pwStream, params.data(), params.size());
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::renegotiateModifierFailed(spa_video_format format, quint64 modifier)
|
||||
{
|
||||
if (d->pwCore->serverVersion() >= kDropSingleModifierMinVersion) {
|
||||
const int removed = d->m_availableModifiers[format].removeAll(modifier);
|
||||
if (removed == 0) {
|
||||
d->m_allowDmaBuf = false;
|
||||
}
|
||||
} else {
|
||||
d->m_allowDmaBuf = false;
|
||||
}
|
||||
qDebug() << "renegotiating, modifier didn't work" << format << modifier << "now only offering" << d->m_availableModifiers[format].count();
|
||||
pw_loop_signal_event(d->pwCore->loop(), d->m_renegotiateEvent);
|
||||
}
|
||||
|
||||
static spa_pod *
|
||||
buildFormat(spa_pod_builder *builder, spa_video_format format, const QList<uint64_t> &modifiers, bool withDontFixate, const Fraction &requestedMaxFramerate)
|
||||
{
|
||||
spa_pod_frame f[2];
|
||||
const spa_rectangle pw_min_screen_bounds{1, 1};
|
||||
const spa_rectangle pw_max_screen_bounds{UINT32_MAX, UINT32_MAX};
|
||||
|
||||
spa_pod_builder_push_object(builder, &f[0], SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat);
|
||||
spa_pod_builder_add(builder, SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video), 0);
|
||||
spa_pod_builder_add(builder, SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw), 0);
|
||||
spa_pod_builder_add(builder, SPA_FORMAT_VIDEO_format, SPA_POD_Id(format), 0);
|
||||
spa_pod_builder_add(builder, SPA_FORMAT_VIDEO_size, SPA_POD_CHOICE_RANGE_Rectangle(&pw_min_screen_bounds, &pw_min_screen_bounds, &pw_max_screen_bounds), 0);
|
||||
if (requestedMaxFramerate) {
|
||||
auto defFramerate = SPA_FRACTION(0, 1);
|
||||
auto minFramerate = SPA_FRACTION(1, 1);
|
||||
auto maxFramerate = SPA_FRACTION(requestedMaxFramerate.numerator, requestedMaxFramerate.denominator);
|
||||
spa_pod_builder_add(builder, SPA_FORMAT_VIDEO_framerate, SPA_POD_Fraction(&defFramerate), 0);
|
||||
spa_pod_builder_add(builder, SPA_FORMAT_VIDEO_maxFramerate, SPA_POD_CHOICE_RANGE_Fraction(&maxFramerate, &minFramerate, &maxFramerate), 0);
|
||||
}
|
||||
|
||||
if (modifiers.size() == 1 && modifiers[0] == DRM_FORMAT_MOD_INVALID) {
|
||||
// we only support implicit modifiers, use shortpath to skip fixation phase
|
||||
spa_pod_builder_prop(builder, SPA_FORMAT_VIDEO_modifier, SPA_POD_PROP_FLAG_MANDATORY);
|
||||
spa_pod_builder_long(builder, modifiers[0]);
|
||||
} else if (!modifiers.isEmpty()) {
|
||||
// SPA_POD_PROP_FLAG_DONT_FIXATE can be used with PipeWire >= 0.3.33
|
||||
if (withDontFixate) {
|
||||
spa_pod_builder_prop(builder, SPA_FORMAT_VIDEO_modifier, SPA_POD_PROP_FLAG_MANDATORY | SPA_POD_PROP_FLAG_DONT_FIXATE);
|
||||
} else {
|
||||
spa_pod_builder_prop(builder, SPA_FORMAT_VIDEO_modifier, SPA_POD_PROP_FLAG_MANDATORY);
|
||||
}
|
||||
spa_pod_builder_push_choice(builder, &f[1], SPA_CHOICE_Enum, 0);
|
||||
// mofifiers from the array
|
||||
for (auto it = modifiers.begin(); it != modifiers.end(); it++) {
|
||||
spa_pod_builder_long(builder, *it);
|
||||
if (it == modifiers.begin()) {
|
||||
spa_pod_builder_long(builder, *it);
|
||||
}
|
||||
}
|
||||
spa_pod_builder_pop(builder, &f[1]);
|
||||
}
|
||||
|
||||
return static_cast<spa_pod *>(spa_pod_builder_pop(builder, &f[0]));
|
||||
}
|
||||
|
||||
static const int videoDamageRegionCount = 16;
|
||||
|
||||
void PipeWireSourceStream::onStreamParamChanged(void *data, uint32_t id, const struct spa_pod *format)
|
||||
{
|
||||
if (!format || id != SPA_PARAM_Format) {
|
||||
return;
|
||||
}
|
||||
|
||||
PipeWireSourceStream *pw = static_cast<PipeWireSourceStream *>(data);
|
||||
spa_format_video_raw_parse(format, &pw->d->videoFormat);
|
||||
|
||||
uint8_t paramsBuffer[1024];
|
||||
spa_pod_builder pod_builder = SPA_POD_BUILDER_INIT(paramsBuffer, sizeof(paramsBuffer));
|
||||
|
||||
// When SPA_FORMAT_VIDEO_modifier is present we can use DMA-BUFs as
|
||||
// the server announces support for it.
|
||||
// See https://github.com/PipeWire/pipewire/blob/master/doc/dma-buf.dox
|
||||
|
||||
pw->d->m_usingDmaBuf = pw->d->m_allowDmaBuf && spa_pod_find_prop(format, nullptr, SPA_FORMAT_VIDEO_modifier);
|
||||
Q_ASSERT(pw->d->m_allowDmaBuf || !pw->d->m_usingDmaBuf);
|
||||
const auto bufferTypes =
|
||||
pw->d->m_usingDmaBuf ? (1 << SPA_DATA_DmaBuf) | (1 << SPA_DATA_MemFd) | (1 << SPA_DATA_MemPtr) : (1 << SPA_DATA_MemFd) | (1 << SPA_DATA_MemPtr);
|
||||
|
||||
QVarLengthArray<const spa_pod *> params = {
|
||||
(spa_pod *)spa_pod_builder_add_object(&pod_builder,
|
||||
SPA_TYPE_OBJECT_ParamBuffers,
|
||||
SPA_PARAM_Buffers,
|
||||
SPA_PARAM_BUFFERS_buffers,
|
||||
SPA_POD_CHOICE_RANGE_Int(16, 2, 16),
|
||||
SPA_PARAM_BUFFERS_align,
|
||||
SPA_POD_Int(16),
|
||||
SPA_PARAM_BUFFERS_dataType,
|
||||
SPA_POD_CHOICE_FLAGS_Int(bufferTypes)),
|
||||
(spa_pod *)spa_pod_builder_add_object(&pod_builder,
|
||||
SPA_TYPE_OBJECT_ParamMeta,
|
||||
SPA_PARAM_Meta,
|
||||
SPA_PARAM_META_type,
|
||||
SPA_POD_Id(SPA_META_Header),
|
||||
SPA_PARAM_META_size,
|
||||
SPA_POD_Int(sizeof(struct spa_meta_header))),
|
||||
(spa_pod *)spa_pod_builder_add_object(&pod_builder,
|
||||
SPA_TYPE_OBJECT_ParamMeta,
|
||||
SPA_PARAM_Meta,
|
||||
SPA_PARAM_META_type,
|
||||
SPA_POD_Id(SPA_META_Cursor),
|
||||
SPA_PARAM_META_size,
|
||||
SPA_POD_CHOICE_RANGE_Int(CURSOR_META_SIZE(64, 64), CURSOR_META_SIZE(1, 1), CURSOR_META_SIZE(1024, 1024))),
|
||||
};
|
||||
|
||||
if (pw->d->m_withDamage) {
|
||||
params.append((spa_pod *)spa_pod_builder_add_object(&pod_builder,
|
||||
SPA_TYPE_OBJECT_ParamMeta,
|
||||
SPA_PARAM_Meta,
|
||||
SPA_PARAM_META_type,
|
||||
SPA_POD_Id(SPA_META_VideoDamage),
|
||||
SPA_PARAM_META_size,
|
||||
SPA_POD_CHOICE_RANGE_Int(sizeof(struct spa_meta_region) * videoDamageRegionCount,
|
||||
sizeof(struct spa_meta_region) * 1,
|
||||
sizeof(struct spa_meta_region) * videoDamageRegionCount)));
|
||||
}
|
||||
|
||||
pw_stream_update_params(pw->d->pwStream, params.data(), params.count());
|
||||
Q_EMIT pw->streamParametersChanged();
|
||||
}
|
||||
|
||||
static void onProcess(void *data)
|
||||
{
|
||||
PipeWireSourceStream *stream = static_cast<PipeWireSourceStream *>(data);
|
||||
stream->process();
|
||||
}
|
||||
|
||||
QSize PipeWireSourceStream::size() const
|
||||
{
|
||||
return QSize(d->videoFormat.size.width, d->videoFormat.size.height);
|
||||
}
|
||||
|
||||
pw_stream_state PipeWireSourceStream::state() const
|
||||
{
|
||||
return d->m_state;
|
||||
}
|
||||
|
||||
std::optional<std::chrono::nanoseconds> PipeWireSourceStream::currentPresentationTimestamp() const
|
||||
{
|
||||
return d->m_currentPresentationTimestamp;
|
||||
}
|
||||
|
||||
QString PipeWireSourceStream::error() const
|
||||
{
|
||||
return d->m_error;
|
||||
}
|
||||
|
||||
PipeWireSourceStream::PipeWireSourceStream(QObject *parent)
|
||||
: QObject(parent)
|
||||
, d(new PipeWireSourceStreamPrivate)
|
||||
{
|
||||
pwStreamEvents.version = PW_VERSION_STREAM_EVENTS;
|
||||
pwStreamEvents.process = &onProcess;
|
||||
pwStreamEvents.state_changed = &PipeWireSourceStream::onStreamStateChanged;
|
||||
pwStreamEvents.param_changed = &PipeWireSourceStream::onStreamParamChanged;
|
||||
}
|
||||
|
||||
PipeWireSourceStream::~PipeWireSourceStream()
|
||||
{
|
||||
d->m_stopped = true;
|
||||
if (d->m_renegotiateEvent) {
|
||||
pw_loop_destroy_source(d->pwCore->loop(), d->m_renegotiateEvent);
|
||||
}
|
||||
if (d->pwStream) {
|
||||
pw_stream_destroy(d->pwStream);
|
||||
}
|
||||
}
|
||||
|
||||
Fraction PipeWireSourceStream::framerate() const
|
||||
{
|
||||
if (d->pwStream) {
|
||||
return {d->videoFormat.max_framerate.num, d->videoFormat.max_framerate.denom};
|
||||
}
|
||||
|
||||
return {0, 1};
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::setMaxFramerate(const Fraction &framerate)
|
||||
{
|
||||
d->maxFramerate = framerate;
|
||||
|
||||
if (d->pwStream) {
|
||||
pw_loop_signal_event(d->pwCore->loop(), d->m_renegotiateEvent);
|
||||
}
|
||||
}
|
||||
|
||||
uint PipeWireSourceStream::nodeId()
|
||||
{
|
||||
return d->pwNodeId;
|
||||
}
|
||||
|
||||
QList<const spa_pod *> PipeWireSourceStream::createFormatsParams(spa_pod_builder podBuilder)
|
||||
{
|
||||
const auto pwServerVersion = d->pwCore->serverVersion();
|
||||
const QList<spa_video_format> formats = {
|
||||
SPA_VIDEO_FORMAT_RGBx,
|
||||
SPA_VIDEO_FORMAT_RGBA,
|
||||
SPA_VIDEO_FORMAT_BGRx,
|
||||
SPA_VIDEO_FORMAT_BGRA,
|
||||
SPA_VIDEO_FORMAT_RGB,
|
||||
SPA_VIDEO_FORMAT_BGR,
|
||||
SPA_VIDEO_FORMAT_xBGR,
|
||||
SPA_VIDEO_FORMAT_ABGR,
|
||||
};
|
||||
QList<const spa_pod *> params;
|
||||
params.reserve(formats.size() * 2);
|
||||
const EGLDisplay display = static_cast<EGLDisplay>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("egldisplay"));
|
||||
|
||||
d->m_allowDmaBuf = d->m_allowDmaBuf && (pwServerVersion.isNull() || (pwClientVersion >= kDmaBufMinVersion && pwServerVersion >= kDmaBufMinVersion));
|
||||
const bool withDontFixate = d->m_allowDmaBuf && (pwServerVersion.isNull() || (pwClientVersion >= kDmaBufModifierMinVersion && pwServerVersion >= kDmaBufModifierMinVersion));
|
||||
|
||||
if (d->m_availableModifiers.isEmpty()) {
|
||||
d->m_availableModifiers = queryDmaBufModifiers(display, formats);
|
||||
}
|
||||
|
||||
for (auto it = d->m_availableModifiers.constBegin(), itEnd = d->m_availableModifiers.constEnd(); it != itEnd; ++it) {
|
||||
if (d->m_allowDmaBuf && !it->isEmpty()) {
|
||||
params += buildFormat(&podBuilder, it.key(), it.value(), withDontFixate, d->maxFramerate);
|
||||
}
|
||||
|
||||
params += buildFormat(&podBuilder, it.key(), {}, withDontFixate, d->maxFramerate);
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
bool PipeWireSourceStream::createStream(uint nodeid, int fd)
|
||||
{
|
||||
d->m_availableModifiers.clear();
|
||||
d->pwCore = PipeWireCore::fetch(fd);
|
||||
if (!d->pwCore->error().isEmpty()) {
|
||||
qDebug() << "received error while creating the stream" << d->pwCore->error();
|
||||
d->m_error = d->pwCore->error();
|
||||
return false;
|
||||
}
|
||||
|
||||
connect(d->pwCore.data(), &PipeWireCore::pipewireFailed, this, &PipeWireSourceStream::coreFailed);
|
||||
|
||||
if (objectName().isEmpty()) {
|
||||
setObjectName(QStringLiteral("plasma-screencast-%1").arg(nodeid));
|
||||
}
|
||||
|
||||
const auto pwServerVersion = d->pwCore->serverVersion();
|
||||
d->pwStream = pw_stream_new(**d->pwCore, objectName().toUtf8().constData(), nullptr);
|
||||
d->pwNodeId = nodeid;
|
||||
pw_stream_add_listener(d->pwStream, &d->streamListener, &pwStreamEvents, this);
|
||||
|
||||
d->m_renegotiateEvent = pw_loop_add_event(d->pwCore->loop(), onRenegotiate, this);
|
||||
|
||||
uint8_t buffer[4096];
|
||||
spa_pod_builder podBuilder = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
|
||||
auto params = createFormatsParams(podBuilder);
|
||||
pw_stream_flags s = (pw_stream_flags)(PW_STREAM_FLAG_DONT_RECONNECT | PW_STREAM_FLAG_AUTOCONNECT);
|
||||
if (pw_stream_connect(d->pwStream, PW_DIRECTION_INPUT, d->pwNodeId, s, params.data(), params.size()) != 0) {
|
||||
qWarning() << "Could not connect to stream";
|
||||
pw_stream_destroy(d->pwStream);
|
||||
d->pwStream = nullptr;
|
||||
return false;
|
||||
}
|
||||
qDebug() << "created successfully" << nodeid;
|
||||
return true;
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::handleFrame(struct pw_buffer *buffer)
|
||||
{
|
||||
spa_buffer *spaBuffer = buffer->buffer;
|
||||
|
||||
PipeWireFrame frame;
|
||||
frame.format = d->videoFormat.format;
|
||||
|
||||
struct spa_meta_header *h = (struct spa_meta_header *)spa_buffer_find_meta_data(spaBuffer, SPA_META_Header, sizeof(*h));
|
||||
if (h) {
|
||||
d->m_currentPresentationTimestamp = std::chrono::nanoseconds(h->pts);
|
||||
frame.presentationTimestamp = std::chrono::nanoseconds(h->pts);
|
||||
frame.sequential = h->seq;
|
||||
} else {
|
||||
using namespace std::chrono;
|
||||
auto now = system_clock::now();
|
||||
d->m_currentPresentationTimestamp = time_point_cast<nanoseconds>(now).time_since_epoch();
|
||||
frame.presentationTimestamp = d->m_currentPresentationTimestamp;
|
||||
}
|
||||
|
||||
if (spa_meta *vd = spa_buffer_find_meta(spaBuffer, SPA_META_VideoDamage)) {
|
||||
frame.damage = QRegion();
|
||||
spa_meta_region *mr;
|
||||
spa_meta_for_each(mr, vd)
|
||||
{
|
||||
*frame.damage += QRect(mr->region.position.x, mr->region.position.y, mr->region.size.width, mr->region.size.height);
|
||||
}
|
||||
}
|
||||
|
||||
{ // process cursor
|
||||
struct spa_meta_cursor *cursor = static_cast<struct spa_meta_cursor *>(spa_buffer_find_meta_data(spaBuffer, SPA_META_Cursor, sizeof(*cursor)));
|
||||
if (cursor && spa_meta_cursor_is_valid(cursor)) {
|
||||
struct spa_meta_bitmap *bitmap = nullptr;
|
||||
|
||||
if (cursor->bitmap_offset)
|
||||
bitmap = SPA_MEMBER(cursor, cursor->bitmap_offset, struct spa_meta_bitmap);
|
||||
|
||||
QImage cursorTexture;
|
||||
if (bitmap && bitmap->size.width > 0 && bitmap->size.height > 0) {
|
||||
const uint8_t *bitmap_data = SPA_MEMBER(bitmap, bitmap->offset, uint8_t);
|
||||
cursorTexture =
|
||||
SpaBufferToQImage(bitmap_data, bitmap->size.width, bitmap->size.height, bitmap->stride, spa_video_format(bitmap->format));
|
||||
}
|
||||
frame.cursor = {{cursor->position.x, cursor->position.y}, {cursor->hotspot.x, cursor->hotspot.y}, cursorTexture};
|
||||
}
|
||||
}
|
||||
|
||||
if (spaBuffer->datas->chunk->size == 0 || spaBuffer->datas->chunk->flags == SPA_CHUNK_FLAG_CORRUPTED) {
|
||||
// do not get a frame
|
||||
qDebug() << "skipping empty buffer" << spaBuffer->datas->chunk->size << spaBuffer->datas->chunk->flags;
|
||||
} else if (spaBuffer->datas->type == SPA_DATA_MemFd) {
|
||||
uint8_t *map =
|
||||
static_cast<uint8_t *>(mmap(nullptr, spaBuffer->datas->maxsize + spaBuffer->datas->mapoffset, PROT_READ, MAP_PRIVATE, spaBuffer->datas->fd, 0));
|
||||
|
||||
if (map == MAP_FAILED) {
|
||||
qWarning() << "Failed to mmap the memory: " << strerror(errno);
|
||||
return;
|
||||
}
|
||||
QImage img =
|
||||
SpaBufferToQImage(map, d->videoFormat.size.width, d->videoFormat.size.height, spaBuffer->datas->chunk->stride, d->videoFormat.format);
|
||||
frame.image = img.copy();
|
||||
|
||||
munmap(map, spaBuffer->datas->maxsize + spaBuffer->datas->mapoffset);
|
||||
} else if (spaBuffer->datas->type == SPA_DATA_DmaBuf) {
|
||||
DmaBufAttributes attribs;
|
||||
attribs.planes.reserve(spaBuffer->n_datas);
|
||||
attribs.format = spaVideoFormatToDrmFormat(d->videoFormat.format);
|
||||
attribs.modifier = d->videoFormat.modifier;
|
||||
attribs.width = d->videoFormat.size.width;
|
||||
attribs.height = d->videoFormat.size.height;
|
||||
|
||||
for (uint i = 0; i < spaBuffer->n_datas; ++i) {
|
||||
const auto &data = spaBuffer->datas[i];
|
||||
|
||||
DmaBufPlane plane;
|
||||
plane.fd = data.fd;
|
||||
plane.stride = data.chunk->stride;
|
||||
plane.offset = data.chunk->offset;
|
||||
attribs.planes += plane;
|
||||
}
|
||||
Q_ASSERT(!attribs.planes.isEmpty());
|
||||
frame.dmabuf = attribs;
|
||||
} else if (spaBuffer->datas->type == SPA_DATA_MemPtr) {
|
||||
frame.image = SpaBufferToQImage(static_cast<uint8_t *>(spaBuffer->datas->data),
|
||||
d->videoFormat.size.width,
|
||||
d->videoFormat.size.height,
|
||||
spaBuffer->datas->chunk->stride,
|
||||
d->videoFormat.format);
|
||||
} else {
|
||||
if (spaBuffer->datas->type == SPA_ID_INVALID)
|
||||
qWarning() << "invalid buffer type";
|
||||
else
|
||||
qWarning() << "unsupported buffer type" << spaBuffer->datas->type;
|
||||
QImage errorImage(200, 200, QImage::Format_ARGB32_Premultiplied);
|
||||
errorImage.fill(Qt::red);
|
||||
frame.image = errorImage;
|
||||
}
|
||||
|
||||
Q_EMIT frameReceived(frame);
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::coreFailed(const QString &errorMessage)
|
||||
{
|
||||
qDebug() << "received error message" << errorMessage;
|
||||
d->m_error = errorMessage;
|
||||
Q_EMIT stopStreaming();
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::process()
|
||||
{
|
||||
pw_buffer *buf = pw_stream_dequeue_buffer(d->pwStream);
|
||||
if (!buf) {
|
||||
qDebug() << "out of buffers";
|
||||
return;
|
||||
}
|
||||
|
||||
handleFrame(buf);
|
||||
|
||||
pw_stream_queue_buffer(d->pwStream, buf);
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::setActive(bool active)
|
||||
{
|
||||
Q_ASSERT(d->pwStream);
|
||||
pw_stream_set_active(d->pwStream, active);
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::setDamageEnabled(bool withDamage)
|
||||
{
|
||||
d->m_withDamage = withDamage;
|
||||
}
|
||||
|
||||
bool PipeWireSourceStream::usingDmaBuf() const
|
||||
{
|
||||
return d->m_usingDmaBuf;
|
||||
}
|
||||
|
||||
bool PipeWireSourceStream::allowDmaBuf() const
|
||||
{
|
||||
return d->m_allowDmaBuf;
|
||||
}
|
||||
|
||||
void PipeWireSourceStream::setAllowDmaBuf(bool allowed)
|
||||
{
|
||||
d->m_allowDmaBuf = allowed;
|
||||
}
|
||||
|
||||
#include "moc_pipewiresourcestream.cpp"
|
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2018-2020 Red Hat Inc
|
||||
SPDX-FileCopyrightText: 2020-2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
SPDX-FileContributor: Jan Grulich <jgrulich@redhat.com>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QHash>
|
||||
#include <QImage>
|
||||
#include <QObject>
|
||||
#include <QPoint>
|
||||
#include <QSharedPointer>
|
||||
#include <QSize>
|
||||
#include <optional>
|
||||
|
||||
#include <pipewire/pipewire.h>
|
||||
#include <spa/param/format-utils.h>
|
||||
#include <spa/param/props.h>
|
||||
#include <spa/param/video/format-utils.h>
|
||||
|
||||
#undef Status
|
||||
|
||||
class PipeWireCore;
|
||||
struct gbm_device;
|
||||
|
||||
typedef void *EGLDisplay;
|
||||
|
||||
struct DmaBufPlane
|
||||
{
|
||||
int fd; ///< The dmabuf file descriptor
|
||||
uint32_t offset; ///< The offset from the start of buffer
|
||||
uint32_t stride; ///< The distance from the start of a row to the next row in bytes
|
||||
};
|
||||
|
||||
struct DmaBufAttributes
|
||||
{
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
uint32_t format = 0;
|
||||
uint64_t modifier = 0; ///< The layout modifier
|
||||
|
||||
QList<DmaBufPlane> planes;
|
||||
};
|
||||
|
||||
struct PipeWireCursor
|
||||
{
|
||||
QPoint position;
|
||||
QPoint hotspot;
|
||||
QImage texture;
|
||||
bool operator!=(const PipeWireCursor &other) const
|
||||
{
|
||||
return !operator==(other);
|
||||
};
|
||||
bool operator==(const PipeWireCursor &other) const
|
||||
{
|
||||
return position == other.position && hotspot == other.hotspot && texture == other.texture;
|
||||
}
|
||||
};
|
||||
|
||||
struct PipeWireFrame
|
||||
{
|
||||
spa_video_format format;
|
||||
std::optional<int> sequential;
|
||||
std::optional<std::chrono::nanoseconds> presentationTimestamp;
|
||||
std::optional<DmaBufAttributes> dmabuf;
|
||||
std::optional<QImage> image;
|
||||
std::optional<QRegion> damage;
|
||||
std::optional<PipeWireCursor> cursor;
|
||||
};
|
||||
|
||||
struct Fraction
|
||||
{
|
||||
bool operator==(const Fraction &other) const
|
||||
{
|
||||
return numerator == other.numerator && denominator == other.denominator;
|
||||
}
|
||||
explicit operator bool() const
|
||||
{
|
||||
return isValid();
|
||||
}
|
||||
bool isValid() const
|
||||
{
|
||||
return denominator > 0;
|
||||
}
|
||||
quint32 numerator = 0;
|
||||
quint32 denominator = 0;
|
||||
};
|
||||
|
||||
QImage::Format SpaToQImageFormat(quint32 /*spa_video_format*/ format);
|
||||
|
||||
struct PipeWireSourceStreamPrivate;
|
||||
|
||||
class PipeWireSourceStream : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit PipeWireSourceStream(QObject *parent = nullptr);
|
||||
~PipeWireSourceStream();
|
||||
|
||||
Fraction framerate() const;
|
||||
void setMaxFramerate(const Fraction &framerate);
|
||||
uint nodeId();
|
||||
QString error() const;
|
||||
|
||||
QSize size() const;
|
||||
pw_stream_state state() const;
|
||||
bool createStream(uint nodeid, int fd);
|
||||
void setActive(bool active);
|
||||
void setDamageEnabled(bool withDamage);
|
||||
|
||||
void handleFrame(struct pw_buffer *buffer);
|
||||
void process();
|
||||
void renegotiateModifierFailed(spa_video_format format, quint64 modifier);
|
||||
|
||||
std::optional<std::chrono::nanoseconds> currentPresentationTimestamp() const;
|
||||
|
||||
static uint32_t spaVideoFormatToDrmFormat(spa_video_format spa_format);
|
||||
|
||||
bool usingDmaBuf() const;
|
||||
bool allowDmaBuf() const;
|
||||
void setAllowDmaBuf(bool allowed);
|
||||
|
||||
Q_SIGNALS:
|
||||
void streamReady();
|
||||
void startStreaming();
|
||||
void stopStreaming();
|
||||
void streamParametersChanged();
|
||||
void frameReceived(const PipeWireFrame &frame);
|
||||
void stateChanged(pw_stream_state state, pw_stream_state oldState);
|
||||
|
||||
private:
|
||||
static void onStreamParamChanged(void *data, uint32_t id, const struct spa_pod *format);
|
||||
static void onStreamStateChanged(void *data, pw_stream_state old, pw_stream_state state, const char *error_message);
|
||||
static void onRenegotiate(void *data, uint64_t);
|
||||
QList<const spa_pod *> createFormatsParams(spa_pod_builder podBuilder);
|
||||
|
||||
void coreFailed(const QString &errorMessage);
|
||||
QScopedPointer<PipeWireSourceStreamPrivate> d;
|
||||
};
|
|
@ -1170,7 +1170,7 @@ void PointerInputTest::testCursorShapeV1()
|
|||
|
||||
// move cursor somewhere the new window won't open
|
||||
input()->pointer()->warp(QPointF(800, 800));
|
||||
QCOMPARE(currentCursorShape(), QByteArray("left_ptr"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("default"));
|
||||
|
||||
// create a window
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
|
@ -1191,10 +1191,10 @@ void PointerInputTest::testCursorShapeV1()
|
|||
|
||||
// cursor shape won't be changed if the window has no pointer focus
|
||||
input()->pointer()->warp(QPointF(800, 800));
|
||||
QCOMPARE(currentCursorShape(), QByteArray("left_ptr"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("default"));
|
||||
cursorShapeDevice->set_shape(enteredSpy.last().at(0).value<quint32>(), Test::CursorShapeDeviceV1::shape_grab);
|
||||
QVERIFY(Test::waylandSync());
|
||||
QCOMPARE(currentCursorShape(), QByteArray("left_ptr"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("default"));
|
||||
}
|
||||
|
||||
class HelperEffect : public Effect
|
||||
|
@ -1245,19 +1245,19 @@ void PointerInputTest::testEffectOverrideCursorImage()
|
|||
// now create an effect and set an override cursor
|
||||
std::unique_ptr<HelperEffect> effect(new HelperEffect);
|
||||
effects->startMouseInterception(effect.get(), Qt::SizeAllCursor);
|
||||
QCOMPARE(currentCursorShape(), QByteArray("size_all"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("all-scroll"));
|
||||
|
||||
// let's change to arrow cursor, this should be our fallback
|
||||
effects->defineCursor(Qt::ArrowCursor);
|
||||
QCOMPARE(currentCursorShape(), QByteArray("left_ptr"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("default"));
|
||||
|
||||
// back to size all
|
||||
effects->defineCursor(Qt::SizeAllCursor);
|
||||
QCOMPARE(currentCursorShape(), QByteArray("size_all"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("all-scroll"));
|
||||
|
||||
// move cursor outside the window area
|
||||
input()->pointer()->warp(QPointF(800, 800));
|
||||
QCOMPARE(currentCursorShape(), QByteArray("size_all"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("all-scroll"));
|
||||
|
||||
// move cursor to area of window
|
||||
input()->pointer()->warp(window->frameGeometry().center());
|
||||
|
@ -1270,7 +1270,7 @@ void PointerInputTest::testEffectOverrideCursorImage()
|
|||
QVERIFY(enteredSpy.wait());
|
||||
cursorShapeDevice->set_shape(enteredSpy.last().at(0).value<quint32>(), Test::CursorShapeDeviceV1::shape_crosshair);
|
||||
QVERIFY(cursorChanged.wait());
|
||||
QCOMPARE(currentCursorShape(), QByteArray("cross"));
|
||||
QCOMPARE(currentCursorShape(), QByteArrayLiteral("crosshair"));
|
||||
}
|
||||
|
||||
void PointerInputTest::testPopup()
|
||||
|
|
|
@ -389,6 +389,7 @@ void QuickTilingTest::testQuickTilingPointerMove()
|
|||
// we have to receive a configure event when the window becomes active
|
||||
QSignalSpy toplevelConfigureRequestedSpy(shellSurface.get(), &Test::XdgToplevel::configureRequested);
|
||||
QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
QVERIFY(surfaceConfigureRequestedSpy.wait());
|
||||
QCOMPARE(surfaceConfigureRequestedSpy.count(), 1);
|
||||
|
||||
|
@ -412,6 +413,12 @@ void QuickTilingTest::testQuickTilingPointerMove()
|
|||
QCOMPARE(surfaceConfigureRequestedSpy.count(), 2);
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).toSize(), tileSize);
|
||||
|
||||
// attach a new image
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), tileSize, Qt::red);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->frameGeometry().size(), tileSize);
|
||||
|
||||
// verify that geometry restore is correct after user untiles the window, but changes
|
||||
// their mind and tiles the window again while still holding left button
|
||||
workspace()->performWindowOperation(window, Options::UnrestrictedMoveOp);
|
||||
|
@ -425,6 +432,12 @@ void QuickTilingTest::testQuickTilingPointerMove()
|
|||
QCOMPARE(surfaceConfigureRequestedSpy.count(), 3);
|
||||
QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).toSize(), QSize(100, 50));
|
||||
|
||||
// attach a new image
|
||||
shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
|
||||
Test::render(surface.get(), QSize(100, 50), Qt::red);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->frameGeometry().size(), QSize(100, 50));
|
||||
|
||||
Test::pointerMotion(pointerPos, timestamp++); // tile the window again
|
||||
Test::pointerButtonReleased(BTN_LEFT, timestamp++);
|
||||
QCOMPARE(quickTileChangedSpy.count(), 3);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "core/output.h"
|
||||
#include "generic_scene_opengl_test.h"
|
||||
#include "opengl/glplatform.h"
|
||||
#include "pipewiresourcestream.h"
|
||||
#include "pointer_input.h"
|
||||
#include "scene/workspacescene.h"
|
||||
#include "wayland_server.h"
|
||||
|
@ -19,12 +20,9 @@
|
|||
#include <KWayland/Client/output.h>
|
||||
#include <KWayland/Client/subsurface.h>
|
||||
#include <KWayland/Client/surface.h>
|
||||
#include <PipeWireSourceStream>
|
||||
#include <QPainter>
|
||||
#include <QScreen>
|
||||
|
||||
Q_DECLARE_METATYPE(PipeWireFrame);
|
||||
|
||||
#define QCOMPAREIMG(actual, expected, id) \
|
||||
{ \
|
||||
if ((actual) != (expected)) { \
|
||||
|
@ -49,8 +47,6 @@ public:
|
|||
ScreencastingTest()
|
||||
: GenericSceneOpenGLTest(QByteArrayLiteral("O2"))
|
||||
{
|
||||
qRegisterMetaType<PipeWireFrame>();
|
||||
|
||||
auto wrap = [this](const QString &process, const QStringList &arguments = {}) {
|
||||
// Make sure PipeWire is running. If it's already running it will just exit
|
||||
QProcess *p = new QProcess(this);
|
||||
|
|
|
@ -65,6 +65,8 @@ private Q_SLOTS:
|
|||
void testPushBack();
|
||||
void testObjectEdge_data();
|
||||
void testObjectEdge();
|
||||
void testMultipleEntry_data();
|
||||
void testMultipleEntry();
|
||||
void testKdeNetWmScreenEdgeShow();
|
||||
};
|
||||
|
||||
|
@ -304,6 +306,50 @@ void ScreenEdgesTest::testObjectEdge()
|
|||
QCOMPARE(spy.count(), 2);
|
||||
}
|
||||
|
||||
void ScreenEdgesTest::testMultipleEntry_data()
|
||||
{
|
||||
QTest::addColumn<ElectricBorder>("border");
|
||||
QTest::addColumn<QPointF>("triggerPoint");
|
||||
QTest::addColumn<QPointF>("delta");
|
||||
|
||||
QTest::newRow("top") << ElectricTop << QPointF(640, 0) << QPointF(0, 50);
|
||||
QTest::newRow("right") << ElectricRight << QPointF(1279, 512) << QPointF(-50, 0);
|
||||
QTest::newRow("bottom") << ElectricBottom << QPointF(640, 1023) << QPointF(0, -50);
|
||||
QTest::newRow("left") << ElectricLeft << QPointF(0, 512) << QPointF(50, 0);
|
||||
}
|
||||
|
||||
void ScreenEdgesTest::testMultipleEntry()
|
||||
{
|
||||
TestObject callback;
|
||||
QSignalSpy spy(&callback, &TestObject::gotCallback);
|
||||
|
||||
// Reserve a screen edge border.
|
||||
QFETCH(ElectricBorder, border);
|
||||
workspace()->screenEdges()->reserve(border, &callback, "callback");
|
||||
|
||||
QFETCH(QPointF, triggerPoint);
|
||||
QFETCH(QPointF, delta);
|
||||
|
||||
qint64 timestamp = 0;
|
||||
|
||||
while (timestamp < 300) {
|
||||
// doesn't activate from repeated entries of short duration
|
||||
Test::pointerMotion(triggerPoint, timestamp);
|
||||
QVERIFY(spy.isEmpty());
|
||||
timestamp += 50;
|
||||
Test::pointerMotion(triggerPoint + delta, timestamp);
|
||||
QVERIFY(spy.isEmpty());
|
||||
timestamp += 50;
|
||||
}
|
||||
|
||||
// and this one triggers
|
||||
Test::pointerMotion(triggerPoint, timestamp);
|
||||
timestamp += 110;
|
||||
Test::pointerMotion(triggerPoint, timestamp);
|
||||
QVERIFY(!spy.isEmpty());
|
||||
QCOMPARE(spy.count(), 1);
|
||||
}
|
||||
|
||||
static void enableAutoHide(xcb_connection_t *connection, xcb_window_t windowId, ElectricBorder border)
|
||||
{
|
||||
if (border == ElectricNone) {
|
||||
|
@ -379,7 +425,7 @@ void ScreenEdgesTest::testKdeNetWmScreenEdgeShow()
|
|||
// _KDE_NET_WM_SCREEN_EDGE_SHOW has oneshot effect. It's deleted when the window is shown.
|
||||
|
||||
auto config = kwinApp()->config();
|
||||
config->group(QStringLiteral("Windows")).writeEntry("ElectricBorderDelay", 150);
|
||||
config->group(QStringLiteral("Windows")).writeEntry("ElectricBorderDelay", 75);
|
||||
config->sync();
|
||||
workspace()->slotReconfigure();
|
||||
|
||||
|
@ -449,7 +495,7 @@ void ScreenEdgesTest::testKdeNetWmScreenEdgeShow()
|
|||
QVERIFY(window->isShown());
|
||||
}
|
||||
|
||||
// If the screen edge is destroyed (can happen when the screen layout changes), the window will be shown.
|
||||
// The screen edge reservation won't be affected when recreating screen edges (can happen when the screen layout changes).
|
||||
{
|
||||
enableAutoHide(c.get(), windowId, ElectricBottom);
|
||||
xcb_flush(c.get());
|
||||
|
@ -457,7 +503,12 @@ void ScreenEdgesTest::testKdeNetWmScreenEdgeShow()
|
|||
QVERIFY(!window->isShown());
|
||||
|
||||
workspace()->screenEdges()->recreateEdges();
|
||||
QVERIFY(withdrawnSpy.wait());
|
||||
QVERIFY(!withdrawnSpy.wait(50));
|
||||
QVERIFY(!window->isShown());
|
||||
|
||||
enableAutoHide(c.get(), windowId, ElectricNone);
|
||||
xcb_flush(c.get());
|
||||
QVERIFY(windowShownSpy.wait());
|
||||
QVERIFY(window->isShown());
|
||||
}
|
||||
|
||||
|
|
|
@ -28,6 +28,10 @@ private Q_SLOTS:
|
|||
|
||||
void testRestoreFocus();
|
||||
void testRestoreFocusWithDesktopWindow();
|
||||
void testQuitAfterActivatingHiddenWindow();
|
||||
void testDontQuitAfterActivatingDock();
|
||||
void testQuitAfterAddingWindow();
|
||||
void testDontQuitAfterAddingDock();
|
||||
};
|
||||
|
||||
void ShowingDesktopTest::initTestCase()
|
||||
|
@ -115,5 +119,121 @@ void ShowingDesktopTest::testRestoreFocusWithDesktopWindow()
|
|||
QCOMPARE(workspace()->activeWindow(), window2);
|
||||
}
|
||||
|
||||
void ShowingDesktopTest::testQuitAfterActivatingHiddenWindow()
|
||||
{
|
||||
// This test verifies that the show desktop mode is deactivated after activating a hidden window.
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
|
||||
auto window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
|
||||
std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
|
||||
auto window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
|
||||
QCOMPARE(workspace()->activeWindow(), window2);
|
||||
|
||||
workspace()->slotToggleShowDesktop();
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
|
||||
workspace()->activateWindow(window1);
|
||||
QVERIFY(!workspace()->showingDesktop());
|
||||
}
|
||||
|
||||
void ShowingDesktopTest::testDontQuitAfterActivatingDock()
|
||||
{
|
||||
// This test verifies that activating windows belonging to desktop doesn't break showing desktop mode.
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> desktopSurface(Test::createSurface());
|
||||
std::unique_ptr<Test::LayerSurfaceV1> desktopShellSurface(Test::createLayerSurfaceV1(desktopSurface.get(), QStringLiteral("desktop")));
|
||||
desktopShellSurface->set_keyboard_interactivity(1);
|
||||
desktopShellSurface->set_layer(Test::LayerShellV1::layer_background);
|
||||
desktopShellSurface->set_size(0, 0);
|
||||
desktopShellSurface->set_exclusive_zone(-1);
|
||||
desktopShellSurface->set_anchor(Test::LayerSurfaceV1::anchor_bottom
|
||||
| Test::LayerSurfaceV1::anchor_top
|
||||
| Test::LayerSurfaceV1::anchor_left
|
||||
| Test::LayerSurfaceV1::anchor_right);
|
||||
desktopSurface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
QSignalSpy desktopConfigureRequestedSpy(desktopShellSurface.get(), &Test::LayerSurfaceV1::configureRequested);
|
||||
QVERIFY(desktopConfigureRequestedSpy.wait());
|
||||
auto desktop = Test::renderAndWaitForShown(desktopSurface.get(), desktopConfigureRequestedSpy.last().at(1).toSize(), Qt::blue);
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> dockSurface{Test::createSurface()};
|
||||
std::unique_ptr<Test::LayerSurfaceV1> dockShellSurface{Test::createLayerSurfaceV1(dockSurface.get(), QStringLiteral("dock"))};
|
||||
dockShellSurface->set_size(1280, 50);
|
||||
dockShellSurface->set_anchor(Test::LayerSurfaceV1::anchor_bottom);
|
||||
dockShellSurface->set_exclusive_zone(50);
|
||||
dockShellSurface->set_keyboard_interactivity(1);
|
||||
dockSurface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
QSignalSpy dockConfigureRequestedSpy(dockShellSurface.get(), &Test::LayerSurfaceV1::configureRequested);
|
||||
QVERIFY(dockConfigureRequestedSpy.wait());
|
||||
auto dock = Test::renderAndWaitForShown(dockSurface.get(), dockConfigureRequestedSpy.last().at(1).toSize(), Qt::blue);
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
|
||||
auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
|
||||
QVERIFY(window->isActive());
|
||||
|
||||
workspace()->slotToggleShowDesktop();
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
QVERIFY(desktop->isActive());
|
||||
|
||||
workspace()->activateWindow(dock);
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
QVERIFY(dock->isActive());
|
||||
|
||||
workspace()->activateWindow(desktop);
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
QVERIFY(desktop->isActive());
|
||||
|
||||
workspace()->slotToggleShowDesktop();
|
||||
QVERIFY(!workspace()->showingDesktop());
|
||||
}
|
||||
|
||||
void ShowingDesktopTest::testQuitAfterAddingWindow()
|
||||
{
|
||||
// This test verifies that the show desktop mode is deactivated after mapping a new window.
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
|
||||
Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
|
||||
|
||||
workspace()->slotToggleShowDesktop();
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
|
||||
Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
|
||||
|
||||
QVERIFY(!workspace()->showingDesktop());
|
||||
}
|
||||
|
||||
void ShowingDesktopTest::testDontQuitAfterAddingDock()
|
||||
{
|
||||
// This test verifies that the show desktop mode is not broken after adding a dock.
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
|
||||
std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
|
||||
auto window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue);
|
||||
QVERIFY(window->isActive());
|
||||
|
||||
workspace()->slotToggleShowDesktop();
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
|
||||
std::unique_ptr<KWayland::Client::Surface> dockSurface{Test::createSurface()};
|
||||
std::unique_ptr<Test::LayerSurfaceV1> dockShellSurface{Test::createLayerSurfaceV1(dockSurface.get(), QStringLiteral("dock"))};
|
||||
dockShellSurface->set_size(1280, 50);
|
||||
dockShellSurface->set_anchor(Test::LayerSurfaceV1::anchor_bottom);
|
||||
dockShellSurface->set_exclusive_zone(50);
|
||||
dockShellSurface->set_keyboard_interactivity(1);
|
||||
dockSurface->commit(KWayland::Client::Surface::CommitFlag::None);
|
||||
QSignalSpy dockConfigureRequestedSpy(dockShellSurface.get(), &Test::LayerSurfaceV1::configureRequested);
|
||||
QVERIFY(dockConfigureRequestedSpy.wait());
|
||||
auto dock = Test::renderAndWaitForShown(dockSurface.get(), dockConfigureRequestedSpy.last().at(1).toSize(), Qt::blue);
|
||||
QVERIFY(dock->isActive());
|
||||
|
||||
QVERIFY(workspace()->showingDesktop());
|
||||
workspace()->slotToggleShowDesktop();
|
||||
}
|
||||
|
||||
WAYLANDTEST_MAIN(ShowingDesktopTest)
|
||||
#include "showing_desktop_test.moc"
|
||||
|
|
|
@ -104,11 +104,11 @@ void TabBoxTest::testCapsLock()
|
|||
quint32 timestamp = 0;
|
||||
Test::keyboardKeyPressed(KEY_CAPSLOCK, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_CAPSLOCK, timestamp++);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::ShiftModifier);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::NoModifier);
|
||||
|
||||
// press alt+tab
|
||||
Test::keyboardKeyPressed(KEY_LEFTALT, timestamp++);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::ShiftModifier | Qt::AltModifier);
|
||||
QCOMPARE(input()->keyboardModifiers(), Qt::AltModifier);
|
||||
Test::keyboardKeyPressed(KEY_TAB, timestamp++);
|
||||
Test::keyboardKeyReleased(KEY_TAB, timestamp++);
|
||||
|
||||
|
|
|
@ -326,14 +326,27 @@ void MockInputMethod::zwp_input_method_v1_activate(struct ::zwp_input_method_con
|
|||
{
|
||||
if (!m_inputSurface) {
|
||||
m_inputSurface = Test::createSurface();
|
||||
m_inputMethodSurface = Test::createInputPanelSurfaceV1(m_inputSurface.get(), s_waylandConnection.outputs.first());
|
||||
m_inputMethodSurface = Test::createInputPanelSurfaceV1(m_inputSurface.get(), s_waylandConnection.outputs.first(), m_mode);
|
||||
}
|
||||
m_context = context;
|
||||
Test::render(m_inputSurface.get(), QSize(1280, 400), Qt::blue);
|
||||
|
||||
switch (m_mode) {
|
||||
case Mode::TopLevel:
|
||||
Test::render(m_inputSurface.get(), QSize(1280, 400), Qt::blue);
|
||||
break;
|
||||
case Mode::Overlay:
|
||||
Test::render(m_inputSurface.get(), QSize(200, 50), Qt::blue);
|
||||
break;
|
||||
}
|
||||
|
||||
Q_EMIT activate();
|
||||
}
|
||||
|
||||
void MockInputMethod::setMode(MockInputMethod::Mode mode)
|
||||
{
|
||||
m_mode = mode;
|
||||
}
|
||||
|
||||
void MockInputMethod::zwp_input_method_v1_deactivate(struct ::zwp_input_method_context_v1 *context)
|
||||
{
|
||||
QCOMPARE(context, m_context);
|
||||
|
@ -924,7 +937,7 @@ LayerSurfaceV1 *createLayerSurfaceV1(KWayland::Client::Surface *surface, const Q
|
|||
return shellSurface;
|
||||
}
|
||||
|
||||
QtWayland::zwp_input_panel_surface_v1 *createInputPanelSurfaceV1(KWayland::Client::Surface *surface, KWayland::Client::Output *output)
|
||||
QtWayland::zwp_input_panel_surface_v1 *createInputPanelSurfaceV1(KWayland::Client::Surface *surface, KWayland::Client::Output *output, MockInputMethod::Mode mode)
|
||||
{
|
||||
if (!s_waylandConnection.inputPanelV1) {
|
||||
qWarning() << "Unable to create the input panel surface. The interface input_panel global is not bound";
|
||||
|
@ -937,7 +950,14 @@ QtWayland::zwp_input_panel_surface_v1 *createInputPanelSurfaceV1(KWayland::Clien
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
s->set_toplevel(output->output(), QtWayland::zwp_input_panel_surface_v1::position_center_bottom);
|
||||
switch (mode) {
|
||||
case MockInputMethod::Mode::TopLevel:
|
||||
s->set_toplevel(output->output(), QtWayland::zwp_input_panel_surface_v1::position_center_bottom);
|
||||
break;
|
||||
case MockInputMethod::Mode::Overlay:
|
||||
s->set_overlay_panel();
|
||||
break;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
|
|
@ -35,8 +35,6 @@ private Q_SLOTS:
|
|||
|
||||
void testMinimumSize();
|
||||
void testMaximumSize();
|
||||
void testResizeIncrements();
|
||||
void testResizeIncrementsNoBaseSize();
|
||||
void testTrimCaption_data();
|
||||
void testTrimCaption();
|
||||
void testFullscreenLayerWithActiveWaylandWindow();
|
||||
|
@ -291,175 +289,6 @@ void X11WindowTest::testMaximumSize()
|
|||
c.reset();
|
||||
}
|
||||
|
||||
void X11WindowTest::testResizeIncrements()
|
||||
{
|
||||
// This test verifies that the resize increments constraint is correctly applied.
|
||||
QFETCH_GLOBAL(qreal, scale);
|
||||
kwinApp()->setXwaylandScale(scale);
|
||||
|
||||
// Create an xcb window.
|
||||
Test::XcbConnectionPtr c = Test::createX11Connection();
|
||||
QVERIFY(!xcb_connection_has_error(c.get()));
|
||||
const QRect windowGeometry(0, 0, 100, 200);
|
||||
xcb_window_t windowId = xcb_generate_id(c.get());
|
||||
xcb_create_window(c.get(), XCB_COPY_FROM_PARENT, windowId, rootWindow(),
|
||||
windowGeometry.x(),
|
||||
windowGeometry.y(),
|
||||
windowGeometry.width(),
|
||||
windowGeometry.height(),
|
||||
0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0, nullptr);
|
||||
xcb_size_hints_t hints;
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
xcb_icccm_size_hints_set_position(&hints, 1, windowGeometry.x(), windowGeometry.y());
|
||||
xcb_icccm_size_hints_set_size(&hints, 1, windowGeometry.width(), windowGeometry.height());
|
||||
xcb_icccm_size_hints_set_base_size(&hints, windowGeometry.width(), windowGeometry.height());
|
||||
xcb_icccm_size_hints_set_resize_inc(&hints, 3, 5);
|
||||
xcb_icccm_set_wm_normal_hints(c.get(), windowId, &hints);
|
||||
xcb_map_window(c.get(), windowId);
|
||||
xcb_flush(c.get());
|
||||
|
||||
QSignalSpy windowCreatedSpy(workspace(), &Workspace::windowAdded);
|
||||
QVERIFY(windowCreatedSpy.wait());
|
||||
X11Window *window = windowCreatedSpy.last().first().value<X11Window *>();
|
||||
QVERIFY(window);
|
||||
QVERIFY(window->isDecorated());
|
||||
|
||||
QSignalSpy interactiveMoveResizeStartedSpy(window, &Window::interactiveMoveResizeStarted);
|
||||
QSignalSpy interactiveMoveResizeSteppedSpy(window, &Window::interactiveMoveResizeStepped);
|
||||
QSignalSpy interactiveMoveResizeFinishedSpy(window, &Window::interactiveMoveResizeFinished);
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
|
||||
// Begin resize.
|
||||
QCOMPARE(workspace()->moveResizeWindow(), nullptr);
|
||||
QVERIFY(!window->isInteractiveResize());
|
||||
workspace()->slotWindowResize();
|
||||
QCOMPARE(workspace()->moveResizeWindow(), window);
|
||||
QCOMPARE(interactiveMoveResizeStartedSpy.count(), 1);
|
||||
QVERIFY(window->isInteractiveResize());
|
||||
|
||||
const QPointF cursorPos = KWin::Cursors::self()->mouse()->pos();
|
||||
|
||||
window->keyPressEvent(Qt::Key_Right);
|
||||
window->updateInteractiveMoveResize(KWin::Cursors::self()->mouse()->pos());
|
||||
QCOMPARE(KWin::Cursors::self()->mouse()->pos(), cursorPos + QPoint(8, 0));
|
||||
QCOMPARE(interactiveMoveResizeSteppedSpy.count(), 1);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
// 100 + 8 logical pixels, rounded to resize increments. This will differ on scale
|
||||
const qreal horizontalResizeInc = 3 / scale;
|
||||
const qreal verticalResizeInc = 5 / scale;
|
||||
const qreal expectedHorizontalResizeInc = std::floor(8. / horizontalResizeInc) * horizontalResizeInc;
|
||||
const qreal expectedVerticalResizeInc = std::floor(8. / verticalResizeInc) * verticalResizeInc;
|
||||
|
||||
QCOMPARE(window->clientSize(), QSizeF(100, 200) / scale + QSizeF(expectedHorizontalResizeInc, 0));
|
||||
|
||||
window->keyPressEvent(Qt::Key_Down);
|
||||
window->updateInteractiveMoveResize(KWin::Cursors::self()->mouse()->pos());
|
||||
QCOMPARE(KWin::Cursors::self()->mouse()->pos(), cursorPos + QPoint(8, 8));
|
||||
QCOMPARE(interactiveMoveResizeSteppedSpy.count(), 2);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->clientSize(), QSize(100, 200) / scale + QSizeF(expectedHorizontalResizeInc, expectedVerticalResizeInc));
|
||||
|
||||
// Finish the resize operation.
|
||||
QCOMPARE(interactiveMoveResizeFinishedSpy.count(), 0);
|
||||
window->keyPressEvent(Qt::Key_Enter);
|
||||
QCOMPARE(interactiveMoveResizeFinishedSpy.count(), 1);
|
||||
QCOMPARE(workspace()->moveResizeWindow(), nullptr);
|
||||
QVERIFY(!window->isInteractiveResize());
|
||||
|
||||
// Destroy the window.
|
||||
QSignalSpy windowClosedSpy(window, &X11Window::closed);
|
||||
xcb_unmap_window(c.get(), windowId);
|
||||
xcb_destroy_window(c.get(), windowId);
|
||||
xcb_flush(c.get());
|
||||
QVERIFY(windowClosedSpy.wait());
|
||||
c.reset();
|
||||
}
|
||||
|
||||
void X11WindowTest::testResizeIncrementsNoBaseSize()
|
||||
{
|
||||
QFETCH_GLOBAL(qreal, scale);
|
||||
kwinApp()->setXwaylandScale(scale);
|
||||
|
||||
// Create an xcb window.
|
||||
Test::XcbConnectionPtr c = Test::createX11Connection();
|
||||
QVERIFY(!xcb_connection_has_error(c.get()));
|
||||
const QRect windowGeometry(0, 0, 100, 200);
|
||||
xcb_window_t windowId = xcb_generate_id(c.get());
|
||||
xcb_create_window(c.get(), XCB_COPY_FROM_PARENT, windowId, rootWindow(),
|
||||
windowGeometry.x(),
|
||||
windowGeometry.y(),
|
||||
windowGeometry.width(),
|
||||
windowGeometry.height(),
|
||||
0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0, nullptr);
|
||||
xcb_size_hints_t hints;
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
xcb_icccm_size_hints_set_position(&hints, 1, windowGeometry.x(), windowGeometry.y());
|
||||
xcb_icccm_size_hints_set_size(&hints, 1, windowGeometry.width(), windowGeometry.height());
|
||||
xcb_icccm_size_hints_set_min_size(&hints, windowGeometry.width(), windowGeometry.height());
|
||||
xcb_icccm_size_hints_set_resize_inc(&hints, 3, 5);
|
||||
xcb_icccm_set_wm_normal_hints(c.get(), windowId, &hints);
|
||||
xcb_map_window(c.get(), windowId);
|
||||
xcb_flush(c.get());
|
||||
|
||||
QSignalSpy windowCreatedSpy(workspace(), &Workspace::windowAdded);
|
||||
QVERIFY(windowCreatedSpy.wait());
|
||||
X11Window *window = windowCreatedSpy.last().first().value<X11Window *>();
|
||||
QVERIFY(window);
|
||||
QVERIFY(window->isDecorated());
|
||||
|
||||
QSignalSpy interactiveMoveResizeStartedSpy(window, &Window::interactiveMoveResizeStarted);
|
||||
QSignalSpy interactiveMoveResizeSteppedSpy(window, &Window::interactiveMoveResizeStepped);
|
||||
QSignalSpy interactiveMoveResizeFinishedSpy(window, &Window::interactiveMoveResizeFinished);
|
||||
QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
|
||||
|
||||
// Begin resize.
|
||||
QCOMPARE(workspace()->moveResizeWindow(), nullptr);
|
||||
QVERIFY(!window->isInteractiveResize());
|
||||
workspace()->slotWindowResize();
|
||||
QCOMPARE(workspace()->moveResizeWindow(), window);
|
||||
QCOMPARE(interactiveMoveResizeStartedSpy.count(), 1);
|
||||
QVERIFY(window->isInteractiveResize());
|
||||
|
||||
const QPointF cursorPos = KWin::Cursors::self()->mouse()->pos();
|
||||
|
||||
window->keyPressEvent(Qt::Key_Right);
|
||||
window->updateInteractiveMoveResize(KWin::Cursors::self()->mouse()->pos());
|
||||
QCOMPARE(KWin::Cursors::self()->mouse()->pos(), cursorPos + QPoint(8, 0));
|
||||
QCOMPARE(interactiveMoveResizeSteppedSpy.count(), 1);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
|
||||
// 100 + 8 pixels, rounded to resize increments. This will differ on scale
|
||||
const qreal horizontalResizeInc = 3 / scale;
|
||||
const qreal verticalResizeInc = 5 / scale;
|
||||
const qreal expectedHorizontalResizeInc = std::floor(8. / horizontalResizeInc) * horizontalResizeInc;
|
||||
const qreal expectedVerticalResizeInc = std::floor(8. / verticalResizeInc) * verticalResizeInc;
|
||||
|
||||
QCOMPARE(window->clientSize(), QSizeF(100, 200) / scale + QSizeF(expectedHorizontalResizeInc, 0));
|
||||
|
||||
window->keyPressEvent(Qt::Key_Down);
|
||||
window->updateInteractiveMoveResize(KWin::Cursors::self()->mouse()->pos());
|
||||
QCOMPARE(KWin::Cursors::self()->mouse()->pos(), cursorPos + QPoint(8, 8));
|
||||
QCOMPARE(interactiveMoveResizeSteppedSpy.count(), 2);
|
||||
QVERIFY(frameGeometryChangedSpy.wait());
|
||||
QCOMPARE(window->clientSize(), QSizeF(100, 200) / scale + QSizeF(expectedHorizontalResizeInc, expectedVerticalResizeInc));
|
||||
|
||||
// Finish the resize operation.
|
||||
QCOMPARE(interactiveMoveResizeFinishedSpy.count(), 0);
|
||||
window->keyPressEvent(Qt::Key_Enter);
|
||||
QCOMPARE(interactiveMoveResizeFinishedSpy.count(), 1);
|
||||
QCOMPARE(workspace()->moveResizeWindow(), nullptr);
|
||||
QVERIFY(!window->isInteractiveResize());
|
||||
|
||||
// Destroy the window.
|
||||
QSignalSpy windowClosedSpy(window, &X11Window::closed);
|
||||
xcb_unmap_window(c.get(), windowId);
|
||||
xcb_destroy_window(c.get(), windowId);
|
||||
xcb_flush(c.get());
|
||||
QVERIFY(windowClosedSpy.wait());
|
||||
c.reset();
|
||||
}
|
||||
|
||||
void X11WindowTest::testTrimCaption_data()
|
||||
{
|
||||
QFETCH_GLOBAL(qreal, scale);
|
||||
|
|
|
@ -151,6 +151,14 @@ private Q_SLOTS:
|
|||
void testScreenApplyNow();
|
||||
void testScreenForceTemporarily();
|
||||
|
||||
void testLayerDontAffect();
|
||||
void testLayerForce();
|
||||
void testLayerForceTemporarily();
|
||||
|
||||
void testCloseableDontAffect();
|
||||
void testCloseableForce();
|
||||
void testCloseableForceTemporarily();
|
||||
|
||||
void testMatchAfterNameChange();
|
||||
|
||||
private:
|
||||
|
@ -2980,5 +2988,78 @@ void TestXdgShellWindowRules::testMatchAfterNameChange()
|
|||
QCOMPARE(window->keepAbove(), true);
|
||||
}
|
||||
|
||||
void TestXdgShellWindowRules::testLayerDontAffect()
|
||||
{
|
||||
setWindowRule("layer", QStringLiteral("overlay"), int(Rules::DontAffect));
|
||||
|
||||
createTestWindow();
|
||||
|
||||
// The layer should not be affected by the rule.
|
||||
QCOMPARE(m_window->layer(), NormalLayer);
|
||||
|
||||
destroyTestWindow();
|
||||
}
|
||||
|
||||
void TestXdgShellWindowRules::testLayerForce()
|
||||
{
|
||||
setWindowRule("layer", QStringLiteral("overlay"), int(Rules::Force));
|
||||
|
||||
createTestWindow();
|
||||
QCOMPARE(m_window->layer(), OverlayLayer);
|
||||
|
||||
destroyTestWindow();
|
||||
}
|
||||
|
||||
void TestXdgShellWindowRules::testLayerForceTemporarily()
|
||||
{
|
||||
setWindowRule("layer", QStringLiteral("overlay"), int(Rules::ForceTemporarily));
|
||||
|
||||
createTestWindow();
|
||||
QCOMPARE(m_window->layer(), OverlayLayer);
|
||||
|
||||
// The rule should be discarded when the window is closed.
|
||||
destroyTestWindow();
|
||||
createTestWindow();
|
||||
QCOMPARE(m_window->layer(), NormalLayer);
|
||||
|
||||
destroyTestWindow();
|
||||
}
|
||||
|
||||
void TestXdgShellWindowRules::testCloseableDontAffect()
|
||||
{
|
||||
setWindowRule("closeable", false, int(Rules::DontAffect));
|
||||
|
||||
createTestWindow();
|
||||
|
||||
QVERIFY(m_window->isCloseable());
|
||||
|
||||
destroyTestWindow();
|
||||
}
|
||||
|
||||
void TestXdgShellWindowRules::testCloseableForce()
|
||||
{
|
||||
setWindowRule("closeable", false, int(Rules::Force));
|
||||
|
||||
createTestWindow();
|
||||
QVERIFY(!m_window->isCloseable());
|
||||
|
||||
destroyTestWindow();
|
||||
}
|
||||
|
||||
void TestXdgShellWindowRules::testCloseableForceTemporarily()
|
||||
{
|
||||
setWindowRule("closeable", false, int(Rules::ForceTemporarily));
|
||||
|
||||
createTestWindow();
|
||||
QVERIFY(!m_window->isCloseable());
|
||||
|
||||
// The rule should be discarded when the window is closed.
|
||||
destroyTestWindow();
|
||||
createTestWindow();
|
||||
QVERIFY(m_window->isCloseable());
|
||||
|
||||
destroyTestWindow();
|
||||
}
|
||||
|
||||
WAYLANDTEST_MAIN(TestXdgShellWindowRules)
|
||||
#include "xdgshellwindow_rules_test.moc"
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2024 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "kwin_wayland_test.h"
|
||||
|
||||
#include "core/output.h"
|
||||
#include "wayland_server.h"
|
||||
#include "workspace.h"
|
||||
|
||||
namespace KWin
|
||||
{
|
||||
|
||||
static const QString s_socketName = QStringLiteral("wayland_test_kwin_xinerama-0");
|
||||
|
||||
class XineramaTest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private Q_SLOTS:
|
||||
void initTestCase();
|
||||
void indexToOutput();
|
||||
};
|
||||
|
||||
void XineramaTest::initTestCase()
|
||||
{
|
||||
QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
|
||||
QVERIFY(waylandServer()->init(s_socketName));
|
||||
kwinApp()->start();
|
||||
QVERIFY(applicationStartedSpy.wait());
|
||||
}
|
||||
|
||||
void XineramaTest::indexToOutput()
|
||||
{
|
||||
Test::setOutputConfig({
|
||||
Test::OutputInfo{
|
||||
.geometry = QRect(0, 0, 1280, 1024),
|
||||
.scale = 1.5,
|
||||
},
|
||||
Test::OutputInfo{
|
||||
.geometry = QRect(1280, 0, 1280, 1024),
|
||||
.scale = 1.5,
|
||||
},
|
||||
});
|
||||
kwinApp()->setXwaylandScale(1.5);
|
||||
|
||||
// Start Xwayland
|
||||
Test::XcbConnectionPtr c = Test::createX11Connection();
|
||||
QVERIFY(!xcb_connection_has_error(c.get()));
|
||||
|
||||
const auto outputs = workspace()->outputs();
|
||||
QCOMPARE(workspace()->xineramaIndexToOutput(0), outputs.at(0));
|
||||
QCOMPARE(workspace()->xineramaIndexToOutput(1), outputs.at(1));
|
||||
|
||||
workspace()->setOutputOrder({outputs[1], outputs[0]});
|
||||
QCOMPARE(workspace()->xineramaIndexToOutput(0), outputs.at(1));
|
||||
QCOMPARE(workspace()->xineramaIndexToOutput(1), outputs.at(0));
|
||||
}
|
||||
|
||||
} // namespace KWin
|
||||
|
||||
WAYLANDTEST_MAIN(KWin::XineramaTest)
|
||||
#include "xinerama_test.moc"
|
|
@ -53,7 +53,7 @@ void InputEventsTest::testInitMouseEvent()
|
|||
QFETCH(QEvent::Type, type);
|
||||
// now create our own event
|
||||
MouseEvent event(type, QPointF(100, 200), Qt::LeftButton, Qt::LeftButton | Qt::RightButton,
|
||||
Qt::ShiftModifier | Qt::ControlModifier, 300ms, QPointF(1, 2), QPointF(3, 4), &d);
|
||||
Qt::ShiftModifier | Qt::ControlModifier, 300ms, QPointF(1, 2), QPointF(3, 4), &d, false);
|
||||
// and verify the contract of QMouseEvent
|
||||
QCOMPARE(event.type(), type);
|
||||
QCOMPARE(event.globalPos(), QPoint(100, 200));
|
||||
|
|
|
@ -20,6 +20,7 @@ public:
|
|||
private Q_SLOTS:
|
||||
void roundtripConversion_data();
|
||||
void roundtripConversion();
|
||||
void nonNormalizedPrimaries();
|
||||
};
|
||||
|
||||
static bool compareVectors(const QVector3D &one, const QVector3D &two, float maxDifference)
|
||||
|
@ -33,6 +34,8 @@ static bool compareVectors(const QVector3D &one, const QVector3D &two, float max
|
|||
return ret;
|
||||
}
|
||||
|
||||
static const double s_resolution10bit = std::pow(1.0 / 2.0, 10);
|
||||
|
||||
void TestColorspaces::roundtripConversion_data()
|
||||
{
|
||||
QTest::addColumn<NamedColorimetry>("srcColorimetry");
|
||||
|
@ -41,12 +44,11 @@ void TestColorspaces::roundtripConversion_data()
|
|||
QTest::addColumn<NamedTransferFunction>("dstTransferFunction");
|
||||
QTest::addColumn<double>("requiredAccuracy");
|
||||
|
||||
const double resolution10bit = std::pow(1.0 / 2.0, 10);
|
||||
QTest::addRow("BT709 (sRGB) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::sRGB << NamedColorimetry::BT2020 << NamedTransferFunction::linear << resolution10bit;
|
||||
QTest::addRow("BT709 (gamma 2.2) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::gamma22 << NamedColorimetry::BT2020 << NamedTransferFunction::linear << resolution10bit;
|
||||
QTest::addRow("BT709 (scRGB) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::scRGB << NamedColorimetry::BT2020 << NamedTransferFunction::linear << resolution10bit;
|
||||
QTest::addRow("BT709 (linear) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::linear << NamedColorimetry::BT2020 << NamedTransferFunction::linear << resolution10bit;
|
||||
QTest::addRow("BT709 (PQ) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::PerceptualQuantizer << NamedColorimetry::BT2020 << NamedTransferFunction::linear << 3 * resolution10bit;
|
||||
QTest::addRow("BT709 (sRGB) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::sRGB << NamedColorimetry::BT2020 << NamedTransferFunction::linear << s_resolution10bit;
|
||||
QTest::addRow("BT709 (gamma 2.2) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::gamma22 << NamedColorimetry::BT2020 << NamedTransferFunction::linear << s_resolution10bit;
|
||||
QTest::addRow("BT709 (scRGB) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::scRGB << NamedColorimetry::BT2020 << NamedTransferFunction::linear << s_resolution10bit;
|
||||
QTest::addRow("BT709 (linear) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::linear << NamedColorimetry::BT2020 << NamedTransferFunction::linear << s_resolution10bit;
|
||||
QTest::addRow("BT709 (PQ) <-> BT2020 (linear)") << NamedColorimetry::BT709 << NamedTransferFunction::PerceptualQuantizer << NamedColorimetry::BT2020 << NamedTransferFunction::linear << 3 * s_resolution10bit;
|
||||
}
|
||||
|
||||
void TestColorspaces::roundtripConversion()
|
||||
|
@ -57,8 +59,8 @@ void TestColorspaces::roundtripConversion()
|
|||
QFETCH(NamedTransferFunction, dstTransferFunction);
|
||||
QFETCH(double, requiredAccuracy);
|
||||
|
||||
const auto src = ColorDescription(srcColorimetry, srcTransferFunction, 100, 0, 100, 100, 0);
|
||||
const auto dst = ColorDescription(dstColorimetry, dstTransferFunction, 100, 0, 100, 100, 0);
|
||||
const auto src = ColorDescription(srcColorimetry, srcTransferFunction, 100, 0, 100, 100);
|
||||
const auto dst = ColorDescription(dstColorimetry, dstTransferFunction, 100, 0, 100, 100);
|
||||
|
||||
const QVector3D red(1, 0, 0);
|
||||
const QVector3D green(0, 1, 0);
|
||||
|
@ -71,6 +73,18 @@ void TestColorspaces::roundtripConversion()
|
|||
QVERIFY(compareVectors(dst.mapTo(src.mapTo(white, dst), src), white, requiredAccuracy));
|
||||
}
|
||||
|
||||
void TestColorspaces::nonNormalizedPrimaries()
|
||||
{
|
||||
// this test ensures that non-normalized primaries don't mess up the transformations between color spaces
|
||||
const auto from = Colorimetry::fromName(NamedColorimetry::BT709);
|
||||
const auto to = Colorimetry(Colorimetry::xyToXYZ(from.red()) * 2, Colorimetry::xyToXYZ(from.green()) * 2, Colorimetry::xyToXYZ(from.blue()) * 2, Colorimetry::xyToXYZ(from.white()) * 2);
|
||||
|
||||
const auto convertedWhite = from.toOther(to) * QVector3D(1, 1, 1);
|
||||
QCOMPARE_LE(std::abs(1 - convertedWhite.x()), s_resolution10bit);
|
||||
QCOMPARE_LE(std::abs(1 - convertedWhite.y()), s_resolution10bit);
|
||||
QCOMPARE_LE(std::abs(1 - convertedWhite.z()), s_resolution10bit);
|
||||
}
|
||||
|
||||
QTEST_MAIN(TestColorspaces)
|
||||
|
||||
#include "test_colorspaces.moc"
|
||||
|
|
|
@ -419,47 +419,32 @@ void TestVirtualDesktops::updateGrid_data()
|
|||
{
|
||||
QTest::addColumn<uint>("initCount");
|
||||
QTest::addColumn<QSize>("size");
|
||||
QTest::addColumn<Qt::Orientation>("orientation");
|
||||
QTest::addColumn<QPoint>("coords");
|
||||
QTest::addColumn<uint>("desktop");
|
||||
const Qt::Orientation h = Qt::Horizontal;
|
||||
const Qt::Orientation v = Qt::Vertical;
|
||||
|
||||
QTest::newRow("one desktop, h") << (uint)1 << QSize(1, 1) << h << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("one desktop, v") << (uint)1 << QSize(1, 1) << v << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("one desktop, h, 0") << (uint)1 << QSize(1, 1) << h << QPoint(1, 0) << (uint)0;
|
||||
QTest::newRow("one desktop, v, 0") << (uint)1 << QSize(1, 1) << v << QPoint(0, 1) << (uint)0;
|
||||
QTest::newRow("one desktop, h") << (uint)1 << QSize(1, 1) << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("one desktop, h, 0") << (uint)1 << QSize(1, 1) << QPoint(1, 0) << (uint)0;
|
||||
|
||||
QTest::newRow("two desktops, h, 1") << (uint)2 << QSize(2, 1) << h << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("two desktops, h, 2") << (uint)2 << QSize(2, 1) << h << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("two desktops, h, 3") << (uint)2 << QSize(2, 1) << h << QPoint(0, 1) << (uint)0;
|
||||
QTest::newRow("two desktops, h, 4") << (uint)2 << QSize(2, 1) << h << QPoint(2, 0) << (uint)0;
|
||||
QTest::newRow("two desktops, h, 1") << (uint)2 << QSize(2, 1) << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("two desktops, h, 2") << (uint)2 << QSize(2, 1) << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("two desktops, h, 3") << (uint)2 << QSize(2, 1) << QPoint(0, 1) << (uint)0;
|
||||
QTest::newRow("two desktops, h, 4") << (uint)2 << QSize(2, 1) << QPoint(2, 0) << (uint)0;
|
||||
|
||||
QTest::newRow("two desktops, v, 1") << (uint)2 << QSize(2, 1) << v << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("two desktops, v, 2") << (uint)2 << QSize(2, 1) << v << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("two desktops, v, 3") << (uint)2 << QSize(2, 1) << v << QPoint(0, 1) << (uint)0;
|
||||
QTest::newRow("two desktops, v, 4") << (uint)2 << QSize(2, 1) << v << QPoint(2, 0) << (uint)0;
|
||||
QTest::newRow("four desktops, h, one row, 1") << (uint)4 << QSize(4, 1) << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("four desktops, h, one row, 2") << (uint)4 << QSize(4, 1) << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("four desktops, h, one row, 3") << (uint)4 << QSize(4, 1) << QPoint(2, 0) << (uint)3;
|
||||
QTest::newRow("four desktops, h, one row, 4") << (uint)4 << QSize(4, 1) << QPoint(3, 0) << (uint)4;
|
||||
|
||||
QTest::newRow("four desktops, h, one row, 1") << (uint)4 << QSize(4, 1) << h << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("four desktops, h, one row, 2") << (uint)4 << QSize(4, 1) << h << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("four desktops, h, one row, 3") << (uint)4 << QSize(4, 1) << h << QPoint(2, 0) << (uint)3;
|
||||
QTest::newRow("four desktops, h, one row, 4") << (uint)4 << QSize(4, 1) << h << QPoint(3, 0) << (uint)4;
|
||||
QTest::newRow("four desktops, h, grid, 1") << (uint)4 << QSize(2, 2) << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("four desktops, h, grid, 2") << (uint)4 << QSize(2, 2) << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("four desktops, h, grid, 3") << (uint)4 << QSize(2, 2) << QPoint(0, 1) << (uint)3;
|
||||
QTest::newRow("four desktops, h, grid, 4") << (uint)4 << QSize(2, 2) << QPoint(1, 1) << (uint)4;
|
||||
QTest::newRow("four desktops, h, grid, 0/3") << (uint)4 << QSize(2, 2) << QPoint(0, 3) << (uint)0;
|
||||
|
||||
QTest::newRow("four desktops, v, one column, 1") << (uint)4 << QSize(1, 4) << v << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("four desktops, v, one column, 2") << (uint)4 << QSize(1, 4) << v << QPoint(0, 1) << (uint)2;
|
||||
QTest::newRow("four desktops, v, one column, 3") << (uint)4 << QSize(1, 4) << v << QPoint(0, 2) << (uint)3;
|
||||
QTest::newRow("four desktops, v, one column, 4") << (uint)4 << QSize(1, 4) << v << QPoint(0, 3) << (uint)4;
|
||||
|
||||
QTest::newRow("four desktops, h, grid, 1") << (uint)4 << QSize(2, 2) << h << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("four desktops, h, grid, 2") << (uint)4 << QSize(2, 2) << h << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("four desktops, h, grid, 3") << (uint)4 << QSize(2, 2) << h << QPoint(0, 1) << (uint)3;
|
||||
QTest::newRow("four desktops, h, grid, 4") << (uint)4 << QSize(2, 2) << h << QPoint(1, 1) << (uint)4;
|
||||
QTest::newRow("four desktops, h, grid, 0/3") << (uint)4 << QSize(2, 2) << h << QPoint(0, 3) << (uint)0;
|
||||
|
||||
QTest::newRow("three desktops, h, grid, 1") << (uint)3 << QSize(2, 2) << h << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("three desktops, h, grid, 2") << (uint)3 << QSize(2, 2) << h << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("three desktops, h, grid, 3") << (uint)3 << QSize(2, 2) << h << QPoint(0, 1) << (uint)3;
|
||||
QTest::newRow("three desktops, h, grid, 4") << (uint)3 << QSize(2, 2) << h << QPoint(1, 1) << (uint)0;
|
||||
QTest::newRow("three desktops, h, grid, 1") << (uint)3 << QSize(2, 2) << QPoint(0, 0) << (uint)1;
|
||||
QTest::newRow("three desktops, h, grid, 2") << (uint)3 << QSize(2, 2) << QPoint(1, 0) << (uint)2;
|
||||
QTest::newRow("three desktops, h, grid, 3") << (uint)3 << QSize(2, 2) << QPoint(0, 1) << (uint)3;
|
||||
QTest::newRow("three desktops, h, grid, 4") << (uint)3 << QSize(2, 2) << QPoint(1, 1) << (uint)0;
|
||||
}
|
||||
|
||||
void TestVirtualDesktops::updateGrid()
|
||||
|
@ -470,9 +455,8 @@ void TestVirtualDesktops::updateGrid()
|
|||
VirtualDesktopGrid grid;
|
||||
|
||||
QFETCH(QSize, size);
|
||||
QFETCH(Qt::Orientation, orientation);
|
||||
QCOMPARE(vds->desktops().count(), int(initCount));
|
||||
grid.update(size, orientation, vds->desktops());
|
||||
grid.update(size, vds->desktops());
|
||||
QCOMPARE(grid.size(), size);
|
||||
QCOMPARE(grid.width(), size.width());
|
||||
QCOMPARE(grid.height(), size.height());
|
||||
|
|
|
@ -457,6 +457,28 @@ static const TransKey g_rgQtToSymX[] = {
|
|||
{XKB_KEY_KP_7, Qt::Key_7, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_8, Qt::Key_8, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_9, Qt::Key_9, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Space, Qt::Key_Space, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Tab, Qt::Key_Tab, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Enter, Qt::Key_Enter, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Home, Qt::Key_Home, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Left, Qt::Key_Left, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Up, Qt::Key_Up, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Right, Qt::Key_Right, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Down, Qt::Key_Down, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Prior, Qt::Key_PageUp, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Next, Qt::Key_PageDown, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_End, Qt::Key_End, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Begin, Qt::Key_Clear, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Insert, Qt::Key_Insert, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Delete, Qt::Key_Delete, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Equal, Qt::Key_Equal, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Multiply, Qt::Key_Asterisk, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Add, Qt::Key_Plus, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Separator, Qt::Key_Comma, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Subtract, Qt::Key_Minus, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Decimal, Qt::Key_Period, Qt::KeypadModifier},
|
||||
{XKB_KEY_KP_Divide, Qt::Key_Slash, Qt::KeypadModifier},
|
||||
|
||||
};
|
||||
|
||||
void XkbTest::testToQtKey_data()
|
||||
|
|
|
@ -274,8 +274,6 @@ void TestDragAndDrop::testPointerDragAndDrop()
|
|||
|
||||
// verify that we did not get any further input events
|
||||
QVERIFY(pointerMotionSpy.isEmpty());
|
||||
// the release event is sent primarily for xwayland
|
||||
QCOMPARE(buttonPressSpy.count(), 2);
|
||||
}
|
||||
|
||||
void TestDragAndDrop::testTouchDragAndDrop()
|
||||
|
@ -394,6 +392,7 @@ void TestDragAndDrop::testDragAndDropWithCancelByDestroyDataSource()
|
|||
QSignalSpy dragEnteredSpy(m_dataDevice, &KWayland::Client::DataDevice::dragEntered);
|
||||
QSignalSpy dragMotionSpy(m_dataDevice, &KWayland::Client::DataDevice::dragMotion);
|
||||
QSignalSpy pointerMotionSpy(m_pointer, &KWayland::Client::Pointer::motion);
|
||||
QSignalSpy pointerLeftSpy(m_pointer, &KWayland::Client::Pointer::left);
|
||||
QSignalSpy dragLeftSpy(m_dataDevice, &KWayland::Client::DataDevice::dragLeft);
|
||||
|
||||
// now we can start the drag and drop
|
||||
|
@ -401,11 +400,12 @@ void TestDragAndDrop::testDragAndDropWithCancelByDestroyDataSource()
|
|||
m_dataSource->setDragAndDropActions(KWayland::Client::DataDeviceManager::DnDAction::Copy | KWayland::Client::DataDeviceManager::DnDAction::Move);
|
||||
m_dataDevice->startDrag(buttonPressSpy.first().first().value<quint32>(), m_dataSource, s.get());
|
||||
QVERIFY(dragStartedSpy.wait());
|
||||
|
||||
QCOMPARE(m_seatInterface->dragSurface(), serverSurface);
|
||||
QCOMPARE(m_seatInterface->dragSurfaceTransformation(), QMatrix4x4());
|
||||
QVERIFY(!m_seatInterface->dragIcon());
|
||||
QCOMPARE(SeatInterfacePrivate::get(m_seatInterface)->drag.dragImplicitGrabSerial, buttonPressSpy.first().first().value<quint32>());
|
||||
QVERIFY(dragEnteredSpy.wait());
|
||||
QVERIFY(dragEnteredSpy.count() || dragEnteredSpy.wait());
|
||||
QCOMPARE(dragEnteredSpy.count(), 1);
|
||||
QCOMPARE(dragEnteredSpy.first().first().value<quint32>(), m_display->serial());
|
||||
QCOMPARE(dragEnteredSpy.first().last().toPointF(), QPointF(0, 0));
|
||||
|
@ -452,7 +452,6 @@ void TestDragAndDrop::testDragAndDropWithCancelByDestroyDataSource()
|
|||
|
||||
// verify that we did not get any further input events
|
||||
QVERIFY(pointerMotionSpy.isEmpty());
|
||||
QCOMPARE(buttonPressSpy.count(), 2);
|
||||
}
|
||||
|
||||
void TestDragAndDrop::testPointerEventsIgnored()
|
||||
|
@ -528,14 +527,12 @@ void TestDragAndDrop::testPointerEventsIgnored()
|
|||
m_seatInterface->notifyPointerButton(1, PointerButtonState::Released);
|
||||
m_seatInterface->notifyPointerFrame();
|
||||
QVERIFY(cancelledSpy.wait());
|
||||
QVERIFY(pointerLeftSpy.count() || pointerLeftSpy.wait());
|
||||
|
||||
// all the changes should have been ignored
|
||||
QCOMPARE(axisSpy.count(), 1);
|
||||
QCOMPARE(pointerMotionSpy.count(), 1);
|
||||
QCOMPARE(pointerEnteredSpy.count(), 1);
|
||||
QVERIFY(pointerLeftSpy.isEmpty());
|
||||
// the release event is sent primary for xwayland, see BUG 465444
|
||||
QCOMPARE(buttonSpy.count(), 2);
|
||||
}
|
||||
|
||||
QTEST_GUILESS_MAIN(TestDragAndDrop)
|
||||
|
|
|
@ -81,7 +81,6 @@ void TestWaylandServerDisplay::testClientConnection()
|
|||
QVERIFY(client);
|
||||
|
||||
QVERIFY(connectedSpy.isEmpty());
|
||||
QVERIFY(display.connections().isEmpty());
|
||||
ClientConnection *connection = display.getConnection(client);
|
||||
QVERIFY(connection);
|
||||
QCOMPARE(connection->client(), client);
|
||||
|
@ -101,8 +100,6 @@ void TestWaylandServerDisplay::testClientConnection()
|
|||
QCOMPARE((wl_client *)constRef, client);
|
||||
QCOMPARE(connectedSpy.count(), 1);
|
||||
QCOMPARE(connectedSpy.first().first().value<ClientConnection *>(), connection);
|
||||
QCOMPARE(display.connections().count(), 1);
|
||||
QCOMPARE(display.connections().first(), connection);
|
||||
|
||||
QCOMPARE(connection, display.getConnection(client));
|
||||
QCOMPARE(connectedSpy.count(), 1);
|
||||
|
@ -119,10 +116,6 @@ void TestWaylandServerDisplay::testClientConnection()
|
|||
QCOMPARE(connectedSpy.first().first().value<ClientConnection *>(), connection);
|
||||
QCOMPARE(connectedSpy.last().first().value<ClientConnection *>(), connection2);
|
||||
QCOMPARE(connectedSpy.last().first().value<ClientConnection *>(), client2);
|
||||
QCOMPARE(display.connections().count(), 2);
|
||||
QCOMPARE(display.connections().first(), connection);
|
||||
QCOMPARE(display.connections().last(), connection2);
|
||||
QCOMPARE(display.connections().last(), client2);
|
||||
|
||||
// and destroy
|
||||
QVERIFY(disconnectedSpy.isEmpty());
|
||||
|
@ -136,7 +129,6 @@ void TestWaylandServerDisplay::testClientConnection()
|
|||
close(sv[1]);
|
||||
close(sv2[0]);
|
||||
close(sv2[1]);
|
||||
QVERIFY(display.connections().isEmpty());
|
||||
}
|
||||
|
||||
void TestWaylandServerDisplay::testConnectNoSocket()
|
||||
|
|
|
@ -9,11 +9,13 @@
|
|||
|
||||
// read additional window rules and add them to kwinrulesrc
|
||||
|
||||
#include <KConfig>
|
||||
#include <KConfigGroup>
|
||||
#include <QCoreApplication>
|
||||
#include <QDBusConnection>
|
||||
#include <QDBusMessage>
|
||||
#include <QDebug>
|
||||
#include <QStandardPaths>
|
||||
#include <QtDBus>
|
||||
#include <kconfig.h>
|
||||
#include <kconfiggroup.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
|
|
@ -12,13 +12,18 @@
|
|||
"Name[eo]": "Reala Nomo",
|
||||
"Name[es]": "Nombre real",
|
||||
"Name[eu]": "Benetako izena",
|
||||
"Name[fi]": "Oikea nimi",
|
||||
"Name[fr]": "Nom réel",
|
||||
"Name[gl]": "Nome real.",
|
||||
"Name[he]": "שם אמיתי",
|
||||
"Name[hu]": "Valódi név",
|
||||
"Name[ia]": "Nomine real",
|
||||
"Name[is]": "Raunverulegt nafn",
|
||||
"Name[it]": "Nome reale",
|
||||
"Name[ja]": "作者の名前",
|
||||
"Name[ka]": "ნამდვილი სახელი",
|
||||
"Name[ko]": "실제 이름",
|
||||
"Name[lt]": "Tikras vardas",
|
||||
"Name[nl]": "Echte naam",
|
||||
"Name[pl]": "Rzeczywista nazwa",
|
||||
"Name[ru]": "Настоящее имя",
|
||||
|
@ -41,13 +46,18 @@
|
|||
"Description[eo]": "Rapida Efiko",
|
||||
"Description[es]": "Efecto rápido",
|
||||
"Description[eu]": "Efektu azkarra",
|
||||
"Description[fi]": "Pikatehoste",
|
||||
"Description[fr]": "Effet rapide",
|
||||
"Description[gl]": "Efectos rápidos.",
|
||||
"Description[he]": "אפקט מהיר",
|
||||
"Description[hu]": "Gyors effektus",
|
||||
"Description[ia]": "Effecto Rapide",
|
||||
"Description[is]": "Skyndiáhrif",
|
||||
"Description[it]": "Effetto rapido",
|
||||
"Description[ja]": "クイック効果",
|
||||
"Description[ka]": "სწრაფი ეფექტი",
|
||||
"Description[ko]": "빠른 효과",
|
||||
"Description[lt]": "Quick efektas",
|
||||
"Description[nl]": "Snel-effect",
|
||||
"Description[pl]": "Szybki Efekt",
|
||||
"Description[ru]": "Быстрый эффект",
|
||||
|
@ -69,13 +79,18 @@
|
|||
"Name[eo]": "Rapida Efiko",
|
||||
"Name[es]": "Efecto rápido",
|
||||
"Name[eu]": "Efektu azkarra",
|
||||
"Name[fi]": "Pikatehoste",
|
||||
"Name[fr]": "Effet rapide",
|
||||
"Name[gl]": "Efectos rápidos",
|
||||
"Name[he]": "אפקט מהיר",
|
||||
"Name[hu]": "Gyors effektus",
|
||||
"Name[ia]": "Effecto Rapide",
|
||||
"Name[is]": "Skyndiáhrif",
|
||||
"Name[it]": "Effetto rapido",
|
||||
"Name[ja]": "クイック効果",
|
||||
"Name[ka]": "სწრაფი ეფექტი",
|
||||
"Name[ko]": "빠른 효과",
|
||||
"Name[lt]": "Quick efektas",
|
||||
"Name[nl]": "Snel-effect",
|
||||
"Name[pl]": "Szybki Efekt",
|
||||
"Name[ru]": "Быстрый эффект",
|
||||
|
|
|
@ -1,7 +1,20 @@
|
|||
# SPDX-FileCopyrightText: 2023 Niccolò Venerandi <niccolo.venerandi@kde.org>
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
|
||||
add_executable(kwin-6.0-delete-desktop-switching-shortcuts)
|
||||
target_sources(kwin-6.0-delete-desktop-switching-shortcuts PRIVATE kwin-6.0-delete-desktop-switching-shortcuts.cpp)
|
||||
target_link_libraries(kwin-6.0-delete-desktop-switching-shortcuts PRIVATE KF6::GlobalAccel)
|
||||
install(TARGETS kwin-6.0-delete-desktop-switching-shortcuts DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin/)
|
||||
|
||||
add_executable(kwin-6.0-reset-active-mouse-screen)
|
||||
target_sources(kwin-6.0-reset-active-mouse-screen PRIVATE kwin-6.0-reset-active-mouse-screen.cpp)
|
||||
target_link_libraries(kwin-6.0-reset-active-mouse-screen PRIVATE KF6::ConfigCore)
|
||||
install(TARGETS kwin-6.0-reset-active-mouse-screen DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin/)
|
||||
|
||||
add_executable(kwin-6.0-remove-breeze-tabbox-default)
|
||||
target_sources(kwin-6.0-remove-breeze-tabbox-default PRIVATE kwin-6.0-remove-breeze-tabbox-default.cpp)
|
||||
target_link_libraries(kwin-6.0-remove-breeze-tabbox-default PRIVATE KF6::ConfigCore)
|
||||
install(TARGETS kwin-6.0-remove-breeze-tabbox-default DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin/)
|
||||
|
||||
install(FILES kwin.upd
|
||||
DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR})
|
||||
install(PROGRAMS kwin-6.0-overview-activities-shortcuts.py
|
||||
DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR})
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2023 Marco Martin <mart@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <KGlobalAccel>
|
||||
|
||||
#include <QAction>
|
||||
#include <QGuiApplication>
|
||||
#include <QStandardPaths>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
const QStringList actionNames{
|
||||
QStringLiteral("Walk Through Desktops"),
|
||||
QStringLiteral("Walk Through Desktops (Reverse)"),
|
||||
QStringLiteral("Walk Through Desktop List"),
|
||||
QStringLiteral("Walk Through Desktop List (Reverse)"),
|
||||
};
|
||||
|
||||
for (const QString &actionName : actionNames) {
|
||||
QAction action;
|
||||
action.setObjectName(actionName);
|
||||
action.setProperty("componentName", QStringLiteral("kwin"));
|
||||
action.setProperty("componentDisplayName", QStringLiteral("KWin"));
|
||||
KGlobalAccel::self()->setShortcut(&action, {QKeySequence()}, KGlobalAccel::NoAutoloading);
|
||||
KGlobalAccel::self()->removeAllShortcuts(&action);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
# SPDX-FileCopyrightText: 2023 Niccolò Venerandi <niccolo.venerandi@kde.org>
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
|
||||
import fileinput
|
||||
|
||||
for line in fileinput.input():
|
||||
if line.startswith('next activity'):
|
||||
print(line.replace('Meta+Tab', 'Meta+A'))
|
||||
elif line.startswith('previous activity'):
|
||||
print(line.replace('Meta+Shift+Tab', 'Meta+Shift+A'))
|
||||
elif line.startswith('ShowDesktopGrid'):
|
||||
pass
|
||||
elif line.startswith('Overview'):
|
||||
print('Overview=Meta+W,Meta+W,Toggle Overview')
|
||||
print('Cycle Overview=Meta+Tab,Meta+Tab,Cycle through Overview and Grid View')
|
||||
print('Cycle Overview Opposite=Meta+Shift+Tab,Meta+Shift+Tab,Cycle through Grid View and Overview')
|
||||
print('Grid View=Meta+G,Meta+G,Toggle Grid View')
|
||||
else:
|
||||
print(line)
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2024 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <KConfigGroup>
|
||||
#include <KSharedConfig>
|
||||
|
||||
int main()
|
||||
{
|
||||
KConfig config(QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation) + QLatin1String("/kdedefaults/kwinrc"), KConfig::SimpleConfig);
|
||||
|
||||
KConfigGroup windows = config.group(QStringLiteral("TabBox"));
|
||||
bool needsSync = false;
|
||||
|
||||
if (!windows.exists()) {
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
if (windows.hasKey(QStringLiteral("LayoutName")) && windows.readEntry(QStringLiteral("LayoutName"), QString()) == QString("org.kde.breeze.desktop")) {
|
||||
windows.deleteEntry(QStringLiteral("LayoutName"));
|
||||
needsSync = true;
|
||||
}
|
||||
|
||||
if (windows.hasKey(QStringLiteral("DesktopListLayout"))) {
|
||||
windows.deleteEntry(QStringLiteral("DesktopListLayout"));
|
||||
needsSync = true;
|
||||
}
|
||||
if (windows.hasKey(QStringLiteral("DesktopLayout"))) {
|
||||
windows.deleteEntry(QStringLiteral("DesktopLayout"));
|
||||
needsSync = true;
|
||||
}
|
||||
|
||||
if (needsSync) {
|
||||
return windows.sync() ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
} else {
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2024 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <KConfigGroup>
|
||||
#include <KSharedConfig>
|
||||
|
||||
int main()
|
||||
{
|
||||
auto config = KSharedConfig::openConfig(QStringLiteral("kwinrc"));
|
||||
|
||||
KConfigGroup windows = config->group(QStringLiteral("Windows"));
|
||||
if (!windows.exists()) {
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
if (!windows.hasKey(QStringLiteral("ActiveMouseScreen"))) {
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
windows.deleteEntry(QStringLiteral("ActiveMouseScreen"));
|
||||
|
||||
return windows.sync() ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
|
@ -1,11 +1,16 @@
|
|||
# SPDX-FileCopyrightText: 2023 Niccolò Venerandi <niccolo.venerandi@kde.org>
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
|
||||
|
||||
Version=5
|
||||
Version=6
|
||||
|
||||
# Changes the default Activities shortcut from Meta+Tab to Meta+A,
|
||||
# so that the Overview can take its place
|
||||
Id=change-activities-overview-shortcuts
|
||||
File=kglobalshortcutsrc
|
||||
Group=plasmashell,kwin
|
||||
Script=kwin-6.0-overview-activities-shortcuts.py,python3
|
||||
# Reset ActiveMouseScreen config option.
|
||||
Id=kwin-6.0-reset-active-mouse-screen
|
||||
Script=kwin-6.0-reset-active-mouse-screen
|
||||
|
||||
# Delete old desktop switching shortcuts.
|
||||
Id=kwin-6.0-delete-desktop-switching-shortcuts
|
||||
Script=kwin-6.0-delete-desktop-switching-shortcuts
|
||||
|
||||
# Delete old tabbox defaults
|
||||
Id=kwin-6.0-remove-breeze-tabbox-default
|
||||
Script=kwin-6.0-remove-breeze-tabbox-default
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwindecoration stable\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2005-06-18 11:28+0200\n"
|
||||
"Last-Translator: JUANITA FRANZ <JUANITA.FRANZ@VR-WEB.DE>\n"
|
||||
"Language-Team: AFRIKAANS <translate-discuss-af@lists.sourceforge.net>\n"
|
||||
|
@ -66,7 +66,7 @@ msgstr ""
|
|||
msgid "Keep above other windows"
|
||||
msgstr ""
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinrules stable\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2005-11-26 16:33+0200\n"
|
||||
"Last-Translator: Ilze Thirion <ilze.thirion@gmail.com>\n"
|
||||
"Language-Team: AFRIKAANS <translate-discuss-af@lists.sourceforge.net>\n"
|
||||
|
@ -274,7 +274,7 @@ msgstr "Aktiewe opacity in %"
|
|||
msgid "Screen"
|
||||
msgstr "Spat Skerm"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Fullscreen"
|
||||
msgid "Fullscreen"
|
||||
|
@ -411,7 +411,7 @@ msgstr ""
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr ""
|
||||
|
@ -527,21 +527,20 @@ msgid "Closeable"
|
|||
msgstr "Toemaakbaar"
|
||||
|
||||
#: rulesmodel.cpp:709
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &type"
|
||||
msgid "Set window type"
|
||||
msgstr "Venster tipe"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &class (application type):"
|
||||
|
@ -599,7 +598,7 @@ msgstr "Afskeur kieslys"
|
|||
msgid "Splash Screen"
|
||||
msgstr "Spat Skerm"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "Werkskerm"
|
||||
|
@ -695,7 +694,7 @@ msgstr "Geen"
|
|||
msgid "Low"
|
||||
msgstr "Laag"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "Normaal"
|
||||
|
@ -710,13 +709,49 @@ msgstr "Hoog"
|
|||
msgid "Extreme"
|
||||
msgstr "Buitensporige"
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Position"
|
||||
msgid "Notification"
|
||||
msgstr "Posisie"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "On Main Window"
|
||||
msgid "Unmanaged window"
|
||||
msgstr "Op Hoof Venster"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -875,29 +910,29 @@ msgstr[1] ""
|
|||
msgid "Add property to the rule"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "None"
|
||||
msgid "No"
|
||||
msgstr "Geen"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -909,6 +944,11 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Window &type"
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "Venster tipe"
|
||||
|
||||
#~ msgid "This helper utility is not supposed to be called directly."
|
||||
#~ msgstr ""
|
||||
#~ "Hierdie helper nutsprogramme is nie veronderstel om direk geroep te word "
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwm stable\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2005-11-25 19:56+0200\n"
|
||||
"Last-Translator: Kobus Venter <kabousv@therugby.co.za>\n"
|
||||
"Language-Team: AFRIKAANS <translate-discuss-af@lists.sourceforge.net>\n"
|
||||
|
@ -944,23 +944,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -968,13 +953,13 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr ""
|
||||
|
@ -1314,14 +1299,14 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "Klamp vensters slegs wanneer oorvleuel"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
"This behavior is common on other operating systems and likely what you want."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1331,7 +1316,7 @@ msgid ""
|
|||
"em>."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1340,7 +1325,7 @@ msgid ""
|
|||
"to focus</em> just without having to actually click."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1349,7 +1334,7 @@ msgid ""
|
|||
"if you want a hover controlled focus."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1359,7 +1344,7 @@ msgid ""
|
|||
"precedence)</em> instead!"
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
|
354
po/af/kwin.po
354
po/af/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-06-21 02:02+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-06-08 12:05+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: ar\n"
|
||||
|
@ -18,17 +18,17 @@ msgstr ""
|
|||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
"X-Generator: Lokalize 22.12.3\n"
|
||||
|
||||
#: module.cpp:50
|
||||
#: module.cpp:49
|
||||
#, kde-format
|
||||
msgid "Import KWin Script"
|
||||
msgstr "استورد سكرِبت نوافذك"
|
||||
|
||||
#: module.cpp:51
|
||||
#: module.cpp:50
|
||||
#, kde-format
|
||||
msgid "*.kwinscript|KWin scripts (*.kwinscript)"
|
||||
msgstr "*.kwinscript|سكرِبتات نوافذك (*.kwinscript)"
|
||||
|
||||
#: module.cpp:62
|
||||
#: module.cpp:61
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is error message returned from the install service"
|
||||
msgid ""
|
||||
|
@ -38,13 +38,13 @@ msgstr ""
|
|||
"لا يمكن استيراد السكربت المحدد.\n"
|
||||
"%1"
|
||||
|
||||
#: module.cpp:66
|
||||
#: module.cpp:65
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is name of the script that was imported"
|
||||
msgid "The script \"%1\" was successfully imported."
|
||||
msgstr "استورد السّكرِبت \"%1\" بنجاح."
|
||||
|
||||
#: module.cpp:125
|
||||
#: module.cpp:124
|
||||
#, kde-format
|
||||
msgid "Error when uninstalling KWin Script: %1"
|
||||
msgstr "خطأ عند إلغاء تثبيت سكربت كوين: %1"
|
||||
|
|
|
@ -14,7 +14,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwindecoration\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-04-06 12:35+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: ar\n"
|
||||
|
@ -76,7 +76,7 @@ msgstr "أبقها أسفل النوافذ الأخرى"
|
|||
msgid "Keep above other windows"
|
||||
msgstr "أبقها أعلى النوافذ الأخرى"
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinrules\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2023-06-08 12:05+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: ar\n"
|
||||
|
@ -277,7 +277,7 @@ msgstr "الأنشطة"
|
|||
msgid "Screen"
|
||||
msgstr "الشّاشة"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, kde-format
|
||||
msgid "Fullscreen"
|
||||
msgstr "ملء الشّاشة"
|
||||
|
@ -418,7 +418,7 @@ msgstr "بدون شريط العنوان والإطار"
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr "المظهر والإصلاحات"
|
||||
|
@ -564,19 +564,19 @@ msgstr "قابلة للإغلاق"
|
|||
|
||||
#: rulesmodel.cpp:709
|
||||
#, kde-format
|
||||
msgid "Set window type"
|
||||
msgstr "حدد نوع النافذة"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr "اسم ملف سطح المكتب"
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr "التركيب الكتلي"
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, kde-format
|
||||
msgid "Window class not available"
|
||||
|
@ -636,7 +636,7 @@ msgstr "قائمة ممزقة"
|
|||
msgid "Splash Screen"
|
||||
msgstr "شاشة البداية"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "سطح المكتب"
|
||||
|
@ -729,7 +729,7 @@ msgstr "لا شيء"
|
|||
msgid "Low"
|
||||
msgstr "منخفض"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "عادي"
|
||||
|
@ -744,12 +744,48 @@ msgstr "عالي"
|
|||
msgid "Extreme"
|
||||
msgstr "قصوى"
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Position"
|
||||
msgid "Notification"
|
||||
msgstr "الموقع"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, kde-format
|
||||
msgid "Unmanaged window"
|
||||
msgstr "نافذة غير مدارة"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr "لا يمكن اكتشاف خواص النافذة. لا تدار النافذة بواسطة كوين."
|
||||
|
@ -912,28 +948,28 @@ msgstr[5] "بعد %1 ثانية"
|
|||
msgid "Add property to the rule"
|
||||
msgstr "أضف خاصية للقاعدة"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr "نعم"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, kde-format
|
||||
msgid "No"
|
||||
msgstr "لا"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr "%1 ٪"
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr "(%1، %2)"
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -945,6 +981,9 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr "×"
|
||||
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "حدد نوع النافذة"
|
||||
|
||||
#~ msgid "Window shall (not) appear in the taskbar."
|
||||
#~ msgstr "لا/يجب أن تظهر النافذة في شريط المهام."
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-02-16 12:17+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: ar\n"
|
||||
|
@ -18,33 +18,33 @@ msgstr ""
|
|||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
"X-Generator: Lokalize 21.12.3\n"
|
||||
|
||||
#: layoutpreview.cpp:131
|
||||
#: layoutpreview.cpp:127
|
||||
#, kde-format
|
||||
msgid "Show Desktop"
|
||||
msgstr "أظهر سطح المكتب"
|
||||
|
||||
#: layoutpreview.cpp:161
|
||||
#: layoutpreview.cpp:157
|
||||
#, kde-format
|
||||
msgctxt "An example Desktop Name"
|
||||
msgid "Desktop 1"
|
||||
msgstr "سطح المكتب 1"
|
||||
|
||||
#: main.cpp:67
|
||||
#: main.cpp:66
|
||||
#, kde-format
|
||||
msgid "Main"
|
||||
msgstr "الرّئيسيّ"
|
||||
|
||||
#: main.cpp:68
|
||||
#: main.cpp:67
|
||||
#, kde-format
|
||||
msgid "Alternative"
|
||||
msgstr "البديل"
|
||||
|
||||
#: main.cpp:70
|
||||
#: main.cpp:69
|
||||
#, kde-format
|
||||
msgid "Get New Task Switchers..."
|
||||
msgstr "احصل على مُبدِّل مهام جديد"
|
||||
|
||||
#: main.cpp:84
|
||||
#: main.cpp:83
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"Focus policy settings limit the functionality of navigating through windows."
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinscreenedges\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-19 02:29+0000\n"
|
||||
"PO-Revision-Date: 2022-08-08 21:54+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: Arabic <kde-l10n-ar@kde.org>\n"
|
||||
|
@ -18,68 +18,68 @@ msgstr ""
|
|||
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
||||
"X-Generator: Lokalize 21.07.70\n"
|
||||
|
||||
#: main.cpp:151 touch.cpp:117
|
||||
#: main.cpp:151 touch.cpp:118
|
||||
#, kde-format
|
||||
msgid "No Action"
|
||||
msgstr "لا إجراء"
|
||||
|
||||
#: main.cpp:152 touch.cpp:118
|
||||
#: main.cpp:152 touch.cpp:119
|
||||
#, kde-format
|
||||
msgid "Peek at Desktop"
|
||||
msgstr "نظرة على سطح المكتب"
|
||||
|
||||
#: main.cpp:153 touch.cpp:119
|
||||
#: main.cpp:153 touch.cpp:120
|
||||
#, kde-format
|
||||
msgid "Lock Screen"
|
||||
msgstr "اقفل الشّاشة"
|
||||
|
||||
#: main.cpp:154 touch.cpp:120
|
||||
#: main.cpp:154 touch.cpp:121
|
||||
#, kde-format
|
||||
msgid "Show KRunner"
|
||||
msgstr "أظهر مشغل.ك"
|
||||
|
||||
#: main.cpp:155 touch.cpp:121
|
||||
#: main.cpp:155 touch.cpp:122
|
||||
#, kde-format
|
||||
msgid "Activity Manager"
|
||||
msgstr "مدير الأنشطة"
|
||||
|
||||
#: main.cpp:156 touch.cpp:122
|
||||
#: main.cpp:156 touch.cpp:123
|
||||
#, kde-format
|
||||
msgid "Application Launcher"
|
||||
msgstr "مُطلق التّطبيقات"
|
||||
|
||||
#: main.cpp:160 touch.cpp:126
|
||||
#: main.cpp:160 touch.cpp:127
|
||||
#, kde-format
|
||||
msgid "Present Windows"
|
||||
msgstr "النوافذ الحاضرة"
|
||||
|
||||
#: main.cpp:161 touch.cpp:127
|
||||
#: main.cpp:161 touch.cpp:128
|
||||
#, kde-format
|
||||
msgid "%1 - All Desktops"
|
||||
msgstr "%1 - كلّ أسطح المكتب"
|
||||
|
||||
#: main.cpp:162 touch.cpp:128
|
||||
#: main.cpp:162 touch.cpp:129
|
||||
#, kde-format
|
||||
msgid "%1 - Current Desktop"
|
||||
msgstr "%1 - سطح المكتب الحاليّ"
|
||||
|
||||
#: main.cpp:163 touch.cpp:129
|
||||
#: main.cpp:163 touch.cpp:130
|
||||
#, kde-format
|
||||
msgid "%1 - Current Application"
|
||||
msgstr "%1 - التّطبيق الحاليّ"
|
||||
|
||||
#: main.cpp:165
|
||||
#: main.cpp:165 touch.cpp:132
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Toggle Overview"
|
||||
msgid "Overview"
|
||||
msgstr "بدل النظرة العامة"
|
||||
|
||||
#: main.cpp:167 touch.cpp:131
|
||||
#: main.cpp:167 touch.cpp:134
|
||||
#, kde-format
|
||||
msgid "Toggle window switching"
|
||||
msgstr "بدّل تنقل النوافذ"
|
||||
|
||||
#: main.cpp:168 touch.cpp:132
|
||||
#: main.cpp:168 touch.cpp:135
|
||||
#, kde-format
|
||||
msgid "Toggle alternative window switching"
|
||||
msgstr "بدّل تنقل النوافذ البديل"
|
||||
|
|
|
@ -12,7 +12,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwm\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2022-12-22 11:14+0400\n"
|
||||
"Last-Translator: Zayed Al-Saidi <zayed.alsaidi@gmail.com>\n"
|
||||
"Language-Team: ar\n"
|
||||
|
@ -878,26 +878,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr "سلوك الشاشات المتعددة:"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
"عند تمكين هذا الخيار ، تكون الشاشة النشطة (حيث تظهر النوافذ الجديدة ، على "
|
||||
"سبيل المثال) هي الشاشة التي تحتوي على مؤشر الفأرة. عند التعطيل ، تكون الشاشة "
|
||||
"النشطة هي الشاشة التي تحتوي على النافذة المركزة."
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr "الشاشة النشطة تتبع ال&فأرة"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -906,13 +888,13 @@ msgstr ""
|
|||
"إذا تم تمكين هذا الخيار ، عمليات التركيز ستكون محدودة فقط في الشاشة النشطة"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr "اف&صل تركيز الشاشة"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr "وصف سياسة تنشيط النافذة"
|
||||
|
@ -1217,7 +1199,7 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "فقط عندما تكون تغطي بعضها"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
|
@ -1226,7 +1208,7 @@ msgstr ""
|
|||
"<em> انقر للتركيز: </em> تصبح النافذة نشطة عندما تنقر عليها.هذا السلوك شائع "
|
||||
"في أنظمة التشغيل الأخرى وعلى الأرجح ما تريده."
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1240,7 +1222,7 @@ msgstr ""
|
|||
"بسبب إغلاق النافذة النشطة حاليًا) ، فإن النافذة الموجودة أسفل الفأرة هي "
|
||||
"المرشح المفضل. هذا غير معتاد ولكنه تنويع ممكن لـ <em> انقر للتركيز </em>."
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1253,7 +1235,7 @@ msgstr ""
|
|||
"يستمر <em> التركيز على منع السرقة </em> كالمعتاد. إنها تشبه <em> انقر "
|
||||
"للتركيز </em> دون الحاجة إلى النقر فعليًا."
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1266,7 +1248,7 @@ msgstr ""
|
|||
"حاليًا) ، فإن النافذة الموجودة أسفل الفأرة هي المرشح المفضل. اختر هذا ، إذا "
|
||||
"كنت تريد تركيزًا متحكمًا فيه بواسطة التحويم."
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1281,7 +1263,7 @@ msgstr ""
|
|||
"من المحتمل جدًا أنك تريد استخدام <em> التركيز يتبع الفأرة (أولوية الفأرة) </"
|
||||
"em> بدلاً من ذلك!"
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
@ -1298,6 +1280,18 @@ msgstr ""
|
|||
"التنشيط ولن تعمل. من المحتمل جدًا أنك تريد استخدام <em> التركيز يتبع الفأرة "
|
||||
"(أولوية الفأرة) </em> بدلاً من ذلك!"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When this option is enabled, the active screen (where new windows appear, "
|
||||
#~ "for example) is the screen containing the mouse pointer. When disabled, "
|
||||
#~ "the active screen is the screen containing the focused window."
|
||||
#~ msgstr ""
|
||||
#~ "عند تمكين هذا الخيار ، تكون الشاشة النشطة (حيث تظهر النوافذ الجديدة ، على "
|
||||
#~ "سبيل المثال) هي الشاشة التي تحتوي على مؤشر الفأرة. عند التعطيل ، تكون "
|
||||
#~ "الشاشة النشطة هي الشاشة التي تحتوي على النافذة المركزة."
|
||||
|
||||
#~ msgid "Active screen follows &mouse"
|
||||
#~ msgstr "الشاشة النشطة تتبع ال&فأرة"
|
||||
|
||||
#~ msgctxt "NAME OF TRANSLATORS"
|
||||
#~ msgid "Your names"
|
||||
#~ msgstr "Mohamed SAAD محمد سعد,زايد السعيدي"
|
||||
|
|
357
po/ar/kwin.po
357
po/ar/kwin.po
File diff suppressed because it is too large
Load Diff
354
po/as/kwin.po
354
po/as/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-06-21 02:02+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-05-03 21:12+0200\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -17,17 +17,17 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.0\n"
|
||||
|
||||
#: module.cpp:50
|
||||
#: module.cpp:49
|
||||
#, kde-format
|
||||
msgid "Import KWin Script"
|
||||
msgstr ""
|
||||
|
||||
#: module.cpp:51
|
||||
#: module.cpp:50
|
||||
#, kde-format
|
||||
msgid "*.kwinscript|KWin scripts (*.kwinscript)"
|
||||
msgstr "*.kwinscript|Scripts de KWin (*.kwinscript)"
|
||||
|
||||
#: module.cpp:62
|
||||
#: module.cpp:61
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is error message returned from the install service"
|
||||
msgid ""
|
||||
|
@ -35,13 +35,13 @@ msgid ""
|
|||
"%1"
|
||||
msgstr ""
|
||||
|
||||
#: module.cpp:66
|
||||
#: module.cpp:65
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is name of the script that was imported"
|
||||
msgid "The script \"%1\" was successfully imported."
|
||||
msgstr ""
|
||||
|
||||
#: module.cpp:125
|
||||
#: module.cpp:124
|
||||
#, kde-format
|
||||
msgid "Error when uninstalling KWin Script: %1"
|
||||
msgstr ""
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-05-03 21:12+0200\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -67,7 +67,7 @@ msgstr ""
|
|||
msgid "Keep above other windows"
|
||||
msgstr ""
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2023-11-07 21:27+0100\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -254,7 +254,7 @@ msgstr ""
|
|||
msgid "Screen"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, kde-format
|
||||
msgid "Fullscreen"
|
||||
msgstr ""
|
||||
|
@ -381,7 +381,7 @@ msgstr ""
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr ""
|
||||
|
@ -491,19 +491,19 @@ msgstr ""
|
|||
|
||||
#: rulesmodel.cpp:709
|
||||
#, kde-format
|
||||
msgid "Set window type"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, kde-format
|
||||
msgid "Window class not available"
|
||||
|
@ -559,7 +559,7 @@ msgstr ""
|
|||
msgid "Splash Screen"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr ""
|
||||
|
@ -652,7 +652,7 @@ msgstr ""
|
|||
msgid "Low"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr ""
|
||||
|
@ -667,12 +667,47 @@ msgstr ""
|
|||
msgid "Extreme"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, kde-format
|
||||
msgid "Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, kde-format
|
||||
msgid "Unmanaged window"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -825,28 +860,28 @@ msgstr[1] ""
|
|||
msgid "Add property to the rule"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, kde-format
|
||||
msgid "No"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-11-07 21:27+0100\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -17,33 +17,33 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.08.2\n"
|
||||
|
||||
#: layoutpreview.cpp:131
|
||||
#: layoutpreview.cpp:127
|
||||
#, kde-format
|
||||
msgid "Show Desktop"
|
||||
msgstr ""
|
||||
|
||||
#: layoutpreview.cpp:161
|
||||
#: layoutpreview.cpp:157
|
||||
#, kde-format
|
||||
msgctxt "An example Desktop Name"
|
||||
msgid "Desktop 1"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:67
|
||||
#: main.cpp:66
|
||||
#, kde-format
|
||||
msgid "Main"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:68
|
||||
#: main.cpp:67
|
||||
#, kde-format
|
||||
msgid "Alternative"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:70
|
||||
#: main.cpp:69
|
||||
#, kde-format
|
||||
msgid "Get New Task Switchers..."
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:84
|
||||
#: main.cpp:83
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"Focus policy settings limit the functionality of navigating through windows."
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-19 02:29+0000\n"
|
||||
"PO-Revision-Date: 2023-05-03 21:14+0200\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -17,67 +17,67 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.0\n"
|
||||
|
||||
#: main.cpp:151 touch.cpp:117
|
||||
#: main.cpp:151 touch.cpp:118
|
||||
#, kde-format
|
||||
msgid "No Action"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:152 touch.cpp:118
|
||||
#: main.cpp:152 touch.cpp:119
|
||||
#, kde-format
|
||||
msgid "Peek at Desktop"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:153 touch.cpp:119
|
||||
#: main.cpp:153 touch.cpp:120
|
||||
#, kde-format
|
||||
msgid "Lock Screen"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:154 touch.cpp:120
|
||||
#: main.cpp:154 touch.cpp:121
|
||||
#, kde-format
|
||||
msgid "Show KRunner"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:155 touch.cpp:121
|
||||
#: main.cpp:155 touch.cpp:122
|
||||
#, kde-format
|
||||
msgid "Activity Manager"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:156 touch.cpp:122
|
||||
#: main.cpp:156 touch.cpp:123
|
||||
#, kde-format
|
||||
msgid "Application Launcher"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:160 touch.cpp:126
|
||||
#: main.cpp:160 touch.cpp:127
|
||||
#, kde-format
|
||||
msgid "Present Windows"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:161 touch.cpp:127
|
||||
#: main.cpp:161 touch.cpp:128
|
||||
#, kde-format
|
||||
msgid "%1 - All Desktops"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:162 touch.cpp:128
|
||||
#: main.cpp:162 touch.cpp:129
|
||||
#, kde-format
|
||||
msgid "%1 - Current Desktop"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:163 touch.cpp:129
|
||||
#: main.cpp:163 touch.cpp:130
|
||||
#, kde-format
|
||||
msgid "%1 - Current Application"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:165
|
||||
#: main.cpp:165 touch.cpp:132
|
||||
#, kde-format
|
||||
msgid "Overview"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:167 touch.cpp:131
|
||||
#: main.cpp:167 touch.cpp:134
|
||||
#, kde-format
|
||||
msgid "Toggle window switching"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:168 touch.cpp:132
|
||||
#: main.cpp:168 touch.cpp:135
|
||||
#, kde-format
|
||||
msgid "Toggle alternative window switching"
|
||||
msgstr ""
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-11-07 21:27+0100\n"
|
||||
"Last-Translator: Enol P. <enolp@softastur.org>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -779,23 +779,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -803,13 +788,13 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr ""
|
||||
|
@ -1102,14 +1087,14 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
"This behavior is common on other operating systems and likely what you want."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1119,7 +1104,7 @@ msgid ""
|
|||
"em>."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1128,7 +1113,7 @@ msgid ""
|
|||
"to focus</em> just without having to actually click."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1137,7 +1122,7 @@ msgid ""
|
|||
"if you want a hover controlled focus."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1147,7 +1132,7 @@ msgid ""
|
|||
"precedence)</em> instead!"
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
|
347
po/ast/kwin.po
347
po/ast/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-06-21 02:02+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2022-10-18 00:04+0400\n"
|
||||
"Last-Translator: Kheyyam <xxmn77@gmail.com>\n"
|
||||
"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -17,17 +17,17 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 22.08.2\n"
|
||||
|
||||
#: module.cpp:50
|
||||
#: module.cpp:49
|
||||
#, kde-format
|
||||
msgid "Import KWin Script"
|
||||
msgstr "KWin Skriptinin İdxalı"
|
||||
|
||||
#: module.cpp:51
|
||||
#: module.cpp:50
|
||||
#, kde-format
|
||||
msgid "*.kwinscript|KWin scripts (*.kwinscript)"
|
||||
msgstr "*.kwinscript|KWin skriptləri (*.kwinscript)"
|
||||
|
||||
#: module.cpp:62
|
||||
#: module.cpp:61
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is error message returned from the install service"
|
||||
msgid ""
|
||||
|
@ -37,13 +37,13 @@ msgstr ""
|
|||
"Seçilmiş skript idxal edilə bilmir.\n"
|
||||
"%1"
|
||||
|
||||
#: module.cpp:66
|
||||
#: module.cpp:65
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is name of the script that was imported"
|
||||
msgid "The script \"%1\" was successfully imported."
|
||||
msgstr "\"%1\" skripti uğurla idxal olundu."
|
||||
|
||||
#: module.cpp:125
|
||||
#: module.cpp:124
|
||||
#, kde-format
|
||||
msgid "Error when uninstalling KWin Script: %1"
|
||||
msgstr "Bu KWin Script'in silinməsi zamanı xəta: %1"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2021-06-10 11:34+0400\n"
|
||||
"Last-Translator: Kheyyam Gojayev <xxmn77@gmail.com>\n"
|
||||
"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -67,7 +67,7 @@ msgstr "Digər pəncərələrin altında tutmaq"
|
|||
msgid "Keep above other windows"
|
||||
msgstr "Digər pəncərələrin üzərində tutmaq"
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2023-01-02 23:31+0400\n"
|
||||
"Last-Translator: Kheyyam <xxmn77@gmail.com>\n"
|
||||
"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -274,7 +274,7 @@ msgstr "Otaqlar"
|
|||
msgid "Screen"
|
||||
msgstr "Ekran"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, kde-format
|
||||
msgid "Fullscreen"
|
||||
msgstr "Tam ekran"
|
||||
|
@ -414,7 +414,7 @@ msgstr "Başlıq və çərçivə yoxdur"
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr "Xarici görünüş və Səhv düzəlişi"
|
||||
|
@ -524,19 +524,19 @@ msgstr "Bağlana bilən"
|
|||
|
||||
#: rulesmodel.cpp:709
|
||||
#, kde-format
|
||||
msgid "Set window type"
|
||||
msgstr "Pəncərə növünü seçin"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr ".desktop faylı"
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr "Effektləri əngəlləmək"
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window class (application)"
|
||||
|
@ -593,7 +593,7 @@ msgstr "Qopan menyu"
|
|||
msgid "Splash Screen"
|
||||
msgstr "Açılış ekranı"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "İş masası"
|
||||
|
@ -686,7 +686,7 @@ msgstr "Heç biri"
|
|||
msgid "Low"
|
||||
msgstr "Zəif üstünlük"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "Normal üstünlük"
|
||||
|
@ -701,13 +701,49 @@ msgstr "Yüksək üstünlük"
|
|||
msgid "Extreme"
|
||||
msgstr "Müstəsna"
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Position"
|
||||
msgid "Notification"
|
||||
msgstr "Mövqe"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "On Main Window"
|
||||
msgid "Unmanaged window"
|
||||
msgstr "Əsas Pəncərədə"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -871,28 +907,28 @@ msgstr[1] "%1 saniyədən sonra"
|
|||
msgid "Add property to the rule"
|
||||
msgstr "Xüsusiyyətləri qaydaya əlavə et"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr "Bəli"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, kde-format
|
||||
msgid "No"
|
||||
msgstr "1"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr "%1 %"
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr "(%1, %2)"
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -904,6 +940,9 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr "x"
|
||||
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "Pəncərə növünü seçin"
|
||||
|
||||
#~ msgid "Window shall (not) appear in the taskbar."
|
||||
#~ msgstr "Pəncərə tapşırıq panelində görünəcək/görünməyəcək."
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2022-07-03 14:23+0400\n"
|
||||
"Last-Translator: Kheyyam <xxmn77@gmail.com>\n"
|
||||
"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -17,33 +17,33 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 22.04.2\n"
|
||||
|
||||
#: layoutpreview.cpp:131
|
||||
#: layoutpreview.cpp:127
|
||||
#, kde-format
|
||||
msgid "Show Desktop"
|
||||
msgstr "İş masasını göstərmək"
|
||||
|
||||
#: layoutpreview.cpp:161
|
||||
#: layoutpreview.cpp:157
|
||||
#, kde-format
|
||||
msgctxt "An example Desktop Name"
|
||||
msgid "Desktop 1"
|
||||
msgstr "İş masası 1"
|
||||
|
||||
#: main.cpp:67
|
||||
#: main.cpp:66
|
||||
#, kde-format
|
||||
msgid "Main"
|
||||
msgstr "Əsas"
|
||||
|
||||
#: main.cpp:68
|
||||
#: main.cpp:67
|
||||
#, kde-format
|
||||
msgid "Alternative"
|
||||
msgstr "Alternativ"
|
||||
|
||||
#: main.cpp:70
|
||||
#: main.cpp:69
|
||||
#, kde-format
|
||||
msgid "Get New Task Switchers..."
|
||||
msgstr "Yeni Vizual Pəncərə Dəyişdiricilərini Almaq..."
|
||||
|
||||
#: main.cpp:84
|
||||
#: main.cpp:83
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"Focus policy settings limit the functionality of navigating through windows."
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-19 02:29+0000\n"
|
||||
"PO-Revision-Date: 2022-07-19 10:54+0400\n"
|
||||
"Last-Translator: Kheyyam <xxmn77@gmail.com>\n"
|
||||
"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -17,68 +17,68 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Lokalize 22.04.3\n"
|
||||
|
||||
#: main.cpp:151 touch.cpp:117
|
||||
#: main.cpp:151 touch.cpp:118
|
||||
#, kde-format
|
||||
msgid "No Action"
|
||||
msgstr "Hərəkətsiz"
|
||||
|
||||
#: main.cpp:152 touch.cpp:118
|
||||
#: main.cpp:152 touch.cpp:119
|
||||
#, kde-format
|
||||
msgid "Peek at Desktop"
|
||||
msgstr "İş masasına nəzər salın"
|
||||
|
||||
#: main.cpp:153 touch.cpp:119
|
||||
#: main.cpp:153 touch.cpp:120
|
||||
#, kde-format
|
||||
msgid "Lock Screen"
|
||||
msgstr "Ekranı kilidləmək"
|
||||
|
||||
#: main.cpp:154 touch.cpp:120
|
||||
#: main.cpp:154 touch.cpp:121
|
||||
#, kde-format
|
||||
msgid "Show KRunner"
|
||||
msgstr "KRunner göstərmək"
|
||||
|
||||
#: main.cpp:155 touch.cpp:121
|
||||
#: main.cpp:155 touch.cpp:122
|
||||
#, kde-format
|
||||
msgid "Activity Manager"
|
||||
msgstr "Fəaliyyət Meneceri"
|
||||
|
||||
#: main.cpp:156 touch.cpp:122
|
||||
#: main.cpp:156 touch.cpp:123
|
||||
#, kde-format
|
||||
msgid "Application Launcher"
|
||||
msgstr "Tətbiq Başladıcı"
|
||||
|
||||
#: main.cpp:160 touch.cpp:126
|
||||
#: main.cpp:160 touch.cpp:127
|
||||
#, kde-format
|
||||
msgid "Present Windows"
|
||||
msgstr "hazırkı pəncərələr"
|
||||
|
||||
#: main.cpp:161 touch.cpp:127
|
||||
#: main.cpp:161 touch.cpp:128
|
||||
#, kde-format
|
||||
msgid "%1 - All Desktops"
|
||||
msgstr "%1 - Bütün İş masaları"
|
||||
|
||||
#: main.cpp:162 touch.cpp:128
|
||||
#: main.cpp:162 touch.cpp:129
|
||||
#, kde-format
|
||||
msgid "%1 - Current Desktop"
|
||||
msgstr "%1 - Hazırkı İş masası"
|
||||
|
||||
#: main.cpp:163 touch.cpp:129
|
||||
#: main.cpp:163 touch.cpp:130
|
||||
#, kde-format
|
||||
msgid "%1 - Current Application"
|
||||
msgstr "%1 - Cari tətbiq"
|
||||
|
||||
#: main.cpp:165
|
||||
#: main.cpp:165 touch.cpp:132
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Toggle Overview"
|
||||
msgid "Overview"
|
||||
msgstr "Ümumi baxışı dəyişmək"
|
||||
|
||||
#: main.cpp:167 touch.cpp:131
|
||||
#: main.cpp:167 touch.cpp:134
|
||||
#, kde-format
|
||||
msgid "Toggle window switching"
|
||||
msgstr "Pəncərə dəyişmə açarı"
|
||||
|
||||
#: main.cpp:168 touch.cpp:132
|
||||
#: main.cpp:168 touch.cpp:135
|
||||
#, kde-format
|
||||
msgid "Toggle alternative window switching"
|
||||
msgstr "Əlavə pəncərə dəyişmə açarı"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2022-10-18 00:03+0400\n"
|
||||
"Last-Translator: Kheyyam <xxmn77@gmail.com>\n"
|
||||
"Language-Team: Azerbaijani <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -914,26 +914,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr "Birdən çox ekranla davranış:"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
"Bu seçim aktiv edildikdə, aktiv ekran (məsələn yeni pəncərələrin göründüyü "
|
||||
"yer) siçan kursorundan ibarət ekrandır. Söndürüldükdə isə aktiv kranın "
|
||||
"fokuslanmış pəncərələrindən ibarət ekrandır."
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr "Aktiv ekran &kursoru izləyir"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -943,13 +925,13 @@ msgstr ""
|
|||
"məhdudlaşır"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr "Ekran üçün ayrıca foku&s"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr "Pəncərənin aktivləşdirilməsi qaydalarının təfərrüatları"
|
||||
|
@ -1259,7 +1241,7 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "Yalnız üst-üstə gəldikdə yapışdırmaq"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
|
@ -1269,7 +1251,7 @@ msgstr ""
|
|||
"aktivləşir. Siz ola bilsin ki, bununla başqa əməliyyat sistemlərindən "
|
||||
"tanışsını."
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1284,7 +1266,7 @@ msgstr ""
|
|||
"olsa da <em>Fokus üçün klik</em> rejiminə alternativ variant kimi qəbul "
|
||||
"olunur."
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1297,7 +1279,7 @@ msgstr ""
|
|||
"ki, <em>Fokusun dəyişməsin qarşısının alınması</em> adi qaydada işləyir. Bu "
|
||||
"variant <em>Fokus üçün klik</em>oxşayır, ancaq xüsusi klik tələb olunmur."
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1310,7 +1292,7 @@ msgstr ""
|
|||
"altındakı pəncərəyə verilir. Üstündə saxlayarkən fokuslamaq üçün bu rejimi "
|
||||
"seçin."
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1325,7 +1307,7 @@ msgstr ""
|
|||
"işlıməz.Bunun əvəzinə siz <em>Fokus siçanı izləyir</em>variantını işlətmək "
|
||||
"istəyə bilərsiniz."
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
@ -1342,6 +1324,18 @@ msgstr ""
|
|||
"ziddir və işləməz. Bunun əvəzinə siz <em>Fokus siçanı izləyir (siçanın "
|
||||
"üstünlüyü)</em>variantını işlətmək istəyə bilərsiniz."
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When this option is enabled, the active screen (where new windows appear, "
|
||||
#~ "for example) is the screen containing the mouse pointer. When disabled, "
|
||||
#~ "the active screen is the screen containing the focused window."
|
||||
#~ msgstr ""
|
||||
#~ "Bu seçim aktiv edildikdə, aktiv ekran (məsələn yeni pəncərələrin "
|
||||
#~ "göründüyü yer) siçan kursorundan ibarət ekrandır. Söndürüldükdə isə aktiv "
|
||||
#~ "kranın fokuslanmış pəncərələrindən ibarət ekrandır."
|
||||
|
||||
#~ msgid "Active screen follows &mouse"
|
||||
#~ msgstr "Aktiv ekran &kursoru izləyir"
|
||||
|
||||
#~ msgctxt "NAME OF TRANSLATORS"
|
||||
#~ msgid "Your names"
|
||||
#~ msgstr "Xəyyam Qocayev"
|
||||
|
|
354
po/az/kwin.po
354
po/az/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-06-21 02:02+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2022-12-25 17:08\n"
|
||||
"Last-Translator: Zmicier <zmicerturok@gmail.com>\n"
|
||||
"Language-Team: Belarusian\n"
|
||||
|
@ -21,17 +21,17 @@ msgstr ""
|
|||
"X-Crowdin-File: /main/be/kwin/kcm_kwin_scripts.po\n"
|
||||
"X-Crowdin-File-ID: 8758\n"
|
||||
|
||||
#: module.cpp:50
|
||||
#: module.cpp:49
|
||||
#, kde-format
|
||||
msgid "Import KWin Script"
|
||||
msgstr "Імпартаваць скрыпт KWin"
|
||||
|
||||
#: module.cpp:51
|
||||
#: module.cpp:50
|
||||
#, kde-format
|
||||
msgid "*.kwinscript|KWin scripts (*.kwinscript)"
|
||||
msgstr "*.kwinscript|скрыпт KWin (*.kwinscript)"
|
||||
|
||||
#: module.cpp:62
|
||||
#: module.cpp:61
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is error message returned from the install service"
|
||||
msgid ""
|
||||
|
@ -41,13 +41,13 @@ msgstr ""
|
|||
"Не ўдалося імпартаваць абраны скрыпт.\n"
|
||||
"%1"
|
||||
|
||||
#: module.cpp:66
|
||||
#: module.cpp:65
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is name of the script that was imported"
|
||||
msgid "The script \"%1\" was successfully imported."
|
||||
msgstr "Скрыпт \"%1\" паспяхова імпартаваны."
|
||||
|
||||
#: module.cpp:125
|
||||
#: module.cpp:124
|
||||
#, kde-format
|
||||
msgid "Error when uninstalling KWin Script: %1"
|
||||
msgstr "Падчас выдалення скрыпта KWin адбылася памылка: %1"
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-02-09 08:31\n"
|
||||
"Last-Translator: Darafei Praliaskouski <komzpa@gmail.com>\n"
|
||||
"Language-Team: Belarusian\n"
|
||||
|
@ -73,7 +73,7 @@ msgstr "Размяшчаць ніжэй астатніх акон"
|
|||
msgid "Keep above other windows"
|
||||
msgstr "Размяшчаць вышэй астатніх акон"
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -5,7 +5,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2023-02-08 13:45\n"
|
||||
"Last-Translator: Darafei Praliaskouski <komzpa@licei2.com>\n"
|
||||
"Language-Team: Belarusian\n"
|
||||
|
@ -281,7 +281,7 @@ msgstr "Пакоі"
|
|||
msgid "Screen"
|
||||
msgstr "Экран"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, kde-format
|
||||
msgid "Fullscreen"
|
||||
msgstr "На ўвесь экран"
|
||||
|
@ -418,7 +418,7 @@ msgstr "Без панэлі загалоўка і рамкі"
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr "Выгляд і фіксацыя"
|
||||
|
@ -528,19 +528,19 @@ msgstr "Можна закрыць"
|
|||
|
||||
#: rulesmodel.cpp:709
|
||||
#, kde-format
|
||||
msgid "Set window type"
|
||||
msgstr "Вызначыць тып акна"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr "Назва файла працоўнага стала"
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr "Блакаванне кампазітынгу"
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, kde-format
|
||||
msgid "Window class not available"
|
||||
|
@ -601,7 +601,7 @@ msgstr "Адчэпленае меню"
|
|||
msgid "Splash Screen"
|
||||
msgstr "Застаўка"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "Працоўны стол"
|
||||
|
@ -694,7 +694,7 @@ msgstr "Няма"
|
|||
msgid "Low"
|
||||
msgstr "Нізкі ўзровень"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "Звычайны ўзровень"
|
||||
|
@ -709,12 +709,48 @@ msgstr "Высокі ўзровень"
|
|||
msgid "Extreme"
|
||||
msgstr "Экстрымальны ўзровень"
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Position"
|
||||
msgid "Notification"
|
||||
msgstr "Пазіцыя"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, kde-format
|
||||
msgid "Unmanaged window"
|
||||
msgstr "Акно без кіравання"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr "Не ўдалося выявіць уласцівасці акна. Акно не кіруецца KWin."
|
||||
|
@ -878,28 +914,28 @@ msgstr[3] "Праз %1 секунды"
|
|||
msgid "Add property to the rule"
|
||||
msgstr "Дадаць уласцівасць у правіла"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr "Так"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, kde-format
|
||||
msgid "No"
|
||||
msgstr "Не"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr "%1 %"
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr "(%1, %2)"
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -911,6 +947,9 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr "x"
|
||||
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "Вызначыць тып акна"
|
||||
|
||||
#~ msgid "Window shall (not) appear in the taskbar."
|
||||
#~ msgstr "Акно (не) павінна з'яўляцца на панэлі задач."
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-02-08 13:48\n"
|
||||
"Last-Translator: Zmicier <zmicerturok@gmail.com>\n"
|
||||
"Language-Team: Belarusian\n"
|
||||
|
@ -21,33 +21,33 @@ msgstr ""
|
|||
"X-Crowdin-File: /main/be/kwin/kcm_kwintabbox.po\n"
|
||||
"X-Crowdin-File-ID: 8760\n"
|
||||
|
||||
#: layoutpreview.cpp:131
|
||||
#: layoutpreview.cpp:127
|
||||
#, kde-format
|
||||
msgid "Show Desktop"
|
||||
msgstr "Паказаць працоўны стол"
|
||||
|
||||
#: layoutpreview.cpp:161
|
||||
#: layoutpreview.cpp:157
|
||||
#, kde-format
|
||||
msgctxt "An example Desktop Name"
|
||||
msgid "Desktop 1"
|
||||
msgstr "Працоўны стол 1"
|
||||
|
||||
#: main.cpp:67
|
||||
#: main.cpp:66
|
||||
#, kde-format
|
||||
msgid "Main"
|
||||
msgstr "Асноўныя"
|
||||
|
||||
#: main.cpp:68
|
||||
#: main.cpp:67
|
||||
#, kde-format
|
||||
msgid "Alternative"
|
||||
msgstr "Альтэрнатыўны"
|
||||
|
||||
#: main.cpp:70
|
||||
#: main.cpp:69
|
||||
#, kde-format
|
||||
msgid "Get New Task Switchers..."
|
||||
msgstr "Атрымаць новыя сродкі пераключэння задач..."
|
||||
|
||||
#: main.cpp:84
|
||||
#: main.cpp:83
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"Focus policy settings limit the functionality of navigating through windows."
|
||||
|
|
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-19 02:29+0000\n"
|
||||
"PO-Revision-Date: 2022-12-25 17:08\n"
|
||||
"Last-Translator: Zmicier <zmicerturok@gmail.com>\n"
|
||||
"Language-Team: Belarusian\n"
|
||||
|
@ -21,67 +21,67 @@ msgstr ""
|
|||
"X-Crowdin-File: /main/be/kwin/kcmkwinscreenedges.po\n"
|
||||
"X-Crowdin-File-ID: 8766\n"
|
||||
|
||||
#: main.cpp:151 touch.cpp:117
|
||||
#: main.cpp:151 touch.cpp:118
|
||||
#, kde-format
|
||||
msgid "No Action"
|
||||
msgstr "Няма дзеяння"
|
||||
|
||||
#: main.cpp:152 touch.cpp:118
|
||||
#: main.cpp:152 touch.cpp:119
|
||||
#, kde-format
|
||||
msgid "Peek at Desktop"
|
||||
msgstr "Аглядзець працоўны стол"
|
||||
|
||||
#: main.cpp:153 touch.cpp:119
|
||||
#: main.cpp:153 touch.cpp:120
|
||||
#, kde-format
|
||||
msgid "Lock Screen"
|
||||
msgstr "Заблакаваць экран"
|
||||
|
||||
#: main.cpp:154 touch.cpp:120
|
||||
#: main.cpp:154 touch.cpp:121
|
||||
#, kde-format
|
||||
msgid "Show KRunner"
|
||||
msgstr "Паказаць KRunner"
|
||||
|
||||
#: main.cpp:155 touch.cpp:121
|
||||
#: main.cpp:155 touch.cpp:122
|
||||
#, kde-format
|
||||
msgid "Activity Manager"
|
||||
msgstr "Кіраўнік пакояў"
|
||||
|
||||
#: main.cpp:156 touch.cpp:122
|
||||
#: main.cpp:156 touch.cpp:123
|
||||
#, kde-format
|
||||
msgid "Application Launcher"
|
||||
msgstr "Сродак запуску праграм"
|
||||
|
||||
#: main.cpp:160 touch.cpp:126
|
||||
#: main.cpp:160 touch.cpp:127
|
||||
#, kde-format
|
||||
msgid "Present Windows"
|
||||
msgstr "Бягучыя вокны"
|
||||
|
||||
#: main.cpp:161 touch.cpp:127
|
||||
#: main.cpp:161 touch.cpp:128
|
||||
#, kde-format
|
||||
msgid "%1 - All Desktops"
|
||||
msgstr "%1 - усе працоўныя сталы"
|
||||
|
||||
#: main.cpp:162 touch.cpp:128
|
||||
#: main.cpp:162 touch.cpp:129
|
||||
#, kde-format
|
||||
msgid "%1 - Current Desktop"
|
||||
msgstr "%1 - бягучы працоўны стол"
|
||||
|
||||
#: main.cpp:163 touch.cpp:129
|
||||
#: main.cpp:163 touch.cpp:130
|
||||
#, kde-format
|
||||
msgid "%1 - Current Application"
|
||||
msgstr "%1 - бягучая праграма"
|
||||
|
||||
#: main.cpp:165
|
||||
#: main.cpp:165 touch.cpp:132
|
||||
#, kde-format
|
||||
msgid "Overview"
|
||||
msgstr ""
|
||||
|
||||
#: main.cpp:167 touch.cpp:131
|
||||
#: main.cpp:167 touch.cpp:134
|
||||
#, kde-format
|
||||
msgid "Toggle window switching"
|
||||
msgstr "Змена рэжыму пераключэння акон"
|
||||
|
||||
#: main.cpp:168 touch.cpp:132
|
||||
#: main.cpp:168 touch.cpp:135
|
||||
#, kde-format
|
||||
msgid "Toggle alternative window switching"
|
||||
msgstr "Змена рэжыму альтэрнатыўнага пераключэння акон"
|
||||
|
|
|
@ -4,7 +4,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: 86ff119b1606fcaa910d6b44fc14b611\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-02-08 13:45\n"
|
||||
"Last-Translator: Darafei Praliaskouski <komzpa@licei2.com>\n"
|
||||
"Language-Team: Belarusian\n"
|
||||
|
@ -892,26 +892,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr "Паводзіны пры некалькіх экранах:"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
"Калі гэты параметр уключаны, актыўны экран (напрыклад, дзе з'яўляюцца новыя "
|
||||
"вокны) - экран, які змяшчае паказальнік мышы. Калі гэты параметр адключаны, "
|
||||
"актыўны экран - экран, які змяшчае акно ў фокусе."
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr "Актыўны экран пільнуецца &мышы"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -921,13 +903,13 @@ msgstr ""
|
|||
"актыўным экранам"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr "&Асобнае факусаванне экранаў"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr "Апісанне палітыкі актывацыі акон"
|
||||
|
@ -1240,7 +1222,7 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "Толькі пры накладанні"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
|
@ -1250,7 +1232,7 @@ msgstr ""
|
|||
"пстрыкаеце па ім. Такія паводзіны часта сустракаюцца ў іншых аперацыйных "
|
||||
"сістэмах. Хутчэй за ўсё, гэта тое, што вам патрэбна."
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1265,7 +1247,7 @@ msgstr ""
|
|||
"акно пад мышшу - пераважны кандыдат. Незвычайны, але магчымы варыянт "
|
||||
"<em>Факусавацца пры пстрыканні</em>."
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1279,7 +1261,7 @@ msgstr ""
|
|||
"функцыянуе звычайным чынам. Падобна на <em>Факусавацца пры пстрыканні</em>, "
|
||||
"але няма патрэбы пстрыкаць."
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1292,7 +1274,7 @@ msgstr ""
|
|||
"было закрыта), акно пад мышшу - пераважны кандыдат. Абярыце гэта, калі "
|
||||
"хочаце кантраляваць факусаванне пры навядзенні."
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1306,7 +1288,7 @@ msgstr ""
|
|||
"<em>Alt+Tab</em> супярэчаць правілам актывацыі і не будуць працаваць. "
|
||||
"Напэўна, вам патрэбна <em>Факусавацца ўслед за мышшу (прыярытэт мышы)</em>!"
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
@ -1323,6 +1305,18 @@ msgstr ""
|
|||
"і не будуць працаваць. Напэўна, вам патрэбна <em>Факусавацца ўслед за мышшу "
|
||||
"(прыярытэт мышы)</em>!"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When this option is enabled, the active screen (where new windows appear, "
|
||||
#~ "for example) is the screen containing the mouse pointer. When disabled, "
|
||||
#~ "the active screen is the screen containing the focused window."
|
||||
#~ msgstr ""
|
||||
#~ "Калі гэты параметр уключаны, актыўны экран (напрыклад, дзе з'яўляюцца "
|
||||
#~ "новыя вокны) - экран, які змяшчае паказальнік мышы. Калі гэты параметр "
|
||||
#~ "адключаны, актыўны экран - экран, які змяшчае акно ў фокусе."
|
||||
|
||||
#~ msgid "Active screen follows &mouse"
|
||||
#~ msgstr "Актыўны экран пільнуецца &мышы"
|
||||
|
||||
#~ msgctxt "NAME OF TRANSLATORS"
|
||||
#~ msgid "Your names"
|
||||
#~ msgstr "Дарафей Праляскоўскі, Antikruk"
|
||||
|
|
354
po/be/kwin.po
354
po/be/kwin.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kwin\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-06-21 02:02+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-06-08 19:15+0200\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -17,17 +17,17 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.1\n"
|
||||
|
||||
#: module.cpp:50
|
||||
#: module.cpp:49
|
||||
#, kde-format
|
||||
msgid "Import KWin Script"
|
||||
msgstr "Импортиране на KWin скрипт"
|
||||
|
||||
#: module.cpp:51
|
||||
#: module.cpp:50
|
||||
#, kde-format
|
||||
msgid "*.kwinscript|KWin scripts (*.kwinscript)"
|
||||
msgstr "* .kwinscript | KWin скриптове (* .kwinscript)"
|
||||
|
||||
#: module.cpp:62
|
||||
#: module.cpp:61
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is error message returned from the install service"
|
||||
msgid ""
|
||||
|
@ -37,13 +37,13 @@ msgstr ""
|
|||
"Избраният скрипт не може да се импортира.\n"
|
||||
"%1"
|
||||
|
||||
#: module.cpp:66
|
||||
#: module.cpp:65
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is name of the script that was imported"
|
||||
msgid "The script \"%1\" was successfully imported."
|
||||
msgstr "Скриптът \"%1\" беше импортиран успешно."
|
||||
|
||||
#: module.cpp:125
|
||||
#: module.cpp:124
|
||||
#, kde-format
|
||||
msgid "Error when uninstalling KWin Script: %1"
|
||||
msgstr "Грешка при деинсталиране на KWin скрипт: %1"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwindecoration\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-04-06 18:47+0200\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -69,7 +69,7 @@ msgstr "Задържане под другите прозорците"
|
|||
msgid "Keep above other windows"
|
||||
msgstr "Задържане над другите прозорци"
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -3,13 +3,13 @@
|
|||
#
|
||||
# Zlatko Popov <zlatkopopov@fsa-bg.org>, 2006, 2007, 2008.
|
||||
# Yasen Pramatarov <yasen@lindeas.com>, 2011.
|
||||
# Mincho Kondarev <mkondarev@yahoo.de>, 2022, 2023.
|
||||
# SPDX-FileCopyrightText: 2022, 2023, 2024 Mincho Kondarev <mkondarev@yahoo.de>
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinrules\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"PO-Revision-Date: 2023-06-08 19:13+0200\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2024-01-27 21:15+0100\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
|
||||
"Language: bg\n"
|
||||
|
@ -17,7 +17,7 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Lokalize 23.04.1\n"
|
||||
"X-Generator: Lokalize 23.08.4\n"
|
||||
|
||||
#: kcmrules.cpp:228
|
||||
#, kde-format
|
||||
|
@ -283,7 +283,7 @@ msgstr "Дейности"
|
|||
msgid "Screen"
|
||||
msgstr "Екран"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, kde-format
|
||||
msgid "Fullscreen"
|
||||
msgstr "Цял екран"
|
||||
|
@ -429,7 +429,7 @@ msgstr "Без заглавна лента и рамка"
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr "Външен вид и корекции"
|
||||
|
@ -582,19 +582,19 @@ msgstr "Може да бъде затворен"
|
|||
|
||||
#: rulesmodel.cpp:709
|
||||
#, kde-format
|
||||
msgid "Set window type"
|
||||
msgstr "Задаване на тип прозорец"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr "Име на файла за работния плот"
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr "Блоково композиране"
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr "Слой"
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, kde-format
|
||||
msgid "Window class not available"
|
||||
|
@ -655,7 +655,7 @@ msgstr "Откачено меню"
|
|||
msgid "Splash Screen"
|
||||
msgstr "Начален екран"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "Работен плот"
|
||||
|
@ -748,7 +748,7 @@ msgstr "Без"
|
|||
msgid "Low"
|
||||
msgstr "Слабо"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "Нормално"
|
||||
|
@ -763,12 +763,47 @@ msgstr "Силно"
|
|||
msgid "Extreme"
|
||||
msgstr "Крайно"
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr "Отдолу"
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr "Отгоре"
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, kde-format
|
||||
msgid "Notification"
|
||||
msgstr "Известие"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr "Изскачащ прозорец"
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr "Критично известие"
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr "Екранен надпис"
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr "Наслагване"
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, kde-format
|
||||
msgid "Unmanaged window"
|
||||
msgstr "Неуправляван прозорец"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -928,28 +963,28 @@ msgstr[1] "След %1 секунди"
|
|||
msgid "Add property to the rule"
|
||||
msgstr "Добавяне на свойство към правилото"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr "Да"
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, kde-format
|
||||
msgid "No"
|
||||
msgstr "Не"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr "%1 %"
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr "(%1, %2)"
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcm_kwintabbox\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2023-02-13 12:06+0100\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -18,33 +18,33 @@ msgstr ""
|
|||
"X-Generator: Lokalize 22.12.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#: layoutpreview.cpp:131
|
||||
#: layoutpreview.cpp:127
|
||||
#, kde-format
|
||||
msgid "Show Desktop"
|
||||
msgstr "Показване на работния плот"
|
||||
|
||||
#: layoutpreview.cpp:161
|
||||
#: layoutpreview.cpp:157
|
||||
#, kde-format
|
||||
msgctxt "An example Desktop Name"
|
||||
msgid "Desktop 1"
|
||||
msgstr "Работен плот 1"
|
||||
|
||||
#: main.cpp:67
|
||||
#: main.cpp:66
|
||||
#, kde-format
|
||||
msgid "Main"
|
||||
msgstr "Основни"
|
||||
|
||||
#: main.cpp:68
|
||||
#: main.cpp:67
|
||||
#, kde-format
|
||||
msgid "Alternative"
|
||||
msgstr "Алтернативни"
|
||||
|
||||
#: main.cpp:70
|
||||
#: main.cpp:69
|
||||
#, kde-format
|
||||
msgid "Get New Task Switchers..."
|
||||
msgstr "Изтеглете нови превключватели на задачи..."
|
||||
|
||||
#: main.cpp:84
|
||||
#: main.cpp:83
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"Focus policy settings limit the functionality of navigating through windows."
|
||||
|
|
|
@ -73,10 +73,3 @@ msgstr ""
|
|||
"системата до тази на X11 като позволява на злонамерен софтуер да краде "
|
||||
"пароли и да шпионира текста, който въвеждате. Уверете се, че разбирате и "
|
||||
"приемате този риск."
|
||||
|
||||
#~ msgid "Only Meta, Control, Alt, and Shift keys"
|
||||
#~ msgstr "Само клавиши Meta, Control, Alt и Shift"
|
||||
|
||||
#~ msgid "All keys, but only while Meta, Ctrl, Alt, or Shift keys are pressed"
|
||||
#~ msgstr ""
|
||||
#~ "Всички клавиши, но само докато са натиснати Meta, Ctrl, Alt или Shift"
|
||||
|
|
|
@ -124,29 +124,3 @@ msgstr "Винаги"
|
|||
#, kde-format
|
||||
msgid "Re-enable OpenGL detection"
|
||||
msgstr "Повторно активиране на откриване на OpenGL"
|
||||
|
||||
#~ msgid "Latency:"
|
||||
#~ msgstr "Забавяне:"
|
||||
|
||||
#~ msgid "Force lowest latency (may cause dropped frames)"
|
||||
#~ msgstr ""
|
||||
#~ "Принудително задаване на най-малко забавяне (може да доведе до отпадане "
|
||||
#~ "на кадри)"
|
||||
|
||||
#~ msgid "Prefer lower latency"
|
||||
#~ msgstr "Предпочитане на малко забавяне"
|
||||
|
||||
#~ msgid "Balance of latency and smoothness"
|
||||
#~ msgstr "Баланс между забавяне и плавност"
|
||||
|
||||
#~ msgid "Prefer smoother animations"
|
||||
#~ msgstr "Предпочитане на плавни анимации"
|
||||
|
||||
#~ msgid "Force smoothest animations"
|
||||
#~ msgstr "Принудително задаване на възможно най-плавни анимации"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Reduce latency by allowing screen tearing artifacts in fullscreen windows"
|
||||
#~ msgstr ""
|
||||
#~ "Намаляване на латентността чрез допускане на артефакти на разкъсване на "
|
||||
#~ "екрана в пълноекранни прозорци"
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinscreenedges\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-20 01:35+0000\n"
|
||||
"POT-Creation-Date: 2024-01-19 02:29+0000\n"
|
||||
"PO-Revision-Date: 2023-12-11 11:49+0100\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -18,67 +18,67 @@ msgstr ""
|
|||
"X-Generator: Lokalize 23.08.4\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
#: main.cpp:151 touch.cpp:117
|
||||
#: main.cpp:151 touch.cpp:118
|
||||
#, kde-format
|
||||
msgid "No Action"
|
||||
msgstr "Без действие"
|
||||
|
||||
#: main.cpp:152 touch.cpp:118
|
||||
#: main.cpp:152 touch.cpp:119
|
||||
#, kde-format
|
||||
msgid "Peek at Desktop"
|
||||
msgstr "Поглед върху работния плот"
|
||||
|
||||
#: main.cpp:153 touch.cpp:119
|
||||
#: main.cpp:153 touch.cpp:120
|
||||
#, kde-format
|
||||
msgid "Lock Screen"
|
||||
msgstr "Заключване на екрана"
|
||||
|
||||
#: main.cpp:154 touch.cpp:120
|
||||
#: main.cpp:154 touch.cpp:121
|
||||
#, kde-format
|
||||
msgid "Show KRunner"
|
||||
msgstr "Показване на KRunner"
|
||||
|
||||
#: main.cpp:155 touch.cpp:121
|
||||
#: main.cpp:155 touch.cpp:122
|
||||
#, kde-format
|
||||
msgid "Activity Manager"
|
||||
msgstr "Мениджър на дейности"
|
||||
|
||||
#: main.cpp:156 touch.cpp:122
|
||||
#: main.cpp:156 touch.cpp:123
|
||||
#, kde-format
|
||||
msgid "Application Launcher"
|
||||
msgstr "Стартер за приложения"
|
||||
|
||||
#: main.cpp:160 touch.cpp:126
|
||||
#: main.cpp:160 touch.cpp:127
|
||||
#, kde-format
|
||||
msgid "Present Windows"
|
||||
msgstr "Представяне на прозорци"
|
||||
|
||||
#: main.cpp:161 touch.cpp:127
|
||||
#: main.cpp:161 touch.cpp:128
|
||||
#, kde-format
|
||||
msgid "%1 - All Desktops"
|
||||
msgstr "%1 - Всички работни плотове"
|
||||
|
||||
#: main.cpp:162 touch.cpp:128
|
||||
#: main.cpp:162 touch.cpp:129
|
||||
#, kde-format
|
||||
msgid "%1 - Current Desktop"
|
||||
msgstr "%1 - Текущ работен плот"
|
||||
|
||||
#: main.cpp:163 touch.cpp:129
|
||||
#: main.cpp:163 touch.cpp:130
|
||||
#, kde-format
|
||||
msgid "%1 - Current Application"
|
||||
msgstr "%1 - Текущо приложение"
|
||||
|
||||
#: main.cpp:165
|
||||
#: main.cpp:165 touch.cpp:132
|
||||
#, kde-format
|
||||
msgid "Overview"
|
||||
msgstr "Преглед"
|
||||
|
||||
#: main.cpp:167 touch.cpp:131
|
||||
#: main.cpp:167 touch.cpp:134
|
||||
#, kde-format
|
||||
msgid "Toggle window switching"
|
||||
msgstr "Превключване на прозорци"
|
||||
|
||||
#: main.cpp:168 touch.cpp:132
|
||||
#: main.cpp:168 touch.cpp:135
|
||||
#, kde-format
|
||||
msgid "Toggle alternative window switching"
|
||||
msgstr "Алтернативно превключване на прозорци"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwm\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2022-12-05 00:26+0100\n"
|
||||
"Last-Translator: Mincho Kondarev <mkondarev@yahoo.de>\n"
|
||||
"Language-Team: Bulgarian <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -886,26 +886,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr "Поведение при няколко екрана:"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
"Когато тази опция е активирана, активният екран е екранът, съдържащ "
|
||||
"показалеца на мишката (там например се появяват новите прозорци) . Когато е "
|
||||
"деактивиран, активният екран е екранът, съдържащ фокусирания прозорец."
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr "Активният екран следва &мишката"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -915,13 +897,13 @@ msgstr ""
|
|||
"до активния екран на Xinerama"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr "&Отделен фокус на екрана"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr "Описание на правилата за активиране на прозореца"
|
||||
|
@ -1240,7 +1222,7 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "Само при припокриване"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
|
@ -1250,7 +1232,7 @@ msgstr ""
|
|||
"върху него.Това поведение е често срещано при други операционни системи и е "
|
||||
"вероятно това, което искате."
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1265,7 +1247,7 @@ msgstr ""
|
|||
"е предпочитан кандидат. Необичаен, но възможен вариант на <em> Щракване за "
|
||||
"фокусиране </em>."
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1279,7 +1261,7 @@ msgstr ""
|
|||
"Предотвратяване на отнемане на фокус </em>. Приемете го като <em> Щракване "
|
||||
"за фокусиране</em> , но без да се налага действително да щраквате."
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1292,7 +1274,7 @@ msgstr ""
|
|||
"момента) прозорецът под мишката е предпочитан кандидат. Изберете това,ако "
|
||||
"искате фокус, контролиран от задържането на показалеца."
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1307,7 +1289,7 @@ msgstr ""
|
|||
"на политиката и няма да работят. Много вероятно, вместо това, ще искате да "
|
||||
"използвате <em> Фокусът следва мишката (предимство на мишката) </em>!"
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
@ -1324,3 +1306,15 @@ msgstr ""
|
|||
"\") </em> противоречат на политика за активиране и няма да работят. Най-"
|
||||
"вероятно, вместо това, ще искате да използвате <em> Фокусът следва мишка "
|
||||
"(предимство на мишката) </em>!"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "When this option is enabled, the active screen (where new windows appear, "
|
||||
#~ "for example) is the screen containing the mouse pointer. When disabled, "
|
||||
#~ "the active screen is the screen containing the focused window."
|
||||
#~ msgstr ""
|
||||
#~ "Когато тази опция е активирана, активният екран е екранът, съдържащ "
|
||||
#~ "показалеца на мишката (там например се появяват новите прозорци) . Когато "
|
||||
#~ "е деактивиран, активният екран е екранът, съдържащ фокусирания прозорец."
|
||||
|
||||
#~ msgid "Active screen follows &mouse"
|
||||
#~ msgstr "Активният екран следва &мишката"
|
||||
|
|
434
po/bg/kwin.po
434
po/bg/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwm\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2010-06-01 10:33-0700\n"
|
||||
"Last-Translator: Deepayan Sarkar <deepayan.sarkar@gmail.com>\n"
|
||||
"Language-Team: Bengali <kde-translation@bengalinux.org>\n"
|
||||
|
@ -889,23 +889,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr "&সক্রিয় স্ক্রীন মাউস অনুসরণ করে"
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -913,14 +898,14 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "S&eparate screen focus"
|
||||
msgid "&Separate screen focus"
|
||||
msgstr "&আলাদা স্ক্রীণ ফোকাস"
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr ""
|
||||
|
@ -1253,14 +1238,14 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "কেব&লমাত্র উপরিপাতন হলে উইন্ডোগুলি আটকে দাও"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
"This behavior is common on other operating systems and likely what you want."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1270,7 +1255,7 @@ msgid ""
|
|||
"em>."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1279,7 +1264,7 @@ msgid ""
|
|||
"to focus</em> just without having to actually click."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1288,7 +1273,7 @@ msgid ""
|
|||
"if you want a hover controlled focus."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1298,7 +1283,7 @@ msgid ""
|
|||
"precedence)</em> instead!"
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
@ -1309,6 +1294,9 @@ msgid ""
|
|||
"follows mouse (mouse precedence)</em> instead!"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Active screen follows &mouse"
|
||||
#~ msgstr "&সক্রিয় স্ক্রীন মাউস অনুসরণ করে"
|
||||
|
||||
#~ msgctxt "NAME OF TRANSLATORS"
|
||||
#~ msgid "Your names"
|
||||
#~ msgstr "ডাঃ অনির্বাণ মিত্র, দীপায়ন সরকার"
|
||||
|
|
354
po/bn/kwin.po
354
po/bn/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwindecoration\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2009-01-13 17:22+0530\n"
|
||||
"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
|
||||
"Language-Team: Bengali INDIA <fedora-trans-bn_IN@redhat.com>\n"
|
||||
|
@ -69,7 +69,7 @@ msgstr ""
|
|||
msgid "Keep above other windows"
|
||||
msgstr ""
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinrules\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2009-01-07 14:37+0530\n"
|
||||
"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
|
||||
"Language-Team: Bengali INDIA <fedora-trans-bn_IN@redhat.com>\n"
|
||||
|
@ -273,7 +273,7 @@ msgstr ""
|
|||
msgid "Screen"
|
||||
msgstr "স্প্ল্যাশ স্ক্রিন"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Fullscreen"
|
||||
msgid "Fullscreen"
|
||||
|
@ -410,7 +410,7 @@ msgstr ""
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr ""
|
||||
|
@ -521,21 +521,20 @@ msgid "Closeable"
|
|||
msgstr "বন্ধ করার যোগ্য (&C)"
|
||||
|
||||
#: rulesmodel.cpp:709
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &type"
|
||||
msgid "Set window type"
|
||||
msgstr "উইন্ডোর প্রকৃতি (&t)"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &class (application type):"
|
||||
|
@ -593,7 +592,7 @@ msgstr ""
|
|||
msgid "Splash Screen"
|
||||
msgstr "স্প্ল্যাশ স্ক্রিন"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "ডেস্কটপ"
|
||||
|
@ -689,7 +688,7 @@ msgstr "শূণ্য"
|
|||
msgid "Low"
|
||||
msgstr "কম"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "স্বাভাবিক"
|
||||
|
@ -704,13 +703,49 @@ msgstr "বেশি"
|
|||
msgid "Extreme"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Position"
|
||||
msgid "Notification"
|
||||
msgstr "অবস্থান (&P)"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "On Main Window"
|
||||
msgid "Unmanaged window"
|
||||
msgstr "প্রধান উইন্ডোর মধ্যে"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -869,29 +904,29 @@ msgstr[1] ""
|
|||
msgid "Add property to the rule"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "None"
|
||||
msgid "No"
|
||||
msgstr "শূণ্য"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -903,6 +938,11 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Window &type"
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "উইন্ডোর প্রকৃতি (&t)"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "WId of the window for special window settings."
|
||||
#~ msgid "KWin id of the window for special window settings."
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwm\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2009-01-07 16:17+0530\n"
|
||||
"Last-Translator: Runa Bhattacharjee <runab@redhat.com>\n"
|
||||
"Language-Team: Bengali INDIA <fedora-trans-bn_IN@redhat.com>\n"
|
||||
|
@ -814,23 +814,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -838,13 +823,13 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr ""
|
||||
|
@ -1159,14 +1144,14 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "শুধুমাত্র উইন্ডো স্থানান্তর কালে (&w)"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
"This behavior is common on other operating systems and likely what you want."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1176,7 +1161,7 @@ msgid ""
|
|||
"em>."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1185,7 +1170,7 @@ msgid ""
|
|||
"to focus</em> just without having to actually click."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1194,7 +1179,7 @@ msgid ""
|
|||
"if you want a hover controlled focus."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1204,7 +1189,7 @@ msgid ""
|
|||
"precedence)</em> instead!"
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
|
354
po/bn_IN/kwin.po
354
po/bn_IN/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwindecoration\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2004-07-08 22:51+0200\n"
|
||||
"Last-Translator: Thierry Vignaud <tvignaud.com>\n"
|
||||
"Language-Team: Brezhoneg <Suav.Icb.fr>\n"
|
||||
|
@ -65,7 +65,7 @@ msgstr ""
|
|||
msgid "Keep above other windows"
|
||||
msgstr ""
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -4,7 +4,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinrules\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2004-07-08 17:18+0200\n"
|
||||
"Last-Translator: Thierry Vignaud <tvignaud.com>\n"
|
||||
"Language-Team: Brezhoneg <Suav.Icb.fr>\n"
|
||||
|
@ -267,7 +267,7 @@ msgstr ""
|
|||
msgid "Screen"
|
||||
msgstr "Skramm-degemer"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Fullscreen"
|
||||
msgid "Fullscreen"
|
||||
|
@ -400,7 +400,7 @@ msgstr ""
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Appearance & Fixes"
|
||||
msgstr ""
|
||||
|
@ -509,21 +509,20 @@ msgid "Closeable"
|
|||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:709
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &type"
|
||||
msgid "Set window type"
|
||||
msgstr "&Giz ar prenestr"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &class (application type):"
|
||||
|
@ -581,7 +580,7 @@ msgstr ""
|
|||
msgid "Splash Screen"
|
||||
msgstr "Skramm-degemer"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "Burev"
|
||||
|
@ -676,7 +675,7 @@ msgstr "Ebet"
|
|||
msgid "Low"
|
||||
msgstr "Izel"
|
||||
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "Boas"
|
||||
|
@ -691,13 +690,49 @@ msgstr "Uhel"
|
|||
msgid "Extreme"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Position"
|
||||
msgid "Notification"
|
||||
msgstr "&Lec'h"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:951
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "On Main Window"
|
||||
msgid "Unmanaged window"
|
||||
msgstr "War ar brenestr gentañ"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -853,29 +888,29 @@ msgstr[1] ""
|
|||
msgid "Add property to the rule"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "None"
|
||||
msgid "No"
|
||||
msgstr "Ebet"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -887,6 +922,11 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Window &type"
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "&Giz ar prenestr"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Application settings for %1"
|
||||
#~ msgctxt "Window caption for the application wide rules dialog"
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwm-1.1\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-11-02 01:40+0000\n"
|
||||
"POT-Creation-Date: 2024-02-06 03:08+0000\n"
|
||||
"PO-Revision-Date: 2004-07-08 22:32+0200\n"
|
||||
"Last-Translator: Jañ-Mai Drapier <jan-mai.drapier@mail.dotcom.fr>\n"
|
||||
"Language-Team: Brezhoneg <Suav.Icb@wanadoo.fr>\n"
|
||||
|
@ -816,23 +816,8 @@ msgstr ""
|
|||
msgid "Multiscreen behavior:"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, the active screen (where new windows appear, "
|
||||
"for example) is the screen containing the mouse pointer. When disabled, the "
|
||||
"active screen is the screen containing the focused window."
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_ActiveMouseScreen)
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "Active screen follows &mouse"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (whatsThis), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:213
|
||||
#: focus.ui:203
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"When this option is enabled, focus operations are limited only to the active "
|
||||
|
@ -840,13 +825,13 @@ msgid ""
|
|||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QCheckBox, kcfg_SeparateScreenFocus)
|
||||
#: focus.ui:216
|
||||
#: focus.ui:206
|
||||
#, kde-format
|
||||
msgid "&Separate screen focus"
|
||||
msgstr ""
|
||||
|
||||
#. i18n: ectx: property (text), widget (QLabel, windowFocusPolicyDescriptionLabel)
|
||||
#: focus.ui:229
|
||||
#: focus.ui:219
|
||||
#, kde-format
|
||||
msgid "Window activation policy description"
|
||||
msgstr ""
|
||||
|
@ -1154,14 +1139,14 @@ msgstr ""
|
|||
msgid "Only when overlapping"
|
||||
msgstr "&En ur fiñval ar prenester hepken"
|
||||
|
||||
#: windows.cpp:93
|
||||
#: windows.cpp:92
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus:</em> A window becomes active when you click into it. "
|
||||
"This behavior is common on other operating systems and likely what you want."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:96
|
||||
#: windows.cpp:95
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Click to focus (mouse precedence):</em> Mostly the same as <em>Click to "
|
||||
|
@ -1171,7 +1156,7 @@ msgid ""
|
|||
"em>."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:99
|
||||
#: windows.cpp:98
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus follows mouse:</em> Moving the mouse onto a window will activate "
|
||||
|
@ -1180,7 +1165,7 @@ msgid ""
|
|||
"to focus</em> just without having to actually click."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:102
|
||||
#: windows.cpp:101
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"This is mostly the same as <em>Focus follows mouse</em>. If an active window "
|
||||
|
@ -1189,7 +1174,7 @@ msgid ""
|
|||
"if you want a hover controlled focus."
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:105
|
||||
#: windows.cpp:104
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus under mouse:</em> The focus always remains on the window under the "
|
||||
|
@ -1199,7 +1184,7 @@ msgid ""
|
|||
"precedence)</em> instead!"
|
||||
msgstr ""
|
||||
|
||||
#: windows.cpp:108
|
||||
#: windows.cpp:107
|
||||
#, kde-format
|
||||
msgid ""
|
||||
"<em>Focus strictly under mouse:</em> The focus is always on the window under "
|
||||
|
|
354
po/br/kwin.po
354
po/br/kwin.po
File diff suppressed because it is too large
Load Diff
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: bosnianuniversetranslation\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-06-21 02:02+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2013-11-03 21:03+0000\n"
|
||||
"Last-Translator: Samir Ribić <Unknown>\n"
|
||||
"Language-Team: Bosnian <bs@li.org>\n"
|
||||
|
@ -20,17 +20,17 @@ msgstr ""
|
|||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
|
||||
#: module.cpp:50
|
||||
#: module.cpp:49
|
||||
#, kde-format
|
||||
msgid "Import KWin Script"
|
||||
msgstr "Uvezi KWin skriptu"
|
||||
|
||||
#: module.cpp:51
|
||||
#: module.cpp:50
|
||||
#, kde-format
|
||||
msgid "*.kwinscript|KWin scripts (*.kwinscript)"
|
||||
msgstr "*.kwinscript|KWin skripte (*.kwinscript)"
|
||||
|
||||
#: module.cpp:62
|
||||
#: module.cpp:61
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is error message returned from the install service"
|
||||
msgid ""
|
||||
|
@ -38,13 +38,13 @@ msgid ""
|
|||
"%1"
|
||||
msgstr ""
|
||||
|
||||
#: module.cpp:66
|
||||
#: module.cpp:65
|
||||
#, kde-format
|
||||
msgctxt "Placeholder is name of the script that was imported"
|
||||
msgid "The script \"%1\" was successfully imported."
|
||||
msgstr ""
|
||||
|
||||
#: module.cpp:125
|
||||
#: module.cpp:124
|
||||
#, kde-format
|
||||
msgid "Error when uninstalling KWin Script: %1"
|
||||
msgstr ""
|
||||
|
|
|
@ -6,7 +6,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwindecoration\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-08-06 02:04+0000\n"
|
||||
"POT-Creation-Date: 2024-01-14 03:08+0000\n"
|
||||
"PO-Revision-Date: 2015-02-03 11:42+0100\n"
|
||||
"Last-Translator: Samir Ribic <sribic@etf.unsa.ba>\n"
|
||||
"Language-Team: Bosnian <kde-i18n-doc@kde.org>\n"
|
||||
|
@ -73,7 +73,7 @@ msgstr ""
|
|||
msgid "Keep above other windows"
|
||||
msgstr ""
|
||||
|
||||
#: kcm.cpp:176
|
||||
#: kcm.cpp:177
|
||||
#, kde-format
|
||||
msgctxt "%1 is the name of a border size"
|
||||
msgid "Theme's default (%1)"
|
||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: kcmkwinrules\n"
|
||||
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
|
||||
"POT-Creation-Date: 2023-12-08 01:36+0000\n"
|
||||
"POT-Creation-Date: 2024-02-17 02:27+0000\n"
|
||||
"PO-Revision-Date: 2014-10-20 19:53+0000\n"
|
||||
"Last-Translator: Samir Ribić <Unknown>\n"
|
||||
"Language-Team: bosanski <bs@li.org>\n"
|
||||
|
@ -286,7 +286,7 @@ msgstr "Sve aktivnosti"
|
|||
msgid "Screen"
|
||||
msgstr "Ekran"
|
||||
|
||||
#: rulesmodel.cpp:513
|
||||
#: rulesmodel.cpp:513 rulesmodel.cpp:922
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Fullscreen"
|
||||
msgid "Fullscreen"
|
||||
|
@ -436,7 +436,7 @@ msgstr "&Nema naslovne trake i okvira"
|
|||
|
||||
#: rulesmodel.cpp:609 rulesmodel.cpp:614 rulesmodel.cpp:620 rulesmodel.cpp:625
|
||||
#: rulesmodel.cpp:631 rulesmodel.cpp:658 rulesmodel.cpp:686 rulesmodel.cpp:692
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:715 rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:704 rulesmodel.cpp:709 rulesmodel.cpp:714 rulesmodel.cpp:719
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Appearance && &Fixes"
|
||||
msgid "Appearance & Fixes"
|
||||
|
@ -553,21 +553,20 @@ msgid "Closeable"
|
|||
msgstr "&Zatvorljiv"
|
||||
|
||||
#: rulesmodel.cpp:709
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &type"
|
||||
msgid "Set window type"
|
||||
msgstr "&Tip prozora"
|
||||
|
||||
#: rulesmodel.cpp:715
|
||||
#, kde-format
|
||||
msgid "Desktop file name"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:720
|
||||
#: rulesmodel.cpp:714
|
||||
#, kde-format
|
||||
msgid "Block compositing"
|
||||
msgstr "Kompozicija blokova"
|
||||
|
||||
#: rulesmodel.cpp:719
|
||||
#, kde-format
|
||||
msgid "Layer"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:772
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Window &class (application):"
|
||||
|
@ -625,7 +624,7 @@ msgstr "Otcijepljen meni"
|
|||
msgid "Splash Screen"
|
||||
msgstr "Uvodni ekran"
|
||||
|
||||
#: rulesmodel.cpp:815
|
||||
#: rulesmodel.cpp:815 rulesmodel.cpp:917
|
||||
#, kde-format
|
||||
msgid "Desktop"
|
||||
msgstr "Površ"
|
||||
|
@ -733,7 +732,7 @@ msgid "Low"
|
|||
msgstr "Nisko"
|
||||
|
||||
# >> @item:inlistbox Focus stealing prevention->Force
|
||||
#: rulesmodel.cpp:889
|
||||
#: rulesmodel.cpp:889 rulesmodel.cpp:919
|
||||
#, kde-format
|
||||
msgid "Normal"
|
||||
msgstr "Normalno"
|
||||
|
@ -750,14 +749,50 @@ msgstr "Visoko"
|
|||
msgid "Extreme"
|
||||
msgstr "Ekstremno"
|
||||
|
||||
#: rulesmodel.cpp:918
|
||||
#, kde-format
|
||||
msgid "Below"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:920
|
||||
#, kde-format
|
||||
msgid "Above"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:921
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "&Position"
|
||||
msgid "Notification"
|
||||
msgstr "&Položaj"
|
||||
|
||||
#: rulesmodel.cpp:923
|
||||
#, kde-format
|
||||
msgid "Popup"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:924
|
||||
#, kde-format
|
||||
msgid "Critical Notification"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:925
|
||||
#, kde-format
|
||||
msgid "OSD"
|
||||
msgstr ""
|
||||
|
||||
#: rulesmodel.cpp:926
|
||||
#, kde-format
|
||||
msgid "Overlay"
|
||||
msgstr ""
|
||||
|
||||
# >> @item:inlistbox Placement->Force
|
||||
#: rulesmodel.cpp:934
|
||||
#: rulesmodel.cpp:951
|
||||
#, fuzzy, kde-format
|
||||
#| msgid "Unmanaged Window"
|
||||
msgid "Unmanaged window"
|
||||
msgstr "Neupravljani prozor"
|
||||
|
||||
#: rulesmodel.cpp:935
|
||||
#: rulesmodel.cpp:952
|
||||
#, kde-format
|
||||
msgid "Could not detect window properties. The window is not managed by KWin."
|
||||
msgstr ""
|
||||
|
@ -924,31 +959,31 @@ msgstr[2] ""
|
|||
msgid "Add property to the rule"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:54
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:54
|
||||
#, kde-format
|
||||
msgid "Yes"
|
||||
msgstr ""
|
||||
|
||||
# >> @item:inlistbox +
|
||||
#: ui/RulesEditor.qml:278 ui/ValueEditor.qml:60
|
||||
#: ui/RulesEditor.qml:279 ui/ValueEditor.qml:60
|
||||
#, fuzzy, kde-format
|
||||
#| msgctxt "no focus stealing prevention"
|
||||
#| msgid "None"
|
||||
msgid "No"
|
||||
msgstr "Nikakvo"
|
||||
|
||||
#: ui/RulesEditor.qml:280 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#: ui/RulesEditor.qml:281 ui/ValueEditor.qml:168 ui/ValueEditor.qml:175
|
||||
#, kde-format
|
||||
msgid "%1 %"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:282
|
||||
#: ui/RulesEditor.qml:283
|
||||
#, kde-format
|
||||
msgctxt "Coordinates (x, y)"
|
||||
msgid "(%1, %2)"
|
||||
msgstr ""
|
||||
|
||||
#: ui/RulesEditor.qml:284
|
||||
#: ui/RulesEditor.qml:285
|
||||
#, kde-format
|
||||
msgctxt "Size (width, height)"
|
||||
msgid "(%1, %2)"
|
||||
|
@ -960,6 +995,11 @@ msgctxt "(x, y) coordinates separator in size/position"
|
|||
msgid "x"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Window &type"
|
||||
#~ msgid "Set window type"
|
||||
#~ msgstr "&Tip prozora"
|
||||
|
||||
#~ msgid "Window shall (not) appear in the taskbar."
|
||||
#~ msgstr "Prozor se (ne) treba pojaviti u traci zadataka."
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue