Compare commits
505 Commits
49.beta
...
debian/45.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fc5611719d | ||
|
|
ad69ee299f | ||
|
|
b912f8cd0b | ||
|
|
e5f43e9a90 | ||
|
|
2b7bb1798a | ||
|
|
8250b82869 | ||
|
|
101ca9c738 | ||
|
|
7ecee1c9e6 | ||
|
|
e4183488d9 | ||
|
|
b02e43d84c | ||
|
|
8ed3b72a56 | ||
|
|
a929cf9370 | ||
|
|
a5343c33ec | ||
|
|
8efd73c50e | ||
|
|
d5f617b3e2 | ||
|
|
d1ff099200 | ||
|
|
6bbc329e7b | ||
|
|
ed31f08f2f | ||
|
|
ed60502f10 | ||
|
|
0fa592a516 | ||
|
|
abf3365cc2 | ||
|
|
1e254c1723 | ||
|
|
0676c02419 | ||
|
|
cb7b8e7c5a | ||
|
|
f27b239f55 | ||
|
|
7f192d0208 | ||
|
|
eff6f6ef88 | ||
|
|
153e100e7e | ||
|
|
3ea3d1a405 | ||
|
|
37de3bfba3 | ||
|
|
db24e0c6c3 | ||
|
|
a6131bd00b | ||
|
|
4d741a1ece | ||
|
|
6ce713f305 | ||
|
|
db248b3ce6 | ||
|
|
2e2651ea4c | ||
|
|
696225fdc9 | ||
|
|
fd31c81873 | ||
|
|
981f094061 | ||
|
|
e864d0d1cc | ||
|
|
b9067eed79 | ||
|
|
68c7beabab | ||
|
|
3ba184bfe2 | ||
|
|
24fa8a6e04 | ||
|
|
923f204478 | ||
|
|
930595003d | ||
|
|
a69d37f2ee | ||
|
|
2e715149db | ||
|
|
26d067d301 | ||
|
|
51df22adcf | ||
|
|
c1df8cedb8 | ||
|
|
2189f8cc58 | ||
|
|
6cd74c86ae | ||
|
|
6ff6eb2c22 | ||
|
|
88657c2def | ||
|
|
68b7915bc6 | ||
|
|
f6e66faf8f | ||
|
|
ee0bb2c636 | ||
|
|
6bee46bf1a | ||
|
|
1edb245e85 | ||
|
|
7a010d5a72 | ||
|
|
9e4b7488b3 | ||
|
|
18cf40a521 | ||
|
|
ed6d806617 | ||
|
|
f4347d240a | ||
|
|
4f5e421539 | ||
|
|
72868ac7c5 | ||
|
|
5dea503cbd | ||
|
|
81b8ad4499 | ||
|
|
8f8292afb3 | ||
|
|
d505f75c9b | ||
|
|
a8a2729531 | ||
|
|
aeee81a82c | ||
|
|
9306ee7a5d | ||
|
|
e8c8c7d940 | ||
|
|
871c9c39dc | ||
|
|
fcefdc3271 | ||
|
|
ecc955b4cd | ||
|
|
7e5f7eb0aa | ||
|
|
1c3407c05f | ||
|
|
7a017c1e76 | ||
|
|
26fb856ffc | ||
|
|
9d2b15ba26 | ||
|
|
28cdc1df1a | ||
|
|
b2455f0ecd | ||
|
|
0c501f84b9 | ||
|
|
c6d5ea5934 | ||
|
|
047f939b63 | ||
|
|
3d693372ad | ||
|
|
a33802d3e5 | ||
|
|
573aba17d7 | ||
|
|
d483244ecb | ||
|
|
8e39e0d363 | ||
|
|
2762830b10 | ||
|
|
df1df4b8e1 | ||
|
|
210e86641b | ||
|
|
2117c42d74 | ||
|
|
a8a49e3c65 | ||
|
|
bfe26eaf84 | ||
|
|
60a08debff | ||
|
|
132bd9259e | ||
|
|
5eb4dcf6bf | ||
|
|
5edffcd859 | ||
|
|
295fb67225 | ||
|
|
a2c271d677 | ||
|
|
6901f6187d | ||
|
|
e2ee6bacd0 | ||
|
|
bc6c24fc4e | ||
|
|
58f72a073d | ||
|
|
d8b526a715 | ||
|
|
a5b6871562 | ||
|
|
deb6031381 | ||
|
|
486cb59aff | ||
|
|
de9a3df7bd | ||
|
|
c83a75766c | ||
|
|
c016fb531c | ||
|
|
1615745a1f | ||
|
|
dc50382d22 | ||
|
|
a5b84379f4 | ||
|
|
d168261fa5 | ||
|
|
db131fc7da | ||
|
|
e83760388f | ||
|
|
82d19a5433 | ||
|
|
e3e39728ce | ||
|
|
76dfb8ef31 | ||
|
|
544cf566b5 | ||
|
|
da88313488 | ||
|
|
2aa0720e93 | ||
|
|
80c6656c4f | ||
|
|
be536ee32e | ||
|
|
339e06634f | ||
|
|
ff9527ea52 | ||
|
|
a5a3523df8 | ||
|
|
06acd9ff25 | ||
|
|
1a1d45d9e4 | ||
|
|
1d3775b3d1 | ||
|
|
15c83db793 | ||
|
|
cc021589b8 | ||
|
|
5e316d37cb | ||
|
|
28dbb47937 | ||
|
|
619de9d5ee | ||
|
|
561b8aeb03 | ||
|
|
4286fd1bcc | ||
|
|
3bb0897bc1 | ||
|
|
12eedcf6f7 | ||
|
|
08d382facc | ||
|
|
e2369147b1 | ||
|
|
5e559c4444 | ||
|
|
e30762ea43 | ||
|
|
1fa4a078d8 | ||
|
|
3e87fa8aa5 | ||
|
|
e52ca120c4 | ||
|
|
3eadbba8a1 | ||
|
|
41f9451070 | ||
|
|
d9ae9a023a | ||
|
|
d2f5bfdbfd | ||
|
|
b4a1953372 | ||
|
|
96a1de92db | ||
|
|
cc2f46b837 | ||
|
|
db1342e5ff | ||
|
|
86c5057d62 | ||
|
|
779dea8408 | ||
|
|
544f374e44 | ||
|
|
b55d783cc2 | ||
|
|
9f25047e24 | ||
|
|
fb66afbf71 | ||
|
|
365fa6abc9 | ||
|
|
d7a824f35f | ||
|
|
0d8e412220 | ||
|
|
991f6ef508 | ||
|
|
37f03f5e2e | ||
|
|
b4a4ff0a06 | ||
|
|
de8876bd5e | ||
|
|
5ad272e628 | ||
|
|
3b22582752 | ||
|
|
e734fcbd21 | ||
|
|
435879c121 | ||
|
|
ed81650f55 | ||
|
|
1276a880de | ||
|
|
584016c291 | ||
|
|
4e948b2b48 | ||
|
|
b6bce374ad | ||
|
|
6cbd8abdca | ||
|
|
5947f38421 | ||
|
|
41664b152c | ||
|
|
29b24e391a | ||
|
|
0cdb80a9e0 | ||
|
|
a8907d6fb1 | ||
|
|
4851a66c57 | ||
|
|
1d5c2091cc | ||
|
|
e5abcaf7c8 | ||
|
|
d5733eed90 | ||
|
|
8957c277a1 | ||
|
|
a22cc0dc4e | ||
|
|
276f6a1c6f | ||
|
|
e161e32b63 | ||
|
|
e31a351c56 | ||
|
|
f728c0172b | ||
|
|
136644d45e | ||
|
|
24308612fd | ||
|
|
1ae3e89b57 | ||
|
|
8b9be8f120 | ||
|
|
c1bb6ca349 | ||
|
|
b03d1b9cc7 | ||
|
|
3ce0485742 | ||
|
|
100651a74c | ||
|
|
d3b687df8b | ||
|
|
df463177e7 | ||
|
|
62af36ebfa | ||
|
|
c5246b7415 | ||
|
|
d39c1fd685 | ||
|
|
665a7fbbcb | ||
|
|
5138e30a2a | ||
|
|
a69fa591da | ||
|
|
7f2a3eb2ca | ||
|
|
a4987d03b8 | ||
|
|
c477f10bfb | ||
|
|
2ae0f368b9 | ||
|
|
e45cc8cdc0 | ||
|
|
3c8edd7b3a | ||
|
|
ac33058086 | ||
|
|
855832d08b | ||
|
|
9f07981fe5 | ||
|
|
a27d6d3c7e | ||
|
|
2a4da355f1 | ||
|
|
c7a08aaf74 | ||
|
|
ca47fbc16b | ||
|
|
5a3c3de1a4 | ||
|
|
ff9062ac17 | ||
|
|
9486fc3f98 | ||
|
|
8c1d6d88cf | ||
|
|
33b16681c6 | ||
|
|
3c51716268 | ||
|
|
e5421b6cc6 | ||
|
|
f1e7ae1010 | ||
|
|
10fe907c83 | ||
|
|
ae9809caba | ||
|
|
28e873b5e0 | ||
|
|
39d532ca3f | ||
|
|
07a602e404 | ||
|
|
a448e48cdb | ||
|
|
092a3ee21a | ||
|
|
c95d197c5c | ||
|
|
88cfcdbd2e | ||
|
|
f3378c7b6f | ||
|
|
50545c1486 | ||
|
|
ae8749b7e1 | ||
|
|
ff678d06ea | ||
|
|
6345449d50 | ||
|
|
8951266183 | ||
|
|
6911624d4d | ||
|
|
84a548c0b9 | ||
|
|
da6efff220 | ||
|
|
cc99aff03b | ||
|
|
cdc5210c25 | ||
|
|
4838833d72 | ||
|
|
0fad184fda | ||
|
|
6d8c96d665 | ||
|
|
e6c1a3b052 | ||
|
|
f047cb0baf | ||
|
|
71add2e391 | ||
|
|
61abd2a48f | ||
|
|
6ba2f49866 | ||
|
|
2fd2cf9074 | ||
|
|
28494941e1 | ||
|
|
d0d40f248d | ||
|
|
cc2a2ca153 | ||
|
|
2307b639dd | ||
|
|
1e0ea36a81 | ||
|
|
b70059ac4d | ||
|
|
4e1250a6ba | ||
|
|
56d2852004 | ||
|
|
3fa8edcb1a | ||
|
|
edb14ea03c | ||
|
|
a2f554bc1e | ||
|
|
eb567c1120 | ||
|
|
a289bbfb93 | ||
|
|
5486c2040d | ||
|
|
84c95be03f | ||
|
|
d9e6c6c4c5 | ||
|
|
25559e758c | ||
|
|
89ce4aee4a | ||
|
|
b1eb9b9080 | ||
|
|
ba9d2e7919 | ||
|
|
9d0c742f34 | ||
|
|
1e69961bc7 | ||
|
|
e4ddc4c14e | ||
|
|
a0b6535210 | ||
|
|
be149bab3d | ||
|
|
1b4bbe19e3 | ||
|
|
2e6b602a04 | ||
|
|
5b9012152c | ||
|
|
efd20bb4f7 | ||
|
|
7d595e4774 | ||
|
|
7b4c3085c0 | ||
|
|
9a9b3afa31 | ||
|
|
7045a5dcea | ||
|
|
777bae87b5 | ||
|
|
06ae867c2f | ||
|
|
77ebd3d202 | ||
|
|
59bc054ef6 | ||
|
|
227f999001 | ||
|
|
e37782c2ce | ||
|
|
f210be5ab4 | ||
|
|
12b1a0639e | ||
|
|
34098b871b | ||
|
|
57e9dfe722 | ||
|
|
cc2ebff0e3 | ||
|
|
7c21766dd5 | ||
|
|
965dfd2d39 | ||
|
|
f17a519c38 | ||
|
|
49e598b4b7 | ||
|
|
40f13f3afa | ||
|
|
356e2054fa | ||
|
|
8223ca9739 | ||
|
|
dab22e927b | ||
|
|
a1f60be674 | ||
|
|
e0ec59d30b | ||
|
|
abc1c9ef7e | ||
|
|
3e4a778978 | ||
|
|
ca85495a1c | ||
|
|
fe20c27b60 | ||
|
|
41dc03222c | ||
|
|
3cf56d8270 | ||
|
|
9436564a76 | ||
|
|
142065d58b | ||
|
|
2ffd3d95bb | ||
|
|
6b9f87dbea | ||
|
|
5ba59d1096 | ||
|
|
3b2aee92fb | ||
|
|
12dac8ee62 | ||
|
|
f8df77051b | ||
|
|
fd9c0f6be4 | ||
|
|
cf05510b0d | ||
|
|
207923a1b6 | ||
|
|
fbbcb058fa | ||
|
|
cef1736de2 | ||
|
|
da10cfc062 | ||
|
|
0ad1e9bbc1 | ||
|
|
7cbf2533fe | ||
|
|
1a9d1c235c | ||
|
|
5c8a19f54f | ||
|
|
44fe593f8a | ||
|
|
b8d1af4e50 | ||
|
|
18f189b887 | ||
|
|
c9776c97de | ||
|
|
57a4241749 | ||
|
|
163ff997b1 | ||
|
|
449e9879ce | ||
|
|
5ea14f063f | ||
|
|
84350c3776 | ||
|
|
3cc3d03f0b | ||
|
|
91027ae9a4 | ||
|
|
9db80785a5 | ||
|
|
a876817127 | ||
|
|
057e5bb0c1 | ||
|
|
07fc66765d | ||
|
|
3a0c70aef7 | ||
|
|
bbb6a73af1 | ||
|
|
51119ec213 | ||
|
|
2690ee46f2 | ||
|
|
bc2e456a6a | ||
|
|
daa7b9b6ab | ||
|
|
b27c3719f0 | ||
|
|
147482d5e8 | ||
|
|
514403e1ba | ||
|
|
109d3aad6a | ||
|
|
15779e204d | ||
|
|
49e403f822 | ||
|
|
ffb5b76f4e | ||
|
|
b21932ffd9 | ||
|
|
46d8f1c8d9 | ||
|
|
8caffac3d7 | ||
|
|
40da5360a4 | ||
|
|
5b9f91991f | ||
|
|
a565f2d984 | ||
|
|
0b7269a4b8 | ||
|
|
c7805b4b40 | ||
|
|
e6b65be75a | ||
|
|
7043fe592c | ||
|
|
f7d35c41ae | ||
|
|
afb4942a72 | ||
|
|
4f7bd0918b | ||
|
|
fb8d34254a | ||
|
|
2a390c4c25 | ||
|
|
040fbf72e9 | ||
|
|
395e9aea3c | ||
|
|
bb3508327f | ||
|
|
068ae45f6c | ||
|
|
02ff0f658b | ||
|
|
3c14d9b524 | ||
|
|
8de00babad | ||
|
|
59768f0514 | ||
|
|
e185fe30f8 | ||
|
|
0d20be43d4 | ||
|
|
356632063c | ||
|
|
3a592ddb59 | ||
|
|
652ade33b5 | ||
|
|
05e6188921 | ||
|
|
b222ebed80 | ||
|
|
179d9b9ae1 | ||
|
|
ab7f50d2c8 | ||
|
|
51cc3c7cd1 | ||
|
|
d51f14529a | ||
|
|
563dfc3d4d | ||
|
|
3ad72a04af | ||
|
|
d43130f779 | ||
|
|
ce997ff4fd | ||
|
|
7a5d530358 | ||
|
|
dd0520f334 | ||
|
|
aab9143c13 | ||
|
|
b689ec2ef4 | ||
|
|
c9c2da444b | ||
|
|
9c931c175c | ||
|
|
39db8f1768 | ||
|
|
f7ed9ff131 | ||
|
|
4423126272 | ||
|
|
5294bc510b | ||
|
|
1b599315a2 | ||
|
|
b561655503 | ||
|
|
64923382b4 | ||
|
|
5ef6525be7 | ||
|
|
6dc066f7dd | ||
|
|
380cf61811 | ||
|
|
4624ca952e | ||
|
|
6f1475e944 | ||
|
|
22256eec46 | ||
|
|
31a5de2577 | ||
|
|
269e008541 | ||
|
|
79d866e9b5 | ||
|
|
6d4341f8a4 | ||
|
|
61dd96a29e | ||
|
|
9e2a8e0fb2 | ||
|
|
82ff7afe2b | ||
|
|
0017eaebfc | ||
|
|
fa729854b8 | ||
|
|
5644aebac7 | ||
|
|
941f5e43b4 | ||
|
|
a595407d39 | ||
|
|
60417b361e | ||
|
|
c3adf1724c | ||
|
|
435bbff3b0 | ||
|
|
706ea0dd7e | ||
|
|
e7c37a9d54 | ||
|
|
a7f66d648e | ||
|
|
013dc818e3 | ||
|
|
9430670019 | ||
|
|
67c795b610 | ||
|
|
42158401ac | ||
|
|
06a9891d77 | ||
|
|
c53e5325c3 | ||
|
|
6161d531fc | ||
|
|
ad52e75e97 | ||
|
|
2db7b6756d | ||
|
|
2f70c6c8a7 | ||
|
|
8fd8943460 | ||
|
|
695b533be1 | ||
|
|
491e9fb3e9 | ||
|
|
4d8bccc861 | ||
|
|
88b5fea2f9 | ||
|
|
91e886c564 | ||
|
|
1e8ff58d82 | ||
|
|
0b84052458 | ||
|
|
4abc92ef44 | ||
|
|
d12833afc4 | ||
|
|
8de34e23a3 | ||
|
|
3158caa1be | ||
|
|
8a6d13c416 | ||
|
|
90fe2cfb36 | ||
|
|
c91d5ebec1 | ||
|
|
5a00d5e117 | ||
|
|
1b938d9d5b | ||
|
|
62cbbef068 | ||
|
|
684547a66d | ||
|
|
261569c9fd | ||
|
|
e8d3ad369a | ||
|
|
f81ae009f9 | ||
|
|
8b954a2937 | ||
|
|
1e58f48f1d | ||
|
|
1a0e9905fb | ||
|
|
8a04a843f6 | ||
|
|
814e57fbd0 | ||
|
|
f69389a76b | ||
|
|
3f9b1357ff | ||
|
|
e0cb098823 | ||
|
|
bc470533bf | ||
|
|
84d4e7efe3 | ||
|
|
39b900243e | ||
|
|
017aedadd2 | ||
|
|
7c06399818 | ||
|
|
26646997b0 | ||
|
|
1b3f651c7e | ||
|
|
23b002adaa | ||
|
|
d9118a8653 | ||
|
|
245714aa0c | ||
|
|
2618620d04 | ||
|
|
1d3d0585a2 | ||
|
|
2e263b1cdc | ||
|
|
f4aece9488 | ||
|
|
c1928689da | ||
|
|
6972b3458d | ||
|
|
bb6634bbb0 | ||
|
|
1b2a6bdc72 | ||
|
|
901c12671e | ||
|
|
3c564fd613 |
@@ -1,17 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
|
||||
indent_style = space
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.js]
|
||||
indent_size = 4
|
||||
|
||||
[meson.build]
|
||||
indent_size = 2
|
||||
7
.eslintrc.yml
Normal file
7
.eslintrc.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
|
||||
|
||||
extends:
|
||||
- ./lint/eslintrc-gjs.yml
|
||||
- ./lint/eslintrc-shell.yml
|
||||
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -1,4 +0,0 @@
|
||||
# SPDX-FileCopyrightText: No rights reserved
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
package-lock.json -diff
|
||||
14
.gitignore
vendored
14
.gitignore
vendored
@@ -1,14 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
# SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
||||
#
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
po/gnome-shell-extensions.pot
|
||||
zip-files/
|
||||
*~
|
||||
*.patch
|
||||
*.sw?
|
||||
.buildconfig
|
||||
.eslintcache
|
||||
.vscode
|
||||
node_modules
|
||||
@@ -3,17 +3,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
include:
|
||||
- project: Infrastructure/freedesktop-ci-templates
|
||||
file: templates/fedora.yml
|
||||
- project: Infrastructure/freedesktop-ci-templates
|
||||
file: templates/ci-fairy.yml
|
||||
- project: GNOME/citemplates
|
||||
file: templates/default-rules.yml
|
||||
- component: gitlab.gnome.org/GNOME/citemplates/release-service@master
|
||||
inputs:
|
||||
job-stage: deploy
|
||||
dist-job-name: fedora-dist-tarball
|
||||
tarball-artifact-path: "$TARBALL_ARTIFACT_PATH"
|
||||
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/bbe5232986c9b98eb1efe62484e07216f7d1a4df/templates/fedora.yml'
|
||||
- remote: "https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/6f86b8bcb0cd5168c32779c4fea9a893c4a0c046/templates/ci-fairy.yml"
|
||||
|
||||
stages:
|
||||
- pre_review
|
||||
@@ -23,12 +14,27 @@ stages:
|
||||
- deploy
|
||||
|
||||
default:
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/41:2024-10-18.0
|
||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
|
||||
# Cancel jobs if newer commits are pushed to the branch
|
||||
interruptible: true
|
||||
# Auto-retry jobs in case of infra failures
|
||||
retry:
|
||||
max: 1
|
||||
when:
|
||||
- 'runner_system_failure'
|
||||
- 'stuck_or_timeout_failure'
|
||||
- 'scheduler_failure'
|
||||
- 'api_failure'
|
||||
|
||||
variables:
|
||||
FDO_UPSTREAM_REPO: GNOME/gnome-shell-extensions
|
||||
MESON_BUILD_DIR: build
|
||||
TARBALL_ARTIFACT_PATH: "${MESON_BUILD_DIR}/meson-dist/${CI_PROJECT_NAME}-${CI_COMMIT_TAG}.tar.xz"
|
||||
LINT_LOG: "eslint-report.xml"
|
||||
|
||||
workflow:
|
||||
rules:
|
||||
- if: '$CI_MERGE_REQUEST_IID'
|
||||
- if: '$CI_COMMIT_TAG'
|
||||
- if: '$CI_COMMIT_BRANCH'
|
||||
|
||||
.pipeline_guard: &pipeline_guard
|
||||
rules:
|
||||
@@ -38,6 +44,13 @@ variables:
|
||||
- if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/'
|
||||
- when: 'manual'
|
||||
|
||||
.gnome-shell-extensions.fedora:34:
|
||||
variables:
|
||||
FDO_DISTRIBUTION_VERSION: 34
|
||||
FDO_DISTRIBUTION_TAG: '2021-08-31.0'
|
||||
FDO_DISTRIBUTION_PACKAGES: >
|
||||
meson git gettext sassc
|
||||
|
||||
.prereview_req: &prereview_req
|
||||
needs:
|
||||
- check_commit_log
|
||||
@@ -89,6 +102,13 @@ check-reuse:
|
||||
script:
|
||||
- reuse lint
|
||||
|
||||
build-fedora-container:
|
||||
extends:
|
||||
- .fdo.container-build@fedora@x86_64
|
||||
- .gnome-shell-extensions.fedora:34
|
||||
stage: prepare
|
||||
<<: *prereview_req
|
||||
|
||||
js_check:
|
||||
stage: review
|
||||
<<: *prereview_req
|
||||
@@ -98,22 +118,14 @@ js_check:
|
||||
eslint:
|
||||
stage: review
|
||||
<<: *prereview_req
|
||||
variables:
|
||||
LINT_LOG: "eslint-report.xml"
|
||||
script:
|
||||
- ./tools/run-eslint.sh --output-file "$LINT_LOG" --format junit --stdout
|
||||
- export NODE_PATH=$(npm root -g)
|
||||
- ./.gitlab-ci/run-eslint --output-file ${LINT_LOG} --format junit --stdout
|
||||
artifacts:
|
||||
paths:
|
||||
- ${LINT_LOG}
|
||||
reports:
|
||||
junit: "$LINT_LOG"
|
||||
|
||||
potfile_js_check:
|
||||
stage: review
|
||||
<<: *prereview_req
|
||||
script:
|
||||
- gjs-check-potfiles
|
||||
artifacts:
|
||||
reports:
|
||||
junit: gjs-check-potfiles.junit.xml
|
||||
junit: ${LINT_LOG}
|
||||
|
||||
build-bundles:
|
||||
stage: build
|
||||
@@ -127,25 +139,32 @@ build-bundles:
|
||||
- zip-files/
|
||||
|
||||
fedora-build:
|
||||
extends:
|
||||
- .fdo.distribution-image@fedora
|
||||
- .gnome-shell-extensions.fedora:34
|
||||
stage: build
|
||||
<<: *prereview_req
|
||||
needs:
|
||||
- build-fedora-container
|
||||
script:
|
||||
- meson setup "$MESON_BUILD_DIR" --werror -Dextension_set=all -Dclassic_mode=true
|
||||
- meson compile -C "$MESON_BUILD_DIR"
|
||||
- meson test -C "$MESON_BUILD_DIR"
|
||||
- meson install -C "$MESON_BUILD_DIR"
|
||||
- meson setup build --werror -Dextension_set=all -Dclassic_mode=true
|
||||
- meson compile -C build
|
||||
- meson test -C build
|
||||
- meson install -C build
|
||||
artifacts:
|
||||
paths:
|
||||
- "$MESON_BUILD_DIR"
|
||||
- build
|
||||
|
||||
fedora-dist:
|
||||
extends:
|
||||
- .fdo.distribution-image@fedora
|
||||
- .gnome-shell-extensions.fedora:34
|
||||
stage: deploy
|
||||
needs:
|
||||
- fedora-build
|
||||
variables:
|
||||
GIT_SUBMODULE_STRATEGY: normal
|
||||
script:
|
||||
- meson dist -C "$MESON_BUILD_DIR"
|
||||
- meson dist -C build
|
||||
rules:
|
||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
||||
changes:
|
||||
@@ -156,9 +175,7 @@ fedora-dist-tarball:
|
||||
extends: fedora-dist
|
||||
artifacts:
|
||||
expose_as: 'Get tarball here'
|
||||
name: "${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
|
||||
when: always
|
||||
paths:
|
||||
- "$TARBALL_ARTIFACT_PATH"
|
||||
- build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz
|
||||
rules:
|
||||
- if: '$CI_COMMIT_TAG'
|
||||
|
||||
58
.gitlab-ci/run-eslint
Executable file
58
.gitlab-ci/run-eslint
Executable file
@@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
const {ESLint} = require('eslint');
|
||||
|
||||
console.log(`Running ESLint version ${ESLint.version}...`);
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
function hasOption(...names) {
|
||||
return process.argv.some(arg => names.includes(arg));
|
||||
}
|
||||
|
||||
function getOption(...names) {
|
||||
const optIndex =
|
||||
process.argv.findIndex(arg => names.includes(arg)) + 1;
|
||||
|
||||
if (optIndex === 0)
|
||||
return undefined;
|
||||
|
||||
return process.argv[optIndex];
|
||||
}
|
||||
|
||||
(async function main() {
|
||||
const outputOption = getOption('--output-file', '-o');
|
||||
const outputPath = outputOption ? path.resolve(outputOption) : null;
|
||||
|
||||
const sourceDir = path.dirname(process.argv[1]);
|
||||
process.chdir(path.resolve(sourceDir, '..'));
|
||||
|
||||
const sources = ['extensions'];
|
||||
const eslint = new ESLint();
|
||||
|
||||
const results = await eslint.lintFiles(sources);
|
||||
const formatter = await eslint.loadFormatter(getOption('--format', '-f'));
|
||||
const resultText = formatter.format(results);
|
||||
|
||||
if (outputPath) {
|
||||
fs.mkdirSync(path.dirname(outputPath), {recursive: true});
|
||||
fs.writeFileSync(outputPath, resultText);
|
||||
|
||||
if (hasOption('--stdout')) {
|
||||
const consoleFormatter = await eslint.loadFormatter();
|
||||
console.log(consoleFormatter.format(results));
|
||||
}
|
||||
} else {
|
||||
console.log(resultText);
|
||||
}
|
||||
|
||||
process.exitCode = results.some(r => r.errorCount > 0) ? 1 : 0;
|
||||
})().catch((error) => {
|
||||
process.exitCode = 1;
|
||||
console.error(error);
|
||||
});
|
||||
@@ -1,72 +0,0 @@
|
||||
<!--
|
||||
Please read https://handbook.gnome.org/issues/reporting.html
|
||||
first to ensure that you create a clear and specific issue.
|
||||
-->
|
||||
|
||||
### Which extension
|
||||
|
||||
<!--
|
||||
Which extension is the issue about?
|
||||
|
||||
See the project README for a complete list of extensions:
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell-extensions#extensions
|
||||
|
||||
Do not report issues for any other extensions here.
|
||||
|
||||
Report general issues about gnome-shell's extension support to
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell.
|
||||
|
||||
Report issues with the extensions.gnome.org website to
|
||||
https://gitlab.gnome.org/Infrastructure/extensions-web/
|
||||
-->
|
||||
|
||||
### Affected version
|
||||
|
||||
<!--
|
||||
Provide at least the following information:
|
||||
* Your OS and version
|
||||
* Extension version
|
||||
* Affected GNOME Shell version
|
||||
-->
|
||||
|
||||
### Bug summary
|
||||
|
||||
<!--
|
||||
Provide a short summary of the bug you encountered.
|
||||
-->
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
<!--
|
||||
1. Step one
|
||||
2. Step two
|
||||
3. ...
|
||||
-->
|
||||
|
||||
### What happened
|
||||
|
||||
<!--
|
||||
What did the extension do that was unexpected?
|
||||
-->
|
||||
|
||||
### What did you expect to happen
|
||||
|
||||
<!--
|
||||
What did you expect the extension to do?
|
||||
-->
|
||||
|
||||
### Relevant logs, screenshots, screencasts etc.
|
||||
|
||||
<!--
|
||||
If you have further information, such as technical documentation, logs,
|
||||
screenshots or screencasts related, please provide them here.
|
||||
|
||||
If the bug is a crash, please obtain a stack trace with installed debug
|
||||
symbols (at least for GNOME Shell and Mutter) and attach it to
|
||||
this issue following the instructions on
|
||||
https://handbook.gnome.org/issues/stack-traces.html.
|
||||
-->
|
||||
|
||||
|
||||
<!-- Do not remove the following line. -->
|
||||
/label ~"1. Bug"
|
||||
@@ -1,2 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
|
||||
SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
@@ -1,47 +0,0 @@
|
||||
<!--
|
||||
Please read https://handbook.gnome.org/issues/reporting.html
|
||||
first to ensure that you create a clear and specific issue.
|
||||
-->
|
||||
|
||||
### Which extension
|
||||
|
||||
<!--
|
||||
Which extension is the issue about?
|
||||
|
||||
See the project README for a complete list of extensions:
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell-extensions#extensions
|
||||
|
||||
Do not report issues for any other extensions here.
|
||||
|
||||
Report general issues about gnome-shell's extension support to
|
||||
https://gitlab.gnome.org/GNOME/gnome-shell.
|
||||
|
||||
Report issues with the extensions.gnome.org website to
|
||||
https://gitlab.gnome.org/Infrastructure/extensions-web/
|
||||
-->
|
||||
|
||||
### Feature summary
|
||||
|
||||
<!--
|
||||
Describe what you would like to be able to do with the extension
|
||||
that you currently cannot do.
|
||||
-->
|
||||
|
||||
### How would you like it to work
|
||||
|
||||
<!--
|
||||
If you can think of a way the extension might be able to do this,
|
||||
let us know here.
|
||||
-->
|
||||
|
||||
### Relevant links, screenshots, screencasts etc.
|
||||
|
||||
<!--
|
||||
If you have further information, such as technical documentation,
|
||||
code, mockups or a similar feature in another desktop environments,
|
||||
please provide them here.
|
||||
-->
|
||||
|
||||
|
||||
<!-- Do not remove the following line. -->
|
||||
/label ~"1. Feature"
|
||||
@@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
|
||||
SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
|
||||
22
.reuse/dep5
Normal file
22
.reuse/dep5
Normal file
@@ -0,0 +1,22 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: gnome-shell-extensions
|
||||
Upstream-Contact: Florian Müllner <fmuellner@gnome.org>
|
||||
Source: https://gitlab.gnome.org/GNOME/gnome-shell-extensions
|
||||
|
||||
Files: NEWS README.md HACKING.md data/HACKING
|
||||
Copyright: No rights reserved
|
||||
License: CC0-1.0
|
||||
|
||||
Files: *.json.in *.desktop.in *.gschema.override
|
||||
Copyright: Florian Müllner <fmuellner@gnome.org>
|
||||
License: GPL-2.0-or-later
|
||||
|
||||
# managed by translation teams
|
||||
Files: po/*.po
|
||||
Copyright: GNOME Translation Teams <i18n@gnome.org>
|
||||
License: GPL-2.0-or-later
|
||||
|
||||
# managed by translation teams
|
||||
Files: po/LINGUAS po/POTFILES.in
|
||||
Copyright: No rights reserved
|
||||
License: CC0-1.0
|
||||
@@ -1,9 +1,3 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
SPDX-FileCopyrightText: 2017 Florian Müllner <fmuellner@gnome.org>"""
|
||||
SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
-->
|
||||
|
||||
## Creating a New Extension
|
||||
|
||||
To create a new extension, add a subdirectory in extensions. Then create
|
||||
@@ -26,6 +20,9 @@ need in gnome-shell.
|
||||
Generally, we follow [GJS coding style][coding-style], which in short is:
|
||||
indent 4 spaces, no tabs, space after comma, no space after function call.
|
||||
|
||||
The Emacs mode line for this
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
|
||||
Imports should be at the top, in two groups, one for standard
|
||||
imports (like imports.lang or imports.dbus) and introspection,
|
||||
the other for Shell API. Within the same group, put everything
|
||||
|
||||
@@ -1,170 +0,0 @@
|
||||
Creative Commons Attribution-ShareAlike 4.0 International
|
||||
|
||||
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.
|
||||
|
||||
Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described.
|
||||
|
||||
Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.
|
||||
|
||||
Creative Commons Attribution-ShareAlike 4.0 International Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
|
||||
|
||||
Section 1 – Definitions.
|
||||
|
||||
a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
|
||||
|
||||
b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
|
||||
|
||||
c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License.
|
||||
|
||||
d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||
|
||||
e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
|
||||
|
||||
f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
|
||||
|
||||
g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike.
|
||||
|
||||
h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
|
||||
|
||||
i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
|
||||
|
||||
j. Licensor means the individual(s) or entity(ies) granting rights under this Public License.
|
||||
|
||||
k. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
|
||||
|
||||
l. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
|
||||
|
||||
m. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 – Scope.
|
||||
|
||||
a. License grant.
|
||||
|
||||
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
|
||||
|
||||
A. reproduce and Share the Licensed Material, in whole or in part; and
|
||||
|
||||
B. produce, reproduce, and Share Adapted Material.
|
||||
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
|
||||
|
||||
3. Term. The term of this Public License is specified in Section 6(a).
|
||||
|
||||
4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
|
||||
|
||||
5. Downstream recipients.
|
||||
|
||||
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
|
||||
|
||||
B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.
|
||||
|
||||
C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
|
||||
|
||||
6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b. Other rights.
|
||||
|
||||
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
|
||||
|
||||
2. Patent and trademark rights are not licensed under this Public License.
|
||||
|
||||
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
|
||||
|
||||
Section 3 – License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
|
||||
|
||||
a. Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified form), You must:
|
||||
|
||||
A. retain the following if it is supplied by the Licensor with the Licensed Material:
|
||||
|
||||
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
|
||||
|
||||
ii. a copyright notice;
|
||||
|
||||
iii. a notice that refers to this Public License;
|
||||
|
||||
iv. a notice that refers to the disclaimer of warranties;
|
||||
|
||||
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||
|
||||
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
|
||||
|
||||
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
|
||||
|
||||
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||
|
||||
b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
|
||||
|
||||
1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License.
|
||||
|
||||
2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
|
||||
|
||||
3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.
|
||||
|
||||
Section 4 – Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
|
||||
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
|
||||
|
||||
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
|
||||
|
||||
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
|
||||
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
|
||||
|
||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||
|
||||
a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
|
||||
|
||||
b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
|
||||
|
||||
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
|
||||
|
||||
Section 6 – Term and Termination.
|
||||
|
||||
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
|
||||
|
||||
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
|
||||
|
||||
2. upon express reinstatement by the Licensor.
|
||||
|
||||
c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
|
||||
|
||||
d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
|
||||
|
||||
e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||
|
||||
Section 7 – Other Terms and Conditions.
|
||||
|
||||
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
|
||||
|
||||
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
|
||||
|
||||
Section 8 – Interpretation.
|
||||
|
||||
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
|
||||
|
||||
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
|
||||
|
||||
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
|
||||
|
||||
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
|
||||
|
||||
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
||||
230
NEWS
230
NEWS
@@ -1,224 +1,22 @@
|
||||
49.beta
|
||||
=======
|
||||
* Misc. bug fixes and cleanups [Florian; !408]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Anders Jonsson [sv], Makoto Sakaguchi [ja], Danial Behzadi [fa],
|
||||
Jordi Mas i Hernandez [ca]
|
||||
|
||||
49.alpha.1
|
||||
==========
|
||||
* workspaces-indicator, window-list: Better expose workspace names
|
||||
[Florian; !405]
|
||||
* window-list: Animate transition to/from overview [Florian; !412]
|
||||
* Misc. bug fixes and cleanups [Florian; !409, !411, !413]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Martin [sl], Emin Tufan Çetin [tr], Yuri Chornoivan [uk], Luming Zh [zh_CN],
|
||||
Yago Raña [gl], Ekaterine Papava [ka], Vasil Pupkin [be],
|
||||
Álvaro Burns [pt_BR], Sergej A. [ru]
|
||||
|
||||
49.alpha.0
|
||||
==========
|
||||
* windowsNavigator: Fix handling keyboard shortcuts [Daniel; !395]
|
||||
* build: Allow disabling the X11 session [Neal; !396, !400]
|
||||
* Disable X11 session by default [Jordan; !399]
|
||||
* Misc. bug fixes and cleanups [Florian; !398, !406]
|
||||
|
||||
Contributors:
|
||||
Daniel Buch Hansen, Neal Gompa, Florian Müllner, Jordan Petridis
|
||||
|
||||
Translators:
|
||||
Emilio Sepúlveda [ia]
|
||||
|
||||
48.1
|
||||
45.2
|
||||
====
|
||||
|
||||
Translators:
|
||||
Hugo Carvalho [pt], Danial Behzadi [fa]
|
||||
|
||||
48.0
|
||||
====
|
||||
* apps-menu: Fix scrolling items into view on keynav [Victor; !391]
|
||||
* Misc. bug fixes and cleanups [Florian, Stuart; !390, !392]
|
||||
|
||||
Contributors:
|
||||
Stuart Hayhurst, Victor Kareh, Florian Müllner
|
||||
|
||||
48.rc
|
||||
=====
|
||||
* Misc. bug fixes and cleanups [Florian; !385, !388]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Emilio Sepúlveda [ia], Mathews M [ml], Daniel Rusek [cs], Piotr Drąg [pl],
|
||||
Anders Jonsson [sv], Ekaterine Papava [ka], Yuri Chornoivan [uk],
|
||||
Aurimas Černius [lt], Luming Zh [zh_CN], Jiri Grönroos [fi]
|
||||
|
||||
48.beta
|
||||
=======
|
||||
* window-list: Fix regression in chrome tracking [Florian; !379]
|
||||
* Misc. bug fixes and cleanups [Florian; !380]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner, Emilio Sepúlveda
|
||||
|
||||
Translators:
|
||||
Rafael Fontenelle [pt_BR], Emilio Sepúlveda [ia]
|
||||
|
||||
48.alpha
|
||||
========
|
||||
* classic: Add missing top-bar indicators [Florian; !339]
|
||||
* window-list: Fix window state styling [Florian; !342]
|
||||
* window-list: Fix "ignore-workspace" setting getting reset [Florian; !341]
|
||||
* window-list: Allow rearranging window buttons [Florian, Jakub; !338]
|
||||
* window-list: Add workspaces page to preference dialog [Florian; !344]
|
||||
* places-menu: Sync list of places with nautilus [Florian; !340]
|
||||
* places-menu: Fix a11y labelling [Florian; #542]
|
||||
* places-menu: Fix opening drives with mount operations [Florian; !361]
|
||||
* window-list: Fix hiding when entering overview with gestures [Florian; !364]
|
||||
* workspace-indicator: Only show previews of regular windows [Florian; !363]
|
||||
* window-list: Add attention indicator [Florian; !366]
|
||||
* Misc. bug fixes and cleanups [Florian, Bartłomiej; !337, !343, !345, !347,
|
||||
!348, !349, !351, !352, !353, !354, !358, !362, !365, !367, !368, !370, !375]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner, Bartłomiej Piotrowski, Jakub Steiner
|
||||
|
||||
Translators:
|
||||
Fabio Tomat [fur], Martin [sl], Jordi Mas i Hernandez [ca], Vasil Pupkin [be],
|
||||
Nathan Follens [nl], Artur S0 [ru], Марко Костић [sr],
|
||||
Yaron Shahrabani [he], Sabri Ünal [tr], Yi-Jyun Pan [zh_TW]
|
||||
|
||||
47.0
|
||||
====
|
||||
|
||||
Translators:
|
||||
twlvnn kraftwerk [bg], Alexander Shopov [bg], Fran Dieguez [gl],
|
||||
Aurimas Černius [lt], Daniel [es], Andika Triwidada [id],
|
||||
Andi Chandler [en_GB], Ask Hjorth Larsen [da], Aefgh Threenine [th],
|
||||
Dušan Kazik [sk], Rūdolfs Mazurs [lv], Irénée THIRION [fr]
|
||||
|
||||
47.rc
|
||||
=====
|
||||
* Misc. bug fixes and cleanups [Sophie; !333]
|
||||
|
||||
Contributors:
|
||||
Sophie Herold
|
||||
|
||||
Translators:
|
||||
Daniel Șerbănescu [ro], Giannis Antypas [el], Ekaterine Papava [ka],
|
||||
Jordi Mas i Hernandez [ca], Yuri Chornoivan [uk], Jiri Grönroos [fi],
|
||||
Daniel Rusek [cs], Vasil Pupkin [be], Luming Zh [zh_CN], Brage Fuglseth [nb],
|
||||
Asier Sarasua Garmendia [eu], Danial Behzadi [fa], Rafael Fontenelle [pt_BR],
|
||||
Quentin PAGÈS [oc], Anders Jonsson [sv], Jürgen Benvenuti [de],
|
||||
Changwoo Ryu [ko], Hugo Carvalho [pt], Piotr Drąg [pl], Sabri Ünal [tr]
|
||||
|
||||
47.beta
|
||||
=======
|
||||
* window-list: Modernize styling [Jakub; !330]
|
||||
* Include "status-icons" extension [Florian; !194]
|
||||
* Misc. bug fixes and cleanups [Florian; !328, !331, !327]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner, Jakub Steiner
|
||||
|
||||
Translators:
|
||||
Sabri Ünal [tr], Chao-Hsiung Liao [zh_TW]
|
||||
|
||||
47.alpha
|
||||
========
|
||||
* Improve workspace previews in window-list and workspace-indicator
|
||||
[Florian; !307, !316]
|
||||
* apps-menu: Fix a11y of category labels [Florian; !319]
|
||||
* window-list: Fix long-press support [Florian; !320]
|
||||
* window-list: Animate transitions [Florian; !325]
|
||||
* Misc. bug fixes and cleanups [Florian; !315, !321, !324]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Jordi Mas i Hernandez [ca], Martin [sl], Hugo Carvalho [pt], Jose Riha [sk],
|
||||
Scrambled 777 [hi], Artur S0 [ru], Милош Поповић [sr], Yosef Or Boczko [he],
|
||||
Balázs Úr [hu]
|
||||
|
||||
46.1
|
||||
====
|
||||
* screenshot-window-sizer: Add flathub-recommended size [Florian; !317]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Rachida SACI [kab], Matheus Polkorny [pt_BR], Fabio Tomat [fur]
|
||||
|
||||
46.0
|
||||
====
|
||||
* system-monitor: Fix net speed [Florian; !313]
|
||||
* Misc. bug fixes and cleanups [Aral; !311]
|
||||
|
||||
Contributors:
|
||||
Aral Balkan, Florian Müllner
|
||||
|
||||
Translators:
|
||||
Anders Jonsson [sv], Piotr Drąg [pl], Balázs Úr [hu], Milo Casagrande [it],
|
||||
Quentin PAGÈS [oc], Athmane MOKRAOUI [kab], Changwoo Ryu [ko],
|
||||
Ask Hjorth Larsen [da]
|
||||
|
||||
46.rc
|
||||
=====
|
||||
* Fix window previews in workspace indicator [Florian; !304]
|
||||
* Fix menu ornament in workspace indicator [Florian; !305]
|
||||
* Misc. bug fixes and cleanups [Florian; !306, !309]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Danial Behzadi [fa], Ekaterine Papava [ka], Sabri Ünal [tr], Artur S0 [ru],
|
||||
Yuri Chornoivan [uk], Vasil Pupkin [be], Asier Sarasua Garmendia [eu],
|
||||
Yaron Shahrabani [he], Brage Fuglseth [nb], Nathan Follens [nl],
|
||||
Aurimas Černius [lt], Matej Urbančič [sl], Boyuan Yang [zh_CN],
|
||||
Kukuh Syafaat [id], Fran Dieguez [gl], Andi Chandler [en_GB],
|
||||
Baurzhan Muftakhidinov [kk], Rūdolfs Mazurs [lv], Guillaume Bernard [fr],
|
||||
Daniel Mustieles [es], Jiri Grönroos [fi]
|
||||
|
||||
46.beta
|
||||
=======
|
||||
* apps-menu: Rename Applications to Apps [Allan; !299]
|
||||
* Misc. bug fixes and cleanups [Florian; !296, !297, !300, !301, !302]
|
||||
|
||||
Contributors:
|
||||
Allan Day, Florian Müllner
|
||||
|
||||
Translators:
|
||||
Gabriel Brand [de], Daniel Rusek [cs], Fran Dieguez [gl],
|
||||
Aefgh Threenine [th], Vasil Pupkin [be], Artur S0 [ru], Yosef Or Boczko [he],
|
||||
Sabri Ünal [tr]
|
||||
|
||||
46.alpha
|
||||
========
|
||||
* workspace-indicator: Fix initial preview visibility [Florian; !280, !292]
|
||||
* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284]
|
||||
* Add back overview in Classic session [Florian; !287]
|
||||
* Allow running Classic session headless [Jonas; !289]
|
||||
* window-list: Fix buttons not being clickable at the screen edge
|
||||
[Florian; !291]
|
||||
* Add system-monitor extension [Florian; !277]
|
||||
* Fixed crash [Florian; !290]
|
||||
* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281, !286, !288]
|
||||
* window-list: Really fix initial preview visibility [Florian; !292]
|
||||
* workspace-indicator: Really fix initial preview visibility [Florian; !292]
|
||||
* Misc. bug fixes and cleanups [Florian; !290]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Florian Müllner
|
||||
Florian Müllner
|
||||
|
||||
45.1
|
||||
====
|
||||
* workspace-indicator: Fix initial preview visibility [Florian; !280]
|
||||
* screenshot-window-sizer: Fix cycling between sizes backwards [Florian; !284]
|
||||
* Misc. bug fixes and cleanups [Florian; !276, !275, !278, !281]
|
||||
|
||||
Contributors:
|
||||
Florian Müllner
|
||||
|
||||
Translators:
|
||||
Kristjan SCHMIDT [eo], Brage Fuglseth [nb]
|
||||
|
||||
110
README.md
110
README.md
@@ -1,34 +1,25 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
SPDX-FileCopyrightText: 2011 Adam Dingle <adam@yorba.org>
|
||||
SPDX-FileCopyrightText: 2011 Vamsi Krishna Brahmajosyula <vamsikrishna.brahmajosyula@gmail.com>
|
||||
SPDX-FileCopyrightText: 2014 Michael Catanzaro <mcatanzaro@gnome.org>
|
||||
SPDX-FileCopyrightText: 2015 Florian Müllner <fmuellner@gnome.org>
|
||||
SPDX-FileCopyrightText: 2019 Fabian P. Schmidt <kerel-fs@gmx.de>
|
||||
SPDX-FileCopyrightText: 2024 Aral Balkan <aral@aralbalkan.com>"""
|
||||
SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
-->
|
||||
|
||||
# GNOME Shell Extensions
|
||||
|
||||
GNOME Shell Extensions is a collection of extensions providing additional
|
||||
and optional functionality to GNOME Shell.
|
||||
|
||||
The extensions in this package are supported by GNOME and will be updated
|
||||
to reflect future API changes in GNOME Shell.
|
||||
Since GNOME Shell is not API stable, extensions work only against a very
|
||||
specific version of the shell, usually the same as this package (see
|
||||
"configure --version"). The extensions in this package are supported by GNOME
|
||||
and will be updated to reflect future API changes in GNOME Shell.
|
||||
|
||||
Both the most recent stable release and the previous stable release of
|
||||
GNOME Shell are actively supported, as well as the current development
|
||||
branch.
|
||||
The GNOME wiki has more information about [GNOME Shell Extensions][project-page],
|
||||
as well as some general information about [GNOME Shell][shell-page].
|
||||
|
||||
Please refer to the [schedule] to see when a new version will be released.
|
||||
|
||||
[schedule]: https://release.gnome.org/calendar
|
||||
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
|
||||
|
||||
## Extensions
|
||||
|
||||
The following is a complete list of extensions that are provided by this
|
||||
project.
|
||||
* alternate-tab (**OBSOLETE**)
|
||||
|
||||
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
|
||||
This extension is obsolete since GNOME 3.30, see [this blogpost][alternatetab-post]
|
||||
for further details.
|
||||
|
||||
* apps-menu
|
||||
|
||||
@@ -37,7 +28,8 @@ project.
|
||||
* auto-move-windows
|
||||
|
||||
Lets you manage your workspaces more easily, assigning a specific workspace to
|
||||
each application as soon as it creates a window.
|
||||
each application as soon as it creates a window, in a manner configurable with a
|
||||
GSettings key.
|
||||
|
||||
* drive-menu
|
||||
|
||||
@@ -48,11 +40,6 @@ project.
|
||||
|
||||
Changes application icons to always launch a new instance when activated.
|
||||
|
||||
* light-style
|
||||
|
||||
Changes the default shell style to "light", while still following the
|
||||
system-wide "dark" preference.
|
||||
|
||||
* native-window-placement
|
||||
|
||||
An alternative algorithm for layouting the thumbnails in the windows overview, that
|
||||
@@ -64,19 +51,11 @@ project.
|
||||
|
||||
* screenshot-window-sizer
|
||||
|
||||
Adds a shortcut for resizing the focus window to a size that is suitable for GNOME Software screenshots. Ctrl + Alt + s cycles forwards through the available sizes and Ctrl + Alt + Shift + s cycles backwards.
|
||||
|
||||
* status-icons
|
||||
|
||||
Show (XEmbed) status icons in the top bar.
|
||||
|
||||
* system-monitor
|
||||
|
||||
Shows system usage information in the top bar.
|
||||
Adds a shortcut for resizing the focus window to a size that is suitable for GNOME Software screenshots
|
||||
|
||||
* user-theme
|
||||
|
||||
Loads a shell theme from `$XDG_DATA_HOME/themes/<name>/gnome-shell`.
|
||||
Loads a shell theme from ~/.themes/<name>/gnome-shell.
|
||||
|
||||
* window-list
|
||||
|
||||
@@ -90,49 +69,18 @@ project.
|
||||
|
||||
Adds a simple workspace switcher to the top bar.
|
||||
|
||||
### Ex-Extensions
|
||||
## Default branch
|
||||
|
||||
Occasionally over the years, some extensions were removed.
|
||||
|
||||
The following list is not complete, but limited to cases that
|
||||
are notable for some reason; either the removal happened
|
||||
relatively recently, or the extension used to be particularly
|
||||
popular in the past.
|
||||
|
||||
* alternate-tab
|
||||
|
||||
Lets you use classic Alt+Tab (window-based instead of app-based) in GNOME Shell.
|
||||
This extension is obsolete since GNOME 3.30, see [this blogpost][alternatetab-post]
|
||||
for further details.
|
||||
|
||||
[alternatetab-post]: https://blogs.gnome.org/fmuellner/2018/10/11/the-future-of-alternatetab-and-why-you-need-not-worry/
|
||||
|
||||
## Reporting bugs
|
||||
|
||||
Bugs should be reported to the [issue tracking system][bug-tracker].
|
||||
|
||||
The [GNOME handbook][bug-handbook] has useful information for creating
|
||||
effective issue reports.
|
||||
|
||||
Please note that the issue tracker is meant to be used for
|
||||
actionable issues only.
|
||||
|
||||
For support questions, feedback on changes or general discussions,
|
||||
you can use:
|
||||
|
||||
- the [#gnome-shell matrix room][matrix-room]
|
||||
- the `Desktop` category or `extensions` and `shell` tags on [GNOME Discourse][discourse]
|
||||
|
||||
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
|
||||
[bug-handbook]: https://handbook.gnome.org/issues/reporting.html
|
||||
[matrix-room]: https://matrix.to/#/#gnome-shell:gnome.org
|
||||
[discourse]: https://discourse.gnome.org
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
All interactions with the project should follow the [Code of Conduct][conduct].
|
||||
|
||||
[conduct]: https://conduct.gnome.org/
|
||||
The default development branch is `main`. If you still have a local
|
||||
checkout under the old name, use:
|
||||
```sh
|
||||
git checkout master
|
||||
git branch -m master main
|
||||
git fetch
|
||||
git branch --unset-upstream
|
||||
git branch -u origin/master
|
||||
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
@@ -141,4 +89,8 @@ Public License, version 2 or later. See the [COPYING file][license] for details.
|
||||
Individual extensions may be licensed under different terms, see each source
|
||||
file for details.
|
||||
|
||||
[project-page]: https://wiki.gnome.org/Projects/GnomeShell/Extensions
|
||||
[shell-page]: https://wiki.gnome.org/Projects/GnomeShell
|
||||
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
|
||||
[license]: COPYING
|
||||
[alternatetab-post]: https://blogs.gnome.org/fmuellner/2018/10/11/the-future-of-alternatetab-and-why-you-need-not-worry/
|
||||
|
||||
41
REUSE.toml
41
REUSE.toml
@@ -1,41 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
version = 1
|
||||
SPDX-PackageName = "gnome-shell-extensions"
|
||||
SPDX-PackageSupplier = "Florian Müllner <fmuellner@gnome.org>"
|
||||
SPDX-PackageDownloadLocation = "https://gitlab.gnome.org/GNOME/gnome-shell-extensions"
|
||||
|
||||
[[annotations]]
|
||||
path = "NEWS"
|
||||
SPDX-FileCopyrightText = """
|
||||
2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
2013 Florian Müllner <fmuellner@gnome.org>"""
|
||||
SPDX-License-Identifier = "CC-BY-SA-4.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["**.json.in", "**.desktop.in", "**.gschema.override"]
|
||||
SPDX-FileCopyrightText = "Florian Müllner <fmuellner@gnome.org>"
|
||||
SPDX-License-Identifier = "GPL-2.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
# managed by translation teams
|
||||
path = "po/**.po"
|
||||
SPDX-FileCopyrightText = "GNOME Translation Teams <i18n@gnome.org>"
|
||||
SPDX-License-Identifier = "GPL-2.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
# managed by translation teams
|
||||
path = ["po/LINGUAS", "po/POTFILES.in"]
|
||||
SPDX-FileCopyrightText = "No rights reserved"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = "tools/package.json"
|
||||
SPDX-FileCopyrightText = "2025 Florian Müllner <fmuellner@gnome.org>"
|
||||
SPDX-License-Identifier = "MIT OR LGPL-2.0-or-later"
|
||||
|
||||
[[annotations]]
|
||||
path = "**package-lock.json"
|
||||
SPDX-FileCopyrightText = "No rights reserved"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
2
data/HACKING
Normal file
2
data/HACKING
Normal file
@@ -0,0 +1,2 @@
|
||||
To update the gnome-shell-sass submodule to latest upstream commit:
|
||||
git submodule update --rebase
|
||||
@@ -1,10 +1,11 @@
|
||||
{
|
||||
"parentMode": "user",
|
||||
"colorScheme": "force-light",
|
||||
"hasOverview": false,
|
||||
"showWelcomeDialog": false,
|
||||
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
||||
"panel": { "left": ["activities"],
|
||||
"panel": { "left": [],
|
||||
"center": [],
|
||||
"right": ["screenRecording", "screenSharing", "dwellClick", "a11y", "keyboard", "dateMenu", "quickSettings"]
|
||||
"right": ["a11y", "keyboard", "dateMenu", "quickSettings"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,4 +6,3 @@ TryExec=gnome-session
|
||||
Type=Application
|
||||
DesktopNames=GNOME-Classic;GNOME;
|
||||
X-GDM-SessionRegisters=true
|
||||
X-GDM-CanRunHeadless=true
|
||||
|
||||
@@ -6,4 +6,3 @@ TryExec=gnome-session
|
||||
Type=Application
|
||||
DesktopNames=GNOME-Classic;GNOME;
|
||||
X-GDM-SessionRegisters=true
|
||||
X-GDM-CanRunHeadless=true
|
||||
|
||||
@@ -2,46 +2,41 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
have_x11 = get_option('x11')
|
||||
|
||||
session_desktop_base = 'gnome-classic'
|
||||
|
||||
session_desktops = [
|
||||
session_desktop_base,
|
||||
session_desktop_base + '-xorg',
|
||||
session_desktop_base + '-wayland',
|
||||
]
|
||||
|
||||
if have_x11
|
||||
session_desktops += [session_desktop_base + '-xorg']
|
||||
endif
|
||||
|
||||
foreach name : session_desktops
|
||||
session_desktop = name + '.desktop'
|
||||
if name.endswith('-xorg')
|
||||
session_instdir = xsessiondir
|
||||
elif name.endswith('-wayland')
|
||||
session_instdir = wlsessiondir
|
||||
else
|
||||
# FIXME: The same target can not be copied into two directories.
|
||||
# There is a workaround in build-aux/session-post-install.py until proper
|
||||
# solution arises:
|
||||
# https://github.com/mesonbuild/meson/issues/2416
|
||||
session_instdir = wlsessiondir
|
||||
#session_instdir = [ xesssiondir, wlsessiondir ]
|
||||
endif
|
||||
i18n.merge_file(
|
||||
input: session_desktop + '.in',
|
||||
output: session_desktop,
|
||||
po_dir: '../po',
|
||||
install: true,
|
||||
install_dir: session_instdir,
|
||||
type: 'desktop',
|
||||
)
|
||||
foreach name: session_desktops
|
||||
session_desktop = name + '.desktop'
|
||||
if name.endswith('-xorg')
|
||||
session_instdir = xsessiondir
|
||||
elif name.endswith('-wayland')
|
||||
session_instdir = wlsessiondir
|
||||
else
|
||||
# FIXME: The same target can not be copied into two directories.
|
||||
# There is a workaround in meson/session-post-install.py until proper
|
||||
# solution arises:
|
||||
# https://github.com/mesonbuild/meson/issues/2416
|
||||
session_instdir = xsessiondir
|
||||
#session_instdir = [ xesssiondir, wlsessiondir ]
|
||||
endif
|
||||
i18n.merge_file(
|
||||
input: session_desktop + '.in',
|
||||
output: session_desktop,
|
||||
po_dir: '../po',
|
||||
install: true,
|
||||
install_dir: session_instdir,
|
||||
type: 'desktop'
|
||||
)
|
||||
endforeach
|
||||
|
||||
classic_uuids = []
|
||||
foreach e : classic_extensions
|
||||
classic_uuids += e + uuid_suffix
|
||||
classic_uuids += e + uuid_suffix
|
||||
endforeach
|
||||
|
||||
mode_conf = configuration_data()
|
||||
@@ -52,7 +47,7 @@ configure_file(
|
||||
input: mode_file + '.in',
|
||||
output: mode_file,
|
||||
configuration: mode_conf,
|
||||
install_dir: modedir,
|
||||
install_dir: modedir
|
||||
)
|
||||
|
||||
classic_override = '00_org.gnome.shell.extensions.classic.gschema.override'
|
||||
|
||||
942
debian/changelog
vendored
Normal file
942
debian/changelog
vendored
Normal file
@@ -0,0 +1,942 @@
|
||||
gnome-shell-extensions (45.2-2) experimental; urgency=medium
|
||||
|
||||
* Restore required dh-sequence-gnome build dependency
|
||||
|
||||
-- Jeremy Bícha <jbicha@ubuntu.com> Tue, 05 Dec 2023 12:07:50 -0500
|
||||
|
||||
gnome-shell-extensions (45.2-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* Stop using debian/control.in and dh-sequence-gnome
|
||||
* Update standards version to 4.6.2, no changes needed
|
||||
|
||||
-- Jeremy Bícha <jbicha@ubuntu.com> Tue, 05 Dec 2023 10:05:26 -0500
|
||||
|
||||
gnome-shell-extensions (45.1-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bícha <jbicha@ubuntu.com> Sat, 04 Nov 2023 12:31:26 +0200
|
||||
|
||||
gnome-shell-extensions (45.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bícha <jbicha@ubuntu.com> Mon, 18 Sep 2023 08:50:25 -0400
|
||||
|
||||
gnome-shell-extensions (45~beta-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bícha <jbicha@ubuntu.com> Mon, 21 Aug 2023 10:17:23 -0400
|
||||
|
||||
gnome-shell-extensions (44.0-2) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* Upload to unstable (part of transition: #1043144)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Sun, 20 Aug 2023 23:04:08 +0100
|
||||
|
||||
gnome-shell-extensions (44.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* debian/control.in: Bump minimum meson to 0.58.0
|
||||
* debian/control.in: Build-Depend on libglib2.0-bin
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Mon, 27 Mar 2023 08:50:32 -0400
|
||||
|
||||
gnome-shell-extensions (44~rc-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 07 Mar 2023 12:20:00 -0500
|
||||
|
||||
gnome-shell-extensions (44~beta-1) experimental; urgency=medium
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* New upstream release
|
||||
|
||||
[ Debian Janitor ]
|
||||
* Remove constraints unnecessary since buster (oldstable)
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Wed, 15 Feb 2023 11:01:26 -0500
|
||||
|
||||
gnome-shell-extensions (43.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 22 Nov 2022 14:14:48 -0500
|
||||
|
||||
gnome-shell-extensions (43.0-2) unstable; urgency=medium
|
||||
|
||||
* Release to unstable
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 27 Sep 2022 19:13:41 -0400
|
||||
|
||||
gnome-shell-extensions (43.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Mon, 19 Sep 2022 10:57:41 -0400
|
||||
|
||||
gnome-shell-extensions (43~rc-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Tue, 06 Sep 2022 14:39:00 -0400
|
||||
|
||||
gnome-shell-extensions (43~beta-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Sun, 21 Aug 2022 10:59:20 -0400
|
||||
|
||||
gnome-shell-extensions (42.3-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release (LP: #1981606)
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Wed, 13 Jul 2022 17:49:05 +0200
|
||||
|
||||
gnome-shell-extensions (42.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Fri, 03 Jun 2022 09:23:28 -0400
|
||||
|
||||
gnome-shell-extensions (42.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release (LP: #1972365)
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Mon, 09 May 2022 08:09:32 -0400
|
||||
|
||||
gnome-shell-extensions (42.0-2) unstable; urgency=medium
|
||||
|
||||
* Release to unstable
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Mon, 28 Mar 2022 11:18:12 -0400
|
||||
|
||||
gnome-shell-extensions (42.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jeremy.bicha@canonical.com> Mon, 14 Mar 2022 11:30:18 -0400
|
||||
|
||||
gnome-shell-extensions (42~rc-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jeremy.bicha@canonical.com> Tue, 08 Mar 2022 17:54:41 -0500
|
||||
|
||||
gnome-shell-extensions (42~beta-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release:
|
||||
- Use libadwaita for preferences
|
||||
- window-list: Fix on-screen keyboard
|
||||
- native-window-placement: Fix distorted layout in app grid
|
||||
* debian/control: Depend on libadwaita and gtk-4 (instead of gtk-3)
|
||||
* debian/patches: Drop applied upstream
|
||||
|
||||
-- Marco Trevisan (Treviño) <marco@ubuntu.com> Wed, 23 Feb 2022 07:35:20 +0100
|
||||
|
||||
gnome-shell-extensions (41.1-2) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* d/p/meson-Drop-unused-argument-for-i18n.merge_file.patch:
|
||||
Backport patch from upstream to fix FBTFS with Meson 0.61
|
||||
(Closes: #1005534)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Tue, 15 Feb 2022 11:18:30 +0000
|
||||
|
||||
gnome-shell-extensions (41.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Sun, 12 Dec 2021 20:30:17 -0500
|
||||
|
||||
gnome-shell-extensions (41.0-2) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* Upload to unstable
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Sat, 16 Oct 2021 20:06:04 +0100
|
||||
|
||||
gnome-shell-extensions (41.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* debian/control.in: Bump minimum meson to 0.53.0
|
||||
* Bump Standards-Version to 4.6.0
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Sun, 10 Oct 2021 17:04:15 -0400
|
||||
|
||||
gnome-shell-extensions (40.4-3) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* Release to unstable (transition: #992870)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Sat, 11 Sep 2021 21:52:59 +0100
|
||||
|
||||
gnome-shell-extensions (40.4-2) experimental; urgency=medium
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* New upstream release
|
||||
* debian/copyright: Add gnome-classic.css to Files-Excluded
|
||||
* Revert "debian/control: Don't build depend on sassc"
|
||||
* This ensures we compile the CSS file from source.
|
||||
|
||||
[ Marco Trevisan (Treviño) ]
|
||||
* debian/control: Support pre-release versions of gnome-shell
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Sun, 29 Aug 2021 09:16:04 -0400
|
||||
|
||||
gnome-shell-extensions (40.1-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* debian/control:
|
||||
- Update runtime dependencies to match code.
|
||||
Found grepping code via:
|
||||
grep "imports\.gi" --include "*.js" -rh -B2 . \
|
||||
| grep -o "\b[A-Z][A-Za-z]\+\b" | sed "s/,\?\s*$//g" | sort -u
|
||||
- Don't build depend on sassc.
|
||||
Since we compile from tarball, this is not needed anymore given that
|
||||
compiled css are provided already.
|
||||
- Build-depend on dh-sequence-gnome 0.22.
|
||||
It's the first version that supports new GNOME versioning schema.
|
||||
|
||||
-- Marco Trevisan (Treviño) <marco@ubuntu.com> Sun, 30 May 2021 20:05:13 +0200
|
||||
|
||||
gnome-shell-extensions (3.38.2-1) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream release
|
||||
* Standards-Version: 4.5.1 (no changes required)
|
||||
* d/gbp.conf: Use upstream/3.38.x branch.
|
||||
Version 40~alpha was already released upstream.
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Thu, 03 Dec 2020 10:17:58 +0000
|
||||
|
||||
gnome-shell-extensions (3.38.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* Recommend gnome-shell-extension-prefs instead of gnome-tweaks
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Tue, 06 Oct 2020 17:44:30 -0400
|
||||
|
||||
gnome-shell-extensions (3.38.0-2) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* Revert "debian/watch: Watch for unstable releases"
|
||||
* Release to unstable
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Fri, 25 Sep 2020 23:00:58 +0100
|
||||
|
||||
gnome-shell-extensions (3.38.0-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream release
|
||||
- Translation updates
|
||||
* d/upstream/metadata: Add
|
||||
* Update standards version to 4.5.0, no changes needed
|
||||
* Fix gnome-classic regression in 3.37.91-1.
|
||||
gnome-session no longer takes the `--session gnome-classic` argument
|
||||
when running in classic mode.
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Tue, 22 Sep 2020 11:49:24 +0100
|
||||
|
||||
gnome-shell-extensions (3.37.91-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release:
|
||||
- drive-menu: Emphasize eject buttons
|
||||
- user-theme: Add preference dialog
|
||||
- window-list:
|
||||
+ Fix inconsistent state in preference dialog
|
||||
+ auto-move: Modernize preference dialogs
|
||||
- workspace-indicator: Overhaul preference dialog
|
||||
- user-theme: Support session mode styles
|
||||
- Adjust to gnome-shell changes
|
||||
* debian/patches: Refresh
|
||||
* debian/control: B-D on debhelper 13
|
||||
* debian/rules: Don't override dh_missing equal default behavior
|
||||
* debian/control: Remove useless dependency on clutter gir
|
||||
|
||||
-- Marco Trevisan (Treviño) <marco@ubuntu.com> Thu, 27 Aug 2020 17:39:42 +0200
|
||||
|
||||
gnome-shell-extensions (3.36.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sun, 03 May 2020 10:02:18 +0200
|
||||
|
||||
gnome-shell-extensions (3.36.1-1) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream release
|
||||
- Update Ukrainian translation
|
||||
- Update Gnome Shell CSS
|
||||
* Upload to unstable (part of transition: #954422)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Fri, 10 Apr 2020 15:12:29 +0100
|
||||
|
||||
gnome-shell-extensions (3.36.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream translation release
|
||||
|
||||
-- Iain Lane <laney@debian.org> Mon, 16 Mar 2020 12:39:02 +0000
|
||||
|
||||
gnome-shell-extensions (3.35.91-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
- Fixes and adjustments to latest gnome-shell
|
||||
|
||||
-- Marco Trevisan (Treviño) <marco@ubuntu.com> Mon, 24 Feb 2020 18:29:29 +0000
|
||||
|
||||
gnome-shell-extensions (3.34.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* debian/control.in: Bump Standards-Version to 4.4.1 (no further changes)
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Mon, 30 Dec 2019 00:51:13 +0100
|
||||
|
||||
gnome-shell-extensions (3.34.1-2) unstable; urgency=high
|
||||
|
||||
* New upstream release
|
||||
- Fix GNOME Classic session's compatibility with gnome-setting-daemon 3.34
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Tue, 08 Oct 2019 22:49:14 -0400
|
||||
|
||||
gnome-shell-extensions (3.34.0-2) unstable; urgency=medium
|
||||
|
||||
* Team upload.
|
||||
* Upload to unstable.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Mon, 30 Sep 2019 17:27:38 +0200
|
||||
|
||||
gnome-shell-extensions (3.34.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream translation release
|
||||
|
||||
-- Iain Lane <laney@debian.org> Tue, 10 Sep 2019 10:59:31 +0100
|
||||
|
||||
gnome-shell-extensions (3.33.92-1) experimental; urgency=medium
|
||||
|
||||
* New upstream bugfix / translation releases
|
||||
|
||||
-- Iain Lane <laney@debian.org> Thu, 05 Sep 2019 18:22:14 +0100
|
||||
|
||||
gnome-shell-extensions (3.33.90-1) experimental; urgency=medium
|
||||
|
||||
[ Marco Trevisan (Treviño) ]
|
||||
* New upstream release
|
||||
+ window-list: Support showing windows from all workspaces
|
||||
+ Make GNOME Classic more classic:
|
||||
- Disable GNOME 3 overview
|
||||
- Add window picker button to window list
|
||||
- Style improvements and fixes
|
||||
- Support horizontal workspace layout in window list
|
||||
- Add draggable previews to window list workspace switcher
|
||||
- Arrange workspaces horizontally
|
||||
+ workspace-indicator: Support horizontal workspace layout
|
||||
+ workspace-indicator: Add draggable previews
|
||||
+ Fix windowsNavigator extension after ES6 port
|
||||
+ screenshot-window-sizer: Add phone screenshot sizes
|
||||
|
||||
[ Iain Lane ]
|
||||
* rules: Build all extensions via the upstream build system. We don't need
|
||||
to hardcode the list to build, as the build system provides a way to build
|
||||
'all' extensions.
|
||||
* rules: Build with --fail-missing
|
||||
* compat, control, rules: Move to compat 12 and specifying via build-deps
|
||||
|
||||
-- Iain Lane <laney@debian.org> Tue, 13 Aug 2019 11:59:22 +0100
|
||||
|
||||
gnome-shell-extensions (3.32.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Iain Lane <laney@debian.org> Tue, 12 Mar 2019 16:34:14 +0000
|
||||
|
||||
gnome-shell-extensions (3.31.92-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Iain Lane <laney@debian.org> Wed, 06 Mar 2019 15:40:48 +0000
|
||||
|
||||
gnome-shell-extensions (3.31.90-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
+ Misc. bug fixes and cleanups
|
||||
+ Remove obsolete alternate-tab extension
|
||||
+ Adjust to gnome-shell changes
|
||||
* debian/watch: Watch for unstable releases
|
||||
* rules: alternate-tab is dropped; stop trying to enable it
|
||||
|
||||
-- Iain Lane <laney@debian.org> Thu, 21 Feb 2019 10:33:12 +0000
|
||||
|
||||
gnome-shell-extensions (3.30.1-1) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream release
|
||||
* Bump Standards-Version to 4.2.1
|
||||
* d/p/gnome-session-classic-wrapper-script.patch:
|
||||
Re-word to avoid a Lintian warning
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Fri, 02 Nov 2018 09:26:47 +0000
|
||||
|
||||
gnome-shell-extensions (3.30.0-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* Release to unstable
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Wed, 05 Sep 2018 12:34:40 -0400
|
||||
|
||||
gnome-shell-extensions (3.29.91-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream development release
|
||||
* Bump Standards-Version to 4.2.0
|
||||
* Sort dependency lists (wrap-and-sort -a)
|
||||
* d/copyright: Remove unnecessary sentence fragment
|
||||
* d/p/series: Remove commented-out line
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Mon, 20 Aug 2018 20:27:57 +0100
|
||||
|
||||
gnome-shell-extensions (3.29.90-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream development release
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Thu, 02 Aug 2018 10:46:44 +0100
|
||||
|
||||
gnome-shell-extensions (3.29.3+really3.29.3-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* d/watch: Watch for development versions
|
||||
* Re-upload to experimental with a higher version than
|
||||
3.29.3+really3.28.1-1, which reverted the incorrect upload of the
|
||||
previous version to unstable
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Fri, 27 Jul 2018 23:56:10 +0100
|
||||
|
||||
gnome-shell-extensions (3.29.3-1) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
|
||||
[ Arnaud Rebillout ]
|
||||
* New upstream release
|
||||
|
||||
[ Simon McVittie ]
|
||||
* Bump Standards-Version to 4.1.5
|
||||
* Set Rules-Requires-Root to no
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Fri, 27 Jul 2018 09:37:34 +0100
|
||||
|
||||
gnome-shell-extensions (3.28.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* Bump Standards-Version to 4.1.4
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Mon, 14 May 2018 21:51:46 -0400
|
||||
|
||||
gnome-shell-extensions (3.28.0-2) unstable; urgency=medium
|
||||
|
||||
* Fix typo in configure flag that resulted in missing
|
||||
auto-move-windows, native-window-placement, & user-theme extensions
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Mon, 19 Mar 2018 18:20:53 -0400
|
||||
|
||||
gnome-shell-extensions (3.28.0-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Sun, 18 Mar 2018 20:17:17 -0400
|
||||
|
||||
gnome-shell-extensions (3.27.92-2) unstable; urgency=medium
|
||||
|
||||
* Release to unstable
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Sat, 10 Mar 2018 19:37:45 -0500
|
||||
|
||||
gnome-shell-extensions (3.27.92-1) experimental; urgency=medium
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* New upstream release candidate
|
||||
* Drop explicit dependency on mutter's gir. gnome-shell-extensions depends
|
||||
on gnome-shell which depends on the gir. Dropping it will make transitions
|
||||
easier.
|
||||
|
||||
[ Simon McVittie ]
|
||||
* Recommend gnome-tweaks instead of transitional gnome-tweak-tool
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Mon, 05 Mar 2018 21:02:01 -0500
|
||||
|
||||
gnome-shell-extensions (3.27.91-1) experimental; urgency=medium
|
||||
|
||||
* New upstream development release
|
||||
* Build with meson
|
||||
* Build-Depend on sassc
|
||||
* Bump debhelper compat to 11
|
||||
* Drop places-menu-Don-t-force-dispose-of-uninitialized-proxies.patch &
|
||||
dont-require-nautilus-classic.patch: Applied in new release
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Fri, 23 Feb 2018 19:49:59 -0500
|
||||
|
||||
gnome-shell-extensions (3.26.2-3) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* Update Vcs fields for migration to https://salsa.debian.org/
|
||||
|
||||
[ Simon McVittie ]
|
||||
* d/patches: Re-export with gbp pq export
|
||||
* d/p/places-menu-Don-t-force-dispose-of-uninitialized-proxies.patch:
|
||||
Take patch from upstream to avoid frequent tracebacks from the Places
|
||||
menu with gjs >= 1.50.2-3 (Closes: #888608)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Tue, 30 Jan 2018 09:15:54 +0000
|
||||
|
||||
gnome-shell-extensions (3.26.2-2) unstable; urgency=medium
|
||||
|
||||
* Update Vcs fields for conversion to git
|
||||
* Add debian/gbp.conf
|
||||
* Bump Standards-Version to 4.1.2
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Fri, 15 Dec 2017 15:19:14 -0500
|
||||
|
||||
gnome-shell-extensions (3.26.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Sun, 05 Nov 2017 20:17:03 +0100
|
||||
|
||||
gnome-shell-extensions (3.26.1-2) unstable; urgency=medium
|
||||
|
||||
* Release to unstable
|
||||
* Bump Standards-Version to 4.1.1
|
||||
|
||||
-- Jeremy Bicha <jbicha@debian.org> Fri, 13 Oct 2017 16:49:30 -0400
|
||||
|
||||
gnome-shell-extensions (3.26.1-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream stable release
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Fri, 06 Oct 2017 11:01:11 +0100
|
||||
|
||||
gnome-shell-extensions (3.26.0-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream stable release
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Wed, 13 Sep 2017 11:33:19 +0100
|
||||
|
||||
gnome-shell-extensions (3.25.91-1) experimental; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream release, for GNOME Shell 3.25.91
|
||||
- d/p/adapt-to-gsd324.patch: Drop, applied upstream
|
||||
- Switch dependency to gir1.2-mutter-1
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Tue, 05 Sep 2017 16:43:01 +0100
|
||||
|
||||
gnome-shell-extensions (3.22.2-2) unstable; urgency=medium
|
||||
|
||||
* Add adapt-to-gsd324.patch (Closes: #869948):
|
||||
- Adjust gnome-session file for gnome-settings-daemon 3.24
|
||||
* debian/control.in:
|
||||
- Bump Standards-Version to 4.0.0
|
||||
- Explicitly depend on gnome-settings-daemon >= 3.24
|
||||
- Drop version from gnome-tweak-tool recommends
|
||||
- Depend on gnome-session-bin instead of gnome-session (LP: #1702832)
|
||||
|
||||
-- Jeremy Bicha <jbicha@ubuntu.com> Sun, 06 Aug 2017 17:38:06 -0400
|
||||
|
||||
gnome-shell-extensions (3.22.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Thu, 10 Nov 2016 19:36:44 +0100
|
||||
|
||||
gnome-shell-extensions (3.22.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Tue, 11 Oct 2016 17:58:31 +0200
|
||||
|
||||
gnome-shell-extensions (3.22.0-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Tue, 20 Sep 2016 01:59:50 +0200
|
||||
|
||||
gnome-shell-extensions (3.21.92-1) unstable; urgency=medium
|
||||
|
||||
* New upstream development release.
|
||||
* Replace Build-Depends gnome-common with pkg-config and gettext.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Tue, 13 Sep 2016 22:13:19 +0200
|
||||
|
||||
gnome-shell-extensions (3.21.91-1) unstable; urgency=medium
|
||||
|
||||
* New upstream beta release.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Tue, 30 Aug 2016 19:57:32 +0200
|
||||
|
||||
gnome-shell-extensions (3.21.90-1) experimental; urgency=medium
|
||||
|
||||
[ Andreas Henriksson ]
|
||||
* New upstream beta release.
|
||||
* Update build-dependencies according to configure.ac changes:
|
||||
- drop intltool, now gettext is used instead.
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* Convert from cdbs to dh
|
||||
* Add debian/docs to install NEWS and README
|
||||
* Bump dh compat to 10
|
||||
* Update Vcs fields
|
||||
* Refresh patches
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Sun, 21 Aug 2016 05:36:17 +0200
|
||||
|
||||
gnome-shell-extensions (3.21.4-1) experimental; urgency=medium
|
||||
|
||||
* New upstream development release.
|
||||
* Stop hard-coding Victor Seva in the Uploaders field
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Fri, 12 Aug 2016 16:28:33 +0200
|
||||
|
||||
gnome-shell-extensions (3.20.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Bump Standards-Version to 3.9.8.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Wed, 11 May 2016 15:21:35 +0200
|
||||
|
||||
gnome-shell-extensions (3.20.0-2) unstable; urgency=medium
|
||||
|
||||
* Upload to unstable.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Sun, 17 Apr 2016 00:25:25 +0200
|
||||
|
||||
gnome-shell-extensions (3.20.0-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Fri, 25 Mar 2016 10:48:00 +0100
|
||||
|
||||
gnome-shell-extensions (3.19.92-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Update dont-require-nautilus-classic.patch to apply.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Thu, 17 Mar 2016 12:51:13 +0100
|
||||
|
||||
gnome-shell-extensions (3.18.4-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Bump Standards-Version to 3.9.7.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Sun, 06 Mar 2016 22:38:57 +0100
|
||||
|
||||
gnome-shell-extensions (3.18.3-2) unstable; urgency=medium
|
||||
|
||||
* Add Breaks/Replaces gnome-shell-common (<< 3.18) (Closes: #808906)
|
||||
- Helps upgrades from Jessie by allowing overwriting
|
||||
/usr/share/gnome-shell/theme/calendar-today.svg et.al.
|
||||
which was previously shipped in gnome-shell-common.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Wed, 10 Feb 2016 01:24:42 +0100
|
||||
|
||||
gnome-shell-extensions (3.18.3-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Thu, 14 Jan 2016 22:49:16 +0100
|
||||
|
||||
gnome-shell-extensions (3.18.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Fri, 13 Nov 2015 00:04:09 +0100
|
||||
|
||||
gnome-shell-extensions (3.18.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Fri, 16 Oct 2015 22:09:01 +0200
|
||||
|
||||
gnome-shell-extensions (3.18.0-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sun, 11 Oct 2015 16:29:18 +0200
|
||||
|
||||
gnome-shell-extensions (3.17.92-1) experimental; urgency=medium
|
||||
|
||||
* New upstream release candidate.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Fri, 18 Sep 2015 17:28:06 +0200
|
||||
|
||||
gnome-shell-extensions (3.16.2-1) unstable; urgency=medium
|
||||
|
||||
[ Emilio Pozuelo Monfort ]
|
||||
* debian/gnome-shell-extensions.gsettings-override:
|
||||
+ Dropped, no longer needed as the enabled extension no longer exists.
|
||||
Thanks Artur Rona for noticing. (Closes: #782747)
|
||||
|
||||
[ Michael Biebl ]
|
||||
* New upstream release.
|
||||
* Update Homepage.
|
||||
* Bump debhelper compatibility level to 9.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Thu, 02 Jul 2015 19:13:32 +0200
|
||||
|
||||
gnome-shell-extensions (3.16.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/control.in,
|
||||
debian/rules:
|
||||
+ The system monitor extension was removed. Drop the libgtop
|
||||
build and runtime dependencies and stop enabling it.
|
||||
* debian/patches/apps-center-labels.patch,
|
||||
debian/patches/window-list-pointerInNotification.patch,
|
||||
debian/patches/menu-arrows-icons.patch:
|
||||
+ Dropped, merged upstream.
|
||||
* debian/patches/dont-require-nautilus-classic.patch:
|
||||
+ Updated for the new version.
|
||||
|
||||
-- Emilio Pozuelo Monfort <pochu@debian.org> Sun, 14 Jun 2015 15:23:59 +0200
|
||||
|
||||
gnome-shell-extensions (3.14.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream bugfix release.
|
||||
* menu-arrows-icons: new patch. Make arrows consistent with the rest
|
||||
of the shell.
|
||||
* apps-center-labels.patch: patch from upstream git. Center labels
|
||||
vertically in the applications menu.
|
||||
* window-list-pointerInNotification.patch: patch from upstream git.
|
||||
Update window-list extension for an older shell API change.
|
||||
|
||||
-- Josselin Mouette <joss@debian.org> Sun, 30 Nov 2014 16:06:59 +0100
|
||||
|
||||
gnome-shell-extensions (3.14.1-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* debian/control.in: Bump Standards-Version to 3.9.6 (no further changes)
|
||||
* Add missing dependencies against gir packages, including gir1.2-gmenu-3.0,
|
||||
this should fix the apps-menu extension for some people (Closes: #765460).
|
||||
|
||||
-- Laurent Bigonville <bigon@debian.org> Sun, 19 Oct 2014 21:17:58 +0200
|
||||
|
||||
gnome-shell-extensions (3.14.0-2) unstable; urgency=medium
|
||||
|
||||
* Drop xrandr from EXTENSIONS_DISABLED, this extension was removed
|
||||
upstream.
|
||||
* Add new screenshot-window-sizer extension to EXTENSIONS_ENABLED.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Wed, 24 Sep 2014 01:15:32 +0200
|
||||
|
||||
gnome-shell-extensions (3.14.0-1) unstable; urgency=medium
|
||||
|
||||
* debian/watch: only scan for stable releases.
|
||||
* New upstream release.
|
||||
* Upload to unstable.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Tue, 23 Sep 2014 15:46:30 +0200
|
||||
|
||||
gnome-shell-extensions (3.13.91-1) experimental; urgency=medium
|
||||
|
||||
* New upstream development release.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Sat, 06 Sep 2014 11:16:39 -0700
|
||||
|
||||
gnome-shell-extensions (3.12.2-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Bump Standards-Version to 3.9.5
|
||||
* Upload to unstable.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Tue, 15 Jul 2014 00:06:09 +0200
|
||||
|
||||
gnome-shell-extensions (3.12.0-1) experimental; urgency=low
|
||||
|
||||
[ Jean Schurger ]
|
||||
* New upstream release (3.10.1)
|
||||
* debian/rules: remove one of the 'windowsNavigator' extension listed twice
|
||||
and the 'alternative-system-menu' extension (does not exists anymore)
|
||||
* debian/copyright: Update 'Format:' line
|
||||
|
||||
[ Andreas Henriksson ]
|
||||
* New upstream release (3.12.0)
|
||||
* debian/local/gnome-session-classic,
|
||||
debian/patches/gnome-session-classic-wrapper-script.patch:
|
||||
- update script to include new GNOME_SHELL_SESSION_MODE env variable
|
||||
and update patch to apply again.
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Fri, 04 Apr 2014 21:43:18 +0200
|
||||
|
||||
gnome-shell-extensions (3.8.4-2) unstable; urgency=low
|
||||
|
||||
* Upload to unstable.
|
||||
|
||||
-- Emilio Pozuelo Monfort <pochu@debian.org> Sun, 13 Oct 2013 18:11:33 +0200
|
||||
|
||||
gnome-shell-extensions (3.8.4-1) experimental; urgency=low
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* New upstream release
|
||||
* Dropped patches applied in new version:
|
||||
- fix-hibernate.patch
|
||||
- fix-applications-menu-resolution-change.patch
|
||||
- look-in-data-home-for-themes.patch
|
||||
|
||||
[ Michael Biebl ]
|
||||
* Add a wrapper script to start the GNOME Classic session as currently
|
||||
Xsession doesn't allow to run gnome-session with custom arguments due to
|
||||
#653327.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Fri, 11 Oct 2013 18:55:23 +0200
|
||||
|
||||
gnome-shell-extensions (3.8.3.1-1) experimental; urgency=low
|
||||
|
||||
[ Jeremy Bicha ]
|
||||
* New upstream release
|
||||
- default-min-max and static-workspaces extensions have been dropped.
|
||||
Use Classic Mode or tweak org.gnome.shell.overrides in dconf-editor
|
||||
* debian/control.in:
|
||||
- Depend on gnome-session 3.8, required for the new Classic mode.
|
||||
- Update homepage
|
||||
* debian/patches/dont-require-nautilus-classic.patch:
|
||||
- Don't require nautilus-classic since it forces desktop icons
|
||||
* debian/patches/fix-applications-menu-resolution-change.patch:
|
||||
- Backport commit to not break applications menu when screen resolution
|
||||
changes
|
||||
* debian/patches/fix-hibernate.patch:
|
||||
- Backport patch to fix checking whether hibernate is allowed
|
||||
* debian/patches/look-in-data-home-for-themes.patch:
|
||||
- Backport commit to also look in XDG_DATA_HOME (usually ~/.local/share/)
|
||||
for user themes
|
||||
* debian/rules:
|
||||
- Run autoreconf
|
||||
|
||||
-- Andreas Henriksson <andreas@fatal.se> Fri, 16 Aug 2013 20:25:30 +0200
|
||||
|
||||
gnome-shell-extensions (3.8.2-1) experimental; urgency=low
|
||||
|
||||
* Team upload
|
||||
|
||||
[ Victor Seva ]
|
||||
* Recommends gnome-tweak-tool
|
||||
|
||||
[ Jean Schurger ]
|
||||
* New upstream release 3.7.92 (LP: #1017979, #1059152).
|
||||
* Enabled new extensions.
|
||||
* Dropped 'dock' and 'gajim'.
|
||||
* Use ./configure instead of autoreconf.
|
||||
* Bumped Standards-Version to 3.9.4.
|
||||
* Updated Vcs-Svn.
|
||||
* debian/control.in
|
||||
- Added runtime dependency to 'gvfs' (>= 1.16.0).
|
||||
The 'Places' extension rely on a 'gvfs' linked to 'udisks2'.
|
||||
|
||||
[ Simon McVittie ]
|
||||
* New upstream release 3.8.2.
|
||||
* Install the "classic mode"
|
||||
* Enable windowNavigator extension (this means we have everything except
|
||||
example and xrandr, the same as in the Ubuntu gnome3-team's PPA)
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Thu, 23 May 2013 09:07:23 +0100
|
||||
|
||||
gnome-shell-extensions (3.4.0-2) unstable; urgency=low
|
||||
|
||||
* Upload to unstable.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Wed, 30 May 2012 13:22:54 +0200
|
||||
|
||||
gnome-shell-extensions (3.4.0-1) experimental; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
* Remove 01_status-menu_disable_accounts.patch: The alternative-status-menu
|
||||
extension no longer recreates the complete user menu but reuses the one
|
||||
from gnome-shell, so we can't easily get rid of the "Online Accounts" menu
|
||||
entry. We will patch gnome-shell directly instead.
|
||||
* Remove 02-Revert-all-remove-all-GSettings-usage.patch and
|
||||
03-Revert-Remove-all-references-to-localedir-from-metad.patch, no longer
|
||||
required.
|
||||
* Bump Standards-Version to 3.9.3
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Mon, 21 May 2012 00:24:56 +0200
|
||||
|
||||
gnome-shell-extensions (3.2.3-1) unstable; urgency=low
|
||||
|
||||
[ Josselin Mouette ]
|
||||
* gnome-shell-extensions.gsettings-override: enable the alternative
|
||||
status menu by default. Closes: #648112.
|
||||
* Use ${gnome:Version} to generate strict dependencies, it’s very
|
||||
unlikely that extensions remain compatible after a major upgrade.
|
||||
|
||||
[ Michael Biebl ]
|
||||
* Upload to unstable.
|
||||
|
||||
[ Josselin Mouette ]
|
||||
* 01_status-menu_disable_accounts.patch: new patch. Drop the unusable
|
||||
advertisement for Google. It is already available in the control
|
||||
center anyway.
|
||||
|
||||
[ Michael Biebl ]
|
||||
* New upstream release.
|
||||
* Drop patches which have been merged upstream:
|
||||
- debian/patches/upstream/*
|
||||
- debian/patches/fix-*
|
||||
* Refresh 01_status-menu_disable_accounts.patch.
|
||||
* Add 02-Revert-all-remove-all-GSettings-usage.patch: Use GSettings since we
|
||||
install the extensions system-wide.
|
||||
* Use dh-autoreconf to generate the build system.
|
||||
* Add 03-Revert-Remove-all-references-to-localedir-from-metad.patch: Use
|
||||
locales from system-wide location.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Sat, 11 Feb 2012 23:28:53 +0100
|
||||
|
||||
gnome-shell-extensions (3.2.0-1) experimental; urgency=low
|
||||
|
||||
[ Victor Seva ]
|
||||
* Initial release (Closes: #627515)
|
||||
Package based on the work by Bilal Akhtar <bilalakhtar@ubuntu.com>
|
||||
* debian/copyright
|
||||
- Added myself
|
||||
- Fixed syntax-error-in-dep5-copyright syntax error
|
||||
* debian/control.in
|
||||
- Added myself as maintainer.
|
||||
- Fix gnome-shell dependency.
|
||||
- Fix gir1.2-gtop-2.0 dependency for systemMonitor ext.
|
||||
* debian/rules
|
||||
- Added uploaders.mk gnome-version.mk includes.
|
||||
- Removed unused variables.
|
||||
* debian/watch added.
|
||||
* No more gnome-shell-extension-* packages.
|
||||
* debian/patches/upstream
|
||||
- patch_967aee7aad2accfb38d91ab56b6c5e91d86a2722.diff
|
||||
popup menu fix
|
||||
- patch_66242aa76a5d59fb4659551575c1fbb42e50b8fb.diff
|
||||
dock fix.
|
||||
- patch_4c5a36e4c0cbe38f2e26b6b3c8b02e88b4b939f7.diff
|
||||
patch_2bba98d6214cffae2eb5cecb9d7c1f6b6d244052.diff
|
||||
systemMonitor: Properly enable/disable
|
||||
* debian/patches
|
||||
- fix_dock_gnome-shell_version.diff
|
||||
- fix_alternate-tab_661281.diff
|
||||
- fix_alternate-tab_gnome-shell_version.diff
|
||||
* debian/rules
|
||||
- EXTENSIONS_ENABLED, EXTENSIONS_DISABLED variables
|
||||
- disabled xrandr-indicator
|
||||
|
||||
[ Michael Biebl ]
|
||||
* debian/watch: Track .xz tarballs.
|
||||
* debian/control.in:
|
||||
- Set pkg-gnome-maintainers@lists.alioth.debian.org as Maintainer and add
|
||||
Victor Seva <linuxmaniac@torreviejawireless.org> to Uploaders.
|
||||
- Wrap (Build-)Depends.
|
||||
- Add Vcs-Svn and Vcs-Browser field.
|
||||
* debian/rules:
|
||||
- Include gnome-get-source.mk.
|
||||
|
||||
-- Michael Biebl <biebl@debian.org> Sat, 12 Nov 2011 18:32:22 +0100
|
||||
46
debian/control
vendored
Normal file
46
debian/control
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
Source: gnome-shell-extensions
|
||||
Section: gnome
|
||||
Priority: optional
|
||||
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
|
||||
Uploaders: Iain Lane <laney@debian.org>, Jeremy Bícha <jbicha@ubuntu.com>, Laurent Bigonville <bigon@debian.org>, Marco Trevisan (Treviño) <marco@ubuntu.com>
|
||||
Build-Depends: debhelper-compat (= 13),
|
||||
dh-sequence-gnome,
|
||||
libglib2.0-bin,
|
||||
meson (>= 0.58.0),
|
||||
sassc
|
||||
Rules-Requires-Root: no
|
||||
Standards-Version: 4.6.2
|
||||
Vcs-Browser: https://salsa.debian.org/gnome-team/gnome-shell-extensions
|
||||
Vcs-Git: https://salsa.debian.org/gnome-team/gnome-shell-extensions.git
|
||||
Homepage: https://wiki.gnome.org/Projects/GnomeShell/Extensions
|
||||
|
||||
Package: gnome-shell-extensions
|
||||
Architecture: all
|
||||
Depends: gir1.2-adw-1,
|
||||
gir1.2-atk-1.0,
|
||||
gir1.2-glib-2.0,
|
||||
gir1.2-gmenu-3.0,
|
||||
gir1.2-graphene-1.0 (>= 1.10.2),
|
||||
gir1.2-gtk-4.0,
|
||||
gir1.2-pango-1.0,
|
||||
gnome-session-bin (>= 3.8),
|
||||
gnome-settings-daemon (>= 3.24),
|
||||
gnome-shell (<< ${gnome:NextVersion}),
|
||||
gnome-shell (>= ${gnome:Version}),
|
||||
gvfs (>= 1.16.0),
|
||||
${misc:Depends}
|
||||
Recommends: gnome-shell-extension-prefs
|
||||
Replaces: gnome-shell-common (<< 3.18)
|
||||
Breaks: gnome-shell-common (<< 3.18)
|
||||
Description: Extensions to extend functionality of GNOME Shell
|
||||
The GNOME Shell redefines user interactions with the GNOME desktop. In
|
||||
particular, it offers new paradigms for launching applications,
|
||||
accessing documents, and organizing open windows in GNOME. Later, it
|
||||
will introduce a new applets eco-system and offer new solutions for
|
||||
other desktop features, such as notifications and contacts management.
|
||||
The GNOME Shell is intended to replace functions handled by the GNOME
|
||||
Panel and by the window manager in previous versions of GNOME. The GNOME
|
||||
Shell has rich visual effects enabled by new graphical technologies.
|
||||
.
|
||||
GNOME Shell is extensible using extensions. This package contains
|
||||
official GNOME Shell extensions.
|
||||
30
debian/copyright
vendored
Normal file
30
debian/copyright
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: gnome-shell-extensions
|
||||
Upstream-Contact: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
Source: https://download.gnome.org/sources/gnome-shell-extensions/
|
||||
Files-Excluded: data/gnome-classic.css
|
||||
Comment: Build that generated file from source
|
||||
|
||||
Files: *
|
||||
Copyright: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
License: GPL-2+
|
||||
|
||||
Files: debian/*
|
||||
Copyright:
|
||||
2011 Victor Seva <linuxmaniac@torreviejawireless.org>
|
||||
2011 Bilal Akhtar <bilalakhtar@ubuntu.com>
|
||||
License: GPL-2+
|
||||
|
||||
License: GPL-2+
|
||||
This package is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This package is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General
|
||||
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
|
||||
2
debian/docs
vendored
Normal file
2
debian/docs
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
NEWS
|
||||
README.md
|
||||
17
debian/gbp.conf
vendored
Normal file
17
debian/gbp.conf
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
[DEFAULT]
|
||||
pristine-tar = True
|
||||
debian-branch = debian/latest
|
||||
upstream-branch = upstream/latest
|
||||
|
||||
[buildpackage]
|
||||
sign-tags = True
|
||||
|
||||
[dch]
|
||||
multimaint-merge = True
|
||||
|
||||
[import-orig]
|
||||
postimport = dch -v%(version)s New upstream release; git add debian/changelog; debcommit
|
||||
upstream-vcs-tag = %(version%~%.)s
|
||||
|
||||
[pq]
|
||||
patch-numbers = False
|
||||
1
debian/install
vendored
Normal file
1
debian/install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
debian/local/gnome-session-classic usr/bin
|
||||
2
debian/local/gnome-session-classic
vendored
Executable file
2
debian/local/gnome-session-classic
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
#! /bin/sh
|
||||
env GNOME_SHELL_SESSION_MODE=classic gnome-session "$@"
|
||||
30
debian/patches/gnome-session-classic-wrapper-script.patch
vendored
Normal file
30
debian/patches/gnome-session-classic-wrapper-script.patch
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
From: Michael Biebl <biebl@debian.org>
|
||||
Date: Tue, 30 Jan 2018 09:04:03 +0000
|
||||
Subject: Use a wrapper script to start GNOME classic session
|
||||
|
||||
Xsession currently doesn't allow passing more then one argument, as it
|
||||
otherwise fails with
|
||||
Xsession: unable to launch "gnome-session --session classic" X session ---
|
||||
"gnome-session --session classic" not found; falling back to default session.
|
||||
|
||||
This is due to [1]. Add a wrapper script to start the GNOME classic session
|
||||
as a workaround. Once [1] is fixed, this should be removed again.
|
||||
|
||||
[1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=653327.
|
||||
---
|
||||
data/gnome-classic.desktop.in | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/data/gnome-classic.desktop.in b/data/gnome-classic.desktop.in
|
||||
index 13da2b5..d627655 100644
|
||||
--- a/data/gnome-classic.desktop.in
|
||||
+++ b/data/gnome-classic.desktop.in
|
||||
@@ -1,7 +1,7 @@
|
||||
[Desktop Entry]
|
||||
Name=GNOME Classic
|
||||
Comment=This session logs you into GNOME Classic
|
||||
-Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
|
||||
+Exec=gnome-session-classic
|
||||
TryExec=gnome-session
|
||||
Type=Application
|
||||
DesktopNames=GNOME-Classic;GNOME;
|
||||
1
debian/patches/series
vendored
Normal file
1
debian/patches/series
vendored
Normal file
@@ -0,0 +1 @@
|
||||
gnome-session-classic-wrapper-script.patch
|
||||
11
debian/rules
vendored
Executable file
11
debian/rules
vendored
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
%:
|
||||
dh $@
|
||||
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- \
|
||||
-Dextension_set=all \
|
||||
-Dclassic_mode=true
|
||||
|
||||
override_dh_gnome_clean:
|
||||
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
@@ -0,0 +1 @@
|
||||
3.0 (quilt)
|
||||
5
debian/upstream/metadata
vendored
Normal file
5
debian/upstream/metadata
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
Bug-Database: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues
|
||||
Bug-Submit: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/-/issues/new
|
||||
Repository: https://gitlab.gnome.org/GNOME/gnome-shell-extensions.git
|
||||
Repository-Browse: https://gitlab.gnome.org/GNOME/gnome-shell-extensions
|
||||
4
debian/watch
vendored
Normal file
4
debian/watch
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
version=4
|
||||
opts="searchmode=plain, uversionmangle=s/\.(alpha|beta|rc)/~$1/, downloadurlmangle=s|cache.json||" \
|
||||
https://download.gnome.org/sources/@PACKAGE@/cache.json \
|
||||
[\d.]+/@PACKAGE@-([\d.]+\.?(?:beta|rc)?[\d.]*)@ARCHIVE_EXT@
|
||||
@@ -1 +0,0 @@
|
||||
tools/eslint.config.js
|
||||
@@ -8,16 +8,16 @@ srcdir=`dirname $0`
|
||||
srcdir=`(cd $srcdir && pwd)`
|
||||
|
||||
builddir=`mktemp -p $srcdir -d _build.XXXXXX` || exit 1
|
||||
destdir=`mktemp -p $srcdir -d _dest.XXXXXX` || exit 1
|
||||
installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1
|
||||
|
||||
meson setup --prefix=/usr -Dextension_set=all $srcdir $builddir
|
||||
meson install --destdir $destdir -C $builddir
|
||||
meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir
|
||||
meson install -C $builddir
|
||||
|
||||
rm -rf $srcdir/zip-files
|
||||
mkdir $srcdir/zip-files
|
||||
|
||||
extensiondir=$destdir/usr/share/gnome-shell/extensions
|
||||
schemadir=$destdir/usr/share/glib-2.0/schemas
|
||||
extensiondir=$installdir/share/gnome-shell/extensions
|
||||
schemadir=$installdir/share/glib-2.0/schemas
|
||||
|
||||
for f in $extensiondir/*; do
|
||||
name=`basename ${f%%@*}`
|
||||
@@ -39,9 +39,7 @@ for f in $extensiondir/*; do
|
||||
fi
|
||||
|
||||
cp $srcdir/NEWS $srcdir/COPYING $f
|
||||
sources=(NEWS COPYING $(cd $f; ls *.js *.css 2>/dev/null))
|
||||
|
||||
[ -d $f/icons ] && sources+=(icons)
|
||||
sources=(NEWS COPYING $(cd $f; ls *.js))
|
||||
|
||||
[ -f $schema ] || unset schema
|
||||
|
||||
@@ -50,4 +48,4 @@ for f in $extensiondir/*; do
|
||||
done
|
||||
|
||||
rm -rf $builddir
|
||||
rm -rf $destdir
|
||||
rm -rf $installdir
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
import Atk from 'gi://Atk';
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Gio from 'gi://Gio';
|
||||
@@ -44,9 +45,8 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
this._app = app;
|
||||
this._button = button;
|
||||
|
||||
this._icon = this.getDragActor();
|
||||
this._icon.style_class = 'icon-dropshadow';
|
||||
this.add_child(this._icon);
|
||||
this._iconBin = new St.Bin();
|
||||
this.add_child(this._iconBin);
|
||||
|
||||
let appLabel = new St.Label({
|
||||
text: app.get_name(),
|
||||
@@ -56,6 +56,11 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
this.add_child(appLabel);
|
||||
this.label_actor = appLabel;
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
textureCache.connectObject('icon-theme-changed',
|
||||
() => this._updateIcon(), this);
|
||||
this._updateIcon();
|
||||
|
||||
this._delegate = this;
|
||||
let draggable = DND.makeDraggable(this);
|
||||
|
||||
@@ -65,8 +70,6 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
return maybeStartDrag.call(draggable, event);
|
||||
return false;
|
||||
};
|
||||
|
||||
this.connect('notify::active', this._onActiveChanged.bind(this));
|
||||
}
|
||||
|
||||
activate(event) {
|
||||
@@ -78,11 +81,10 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
Main.overview.hide();
|
||||
}
|
||||
|
||||
_onActiveChanged() {
|
||||
if (!this.active)
|
||||
return;
|
||||
|
||||
this._button.scrollToButton(this);
|
||||
setActive(active, params) {
|
||||
if (active)
|
||||
this._button.scrollToButton(this);
|
||||
super.setActive(active, params);
|
||||
}
|
||||
|
||||
setDragEnabled(enabled) {
|
||||
@@ -94,7 +96,13 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
}
|
||||
|
||||
getDragActorSource() {
|
||||
return this._icon;
|
||||
return this._iconBin;
|
||||
}
|
||||
|
||||
_updateIcon() {
|
||||
let icon = this.getDragActor();
|
||||
icon.style_class = 'icon-dropshadow';
|
||||
this._iconBin.set_child(icon);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,10 +125,7 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
else
|
||||
name = _('Favorites');
|
||||
|
||||
const label = new St.Label({text: name});
|
||||
this.add_child(label);
|
||||
this.actor.label_actor = label;
|
||||
|
||||
this.add_child(new St.Label({text: name}));
|
||||
this.connect('motion-event', this._onMotionEvent.bind(this));
|
||||
this.connect('notify::active', this._onActiveChanged.bind(this));
|
||||
}
|
||||
@@ -250,7 +255,7 @@ class DesktopTarget extends EventEmitter {
|
||||
this._desktopDestroyedId = 0;
|
||||
|
||||
this._windowAddedId =
|
||||
global.window_group.connect('child-added',
|
||||
global.window_group.connect('actor-added',
|
||||
this._onWindowAdded.bind(this));
|
||||
|
||||
global.get_window_actors().forEach(a => {
|
||||
@@ -389,12 +394,12 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
this.accessible_role = Atk.Role.LABEL;
|
||||
|
||||
this._label = new St.Label({
|
||||
text: _('Apps'),
|
||||
text: _('Applications'),
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
|
||||
this.add_child(this._label);
|
||||
this.add_actor(this._label);
|
||||
this.name = 'panelApplications';
|
||||
this.label_actor = this._label;
|
||||
|
||||
@@ -488,7 +493,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
let id;
|
||||
try {
|
||||
id = entry.get_desktop_file_id(); // catch non-UTF8 filenames
|
||||
} catch {
|
||||
} catch (e) {
|
||||
continue;
|
||||
}
|
||||
let app = appSys.lookup_app(id);
|
||||
@@ -507,7 +512,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
}
|
||||
|
||||
scrollToButton(button) {
|
||||
let appsScrollBoxAdj = this.applicationsScrollBox.get_vadjustment();
|
||||
let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment();
|
||||
let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box();
|
||||
let currentScrollValue = appsScrollBoxAdj.get_value();
|
||||
let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1;
|
||||
@@ -522,7 +527,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
}
|
||||
|
||||
scrollToCatButton(button) {
|
||||
let catsScrollBoxAdj = this.categoriesScrollBox.get_vadjustment();
|
||||
let catsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment();
|
||||
let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box();
|
||||
let currentScrollValue = catsScrollBoxAdj.get_value();
|
||||
let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1;
|
||||
@@ -540,30 +545,36 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
let section = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(section);
|
||||
this.mainBox = new St.BoxLayout({layoutManager: new MainLayout()});
|
||||
this.leftBox = new St.BoxLayout({
|
||||
orientation: Clutter.Orientation.VERTICAL,
|
||||
});
|
||||
this.leftBox = new St.BoxLayout({vertical: true});
|
||||
this.applicationsScrollBox = new St.ScrollView({
|
||||
style_class: 'apps-menu vfade',
|
||||
x_expand: true,
|
||||
});
|
||||
this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
let vscroll = this.applicationsScrollBox.get_vscroll_bar();
|
||||
vscroll.connect('scroll-start', () => {
|
||||
this.menu.passEvents = true;
|
||||
});
|
||||
vscroll.connect('scroll-stop', () => {
|
||||
this.menu.passEvents = false;
|
||||
});
|
||||
this.categoriesScrollBox = new St.ScrollView({
|
||||
style_class: 'vfade',
|
||||
});
|
||||
this.categoriesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
vscroll = this.categoriesScrollBox.get_vscroll_bar();
|
||||
vscroll.connect('scroll-start', () => (this.menu.passEvents = true));
|
||||
vscroll.connect('scroll-stop', () => (this.menu.passEvents = false));
|
||||
this.leftBox.add_child(this.categoriesScrollBox);
|
||||
|
||||
this.applicationsBox = new St.BoxLayout({
|
||||
orientation: Clutter.Orientation.VERTICAL,
|
||||
});
|
||||
this.applicationsScrollBox.set_child(this.applicationsBox);
|
||||
this.categoriesBox = new St.BoxLayout({
|
||||
orientation: Clutter.Orientation.VERTICAL,
|
||||
});
|
||||
this.categoriesScrollBox.set_child(this.categoriesBox);
|
||||
this.applicationsBox = new St.BoxLayout({vertical: true});
|
||||
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
||||
this.categoriesBox = new St.BoxLayout({vertical: true});
|
||||
this.categoriesScrollBox.add_actor(this.categoriesBox);
|
||||
|
||||
this.mainBox.add_child(this.leftBox);
|
||||
this.mainBox.add(this.leftBox);
|
||||
this.mainBox.add_child(this.applicationsScrollBox);
|
||||
section.actor.add_child(this.mainBox);
|
||||
section.actor.add_actor(this.mainBox);
|
||||
}
|
||||
|
||||
_display() {
|
||||
@@ -575,7 +586,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
this._tree.load_sync();
|
||||
let root = this._tree.get_root_directory();
|
||||
let categoryMenuItem = new CategoryMenuItem(this, null);
|
||||
this.categoriesBox.add_child(categoryMenuItem);
|
||||
this.categoriesBox.add_actor(categoryMenuItem);
|
||||
let iter = root.iter();
|
||||
let nextType;
|
||||
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
||||
@@ -591,7 +602,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
this._loadCategory(categoryId, dir);
|
||||
if (this.applicationsByCategory[categoryId].length > 0) {
|
||||
categoryMenuItem = new CategoryMenuItem(this, dir);
|
||||
this.categoriesBox.add_child(categoryMenuItem);
|
||||
this.categoriesBox.add_actor(categoryMenuItem);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,7 +615,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
if (c._delegate instanceof PopupMenu.PopupSeparatorMenuItem)
|
||||
c._delegate.destroy();
|
||||
else
|
||||
this.applicationsBox.remove_child(c);
|
||||
this.applicationsBox.remove_actor(c);
|
||||
});
|
||||
|
||||
if (dir)
|
||||
@@ -627,7 +638,7 @@ class ApplicationsButton extends PanelMenu.Button {
|
||||
this._applicationsButtons.set(app, item);
|
||||
}
|
||||
if (!item.get_parent())
|
||||
this.applicationsBox.add_child(item);
|
||||
this.applicationsBox.add_actor(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Apps Menu",
|
||||
"description": "Add a category-based menu for apps.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.",
|
||||
"name": "Applications Menu",
|
||||
"description": "Add a category-based menu for applications.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.",
|
||||
"original-authors": [ "e2002@bk.ru", "debarshir@gnome.org" ],
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
// Start apps on custom workspaces
|
||||
|
||||
import Shell from 'gi://Shell';
|
||||
|
||||
import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
// Start apps on custom workspaces
|
||||
|
||||
import Adw from 'gi://Adw';
|
||||
import Gio from 'gi://Gio';
|
||||
import GLib from 'gi://GLib';
|
||||
@@ -42,11 +45,11 @@ class NewItemModel extends GObject.Object {
|
||||
class Rule extends GObject.Object {
|
||||
static [GObject.properties] = {
|
||||
'app-info': GObject.ParamSpec.object(
|
||||
'app-info', null, null,
|
||||
'app-info', 'app-info', 'app-info',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
Gio.DesktopAppInfo),
|
||||
'workspace': GObject.ParamSpec.uint(
|
||||
'workspace', null, null,
|
||||
'workspace', 'workspace', 'workspace',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
1, WORKSPACE_MAX, 1),
|
||||
};
|
||||
@@ -193,7 +196,7 @@ class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
|
||||
class WorkspaceSelector extends Gtk.Widget {
|
||||
static [GObject.properties] = {
|
||||
'number': GObject.ParamSpec.uint(
|
||||
'number', null, null,
|
||||
'number', 'number', 'number',
|
||||
GObject.ParamFlags.READWRITE,
|
||||
1, WORKSPACE_MAX, 1),
|
||||
};
|
||||
|
||||
@@ -48,7 +48,7 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
style_class: 'button',
|
||||
});
|
||||
ejectButton.connect('clicked', this._eject.bind(this));
|
||||
this.add_child(ejectButton);
|
||||
this.add(ejectButton);
|
||||
|
||||
this.hide();
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Launch New Instance",
|
||||
"name": "Launch new instance",
|
||||
"description": "Always launch a new instance when clicking in the dash or the application view.\nThis extension is part of Classic Mode and is officially supported by GNOME. Please do not report bugs using the form below, use GNOME's GitLab instance instead.",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
|
||||
@@ -16,20 +16,18 @@ foreach e : enabled_extensions
|
||||
metadata_conf.set('gschemaname', 'org.gnome.shell.extensions.' + e)
|
||||
metadata_conf.set('gettext_domain', gettext_domain)
|
||||
metadata_conf.set('shell_current', shell_version)
|
||||
metadata_conf.set(
|
||||
'url',
|
||||
'https://gitlab.gnome.org/GNOME/gnome-shell-extensions',
|
||||
)
|
||||
metadata_conf.set('url', 'https://gitlab.gnome.org/GNOME/gnome-shell-extensions')
|
||||
|
||||
extension_sources = files(e + '/extension.js')
|
||||
extension_data = []
|
||||
|
||||
subdir(e)
|
||||
|
||||
install_data(
|
||||
extension_sources + extension_data,
|
||||
install_dir: join_paths(extensiondir, uuid),
|
||||
install_data (extension_sources + extension_data,
|
||||
install_dir: join_paths(extensiondir, uuid)
|
||||
)
|
||||
endforeach
|
||||
|
||||
install_data(extension_schemas, install_dir: schemadir)
|
||||
install_data (extension_schemas,
|
||||
install_dir: schemadir
|
||||
)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
import Clutter from 'gi://Clutter';
|
||||
|
||||
import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
import Clutter from 'gi://Clutter';
|
||||
import GObject from 'gi://GObject';
|
||||
import St from 'gi://St';
|
||||
@@ -19,17 +20,32 @@ import {PlacesManager} from './placeDisplay.js';
|
||||
|
||||
const N_ = x => x;
|
||||
|
||||
class PlaceMenuItem extends PopupMenu.PopupImageMenuItem {
|
||||
const PLACE_ICON_SIZE = 16;
|
||||
|
||||
class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(info) {
|
||||
super(info.name, info.icon, {
|
||||
super({
|
||||
style_class: 'place-menu-item',
|
||||
});
|
||||
this._info = info;
|
||||
|
||||
this._icon = new St.Icon({
|
||||
gicon: info.icon,
|
||||
icon_size: PLACE_ICON_SIZE,
|
||||
});
|
||||
this.add_child(this._icon);
|
||||
|
||||
this._label = new St.Label({
|
||||
text: info.name,
|
||||
x_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
this.add_child(this._label);
|
||||
|
||||
if (info.isRemovable()) {
|
||||
this._ejectIcon = new St.Icon({
|
||||
icon_name: 'media-eject-symbolic',
|
||||
@@ -54,8 +70,8 @@ class PlaceMenuItem extends PopupMenu.PopupImageMenuItem {
|
||||
}
|
||||
|
||||
_propertiesChanged(info) {
|
||||
this.setIcon(info.icon);
|
||||
this.label.text = info.name;
|
||||
this._icon.gicon = info.icon;
|
||||
this._label.text = info.name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +95,7 @@ class PlacesMenu extends PanelMenu.Button {
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
this.add_child(label);
|
||||
this.add_actor(label);
|
||||
|
||||
this.placesManager = new PlacesManager();
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
import Gio from 'gi://Gio';
|
||||
import GLib from 'gi://GLib';
|
||||
import Shell from 'gi://Shell';
|
||||
@@ -23,6 +24,13 @@ Gio._promisify(Gio.File.prototype, 'mount_enclosing_volume');
|
||||
|
||||
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
||||
|
||||
const Hostname1Iface = '<node> \
|
||||
<interface name="org.freedesktop.hostname1"> \
|
||||
<property name="PrettyHostname" type="s" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
|
||||
|
||||
class PlaceInfo extends EventEmitter {
|
||||
constructor(...params) {
|
||||
super();
|
||||
@@ -53,15 +61,15 @@ class PlaceInfo extends EventEmitter {
|
||||
return;
|
||||
}
|
||||
|
||||
const source = {
|
||||
get_drive: () => null,
|
||||
let source = {
|
||||
get_icon: () => this.icon,
|
||||
};
|
||||
let op = new ShellMountOperation.ShellMountOperation(source);
|
||||
try {
|
||||
await this.file.mount_enclosing_volume(0, op.mountOp, null);
|
||||
|
||||
if (tryMount)
|
||||
this._ensureMountAndLaunch(context, false).catch(logError);
|
||||
this._ensureMountAndLaunch(context, false);
|
||||
} catch (e) {
|
||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.FAILED_HANDLED))
|
||||
Main.notifyError(_('Failed to mount volume for “%s”').format(this.name), e.message);
|
||||
@@ -73,7 +81,7 @@ class PlaceInfo extends EventEmitter {
|
||||
|
||||
launch(timestamp) {
|
||||
let launchContext = global.create_app_launch_context(timestamp, -1);
|
||||
this._ensureMountAndLaunch(launchContext, true).catch(logError);
|
||||
this._ensureMountAndLaunch(launchContext, true);
|
||||
}
|
||||
|
||||
getIcon() {
|
||||
@@ -122,20 +130,44 @@ class PlaceInfo extends EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
class NautilusSpecialInfo extends PlaceInfo {
|
||||
constructor(file, name, icon) {
|
||||
super('special', file, name, icon);
|
||||
class RootInfo extends PlaceInfo {
|
||||
_init() {
|
||||
super._init('devices', Gio.File.new_for_path('/'), _('Computer'));
|
||||
|
||||
const appSystem = Shell.AppSystem.get_default();
|
||||
this._app = appSystem.lookup_app('org.gnome.Nautilus.desktop');
|
||||
let busName = 'org.freedesktop.hostname1';
|
||||
let objPath = '/org/freedesktop/hostname1';
|
||||
new Hostname1(Gio.DBus.system, busName, objPath, (obj, error) => {
|
||||
if (error)
|
||||
return;
|
||||
|
||||
this._proxy = obj;
|
||||
this._proxy.connectObject('g-properties-changed',
|
||||
this._propertiesChanged.bind(this), this);
|
||||
this._propertiesChanged(obj);
|
||||
});
|
||||
}
|
||||
|
||||
launch(timestamp) {
|
||||
const launchContext = global.create_app_launch_context(timestamp, -1);
|
||||
this._app.appInfo.launch([this.file], launchContext);
|
||||
getIcon() {
|
||||
return new Gio.ThemedIcon({name: 'drive-harddisk-symbolic'});
|
||||
}
|
||||
|
||||
_propertiesChanged(proxy) {
|
||||
// GDBusProxy will emit a g-properties-changed when hostname1 goes down
|
||||
// ignore it
|
||||
if (proxy.g_name_owner) {
|
||||
this.name = proxy.PrettyHostname || _('Computer');
|
||||
this.emit('changed');
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._proxy?.disconnectObject(this);
|
||||
this._proxy = null;
|
||||
super.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class PlaceDeviceInfo extends PlaceInfo {
|
||||
_init(kind, mount) {
|
||||
this._mount = mount;
|
||||
@@ -214,6 +246,14 @@ class PlaceVolumeInfo extends PlaceInfo {
|
||||
}
|
||||
}
|
||||
|
||||
const DEFAULT_DIRECTORIES = [
|
||||
GLib.UserDirectory.DIRECTORY_DOCUMENTS,
|
||||
GLib.UserDirectory.DIRECTORY_PICTURES,
|
||||
GLib.UserDirectory.DIRECTORY_MUSIC,
|
||||
GLib.UserDirectory.DIRECTORY_DOWNLOAD,
|
||||
GLib.UserDirectory.DIRECTORY_VIDEOS,
|
||||
];
|
||||
|
||||
export class PlacesManager extends EventEmitter {
|
||||
constructor() {
|
||||
super();
|
||||
@@ -228,12 +268,6 @@ export class PlacesManager extends EventEmitter {
|
||||
this._settings = new Gio.Settings({schema_id: BACKGROUND_SCHEMA});
|
||||
this._settings.connectObject('changed::show-desktop-icons',
|
||||
() => this._updateSpecials(), this);
|
||||
|
||||
this._privacySettings = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.privacy',
|
||||
});
|
||||
this._privacySettings.connectObject('changed::remember-recent-files',
|
||||
() => this._updateSpecials(), this);
|
||||
this._updateSpecials();
|
||||
|
||||
/*
|
||||
@@ -279,9 +313,6 @@ export class PlacesManager extends EventEmitter {
|
||||
this._settings?.disconnectObject(this);
|
||||
this._settings = null;
|
||||
|
||||
this._privacySettings.disconnectObject(this);
|
||||
this._privacySettings = null;
|
||||
|
||||
this._volumeMonitor.disconnectObject(this);
|
||||
|
||||
if (this._monitor)
|
||||
@@ -290,68 +321,42 @@ export class PlacesManager extends EventEmitter {
|
||||
GLib.source_remove(this._bookmarkTimeoutId);
|
||||
}
|
||||
|
||||
_shouldShowRecent() {
|
||||
const vfs = Gio.Vfs.get_default();
|
||||
const schemes = vfs.get_supported_uri_schemes();
|
||||
return this._privacySettings.get_boolean('remember-recent-files') &&
|
||||
schemes.includes('recent');
|
||||
}
|
||||
|
||||
_updateSpecials() {
|
||||
this._places.special.forEach(p => p.destroy());
|
||||
this._places.special = [];
|
||||
|
||||
const appSystem = Shell.AppSystem.get_default();
|
||||
const nautilusApp = appSystem.lookup_app('org.gnome.Nautilus.desktop');
|
||||
const defaultFm = Gio.AppInfo.get_default_for_type('inode/directory', true);
|
||||
const showNautilusSpecials =
|
||||
nautilusApp && defaultFm && nautilusApp.appInfo.equal(defaultFm);
|
||||
|
||||
const homeFile = Gio.File.new_for_path(GLib.get_home_dir());
|
||||
let homePath = GLib.get_home_dir();
|
||||
|
||||
this._places.special.push(new PlaceInfo(
|
||||
'special',
|
||||
homeFile,
|
||||
Gio.File.new_for_path(homePath),
|
||||
_('Home')));
|
||||
|
||||
if (this._shouldShowRecent()) {
|
||||
this._places.special.push(new PlaceInfo(
|
||||
'special',
|
||||
Gio.File.new_for_uri('recent:///'),
|
||||
_('Recent')));
|
||||
}
|
||||
let specials = [];
|
||||
let dirs = DEFAULT_DIRECTORIES.slice();
|
||||
|
||||
if (showNautilusSpecials) {
|
||||
this._places.special.push(new NautilusSpecialInfo(
|
||||
Gio.File.new_for_uri('starred:///'),
|
||||
_('Starred'),
|
||||
'starred-symbolic'));
|
||||
}
|
||||
if (this._settings.get_boolean('show-desktop-icons'))
|
||||
dirs.push(GLib.UserDirectory.DIRECTORY_DESKTOP);
|
||||
|
||||
if (this._settings.get_boolean('show-desktop-icons')) {
|
||||
const desktopPath = GLib.get_user_special_dir(
|
||||
GLib.UserDirectory.DIRECTORY_DESKTOP);
|
||||
const desktopFile = desktopPath
|
||||
? Gio.File.new_for_path(desktopPath)
|
||||
: null;
|
||||
for (let i = 0; i < dirs.length; i++) {
|
||||
let specialPath = GLib.get_user_special_dir(dirs[i]);
|
||||
if (!specialPath || specialPath === homePath)
|
||||
continue;
|
||||
|
||||
if (desktopFile && !desktopFile.equal(homeFile)) {
|
||||
this._places.special.push(
|
||||
new PlaceInfo('special', desktopFile));
|
||||
let file = Gio.File.new_for_path(specialPath), info;
|
||||
try {
|
||||
info = new PlaceInfo('special', file);
|
||||
} catch (e) {
|
||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
|
||||
continue;
|
||||
throw e;
|
||||
}
|
||||
|
||||
specials.push(info);
|
||||
}
|
||||
|
||||
if (showNautilusSpecials) {
|
||||
this._places.special.push(new NautilusSpecialInfo(
|
||||
Gio.File.new_for_uri('x-network-view:///'),
|
||||
_('Network'),
|
||||
'network-workgroup-symbolic'));
|
||||
}
|
||||
|
||||
this._places.special.push(new PlaceInfo(
|
||||
'special',
|
||||
Gio.File.new_for_uri('trash:///'),
|
||||
_('Trash')));
|
||||
specials.sort((a, b) => GLib.utf8_collate(a.name, b.name));
|
||||
this._places.special = this._places.special.concat(specials);
|
||||
|
||||
this.emit('special-updated');
|
||||
}
|
||||
@@ -365,6 +370,14 @@ export class PlacesManager extends EventEmitter {
|
||||
this._places.network.forEach(p => p.destroy());
|
||||
this._places.network = [];
|
||||
|
||||
/* Add standard places */
|
||||
this._places.devices.push(new RootInfo());
|
||||
this._places.network.push(new PlaceInfo(
|
||||
'network',
|
||||
Gio.File.new_for_uri('network:///'),
|
||||
_('Browse Network'),
|
||||
'network-workgroup-symbolic'));
|
||||
|
||||
/* first go through all connected drives */
|
||||
let drives = this._volumeMonitor.get_connected_drives();
|
||||
for (let i = 0; i < drives.length; i++) {
|
||||
@@ -496,12 +509,30 @@ export class PlacesManager extends EventEmitter {
|
||||
}
|
||||
|
||||
_addMount(kind, mount) {
|
||||
const devItem = new PlaceDeviceInfo(kind, mount);
|
||||
let devItem;
|
||||
|
||||
try {
|
||||
devItem = new PlaceDeviceInfo(kind, mount);
|
||||
} catch (e) {
|
||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
|
||||
return;
|
||||
throw e;
|
||||
}
|
||||
|
||||
this._places[kind].push(devItem);
|
||||
}
|
||||
|
||||
_addVolume(kind, volume) {
|
||||
const volItem = new PlaceVolumeInfo(kind, volume);
|
||||
let volItem;
|
||||
|
||||
try {
|
||||
volItem = new PlaceVolumeInfo(kind, volume);
|
||||
} catch (e) {
|
||||
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
|
||||
return;
|
||||
throw e;
|
||||
}
|
||||
|
||||
this._places[kind].push(volItem);
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ export default class ScreenshotWindowSizerExtension extends Extension {
|
||||
[624, 351],
|
||||
[800, 450],
|
||||
[1024, 576],
|
||||
[1000, 700],
|
||||
[1200, 675],
|
||||
[1600, 900],
|
||||
[360, 654], // Phone portrait maximized
|
||||
@@ -34,7 +33,7 @@ export default class ScreenshotWindowSizerExtension extends Extension {
|
||||
_flashMessage(message) {
|
||||
if (!this._text) {
|
||||
this._text = new St.Label({style_class: 'screenshot-sizer-message'});
|
||||
Main.uiGroup.add_child(this._text);
|
||||
Main.uiGroup.add_actor(this._text);
|
||||
}
|
||||
|
||||
this._text.remove_all_transitions();
|
||||
@@ -63,15 +62,14 @@ export default class ScreenshotWindowSizerExtension extends Extension {
|
||||
/**
|
||||
* @param {Meta.Display} display - the display
|
||||
* @param {Meta.Window=} window - for per-window bindings, the window
|
||||
* @param {Clutter.Event} event - the triggering event
|
||||
* @param {Meta.KeyBinding} binding - the key binding
|
||||
*/
|
||||
_cycleScreenshotSizes(display, window, event, binding) {
|
||||
_cycleScreenshotSizes(display, window, binding) {
|
||||
const backwards = binding.is_reversed();
|
||||
|
||||
// Unmaximize first
|
||||
if (window.is_maximized())
|
||||
window.unmaximize();
|
||||
if (window.get_maximized() !== 0)
|
||||
window.unmaximize(Meta.MaximizeFlags.BOTH);
|
||||
|
||||
let workArea = window.get_work_area_current_monitor();
|
||||
let outerRect = window.get_frame_rect();
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Screenshot Window Sizer",
|
||||
"description": "Resize windows for GNOME Software screenshots with Ctrl+Alt+s shortcut",
|
||||
"description": "Resize windows for GNOME Software screenshots",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -1,91 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2018 Adel Gadllah <adel.gadllah@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2018 Florian Müllner <fmuellner@gnome.org>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Shell from 'gi://Shell';
|
||||
import St from 'gi://St';
|
||||
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
import {Button as PanelButton} from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||
|
||||
const PANEL_ICON_SIZE = 16;
|
||||
|
||||
const STANDARD_TRAY_ICON_IMPLEMENTATIONS = [
|
||||
'bluetooth-applet',
|
||||
'gnome-sound-applet',
|
||||
'nm-applet',
|
||||
'gnome-power-manager',
|
||||
'keyboard',
|
||||
'a11y-keyboard',
|
||||
'kbd-scrolllock',
|
||||
'kbd-numlock',
|
||||
'kbd-capslock',
|
||||
'ibus-ui-gtk',
|
||||
];
|
||||
|
||||
export default class SysTray {
|
||||
constructor() {
|
||||
this._icons = new Map();
|
||||
this._tray = null;
|
||||
}
|
||||
|
||||
_onTrayIconAdded(o, icon) {
|
||||
let wmClass = icon.wm_class ? icon.wm_class.toLowerCase() : '';
|
||||
if (STANDARD_TRAY_ICON_IMPLEMENTATIONS.includes(wmClass))
|
||||
return;
|
||||
|
||||
let button = new PanelButton(0.5, null, true);
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
let iconSize = PANEL_ICON_SIZE * scaleFactor;
|
||||
|
||||
icon.set({
|
||||
width: iconSize,
|
||||
height: iconSize,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
|
||||
let iconBin = new St.Widget({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
style_class: 'system-status-icon',
|
||||
});
|
||||
iconBin.add_child(icon);
|
||||
button.add_child(iconBin);
|
||||
|
||||
this._icons.set(icon, button);
|
||||
|
||||
button.connect('button-release-event',
|
||||
(actor, event) => icon.click(event));
|
||||
button.connect('key-press-event',
|
||||
(actor, event) => icon.click(event));
|
||||
|
||||
const role = `${icon}`;
|
||||
Main.panel.addToStatusArea(role, button);
|
||||
}
|
||||
|
||||
_onTrayIconRemoved(o, icon) {
|
||||
const button = this._icons.get(icon);
|
||||
button?.destroy();
|
||||
this._icons.delete(icon);
|
||||
}
|
||||
|
||||
enable() {
|
||||
this._tray = new Shell.TrayManager();
|
||||
this._tray.connect('tray-icon-added',
|
||||
this._onTrayIconAdded.bind(this));
|
||||
this._tray.connect('tray-icon-removed',
|
||||
this._onTrayIconRemoved.bind(this));
|
||||
this._tray.manage_screen(Main.panel);
|
||||
}
|
||||
|
||||
disable() {
|
||||
this._icons.forEach(button => button.destroy());
|
||||
this._icons.clear();
|
||||
|
||||
this._tray.unmanage_screen();
|
||||
this._tray = null;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2018 Florian Müllner <fmuellner@gnome.org>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
extension_data += configure_file(
|
||||
input: metadata_name + '.in',
|
||||
output: metadata_name,
|
||||
configuration: metadata_conf
|
||||
)
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "Status Icons",
|
||||
"description": "Show status icons in the top bar",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
@@ -1,489 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Gio from 'gi://Gio';
|
||||
import GLib from 'gi://GLib';
|
||||
import GObject from 'gi://GObject';
|
||||
import GTop from 'gi://GTop';
|
||||
import Pango from 'gi://Pango';
|
||||
import Shell from 'gi://Shell';
|
||||
import St from 'gi://St';
|
||||
|
||||
import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
|
||||
const THRESHOLD_HIGH = 0.80;
|
||||
|
||||
// adapted from load-graph.cpp in gnome-system-monitor
|
||||
/**
|
||||
* @param {string} str
|
||||
* @returns {number}
|
||||
*/
|
||||
function strHash(str) {
|
||||
let hash = 0xcbf29ce484222325n;
|
||||
|
||||
for (const c of str)
|
||||
hash = (hash * 0x00000100000001B3n) ^ BigInt(c.codePointAt(0));
|
||||
return hash;
|
||||
}
|
||||
|
||||
class StatSection extends St.BoxLayout {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(iconName, accessibleName) {
|
||||
super({
|
||||
style_class: 'system-monitor-stat-section',
|
||||
accessibleName,
|
||||
});
|
||||
|
||||
const ext = Extension.lookupByURL(import.meta.url);
|
||||
const file =
|
||||
ext.dir.resolve_relative_path(`icons/${iconName}.svg`);
|
||||
|
||||
this._icon = new St.Icon({
|
||||
style_class: 'system-monitor-stat-section-icon',
|
||||
gicon: new Gio.FileIcon({file}),
|
||||
});
|
||||
this.add_child(this._icon);
|
||||
|
||||
this.label = new St.Label({
|
||||
style_class: 'system-monitor-stat-section-label',
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
this.label.clutter_text.set({
|
||||
ellipsize: Pango.EllipsizeMode.NONE,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
this.add_child(this.label);
|
||||
|
||||
this.connect('destroy', () => this._clearTimeout());
|
||||
this.connect('notify::visible', () => this._sync());
|
||||
this._sync();
|
||||
}
|
||||
|
||||
_ensureTimeout() {
|
||||
if (this._updateId)
|
||||
return;
|
||||
|
||||
this._updateId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1,
|
||||
() => {
|
||||
this._update();
|
||||
return GLib.SOURCE_CONTINUE;
|
||||
});
|
||||
}
|
||||
|
||||
_clearTimeout() {
|
||||
if (this._updateId)
|
||||
GLib.source_remove(this._updateId);
|
||||
delete this._updateId;
|
||||
}
|
||||
|
||||
_sync() {
|
||||
if (this.visible)
|
||||
this._ensureTimeout();
|
||||
else
|
||||
this._clearTimeout();
|
||||
|
||||
if (this.visible)
|
||||
this._update();
|
||||
}
|
||||
|
||||
_update() {
|
||||
}
|
||||
}
|
||||
|
||||
class LoadStatSection extends StatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
#formatter = new Intl.NumberFormat(undefined, {
|
||||
style: 'percent',
|
||||
});
|
||||
|
||||
_getLoadValue() {
|
||||
}
|
||||
|
||||
_update() {
|
||||
const load = this._getLoadValue();
|
||||
this.label.text = this.#formatter.format(load);
|
||||
|
||||
if (load >= THRESHOLD_HIGH)
|
||||
this.add_style_class_name('high-usage');
|
||||
else
|
||||
this.remove_style_class_name('high-usage');
|
||||
}
|
||||
}
|
||||
|
||||
class CpuSection extends LoadStatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
#prevCpu = new GTop.glibtop_cpu();
|
||||
|
||||
constructor() {
|
||||
super('processor-symbolic', _('CPU stats'));
|
||||
}
|
||||
|
||||
_getLoadValue() {
|
||||
const cpu = new GTop.glibtop_cpu();
|
||||
GTop.glibtop_get_cpu(cpu);
|
||||
|
||||
const total = cpu.total - this.#prevCpu.total;
|
||||
const user = cpu.user - this.#prevCpu.user;
|
||||
const sys = cpu.sys - this.#prevCpu.sys;
|
||||
const nice = cpu.nice - this.#prevCpu.nice;
|
||||
|
||||
this.#prevCpu = cpu;
|
||||
|
||||
return (user + sys + nice) / Math.max(total, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
class MemSection extends LoadStatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super('memory-symbolic', _('Memory stats'));
|
||||
}
|
||||
|
||||
_getLoadValue() {
|
||||
const mem = new GTop.glibtop_mem();
|
||||
GTop.glibtop_get_mem(mem);
|
||||
|
||||
const {user, total} = mem;
|
||||
return user / Math.max(total, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
class SwapSection extends LoadStatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super('swap-symbolic', _('Swap stats'));
|
||||
}
|
||||
|
||||
_getLoadValue() {
|
||||
const swap = new GTop.glibtop_swap();
|
||||
GTop.glibtop_get_swap(swap);
|
||||
|
||||
const {used, total} = swap;
|
||||
return used / Math.max(total, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
class NetStatSection extends StatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
#formats = [{
|
||||
factor: 1000,
|
||||
unitFactor: 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'kilobyte',
|
||||
maximumFractionDigits: 1,
|
||||
minimumFractionDigits: 1,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 10,
|
||||
unitFactor: 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'kilobyte',
|
||||
maximumFractionDigits: 0,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000,
|
||||
unitFactor: 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'megabyte',
|
||||
maximumFractionDigits: 1,
|
||||
minimumFractionDigits: 1,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000 * 10,
|
||||
unitFactor: 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'megabyte',
|
||||
maximumFractionDigits: 0,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000 * 1000,
|
||||
unitFactor: 1000 * 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'gigabyte',
|
||||
maximumFractionDigits: 1,
|
||||
minimumFractionDigits: 1,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000 * 1000 * 10,
|
||||
unitFactor: 1000 * 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'gigabyte',
|
||||
maximumFractionDigits: 0,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000 * 1000 * 1000,
|
||||
unitFactor: 1000 * 1000 * 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'terabyte',
|
||||
maximumFractionDigits: 1,
|
||||
minimumFractionDigits: 1,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000 * 1000 * 1000 * 10,
|
||||
unitFactor: 1000 * 1000 * 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'terabyte',
|
||||
maximumFractionDigits: 0,
|
||||
}),
|
||||
}, {
|
||||
factor: 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
unitFactor: 1000 * 1000 * 1000 * 1000 * 1000,
|
||||
formatter: new Intl.NumberFormat(undefined, {
|
||||
style: 'unit',
|
||||
unit: 'petabyte',
|
||||
maximumFractionDigits: 1,
|
||||
minimumFractionDigits: 1,
|
||||
}),
|
||||
}];
|
||||
|
||||
#lastBytes = 0;
|
||||
#lastHash = 0;
|
||||
#lastTime = 0;
|
||||
|
||||
_getBytes(_netload) {
|
||||
}
|
||||
|
||||
_getFormat(bytes) {
|
||||
for (let i = 1; i < this.#formats.length; i++) {
|
||||
if (bytes < this.#formats.at(i).factor)
|
||||
return this.#formats.at(i - 1);
|
||||
}
|
||||
return this.#formats.at(-1);
|
||||
}
|
||||
|
||||
_update() {
|
||||
const FLAG_LOOPBACK = 1 << 4; // GTop sucks
|
||||
|
||||
const netlist = new GTop.glibtop_netlist();
|
||||
const ifnames = GTop.glibtop_get_netlist(netlist);
|
||||
|
||||
let bytes = 0;
|
||||
let hash = 1n;
|
||||
|
||||
for (const ifname of ifnames) {
|
||||
const netload = new GTop.glibtop_netload();
|
||||
GTop.glibtop_get_netload(netload, ifname);
|
||||
|
||||
if (netload.if_flags & FLAG_LOOPBACK)
|
||||
continue;
|
||||
|
||||
bytes += this._getBytes(netload);
|
||||
hash += strHash(ifname);
|
||||
}
|
||||
|
||||
const time = GLib.get_monotonic_time();
|
||||
|
||||
let dbytes = 0;
|
||||
|
||||
// Skip calculation if new data is less than old (interface
|
||||
// removed, counters reset, ...) or if it is the first time
|
||||
if (bytes >= this.#lastBytes &&
|
||||
hash === this.#lastHash &&
|
||||
this.#lastTime !== 0) {
|
||||
const dtime = (time - this.#lastTime) / GLib.USEC_PER_SEC;
|
||||
dbytes = (bytes - this.#lastBytes) / dtime;
|
||||
}
|
||||
|
||||
this.#lastBytes = bytes;
|
||||
this.#lastTime = time;
|
||||
this.#lastHash = hash;
|
||||
|
||||
const {unitFactor, formatter} = this._getFormat(dbytes);
|
||||
this.label.text = formatter.format(dbytes / unitFactor);
|
||||
}
|
||||
}
|
||||
|
||||
class UploadSection extends NetStatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super('upload-symbolic', _('Upload stats'));
|
||||
}
|
||||
|
||||
_getBytes(netload) {
|
||||
return netload.bytes_out;
|
||||
}
|
||||
}
|
||||
|
||||
class DownloadSection extends NetStatSection {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super('download-symbolic', _('Download stats'));
|
||||
}
|
||||
|
||||
_getBytes(netload) {
|
||||
return netload.bytes_in;
|
||||
}
|
||||
}
|
||||
|
||||
class Indicator extends PanelMenu.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(settings) {
|
||||
super(0.5, _('System stats'));
|
||||
|
||||
this._settings = settings;
|
||||
this.connect('destroy',
|
||||
() => (this._settings = null));
|
||||
|
||||
const box = new St.BoxLayout({
|
||||
styleClass: 'system-monitor-stat-sections',
|
||||
});
|
||||
|
||||
this.add_child(box);
|
||||
|
||||
this._placeholder = new St.Icon({
|
||||
styleClass: 'system-status-icon system-monitor-placeholder',
|
||||
});
|
||||
box.add_child(this._placeholder);
|
||||
|
||||
this._cpuSection = new CpuSection();
|
||||
this._settings.bind('show-cpu',
|
||||
this._cpuSection, 'visible',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
box.add_child(this._cpuSection);
|
||||
|
||||
this._memSection = new MemSection();
|
||||
this._settings.bind('show-memory',
|
||||
this._memSection, 'visible',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
box.add_child(this._memSection);
|
||||
|
||||
this._swapSection = new SwapSection();
|
||||
this._settings.bind('show-swap',
|
||||
this._swapSection, 'visible',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
box.add_child(this._swapSection);
|
||||
|
||||
this._ulSection = new UploadSection();
|
||||
this._settings.bind('show-upload',
|
||||
this._ulSection, 'visible',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
box.add_child(this._ulSection);
|
||||
|
||||
this._dlSection = new DownloadSection();
|
||||
this._settings.bind('show-download',
|
||||
this._dlSection, 'visible',
|
||||
Gio.SettingsBindFlags.GET);
|
||||
box.add_child(this._dlSection);
|
||||
|
||||
this.menu.addMenuItem(
|
||||
new PopupMenu.PopupSeparatorMenuItem(_('Show')));
|
||||
|
||||
this._cpuItem = this.menu.addAction(_('CPU'),
|
||||
() => this._toggleSettings('show-cpu'));
|
||||
this._memItem = this.menu.addAction(_('Memory'),
|
||||
() => this._toggleSettings('show-memory'));
|
||||
this._swapItem = this.menu.addAction(_('Swap'),
|
||||
() => this._toggleSettings('show-swap'));
|
||||
this._ulItem = this.menu.addAction(_('Upload'),
|
||||
() => this._toggleSettings('show-upload'));
|
||||
this._dlItem = this.menu.addAction(_('Download'),
|
||||
() => this._toggleSettings('show-download'));
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._appMenuItem = this.menu.addAction(_('Open System Monitor'),
|
||||
() => this._openSystemMonitor());
|
||||
|
||||
const appSystem = Shell.AppSystem.get_default();
|
||||
appSystem.connectObject('installed-changed',
|
||||
() => this._updateSystemMonitorApp(), this);
|
||||
this._updateSystemMonitorApp();
|
||||
|
||||
this._settings.connectObject('changed',
|
||||
() => this._sync(), this);
|
||||
this._sync();
|
||||
}
|
||||
|
||||
_updateSystemMonitorApp() {
|
||||
const appSystem = Shell.AppSystem.get_default();
|
||||
this._systemMonitorApp =
|
||||
appSystem.lookup_app('org.gnome.SystemMonitor.desktop');
|
||||
this._placeholder.gicon = this._systemMonitorApp?.icon ?? null;
|
||||
this.visible = this._systemMonitorApp != null;
|
||||
}
|
||||
|
||||
_openSystemMonitor() {
|
||||
this._systemMonitorApp.activate();
|
||||
Main.overview.hide();
|
||||
}
|
||||
|
||||
_toggleSettings(key) {
|
||||
this._settings.set_boolean(key, !this._settings.get_boolean(key));
|
||||
}
|
||||
|
||||
_sync() {
|
||||
this._cpuItem.setOrnament(this._settings.get_boolean('show-cpu')
|
||||
? PopupMenu.Ornament.CHECK
|
||||
: PopupMenu.Ornament.NONE);
|
||||
this._memItem.setOrnament(this._settings.get_boolean('show-memory')
|
||||
? PopupMenu.Ornament.CHECK
|
||||
: PopupMenu.Ornament.NONE);
|
||||
this._swapItem.setOrnament(this._settings.get_boolean('show-swap')
|
||||
? PopupMenu.Ornament.CHECK
|
||||
: PopupMenu.Ornament.NONE);
|
||||
this._ulItem.setOrnament(this._settings.get_boolean('show-upload')
|
||||
? PopupMenu.Ornament.CHECK
|
||||
: PopupMenu.Ornament.NONE);
|
||||
this._dlItem.setOrnament(this._settings.get_boolean('show-download')
|
||||
? PopupMenu.Ornament.CHECK
|
||||
: PopupMenu.Ornament.NONE);
|
||||
|
||||
this._placeholder.visible =
|
||||
this._settings.list_keys().every(key => !this._settings.get_boolean(key));
|
||||
}
|
||||
}
|
||||
|
||||
export default class SystemMonitorExtension extends Extension {
|
||||
enable() {
|
||||
this._indicator = new Indicator(this.getSettings());
|
||||
Main.panel.addToStatusArea(this.uuid, this._indicator);
|
||||
}
|
||||
|
||||
disable() {
|
||||
this._indicator.destroy();
|
||||
this._indicator = null;
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<filter id="a" height="100%" width="100%" x="0%" y="0%">
|
||||
<feColorMatrix color-interpolation-filters="sRGB" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<mask id="b">
|
||||
<g filter="url(#a)">
|
||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.5"/>
|
||||
</g>
|
||||
</mask>
|
||||
<clipPath id="c">
|
||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
||||
</clipPath>
|
||||
<mask id="d">
|
||||
<g filter="url(#a)">
|
||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.7"/>
|
||||
</g>
|
||||
</mask>
|
||||
<clipPath id="e">
|
||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
||||
</clipPath>
|
||||
<mask id="f">
|
||||
<g filter="url(#a)">
|
||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.35"/>
|
||||
</g>
|
||||
</mask>
|
||||
<clipPath id="g">
|
||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
||||
</clipPath>
|
||||
<g mask="url(#b)">
|
||||
<g clip-path="url(#c)" transform="matrix(1 0 0 1 -920 -120)">
|
||||
<path d="m 550 182 c -0.351562 0.003906 -0.695312 0.101562 -1 0.28125 v 3.4375 c 0.304688 0.179688 0.648438 0.277344 1 0.28125 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 c -0.339844 0 -0.679688 0.058594 -1 0.175781 v 6.824219 h 4 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
||||
</g>
|
||||
</g>
|
||||
<g mask="url(#d)">
|
||||
<g clip-path="url(#e)" transform="matrix(1 0 0 1 -920 -120)">
|
||||
<path d="m 569 182 v 4 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 v 7 h 3 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
||||
</g>
|
||||
</g>
|
||||
<g mask="url(#f)">
|
||||
<g clip-path="url(#g)" transform="matrix(1 0 0 1 -920 -120)">
|
||||
<path d="m 573 182.269531 v 3.449219 c 0.613281 -0.355469 0.996094 -1.007812 1 -1.71875 c 0 -0.714844 -0.382812 -1.375 -1 -1.730469 z m 0 4.90625 v 6.824219 h 2 v -4 c 0 -1.269531 -0.800781 -2.402344 -2 -2.824219 z m 0 0"/>
|
||||
</g>
|
||||
</g>
|
||||
<path d="m 7.984375 1 c -0.550781 0 -1 0.449219 -1 1 v 8.585938 l -2.292969 -2.292969 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 s -0.519531 0.105469 -0.707031 0.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 l 4 4 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 l 4 -4 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 s -1.023437 -0.390625 -1.414062 0 l -2.292969 2.292969 v -8.585938 c 0 -0.550781 -0.445313 -1 -1 -1 z m 0 0"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: Icon Development Kit
|
||||
|
||||
SPDX-License-Identifier: CC0-1.0
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 3 2 c -1.660156 0 -3 1.339844 -3 3 v 4 c 0 1.660156 1.339844 3 3 3 h 10 c 1.660156 0 3 -1.339844 3 -3 v -4 c 0 -1.660156 -1.339844 -3 -3 -3 z m 0 2 h 10 c 0.554688 0 1 0.445312 1 1 v 4 c 0 0.554688 -0.445312 1 -1 1 h -10 c -0.554688 0 -1 -0.445312 -1 -1 v -4 c 0 -0.554688 0.445312 -1 1 -1 z m 0 0"/><path d="m 2 10 h 12 v 4 h -12 z m 0 0"/><g fill-opacity="0.501961"><path d="m 4 5 h 2 v 4 h -2 z m 0 0"/><path d="m 7 5 h 2 v 4 h -2 z m 0 0"/><path d="m 10 5 h 2 v 4 h -2 z m 0 0"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 631 B |
@@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: Icon Development Kit
|
||||
|
||||
SPDX-License-Identifier: CC0-1.0
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 5 5 h 6 v 6 h -6 z m 0 0"/><path d="m 13 5 h 3 v 1 h -3 z m 0 0"/><path d="m 13 7 h 3 v 1 h -3 z m 0 0"/><path d="m 13 9 h 3 v 1 h -3 z m 0 0"/><path d="m 0 6 h 3 v 1 h -3 z m 0 0"/><path d="m 0 8 h 3 v 1 h -3 z m 0 0"/><path d="m 0 10 h 3 v 1 h -3 z m 0 0"/><path d="m 5 0 h 1 v 3 h -1 z m 0 0"/><path d="m 7 0 h 1 v 3 h -1 z m 0 0"/><path d="m 9 0 h 1 v 3 h -1 z m 0 0"/><path d="m 10 13 h 1 v 3 h -1 z m 0 0"/><path d="m 8 13 h 1 v 3 h -1 z m 0 0"/><path d="m 6 13 h 1 v 3 h -1 z m 0 0"/><path d="m 5 2 c -1.644531 0 -3 1.355469 -3 3 v 6 c 0 1.644531 1.355469 3 3 3 h 6 c 1.644531 0 3 -1.355469 3 -3 v -6 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 6 c 0.570312 0 1 0.429688 1 1 v 6 c 0 0.570312 -0.429688 1 -1 1 h -6 c -0.570312 0 -1 -0.429688 -1 -1 v -6 c 0 -0.570312 0.429688 -1 1 -1 z m 0 0"/></svg>
|
||||
|
Before Width: | Height: | Size: 943 B |
@@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: Icon Development Kit
|
||||
|
||||
SPDX-License-Identifier: CC0-1.0
|
||||
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 5 7 c -0.308594 0 -0.613281 0.089844 -0.8125 0.28125 l -3.59375 3.71875 l 3.65625 3.71875 c 0.199219 0.191406 0.441406 0.28125 0.75 0.28125 h 1 v -1 c 0 -0.257812 -0.128906 -0.527344 -0.3125 -0.71875 l -1.28125 -1.28125 h 4.59375 c 0.527344 0.007812 1 -0.472656 1 -1 s -0.472656 -1.007812 -1 -1 h -4.625 l 1.21875 -1.28125 c 0.183594 -0.191406 0.40625 -0.460938 0.40625 -0.71875 v -1 z m 0 0"/><path d="m 11 9 c 0.308594 0 0.613281 -0.089844 0.8125 -0.28125 l 3.59375 -3.71875 l -3.65625 -3.71875 c -0.199219 -0.191406 -0.441406 -0.28125 -0.75 -0.28125 h -1 v 1 c 0 0.257812 0.128906 0.527344 0.3125 0.71875 l 1.28125 1.28125 h -4.59375 c -0.527344 -0.007812 -1 0.472656 -1 1 s 0.472656 1.007812 1 1 h 4.625 l -1.21875 1.28125 c -0.183594 0.191406 -0.40625 0.460938 -0.40625 0.71875 v 1 z m 0 0"/></svg>
|
||||
|
Before Width: | Height: | Size: 941 B |
@@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: Icon Development Kit
|
||||
|
||||
SPDX-License-Identifier: CC0-1.0
|
||||
@@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<filter id="a" height="100%" width="100%" x="0%" y="0%">
|
||||
<feColorMatrix color-interpolation-filters="sRGB" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
|
||||
</filter>
|
||||
<mask id="b">
|
||||
<g filter="url(#a)">
|
||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.5"/>
|
||||
</g>
|
||||
</mask>
|
||||
<clipPath id="c">
|
||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
||||
</clipPath>
|
||||
<mask id="d">
|
||||
<g filter="url(#a)">
|
||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.7"/>
|
||||
</g>
|
||||
</mask>
|
||||
<clipPath id="e">
|
||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
||||
</clipPath>
|
||||
<mask id="f">
|
||||
<g filter="url(#a)">
|
||||
<path d="m -1.6 -1.6 h 19.2 v 19.2 h -19.2 z" fill-opacity="0.35"/>
|
||||
</g>
|
||||
</mask>
|
||||
<clipPath id="g">
|
||||
<path d="m 0 0 h 1600 v 1200 h -1600 z"/>
|
||||
</clipPath>
|
||||
<g mask="url(#b)">
|
||||
<g clip-path="url(#c)" transform="matrix(1 0 0 1 -900 -120)">
|
||||
<path d="m 550 182 c -0.351562 0.003906 -0.695312 0.101562 -1 0.28125 v 3.4375 c 0.304688 0.179688 0.648438 0.277344 1 0.28125 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 c -0.339844 0 -0.679688 0.058594 -1 0.175781 v 6.824219 h 4 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
||||
</g>
|
||||
</g>
|
||||
<g mask="url(#d)">
|
||||
<g clip-path="url(#e)" transform="matrix(1 0 0 1 -900 -120)">
|
||||
<path d="m 569 182 v 4 c 1.105469 0 2 -0.894531 2 -2 s -0.894531 -2 -2 -2 z m 0 5 v 7 h 3 v -4 c 0 -1.65625 -1.34375 -3 -3 -3 z m 0 0"/>
|
||||
</g>
|
||||
</g>
|
||||
<g mask="url(#f)">
|
||||
<g clip-path="url(#g)" transform="matrix(1 0 0 1 -900 -120)">
|
||||
<path d="m 573 182.269531 v 3.449219 c 0.613281 -0.355469 0.996094 -1.007812 1 -1.71875 c 0 -0.714844 -0.382812 -1.375 -1 -1.730469 z m 0 4.90625 v 6.824219 h 2 v -4 c 0 -1.269531 -0.800781 -2.402344 -2 -2.824219 z m 0 0"/>
|
||||
</g>
|
||||
</g>
|
||||
<path d="m 8.015625 15 c 0.550781 0 1 -0.449219 1 -1 v -8.585938 l 2.292969 2.292969 c 0.1875 0.1875 0.441406 0.292969 0.707031 0.292969 s 0.519531 -0.105469 0.707031 -0.292969 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 l -4 -4 c -0.390625 -0.390625 -1.023437 -0.390625 -1.414062 0 l -4 4 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 s 1.023437 0.390625 1.414062 0 l 2.292969 -2.292969 v 8.585938 c 0 0.550781 0.445313 1 1 1 z m 0 0"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -1,3 +0,0 @@
|
||||
SPDX-FileCopyrightText: Icon Development Kit
|
||||
|
||||
SPDX-License-Identifier: CC0-1.0
|
||||
@@ -1,14 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2017 Florian Müllner <fmuellner@gnome.org>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
extension_data += configure_file(
|
||||
input: metadata_name + '.in',
|
||||
output: metadata_name,
|
||||
configuration: metadata_conf
|
||||
)
|
||||
|
||||
extension_data += files('stylesheet.css')
|
||||
extension_schemas += files('schemas/' + metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||
|
||||
install_subdir('icons', install_dir: join_paths(extensiondir, uuid))
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"extension-id": "@extension_id@",
|
||||
"uuid": "@uuid@",
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"name": "System Monitor",
|
||||
"description": "Monitor system from the top bar",
|
||||
"shell-version": [ "@shell_current@" ],
|
||||
"url": "@url@"
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
-->
|
||||
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<schema id="org.gnome.shell.extensions.system-monitor"
|
||||
path="/org/gnome/shell/extensions/system-monitor/">
|
||||
<key name="show-cpu" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show CPU usage</summary>
|
||||
</key>
|
||||
<key name="show-memory" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show memory usage</summary>
|
||||
</key>
|
||||
<key name="show-swap" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show swap usage</summary>
|
||||
</key>
|
||||
<key name="show-upload" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show upload</summary>
|
||||
</key>
|
||||
<key name="show-download" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show download</summary>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
@@ -1,18 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2023 Florian Müllner <fmuellner@gnome.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
.system-monitor-stat-section {
|
||||
padding: 0 6px;
|
||||
}
|
||||
|
||||
.system-monitor-stat-section-icon {icon-size: 1.08em;}
|
||||
.system-monitor-stat-section-label {
|
||||
min-width: 3.0em;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
.system-monitor-placeholder {-st-icon-style: symbolic;}
|
||||
|
||||
.panel-button .high-usage {color: #ff7800;}
|
||||
@@ -5,6 +5,9 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
// Load shell theme from ~/.local/share/themes/name/gnome-shell
|
||||
|
||||
import Gio from 'gi://Gio';
|
||||
|
||||
import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
|
||||
// we use async/await here to not block the mainloop, not to parallelize
|
||||
/* eslint-disable no-await-in-loop */
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,33 +12,5 @@ extension_data += files(
|
||||
'stylesheet-light.css'
|
||||
)
|
||||
|
||||
transform_stylesheet = [
|
||||
'sed', '-E',
|
||||
'-e', 's:^\.(workspace-indicator):.window-list-\\1:',
|
||||
'-e', '/^@import/d',
|
||||
'@INPUT@',
|
||||
]
|
||||
|
||||
workspaceIndicatorSources = [
|
||||
configure_file(
|
||||
input: '../workspace-indicator/workspaceIndicator.js',
|
||||
output: '@PLAINNAME@',
|
||||
copy: true,
|
||||
),
|
||||
configure_file(
|
||||
input: '../workspace-indicator/stylesheet-dark.css',
|
||||
output: 'stylesheet-workspace-switcher-dark.css',
|
||||
command: transform_stylesheet,
|
||||
capture: true,
|
||||
),
|
||||
configure_file(
|
||||
input: '../workspace-indicator/stylesheet-light.css',
|
||||
output: 'stylesheet-workspace-switcher-light.css',
|
||||
command: transform_stylesheet,
|
||||
capture: true,
|
||||
),
|
||||
files('../workspace-indicator/workspacePrefs.js'),
|
||||
]
|
||||
|
||||
extension_sources += files('prefs.js') + workspaceIndicatorSources
|
||||
extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js')
|
||||
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||
|
||||
@@ -36,9 +36,5 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
||||
only on the primary one.
|
||||
</description>
|
||||
</key>
|
||||
<key name="embed-previews" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show workspace previews in window list</summary>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
import Adw from 'gi://Adw';
|
||||
import Gio from 'gi://Gio';
|
||||
import GLib from 'gi://GLib';
|
||||
@@ -11,18 +12,13 @@ import Gtk from 'gi://Gtk';
|
||||
|
||||
import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
|
||||
|
||||
import {WorkspacesPage} from './workspacePrefs.js';
|
||||
|
||||
class WindowListPage extends Adw.PreferencesPage {
|
||||
class WindowListPrefsWidget extends Adw.PreferencesPage {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(settings) {
|
||||
super({
|
||||
title: _('Window List'),
|
||||
icon_name: 'focus-windows-symbolic',
|
||||
});
|
||||
super();
|
||||
|
||||
this._actionGroup = new Gio.SimpleActionGroup();
|
||||
this.insert_action_group('window-list', this._actionGroup);
|
||||
@@ -34,8 +30,6 @@ class WindowListPage extends Adw.PreferencesPage {
|
||||
this._settings.create_action('show-on-all-monitors'));
|
||||
this._actionGroup.add_action(
|
||||
this._settings.create_action('display-all-workspaces'));
|
||||
this._actionGroup.add_action(
|
||||
this._settings.create_action('embed-previews'));
|
||||
|
||||
const groupingGroup = new Adw.PreferencesGroup({
|
||||
title: _('Window Grouping'),
|
||||
@@ -64,24 +58,34 @@ class WindowListPage extends Adw.PreferencesPage {
|
||||
const miscGroup = new Adw.PreferencesGroup();
|
||||
this.add(miscGroup);
|
||||
|
||||
let row = new Adw.SwitchRow({
|
||||
title: _('Show on all monitors'),
|
||||
let toggle = new Gtk.Switch({
|
||||
action_name: 'window-list.show-on-all-monitors',
|
||||
valign: Gtk.Align.CENTER,
|
||||
});
|
||||
let row = new Adw.ActionRow({
|
||||
title: _('Show on all monitors'),
|
||||
activatable_widget: toggle,
|
||||
});
|
||||
row.add_suffix(toggle);
|
||||
miscGroup.add(row);
|
||||
|
||||
row = new Adw.SwitchRow({
|
||||
title: _('Show windows from all workspaces'),
|
||||
toggle = new Gtk.Switch({
|
||||
action_name: 'window-list.display-all-workspaces',
|
||||
valign: Gtk.Align.CENTER,
|
||||
});
|
||||
this._settings.bind('display-all-workspaces',
|
||||
toggle, 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||
row = new Adw.ActionRow({
|
||||
title: _('Show windows from all workspaces'),
|
||||
activatable_widget: toggle,
|
||||
});
|
||||
row.add_suffix(toggle);
|
||||
miscGroup.add(row);
|
||||
}
|
||||
}
|
||||
|
||||
export default class WindowListPrefs extends ExtensionPreferences {
|
||||
fillPreferencesWindow(window) {
|
||||
const settings = this.getSettings();
|
||||
window.add(new WindowListPage(settings));
|
||||
window.add(new WorkspacesPage(settings));
|
||||
getPreferencesWidget() {
|
||||
return new WindowListPrefsWidget(this.getSettings());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,6 @@
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
@import url("stylesheet-workspace-switcher-dark.css");
|
||||
|
||||
.window-list-workspace-indicator.previews {
|
||||
-natural-hpadding: 0 !important;
|
||||
-minimum-hpadding: 0 !important;
|
||||
}
|
||||
|
||||
.window-list {
|
||||
spacing: 2px;
|
||||
@@ -22,19 +16,10 @@
|
||||
height: 2.45em;
|
||||
}
|
||||
|
||||
.window-button,
|
||||
.window-button-drag-actor {
|
||||
.window-button {
|
||||
padding: 4px, 3px;
|
||||
}
|
||||
|
||||
.window-button-drag-actor {
|
||||
background-color: #444;
|
||||
border-radius: 7px;
|
||||
border-width: 2px;
|
||||
border-color: #fff;
|
||||
box-shadow: 0 1px 2px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.window-button:first-child:ltr {
|
||||
padding-left: 2px;
|
||||
}
|
||||
@@ -47,46 +32,43 @@
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.window-button > StWidget {
|
||||
color: #fff;
|
||||
background-color: transparent;
|
||||
.window-button > StWidget,
|
||||
.window-picker-toggle > StWidget {
|
||||
color: #bbb;
|
||||
background-color: #1d1d1d;
|
||||
border-radius: 4px;
|
||||
padding: 3px 6px 1px;
|
||||
transition: 100ms ease;
|
||||
}
|
||||
|
||||
.window-button > StWidget,
|
||||
.window-list .placeholder {
|
||||
.window-button > StWidget {
|
||||
-st-natural-width: 18.75em;
|
||||
max-width: 18.75em;
|
||||
}
|
||||
|
||||
.window-list .placeholder {
|
||||
border: 1px solid rgba(255,255,255,0.4);
|
||||
border-radius: 7px;
|
||||
margin: 4px;
|
||||
}
|
||||
|
||||
.window-button:hover > StWidget {
|
||||
.window-button:hover > StWidget,
|
||||
.window-picker-toggle:hover > StWidget {
|
||||
color: #fff;
|
||||
background-color: #303030;
|
||||
}
|
||||
|
||||
.window-button:active > StWidget,
|
||||
.window-button:focus > StWidget {
|
||||
background-color: st-lighten(#303030, 5%);
|
||||
color: #fff;
|
||||
background-color: #3f3f3f;
|
||||
}
|
||||
|
||||
.window-button.focused > StWidget {
|
||||
background-color: #5b5b5b;
|
||||
.window-button.focused > StWidget,
|
||||
.window-picker-toggle:checked > StWidget {
|
||||
color: #fff;
|
||||
background-color: #3f3f3f;
|
||||
}
|
||||
|
||||
.window-button.focused:hover > StWidget {
|
||||
background-color: st-lighten(#5b5b5b, 5%);
|
||||
}
|
||||
|
||||
.window-button.focused:active > StWidget {
|
||||
background-color: st-lighten(#5b5b5b, 10%);
|
||||
}
|
||||
.window-button.focused:active > StWidget,
|
||||
.window-picker-toggle:checked:active > StWidget {
|
||||
color: #fff;
|
||||
background-color: #3f3f3f;
|
||||
}
|
||||
|
||||
.window-button.minimized > StWidget {
|
||||
color: #666;
|
||||
@@ -103,17 +85,36 @@
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.window-button-abstract-label {
|
||||
background-color: #888;
|
||||
border-radius: 99px;
|
||||
margin: 6px;
|
||||
.window-list-workspace-indicator .status-label-bin {
|
||||
background-color: rgba(200, 200, 200, 0.3);
|
||||
padding: 5px;
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
.window-button-attention-indicator {
|
||||
background-color: -st-accent-color;
|
||||
height: 2px;
|
||||
.window-list-workspace-indicator .workspaces-box {
|
||||
spacing: 3px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.window-button.minimized .window-button-attention-indicator {
|
||||
background-color: st-transparentize(-st-accent-color, 0.4);
|
||||
.window-list-workspace-indicator .workspace {
|
||||
width: 52px;
|
||||
border-radius: 4px;
|
||||
background-color: #1e1e1e;
|
||||
}
|
||||
|
||||
.window-list-workspace-indicator .workspace.active {
|
||||
background-color: #3f3f3f;
|
||||
}
|
||||
|
||||
.window-list-window-preview {
|
||||
background-color: #bebebe;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
.window-list-window-preview.active {
|
||||
background-color: #d4d4d4;
|
||||
}
|
||||
|
||||
.notification {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
@import url("stylesheet-dark.css");
|
||||
@import url("stylesheet-workspace-switcher-light.css");
|
||||
|
||||
#panel.bottom-panel {
|
||||
border-top-width: 1px;
|
||||
@@ -14,53 +13,62 @@
|
||||
height: 2.5em;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button > StWidget {
|
||||
.bottom-panel .window-button > StWidget,
|
||||
.bottom-panel .window-picker-toggle > StWidget {
|
||||
color: #2e3436;
|
||||
background-color: #eee;
|
||||
border-radius: 3px;
|
||||
padding: 3px 6px 1px;
|
||||
box-shadow: none;
|
||||
text-shadow: none;
|
||||
border: 1px solid rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
.window-button > StWidget {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.window-button:hover > StWidget {
|
||||
background-color: st-darken(#eee,5%);
|
||||
}
|
||||
|
||||
.window-button:active > StWidget,
|
||||
.window-button:focus > StWidget {
|
||||
background-color: st-darken(#eee, 10%);
|
||||
}
|
||||
|
||||
.window-button.focused > StWidget {
|
||||
background-color: st-darken(#eee,15%);
|
||||
}
|
||||
|
||||
.window-button.focused:hover > StWidget {
|
||||
background-color: st-darken(#eee, 20%);
|
||||
.bottom-panel .window-button > StWidget {
|
||||
-st-natural-width: 18.7em;
|
||||
max-width: 18.75em;
|
||||
}
|
||||
|
||||
.window-button.focused:active > StWidget {
|
||||
background-color: st-darken(#eee, 25%);
|
||||
.bottom-panel .window-button:hover > StWidget,
|
||||
.bottom-panel .window-picker-toggle:hover > StWidget {
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.window-button.minimized > StWidget {
|
||||
color: #aaa;
|
||||
background-color: #f9f9f9;
|
||||
.bottom-panel .window-button:active > StWidget,
|
||||
.bottom-panel .window-button:focus > StWidget {
|
||||
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.bottom-panel .window-button.focused > StWidget,
|
||||
.bottom-panel .window-picker-toggle:checked > StWidget {
|
||||
background-color: #ccc;
|
||||
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.bottom-panel .window-button.focused:hover > StWidget {
|
||||
background-color: #e9e9e9;
|
||||
}
|
||||
|
||||
.bottom-panel .window-button.minimized > StWidget {
|
||||
color: #888;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/* workspace switcher */
|
||||
.window-list-workspace-indicator .workspace {
|
||||
border: 2px solid #f6f5f4;
|
||||
background-color: #ccc;
|
||||
}
|
||||
|
||||
.window-button.minimized:active > StWidget {
|
||||
color: #aaa;
|
||||
background-color: #f9f9f9;
|
||||
.window-list-workspace-indicator .workspace.active {
|
||||
border-color: #888;
|
||||
}
|
||||
|
||||
.window-button-drag-actor {
|
||||
background-color: #ddd;
|
||||
border-color: #888;
|
||||
.window-list-window-preview {
|
||||
background-color: #ededed;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.window-list .placeholder {
|
||||
border-color: rgba(0,0,0,0.5);
|
||||
.window-list-window-preview.active {
|
||||
background-color: #f6f5f4;
|
||||
}
|
||||
|
||||
342
extensions/window-list/windowPicker.js
Normal file
342
extensions/window-list/windowPicker.js
Normal file
@@ -0,0 +1,342 @@
|
||||
// SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||
// SPDX-FileCopyrightText: 2019 Marco Trevisan (Treviño) <mail@3v1n0.net>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import Clutter from 'gi://Clutter';
|
||||
import GObject from 'gi://GObject';
|
||||
import Shell from 'gi://Shell';
|
||||
import St from 'gi://St';
|
||||
|
||||
import {Extension, InjectionManager} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
import * as Layout from 'resource:///org/gnome/shell/ui/layout.js';
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
import {WorkspacesDisplay} from 'resource:///org/gnome/shell/ui/workspacesView.js';
|
||||
import * as Workspace from 'resource:///org/gnome/shell/ui/workspace.js';
|
||||
|
||||
import {VIGNETTE_BRIGHTNESS} from 'resource:///org/gnome/shell/ui/lightbox.js';
|
||||
import {
|
||||
SIDE_CONTROLS_ANIMATION_TIME,
|
||||
OverviewAdjustment,
|
||||
ControlsState
|
||||
} from 'resource:///org/gnome/shell/ui/overviewControls.js';
|
||||
|
||||
class MyWorkspacesDisplay extends WorkspacesDisplay {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(controls, overviewAdjustment) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
const workspaceAdjustment = new St.Adjustment({
|
||||
value: workspaceManager.get_active_workspace_index(),
|
||||
lower: 0,
|
||||
page_increment: 1,
|
||||
page_size: 1,
|
||||
step_increment: 0,
|
||||
upper: workspaceManager.n_workspaces,
|
||||
});
|
||||
|
||||
super(controls, workspaceAdjustment, overviewAdjustment);
|
||||
|
||||
this._windowPicker = controls;
|
||||
|
||||
this._workspaceAdjustment = workspaceAdjustment;
|
||||
this._workspaceAdjustment.actor = this;
|
||||
|
||||
workspaceManager.connectObject('notify::n-workspaces',
|
||||
() => this._updateAdjustment(), this);
|
||||
|
||||
this.add_constraint(
|
||||
new Layout.MonitorConstraint({
|
||||
primary: true,
|
||||
work_area: true,
|
||||
}));
|
||||
}
|
||||
|
||||
prepareToEnterOverview(...args) {
|
||||
if (!this._scrollEventId) {
|
||||
this._scrollEventId = this._windowPicker.connect('scroll-event',
|
||||
this._onScrollEvent.bind(this));
|
||||
}
|
||||
|
||||
super.prepareToEnterOverview(...args);
|
||||
}
|
||||
|
||||
vfunc_hide(...args) {
|
||||
if (this._scrollEventId > 0)
|
||||
this._windowPicker.disconnect(this._scrollEventId);
|
||||
this._scrollEventId = 0;
|
||||
|
||||
super.vfunc_hide(...args);
|
||||
}
|
||||
|
||||
_updateAdjustment() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
this._workspaceAdjustment.set({
|
||||
upper: workspaceManager.n_workspaces,
|
||||
value: workspaceManager.get_active_workspace_index(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export class WindowPicker extends Clutter.Actor {
|
||||
static [GObject.signals] = {
|
||||
'open-state-changed': {param_types: [GObject.TYPE_BOOLEAN]},
|
||||
};
|
||||
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super({reactive: true});
|
||||
|
||||
this._visible = false;
|
||||
this._modal = false;
|
||||
|
||||
this._stageKeyPressId = 0;
|
||||
|
||||
this._adjustment = new OverviewAdjustment(this);
|
||||
|
||||
this._injectionManager = new InjectionManager();
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
|
||||
global.bind_property('screen-width',
|
||||
this, 'width',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
global.bind_property('screen-height',
|
||||
this, 'height',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._workspacesDisplay = new MyWorkspacesDisplay(this, this._adjustment);
|
||||
this.add_child(this._workspacesDisplay);
|
||||
|
||||
Main.uiGroup.insert_child_below(this, global.window_group);
|
||||
|
||||
if (!Main.sessionMode.hasOverview) {
|
||||
this._injectBackgroundShade();
|
||||
|
||||
global.display.connectObject('overlay-key', () => {
|
||||
if (!this._visible)
|
||||
this.open();
|
||||
else
|
||||
this.close();
|
||||
}, this);
|
||||
}
|
||||
}
|
||||
|
||||
_injectBackgroundShade() {
|
||||
const backgroundProto = Workspace.WorkspaceBackground.prototype;
|
||||
this._injectionManager.overrideMethod(backgroundProto, '_updateBorderRadius',
|
||||
() => {
|
||||
return function () {};
|
||||
});
|
||||
this._injectionManager.overrideMethod(backgroundProto, 'vfunc_allocate',
|
||||
() => {
|
||||
/* eslint-disable no-invalid-this */
|
||||
return function (box) {
|
||||
this.set_allocation(box);
|
||||
|
||||
const themeNode = this.get_theme_node();
|
||||
const contentBox = themeNode.get_content_box(box);
|
||||
|
||||
this._bin.allocate(contentBox);
|
||||
|
||||
const [contentWidth, contentHeight] = contentBox.get_size();
|
||||
const monitor = Main.layoutManager.monitors[this._monitorIndex];
|
||||
const xRatio = contentWidth / this._workarea.width;
|
||||
const yRatio = contentHeight / this._workarea.height;
|
||||
|
||||
const right = area => area.x + area.width;
|
||||
const bottom = area => area.y + area.height;
|
||||
|
||||
const offsets = {
|
||||
left: xRatio * (this._workarea.x - monitor.x),
|
||||
right: xRatio * (right(monitor) - right(this._workarea)),
|
||||
top: yRatio * (this._workarea.y - monitor.y),
|
||||
bottom: yRatio * (bottom(monitor) - bottom(this._workarea)),
|
||||
};
|
||||
|
||||
contentBox.set_origin(-offsets.left, -offsets.top);
|
||||
contentBox.set_size(
|
||||
offsets.left + contentWidth + offsets.right,
|
||||
offsets.top + contentHeight + offsets.bottom);
|
||||
this._backgroundGroup.allocate(contentBox);
|
||||
};
|
||||
/* eslint-enable */
|
||||
});
|
||||
this._injectionManager.overrideMethod(backgroundProto, 'vfunc_parent_set',
|
||||
() => {
|
||||
/* eslint-disable no-invalid-this */
|
||||
return function () {
|
||||
setTimeout(() => {
|
||||
const parent = this.get_parent();
|
||||
if (!parent)
|
||||
return;
|
||||
|
||||
parent._overviewAdjustment.connectObject('notify::value', () => {
|
||||
const {value: progress} = parent._overviewAdjustment;
|
||||
const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
|
||||
for (const bg of this._backgroundGroup ?? []) {
|
||||
bg.content.set({
|
||||
vignette: true,
|
||||
brightness,
|
||||
});
|
||||
}
|
||||
}, this);
|
||||
});
|
||||
};
|
||||
/* eslint-enable */
|
||||
});
|
||||
}
|
||||
|
||||
get visible() {
|
||||
return this._visible;
|
||||
}
|
||||
|
||||
open() {
|
||||
if (this._visible)
|
||||
return;
|
||||
|
||||
this._visible = true;
|
||||
|
||||
if (!this._syncGrab())
|
||||
return;
|
||||
|
||||
this._fakeOverviewVisible(true);
|
||||
this._workspacesDisplay.prepareToEnterOverview();
|
||||
Main.overview._animationInProgress = true;
|
||||
|
||||
this._adjustment.value = ControlsState.HIDDEN;
|
||||
this._adjustment.ease(ControlsState.WINDOW_PICKER, {
|
||||
duration: SIDE_CONTROLS_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => (Main.overview._animationInProgress = false),
|
||||
});
|
||||
|
||||
this._stageKeyPressId = global.stage.connect('key-press-event',
|
||||
(a, event) => {
|
||||
let sym = event.get_key_symbol();
|
||||
if (sym === Clutter.KEY_Escape) {
|
||||
this.close();
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
});
|
||||
|
||||
this.emit('open-state-changed', this._visible);
|
||||
}
|
||||
|
||||
close() {
|
||||
if (!this._visible)
|
||||
return;
|
||||
|
||||
this._visible = false;
|
||||
|
||||
if (!this._syncGrab())
|
||||
return;
|
||||
|
||||
this._workspacesDisplay.prepareToLeaveOverview();
|
||||
|
||||
Main.overview._animationInProgress = true;
|
||||
this._adjustment.ease(ControlsState.HIDDEN, {
|
||||
duration: SIDE_CONTROLS_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => {
|
||||
Main.overview._animationInProgress = false;
|
||||
this._workspacesDisplay.hide();
|
||||
this._fakeOverviewVisible(false);
|
||||
},
|
||||
});
|
||||
|
||||
global.stage.disconnect(this._stageKeyPressId);
|
||||
this._stageKeyPressId = 0;
|
||||
|
||||
this.emit('open-state-changed', this._visible);
|
||||
}
|
||||
|
||||
getWorkspacesBoxForState() {
|
||||
return this.allocation;
|
||||
}
|
||||
|
||||
_fakeOverviewVisible(visible) {
|
||||
// Fake overview state for WorkspacesDisplay
|
||||
Main.overview._visible = visible;
|
||||
|
||||
// Hide real windows
|
||||
Main.layoutManager._inOverview = visible;
|
||||
Main.layoutManager._updateVisibility();
|
||||
}
|
||||
|
||||
_syncGrab() {
|
||||
if (this._visible) {
|
||||
if (this._modal)
|
||||
return true;
|
||||
|
||||
const grab = Main.pushModal(global.stage, {
|
||||
actionMode: Shell.ActionMode.OVERVIEW,
|
||||
});
|
||||
if (grab.get_seat_state() !== Clutter.GrabState.NONE) {
|
||||
this._grab = grab;
|
||||
this._modal = true;
|
||||
} else {
|
||||
Main.popModal(grab);
|
||||
this.hide();
|
||||
return false;
|
||||
}
|
||||
} else if (this._modal) {
|
||||
Main.popModal(this._grab);
|
||||
this._modal = false;
|
||||
this._grab = null;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this._injectionManager.clear();
|
||||
|
||||
if (this._stageKeyPressId)
|
||||
global.stage.disconnect(this._stageKeyPressId);
|
||||
this._stageKeyPressId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
export class WindowPickerToggle extends St.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
let iconBin = new St.Widget({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
});
|
||||
iconBin.add_child(new St.Icon({
|
||||
icon_name: 'focus-windows-symbolic',
|
||||
icon_size: 16,
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
}));
|
||||
super({
|
||||
style_class: 'window-picker-toggle',
|
||||
child: iconBin,
|
||||
visible: !Main.sessionMode.hasOverview,
|
||||
toggle_mode: true,
|
||||
});
|
||||
|
||||
const {windowPicker} = Extension.lookupByURL(import.meta.url);
|
||||
this.connect('notify::checked', () => {
|
||||
if (this.checked)
|
||||
windowPicker.open();
|
||||
else
|
||||
windowPicker.close();
|
||||
});
|
||||
|
||||
windowPicker.connect('open-state-changed', () => {
|
||||
this.checked = windowPicker.visible;
|
||||
});
|
||||
}
|
||||
}
|
||||
427
extensions/window-list/workspaceIndicator.js
Normal file
427
extensions/window-list/workspaceIndicator.js
Normal file
@@ -0,0 +1,427 @@
|
||||
// SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Gio from 'gi://Gio';
|
||||
import GObject from 'gi://GObject';
|
||||
import Meta from 'gi://Meta';
|
||||
import St from 'gi://St';
|
||||
|
||||
import {gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
|
||||
import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||
|
||||
const TOOLTIP_OFFSET = 6;
|
||||
const TOOLTIP_ANIMATION_TIME = 150;
|
||||
|
||||
const MAX_THUMBNAILS = 6;
|
||||
|
||||
class WindowPreview extends St.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(window) {
|
||||
super({
|
||||
style_class: 'window-list-window-preview',
|
||||
});
|
||||
|
||||
this._delegate = this;
|
||||
DND.makeDraggable(this, {restoreOnSuccess: true});
|
||||
|
||||
this._window = window;
|
||||
|
||||
this._window.connectObject(
|
||||
'size-changed', () => this._checkRelayout(),
|
||||
'position-changed', () => this._checkRelayout(),
|
||||
'notify::minimized', this._updateVisible.bind(this),
|
||||
'notify::window-type', this._updateVisible.bind(this),
|
||||
this);
|
||||
this._updateVisible();
|
||||
|
||||
global.display.connectObject('notify::focus-window',
|
||||
this._onFocusChanged.bind(this), this);
|
||||
this._onFocusChanged();
|
||||
}
|
||||
|
||||
// needed for DND
|
||||
get metaWindow() {
|
||||
return this._window;
|
||||
}
|
||||
|
||||
_onFocusChanged() {
|
||||
if (global.display.focus_window === this._window)
|
||||
this.add_style_class_name('active');
|
||||
else
|
||||
this.remove_style_class_name('active');
|
||||
}
|
||||
|
||||
_checkRelayout() {
|
||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
if (this._window.get_frame_rect().overlap(workArea))
|
||||
this.queue_relayout();
|
||||
}
|
||||
|
||||
_updateVisible() {
|
||||
this.visible = this._window.window_type !== Meta.WindowType.DESKTOP &&
|
||||
this._window.showing_on_its_workspace();
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceLayout extends Clutter.LayoutManager {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
vfunc_allocate(container, box) {
|
||||
const monitor = Main.layoutManager.findIndexForActor(container);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
const hscale = box.get_width() / workArea.width;
|
||||
const vscale = box.get_height() / workArea.height;
|
||||
|
||||
for (const child of container) {
|
||||
const childBox = new Clutter.ActorBox();
|
||||
const frameRect = child.metaWindow.get_frame_rect();
|
||||
childBox.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
childBox.set_origin(
|
||||
Math.round((frameRect.x - workArea.x) * hscale),
|
||||
Math.round((frameRect.y - workArea.y) * vscale));
|
||||
child.allocate(childBox);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceThumbnail extends St.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(index) {
|
||||
super({
|
||||
style_class: 'workspace',
|
||||
child: new Clutter.Actor({
|
||||
layout_manager: new WorkspaceLayout(),
|
||||
clip_to_allocation: true,
|
||||
}),
|
||||
});
|
||||
|
||||
this._tooltip = new St.Label({
|
||||
style_class: 'dash-label',
|
||||
visible: false,
|
||||
});
|
||||
Main.uiGroup.add_child(this._tooltip);
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
this.connect('notify::hover', this._syncTooltip.bind(this));
|
||||
|
||||
this._index = index;
|
||||
this._delegate = this; // needed for DND
|
||||
|
||||
this._windowPreviews = new Map();
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
this._workspace = workspaceManager.get_workspace_by_index(index);
|
||||
|
||||
this._workspace.connectObject(
|
||||
'window-added', (ws, window) => this._addWindow(window),
|
||||
'window-removed', (ws, window) => this._removeWindow(window),
|
||||
this);
|
||||
|
||||
global.display.connectObject('restacked',
|
||||
this._onRestacked.bind(this), this);
|
||||
|
||||
this._workspace.list_windows().forEach(w => this._addWindow(w));
|
||||
this._onRestacked();
|
||||
}
|
||||
|
||||
acceptDrop(source) {
|
||||
if (!source.metaWindow)
|
||||
return false;
|
||||
|
||||
this._moveWindow(source.metaWindow);
|
||||
return true;
|
||||
}
|
||||
|
||||
handleDragOver(source) {
|
||||
if (source.metaWindow)
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
else
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
}
|
||||
|
||||
_addWindow(window) {
|
||||
if (this._windowPreviews.has(window))
|
||||
return;
|
||||
|
||||
let preview = new WindowPreview(window);
|
||||
preview.connect('clicked', (a, btn) => this.emit('clicked', btn));
|
||||
this._windowPreviews.set(window, preview);
|
||||
this.child.add_child(preview);
|
||||
}
|
||||
|
||||
_removeWindow(window) {
|
||||
let preview = this._windowPreviews.get(window);
|
||||
if (!preview)
|
||||
return;
|
||||
|
||||
this._windowPreviews.delete(window);
|
||||
preview.destroy();
|
||||
}
|
||||
|
||||
_onRestacked() {
|
||||
let lastPreview = null;
|
||||
let windows = global.get_window_actors().map(a => a.meta_window);
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let preview = this._windowPreviews.get(windows[i]);
|
||||
if (!preview)
|
||||
continue;
|
||||
|
||||
this.child.set_child_above_sibling(preview, lastPreview);
|
||||
lastPreview = preview;
|
||||
}
|
||||
}
|
||||
|
||||
_moveWindow(window) {
|
||||
let monitorIndex = Main.layoutManager.findIndexForActor(this);
|
||||
if (monitorIndex !== window.get_monitor())
|
||||
window.move_to_monitor(monitorIndex);
|
||||
window.change_workspace_by_index(this._index, false);
|
||||
}
|
||||
|
||||
on_clicked() {
|
||||
let ws = global.workspace_manager.get_workspace_by_index(this._index);
|
||||
if (ws)
|
||||
ws.activate(global.get_current_time());
|
||||
}
|
||||
|
||||
_syncTooltip() {
|
||||
if (this.hover) {
|
||||
this._tooltip.set({
|
||||
text: Meta.prefs_get_workspace_name(this._index),
|
||||
visible: true,
|
||||
opacity: 0,
|
||||
});
|
||||
|
||||
const [stageX, stageY] = this.get_transformed_position();
|
||||
const thumbWidth = this.allocation.get_width();
|
||||
const tipWidth = this._tooltip.width;
|
||||
const tipHeight = this._tooltip.height;
|
||||
const xOffset = Math.floor((thumbWidth - tipWidth) / 2);
|
||||
const monitor = Main.layoutManager.findMonitorForActor(this);
|
||||
const x = Math.clamp(
|
||||
stageX + xOffset,
|
||||
monitor.x,
|
||||
monitor.x + monitor.width - tipWidth);
|
||||
const y = stageY - tipHeight - TOOLTIP_OFFSET;
|
||||
this._tooltip.set_position(x, y);
|
||||
}
|
||||
|
||||
this._tooltip.ease({
|
||||
opacity: this.hover ? 255 : 0,
|
||||
duration: TOOLTIP_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => (this._tooltip.visible = this.hover),
|
||||
});
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this._tooltip.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
export class WorkspaceIndicator extends PanelMenu.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(0.5, _('Workspace Indicator'), true);
|
||||
this.setMenu(new PopupMenu.PopupMenu(this, 0.0, St.Side.BOTTOM));
|
||||
this.add_style_class_name('window-list-workspace-indicator');
|
||||
this.remove_style_class_name('panel-button');
|
||||
this.menu.actor.remove_style_class_name('panel-menu');
|
||||
|
||||
let container = new St.Widget({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
});
|
||||
this.add_actor(container);
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
||||
this._statusLabel = new St.Label({text: this._getStatusText()});
|
||||
|
||||
this._statusBin = new St.Bin({
|
||||
style_class: 'status-label-bin',
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
child: this._statusLabel,
|
||||
});
|
||||
container.add_actor(this._statusBin);
|
||||
|
||||
this._thumbnailsBox = new St.BoxLayout({
|
||||
style_class: 'workspaces-box',
|
||||
y_expand: true,
|
||||
reactive: true,
|
||||
});
|
||||
this._thumbnailsBox.connect('scroll-event',
|
||||
this._onScrollEvent.bind(this));
|
||||
container.add_actor(this._thumbnailsBox);
|
||||
|
||||
this._workspacesItems = [];
|
||||
|
||||
workspaceManager.connectObject(
|
||||
'notify::n-workspaces', this._nWorkspacesChanged.bind(this), GObject.ConnectFlags.AFTER,
|
||||
'workspace-switched', this._onWorkspaceSwitched.bind(this), GObject.ConnectFlags.AFTER,
|
||||
'notify::layout-rows', this._updateThumbnailVisibility.bind(this),
|
||||
this);
|
||||
|
||||
this.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||
this._updateMenu();
|
||||
this._updateThumbnails();
|
||||
this._updateThumbnailVisibility();
|
||||
|
||||
this._settings = new Gio.Settings({schema_id: 'org.gnome.desktop.wm.preferences'});
|
||||
this._settings.connectObject('changed::workspace-names',
|
||||
() => this._updateMenuLabels(), this);
|
||||
}
|
||||
|
||||
_updateThumbnailVisibility() {
|
||||
const {workspaceManager} = global;
|
||||
const vertical = workspaceManager.layout_rows === -1;
|
||||
const useMenu =
|
||||
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
|
||||
this.reactive = useMenu;
|
||||
|
||||
this._statusBin.visible = useMenu;
|
||||
this._thumbnailsBox.visible = !useMenu;
|
||||
}
|
||||
|
||||
_onWorkspaceSwitched() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
||||
|
||||
this._updateMenuOrnament();
|
||||
this._updateActiveThumbnail();
|
||||
|
||||
this._statusLabel.set_text(this._getStatusText());
|
||||
}
|
||||
|
||||
_nWorkspacesChanged() {
|
||||
this._updateMenu();
|
||||
this._updateThumbnails();
|
||||
this._updateThumbnailVisibility();
|
||||
}
|
||||
|
||||
_updateMenuOrnament() {
|
||||
for (let i = 0; i < this._workspacesItems.length; i++) {
|
||||
this._workspacesItems[i].setOrnament(i === this._currentWorkspace
|
||||
? PopupMenu.Ornament.DOT
|
||||
: PopupMenu.Ornament.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
_updateActiveThumbnail() {
|
||||
let thumbs = this._thumbnailsBox.get_children();
|
||||
for (let i = 0; i < thumbs.length; i++) {
|
||||
if (i === this._currentWorkspace)
|
||||
thumbs[i].add_style_class_name('active');
|
||||
else
|
||||
thumbs[i].remove_style_class_name('active');
|
||||
}
|
||||
}
|
||||
|
||||
_getStatusText() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let current = workspaceManager.get_active_workspace_index();
|
||||
let total = workspaceManager.n_workspaces;
|
||||
|
||||
return '%d / %d'.format(current + 1, total);
|
||||
}
|
||||
|
||||
_updateMenuLabels() {
|
||||
for (let i = 0; i < this._workspacesItems.length; i++) {
|
||||
let item = this._workspacesItems[i];
|
||||
let name = Meta.prefs_get_workspace_name(i);
|
||||
item.label.text = name;
|
||||
}
|
||||
}
|
||||
|
||||
_updateMenu() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this.menu.removeAll();
|
||||
this._workspacesItems = [];
|
||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
||||
|
||||
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
||||
let name = Meta.prefs_get_workspace_name(i);
|
||||
let item = new PopupMenu.PopupMenuItem(name);
|
||||
item.workspaceId = i;
|
||||
|
||||
item.connect('activate', () => {
|
||||
this._activate(item.workspaceId);
|
||||
});
|
||||
|
||||
if (i === this._currentWorkspace)
|
||||
item.setOrnament(PopupMenu.Ornament.DOT);
|
||||
|
||||
this.menu.addMenuItem(item);
|
||||
this._workspacesItems[i] = item;
|
||||
}
|
||||
|
||||
this._statusLabel.set_text(this._getStatusText());
|
||||
}
|
||||
|
||||
_updateThumbnails() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this._thumbnailsBox.destroy_all_children();
|
||||
|
||||
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
||||
let thumb = new WorkspaceThumbnail(i);
|
||||
this._thumbnailsBox.add_actor(thumb);
|
||||
}
|
||||
this._updateActiveThumbnail();
|
||||
}
|
||||
|
||||
_activate(index) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
if (index >= 0 && index < workspaceManager.n_workspaces) {
|
||||
let metaWorkspace = workspaceManager.get_workspace_by_index(index);
|
||||
metaWorkspace.activate(global.get_current_time());
|
||||
}
|
||||
}
|
||||
|
||||
_onScrollEvent(actor, event) {
|
||||
let direction = event.get_scroll_direction();
|
||||
let diff = 0;
|
||||
if (direction === Clutter.ScrollDirection.DOWN)
|
||||
diff = 1;
|
||||
else if (direction === Clutter.ScrollDirection.UP)
|
||||
diff = -1;
|
||||
else
|
||||
return;
|
||||
|
||||
let newIndex = this._currentWorkspace + diff;
|
||||
this._activate(newIndex);
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Graphene from 'gi://Graphene';
|
||||
import St from 'gi://St';
|
||||
@@ -85,7 +86,7 @@ export default class Extension {
|
||||
style_class: 'extension-windowsNavigator-window-tooltip',
|
||||
visible: false,
|
||||
});
|
||||
this.add_child(this._tip);
|
||||
this.add_actor(this._tip);
|
||||
|
||||
this.connect('notify::scale-x', () => {
|
||||
this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
|
||||
@@ -173,7 +174,7 @@ export default class Extension {
|
||||
this._injectionManager.overrideMethod(viewProto, '_hideTooltips', () => {
|
||||
/* eslint-disable no-invalid-this */
|
||||
return function () {
|
||||
if (global.stage.get_key_focus() === null)
|
||||
if (global.stage.get_key_focus() === global.stage)
|
||||
global.stage.set_key_focus(this._prevFocusActor);
|
||||
this._pickWindow = false;
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
@@ -235,7 +236,7 @@ export default class Extension {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (global.stage.get_key_focus() !== null)
|
||||
if (global.stage.get_key_focus() !== global.stage)
|
||||
return false;
|
||||
|
||||
// ignore shift presses, they're required to get numerals in azerty keyboards
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"settings-schema": "@gschemaname@",
|
||||
"gettext-domain": "@gettext_domain@",
|
||||
"original-author": "zaspire@rambler.ru",
|
||||
"name": "Window Navigator",
|
||||
"name": "windowNavigator",
|
||||
"description": "Allow keyboard selection of windows and workspaces in overlay mode. <Ctrl>number selects a workspace, and <Alt>number selects a window.",
|
||||
"url": "@url@"
|
||||
}
|
||||
|
||||
@@ -4,17 +4,440 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Gio from 'gi://Gio';
|
||||
import GObject from 'gi://GObject';
|
||||
import Meta from 'gi://Meta';
|
||||
import St from 'gi://St';
|
||||
|
||||
import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
|
||||
import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||
|
||||
import {WorkspaceIndicator} from './workspaceIndicator.js';
|
||||
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||
const WORKSPACE_KEY = 'workspace-names';
|
||||
|
||||
const TOOLTIP_OFFSET = 6;
|
||||
const TOOLTIP_ANIMATION_TIME = 150;
|
||||
|
||||
const MAX_THUMBNAILS = 6;
|
||||
|
||||
class WindowPreview extends St.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(window) {
|
||||
super({
|
||||
style_class: 'workspace-indicator-window-preview',
|
||||
});
|
||||
|
||||
this._delegate = this;
|
||||
DND.makeDraggable(this, {restoreOnSuccess: true});
|
||||
|
||||
this._window = window;
|
||||
|
||||
this._window.connectObject(
|
||||
'size-changed', () => this._checkRelayout(),
|
||||
'position-changed', () => this._checkRelayout(),
|
||||
'notify::minimized', this._updateVisible.bind(this),
|
||||
'notify::window-type', this._updateVisible.bind(this),
|
||||
this);
|
||||
this._updateVisible();
|
||||
|
||||
global.display.connectObject('notify::focus-window',
|
||||
this._onFocusChanged.bind(this), this);
|
||||
this._onFocusChanged();
|
||||
}
|
||||
|
||||
// needed for DND
|
||||
get metaWindow() {
|
||||
return this._window;
|
||||
}
|
||||
|
||||
_onFocusChanged() {
|
||||
if (global.display.focus_window === this._window)
|
||||
this.add_style_class_name('active');
|
||||
else
|
||||
this.remove_style_class_name('active');
|
||||
}
|
||||
|
||||
_checkRelayout() {
|
||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
if (this._window.get_frame_rect().overlap(workArea))
|
||||
this.queue_relayout();
|
||||
}
|
||||
|
||||
_updateVisible() {
|
||||
this.visible = this._window.window_type !== Meta.WindowType.DESKTOP &&
|
||||
this._window.showing_on_its_workspace();
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceLayout extends Clutter.LayoutManager {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
vfunc_allocate(container, box) {
|
||||
const monitor = Main.layoutManager.findIndexForActor(container);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
const hscale = box.get_width() / workArea.width;
|
||||
const vscale = box.get_height() / workArea.height;
|
||||
|
||||
for (const child of container) {
|
||||
const childBox = new Clutter.ActorBox();
|
||||
const frameRect = child.metaWindow.get_frame_rect();
|
||||
childBox.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
childBox.set_origin(
|
||||
Math.round((frameRect.x - workArea.x) * hscale),
|
||||
Math.round((frameRect.y - workArea.y) * vscale));
|
||||
child.allocate(childBox);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceThumbnail extends St.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(index) {
|
||||
super({
|
||||
style_class: 'workspace',
|
||||
child: new Clutter.Actor({
|
||||
layout_manager: new WorkspaceLayout(),
|
||||
clip_to_allocation: true,
|
||||
}),
|
||||
});
|
||||
|
||||
this._tooltip = new St.Label({
|
||||
style_class: 'dash-label',
|
||||
visible: false,
|
||||
});
|
||||
Main.uiGroup.add_child(this._tooltip);
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
this.connect('notify::hover', this._syncTooltip.bind(this));
|
||||
|
||||
this._index = index;
|
||||
this._delegate = this; // needed for DND
|
||||
|
||||
this._windowPreviews = new Map();
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
this._workspace = workspaceManager.get_workspace_by_index(index);
|
||||
|
||||
this._workspace.connectObject(
|
||||
'window-added', (ws, window) => this._addWindow(window),
|
||||
'window-removed', (ws, window) => this._removeWindow(window),
|
||||
this);
|
||||
|
||||
global.display.connectObject('restacked',
|
||||
this._onRestacked.bind(this), this);
|
||||
|
||||
this._workspace.list_windows().forEach(w => this._addWindow(w));
|
||||
this._onRestacked();
|
||||
}
|
||||
|
||||
acceptDrop(source) {
|
||||
if (!source.metaWindow)
|
||||
return false;
|
||||
|
||||
this._moveWindow(source.metaWindow);
|
||||
return true;
|
||||
}
|
||||
|
||||
handleDragOver(source) {
|
||||
if (source.metaWindow)
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
else
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
}
|
||||
|
||||
_addWindow(window) {
|
||||
if (this._windowPreviews.has(window))
|
||||
return;
|
||||
|
||||
let preview = new WindowPreview(window);
|
||||
preview.connect('clicked', (a, btn) => this.emit('clicked', btn));
|
||||
this._windowPreviews.set(window, preview);
|
||||
this.child.add_child(preview);
|
||||
}
|
||||
|
||||
_removeWindow(window) {
|
||||
let preview = this._windowPreviews.get(window);
|
||||
if (!preview)
|
||||
return;
|
||||
|
||||
this._windowPreviews.delete(window);
|
||||
preview.destroy();
|
||||
}
|
||||
|
||||
_onRestacked() {
|
||||
let lastPreview = null;
|
||||
let windows = global.get_window_actors().map(a => a.meta_window);
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let preview = this._windowPreviews.get(windows[i]);
|
||||
if (!preview)
|
||||
continue;
|
||||
|
||||
this.child.set_child_above_sibling(preview, lastPreview);
|
||||
lastPreview = preview;
|
||||
}
|
||||
}
|
||||
|
||||
_moveWindow(window) {
|
||||
let monitorIndex = Main.layoutManager.findIndexForActor(this);
|
||||
if (monitorIndex !== window.get_monitor())
|
||||
window.move_to_monitor(monitorIndex);
|
||||
window.change_workspace_by_index(this._index, false);
|
||||
}
|
||||
|
||||
on_clicked() {
|
||||
let ws = global.workspace_manager.get_workspace_by_index(this._index);
|
||||
if (ws)
|
||||
ws.activate(global.get_current_time());
|
||||
}
|
||||
|
||||
_syncTooltip() {
|
||||
if (this.hover) {
|
||||
this._tooltip.set({
|
||||
text: Meta.prefs_get_workspace_name(this._index),
|
||||
visible: true,
|
||||
opacity: 0,
|
||||
});
|
||||
|
||||
const [stageX, stageY] = this.get_transformed_position();
|
||||
const thumbWidth = this.allocation.get_width();
|
||||
const thumbHeight = this.allocation.get_height();
|
||||
const tipWidth = this._tooltip.width;
|
||||
const xOffset = Math.floor((thumbWidth - tipWidth) / 2);
|
||||
const monitor = Main.layoutManager.findMonitorForActor(this);
|
||||
const x = Math.clamp(
|
||||
stageX + xOffset,
|
||||
monitor.x,
|
||||
monitor.x + monitor.width - tipWidth);
|
||||
const y = stageY + thumbHeight + TOOLTIP_OFFSET;
|
||||
this._tooltip.set_position(x, y);
|
||||
}
|
||||
|
||||
this._tooltip.ease({
|
||||
opacity: this.hover ? 255 : 0,
|
||||
duration: TOOLTIP_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => (this._tooltip.visible = this.hover),
|
||||
});
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this._tooltip.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceIndicator extends PanelMenu.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(0.5, _('Workspace Indicator'));
|
||||
|
||||
let container = new St.Widget({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
});
|
||||
this.add_actor(container);
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
||||
this._statusLabel = new St.Label({
|
||||
style_class: 'panel-workspace-indicator',
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
text: this._labelText(),
|
||||
});
|
||||
|
||||
container.add_actor(this._statusLabel);
|
||||
|
||||
this._thumbnailsBox = new St.BoxLayout({
|
||||
style_class: 'panel-workspace-indicator-box',
|
||||
y_expand: true,
|
||||
reactive: true,
|
||||
});
|
||||
|
||||
container.add_actor(this._thumbnailsBox);
|
||||
|
||||
this._workspacesItems = [];
|
||||
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
||||
this.menu.addMenuItem(this._workspaceSection);
|
||||
|
||||
workspaceManager.connectObject(
|
||||
'notify::n-workspaces', this._nWorkspacesChanged.bind(this), GObject.ConnectFlags.AFTER,
|
||||
'workspace-switched', this._onWorkspaceSwitched.bind(this), GObject.ConnectFlags.AFTER,
|
||||
'notify::layout-rows', this._updateThumbnailVisibility.bind(this),
|
||||
this);
|
||||
|
||||
this.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||
this._thumbnailsBox.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||
this._createWorkspacesSection();
|
||||
this._updateThumbnails();
|
||||
this._updateThumbnailVisibility();
|
||||
|
||||
this._settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
|
||||
this._settings.connectObject(`changed::${WORKSPACE_KEY}`,
|
||||
this._updateMenuLabels.bind(this), this);
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
|
||||
super._onDestroy();
|
||||
}
|
||||
|
||||
_updateThumbnailVisibility() {
|
||||
const {workspaceManager} = global;
|
||||
const vertical = workspaceManager.layout_rows === -1;
|
||||
const useMenu =
|
||||
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
|
||||
this.reactive = useMenu;
|
||||
|
||||
this._statusLabel.visible = useMenu;
|
||||
this._thumbnailsBox.visible = !useMenu;
|
||||
|
||||
// Disable offscreen-redirect when showing the workspace switcher
|
||||
// so that clip-to-allocation works
|
||||
Main.panel.set_offscreen_redirect(useMenu
|
||||
? Clutter.OffscreenRedirect.ALWAYS
|
||||
: Clutter.OffscreenRedirect.AUTOMATIC_FOR_OPACITY);
|
||||
}
|
||||
|
||||
_onWorkspaceSwitched() {
|
||||
this._currentWorkspace = global.workspace_manager.get_active_workspace_index();
|
||||
|
||||
this._updateMenuOrnament();
|
||||
this._updateActiveThumbnail();
|
||||
|
||||
this._statusLabel.set_text(this._labelText());
|
||||
}
|
||||
|
||||
_nWorkspacesChanged() {
|
||||
this._createWorkspacesSection();
|
||||
this._updateThumbnails();
|
||||
this._updateThumbnailVisibility();
|
||||
}
|
||||
|
||||
_updateMenuOrnament() {
|
||||
for (let i = 0; i < this._workspacesItems.length; i++) {
|
||||
this._workspacesItems[i].setOrnament(i === this._currentWorkspace
|
||||
? PopupMenu.Ornament.DOT
|
||||
: PopupMenu.Ornament.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
_updateActiveThumbnail() {
|
||||
let thumbs = this._thumbnailsBox.get_children();
|
||||
for (let i = 0; i < thumbs.length; i++) {
|
||||
if (i === this._currentWorkspace)
|
||||
thumbs[i].add_style_class_name('active');
|
||||
else
|
||||
thumbs[i].remove_style_class_name('active');
|
||||
}
|
||||
}
|
||||
|
||||
_labelText(workspaceIndex) {
|
||||
if (workspaceIndex === undefined) {
|
||||
workspaceIndex = this._currentWorkspace;
|
||||
return (workspaceIndex + 1).toString();
|
||||
}
|
||||
return Meta.prefs_get_workspace_name(workspaceIndex);
|
||||
}
|
||||
|
||||
_updateMenuLabels() {
|
||||
for (let i = 0; i < this._workspacesItems.length; i++)
|
||||
this._workspacesItems[i].label.text = this._labelText(i);
|
||||
}
|
||||
|
||||
_createWorkspacesSection() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this._workspaceSection.removeAll();
|
||||
this._workspacesItems = [];
|
||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
||||
|
||||
let i = 0;
|
||||
for (; i < workspaceManager.n_workspaces; i++) {
|
||||
this._workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
|
||||
this._workspaceSection.addMenuItem(this._workspacesItems[i]);
|
||||
this._workspacesItems[i].workspaceId = i;
|
||||
this._workspacesItems[i].label_actor = this._statusLabel;
|
||||
this._workspacesItems[i].connect('activate', (actor, _event) => {
|
||||
this._activate(actor.workspaceId);
|
||||
});
|
||||
|
||||
if (i === this._currentWorkspace)
|
||||
this._workspacesItems[i].setOrnament(PopupMenu.Ornament.DOT);
|
||||
}
|
||||
|
||||
this._statusLabel.set_text(this._labelText());
|
||||
}
|
||||
|
||||
_updateThumbnails() {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
this._thumbnailsBox.destroy_all_children();
|
||||
|
||||
for (let i = 0; i < workspaceManager.n_workspaces; i++) {
|
||||
let thumb = new WorkspaceThumbnail(i);
|
||||
this._thumbnailsBox.add_actor(thumb);
|
||||
}
|
||||
this._updateActiveThumbnail();
|
||||
}
|
||||
|
||||
_activate(index) {
|
||||
let workspaceManager = global.workspace_manager;
|
||||
|
||||
if (index >= 0 && index < workspaceManager.n_workspaces) {
|
||||
let metaWorkspace = workspaceManager.get_workspace_by_index(index);
|
||||
metaWorkspace.activate(global.get_current_time());
|
||||
}
|
||||
}
|
||||
|
||||
_onScrollEvent(actor, event) {
|
||||
let direction = event.get_scroll_direction();
|
||||
let diff = 0;
|
||||
if (direction === Clutter.ScrollDirection.DOWN)
|
||||
diff = 1;
|
||||
else if (direction === Clutter.ScrollDirection.UP)
|
||||
diff = -1;
|
||||
else
|
||||
return;
|
||||
|
||||
|
||||
let newIndex = global.workspace_manager.get_active_workspace_index() + diff;
|
||||
this._activate(newIndex);
|
||||
}
|
||||
}
|
||||
|
||||
export default class WorkspaceIndicatorExtension extends Extension {
|
||||
enable() {
|
||||
this._indicator = new WorkspaceIndicator({
|
||||
settings: this.getSettings(),
|
||||
});
|
||||
this._indicator = new WorkspaceIndicator();
|
||||
Main.panel.addToStatusArea('workspace-indicator', this._indicator);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,10 +7,6 @@ extension_data += configure_file(
|
||||
output: metadata_name,
|
||||
configuration: metadata_conf
|
||||
)
|
||||
extension_data += files(
|
||||
'stylesheet-dark.css',
|
||||
'stylesheet-light.css',
|
||||
)
|
||||
extension_schemas += files('schemas/' + metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||
extension_data += files('stylesheet.css')
|
||||
|
||||
extension_sources += files('prefs.js', 'workspaceIndicator.js', 'workspacePrefs.js')
|
||||
extension_sources += files('prefs.js')
|
||||
|
||||
@@ -3,12 +3,268 @@
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import {ExtensionPreferences} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
|
||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||
import Adw from 'gi://Adw';
|
||||
import Gio from 'gi://Gio';
|
||||
import GLib from 'gi://GLib';
|
||||
import GObject from 'gi://GObject';
|
||||
import Gtk from 'gi://Gtk';
|
||||
import Pango from 'gi://Pango';
|
||||
|
||||
import {WorkspacesPage} from './workspacePrefs.js';
|
||||
import {ExtensionPreferences, gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
|
||||
|
||||
const N_ = e => e;
|
||||
|
||||
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||
const WORKSPACE_KEY = 'workspace-names';
|
||||
|
||||
class NewItem extends GObject.Object {}
|
||||
GObject.registerClass(NewItem);
|
||||
|
||||
class NewItemModel extends GObject.Object {
|
||||
static [GObject.interfaces] = [Gio.ListModel];
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
#item = new NewItem();
|
||||
|
||||
vfunc_get_item_type() {
|
||||
return NewItem;
|
||||
}
|
||||
|
||||
vfunc_get_n_items() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
vfunc_get_item(_pos) {
|
||||
return this.#item;
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspacesList extends GObject.Object {
|
||||
static [GObject.interfaces] = [Gio.ListModel];
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
#settings = new Gio.Settings({schema_id: WORKSPACE_SCHEMA});
|
||||
#names = this.#settings.get_strv(WORKSPACE_KEY);
|
||||
#items = Gtk.StringList.new(this.#names);
|
||||
#changedId;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.#changedId =
|
||||
this.#settings.connect(`changed::${WORKSPACE_KEY}`, () => {
|
||||
const removed = this.#names.length;
|
||||
this.#names = this.#settings.get_strv(WORKSPACE_KEY);
|
||||
this.#items.splice(0, removed, this.#names);
|
||||
this.items_changed(0, removed, this.#names.length);
|
||||
});
|
||||
}
|
||||
|
||||
append() {
|
||||
const name = _('Workspace %d').format(this.#names.length + 1);
|
||||
|
||||
this.#names.push(name);
|
||||
this.#settings.block_signal_handler(this.#changedId);
|
||||
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
|
||||
this.#settings.unblock_signal_handler(this.#changedId);
|
||||
|
||||
const pos = this.#items.get_n_items();
|
||||
this.#items.append(name);
|
||||
this.items_changed(pos, 0, 1);
|
||||
}
|
||||
|
||||
remove(name) {
|
||||
const pos = this.#names.indexOf(name);
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
this.#names.splice(pos, 1);
|
||||
|
||||
this.#settings.block_signal_handler(this.#changedId);
|
||||
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
|
||||
this.#settings.unblock_signal_handler(this.#changedId);
|
||||
|
||||
this.#items.remove(pos);
|
||||
this.items_changed(pos, 1, 0);
|
||||
}
|
||||
|
||||
rename(oldName, newName) {
|
||||
const pos = this.#names.indexOf(oldName);
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
this.#names.splice(pos, 1, newName);
|
||||
this.#items.splice(pos, 1, [newName]);
|
||||
|
||||
this.#settings.block_signal_handler(this.#changedId);
|
||||
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
|
||||
this.#settings.unblock_signal_handler(this.#changedId);
|
||||
}
|
||||
|
||||
vfunc_get_item_type() {
|
||||
return Gtk.StringObject;
|
||||
}
|
||||
|
||||
vfunc_get_n_items() {
|
||||
return this.#items.get_n_items();
|
||||
}
|
||||
|
||||
vfunc_get_item(pos) {
|
||||
return this.#items.get_item(pos);
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceSettingsWidget extends Adw.PreferencesGroup {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
|
||||
this.install_action('workspaces.add', null,
|
||||
self => self._workspaces.append());
|
||||
this.install_action('workspaces.remove', 's',
|
||||
(self, name, param) => self._workspaces.remove(param.unpack()));
|
||||
this.install_action('workspaces.rename', '(ss)',
|
||||
(self, name, param) => self._workspaces.rename(...param.deepUnpack()));
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
title: _('Workspace Names'),
|
||||
});
|
||||
|
||||
this._workspaces = new WorkspacesList();
|
||||
|
||||
const store = new Gio.ListStore({item_type: Gio.ListModel});
|
||||
const listModel = new Gtk.FlattenListModel({model: store});
|
||||
store.append(this._workspaces);
|
||||
store.append(new NewItemModel());
|
||||
|
||||
this._list = new Gtk.ListBox({
|
||||
selection_mode: Gtk.SelectionMode.NONE,
|
||||
css_classes: ['boxed-list'],
|
||||
});
|
||||
this._list.connect('row-activated', (l, row) => row.edit());
|
||||
this.add(this._list);
|
||||
|
||||
this._list.bind_model(listModel, item => {
|
||||
return item instanceof NewItem
|
||||
? new NewWorkspaceRow()
|
||||
: new WorkspaceRow(item.string);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceRow extends Adw.PreferencesRow {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(name) {
|
||||
super({name});
|
||||
|
||||
const box = new Gtk.Box({
|
||||
spacing: 12,
|
||||
margin_top: 6,
|
||||
margin_bottom: 6,
|
||||
margin_start: 6,
|
||||
margin_end: 6,
|
||||
});
|
||||
|
||||
const label = new Gtk.Label({
|
||||
hexpand: true,
|
||||
xalign: 0,
|
||||
max_width_chars: 25,
|
||||
ellipsize: Pango.EllipsizeMode.END,
|
||||
});
|
||||
this.bind_property('name', label, 'label',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
box.append(label);
|
||||
|
||||
const button = new Gtk.Button({
|
||||
action_name: 'workspaces.remove',
|
||||
icon_name: 'edit-delete-symbolic',
|
||||
has_frame: false,
|
||||
});
|
||||
box.append(button);
|
||||
|
||||
this.bind_property_full('name',
|
||||
button, 'action-target',
|
||||
GObject.BindingFlags.SYNC_CREATE,
|
||||
(bind, target) => [true, new GLib.Variant('s', target)],
|
||||
null);
|
||||
|
||||
this._entry = new Gtk.Entry({
|
||||
max_width_chars: 25,
|
||||
});
|
||||
|
||||
const controller = new Gtk.ShortcutController();
|
||||
controller.add_shortcut(new Gtk.Shortcut({
|
||||
trigger: Gtk.ShortcutTrigger.parse_string('Escape'),
|
||||
action: Gtk.CallbackAction.new(() => {
|
||||
this._stopEdit();
|
||||
return true;
|
||||
}),
|
||||
}));
|
||||
this._entry.add_controller(controller);
|
||||
|
||||
this._stack = new Gtk.Stack();
|
||||
this._stack.add_named(box, 'display');
|
||||
this._stack.add_named(this._entry, 'edit');
|
||||
this.child = this._stack;
|
||||
|
||||
this._entry.connect('activate', () => {
|
||||
this.activate_action('workspaces.rename',
|
||||
new GLib.Variant('(ss)', [this.name, this._entry.text]));
|
||||
this.name = this._entry.text;
|
||||
this._stopEdit();
|
||||
});
|
||||
this._entry.connect('notify::has-focus', () => {
|
||||
if (this._entry.has_focus)
|
||||
return;
|
||||
this._stopEdit();
|
||||
});
|
||||
}
|
||||
|
||||
edit() {
|
||||
this._entry.text = this.name;
|
||||
this._entry.grab_focus();
|
||||
this._stack.visible_child_name = 'edit';
|
||||
}
|
||||
|
||||
_stopEdit() {
|
||||
this.grab_focus();
|
||||
this._stack.visible_child_name = 'display';
|
||||
}
|
||||
}
|
||||
|
||||
class NewWorkspaceRow extends Adw.PreferencesRow {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
action_name: 'workspaces.add',
|
||||
child: new Gtk.Image({
|
||||
icon_name: 'list-add-symbolic',
|
||||
pixel_size: 16,
|
||||
margin_top: 12,
|
||||
margin_bottom: 12,
|
||||
margin_start: 12,
|
||||
margin_end: 12,
|
||||
}),
|
||||
});
|
||||
this.update_property(
|
||||
[Gtk.AccessibleProperty.LABEL], [_('Add Workspace')]);
|
||||
}
|
||||
}
|
||||
|
||||
export default class WorkspaceIndicatorPrefs extends ExtensionPreferences {
|
||||
getPreferencesWidget() {
|
||||
return new WorkspacesPage(this.getSettings());
|
||||
return new WorkspaceSettingsWidget();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2024 Florian Müllner <fmuellner@gnome.org>
|
||||
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
-->
|
||||
|
||||
<schemalist gettext-domain="gnome-shell-extensions">
|
||||
<schema id="org.gnome.shell.extensions.workspace-indicator"
|
||||
path="/org/gnome/shell/extensions/workspace-indicator/">
|
||||
<key name="embed-previews" type="b">
|
||||
<default>true</default>
|
||||
<summary>Show workspace previews in top bar</summary>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
@@ -1,130 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2011 Erick Pérez Castellanos <erick.red@gmail.com>
|
||||
* SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
.workspace-indicator.previews:active {
|
||||
background-color: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.workspace-indicator.name-label {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17) !important;
|
||||
}
|
||||
.workspace-indicator.name-label:hover,
|
||||
.workspace-indicator.name-label:focus {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28) !important;
|
||||
}
|
||||
.workspace-indicator.name-label:active {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32) !important;
|
||||
}
|
||||
.workspace-indicator.name-label:active:hover {
|
||||
box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.36) !important;
|
||||
}
|
||||
|
||||
.workspace-indicator .status-label {
|
||||
width: 8em;
|
||||
padding: 0 8px;
|
||||
}
|
||||
.workspace-indicator .status-label:ltr { padding-right: 4px; }
|
||||
.workspace-indicator .status-label:rtl { padding-left: 4px; }
|
||||
|
||||
.workspace-indicator .system-status-icon {
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspaces-view.hfade {
|
||||
-st-hfade-offset: 20px;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspaces-box {
|
||||
spacing: 3px;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspace-box {
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.workspace-indicator StButton:first-child:ltr > .workspace-box,
|
||||
.workspace-indicator StButton:last-child:rtl > .workspace-box {
|
||||
padding-left: 5px;
|
||||
}
|
||||
.workspace-indicator StButton:last-child:ltr > .workspace-box,
|
||||
.workspace-indicator StButton:first-child:rtl > .workspace-box {
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspace {
|
||||
border: 1px solid transparent;
|
||||
border-radius: 4px;
|
||||
background-color: #3f3f3f;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspace {
|
||||
width: 52px;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspace.active {
|
||||
border-color: #fff;
|
||||
}
|
||||
|
||||
.workspace-indicator-window-preview {
|
||||
background-color: #bebebe;
|
||||
border: 1px solid #828282;
|
||||
border-radius: 1px;
|
||||
}
|
||||
|
||||
.workspace-indicator-window-preview.active {
|
||||
background-color: #d4d4d4;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu {
|
||||
min-width: 17em;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item.popup-menu-item {
|
||||
padding: 3px 12px;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button {
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:hover {
|
||||
background-color: st-transparentize(white, 90%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:active {
|
||||
background-color: st-transparentize(white, 85%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:checked {
|
||||
color: -st-accent-fg-color;
|
||||
background-color: -st-accent-color;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:checked:hover {
|
||||
background-color: st-lighten(-st-accent-color, 10%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:checked:active {
|
||||
background-color: st-lighten(-st-accent-color, 15%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item StLabel {
|
||||
padding: 0 11px;
|
||||
width: 6.5em;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item StEntry {
|
||||
padding: 9px 9px;
|
||||
width: 6.5em;
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2013 Florian Müllner <fmuellner@gnome.org>
|
||||
* SPDX-FileCopyrightText: 2015 Jakub Steiner <jimmac@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
@import url("stylesheet-dark.css");
|
||||
|
||||
.workspace-indicator.name-label {
|
||||
box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17) !important;
|
||||
}
|
||||
.workspace-indicator.name-label:hover,
|
||||
.workspace-indicator.name-label:focus {
|
||||
box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28) !important;
|
||||
}
|
||||
.workspace-indicator.name-label:active {
|
||||
box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32) !important;
|
||||
}
|
||||
.workspace-indicator.name-label:active:hover {
|
||||
box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.36) !important;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspace {
|
||||
background-color: #ccc;
|
||||
}
|
||||
|
||||
.workspace-indicator .workspace.active {
|
||||
border-color: #888;
|
||||
}
|
||||
|
||||
.workspace-indicator-window-preview {
|
||||
background-color: #ededed;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.workspace-indicator-window-preview.active {
|
||||
background-color: #f6f5f4;
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:hover {
|
||||
background-color: st-transparentize(black, 90%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:active {
|
||||
background-color: st-transparentize(black, 85%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:checked:hover {
|
||||
background-color: st-darken(-st-accent-color, 10%);
|
||||
}
|
||||
|
||||
.workspace-indicator-menu .editable-menu-item .icon-button.flat:checked:active {
|
||||
background-color: st-darken(-st-accent-color, 15%);
|
||||
}
|
||||
35
extensions/workspace-indicator/stylesheet.css
Normal file
35
extensions/workspace-indicator/stylesheet.css
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2011 Erick Pérez Castellanos <erick.red@gmail.com>
|
||||
* SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
.panel-workspace-indicator {
|
||||
padding: 0 8px;
|
||||
}
|
||||
|
||||
.panel-workspace-indicator-box {
|
||||
padding: 4px 0;
|
||||
spacing: 4px;
|
||||
}
|
||||
|
||||
.panel-workspace-indicator-box .workspace {
|
||||
width: 40px;
|
||||
border: 2px solid #000;
|
||||
border-radius: 2px;
|
||||
background-color: #595959;
|
||||
}
|
||||
|
||||
.panel-workspace-indicator-box .workspace.active {
|
||||
border-color: #fff;
|
||||
}
|
||||
|
||||
.workspace-indicator-window-preview {
|
||||
background-color: #bebebe;
|
||||
border: 1px solid #828282;
|
||||
}
|
||||
|
||||
.workspace-indicator-window-preview.active {
|
||||
background-color: #d4d4d4;
|
||||
}
|
||||
@@ -1,695 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2011 Erick Pérez Castellanos <erick.red@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2011 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
// SPDX-FileCopyrightText: 2017 Florian Müllner <fmuellner@gnome.org>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import Clutter from 'gi://Clutter';
|
||||
import Gio from 'gi://Gio';
|
||||
import GObject from 'gi://GObject';
|
||||
import Meta from 'gi://Meta';
|
||||
import Shell from 'gi://Shell';
|
||||
import St from 'gi://St';
|
||||
|
||||
import {Extension, gettext as _} from 'resource:///org/gnome/shell/extensions/extension.js';
|
||||
|
||||
import * as DND from 'resource:///org/gnome/shell/ui/dnd.js';
|
||||
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
|
||||
import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js';
|
||||
import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js';
|
||||
|
||||
const TOOLTIP_OFFSET = 6;
|
||||
const TOOLTIP_ANIMATION_TIME = 150;
|
||||
|
||||
const SCROLL_TIME = 100;
|
||||
|
||||
let baseStyleClassName = '';
|
||||
|
||||
class WindowPreview extends St.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(window) {
|
||||
super({
|
||||
style_class: `${baseStyleClassName}-window-preview`,
|
||||
});
|
||||
|
||||
this._delegate = this;
|
||||
DND.makeDraggable(this, {restoreOnSuccess: true});
|
||||
|
||||
this._window = window;
|
||||
|
||||
this._window.connectObject(
|
||||
'size-changed', () => this._checkRelayout(),
|
||||
'position-changed', () => this._checkRelayout(),
|
||||
'notify::minimized', this._updateVisible.bind(this),
|
||||
'notify::skip-taskbar', this._updateVisible.bind(this),
|
||||
this);
|
||||
this._updateVisible();
|
||||
|
||||
global.display.connectObject('notify::focus-window',
|
||||
this._onFocusChanged.bind(this), this);
|
||||
this._onFocusChanged();
|
||||
}
|
||||
|
||||
// needed for DND
|
||||
get metaWindow() {
|
||||
return this._window;
|
||||
}
|
||||
|
||||
_onFocusChanged() {
|
||||
if (global.display.focus_window === this._window)
|
||||
this.add_style_class_name('active');
|
||||
else
|
||||
this.remove_style_class_name('active');
|
||||
}
|
||||
|
||||
_checkRelayout() {
|
||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
if (this._window.get_frame_rect().overlap(workArea))
|
||||
this.queue_relayout();
|
||||
}
|
||||
|
||||
_updateVisible() {
|
||||
this.visible = !this._window.skip_taskbar &&
|
||||
this._window.showing_on_its_workspace();
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceLayout extends Clutter.LayoutManager {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
vfunc_get_preferred_width() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
vfunc_get_preferred_height() {
|
||||
return [0, 0];
|
||||
}
|
||||
|
||||
vfunc_allocate(container, box) {
|
||||
const monitor = Main.layoutManager.findIndexForActor(container);
|
||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
||||
const hscale = box.get_width() / workArea.width;
|
||||
const vscale = box.get_height() / workArea.height;
|
||||
|
||||
for (const child of container) {
|
||||
const childBox = new Clutter.ActorBox();
|
||||
const frameRect = child.metaWindow.get_frame_rect();
|
||||
childBox.set_size(
|
||||
Math.round(Math.min(frameRect.width, workArea.width) * hscale),
|
||||
Math.round(Math.min(frameRect.height, workArea.height) * vscale));
|
||||
childBox.set_origin(
|
||||
Math.round((frameRect.x - workArea.x) * hscale),
|
||||
Math.round((frameRect.y - workArea.y) * vscale));
|
||||
child.allocate(childBox);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceThumbnail extends St.Button {
|
||||
static [GObject.properties] = {
|
||||
'active': GObject.ParamSpec.boolean(
|
||||
'active', null, null,
|
||||
GObject.ParamFlags.READWRITE,
|
||||
false),
|
||||
};
|
||||
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(index) {
|
||||
super();
|
||||
|
||||
const box = new St.BoxLayout({
|
||||
style_class: 'workspace-box',
|
||||
y_expand: true,
|
||||
orientation: Clutter.Orientation.VERTICAL,
|
||||
});
|
||||
this.set_child(box);
|
||||
|
||||
this._preview = new St.Bin({
|
||||
style_class: 'workspace',
|
||||
child: new Clutter.Actor({
|
||||
layout_manager: new WorkspaceLayout(),
|
||||
clip_to_allocation: true,
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
}),
|
||||
y_expand: true,
|
||||
});
|
||||
box.add_child(this._preview);
|
||||
|
||||
this._tooltip = new St.Label({
|
||||
style_class: 'dash-label',
|
||||
visible: false,
|
||||
});
|
||||
Main.uiGroup.add_child(this._tooltip);
|
||||
|
||||
this.connect('destroy', this._onDestroy.bind(this));
|
||||
this.connect('notify::hover', this._syncTooltip.bind(this));
|
||||
|
||||
this._index = index;
|
||||
this._delegate = this; // needed for DND
|
||||
|
||||
this._windowPreviews = new Map();
|
||||
|
||||
let workspaceManager = global.workspace_manager;
|
||||
this._workspace = workspaceManager.get_workspace_by_index(index);
|
||||
|
||||
this._workspace.bind_property('active',
|
||||
this, 'active',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
|
||||
this._workspace.connectObject(
|
||||
'window-added', (ws, window) => this._addWindow(window),
|
||||
'window-removed', (ws, window) => this._removeWindow(window),
|
||||
this);
|
||||
|
||||
global.display.connectObject('restacked',
|
||||
this._onRestacked.bind(this), this);
|
||||
|
||||
this._workspace.list_windows().forEach(w => this._addWindow(w));
|
||||
this._onRestacked();
|
||||
}
|
||||
|
||||
get active() {
|
||||
return this._preview.has_style_class_name('active');
|
||||
}
|
||||
|
||||
set active(active) {
|
||||
if (active)
|
||||
this._preview.add_style_class_name('active');
|
||||
else
|
||||
this._preview.remove_style_class_name('active');
|
||||
this.notify('active');
|
||||
}
|
||||
|
||||
acceptDrop(source) {
|
||||
if (!source.metaWindow)
|
||||
return false;
|
||||
|
||||
this._moveWindow(source.metaWindow);
|
||||
return true;
|
||||
}
|
||||
|
||||
handleDragOver(source) {
|
||||
if (source.metaWindow)
|
||||
return DND.DragMotionResult.MOVE_DROP;
|
||||
else
|
||||
return DND.DragMotionResult.CONTINUE;
|
||||
}
|
||||
|
||||
_addWindow(window) {
|
||||
if (this._windowPreviews.has(window))
|
||||
return;
|
||||
|
||||
let preview = new WindowPreview(window);
|
||||
preview.connect('clicked', (a, btn) => this.emit('clicked', btn));
|
||||
this._windowPreviews.set(window, preview);
|
||||
this._preview.child.add_child(preview);
|
||||
}
|
||||
|
||||
_removeWindow(window) {
|
||||
let preview = this._windowPreviews.get(window);
|
||||
if (!preview)
|
||||
return;
|
||||
|
||||
this._windowPreviews.delete(window);
|
||||
preview.destroy();
|
||||
}
|
||||
|
||||
_onRestacked() {
|
||||
let lastPreview = null;
|
||||
let windows = global.get_window_actors().map(a => a.meta_window);
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let preview = this._windowPreviews.get(windows[i]);
|
||||
if (!preview)
|
||||
continue;
|
||||
|
||||
this._preview.child.set_child_above_sibling(preview, lastPreview);
|
||||
lastPreview = preview;
|
||||
}
|
||||
}
|
||||
|
||||
_moveWindow(window) {
|
||||
let monitorIndex = Main.layoutManager.findIndexForActor(this);
|
||||
if (monitorIndex !== window.get_monitor())
|
||||
window.move_to_monitor(monitorIndex);
|
||||
window.change_workspace_by_index(this._index, false);
|
||||
}
|
||||
|
||||
on_clicked() {
|
||||
let ws = global.workspace_manager.get_workspace_by_index(this._index);
|
||||
if (ws)
|
||||
ws.activate(global.get_current_time());
|
||||
}
|
||||
|
||||
_syncTooltip() {
|
||||
if (this.hover) {
|
||||
this._tooltip.set({
|
||||
text: Meta.prefs_get_workspace_name(this._index),
|
||||
visible: true,
|
||||
opacity: 0,
|
||||
});
|
||||
|
||||
const [stageX, stageY] = this.get_transformed_position();
|
||||
const [thumbWidth, thumbHeight] = this.allocation.get_size();
|
||||
const [tipWidth, tipHeight] = this._tooltip.get_size();
|
||||
const xOffset = Math.floor((thumbWidth - tipWidth) / 2);
|
||||
const monitor = Main.layoutManager.findMonitorForActor(this);
|
||||
const x = Math.clamp(
|
||||
stageX + xOffset,
|
||||
monitor.x,
|
||||
monitor.x + monitor.width - tipWidth);
|
||||
const y = stageY - monitor.y > thumbHeight + TOOLTIP_OFFSET
|
||||
? stageY - tipHeight - TOOLTIP_OFFSET // show above
|
||||
: stageY + thumbHeight + TOOLTIP_OFFSET; // show below
|
||||
this._tooltip.set_position(x, y);
|
||||
}
|
||||
|
||||
this._tooltip.ease({
|
||||
opacity: this.hover ? 255 : 0,
|
||||
duration: TOOLTIP_ANIMATION_TIME,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => (this._tooltip.visible = this.hover),
|
||||
});
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
this._tooltip.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspacePreviews extends Clutter.Actor {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(params) {
|
||||
super({
|
||||
...params,
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
reactive: true,
|
||||
y_expand: true,
|
||||
});
|
||||
|
||||
this.connect('scroll-event',
|
||||
(a, event) => Main.wm.handleWorkspaceScroll(event));
|
||||
|
||||
const {workspaceManager} = global;
|
||||
|
||||
workspaceManager.connectObject(
|
||||
'notify::n-workspaces', () => this._updateThumbnails(), GObject.ConnectFlags.AFTER,
|
||||
'workspace-switched', () => this._updateScrollPosition(),
|
||||
this);
|
||||
|
||||
this.connect('notify::mapped', () => {
|
||||
if (this.mapped)
|
||||
this._updateScrollPosition();
|
||||
});
|
||||
|
||||
this._thumbnailsBox = new St.BoxLayout({
|
||||
style_class: 'workspaces-box',
|
||||
y_expand: true,
|
||||
});
|
||||
|
||||
this._scrollView = new St.ScrollView({
|
||||
style_class: 'workspaces-view hfade',
|
||||
enable_mouse_scrolling: false,
|
||||
hscrollbar_policy: St.PolicyType.EXTERNAL,
|
||||
vscrollbar_policy: St.PolicyType.NEVER,
|
||||
y_expand: true,
|
||||
child: this._thumbnailsBox,
|
||||
});
|
||||
|
||||
this.add_child(this._scrollView);
|
||||
|
||||
this._updateThumbnails();
|
||||
}
|
||||
|
||||
_updateThumbnails() {
|
||||
const {nWorkspaces} = global.workspace_manager;
|
||||
|
||||
this._thumbnailsBox.destroy_all_children();
|
||||
|
||||
for (let i = 0; i < nWorkspaces; i++)
|
||||
this._thumbnailsBox.add_child(new WorkspaceThumbnail(i));
|
||||
|
||||
if (this.mapped)
|
||||
this._updateScrollPosition();
|
||||
}
|
||||
|
||||
_updateScrollPosition() {
|
||||
const adjustment = this._scrollView.hadjustment;
|
||||
const {upper, pageSize} = adjustment;
|
||||
let {value} = adjustment;
|
||||
|
||||
const activeWorkspace =
|
||||
[...this._thumbnailsBox].find(a => a.active);
|
||||
|
||||
if (!activeWorkspace)
|
||||
return;
|
||||
|
||||
let offset = 0;
|
||||
const hfade = this._scrollView.get_effect('fade');
|
||||
if (hfade)
|
||||
offset = hfade.fade_margins.left;
|
||||
|
||||
let {x1, x2} = activeWorkspace.get_allocation_box();
|
||||
let parent = activeWorkspace.get_parent();
|
||||
while (parent !== this._scrollView) {
|
||||
if (!parent)
|
||||
throw new Error('actor not in scroll view');
|
||||
|
||||
const box = parent.get_allocation_box();
|
||||
x1 += box.x1;
|
||||
x2 += box.x1;
|
||||
parent = parent.get_parent();
|
||||
}
|
||||
|
||||
if (x1 < value + offset)
|
||||
value = Math.max(0, x1 - offset);
|
||||
else if (x2 > value + pageSize - offset)
|
||||
value = Math.min(upper, x2 + offset - pageSize);
|
||||
else
|
||||
return;
|
||||
|
||||
adjustment.ease(value, {
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
duration: SCROLL_TIME,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class EditableMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||
static [GObject.signals] = {
|
||||
'edited': {},
|
||||
};
|
||||
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
style_class: 'editable-menu-item',
|
||||
});
|
||||
this.get_accessible()?.set_description(
|
||||
_('Press %s to edit').format('e'));
|
||||
|
||||
const stack = new Shell.Stack({
|
||||
x_expand: true,
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
});
|
||||
this.add_child(stack);
|
||||
|
||||
this.label = new St.Label({
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
stack.add_child(this.label);
|
||||
this.label_actor = this.label;
|
||||
|
||||
this._entry = new St.Entry({
|
||||
opacity: 0,
|
||||
reactive: false,
|
||||
});
|
||||
stack.add_child(this._entry);
|
||||
|
||||
this.label.bind_property('text',
|
||||
this._entry, 'text',
|
||||
GObject.BindingFlags.DEFAULT);
|
||||
|
||||
this._entry.clutter_text.connect('activate',
|
||||
() => this._stopEditing());
|
||||
|
||||
this._editButton = new St.Button({
|
||||
style_class: 'icon-button flat',
|
||||
icon_name: 'document-edit-symbolic',
|
||||
button_mask: St.ButtonMask.ONE,
|
||||
toggle_mode: true,
|
||||
x_align: Clutter.ActorAlign.END,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
});
|
||||
this.add_child(this._editButton);
|
||||
|
||||
this._editButton.connect('notify::checked', () => {
|
||||
if (this._editButton.checked) {
|
||||
this._editButton.icon_name = 'ornament-check-symbolic';
|
||||
this._startEditing();
|
||||
} else {
|
||||
this._editButton.icon_name = 'document-edit-symbolic';
|
||||
this._stopEditing();
|
||||
}
|
||||
});
|
||||
this.connect('key-release-event', (o, event) => {
|
||||
if (event.get_key_symbol() === Clutter.KEY_e)
|
||||
this._editButton.checked = true;
|
||||
});
|
||||
|
||||
global.stage.connectObject('notify::key-focus', () => {
|
||||
const {keyFocus} = global.stage;
|
||||
if (!keyFocus || !this.contains(keyFocus))
|
||||
this._stopEditing();
|
||||
}, this);
|
||||
}
|
||||
|
||||
_switchActor(from, to) {
|
||||
to.reactive = true;
|
||||
to.ease({
|
||||
opacity: 255,
|
||||
duration: 300,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
});
|
||||
|
||||
from.ease({
|
||||
opacity: 0,
|
||||
duration: 300,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
onComplete: () => {
|
||||
from.reactive = false;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
_startEditing() {
|
||||
this._switchActor(this.label, this._entry);
|
||||
|
||||
this._entry.clutter_text.set_selection(0, -1);
|
||||
this._entry.clutter_text.grab_key_focus();
|
||||
}
|
||||
|
||||
_stopEditing() {
|
||||
if (this.label.text !== this._entry.text) {
|
||||
this.label.text = this._entry.text;
|
||||
this.emit('edited');
|
||||
}
|
||||
|
||||
if (this._editButton.checked)
|
||||
this._editButton.checked = false;
|
||||
|
||||
this._switchActor(this._entry, this.label);
|
||||
this.navigate_focus(this, St.DirectionType.TAB_FORWARD, false);
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspacesMenu extends PopupMenu.PopupMenu {
|
||||
constructor(sourceActor) {
|
||||
super(sourceActor, 0.5, St.Side.TOP);
|
||||
|
||||
this.actor.add_style_class_name(`${baseStyleClassName}-menu`);
|
||||
|
||||
this._workspacesSection = new PopupMenu.PopupMenuSection();
|
||||
this.addMenuItem(this._workspacesSection);
|
||||
|
||||
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this.addAction(_('Settings'), () => {
|
||||
const extension = Extension.lookupByURL(import.meta.url);
|
||||
extension.openPreferences();
|
||||
});
|
||||
|
||||
this._desktopSettings =
|
||||
new Gio.Settings({schema_id: 'org.gnome.desktop.wm.preferences'});
|
||||
this._desktopSettings.connectObject('changed::workspace-names', () => {
|
||||
this._updateWorkspaceLabels();
|
||||
this.emit('active-name-changed');
|
||||
}, this);
|
||||
|
||||
const {workspaceManager} = global;
|
||||
workspaceManager.connectObject(
|
||||
'notify::n-workspaces', () => this._updateWorkspaceItems(),
|
||||
'workspace-switched', () => this._updateActiveIndicator(),
|
||||
this.actor);
|
||||
this._updateWorkspaceItems();
|
||||
}
|
||||
|
||||
get activeName() {
|
||||
const {workspaceManager} = global;
|
||||
const active = workspaceManager.get_active_workspace_index();
|
||||
return Meta.prefs_get_workspace_name(active);
|
||||
}
|
||||
|
||||
_updateWorkspaceItems() {
|
||||
const {workspaceManager} = global;
|
||||
const {nWorkspaces} = workspaceManager;
|
||||
|
||||
const section = this._workspacesSection.actor;
|
||||
while (section.get_n_children() < nWorkspaces) {
|
||||
const item = new EditableMenuItem();
|
||||
item.connect('activate', (o, event) => {
|
||||
const index = [...section].indexOf(item);
|
||||
const workspace = workspaceManager.get_workspace_by_index(index);
|
||||
workspace?.activate(event.get_time());
|
||||
});
|
||||
item.connect('edited', () => {
|
||||
const nLabels = section.get_n_children();
|
||||
const oldNames = this._desktopSettings.get_strv('workspace-names');
|
||||
const newNames = [...section].map(c => c.label.text);
|
||||
this._desktopSettings.set_strv('workspace-names',
|
||||
[...newNames, ...oldNames.slice(nLabels)]);
|
||||
});
|
||||
this._workspacesSection.addMenuItem(item);
|
||||
}
|
||||
|
||||
[...section].splice(nWorkspaces).forEach(item => item.destroy());
|
||||
|
||||
this._updateWorkspaceLabels();
|
||||
this._updateActiveIndicator();
|
||||
}
|
||||
|
||||
_updateWorkspaceLabels() {
|
||||
const items = [...this._workspacesSection.actor];
|
||||
items.forEach(
|
||||
(item, i) => (item.label.text = Meta.prefs_get_workspace_name(i)));
|
||||
}
|
||||
|
||||
_updateActiveIndicator() {
|
||||
const {workspaceManager} = global;
|
||||
const active = workspaceManager.get_active_workspace_index();
|
||||
|
||||
const items = [...this._workspacesSection.actor];
|
||||
items.forEach((item, i) => {
|
||||
item.setOrnament(i === active
|
||||
? PopupMenu.Ornament.CHECK
|
||||
: PopupMenu.Ornament.NONE);
|
||||
});
|
||||
this.emit('active-name-changed');
|
||||
}
|
||||
}
|
||||
|
||||
export class WorkspaceIndicator extends PanelMenu.Button {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(params = {}) {
|
||||
super(0.5, _('Workspace Indicator'), true);
|
||||
|
||||
const {
|
||||
baseStyleClass = 'workspace-indicator',
|
||||
settings,
|
||||
} = params;
|
||||
|
||||
this._settings = settings;
|
||||
|
||||
baseStyleClassName = baseStyleClass;
|
||||
this.add_style_class_name(baseStyleClassName);
|
||||
|
||||
this.setMenu(new WorkspacesMenu(this));
|
||||
|
||||
let container = new St.Widget({
|
||||
layout_manager: new Clutter.BinLayout(),
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
});
|
||||
this.add_child(container);
|
||||
|
||||
this._statusBox = new St.BoxLayout();
|
||||
container.add_child(this._statusBox);
|
||||
|
||||
this._statusLabel = new St.Label({
|
||||
style_class: 'status-label',
|
||||
x_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
text: this.menu.activeName,
|
||||
});
|
||||
this._statusBox.add_child(this._statusLabel);
|
||||
this._statusBox.add_child(new St.Icon({
|
||||
icon_name: 'pan-down-symbolic',
|
||||
style_class: 'system-status-icon',
|
||||
}));
|
||||
|
||||
this.menu.connect('active-name-changed',
|
||||
() => this._statusLabel.set_text(this.menu.activeName));
|
||||
|
||||
this._thumbnails = new WorkspacePreviews();
|
||||
container.add_child(this._thumbnails);
|
||||
|
||||
this._thumbnails.connect('button-press-event', (a, event) => {
|
||||
if (event.get_button() !== Clutter.BUTTON_SECONDARY)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
this.menu.toggle();
|
||||
return Clutter.EVENT_STOP;
|
||||
});
|
||||
|
||||
this.connect('scroll-event',
|
||||
(a, event) => Main.wm.handleWorkspaceScroll(event));
|
||||
|
||||
this._inTopBar = false;
|
||||
this.connect('notify::realized', () => {
|
||||
if (!this.realized)
|
||||
return;
|
||||
|
||||
this._inTopBar = Main.panel.contains(this);
|
||||
this._updateTopBarRedirect();
|
||||
});
|
||||
|
||||
this._settings.connect('changed::embed-previews',
|
||||
() => this._updateThumbnailVisibility());
|
||||
this._updateThumbnailVisibility();
|
||||
}
|
||||
|
||||
_onDestroy() {
|
||||
if (this._inTopBar)
|
||||
Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
this._inTopBar = false;
|
||||
|
||||
super._onDestroy();
|
||||
}
|
||||
|
||||
_updateThumbnailVisibility() {
|
||||
const usePreviews = this._settings.get_boolean('embed-previews');
|
||||
this.reactive = !usePreviews;
|
||||
|
||||
this._thumbnails.visible = usePreviews;
|
||||
this._statusBox.visible = !usePreviews;
|
||||
|
||||
if (usePreviews) {
|
||||
this.add_style_class_name('previews');
|
||||
this.remove_style_class_name('name-label');
|
||||
} else {
|
||||
this.remove_style_class_name('previews');
|
||||
this.add_style_class_name('name-label');
|
||||
}
|
||||
|
||||
this._updateTopBarRedirect();
|
||||
}
|
||||
|
||||
_updateTopBarRedirect() {
|
||||
if (!this._inTopBar)
|
||||
return;
|
||||
|
||||
// Disable offscreen-redirect when showing the workspace switcher
|
||||
// so that clip-to-allocation works
|
||||
Main.panel.set_offscreen_redirect(this._thumbnails.visible
|
||||
? Clutter.OffscreenRedirect.ALWAYS
|
||||
: Clutter.OffscreenRedirect.AUTOMATIC_FOR_OPACITY);
|
||||
}
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2012 Giovanni Campagna <gcampagna@src.gnome.org>
|
||||
// SPDX-FileCopyrightText: 2014 Florian Müllner <fmuellner@gnome.org>
|
||||
//
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
import Adw from 'gi://Adw';
|
||||
import Gio from 'gi://Gio';
|
||||
import GObject from 'gi://GObject';
|
||||
import Gtk from 'gi://Gtk';
|
||||
|
||||
import {gettext as _} from 'resource:///org/gnome/Shell/Extensions/js/extensions/prefs.js';
|
||||
|
||||
class GeneralGroup extends Adw.PreferencesGroup {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(settings) {
|
||||
super({
|
||||
title: _('Indicator'),
|
||||
});
|
||||
|
||||
const previewCheck = new Gtk.CheckButton();
|
||||
const previewRow = new Adw.ActionRow({
|
||||
title: _('Previews'),
|
||||
activatable_widget: previewCheck,
|
||||
});
|
||||
previewRow.add_prefix(previewCheck);
|
||||
this.add(previewRow);
|
||||
|
||||
const nameCheck = new Gtk.CheckButton({
|
||||
group: previewCheck,
|
||||
});
|
||||
const nameRow = new Adw.ActionRow({
|
||||
title: _('Workspace Name'),
|
||||
activatable_widget: nameCheck,
|
||||
});
|
||||
nameRow.add_prefix(nameCheck);
|
||||
this.add(nameRow);
|
||||
|
||||
if (settings.get_boolean('embed-previews'))
|
||||
previewCheck.active = true;
|
||||
else
|
||||
nameCheck.active = true;
|
||||
|
||||
settings.bind('embed-previews',
|
||||
previewCheck, 'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
class BehaviorGroup extends Adw.PreferencesGroup {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super({
|
||||
title: _('Behavior'),
|
||||
});
|
||||
|
||||
const dynamicCheck = new Gtk.CheckButton();
|
||||
const dynamicRow = new Adw.ActionRow({
|
||||
title: _('Dynamic'),
|
||||
subtitle: _('Automatically removes empty workspaces.'),
|
||||
activatable_widget: dynamicCheck,
|
||||
});
|
||||
dynamicRow.add_prefix(dynamicCheck);
|
||||
this.add(dynamicRow);
|
||||
|
||||
const fixedCheck = new Gtk.CheckButton({
|
||||
group: dynamicCheck,
|
||||
});
|
||||
const fixedRow = new Adw.ActionRow({
|
||||
title: _('Fixed Number'),
|
||||
subtitle: _('Specify a number of permanent workspaces.'),
|
||||
activatable_widget: fixedCheck,
|
||||
});
|
||||
fixedRow.add_prefix(fixedCheck);
|
||||
this.add(fixedRow);
|
||||
|
||||
const adjustment = new Gtk.Adjustment({
|
||||
lower: 1,
|
||||
step_increment: 1,
|
||||
value: 4,
|
||||
upper: 36, // hard limit in mutter
|
||||
});
|
||||
const numRow = new Adw.SpinRow({
|
||||
title: _('Number of Workspaces'),
|
||||
adjustment,
|
||||
});
|
||||
this.add(numRow);
|
||||
|
||||
const mutterSettings = new Gio.Settings({
|
||||
schema_id: 'org.gnome.mutter',
|
||||
});
|
||||
|
||||
if (mutterSettings.get_boolean('dynamic-workspaces'))
|
||||
dynamicCheck.active = true;
|
||||
else
|
||||
fixedCheck.active = true;
|
||||
|
||||
mutterSettings.bind('dynamic-workspaces',
|
||||
dynamicCheck, 'active',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
const desktopSettings = new Gio.Settings({
|
||||
schema_id: 'org.gnome.desktop.wm.preferences',
|
||||
});
|
||||
|
||||
desktopSettings.bind('num-workspaces',
|
||||
numRow, 'value',
|
||||
Gio.SettingsBindFlags.DEFAULT);
|
||||
|
||||
fixedCheck.bind_property('active',
|
||||
numRow, 'sensitive',
|
||||
GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
export class WorkspacesPage extends Adw.PreferencesPage {
|
||||
static {
|
||||
GObject.registerClass(this);
|
||||
}
|
||||
|
||||
constructor(settings) {
|
||||
super({
|
||||
title: _('Workspaces'),
|
||||
icon_name: 'view-grid-symbolic',
|
||||
});
|
||||
|
||||
this.add(new GeneralGroup(settings));
|
||||
this.add(new BehaviorGroup());
|
||||
}
|
||||
}
|
||||
@@ -32,4 +32,10 @@ and will be picked automatically at next login.
|
||||
<gnome:userid>fmuellner</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Marge Bot</foaf:name>
|
||||
<gnome:userid>marge-bot</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
|
||||
273
lint/eslintrc-gjs.yml
Normal file
273
lint/eslintrc-gjs.yml
Normal file
@@ -0,0 +1,273 @@
|
||||
---
|
||||
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
|
||||
# SPDX-FileCopyrightText: 2018 Claudio André <claudioandre.br@gmail.com>
|
||||
env:
|
||||
es2021: true
|
||||
extends: 'eslint:recommended'
|
||||
plugins:
|
||||
- jsdoc
|
||||
rules:
|
||||
array-bracket-newline:
|
||||
- error
|
||||
- consistent
|
||||
array-bracket-spacing:
|
||||
- error
|
||||
- never
|
||||
array-callback-return: error
|
||||
arrow-parens:
|
||||
- error
|
||||
- as-needed
|
||||
arrow-spacing: error
|
||||
block-scoped-var: error
|
||||
block-spacing: error
|
||||
brace-style: error
|
||||
# Waiting for this to have matured a bit in eslint
|
||||
# camelcase:
|
||||
# - error
|
||||
# - properties: never
|
||||
# allow: [^vfunc_, ^on_, _instance_init]
|
||||
comma-dangle:
|
||||
- error
|
||||
- arrays: always-multiline
|
||||
objects: always-multiline
|
||||
functions: never
|
||||
comma-spacing:
|
||||
- error
|
||||
- before: false
|
||||
after: true
|
||||
comma-style:
|
||||
- error
|
||||
- last
|
||||
computed-property-spacing: error
|
||||
curly:
|
||||
- error
|
||||
- multi-or-nest
|
||||
- consistent
|
||||
dot-location:
|
||||
- error
|
||||
- property
|
||||
eol-last: error
|
||||
eqeqeq: error
|
||||
func-call-spacing: error
|
||||
func-name-matching: error
|
||||
func-style:
|
||||
- error
|
||||
- declaration
|
||||
- allowArrowFunctions: true
|
||||
indent:
|
||||
- error
|
||||
- 4
|
||||
- ignoredNodes:
|
||||
# Allow not indenting the body of GObject.registerClass, since in the
|
||||
# future it's intended to be a decorator
|
||||
- 'CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child'
|
||||
# Allow dedenting chained member expressions
|
||||
MemberExpression: 'off'
|
||||
jsdoc/check-alignment: error
|
||||
jsdoc/check-param-names: error
|
||||
jsdoc/check-tag-names: error
|
||||
jsdoc/check-types: error
|
||||
jsdoc/implements-on-classes: error
|
||||
jsdoc/tag-lines:
|
||||
- error
|
||||
- any
|
||||
- startLines: 1
|
||||
jsdoc/require-jsdoc: error
|
||||
jsdoc/require-param: error
|
||||
jsdoc/require-param-description: error
|
||||
jsdoc/require-param-name: error
|
||||
jsdoc/require-param-type: error
|
||||
key-spacing:
|
||||
- error
|
||||
- beforeColon: false
|
||||
afterColon: true
|
||||
keyword-spacing:
|
||||
- error
|
||||
- before: true
|
||||
after: true
|
||||
linebreak-style:
|
||||
- error
|
||||
- unix
|
||||
lines-between-class-members:
|
||||
- error
|
||||
- always
|
||||
- exceptAfterSingleLine: true
|
||||
max-nested-callbacks: error
|
||||
max-statements-per-line: error
|
||||
new-parens: error
|
||||
no-array-constructor: error
|
||||
no-await-in-loop: error
|
||||
no-caller: error
|
||||
no-constant-condition:
|
||||
- error
|
||||
- checkLoops: false
|
||||
no-div-regex: error
|
||||
no-empty:
|
||||
- error
|
||||
- allowEmptyCatch: true
|
||||
no-extra-bind: error
|
||||
no-extra-parens:
|
||||
- error
|
||||
- all
|
||||
- conditionalAssign: false
|
||||
nestedBinaryExpressions: false
|
||||
returnAssign: false
|
||||
no-implicit-coercion:
|
||||
- error
|
||||
- allow:
|
||||
- '!!'
|
||||
no-invalid-this: error
|
||||
no-iterator: error
|
||||
no-label-var: error
|
||||
no-lonely-if: error
|
||||
no-loop-func: error
|
||||
no-nested-ternary: error
|
||||
no-new-object: error
|
||||
no-new-wrappers: error
|
||||
no-octal-escape: error
|
||||
no-proto: error
|
||||
no-prototype-builtins: 'off'
|
||||
no-restricted-globals: [error, window]
|
||||
no-restricted-properties:
|
||||
- error
|
||||
- object: imports
|
||||
property: format
|
||||
message: Use template strings
|
||||
- object: pkg
|
||||
property: initFormat
|
||||
message: Use template strings
|
||||
- object: Lang
|
||||
property: copyProperties
|
||||
message: Use Object.assign()
|
||||
- object: Lang
|
||||
property: bind
|
||||
message: Use arrow notation or Function.prototype.bind()
|
||||
- object: Lang
|
||||
property: Class
|
||||
message: Use ES6 classes
|
||||
no-restricted-syntax:
|
||||
- error
|
||||
- selector: >-
|
||||
MethodDefinition[key.name="_init"] >
|
||||
FunctionExpression[params.length=1] >
|
||||
BlockStatement[body.length=1]
|
||||
CallExpression[arguments.length=1][callee.object.type="Super"][callee.property.name="_init"] >
|
||||
Identifier:first-child
|
||||
message: _init() that only calls super._init() is unnecessary
|
||||
- selector: >-
|
||||
MethodDefinition[key.name="_init"] >
|
||||
FunctionExpression[params.length=0] >
|
||||
BlockStatement[body.length=1]
|
||||
CallExpression[arguments.length=0][callee.object.type="Super"][callee.property.name="_init"]
|
||||
message: _init() that only calls super._init() is unnecessary
|
||||
- selector: BinaryExpression[operator="instanceof"][right.name="Array"]
|
||||
message: Use Array.isArray()
|
||||
no-return-assign: error
|
||||
no-return-await: error
|
||||
no-self-compare: error
|
||||
no-shadow: error
|
||||
no-shadow-restricted-names: error
|
||||
no-spaced-func: error
|
||||
no-tabs: error
|
||||
no-template-curly-in-string: error
|
||||
no-throw-literal: error
|
||||
no-trailing-spaces: error
|
||||
no-undef-init: error
|
||||
no-unneeded-ternary: error
|
||||
no-unused-expressions: error
|
||||
no-unused-vars:
|
||||
- error
|
||||
# Vars use a suffix _ instead of a prefix because of file-scope private vars
|
||||
- varsIgnorePattern: (^unused|_$)
|
||||
argsIgnorePattern: ^(unused|_)
|
||||
no-useless-call: error
|
||||
no-useless-computed-key: error
|
||||
no-useless-concat: error
|
||||
no-useless-constructor: error
|
||||
no-useless-rename: error
|
||||
no-useless-return: error
|
||||
no-whitespace-before-property: error
|
||||
no-with: error
|
||||
nonblock-statement-body-position:
|
||||
- error
|
||||
- below
|
||||
object-curly-newline:
|
||||
- error
|
||||
- consistent: true
|
||||
multiline: true
|
||||
object-curly-spacing: error
|
||||
object-shorthand: error
|
||||
operator-assignment: error
|
||||
operator-linebreak: error
|
||||
padded-blocks:
|
||||
- error
|
||||
- never
|
||||
# These may be a bit controversial, we can try them out and enable them later
|
||||
# prefer-const: error
|
||||
# prefer-destructuring: error
|
||||
prefer-numeric-literals: error
|
||||
prefer-promise-reject-errors: error
|
||||
prefer-rest-params: error
|
||||
prefer-spread: error
|
||||
prefer-template: error
|
||||
quotes:
|
||||
- error
|
||||
- single
|
||||
- avoidEscape: true
|
||||
require-await: error
|
||||
rest-spread-spacing: error
|
||||
semi:
|
||||
- error
|
||||
- always
|
||||
semi-spacing:
|
||||
- error
|
||||
- before: false
|
||||
after: true
|
||||
semi-style: error
|
||||
space-before-blocks: error
|
||||
space-before-function-paren:
|
||||
- error
|
||||
- named: never
|
||||
# for `function ()` and `async () =>`, preserve space around keywords
|
||||
anonymous: always
|
||||
asyncArrow: always
|
||||
space-in-parens: error
|
||||
space-infix-ops:
|
||||
- error
|
||||
- int32Hint: false
|
||||
space-unary-ops: error
|
||||
spaced-comment: error
|
||||
switch-colon-spacing: error
|
||||
symbol-description: error
|
||||
template-curly-spacing: error
|
||||
template-tag-spacing: error
|
||||
unicode-bom: error
|
||||
wrap-iife:
|
||||
- error
|
||||
- inside
|
||||
yield-star-spacing: error
|
||||
yoda: error
|
||||
settings:
|
||||
jsdoc:
|
||||
mode: typescript
|
||||
globals:
|
||||
ARGV: readonly
|
||||
Debugger: readonly
|
||||
GIRepositoryGType: readonly
|
||||
globalThis: readonly
|
||||
imports: readonly
|
||||
Intl: readonly
|
||||
log: readonly
|
||||
logError: readonly
|
||||
print: readonly
|
||||
printerr: readonly
|
||||
window: readonly
|
||||
TextEncoder: readonly
|
||||
TextDecoder: readonly
|
||||
console: readonly
|
||||
setTimeout: readonly
|
||||
setInterval: readonly
|
||||
clearTimeout: readonly
|
||||
clearInterval: readonly
|
||||
parserOptions:
|
||||
ecmaVersion: 2022
|
||||
24
lint/eslintrc-shell.yml
Normal file
24
lint/eslintrc-shell.yml
Normal file
@@ -0,0 +1,24 @@
|
||||
# SPDX-FileCopyrightText: 2019 Florian Müllner <fmuellner@gnome.org>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
|
||||
|
||||
rules:
|
||||
camelcase:
|
||||
- error
|
||||
- properties: never
|
||||
allow: [^vfunc_, ^on_]
|
||||
consistent-return: error
|
||||
eqeqeq:
|
||||
- error
|
||||
- smart
|
||||
prefer-arrow-callback: error
|
||||
jsdoc/require-param-description: off
|
||||
jsdoc/require-jsdoc:
|
||||
- error
|
||||
- exemptEmptyFunctions: true
|
||||
publicOnly:
|
||||
esm: true
|
||||
globals:
|
||||
global: readonly
|
||||
parserOptions:
|
||||
sourceType: module
|
||||
52
meson.build
52
meson.build
@@ -2,11 +2,10 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
project(
|
||||
'gnome-shell-extensions',
|
||||
version: '49.beta',
|
||||
meson_version: '>= 1.1.0',
|
||||
license: 'GPL-2.0-or-later',
|
||||
project('gnome-shell-extensions',
|
||||
version: '45.2',
|
||||
meson_version: '>= 0.58.0',
|
||||
license: 'GPL2+'
|
||||
)
|
||||
|
||||
gettext_domain = meson.project_name()
|
||||
@@ -31,13 +30,11 @@ shell_version = ver_arr[0]
|
||||
|
||||
uuid_suffix = '@gnome-shell-extensions.gcampax.github.com'
|
||||
|
||||
have_x11 = get_option('x11')
|
||||
|
||||
classic_extensions = [
|
||||
'apps-menu',
|
||||
'places-menu',
|
||||
'launch-new-instance',
|
||||
'window-list',
|
||||
'window-list'
|
||||
]
|
||||
|
||||
default_extensions = classic_extensions
|
||||
@@ -45,14 +42,16 @@ default_extensions += [
|
||||
'drive-menu',
|
||||
'light-style',
|
||||
'screenshot-window-sizer',
|
||||
'status-icons',
|
||||
'system-monitor',
|
||||
'windowsNavigator',
|
||||
'workspace-indicator',
|
||||
'workspace-indicator'
|
||||
]
|
||||
|
||||
all_extensions = default_extensions
|
||||
all_extensions += ['auto-move-windows', 'native-window-placement', 'user-theme']
|
||||
all_extensions += [
|
||||
'auto-move-windows',
|
||||
'native-window-placement',
|
||||
'user-theme'
|
||||
]
|
||||
|
||||
enabled_extensions = get_option('enable_extensions')
|
||||
|
||||
@@ -71,10 +70,11 @@ endif
|
||||
classic_mode_enabled = get_option('classic_mode')
|
||||
|
||||
if classic_mode_enabled
|
||||
# Sanity check: Make sure all classic extensions are enabled
|
||||
# Sanity check: Make sure all classic extensions are enabled
|
||||
foreach e : classic_extensions
|
||||
if not enabled_extensions.contains(e)
|
||||
error(f'Classic mode is enabled, but the required extension @e@ is not')
|
||||
error('Classic mode is enabled, ' +
|
||||
'but the required extension @0@ is not.'.format(e))
|
||||
endif
|
||||
endforeach
|
||||
endif
|
||||
@@ -82,30 +82,32 @@ endif
|
||||
# Sanity check: Make sure enabled extensions are valid
|
||||
foreach e : enabled_extensions
|
||||
if not all_extensions.contains(e)
|
||||
error(f'Invalid extension @e@.')
|
||||
error('Invalid extension @0@.'.format(e))
|
||||
endif
|
||||
endforeach
|
||||
|
||||
if classic_mode_enabled
|
||||
subdir('data')
|
||||
if have_x11
|
||||
meson.add_install_script(
|
||||
'build-aux/session-post-install.py',
|
||||
join_paths(get_option('prefix'), datadir),
|
||||
)
|
||||
endif
|
||||
meson.add_install_script(
|
||||
'meson/session-post-install.py',
|
||||
join_paths(get_option('prefix'), datadir)
|
||||
)
|
||||
endif
|
||||
|
||||
subdir('extensions')
|
||||
subdir('po')
|
||||
|
||||
gnome.post_install(glib_compile_schemas: true)
|
||||
gnome.post_install(
|
||||
glib_compile_schemas: true,
|
||||
)
|
||||
|
||||
meson.add_dist_script('build-aux/check-version.py', meson.project_version(), 'NEWS')
|
||||
meson.add_dist_script('meson/check-version.py',
|
||||
meson.project_version(),
|
||||
'NEWS')
|
||||
|
||||
summary_options = {
|
||||
'extensions': enabled_extensions,
|
||||
'classic_mode': get_option('classic_mode'),
|
||||
'extensions': enabled_extensions,
|
||||
'classic_mode': get_option('classic_mode'),
|
||||
}
|
||||
|
||||
summary_dirs = {
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
|
||||
import os, sys
|
||||
from pathlib import Path
|
||||
from xml.etree.ElementTree import ElementTree
|
||||
import argparse
|
||||
import argparse, subprocess
|
||||
|
||||
def check_version(version, file, type='news'):
|
||||
if type == 'news':
|
||||
@@ -17,11 +16,8 @@ def check_version(version, file, type='news'):
|
||||
if not ok:
|
||||
raise Exception("{} does not start with {}".format(file, version))
|
||||
elif type == 'metainfo':
|
||||
query = './releases/release[@version="{}"]'.format(version)
|
||||
ok = ElementTree(file=file).find(query) is not None
|
||||
print("{}: {}".format(file, "OK" if ok else "FAILED"))
|
||||
if not ok:
|
||||
raise Exception("{} does not contain release {}".format(file, version))
|
||||
subprocess.run(['appstream-util', 'validate-version', file, version],
|
||||
check=True)
|
||||
else:
|
||||
raise Exception('Not implemented')
|
||||
|
||||
@@ -15,10 +15,10 @@ else:
|
||||
|
||||
# FIXME: Meson is unable to copy a generated target file:
|
||||
# https://groups.google.com/forum/#!topic/mesonbuild/3iIoYPrN4P0
|
||||
dst_dir = os.path.join(install_root, 'xsessions')
|
||||
dst_dir = os.path.join(install_root, 'wayland-sessions')
|
||||
if not os.path.exists(dst_dir):
|
||||
os.makedirs(dst_dir)
|
||||
|
||||
src = os.path.join(install_root, 'wayland-sessions', 'gnome-classic.desktop')
|
||||
src = os.path.join(install_root, 'xsessions', 'gnome-classic.desktop')
|
||||
dst = os.path.join(dst_dir, 'gnome-classic.desktop')
|
||||
shutil.copyfile(src, dst)
|
||||
@@ -20,9 +20,3 @@ option('classic_mode',
|
||||
value: false,
|
||||
description: 'Enable installing data files for classic mode.'
|
||||
)
|
||||
|
||||
option('x11',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Enable X11 session support.'
|
||||
)
|
||||
@@ -29,7 +29,6 @@ he
|
||||
hi
|
||||
hr
|
||||
hu
|
||||
ia
|
||||
id
|
||||
is
|
||||
it
|
||||
|
||||
@@ -11,13 +11,11 @@ extensions/native-window-placement/org.gnome.shell.extensions.native-window-plac
|
||||
extensions/places-menu/extension.js
|
||||
extensions/places-menu/placeDisplay.js
|
||||
extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml
|
||||
extensions/system-monitor/extension.js
|
||||
extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml
|
||||
extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml
|
||||
extensions/window-list/extension.js
|
||||
extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml
|
||||
extensions/window-list/prefs.js
|
||||
extensions/window-list/workspaceIndicator.js
|
||||
extensions/windowsNavigator/extension.js
|
||||
extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml
|
||||
extensions/workspace-indicator/workspaceIndicator.js
|
||||
extensions/workspace-indicator/workspacePrefs.js
|
||||
extensions/workspace-indicator/extension.js
|
||||
extensions/workspace-indicator/prefs.js
|
||||
|
||||
289
po/be.po
289
po/be.po
@@ -8,17 +8,17 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2025-06-18 23:32+0000\n"
|
||||
"PO-Revision-Date: 2025-06-21 15:51+0300\n"
|
||||
"Last-Translator: Yuras Shumovich <shumovichy@gmail.com>\n"
|
||||
"POT-Creation-Date: 2022-07-10 12:54+0000\n"
|
||||
"PO-Revision-Date: 2022-10-19 15:20+0300\n"
|
||||
"Last-Translator: Launchpad translators\n"
|
||||
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
|
||||
"Language: be\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"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"
|
||||
"X-Generator: Poedit 3.5\n"
|
||||
"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"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
@@ -41,15 +41,15 @@ msgstr "Класічны GNOME на Xorg"
|
||||
msgid "Favorites"
|
||||
msgstr "Абраныя"
|
||||
|
||||
#: extensions/apps-menu/extension.js:392
|
||||
msgid "Apps"
|
||||
#: extensions/apps-menu/extension.js:379
|
||||
msgid "Applications"
|
||||
msgstr "Праграмы"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:12
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Праграма і спіс працоўных прастор"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:13
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -57,230 +57,151 @@ msgstr ""
|
||||
"Спіс радкоў, кожны з якіх змяшчае ідэнтыфікатар праграмы (імя файла *."
|
||||
"desktop), затым двукроп'е і нумар працоўнай прасторы"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:156
|
||||
#: extensions/auto-move-windows/prefs.js:152
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Правілы для працоўнай прасторы"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:311
|
||||
#: extensions/auto-move-windows/prefs.js:306
|
||||
msgid "Add Rule"
|
||||
msgstr "Дадаць правіла"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:123
|
||||
#: extensions/places-menu/placeDisplay.js:186
|
||||
#: extensions/drive-menu/extension.js:126
|
||||
#: extensions/places-menu/placeDisplay.js:210
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "Не ўдалося выняць дыск «%s»:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:142
|
||||
#: extensions/drive-menu/extension.js:145
|
||||
msgid "Removable devices"
|
||||
msgstr "Здымныя прылады"
|
||||
|
||||
#: extensions/drive-menu/extension.js:164
|
||||
#: extensions/drive-menu/extension.js:167
|
||||
msgid "Open Files"
|
||||
msgstr "Адкрыць файлы"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Выкарыстоўваць большую плошчу экрана для вокнаў"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
"This setting applies only with the natural placement strategy."
|
||||
msgstr ""
|
||||
"Спрабаваць выкарыстаць большую плошчу экрана для размяшчэння мініяцюр праз "
|
||||
"змяненне суадносін бакоў экрана, ушчыльняючы іх, каб зменшыць памеры "
|
||||
"змяненне суадносін бакоў экрана, ўшчыльняючы іх, каб зменшыць памеры "
|
||||
"абмежавальнай рамкі. Гэты параметр ужываецца толькі з натуральным "
|
||||
"размяшчэннем мініяцюр."
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:17
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Размяшчаць подпіс акна зверху"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:18
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
"restarting the shell to have any effect."
|
||||
msgstr ""
|
||||
"Калі выбрана, подпіс акна будзе над мініяцюрай, а не пад ёй (як "
|
||||
"Калі выбрана, подпіс акна будзе над мініяцюрай, а не пад ей (як "
|
||||
"перадвызначана). Каб змена налады ўступіла ў сілу, трэба перазапусціць "
|
||||
"абалонку."
|
||||
|
||||
#: extensions/places-menu/extension.js:75
|
||||
#: extensions/places-menu/extension.js:78
|
||||
#: extensions/places-menu/extension.js:94
|
||||
#: extensions/places-menu/extension.js:97
|
||||
msgid "Places"
|
||||
msgstr "Месцы"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:52
|
||||
#: extensions/places-menu/placeDisplay.js:49
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Не ўдалося запусціць «%s»"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:67
|
||||
#: extensions/places-menu/placeDisplay.js:64
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "Не ўдалося прымацаваць том для «%s»."
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:315
|
||||
#: extensions/places-menu/placeDisplay.js:125
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
msgid "Computer"
|
||||
msgstr "Камп'ютар"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:336
|
||||
msgid "Home"
|
||||
msgstr "Хатняя папка"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:321
|
||||
msgid "Recent"
|
||||
msgstr "Нядаўнія"
|
||||
#: extensions/places-menu/placeDisplay.js:381
|
||||
msgid "Browse Network"
|
||||
msgstr "Агляд сеткі"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:327
|
||||
msgid "Starred"
|
||||
msgstr "Абраныя"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:347
|
||||
msgid "Network"
|
||||
msgstr "Сетка"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:354
|
||||
msgid "Trash"
|
||||
msgstr "Сметніца"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
||||
msgid "Cycle Screenshot Sizes"
|
||||
msgstr "Паслядоўнасць змены памераў для здымка экрана"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:18
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
||||
msgid "Cycle Screenshot Sizes Backward"
|
||||
msgstr "Адваротная паслядоўнасць змены памераў для здымка экрана"
|
||||
|
||||
#: extensions/system-monitor/extension.js:135
|
||||
msgid "CPU stats"
|
||||
msgstr "Статыстыка выкарыстання працэсара"
|
||||
|
||||
#: extensions/system-monitor/extension.js:159
|
||||
msgid "Memory stats"
|
||||
msgstr "Статыстыка выкарыстання памяці"
|
||||
|
||||
#: extensions/system-monitor/extension.js:177
|
||||
msgid "Swap stats"
|
||||
msgstr "Статыстыка выкарыстання своп"
|
||||
|
||||
#: extensions/system-monitor/extension.js:336
|
||||
msgid "Upload stats"
|
||||
msgstr "Статыстыка адпраўлення даных"
|
||||
|
||||
#: extensions/system-monitor/extension.js:350
|
||||
msgid "Download stats"
|
||||
msgstr "Статыстыка атрымання даных"
|
||||
|
||||
#: extensions/system-monitor/extension.js:364
|
||||
msgid "System stats"
|
||||
msgstr "Статыстыка сістэмы"
|
||||
|
||||
#: extensions/system-monitor/extension.js:412
|
||||
msgid "Show"
|
||||
msgstr "Паказваць"
|
||||
|
||||
#: extensions/system-monitor/extension.js:414
|
||||
msgid "CPU"
|
||||
msgstr "Працэсар"
|
||||
|
||||
#: extensions/system-monitor/extension.js:416
|
||||
msgid "Memory"
|
||||
msgstr "Памяць"
|
||||
|
||||
#: extensions/system-monitor/extension.js:418
|
||||
msgid "Swap"
|
||||
msgstr "Своп"
|
||||
|
||||
#: extensions/system-monitor/extension.js:420
|
||||
msgid "Upload"
|
||||
msgstr "Атрыманне"
|
||||
|
||||
#: extensions/system-monitor/extension.js:422
|
||||
msgid "Download"
|
||||
msgstr "Адпраўленне"
|
||||
|
||||
#: extensions/system-monitor/extension.js:427
|
||||
msgid "Open System Monitor"
|
||||
msgstr "Адкрыць сістэмны манітор"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:12
|
||||
msgid "Show CPU usage"
|
||||
msgstr "Паказваць выкарыстанне працэсара"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:16
|
||||
msgid "Show memory usage"
|
||||
msgstr "Паказваць выкарыстанне памяці"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:20
|
||||
msgid "Show swap usage"
|
||||
msgstr "Паказваць выкарыстанне своп"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:24
|
||||
msgid "Show upload"
|
||||
msgstr "Паказваць атрыманне даных"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:28
|
||||
msgid "Show download"
|
||||
msgstr "Паказваць адпраўленне даных"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:11
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
||||
msgid "Theme name"
|
||||
msgstr "Назва тэмы"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:12
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "Назва тэмы, што загрузіцца з ~/.themes/name/gnome-shell"
|
||||
|
||||
#: extensions/window-list/extension.js:98
|
||||
#: extensions/window-list/extension.js:72
|
||||
msgid "Close"
|
||||
msgstr "Закрыць"
|
||||
|
||||
#: extensions/window-list/extension.js:125
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Unminimize"
|
||||
msgstr "Скасаваць згортванне"
|
||||
|
||||
#: extensions/window-list/extension.js:125
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Minimize"
|
||||
msgstr "Згарнуць"
|
||||
|
||||
#: extensions/window-list/extension.js:130
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Unmaximize"
|
||||
msgstr "Скасаваць разгортванне"
|
||||
|
||||
#: extensions/window-list/extension.js:130
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Maximize"
|
||||
msgstr "Разгарнуць"
|
||||
|
||||
#: extensions/window-list/extension.js:720
|
||||
#: extensions/window-list/extension.js:483
|
||||
msgid "Minimize all"
|
||||
msgstr "Згарнуць усе"
|
||||
|
||||
#: extensions/window-list/extension.js:726
|
||||
#: extensions/window-list/extension.js:489
|
||||
msgid "Unminimize all"
|
||||
msgstr "Скасаваць згортванне для ўсіх"
|
||||
|
||||
#: extensions/window-list/extension.js:732
|
||||
#: extensions/window-list/extension.js:495
|
||||
msgid "Maximize all"
|
||||
msgstr "Разгарнуць усе"
|
||||
|
||||
#: extensions/window-list/extension.js:740
|
||||
#: extensions/window-list/extension.js:503
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Скасаваць разгортванне для ўсіх"
|
||||
|
||||
#: extensions/window-list/extension.js:748
|
||||
#: extensions/window-list/extension.js:511
|
||||
msgid "Close all"
|
||||
msgstr "Закрыць усе"
|
||||
|
||||
#: extensions/window-list/extension.js:1000 extensions/window-list/prefs.js:23
|
||||
#: extensions/window-list/extension.js:795
|
||||
msgid "Window List"
|
||||
msgstr "Спіс вокнаў"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:18
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
||||
msgid "When to group windows"
|
||||
msgstr "Умовы групавання вокнаў"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:19
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
@@ -288,125 +209,63 @@ msgstr ""
|
||||
"Вызначае калі групаваць вокны адной праграмы ў спісе вокнаў. Магчымыя "
|
||||
"значэнні: «never» (ніколі), «auto» (аўтаматычна), «always» (заўсёды)."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
|
||||
#: extensions/window-list/prefs.js:74
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:79
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Паказваць вокны з усіх працоўных прастор"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||
msgid "Whether to show windows from all workspaces or only the current one."
|
||||
msgstr "Паказваць вокны з усіх працоўных прастор ці толькі з бягучай."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:33
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
msgid "Show the window list on all monitors"
|
||||
msgstr "Паказваць спіс вокнаў на ўсіх маніторах"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:34
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
|
||||
msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
msgstr ""
|
||||
"Паказваць спіс вокнаў на ўсіх падлучаных маніторах ці толькі на асноўным."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:41
|
||||
msgid "Show workspace previews in window list"
|
||||
msgstr "Паказваць папярэдні прагляд працоўных прастор у спісе акон"
|
||||
|
||||
#: extensions/window-list/prefs.js:41
|
||||
#: extensions/window-list/prefs.js:35
|
||||
msgid "Window Grouping"
|
||||
msgstr "Групаванне вокнаў"
|
||||
|
||||
#: extensions/window-list/prefs.js:46
|
||||
#: extensions/window-list/prefs.js:40
|
||||
msgid "Never group windows"
|
||||
msgstr "Ніколі не групаваць вокны"
|
||||
|
||||
#: extensions/window-list/prefs.js:47
|
||||
#: extensions/window-list/prefs.js:41
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Групаваць вокны калі не хапае месца"
|
||||
|
||||
#: extensions/window-list/prefs.js:48
|
||||
#: extensions/window-list/prefs.js:42
|
||||
msgid "Always group windows"
|
||||
msgstr "Заўсёды групаваць вокны"
|
||||
|
||||
#: extensions/window-list/prefs.js:68
|
||||
#: extensions/window-list/prefs.js:66
|
||||
msgid "Show on all monitors"
|
||||
msgstr "Паказваць на ўсіх маніторах"
|
||||
|
||||
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
|
||||
msgid "Show workspace previews in top bar"
|
||||
msgstr "Паказваць папярэдні прагляд працоўных прастор у верхняй панэлі"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:404
|
||||
#, javascript-format
|
||||
msgid "Press %s to edit"
|
||||
msgstr "Націсніце %s, каб змяніць"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:512
|
||||
msgid "Settings"
|
||||
msgstr "Налады"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:592
|
||||
#: extensions/window-list/workspaceIndicator.js:261
|
||||
#: extensions/workspace-indicator/extension.js:266
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Індыкатар працоўнай прасторы"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:20
|
||||
msgid "Indicator"
|
||||
msgstr "Індыкатар"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:25
|
||||
msgid "Previews"
|
||||
msgstr "Перадпрагляд"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:35
|
||||
msgid "Workspace Name"
|
||||
msgstr "Назва працоўнай прасторы"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:59
|
||||
msgid "Behavior"
|
||||
msgstr "Паводзіны"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:64
|
||||
msgid "Dynamic"
|
||||
msgstr "Дынамічная"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:65
|
||||
msgid "Automatically removes empty workspaces."
|
||||
msgstr "Пустыя працоўныя прасторы выдаляюцца аўтаматычна."
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:75
|
||||
msgid "Fixed Number"
|
||||
msgstr "Фіксаваная колькасць'"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:76
|
||||
msgid "Specify a number of permanent workspaces."
|
||||
msgstr "Вызначыце колькасць пастаянных працоўных прастор."
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:89
|
||||
msgid "Number of Workspaces"
|
||||
msgstr "Колькасць працоўных прастор"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:128
|
||||
msgid "Workspaces"
|
||||
msgstr "Працоўныя прасторы"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:62
|
||||
#, javascript-format
|
||||
#~ msgid "Workspace %d"
|
||||
#~ msgstr "Працоўная прастора %d"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Працоўная прастора %d"
|
||||
|
||||
#~ msgid "Add Workspace"
|
||||
#~ msgstr "Дадаць працоўную прастору"
|
||||
#: extensions/workspace-indicator/prefs.js:129
|
||||
msgid "Workspace Names"
|
||||
msgstr "Назвы працоўных прастор"
|
||||
|
||||
#~ msgid "Remove"
|
||||
#~ msgstr "Выдаліць"
|
||||
|
||||
#~ msgid "Computer"
|
||||
#~ msgstr "Камп'ютар"
|
||||
|
||||
#~ msgid "Show workspace previews"
|
||||
#~ msgstr "Паказваць папярэдні прагляд працоўных прастор"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Праграмы"
|
||||
#: extensions/workspace-indicator/prefs.js:255
|
||||
msgid "Add Workspace"
|
||||
msgstr "Дадаць працоўную прастору"
|
||||
|
||||
#~ msgid "Attach modal dialog to the parent window"
|
||||
#~ msgstr "Прымацаваць мадальны дыялог да бацькоўскага акна"
|
||||
@@ -469,7 +328,7 @@ msgstr "Працоўныя прасторы"
|
||||
#~ "If not empty, it contains the text that will be shown when clicking on "
|
||||
#~ "the panel."
|
||||
#~ msgstr ""
|
||||
#~ "Калі не пуста, змяшчае тэкст, які будзе паказвацца пры націсканні на "
|
||||
#~ "Калі не пуста, ўтрымлівае тэкст, які будзе паказвацца пры націсканні на "
|
||||
#~ "панэль."
|
||||
|
||||
#~ msgid "Message"
|
||||
|
||||
224
po/bg.po
224
po/bg.po
@@ -1,28 +1,24 @@
|
||||
# Bulgarian translation for gnome-shell-extensions po-file.
|
||||
# Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc.
|
||||
# Copyright (C) 2021, 2022 Alexander Shopov <ash@kambanaria.org>.
|
||||
# Copyright (C) 2024 twlvnn kraftwerk <kraft_werk@tutanota.com>.
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
# Ivaylo Valkov <ivaylo@e-valkov.org>, 2014.
|
||||
# Alexander Shopov <ash@kambanaria.org>, 2014, 2015, 2021, 2022.
|
||||
# Lyubomir Vasilev <lyubomirv@abv.bg>, 2017.
|
||||
# twlvnn kraftwerk <kraft_werk@tutanota.com>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions main\n"
|
||||
"Project-Id-Version: gnome-shell-extensions master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2024-09-01 12:03+0000\n"
|
||||
"PO-Revision-Date: 2024-09-02 10:49+0200\n"
|
||||
"Last-Translator: twlvnn kraftwerk <kraft_werk@tutanota.com>\n"
|
||||
"Language-Team: Bulgarian <dict@ludost.net>\n"
|
||||
"POT-Creation-Date: 2022-02-12 20:25+0000\n"
|
||||
"PO-Revision-Date: 2022-02-13 11:40+0100\n"
|
||||
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
|
||||
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
|
||||
"Language: bg\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
"X-Generator: Gtranslator 46.1\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
@@ -41,19 +37,19 @@ msgstr "Класически GNOME в Wayland"
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "Класически GNOME в Xorg"
|
||||
|
||||
#: extensions/apps-menu/extension.js:126
|
||||
#: extensions/apps-menu/extension.js:112
|
||||
msgid "Favorites"
|
||||
msgstr "Любими"
|
||||
|
||||
#: extensions/apps-menu/extension.js:400
|
||||
msgid "Apps"
|
||||
#: extensions/apps-menu/extension.js:370
|
||||
msgid "Applications"
|
||||
msgstr "Програми"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:12
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Списък с програмите и работните плотове"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:13
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -61,34 +57,34 @@ msgstr ""
|
||||
"Списък от низове. Всеки съдържа идентификатор на програма (име на файл „."
|
||||
"desktop“), следван от знака „:“ и номер на работен плот"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:159
|
||||
#: extensions/auto-move-windows/prefs.js:19
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Правила за работните плотове"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:314
|
||||
#: extensions/auto-move-windows/prefs.js:245
|
||||
msgid "Add Rule"
|
||||
msgstr "Добавяне на правило"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:123
|
||||
#: extensions/places-menu/placeDisplay.js:218
|
||||
#: extensions/places-menu/placeDisplay.js:210
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "Неуспешно изваждане на устройство „%s“:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:142
|
||||
#: extensions/drive-menu/extension.js:139
|
||||
msgid "Removable devices"
|
||||
msgstr "Преносими медии"
|
||||
|
||||
#: extensions/drive-menu/extension.js:164
|
||||
#: extensions/drive-menu/extension.js:161
|
||||
msgid "Open Files"
|
||||
msgstr "Отваряне на файлове"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Повече пространство за прозорците"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
@@ -99,11 +95,11 @@ msgstr ""
|
||||
"смаляване на обхващащия ги правоъгълник. Тази настройка се прилага само при "
|
||||
"естествената стратегия за поставяне на прозорците."
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:17
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Заглавия на прозорците отгоре"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:18
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
@@ -113,195 +109,123 @@ msgstr ""
|
||||
"им, а не както е стандартно — отдолу. За прилагане на промяната на "
|
||||
"настройката трябва да рестартирате обвивката на GNOME."
|
||||
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
#: extensions/places-menu/extension.js:94
|
||||
msgid "Places"
|
||||
msgstr "Места"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:60
|
||||
#: extensions/places-menu/placeDisplay.js:49
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Неуспешно стартиране на „%s“"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:75
|
||||
#: extensions/places-menu/placeDisplay.js:64
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "Неуспешно монтиране на тома „%s“"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:135
|
||||
#: extensions/places-menu/placeDisplay.js:158
|
||||
#: extensions/places-menu/placeDisplay.js:125
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
msgid "Computer"
|
||||
msgstr "Компютър"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:333
|
||||
#: extensions/places-menu/placeDisplay.js:336
|
||||
msgid "Home"
|
||||
msgstr "Домашна папка"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:378
|
||||
#: extensions/places-menu/placeDisplay.js:381
|
||||
msgid "Browse Network"
|
||||
msgstr "Мрежа"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
||||
msgid "Cycle Screenshot Sizes"
|
||||
msgstr "Смяна на размерите на снимката на екрана"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:18
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
||||
msgid "Cycle Screenshot Sizes Backward"
|
||||
msgstr "Смяна на размерите на снимката на екрана наобратно"
|
||||
|
||||
#: extensions/system-monitor/extension.js:135
|
||||
msgid "CPU stats"
|
||||
msgstr "Статистика на ЦП"
|
||||
|
||||
#: extensions/system-monitor/extension.js:159
|
||||
msgid "Memory stats"
|
||||
msgstr "Статистика на паметта"
|
||||
|
||||
#: extensions/system-monitor/extension.js:177
|
||||
msgid "Swap stats"
|
||||
msgstr "Статистика на виртуалната памет"
|
||||
|
||||
#: extensions/system-monitor/extension.js:336
|
||||
msgid "Upload stats"
|
||||
msgstr "Статистика на качване"
|
||||
|
||||
#: extensions/system-monitor/extension.js:350
|
||||
msgid "Download stats"
|
||||
msgstr "Статистика на изтегляне"
|
||||
|
||||
#: extensions/system-monitor/extension.js:364
|
||||
msgid "System stats"
|
||||
msgstr "Статистика на системата"
|
||||
|
||||
#: extensions/system-monitor/extension.js:412
|
||||
msgid "Show"
|
||||
msgstr "Показване"
|
||||
|
||||
#: extensions/system-monitor/extension.js:414
|
||||
msgid "CPU"
|
||||
msgstr "ЦП"
|
||||
|
||||
#: extensions/system-monitor/extension.js:416
|
||||
msgid "Memory"
|
||||
msgstr "Памет"
|
||||
|
||||
#: extensions/system-monitor/extension.js:418
|
||||
msgid "Swap"
|
||||
msgstr "Виртуалната памет"
|
||||
|
||||
#: extensions/system-monitor/extension.js:420
|
||||
msgid "Upload"
|
||||
msgstr "Качване"
|
||||
|
||||
#: extensions/system-monitor/extension.js:422
|
||||
msgid "Download"
|
||||
msgstr "Изтегляне"
|
||||
|
||||
#: extensions/system-monitor/extension.js:427
|
||||
msgid "Open System Monitor"
|
||||
msgstr "Отваряне на „Наблюдение на системата“"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:12
|
||||
msgid "Show CPU usage"
|
||||
msgstr "Показване на ползван ЦП"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:16
|
||||
msgid "Show memory usage"
|
||||
msgstr "Показване на ползвана памет"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:20
|
||||
msgid "Show swap usage"
|
||||
msgstr "Показване на ползвана виртуалната памет"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:24
|
||||
msgid "Show upload"
|
||||
msgstr "Показване на качването"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:28
|
||||
msgid "Show download"
|
||||
msgstr "Показване на изтеглянето"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:11
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
||||
msgid "Theme name"
|
||||
msgstr "Име на темата"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:12
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr ""
|
||||
"Името на темата, която да бъде заредена от „~/.themes/name/gnome-shell“"
|
||||
|
||||
#: extensions/window-list/extension.js:70
|
||||
#: extensions/window-list/extension.js:72
|
||||
msgid "Close"
|
||||
msgstr "Затваряне"
|
||||
|
||||
#: extensions/window-list/extension.js:97
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Unminimize"
|
||||
msgstr "Деминимизиране"
|
||||
|
||||
#: extensions/window-list/extension.js:97
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Minimize"
|
||||
msgstr "Минимизиране"
|
||||
|
||||
#: extensions/window-list/extension.js:104
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Unmaximize"
|
||||
msgstr "Демаксимизиране"
|
||||
|
||||
#: extensions/window-list/extension.js:104
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Maximize"
|
||||
msgstr "Максимизиране"
|
||||
|
||||
#: extensions/window-list/extension.js:489
|
||||
#: extensions/window-list/extension.js:434
|
||||
msgid "Minimize all"
|
||||
msgstr "Минимизиране на всички"
|
||||
|
||||
#: extensions/window-list/extension.js:495
|
||||
#: extensions/window-list/extension.js:440
|
||||
msgid "Unminimize all"
|
||||
msgstr "Деминимизиране на всички"
|
||||
|
||||
#: extensions/window-list/extension.js:501
|
||||
#: extensions/window-list/extension.js:446
|
||||
msgid "Maximize all"
|
||||
msgstr "Максимизиране на всички"
|
||||
|
||||
#: extensions/window-list/extension.js:509
|
||||
#: extensions/window-list/extension.js:454
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Демаксимизиране на всички"
|
||||
|
||||
#: extensions/window-list/extension.js:517
|
||||
#: extensions/window-list/extension.js:462
|
||||
msgid "Close all"
|
||||
msgstr "Затваряне на всички"
|
||||
|
||||
#: extensions/window-list/extension.js:789
|
||||
#: extensions/window-list/extension.js:741
|
||||
msgid "Window List"
|
||||
msgstr "Списък на прозорците"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:18
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
||||
msgid "When to group windows"
|
||||
msgstr "Кога прозорците да се групират"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:19
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
msgstr ""
|
||||
"Кога прозорците на една програма да се групират в списъка с прозорците. "
|
||||
"Възможните стойности са „never“ (никога), „auto“ (автоматично) и „always“ "
|
||||
"(винаги)."
|
||||
"Възможните стойности са „never“ (никога), „auto“ (автоматично) и "
|
||||
"„always“ (винаги)."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
|
||||
#: extensions/window-list/prefs.js:79
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:76
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Да се показват прозорците от всички работни плотове"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||
msgid "Whether to show windows from all workspaces or only the current one."
|
||||
msgstr ""
|
||||
"Дали да се показват прозорците от всички работни плотове или само от текущия."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:33
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
msgid "Show the window list on all monitors"
|
||||
msgstr "Извеждане на списъка с прозорци на всички монитори"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:34
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
|
||||
msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
@@ -309,58 +233,40 @@ msgstr ""
|
||||
"Дали списъкът с прозорци да се извежда на всички монитори или само на "
|
||||
"основния"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:41
|
||||
msgid "Show workspace previews in window list"
|
||||
msgstr "Визуализиране на работните пространства в списъка с прозорци"
|
||||
|
||||
#: extensions/window-list/prefs.js:35
|
||||
#: extensions/window-list/prefs.js:32
|
||||
msgid "Window Grouping"
|
||||
msgstr "Групиране на прозорци"
|
||||
|
||||
#: extensions/window-list/prefs.js:40
|
||||
#: extensions/window-list/prefs.js:37
|
||||
msgid "Never group windows"
|
||||
msgstr "Никога да не се групират"
|
||||
|
||||
#: extensions/window-list/prefs.js:41
|
||||
#: extensions/window-list/prefs.js:38
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Групиране при ограничено място"
|
||||
|
||||
#: extensions/window-list/prefs.js:42
|
||||
#: extensions/window-list/prefs.js:39
|
||||
msgid "Always group windows"
|
||||
msgstr "Винаги да се групират"
|
||||
|
||||
#: extensions/window-list/prefs.js:66
|
||||
#: extensions/window-list/prefs.js:63
|
||||
msgid "Show on all monitors"
|
||||
msgstr "На всички монитори"
|
||||
|
||||
#: extensions/window-list/prefs.js:92
|
||||
msgid "Show workspace previews"
|
||||
msgstr "Визуализиране на работните пространства"
|
||||
#: extensions/window-list/workspaceIndicator.js:249
|
||||
#: extensions/workspace-indicator/extension.js:254
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Индикатор на работните плотове"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:30
|
||||
msgid "Show Previews In Top Bar"
|
||||
msgstr "Визуализиране в горната лента"
|
||||
#: extensions/workspace-indicator/prefs.js:18
|
||||
msgid "Workspace Names"
|
||||
msgstr "Имена на работните плотове"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:88
|
||||
#: extensions/workspace-indicator/prefs.js:39
|
||||
#, javascript-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Работен плот %d"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:155
|
||||
msgid "Workspace Names"
|
||||
msgstr "Имена на работните плотове"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:281
|
||||
#: extensions/workspace-indicator/prefs.js:184
|
||||
msgid "Add Workspace"
|
||||
msgstr "Добавяне на работен плот"
|
||||
|
||||
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
|
||||
msgid "Show workspace previews in top bar"
|
||||
msgstr "Визуализиране на работните пространства в горната лента"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:430
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Индикатор на работните плотове"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Програми"
|
||||
|
||||
281
po/ca.po
281
po/ca.po
@@ -9,8 +9,8 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2025-06-18 23:32+0000\n"
|
||||
"PO-Revision-Date: 2025-06-29 09:56+0200\n"
|
||||
"POT-Creation-Date: 2021-11-06 14:08+0000\n"
|
||||
"PO-Revision-Date: 2017-07-08 13:29+0100\n"
|
||||
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
|
||||
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
|
||||
"Language: ca\n"
|
||||
@@ -18,8 +18,6 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-DamnedLies-Scope: partial\n"
|
||||
"X-Generator: Poedit 3.2.2\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
@@ -38,19 +36,19 @@ msgstr "GNOME clàssic amb Wayland"
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "GNOME clàssic amb Xorg"
|
||||
|
||||
#: extensions/apps-menu/extension.js:118
|
||||
#: extensions/apps-menu/extension.js:112
|
||||
msgid "Favorites"
|
||||
msgstr "Preferides"
|
||||
|
||||
#: extensions/apps-menu/extension.js:392
|
||||
msgid "Apps"
|
||||
#: extensions/apps-menu/extension.js:366
|
||||
msgid "Applications"
|
||||
msgstr "Aplicacions"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:12
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Aplicació i llista d'espais de treball"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:13
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -59,34 +57,34 @@ msgstr ""
|
||||
"d'aplicació (nom del fitxer de l'escriptori), seguit de dos punts i el "
|
||||
"número de l'espai de treball"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:156
|
||||
#: extensions/auto-move-windows/prefs.js:34
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Regles dels espais de treball"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:311
|
||||
#: extensions/auto-move-windows/prefs.js:236
|
||||
msgid "Add Rule"
|
||||
msgstr "Afegeix una regla"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:123
|
||||
#: extensions/places-menu/placeDisplay.js:186
|
||||
#: extensions/drive-menu/extension.js:133
|
||||
#: extensions/places-menu/placeDisplay.js:233
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "Ha fallat l'expulsió de la unitat «%s»:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:142
|
||||
#: extensions/drive-menu/extension.js:149
|
||||
msgid "Removable devices"
|
||||
msgstr "Dispositius extraïbles"
|
||||
|
||||
#: extensions/drive-menu/extension.js:164
|
||||
#: extensions/drive-menu/extension.js:171
|
||||
msgid "Open Files"
|
||||
msgstr "Obre els fitxers"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Utilitza més pantalla per les finestres"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
@@ -98,11 +96,11 @@ msgstr ""
|
||||
"de configuració només s'aplica a l'estratègia de posicionament de finestres "
|
||||
"natural."
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:17
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Posiciona els títols de les finestres al damunt"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:18
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
@@ -113,178 +111,99 @@ msgstr ""
|
||||
"posicionar-lo a baix. Cal reiniciar el Shell per tal que aquest canvi tingui "
|
||||
"efecte."
|
||||
|
||||
#: extensions/places-menu/extension.js:75
|
||||
#: extensions/places-menu/extension.js:78
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
msgid "Places"
|
||||
msgstr "Llocs"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:52
|
||||
#: extensions/places-menu/placeDisplay.js:46
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "No s'ha pogut iniciar «%s»"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:67
|
||||
#: extensions/places-menu/placeDisplay.js:61
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "No s'ha pogut muntar el volum «%s»"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:315
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
#: extensions/places-menu/placeDisplay.js:171
|
||||
msgid "Computer"
|
||||
msgstr "Ordinador"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
msgid "Home"
|
||||
msgstr "Inici"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:321
|
||||
msgid "Recent"
|
||||
msgstr "Recent"
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
msgid "Browse Network"
|
||||
msgstr "Navega per la xarxa"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:327
|
||||
msgid "Starred"
|
||||
msgstr "Destacat"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:347
|
||||
msgid "Network"
|
||||
msgstr "Xarxa"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:354
|
||||
msgid "Trash"
|
||||
msgstr "Paperera"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
||||
msgid "Cycle Screenshot Sizes"
|
||||
msgstr "Mostra cíclicament mides de captura de pantalla"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:18
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
||||
msgid "Cycle Screenshot Sizes Backward"
|
||||
msgstr "Mostra cíclicament cap enrere mides de captura de pantalla"
|
||||
|
||||
#: extensions/system-monitor/extension.js:135
|
||||
msgid "CPU stats"
|
||||
msgstr "Estadístiques de processador"
|
||||
|
||||
#: extensions/system-monitor/extension.js:159
|
||||
msgid "Memory stats"
|
||||
msgstr "Estadístiques de memòria"
|
||||
|
||||
#: extensions/system-monitor/extension.js:177
|
||||
msgid "Swap stats"
|
||||
msgstr "Estadístiques del «swap»"
|
||||
|
||||
#: extensions/system-monitor/extension.js:336
|
||||
msgid "Upload stats"
|
||||
msgstr "Estadístiques de pujada"
|
||||
|
||||
#: extensions/system-monitor/extension.js:350
|
||||
msgid "Download stats"
|
||||
msgstr "Estadístiques de descàrrega"
|
||||
|
||||
#: extensions/system-monitor/extension.js:364
|
||||
msgid "System stats"
|
||||
msgstr "Estadístiques del sistema"
|
||||
|
||||
#: extensions/system-monitor/extension.js:412
|
||||
msgid "Show"
|
||||
msgstr "Mostra"
|
||||
|
||||
#: extensions/system-monitor/extension.js:414
|
||||
msgid "CPU"
|
||||
msgstr "Processador"
|
||||
|
||||
#: extensions/system-monitor/extension.js:416
|
||||
msgid "Memory"
|
||||
msgstr "Memòria"
|
||||
|
||||
#: extensions/system-monitor/extension.js:418
|
||||
msgid "Swap"
|
||||
msgstr "Espai d'intercanvi"
|
||||
|
||||
#: extensions/system-monitor/extension.js:420
|
||||
msgid "Upload"
|
||||
msgstr "Pujades"
|
||||
|
||||
#: extensions/system-monitor/extension.js:422
|
||||
msgid "Download"
|
||||
msgstr "Descàrregues"
|
||||
|
||||
#: extensions/system-monitor/extension.js:427
|
||||
msgid "Open System Monitor"
|
||||
msgstr "Obre el Monitor del sistema"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:12
|
||||
msgid "Show CPU usage"
|
||||
msgstr "Mostra l'ús de CPU"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:16
|
||||
msgid "Show memory usage"
|
||||
msgstr "Mostra l'ús de memòria"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:20
|
||||
msgid "Show swap usage"
|
||||
msgstr "Mostra l'ús de l'espai d'intercanvi"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:24
|
||||
msgid "Show upload"
|
||||
msgstr "Mostra les pujades"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:28
|
||||
msgid "Show download"
|
||||
msgstr "Mostra les descàrregues"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:11
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
||||
msgid "Theme name"
|
||||
msgstr "Nom del tema"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:12
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell"
|
||||
|
||||
#: extensions/window-list/extension.js:98
|
||||
#: extensions/window-list/extension.js:72
|
||||
msgid "Close"
|
||||
msgstr "Tanca"
|
||||
|
||||
#: extensions/window-list/extension.js:125
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Unminimize"
|
||||
msgstr "Desminimitza"
|
||||
|
||||
#: extensions/window-list/extension.js:125
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Minimize"
|
||||
msgstr "Minimitza"
|
||||
|
||||
#: extensions/window-list/extension.js:130
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Unmaximize"
|
||||
msgstr "Desmaximitza"
|
||||
|
||||
#: extensions/window-list/extension.js:130
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Maximize"
|
||||
msgstr "Maximitza"
|
||||
|
||||
#: extensions/window-list/extension.js:720
|
||||
#: extensions/window-list/extension.js:434
|
||||
msgid "Minimize all"
|
||||
msgstr "Minimitza-ho tot"
|
||||
|
||||
#: extensions/window-list/extension.js:726
|
||||
#: extensions/window-list/extension.js:440
|
||||
msgid "Unminimize all"
|
||||
msgstr "Desminimitza-ho tot"
|
||||
|
||||
#: extensions/window-list/extension.js:732
|
||||
#: extensions/window-list/extension.js:446
|
||||
msgid "Maximize all"
|
||||
msgstr "Maximitza-ho tot"
|
||||
|
||||
#: extensions/window-list/extension.js:740
|
||||
#: extensions/window-list/extension.js:454
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Desmaximitza-ho tot"
|
||||
|
||||
#: extensions/window-list/extension.js:748
|
||||
#: extensions/window-list/extension.js:462
|
||||
msgid "Close all"
|
||||
msgstr "Tanca-ho tot"
|
||||
|
||||
#: extensions/window-list/extension.js:1000 extensions/window-list/prefs.js:23
|
||||
#: extensions/window-list/extension.js:741
|
||||
msgid "Window List"
|
||||
msgstr "Llista de finestres"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:18
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
||||
msgid "When to group windows"
|
||||
msgstr "Quan s'han d'agrupar les finestres"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:19
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
@@ -293,22 +212,22 @@ msgstr ""
|
||||
"llista de finestres. Els valors possibles són: «never» (mai), "
|
||||
"«auto» (automàticament) i «always» (sempre)."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
|
||||
#: extensions/window-list/prefs.js:74
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:86
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Mostra les finestres de tots els espais de treball"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||
msgid "Whether to show windows from all workspaces or only the current one."
|
||||
msgstr ""
|
||||
"Si es mostren les finestres de tots els espais de treballs o només de "
|
||||
"l'actual."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:33
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
msgid "Show the window list on all monitors"
|
||||
msgstr "Mostra la llista de finestres a tots els monitors"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:34
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
|
||||
msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
@@ -316,104 +235,40 @@ msgstr ""
|
||||
"Si es mostra la llista de finestres en tots els monitors connectats o només "
|
||||
"al primari."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:41
|
||||
msgid "Show workspace previews in window list"
|
||||
msgstr ""
|
||||
"Mostra les previsualitzacions dels espais de treball a la llista de finestres"
|
||||
|
||||
#: extensions/window-list/prefs.js:41
|
||||
#: extensions/window-list/prefs.js:39
|
||||
msgid "Window Grouping"
|
||||
msgstr "Agrupació de finestres"
|
||||
|
||||
#: extensions/window-list/prefs.js:46
|
||||
#: extensions/window-list/prefs.js:63
|
||||
msgid "Never group windows"
|
||||
msgstr "Mai agrupis les finestres"
|
||||
|
||||
#: extensions/window-list/prefs.js:47
|
||||
#: extensions/window-list/prefs.js:64
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Agrupa les finestres quan l'espai estigui limitat"
|
||||
|
||||
#: extensions/window-list/prefs.js:48
|
||||
#: extensions/window-list/prefs.js:65
|
||||
msgid "Always group windows"
|
||||
msgstr "Agrupa les finestres sempre"
|
||||
|
||||
#: extensions/window-list/prefs.js:68
|
||||
#: extensions/window-list/prefs.js:81
|
||||
msgid "Show on all monitors"
|
||||
msgstr "Mostra a tots els monitors"
|
||||
|
||||
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
|
||||
msgid "Show workspace previews in top bar"
|
||||
msgstr ""
|
||||
"Mostra les previsualitzacions dels espais de treball a la barra superior"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:404
|
||||
#, javascript-format
|
||||
msgid "Press %s to edit"
|
||||
msgstr "Premeu %s per editar"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:512
|
||||
msgid "Settings"
|
||||
msgstr "Paràmetres"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:592
|
||||
#: extensions/window-list/workspaceIndicator.js:249
|
||||
#: extensions/workspace-indicator/extension.js:254
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Indicador de l'espai de treball"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:20
|
||||
msgid "Indicator"
|
||||
msgstr "Indicador"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:25
|
||||
msgid "Previews"
|
||||
msgstr "Previsualitzacions"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:35
|
||||
msgid "Workspace Name"
|
||||
msgstr "Nom de l'espai de treball"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:59
|
||||
msgid "Behavior"
|
||||
msgstr "Comportament"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:64
|
||||
msgid "Dynamic"
|
||||
msgstr "Dinàmica"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:65
|
||||
msgid "Automatically removes empty workspaces."
|
||||
msgstr "Suprimeix automàticament els espais de treball buits."
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:75
|
||||
msgid "Fixed Number"
|
||||
msgstr "Nombre fix"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:76
|
||||
msgid "Specify a number of permanent workspaces."
|
||||
msgstr "Especifiqueu un nombre d'espais de treball permanents."
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:89
|
||||
msgid "Number of Workspaces"
|
||||
msgstr "Nombre d'espais de treball"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:128
|
||||
msgid "Workspaces"
|
||||
msgstr "Espais de treball"
|
||||
#: extensions/workspace-indicator/prefs.js:33
|
||||
msgid "Workspace Names"
|
||||
msgstr "Noms dels espais de treball"
|
||||
|
||||
#: extensions/workspace-indicator/prefs.js:66
|
||||
#, javascript-format
|
||||
#~ msgid "Workspace %d"
|
||||
#~ msgstr "Espai de treball %d"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Espai de treball %d"
|
||||
|
||||
#~ msgid "Add Workspace"
|
||||
#~ msgstr "Afegeix un espai de treball"
|
||||
|
||||
#~ msgid "Remove"
|
||||
#~ msgstr "Suprimeix"
|
||||
|
||||
#~ msgid "Computer"
|
||||
#~ msgstr "Ordinador"
|
||||
|
||||
#~ msgid "Show workspace previews"
|
||||
#~ msgstr "Mostra les previsualitzacions dels espais de treball"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Aplicacions"
|
||||
#: extensions/workspace-indicator/prefs.js:207
|
||||
msgid "Add Workspace"
|
||||
msgstr "Afegeix un espai de treball"
|
||||
|
||||
240
po/cs.po
240
po/cs.po
@@ -3,23 +3,22 @@
|
||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
||||
# Petr Kovar <pknbe@volny.cz>, 2013.
|
||||
# Marek Černocký <marek@manet.cz>, 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020, 2022.
|
||||
# Vojtěch Perník <translations@pervoj.cz>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell-extensions\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
||||
"issues\n"
|
||||
"POT-Creation-Date: 2025-02-13 00:15+0000\n"
|
||||
"PO-Revision-Date: 2025-02-20 23:42+0100\n"
|
||||
"Last-Translator: Daniel Rusek <mail@asciiwolf.com>\n"
|
||||
"POT-Creation-Date: 2021-11-06 14:08+0000\n"
|
||||
"PO-Revision-Date: 2022-02-16 09:58+0100\n"
|
||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||
"Language: cs\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Poedit 3.5\n"
|
||||
"X-Generator: Gtranslator 2.91.6\n"
|
||||
|
||||
#: data/gnome-classic.desktop.in:3
|
||||
msgid "GNOME Classic"
|
||||
@@ -38,19 +37,19 @@ msgstr "GNOME klasik na Waylandu"
|
||||
msgid "GNOME Classic on Xorg"
|
||||
msgstr "GNOME klasik na Xorg"
|
||||
|
||||
#: extensions/apps-menu/extension.js:125
|
||||
#: extensions/apps-menu/extension.js:112
|
||||
msgid "Favorites"
|
||||
msgstr "Oblíbené"
|
||||
|
||||
#: extensions/apps-menu/extension.js:399
|
||||
msgid "Apps"
|
||||
#: extensions/apps-menu/extension.js:366
|
||||
msgid "Applications"
|
||||
msgstr "Aplikace"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:12
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:6
|
||||
msgid "Application and workspace list"
|
||||
msgstr "Seznam aplikací a pracovních ploch"
|
||||
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:13
|
||||
#: extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml:7
|
||||
msgid ""
|
||||
"A list of strings, each containing an application id (desktop file name), "
|
||||
"followed by a colon and the workspace number"
|
||||
@@ -58,34 +57,34 @@ msgstr ""
|
||||
"Seznam řetězců, z nichž každý obsahuje ID aplikace (název souboru pracovní "
|
||||
"plochy), následovaný dvojtečkou a číslem pracovní plochy"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:156
|
||||
#: extensions/auto-move-windows/prefs.js:34
|
||||
msgid "Workspace Rules"
|
||||
msgstr "Pravidla pracovních ploch"
|
||||
|
||||
#: extensions/auto-move-windows/prefs.js:311
|
||||
#: extensions/auto-move-windows/prefs.js:236
|
||||
msgid "Add Rule"
|
||||
msgstr "Přidat pravidlo"
|
||||
|
||||
#. TRANSLATORS: %s is the filesystem name
|
||||
#: extensions/drive-menu/extension.js:123
|
||||
#: extensions/places-menu/placeDisplay.js:186
|
||||
#: extensions/drive-menu/extension.js:133
|
||||
#: extensions/places-menu/placeDisplay.js:233
|
||||
#, javascript-format
|
||||
msgid "Ejecting drive “%s” failed:"
|
||||
msgstr "Vysunutí disku „%s“ selhalo:"
|
||||
|
||||
#: extensions/drive-menu/extension.js:142
|
||||
#: extensions/drive-menu/extension.js:149
|
||||
msgid "Removable devices"
|
||||
msgstr "Výměnná zařízení"
|
||||
|
||||
#: extensions/drive-menu/extension.js:164
|
||||
#: extensions/drive-menu/extension.js:171
|
||||
msgid "Open Files"
|
||||
msgstr "Otevřít soubory"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:5
|
||||
msgid "Use more screen for windows"
|
||||
msgstr "Použít větší část obrazovky pro okna"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:6
|
||||
msgid ""
|
||||
"Try to use more screen for placing window thumbnails by adapting to screen "
|
||||
"aspect ratio, and consolidating them further to reduce the bounding box. "
|
||||
@@ -95,11 +94,11 @@ msgstr ""
|
||||
"využít větší část obrazovky pro umístění náhledů oken. Toto nastavení se "
|
||||
"použije pouze dohromady se strategií umisťování „natural“."
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:17
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:11
|
||||
msgid "Place window captions on top"
|
||||
msgstr "Umístit název okna nahoru"
|
||||
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:18
|
||||
#: extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml:12
|
||||
msgid ""
|
||||
"If true, place window captions on top the respective thumbnail, overriding "
|
||||
"shell default of placing it at the bottom. Changing this setting requires "
|
||||
@@ -109,178 +108,99 @@ msgstr ""
|
||||
"přepíše výchozí chování shellu, který jej umisťuje dolů. Změna tohoto "
|
||||
"nastavení vyžaduje restart shellu, aby se projevila."
|
||||
|
||||
#: extensions/places-menu/extension.js:75
|
||||
#: extensions/places-menu/extension.js:78
|
||||
#: extensions/places-menu/extension.js:88
|
||||
#: extensions/places-menu/extension.js:91
|
||||
msgid "Places"
|
||||
msgstr "Místa"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:52
|
||||
#: extensions/places-menu/placeDisplay.js:46
|
||||
#, javascript-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Selhalo spuštění „%s“"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:67
|
||||
#: extensions/places-menu/placeDisplay.js:61
|
||||
#, javascript-format
|
||||
msgid "Failed to mount volume for “%s”"
|
||||
msgstr "Selhalo připojení svazku pro „%s“"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:315
|
||||
#: extensions/places-menu/placeDisplay.js:148
|
||||
#: extensions/places-menu/placeDisplay.js:171
|
||||
msgid "Computer"
|
||||
msgstr "Počítač"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:359
|
||||
msgid "Home"
|
||||
msgstr "Domů"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:321
|
||||
msgid "Recent"
|
||||
msgstr "Nedávné"
|
||||
#: extensions/places-menu/placeDisplay.js:404
|
||||
msgid "Browse Network"
|
||||
msgstr "Procházet síť"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:327
|
||||
msgid "Starred"
|
||||
msgstr "Oblíbené"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:347
|
||||
msgid "Network"
|
||||
msgstr "Síť"
|
||||
|
||||
#: extensions/places-menu/placeDisplay.js:354
|
||||
msgid "Trash"
|
||||
msgstr "Koš"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:14
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:7
|
||||
msgid "Cycle Screenshot Sizes"
|
||||
msgstr "Mění velikost pro snímky obrazovky"
|
||||
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:18
|
||||
#: extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml:11
|
||||
msgid "Cycle Screenshot Sizes Backward"
|
||||
msgstr "Mění pozpátku velikost pro snímky obrazovky"
|
||||
|
||||
#: extensions/system-monitor/extension.js:135
|
||||
msgid "CPU stats"
|
||||
msgstr "Statistiky CPU"
|
||||
|
||||
#: extensions/system-monitor/extension.js:159
|
||||
msgid "Memory stats"
|
||||
msgstr "Statistiky paměti"
|
||||
|
||||
#: extensions/system-monitor/extension.js:177
|
||||
msgid "Swap stats"
|
||||
msgstr "Statistiky odkládacího prostoru"
|
||||
|
||||
#: extensions/system-monitor/extension.js:336
|
||||
msgid "Upload stats"
|
||||
msgstr "Statistiky nahrávání"
|
||||
|
||||
#: extensions/system-monitor/extension.js:350
|
||||
msgid "Download stats"
|
||||
msgstr "Statistiky stahování"
|
||||
|
||||
#: extensions/system-monitor/extension.js:364
|
||||
msgid "System stats"
|
||||
msgstr "Statistiky systému"
|
||||
|
||||
#: extensions/system-monitor/extension.js:412
|
||||
msgid "Show"
|
||||
msgstr "Zobrazit"
|
||||
|
||||
#: extensions/system-monitor/extension.js:414
|
||||
msgid "CPU"
|
||||
msgstr "CPU"
|
||||
|
||||
#: extensions/system-monitor/extension.js:416
|
||||
msgid "Memory"
|
||||
msgstr "Paměť"
|
||||
|
||||
#: extensions/system-monitor/extension.js:418
|
||||
msgid "Swap"
|
||||
msgstr "Odkládací prostor"
|
||||
|
||||
#: extensions/system-monitor/extension.js:420
|
||||
msgid "Upload"
|
||||
msgstr "Nahrávání"
|
||||
|
||||
#: extensions/system-monitor/extension.js:422
|
||||
msgid "Download"
|
||||
msgstr "Stahování"
|
||||
|
||||
#: extensions/system-monitor/extension.js:427
|
||||
msgid "Open System Monitor"
|
||||
msgstr "Otevřít Sledování systému"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:12
|
||||
msgid "Show CPU usage"
|
||||
msgstr "Zobrazit využití CPU"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:16
|
||||
msgid "Show memory usage"
|
||||
msgstr "Zobrazit využití paměti"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:20
|
||||
msgid "Show swap usage"
|
||||
msgstr "Zobrazit využití odkládacího prostoru"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:24
|
||||
msgid "Show upload"
|
||||
msgstr "Zobrazit nahrávání"
|
||||
|
||||
#: extensions/system-monitor/schemas/org.gnome.shell.extensions.system-monitor.gschema.xml:28
|
||||
msgid "Show download"
|
||||
msgstr "Zobrazit stahování"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:11
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:5
|
||||
msgid "Theme name"
|
||||
msgstr "Název motivu"
|
||||
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:12
|
||||
#: extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml:6
|
||||
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
|
||||
msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell"
|
||||
|
||||
#: extensions/window-list/extension.js:95
|
||||
#: extensions/window-list/extension.js:72
|
||||
msgid "Close"
|
||||
msgstr "Zavřít"
|
||||
|
||||
#: extensions/window-list/extension.js:122
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Unminimize"
|
||||
msgstr "Zrušit minimalizaci"
|
||||
|
||||
#: extensions/window-list/extension.js:122
|
||||
#: extensions/window-list/extension.js:92
|
||||
msgid "Minimize"
|
||||
msgstr "Minimalizovat"
|
||||
|
||||
#: extensions/window-list/extension.js:129
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Unmaximize"
|
||||
msgstr "Zrušit maximalizaci"
|
||||
|
||||
#: extensions/window-list/extension.js:129
|
||||
#: extensions/window-list/extension.js:99
|
||||
msgid "Maximize"
|
||||
msgstr "Maximalizovat"
|
||||
|
||||
#: extensions/window-list/extension.js:721
|
||||
#: extensions/window-list/extension.js:434
|
||||
msgid "Minimize all"
|
||||
msgstr "Minimalizovat všechna"
|
||||
|
||||
#: extensions/window-list/extension.js:727
|
||||
#: extensions/window-list/extension.js:440
|
||||
msgid "Unminimize all"
|
||||
msgstr "Zrušit minimalizaci všech"
|
||||
|
||||
#: extensions/window-list/extension.js:733
|
||||
#: extensions/window-list/extension.js:446
|
||||
msgid "Maximize all"
|
||||
msgstr "Maximalizovat všechna"
|
||||
|
||||
#: extensions/window-list/extension.js:741
|
||||
#: extensions/window-list/extension.js:454
|
||||
msgid "Unmaximize all"
|
||||
msgstr "Zrušit maximalizaci všech"
|
||||
|
||||
#: extensions/window-list/extension.js:749
|
||||
#: extensions/window-list/extension.js:462
|
||||
msgid "Close all"
|
||||
msgstr "Zavřít všechna"
|
||||
|
||||
#: extensions/window-list/extension.js:992 extensions/window-list/prefs.js:23
|
||||
#: extensions/window-list/extension.js:741
|
||||
msgid "Window List"
|
||||
msgstr "Seznam oken"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:18
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:12
|
||||
msgid "When to group windows"
|
||||
msgstr "Kdy seskupovat okna"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:19
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:13
|
||||
msgid ""
|
||||
"Decides when to group windows from the same application on the window list. "
|
||||
"Possible values are “never”, “auto” and “always”."
|
||||
@@ -288,20 +208,20 @@ msgstr ""
|
||||
"Rozhoduje, kdy se mají v seznamu oken seskupovat okna stejné aplikace. Možné "
|
||||
"hodnoty jsou „never“ (nikdy), „auto“ (automaticky) a „always“ (vždy)."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:26
|
||||
#: extensions/window-list/prefs.js:74
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:20
|
||||
#: extensions/window-list/prefs.js:86
|
||||
msgid "Show windows from all workspaces"
|
||||
msgstr "Zobrazovat okna ze všech pracovních ploch"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:21
|
||||
msgid "Whether to show windows from all workspaces or only the current one."
|
||||
msgstr "Zda zobrazovat okna ze všech pracovních ploch nebo jen z aktuální."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:33
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:27
|
||||
msgid "Show the window list on all monitors"
|
||||
msgstr "Zobrazovat seznam oken na všech monitorech"
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:34
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:28
|
||||
msgid ""
|
||||
"Whether to show the window list on all connected monitors or only on the "
|
||||
"primary one."
|
||||
@@ -309,68 +229,40 @@ msgstr ""
|
||||
"Zda zobrazovat seznam oken na všech připojených monitorech nebo jen na "
|
||||
"hlavním."
|
||||
|
||||
#: extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml:41
|
||||
msgid "Show workspace previews in window list"
|
||||
msgstr "Zobrazit náhledy pracovních ploch v seznamu oken"
|
||||
|
||||
#: extensions/window-list/prefs.js:41
|
||||
#: extensions/window-list/prefs.js:39
|
||||
msgid "Window Grouping"
|
||||
msgstr "Seskupování oken"
|
||||
|
||||
#: extensions/window-list/prefs.js:46
|
||||
#: extensions/window-list/prefs.js:63
|
||||
msgid "Never group windows"
|
||||
msgstr "Nikdy neseskupovat okna"
|
||||
|
||||
#: extensions/window-list/prefs.js:47
|
||||
#: extensions/window-list/prefs.js:64
|
||||
msgid "Group windows when space is limited"
|
||||
msgstr "Seskupovat okna při nedostatku místa"
|
||||
|
||||
#: extensions/window-list/prefs.js:48
|
||||
#: extensions/window-list/prefs.js:65
|
||||
msgid "Always group windows"
|
||||
msgstr "Vždy seskupovat okna"
|
||||
|
||||
#: extensions/window-list/prefs.js:68
|
||||
#: extensions/window-list/prefs.js:81
|
||||
msgid "Show on all monitors"
|
||||
msgstr "Zobrazovat na všech monitorech"
|
||||
|
||||
#: extensions/workspace-indicator/schemas/org.gnome.shell.extensions.workspace-indicator.gschema.xml:12
|
||||
msgid "Show workspace previews in top bar"
|
||||
msgstr "Zobrazit náhledy pracovních ploch v horním panelu"
|
||||
|
||||
#: extensions/workspace-indicator/workspaceIndicator.js:430
|
||||
#: extensions/window-list/workspaceIndicator.js:249
|
||||
#: extensions/workspace-indicator/extension.js:254
|
||||
msgid "Workspace Indicator"
|
||||
msgstr "Ukazatel pracovní plochy"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:28
|
||||
msgid "Show Previews"
|
||||
msgstr "Zobrazit náhledy"
|
||||
#: extensions/workspace-indicator/prefs.js:33
|
||||
msgid "Workspace Names"
|
||||
msgstr "Názvy pracovních ploch"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:86
|
||||
#: extensions/workspace-indicator/prefs.js:66
|
||||
#, javascript-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Pracovní plocha %d"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:153
|
||||
msgid "Workspace Names"
|
||||
msgstr "Názvy pracovních ploch"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:170
|
||||
#: extensions/workspace-indicator/prefs.js:207
|
||||
msgid "Add Workspace"
|
||||
msgstr "Přidat pracovní plochu"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:195
|
||||
msgid "Remove"
|
||||
msgstr "Odstranit"
|
||||
|
||||
#: extensions/workspace-indicator/workspacePrefs.js:225
|
||||
msgid "Workspaces"
|
||||
msgstr "Pracovní plochy"
|
||||
|
||||
#~ msgid "Computer"
|
||||
#~ msgstr "Počítač"
|
||||
|
||||
#~ msgid "Show workspace previews"
|
||||
#~ msgstr "Zobrazit náhledy pracovních ploch"
|
||||
|
||||
#~ msgid "Applications"
|
||||
#~ msgstr "Aplikace"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user