Compare commits
244
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": [
|
||||||
|
"./lint/eslintrc-gjs.json",
|
||||||
|
"./lint/eslintrc-shell.json"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
extends:
|
|
||||||
- ./lint/eslintrc-gjs.yml
|
|
||||||
- ./lint/eslintrc-shell.yml
|
|
||||||
-29
@@ -1,29 +0,0 @@
|
|||||||
ABOUT-NLS
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
Makefile.in.in
|
|
||||||
aclocal.m4
|
|
||||||
autom4te.cache/
|
|
||||||
config/
|
|
||||||
configure
|
|
||||||
config.log
|
|
||||||
config.status
|
|
||||||
data/*.json
|
|
||||||
m4/
|
|
||||||
po/*.header
|
|
||||||
po/*.sed
|
|
||||||
po/*.sin
|
|
||||||
po/Makevars.template
|
|
||||||
po/POTFILES
|
|
||||||
po/Rules-quot
|
|
||||||
po/gnome-shell-extensions.pot
|
|
||||||
po/stamp-it
|
|
||||||
staging/
|
|
||||||
zip-files/
|
|
||||||
|
|
||||||
*~
|
|
||||||
*.gmo
|
|
||||||
metadata.json
|
|
||||||
*.desktop
|
|
||||||
*.gschema.valid
|
|
||||||
*.session
|
|
||||||
-171
@@ -1,171 +0,0 @@
|
|||||||
include:
|
|
||||||
- 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"
|
|
||||||
|
|
||||||
image: registry.gitlab.gnome.org/gnome/gnome-shell/fedora/35:2022-02-18.0
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- pre_review
|
|
||||||
- prepare
|
|
||||||
- review
|
|
||||||
- build
|
|
||||||
- deploy
|
|
||||||
|
|
||||||
default:
|
|
||||||
# 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
|
|
||||||
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:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
||||||
- if: '$CI_COMMIT_TAG'
|
|
||||||
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
|
||||||
- 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
|
|
||||||
- check-merge-request
|
|
||||||
|
|
||||||
check_commit_log:
|
|
||||||
extends:
|
|
||||||
- .fdo.ci-fairy
|
|
||||||
stage: pre_review
|
|
||||||
script:
|
|
||||||
- if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
|
|
||||||
then
|
|
||||||
ci-fairy check-commits --junit-xml=commit-message-junit-report.xml ;
|
|
||||||
else
|
|
||||||
echo "Not a merge request" ;
|
|
||||||
fi
|
|
||||||
<<: *pipeline_guard
|
|
||||||
artifacts:
|
|
||||||
expire_in: 1 week
|
|
||||||
paths:
|
|
||||||
- commit-message-junit-report.xml
|
|
||||||
reports:
|
|
||||||
junit: commit-message-junit-report.xml
|
|
||||||
|
|
||||||
check-merge-request:
|
|
||||||
extends:
|
|
||||||
- .fdo.ci-fairy
|
|
||||||
stage: pre_review
|
|
||||||
script:
|
|
||||||
- if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
|
|
||||||
then
|
|
||||||
ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ;
|
|
||||||
else
|
|
||||||
echo "Not a merge request" ;
|
|
||||||
fi
|
|
||||||
<<: *pipeline_guard
|
|
||||||
artifacts:
|
|
||||||
expire_in: 1 week
|
|
||||||
paths:
|
|
||||||
- check-merge-request-report.xml
|
|
||||||
reports:
|
|
||||||
junit: check-merge-request-report.xml
|
|
||||||
|
|
||||||
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
|
|
||||||
script:
|
|
||||||
- gjs-check-syntax
|
|
||||||
|
|
||||||
eslint:
|
|
||||||
stage: review
|
|
||||||
<<: *prereview_req
|
|
||||||
script:
|
|
||||||
- eslint -o $LINT_LOG -f junit --resolve-plugins-relative-to $(npm root -g) extensions
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- ${LINT_LOG}
|
|
||||||
reports:
|
|
||||||
junit: ${LINT_LOG}
|
|
||||||
|
|
||||||
build-bundles:
|
|
||||||
stage: build
|
|
||||||
<<: *prereview_req
|
|
||||||
script:
|
|
||||||
- ./export-zips.sh
|
|
||||||
artifacts:
|
|
||||||
name: 'Extension bundles'
|
|
||||||
expose_as: 'Get Extension bundles here'
|
|
||||||
paths:
|
|
||||||
- zip-files/
|
|
||||||
|
|
||||||
fedora-build:
|
|
||||||
extends:
|
|
||||||
- .fdo.distribution-image@fedora
|
|
||||||
- .gnome-shell-extensions.fedora:34
|
|
||||||
stage: build
|
|
||||||
needs:
|
|
||||||
- build-fedora-container
|
|
||||||
before_script:
|
|
||||||
- git submodule update --init
|
|
||||||
script:
|
|
||||||
- meson setup build --werror -Dextension_set=all -Dclassic_mode=true
|
|
||||||
- meson compile -C build
|
|
||||||
- meson test -C build
|
|
||||||
- meson install -C build
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build
|
|
||||||
|
|
||||||
fedora-dist:
|
|
||||||
extends:
|
|
||||||
- .fdo.distribution-image@fedora
|
|
||||||
- .gnome-shell-extensions.fedora:34
|
|
||||||
stage: deploy
|
|
||||||
needs:
|
|
||||||
- fedora-build
|
|
||||||
before_script:
|
|
||||||
- git submodule update --init
|
|
||||||
script:
|
|
||||||
- meson dist -C build
|
|
||||||
rules:
|
|
||||||
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
||||||
changes:
|
|
||||||
- "**/meson.build"
|
|
||||||
- meson/*
|
|
||||||
|
|
||||||
fedora-dist-tarball:
|
|
||||||
extends: fedora-dist
|
|
||||||
artifacts:
|
|
||||||
expose_as: 'Get tarball here'
|
|
||||||
paths:
|
|
||||||
- build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz
|
|
||||||
rules:
|
|
||||||
- if: '$CI_COMMIT_TAG'
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
patterns:
|
|
||||||
deny:
|
|
||||||
- regex: '^$CI_MERGE_REQUEST_PROJECT_URL/(-/)?merge_requests/$CI_MERGE_REQUEST_IID$'
|
|
||||||
message: Commit message must not contain a link to its own merge request
|
|
||||||
- regex: '^extensions/'
|
|
||||||
message: Commit message subject should not be prefixed with 'extensions/', use the extension name instead
|
|
||||||
where: subject
|
|
||||||
- regex: '^[^:]+: [a-z]'
|
|
||||||
message: "Commit message subject should be properly Capitalized. E.g. 'window: Marginalize extradicity'"
|
|
||||||
where: subject
|
|
||||||
- regex: '^\S*\.js:'
|
|
||||||
message: Commit message subject prefix should not include .js
|
|
||||||
where: subject
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
[submodule "data/gnome-shell-sass"]
|
|
||||||
path = data/gnome-shell-sass
|
|
||||||
url = https://gitlab.gnome.org/GNOME/gnome-shell-sass.git
|
|
||||||
+1
-1
@@ -28,4 +28,4 @@ imports (like imports.lang or imports.dbus) and introspection,
|
|||||||
the other for Shell API. Within the same group, put everything
|
the other for Shell API. Within the same group, put everything
|
||||||
in alphabetic order.
|
in alphabetic order.
|
||||||
|
|
||||||
[coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/HEAD/doc/Style_Guide.md
|
[coding-style]: https://gitlab.gnome.org/GNOME/gjs/blob/master/doc/Style_Guide.md
|
||||||
|
|||||||
@@ -1,414 +1,3 @@
|
|||||||
42.2
|
|
||||||
====
|
|
||||||
* native-window-placement: Adjust to gnome-shell 42 changes [Florian; !229]
|
|
||||||
* window-list: Fix visibility on non-primary monitors [Jason; !230]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jason Lynch, Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Cheng-Chia Tseng [zh_TW]
|
|
||||||
|
|
||||||
42.1
|
|
||||||
====
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !223, !222, !225]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Milo Casagrande [it], Rūdolfs Mazurs [lv], Nathan Follens [nl],
|
|
||||||
Ngọc Quân Trần [vi], Zurab Kargareteli [ka]
|
|
||||||
|
|
||||||
42.0
|
|
||||||
====
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Philipp Kiemle [de], Balázs Úr [hu], Марко Костић [sr], sicklylife [ja],
|
|
||||||
Baurzhan Muftakhidinov [kk]
|
|
||||||
|
|
||||||
42.rc
|
|
||||||
=====
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !215, !218]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Marek Černocký [cs], Dušan Kazik [sk], Piotr Drąg [pl], Jiri Grönroos [fi],
|
|
||||||
Luna Jernberg [sv], Alan Mortensen [da], Charles Monzat [fr],
|
|
||||||
Changwoo Ryu [ko]
|
|
||||||
|
|
||||||
42.beta
|
|
||||||
=======
|
|
||||||
* workspace-indicator: Fix cancelling editing with Esc [Florian; !208]
|
|
||||||
* window-list: Update window tracking to avoid missing icons [Florian; !207]
|
|
||||||
* Use libadwaita for preferences [Florian; !209, !213]
|
|
||||||
* Adapt to Clutter grab API changes [Florian; !212]
|
|
||||||
* Misc. bug fixes and cleanups [Jan, Florian; !210, !214]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jan Beich, Florian Müllner, Naala Nanba
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Boyuan Yang [zh_CN], Matej Urbančič [sl], Naala Nanba [ab],
|
|
||||||
Alexander Shopov [bg], Emin Tufan Çetin [tr]
|
|
||||||
|
|
||||||
42.alpha
|
|
||||||
========
|
|
||||||
* native-window-placement: Fix distorted layout in app grid [Sebastian; !189]
|
|
||||||
* window-list: Fix on-screen keyboard [Florian; !199]
|
|
||||||
* Misc. bug fixes and cleanups [Neal; Just; !195, !197]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Piotr Drąg, Neal Gompa, Sebastian Keller, Florian Müllner, Just Perfection
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Goran Vidović [hr], Sveinn í Felli [is], Yuri Chornoivan [uk],
|
|
||||||
Fabio Tomat [fur], Quentin PAGÈS [oc], Hugo Carvalho [pt],
|
|
||||||
Yaron Shahrabani [he], Jordi Mas i Hernandez [ca], MohammadSaleh Kamyab [fa],
|
|
||||||
Fran Dieguez [gl], Daniel Mustieles [es], Aleksandr Melman [ru],
|
|
||||||
Aurimas Černius [lt], Asier Sarasua Garmendia [eu], Kukuh Syafaat [id],
|
|
||||||
Rafael Fontenelle [pt_BR]
|
|
||||||
|
|
||||||
41.0
|
|
||||||
====
|
|
||||||
* Bump version
|
|
||||||
|
|
||||||
41.rc.1
|
|
||||||
=======
|
|
||||||
* Fix pre-generating stylesheets in tarball [Florian; !190]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
41.rc
|
|
||||||
=====
|
|
||||||
* window-list: Adapt to overview-on-startup [Florian; !185]
|
|
||||||
* apps-menu: Use a custom 'toggle-menu' shortcut [Florian; !173]
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !186]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
41.beta
|
|
||||||
=======
|
|
||||||
* window-list: Extend reactive area of minimap to screen edges [Adam; !171]
|
|
||||||
* drive-menu: Improve detection of network mounts [Florian; !27, !176]
|
|
||||||
* Use distinct gettext domain for e.g.o uploads [Florian; #335]
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !172, !174, !177, !167, !178, !180,
|
|
||||||
!181, !182, !183]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Marco Trevisan (Treviño), Adam Goode, Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Hugo Carvalho [pt], Juliano de Souza Camargo [pt], Alexander Shopov [bg]
|
|
||||||
|
|
||||||
40.1
|
|
||||||
====
|
|
||||||
* Disable welcome dialog in classic session [Florian; !169]
|
|
||||||
* windowsNavigator: Adjust to a late gnome-shell change [Florian; !170]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Ngọc Quân Trần [vi], Anders Jonsson [sv], Carmen Bianca BAKKER [eo],
|
|
||||||
Pawan Chitrakar [ne], Quentin PAGÈS [oc]
|
|
||||||
|
|
||||||
40.0
|
|
||||||
====
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Jiri Grönroos [fi]
|
|
||||||
|
|
||||||
40.rc
|
|
||||||
=====
|
|
||||||
* native-window-placement: Adjust to gnome-shell changes [Florian; !164]
|
|
||||||
* windows-navigator: Adjust to gnome-shell changes [Florian; !163]
|
|
||||||
* window-list, workspace-indicator: Only show previews for up to six workspaces
|
|
||||||
[Florian; !165]
|
|
||||||
* window-list, workspace-indicator: Improve workspace preview appearance
|
|
||||||
[Florian; !166]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Fran Dieguez [gl]
|
|
||||||
|
|
||||||
40.beta
|
|
||||||
=======
|
|
||||||
* Add tooltips to workspace thumbnails [Florian; !155]
|
|
||||||
* Drop arrows from top bar menus [Florian; !156]
|
|
||||||
* drive-menu: Mark mounts that can be unmounted as removable [Michael; !152]
|
|
||||||
* Remove horizontal-workspaces extension [Florian; !158]
|
|
||||||
* Adjust to shell overview changes [Florian; !159, !160]
|
|
||||||
* Fix crashes [Daniel; !157]
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !154, !161]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Michael Lawton, Florian Müllner, Daniel van Vugt
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Аляксей [be], A S Alam [pa]
|
|
||||||
|
|
||||||
40.alpha.1
|
|
||||||
==========
|
|
||||||
* Don't depend on sassc when building from tarball [Florian; !150]
|
|
||||||
* Port extensions preferences to GTK4 [Florian; !148]
|
|
||||||
* Misc. bug fixes and cleanups [Florian, Jonas; !149, !151, !153]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Dreßler, Florian Müllner
|
|
||||||
|
|
||||||
40.alpha
|
|
||||||
========
|
|
||||||
* window-list: Honor changes in skip-taskbar property [Sergio; !130]
|
|
||||||
* window-list, workspace-indicator: Adjust to 3.38 changes [Florian; !133]
|
|
||||||
* window-list, workspace-indicator: Improve previews in workspace thumbs
|
|
||||||
[Florian; #260, !142]
|
|
||||||
* auto-move: Improve behavior on multi-monitor setups [Florian; !135]
|
|
||||||
* windowNavigator: Adjust to 3.38 changes [Thun; #259]
|
|
||||||
* Misc. bug fixes and cleanups [Florian, Jonas Å, Jordan, Ray; !131, !136,
|
|
||||||
!137, !140, !141, !144, !146, !145]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Sergio Costas, Florian Müllner, Jordan Petridis, Thun Pin, Ray Strode,
|
|
||||||
Jonas Ådahl
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Fabio Tomat [fur], Jordi Mas [ca]
|
|
||||||
|
|
||||||
3.38.1
|
|
||||||
======
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Yacine Bouklif, Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Yacine Bouklif [kab], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru],
|
|
||||||
Yosef Or Boczko [he]
|
|
||||||
|
|
||||||
3.38.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Balázs Meskó [hu], Alan Mortensen [da], Juliano Camargo [pt], Tim Sabsch [de],
|
|
||||||
Milo Casagrande [it], Rūdolfs Mazurs [lv]
|
|
||||||
|
|
||||||
3.37.92
|
|
||||||
=======
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Nathan Follens [nl], Zander Brown [en_GB], Aurimas Černius [lt],
|
|
||||||
Marek Černocký [cs], Changwoo Ryu [ko], Dušan Kazik [sk]
|
|
||||||
|
|
||||||
3.37.91
|
|
||||||
=======
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Fran Dieguez [gl], Akarshan Biswas [bn_IN], Kukuh Syafaat [id],
|
|
||||||
Piotr Drąg [pl], Rafael Fontenelle [pt_BR], Jiri Grönroos [fi],
|
|
||||||
Марко Костић [sr], Goran Vidović [hr]
|
|
||||||
|
|
||||||
3.37.90
|
|
||||||
=======
|
|
||||||
* Misc. bug fixes and cleanups [Florian, Piotr; !126, !128]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Piotr Drąg, Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Fabio Tomat [fur], Efstathios Iosifidis [el], Anders Jonsson [sv],
|
|
||||||
Asier Sarasua Garmendia [eu], Alexandre Franke [fr]
|
|
||||||
|
|
||||||
3.37.3
|
|
||||||
======
|
|
||||||
* window-list, native-window-placement: Adjust to shell changes [Florian; !124]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Jordi Mas [ca], sicklylife [ja], Boyuan Yang [zh_CN],
|
|
||||||
Baurzhan Muftakhidinov [kk]
|
|
||||||
|
|
||||||
3.37.2
|
|
||||||
======
|
|
||||||
* window-list, auto-move: Modernize preference dialogs [Florian; !121]
|
|
||||||
* Adjust to gnome-shell changes [Florian; !122]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Cheng-Chia Tseng [zh_TW], Yuri Chornoivan [uk], Daniel Mustieles [es],
|
|
||||||
Emin Tufan Çetin [tr], Danial Behzadi [fa], Daniel Șerbănescu [ro],
|
|
||||||
Matej Urbančič [sl]
|
|
||||||
|
|
||||||
3.37.1
|
|
||||||
======
|
|
||||||
* drive-menu: Emphasize eject buttons [Florian; #223]
|
|
||||||
* user-theme: Add preference dialog [Florian; !117]
|
|
||||||
* window-list: Fix inconsistent state in preference dialog [Milan; !119]
|
|
||||||
* workspace-indicator: Overhaul preference dialog [Florian; !120]
|
|
||||||
* user-theme: Support session mode styles [Florian; !118]
|
|
||||||
* Misc. bug fixes and cleanups [Florian, Xiaoguang; !113, !106, !114, !116]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Milan Crha, Florian Müllner, Xiaoguang Wang
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Daniel Korostil [uk], Yosef Or Boczko [he], Kristjan SCHMIDT [eo],
|
|
||||||
Dz Chen [zh_CN], Danial Behzadi [fa], Yuri Chornoivan [uk],
|
|
||||||
Anders Jonsson [sv], Daniel Mustieles [es]
|
|
||||||
|
|
||||||
3.36.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
3.35.91
|
|
||||||
=======
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Zander Brown [en_GB]
|
|
||||||
|
|
||||||
3.35.90
|
|
||||||
=======
|
|
||||||
* Adjust to gnome-shell changes [Florian; !100, !101, !102]
|
|
||||||
* Force single-line window titles in window list [Florian; #202]
|
|
||||||
* Misc. bug fixes and cleanup [Florian; !104, !105]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms]
|
|
||||||
|
|
||||||
3.35.3
|
|
||||||
======
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Fran Dieguez [gl]
|
|
||||||
|
|
||||||
3.35.2
|
|
||||||
======
|
|
||||||
* Adjust to gnome-shell changes [Marco, Florian; !89, !95, !96]
|
|
||||||
* window-list, workspace-indicator: Exclude DESKTOP windows from previews
|
|
||||||
[Florian; !93]
|
|
||||||
* screenshot-window-sizer: Fix cycling through all valid sizes [Willy; !97]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Marco Trevisan (Treviño), Florian Müllner, Willy Stadnick
|
|
||||||
|
|
||||||
3.34.1
|
|
||||||
======
|
|
||||||
* Adjust to gnome-settings-daemon plugin removals [Xiaoguang; !94]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner, Xiaoguang Wang
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Nathan Follens [nl], Dušan Kazik [sk], Ask Hjorth Larsen [da],
|
|
||||||
Yi-Jyun Pan [zh_TW]
|
|
||||||
|
|
||||||
3.34.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Rafael Fontenelle [pt_BR], Efstathios Iosifidis [el], Milo Casagrande [it],
|
|
||||||
Sabri Ünal [tr]
|
|
||||||
|
|
||||||
3.33.92
|
|
||||||
=======
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Марко Костић [sr], Tim Sabsch [de], Rūdolfs Mazurs [lv], Matej Urbančič [sl],
|
|
||||||
Balázs Úr [hu], Claude Paroz [fr], Fran Dieguez [gl], Changwoo Ryu [ko],
|
|
||||||
Ryuta Fujii [ja], Fabio Tomat [fur], Goran Vidović [hr]
|
|
||||||
|
|
||||||
3.33.91
|
|
||||||
=======
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !88, !90, !91, !92]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Asier Sarasua Garmendia [eu], Anders Jonsson [sv], Marek Černocký [cs],
|
|
||||||
Kukuh Syafaat [id], Jiri Grönroos [fi], Florentina Mușat [ro],
|
|
||||||
Aurimas Černius [lt], Daniel Mustieles [es], Piotr Drąg [pl], Jordi Mas [ca],
|
|
||||||
Danial Behzadi [fa]
|
|
||||||
3.33.90
|
|
||||||
=======
|
|
||||||
* window-list: Support showing windows from all workspaces [Florian; #154]
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !86, !87]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Jor Teron [mjw]
|
|
||||||
|
|
||||||
3.33.4
|
|
||||||
======
|
|
||||||
* Make GNOME Classic more classic:
|
|
||||||
- Disable GNOME 3 overview [Florian; !69]
|
|
||||||
- Add window picker button to window list [Florian; !73, !80]
|
|
||||||
- Style improvements and fixes [Jakub; #169, !82]
|
|
||||||
- Support horizontal workspace layout in window list [Florian; !70]
|
|
||||||
- Add draggable previews to window list workspace switcher [Florian; !74]
|
|
||||||
- Arrange workspaces horizontally [Florian; !72]
|
|
||||||
* workspace-indicator: Support horizontal workspace layout [Florian; !71]
|
|
||||||
* workspace-indicator: Add draggable previews [Florian; !77]
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !75, !76, !79, !78, #168, !84]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner, Jakub Steiner, Jor Teron
|
|
||||||
|
|
||||||
Translators:
|
|
||||||
Jor Teron [mjw]
|
|
||||||
|
|
||||||
3.33.3
|
|
||||||
======
|
|
||||||
* Misc. bug fixes [Florian, Marco; !67, !68]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner, Marco Trevisan (Treviño)
|
|
||||||
|
|
||||||
3.33.2
|
|
||||||
======
|
|
||||||
* Misc. bug fixes and cleanups [Florian; !66]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
3.33.1
|
|
||||||
======
|
|
||||||
* Misc. bug fixes [Florian; !64]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
3.32.1
|
|
||||||
======
|
|
||||||
* Fix windowsNavigator extension after ES6 port [Florian; #143]
|
|
||||||
* screenshot-window-sizer: Add phone screenshot sizes [Adrien; !65]
|
|
||||||
* Misc. bug fixes and cleanups [Fabian; !62]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Florian Müllner, Adrien Plazas, Fabian P. Schmidt
|
|
||||||
|
|
||||||
3.32.0
|
3.32.0
|
||||||
======
|
======
|
||||||
|
|
||||||
|
|||||||
@@ -15,12 +15,6 @@ Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
|
|||||||
|
|
||||||
## Extensions
|
## Extensions
|
||||||
|
|
||||||
* 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
|
* apps-menu
|
||||||
|
|
||||||
Lets you reach an application using gnome 2.x style menu on the panel.
|
Lets you reach an application using gnome 2.x style menu on the panel.
|
||||||
@@ -69,19 +63,6 @@ GSettings key.
|
|||||||
|
|
||||||
Adds a simple workspace switcher to the top bar.
|
Adds a simple workspace switcher to the top bar.
|
||||||
|
|
||||||
## Default branch
|
|
||||||
|
|
||||||
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
|
## License
|
||||||
|
|
||||||
GNOME Shell Extensions are distributed under the terms of the GNU General
|
GNOME Shell Extensions are distributed under the terms of the GNU General
|
||||||
@@ -93,4 +74,3 @@ file for details.
|
|||||||
[shell-page]: https://wiki.gnome.org/Projects/GnomeShell
|
[shell-page]: https://wiki.gnome.org/Projects/GnomeShell
|
||||||
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
|
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/issues
|
||||||
[license]: COPYING
|
[license]: COPYING
|
||||||
[alternatetab-post]: https://blogs.gnome.org/fmuellner/2018/10/11/the-future-of-alternatetab-and-why-you-need-not-worry/
|
|
||||||
|
|||||||
@@ -0,0 +1,178 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
id="svg10621"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="calendar-today.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10623">
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient99561-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient34508-1-3">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop34510-1-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop34512-4-5" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
r="42"
|
||||||
|
fy="30"
|
||||||
|
fx="51"
|
||||||
|
cy="30"
|
||||||
|
cx="51"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="radialGradient10592"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3770"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3001"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3007"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3067"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient3072"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient34508-1-3"
|
||||||
|
id="radialGradient2997"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
|
||||||
|
cx="51"
|
||||||
|
cy="30"
|
||||||
|
fx="51"
|
||||||
|
fy="30"
|
||||||
|
r="42" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#d3d3d3"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="8"
|
||||||
|
inkscape:cx="-55.349829"
|
||||||
|
inkscape:cy="-31.442864"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="2133"
|
||||||
|
inkscape:window-height="1241"
|
||||||
|
inkscape:window-x="238"
|
||||||
|
inkscape:window-y="89"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid3109"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10626">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-469.08263,-537.99307)">
|
||||||
|
<circle
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:0.23756906;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="path7305"
|
||||||
|
cx="481.57138"
|
||||||
|
cy="559.4649"
|
||||||
|
r="1.5" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 5.6 KiB |
@@ -0,0 +1,262 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="65"
|
||||||
|
height="22"
|
||||||
|
id="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-off-intl.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5-3">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7-6"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0-3" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="spiro"
|
||||||
|
id="path-effect62829-6-8-0"
|
||||||
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8-1">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4-2"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
y2="507.42715"
|
||||||
|
x2="702.58966"
|
||||||
|
y1="484.49405"
|
||||||
|
x1="702.58966"
|
||||||
|
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient11647"
|
||||||
|
xlink:href="#linearGradient62821-5-8-1"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath65663">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
|
||||||
|
id="rect65665"
|
||||||
|
width="96.999924"
|
||||||
|
height="24.292892"
|
||||||
|
x="708.71954"
|
||||||
|
y="406.96973"
|
||||||
|
rx="3.1139846"
|
||||||
|
ry="1.9595497"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/content selection/content-selection.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
|
||||||
|
id="linearGradient65582"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.5250827,0,0,0.72144839,620.16092,156.4917)"
|
||||||
|
x1="207.17195"
|
||||||
|
y1="497.39584"
|
||||||
|
x2="207.17195"
|
||||||
|
y2="531.48669" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f4f6f4;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop5380-6-1-1-9-3-6-3-6-45-6-4-4-9-9-8-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d7dad7;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop5382-06-3-6-4-2-4-6-8-0-9-6-8-7-7-6-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient65584">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f1f1f1;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop65586" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#a7aba7;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop65588" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
|
||||||
|
id="linearGradient65582-5"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.5250827,0,0,0.72144839,-75.348673,-359.16458)"
|
||||||
|
x1="207.17195"
|
||||||
|
y1="497.39584"
|
||||||
|
x2="207.17195"
|
||||||
|
y2="531.48669" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient65584"
|
||||||
|
id="linearGradient65590-6"
|
||||||
|
x1="716.62506"
|
||||||
|
y1="537.23358"
|
||||||
|
x2="716.62506"
|
||||||
|
y2="535.23358"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0139469,0,0,1.0139469,-705.52354,-521.99915)" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="23.565368"
|
||||||
|
inkscape:cy="19.596892"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="fill:#cecece;fill-opacity:1;stroke:#a7a7a7;stroke-width:1;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;solid-color:#000000;solid-opacity:1;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="fill:url(#linearGradient65582);fill-opacity:1;stroke:#a7a7a7;stroke-width:0.97313344;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;color:#000000;clip-rule:nonzero;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="646.55896"
|
||||||
|
y="485.61429"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-38.048674,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0"
|
||||||
|
id="path62947"
|
||||||
|
d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g11665"
|
||||||
|
transform="matrix(0.78906097,0,0,0.78906097,178.78814,111.57844)" />
|
||||||
|
<path
|
||||||
|
sodipodi:type="arc"
|
||||||
|
id="path3016"
|
||||||
|
sodipodi:cx="50.375"
|
||||||
|
sodipodi:cy="11.875"
|
||||||
|
sodipodi:rx="4.625"
|
||||||
|
sodipodi:ry="4.625"
|
||||||
|
d="M 55,11.875 A 4.625,4.625 0 0 1 50.375,16.5 4.625,4.625 0 0 1 45.75,11.875 4.625,4.625 0 0 1 50.375,7.25 4.625,4.625 0 0 1 55,11.875 Z"
|
||||||
|
transform="translate(642.41421,512.02037)"
|
||||||
|
style="fill:none;stroke:#2e3436;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.5 KiB |
@@ -0,0 +1,222 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="65"
|
||||||
|
height="22"
|
||||||
|
id="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-off-us.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5-3">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7-6"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0-3" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="spiro"
|
||||||
|
id="path-effect62829-6-8-0"
|
||||||
|
is_visible="true" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62821-5-8-1">
|
||||||
|
<stop
|
||||||
|
id="stop62823-2-4-2"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#d1d3d1;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop62825-3-8-9"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1;" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
y2="507.42715"
|
||||||
|
x2="702.58966"
|
||||||
|
y1="484.49405"
|
||||||
|
x1="702.58966"
|
||||||
|
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="linearGradient11647"
|
||||||
|
xlink:href="#linearGradient62821-5-8-1"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9"
|
||||||
|
id="linearGradient65582"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.5250827,0,0,0.72144839,620.16092,156.4917)"
|
||||||
|
x1="207.17195"
|
||||||
|
y1="497.39584"
|
||||||
|
x2="207.17195"
|
||||||
|
y2="531.48669" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient5378-2-5-9-9-0-80-7-6-8-4-5-7-3-6-2-9">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#f4f6f4;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop5380-6-1-1-9-3-6-3-6-45-6-4-4-9-9-8-9" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d7dad7;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop5382-06-3-6-4-2-4-6-8-0-9-6-8-7-7-6-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0-6"
|
||||||
|
effect="spiro" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="78.222729"
|
||||||
|
inkscape:cy="-3.6620078"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#cecece;fill-opacity:1;fill-rule:nonzero;stroke:#a7a7a7;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:new"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient65582);fill-opacity:1;fill-rule:nonzero;stroke:#a7a7a7;stroke-width:0.97313344;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="646.55896"
|
||||||
|
y="485.61429"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-38.048674,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0-6"
|
||||||
|
id="path62947"
|
||||||
|
d="m 647.78241,486.57192 27.73523,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g11665"
|
||||||
|
transform="matrix(0.78906097,0,0,0.78906097,167.78814,111.57844)">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:12.69556618px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2e3436;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
|
x="644.46393"
|
||||||
|
y="533.87158"
|
||||||
|
id="text62949"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
transform="scale(1.0113976,0.98873084)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan62951"
|
||||||
|
x="644.46393"
|
||||||
|
y="533.87158">OFF</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.0 KiB |
@@ -0,0 +1,175 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="65"
|
||||||
|
height="22"
|
||||||
|
id="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-on-intl.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient38513"
|
||||||
|
id="linearGradient38519"
|
||||||
|
x1="690"
|
||||||
|
y1="506.25049"
|
||||||
|
x2="690"
|
||||||
|
y2="480.93414"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient38513">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#729fcf;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop38515" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#6f9ccd;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop38517" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient62852-6-5"
|
||||||
|
id="linearGradient62981-1-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
|
||||||
|
x1="740"
|
||||||
|
y1="486.10501"
|
||||||
|
x2="740"
|
||||||
|
y2="505.3204" />
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0-8"
|
||||||
|
effect="spiro" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="9.3225163"
|
||||||
|
inkscape:cy="-0.1588306"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#linearGradient38519);fill-opacity:1;fill-rule:nonzero;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="676.49646"
|
||||||
|
y="485.67679"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-7.9861743,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0-8"
|
||||||
|
id="path62947"
|
||||||
|
d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4444"
|
||||||
|
d="m 661.91421,522.09451 0,7"
|
||||||
|
style="fill:#3465a4;stroke:#3465a4;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
|
||||||
|
d="m 18,7.96875 0,7"
|
||||||
|
id="path3922"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
transform="translate(643.91421,513.06326)" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 6.2 KiB |
@@ -0,0 +1,209 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="65"
|
||||||
|
height="22"
|
||||||
|
id="svg10865"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="classic-toggle-on-us.svg">
|
||||||
|
<defs
|
||||||
|
id="defs10867">
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient62852-6-5"
|
||||||
|
id="linearGradient62981-1-1"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
|
||||||
|
x1="740"
|
||||||
|
y1="486.10501"
|
||||||
|
x2="740"
|
||||||
|
y2="505.3204" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient62852-6-5">
|
||||||
|
<stop
|
||||||
|
id="stop62854-6-7"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#eeeeec;stop-opacity:1"
|
||||||
|
offset="0.97726452"
|
||||||
|
id="stop62858-8-0" />
|
||||||
|
<stop
|
||||||
|
id="stop62860-5-3"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#f5f5f4;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect62989-8-0"
|
||||||
|
effect="spiro" />
|
||||||
|
<clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath65663">
|
||||||
|
<rect
|
||||||
|
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;enable-background:new"
|
||||||
|
id="rect65665"
|
||||||
|
width="96.999924"
|
||||||
|
height="24.292892"
|
||||||
|
x="708.71954"
|
||||||
|
y="406.96973"
|
||||||
|
rx="3.1139846"
|
||||||
|
ry="1.9595497"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/content selection/content-selection.png"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-ydpi="90" />
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient38513"
|
||||||
|
id="linearGradient38519"
|
||||||
|
x1="690"
|
||||||
|
y1="506.25049"
|
||||||
|
x2="690"
|
||||||
|
y2="480.93414"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient38513">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#729fcf;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop38515" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#6f9ccd;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop38517" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
gradientTransform="translate(-644,-483)"
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient38513"
|
||||||
|
id="linearGradient38519-3"
|
||||||
|
x1="690"
|
||||||
|
y1="506.25049"
|
||||||
|
x2="690"
|
||||||
|
y2="480.93414"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="20.775745"
|
||||||
|
inkscape:cy="7.0434022"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g62929"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:snap-nodes="false"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:snap-others="false"
|
||||||
|
inkscape:window-width="2560"
|
||||||
|
inkscape:window-height="1342"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="28"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
showborder="false">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11512" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata10870">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1030.3622)">
|
||||||
|
<g
|
||||||
|
inkscape:export-ydpi="90"
|
||||||
|
inkscape:export-xdpi="90"
|
||||||
|
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
|
||||||
|
style="display:inline"
|
||||||
|
id="g62929"
|
||||||
|
transform="translate(-643.91421,517.29894)">
|
||||||
|
<g
|
||||||
|
transform="translate(0,30)"
|
||||||
|
id="g62931">
|
||||||
|
<rect
|
||||||
|
style="fill:url(#linearGradient38519);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
|
id="rect62935"
|
||||||
|
width="63.856125"
|
||||||
|
height="21.093594"
|
||||||
|
x="644.5"
|
||||||
|
y="483.5"
|
||||||
|
rx="2"
|
||||||
|
ry="2" />
|
||||||
|
<rect
|
||||||
|
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#3465a4;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||||
|
id="rect62937"
|
||||||
|
width="29.97398"
|
||||||
|
height="17.022524"
|
||||||
|
x="676.49646"
|
||||||
|
y="485.67679"
|
||||||
|
rx="1"
|
||||||
|
ry="1" />
|
||||||
|
<g
|
||||||
|
transform="translate(-7.9861743,-1.9445437)"
|
||||||
|
id="g62939" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
inkscape:path-effect="#path-effect62989-8-0"
|
||||||
|
id="path62947"
|
||||||
|
d="m 677.59874,486.57192 27.94632,0"
|
||||||
|
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
<text
|
||||||
|
transform="scale(1.0113976,0.98873084)"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text62949-7"
|
||||||
|
y="534.96918"
|
||||||
|
x="646.71399"
|
||||||
|
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3465a4;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold;"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="534.96918"
|
||||||
|
x="646.71399"
|
||||||
|
id="tspan62951-7"
|
||||||
|
sodipodi:role="line">ON</tspan></text>
|
||||||
|
<text
|
||||||
|
transform="scale(1.0113976,0.98873084)"
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text62949"
|
||||||
|
y="533.94482"
|
||||||
|
x="646.71399"
|
||||||
|
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
y="533.94482"
|
||||||
|
x="646.71399"
|
||||||
|
id="tspan62951"
|
||||||
|
sodipodi:role="line">ON</tspan></text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.5 KiB |
@@ -1,10 +1,8 @@
|
|||||||
{
|
{
|
||||||
"parentMode": "user",
|
"parentMode": "user",
|
||||||
"stylesheetName": "gnome-classic.css",
|
"stylesheetName": "gnome-classic.css",
|
||||||
"hasOverview": false,
|
|
||||||
"showWelcomeDialog": false,
|
|
||||||
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
|
||||||
"panel": { "left": ["appMenu"],
|
"panel": { "left": ["activities", "appMenu"],
|
||||||
"center": [],
|
"center": [],
|
||||||
"right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"]
|
"right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=GNOME Classic on Wayland
|
|
||||||
Comment=This session logs you into GNOME Classic
|
|
||||||
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
|
|
||||||
TryExec=gnome-session
|
|
||||||
Type=Application
|
|
||||||
DesktopNames=GNOME-Classic;GNOME;
|
|
||||||
X-GDM-SessionRegisters=true
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
[Desktop Entry]
|
|
||||||
Name=GNOME Classic on Xorg
|
|
||||||
Comment=This session logs you into GNOME Classic
|
|
||||||
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
|
|
||||||
TryExec=gnome-session
|
|
||||||
Type=Application
|
|
||||||
DesktopNames=GNOME-Classic;GNOME;
|
|
||||||
X-GDM-SessionRegisters=true
|
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Name=GNOME Classic
|
Name=GNOME Classic
|
||||||
Comment=This session logs you into GNOME Classic
|
Comment=This session logs you into GNOME Classic
|
||||||
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session
|
Exec=env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic
|
||||||
TryExec=gnome-session
|
TryExec=gnome-session
|
||||||
Type=Application
|
Type=Application
|
||||||
DesktopNames=GNOME-Classic;GNOME;
|
DesktopNames=GNOME-Classic;GNOME;
|
||||||
X-GDM-SessionRegisters=true
|
|
||||||
|
|||||||
+35
-25
@@ -4,7 +4,6 @@ $variant: 'light';
|
|||||||
@import "gnome-shell-sass/_colors"; //use gtk colors
|
@import "gnome-shell-sass/_colors"; //use gtk colors
|
||||||
@import "gnome-shell-sass/_drawing";
|
@import "gnome-shell-sass/_drawing";
|
||||||
@import "gnome-shell-sass/_common";
|
@import "gnome-shell-sass/_common";
|
||||||
@import "gnome-shell-sass/_widgets";
|
|
||||||
|
|
||||||
/* Overrides */
|
/* Overrides */
|
||||||
|
|
||||||
@@ -33,32 +32,18 @@ $variant: 'light';
|
|||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
color: $fg_color;
|
color: $fg_color;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
transition-duration: 0ms;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 0px;
|
|
||||||
|
|
||||||
&.clock-display {
|
|
||||||
.clock {
|
|
||||||
transition-duration: 0ms;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 0px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
color: lighten($fg_color,10%);
|
|
||||||
text-shadow: none;
|
|
||||||
& .system-status-icon { icon-shadow: none; }
|
|
||||||
}
|
|
||||||
&:active, &:overview, &:focus, &:checked {
|
&:active, &:overview, &:focus, &:checked {
|
||||||
// Trick due to St limitations. It needs a background to draw
|
// Trick due to St limitations. It needs a background to draw
|
||||||
// a box-shadow
|
// a box-shadow
|
||||||
background-color: $selected_bg_color;
|
background-color: $selected_bg_color !important;
|
||||||
color: $selected_fg_color;
|
color: $selected_fg_color !important;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
& > .system-status-icon { icon-shadow: none; }
|
& > .system-status-icon { icon-shadow: none; }
|
||||||
}
|
}
|
||||||
|
&:hover {
|
||||||
|
text-shadow: none;
|
||||||
|
& .system-status-icon { icon-shadow: none; }
|
||||||
|
}
|
||||||
.app-menu-icon { width: 0; height: 0; margin: 0; } // shell's display:none; :D
|
.app-menu-icon { width: 0; height: 0; margin: 0; } // shell's display:none; :D
|
||||||
|
|
||||||
.system-status-icon {
|
.system-status-icon {
|
||||||
@@ -75,17 +60,18 @@ $variant: 'light';
|
|||||||
&.lock-screen,
|
&.lock-screen,
|
||||||
&.unlock-screen,
|
&.unlock-screen,
|
||||||
&.login-screen {
|
&.login-screen {
|
||||||
background-color: transparentize($bg_color, 0.5);
|
background-color: transparentize($_bubble_bg_color, 0.5);
|
||||||
background-gradient-start: transparentize($bg_color, 0.5);
|
background-gradient-start: transparentize($_bubble_bg_color, 0.5);
|
||||||
background-gradient-end: transparentize($bg_color, 0.5);
|
background-gradient-end: transparentize($_bubble_bg_color, 0.5);
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
.panel-button { color: $osd_fg_color; }
|
.panel-button { color: $osd_fg_color; }
|
||||||
}
|
}
|
||||||
|
.popup-menu-arrow { width: 0; height: 0; } // shell's display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#appMenu {
|
#appMenu {
|
||||||
|
padding: 0 8px 0 8px;
|
||||||
spinner-image: url("classic-process-working.svg");
|
spinner-image: url("classic-process-working.svg");
|
||||||
.panel-status-menu-box { padding: 0; }
|
|
||||||
}
|
}
|
||||||
.tile-preview-left.on-primary,
|
.tile-preview-left.on-primary,
|
||||||
.tile-preview-right.on-primary,
|
.tile-preview-right.on-primary,
|
||||||
@@ -93,3 +79,27 @@ $variant: 'light';
|
|||||||
/* keep in sync with -panel-corner-radius */
|
/* keep in sync with -panel-corner-radius */
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@each $v in us, intl {
|
||||||
|
.toggle-switch-#{$v} {
|
||||||
|
background-image: url("classic-toggle-off-#{$v}.svg");
|
||||||
|
&:checked { background-image: url("classic-toggle-on-#{$v}.svg"); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-with-events {
|
||||||
|
background-image: url("calendar-today.svg");
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list-clear-button.button {
|
||||||
|
color: $fg_color
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-banner {
|
||||||
|
background-color: $bg_color !important;
|
||||||
|
color: $fg_color;
|
||||||
|
.notification-button {
|
||||||
|
background-color: darken($bg_color,5%);
|
||||||
|
&:hover, &focus { background-color: darken($bg_color,2%); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[GNOME Session]
|
||||||
|
Name=GNOME Classic
|
||||||
|
RequiredComponents=org.gnome.Shell;org.gnome.SettingsDaemon.A11ySettings;org.gnome.SettingsDaemon.Clipboard;org.gnome.SettingsDaemon.Color;org.gnome.SettingsDaemon.Datetime;org.gnome.SettingsDaemon.Housekeeping;org.gnome.SettingsDaemon.Keyboard;org.gnome.SettingsDaemon.MediaKeys;org.gnome.SettingsDaemon.Mouse;org.gnome.SettingsDaemon.Power;org.gnome.SettingsDaemon.PrintNotifications;org.gnome.SettingsDaemon.Rfkill;org.gnome.SettingsDaemon.ScreensaverProxy;org.gnome.SettingsDaemon.Sharing;org.gnome.SettingsDaemon.Smartcard;org.gnome.SettingsDaemon.Sound;org.gnome.SettingsDaemon.Wacom;org.gnome.SettingsDaemon.XSettings;
|
||||||
Submodule data/gnome-shell-sass deleted from 3b4f08fe98
@@ -0,0 +1,339 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc. <http://fsf.org>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program 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 program 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.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# GNOME Shell Sass
|
||||||
|
GNOME Shell Sass is a project intended to allow the sharing of the
|
||||||
|
theme sources in sass between gnome-shell and other projects like
|
||||||
|
gnome-shell-extensions.
|
||||||
|
|
||||||
|
Any changes should be done in the [GNOME Shell subtree][shell-subtree]
|
||||||
|
and not the stand-alone [gnome-shell-sass repository][sass-repo]. They
|
||||||
|
will then be synchronized periodically before releases.
|
||||||
|
|
||||||
|
## License
|
||||||
|
GNOME Shell Sass is distributed under the terms of the GNU General Public
|
||||||
|
License, version 2 or later. See the [COPYING][license] file for details.
|
||||||
|
|
||||||
|
[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass
|
||||||
|
[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
|
||||||
|
[license]: COPYING
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
// When color definition differs for dark and light variant,
|
||||||
|
// it gets @if ed depending on $variant
|
||||||
|
|
||||||
|
|
||||||
|
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
|
||||||
|
$bg_color: if($variant == 'light', #f6f5f4, desaturate(#3d3846, 10%));
|
||||||
|
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
||||||
|
|
||||||
|
$selected_fg_color: #ffffff;
|
||||||
|
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%));
|
||||||
|
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
||||||
|
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%));
|
||||||
|
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
|
||||||
|
$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
|
||||||
|
$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
|
||||||
|
$top_hilight: $borders_edge;
|
||||||
|
|
||||||
|
$warning_color: #f57900;
|
||||||
|
$error_color: #cc0000;
|
||||||
|
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
||||||
|
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
||||||
|
|
||||||
|
$osd_fg_color: #eeeeec;
|
||||||
|
$osd_bg_color: #2e3436;
|
||||||
|
$osd_borders_color: transparentize(black, 0.3);
|
||||||
|
$osd_outer_borders_color: transparentize(white, 0.9);
|
||||||
|
|
||||||
|
$tooltip_borders_color: $osd_outer_borders_color;
|
||||||
|
|
||||||
|
//insensitive state derived colors
|
||||||
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
|
||||||
|
$insensitive_borders_color: $borders_color;
|
||||||
|
|
||||||
|
//colors for the backdrop state, derived from the main colors.
|
||||||
|
$backdrop_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%));
|
||||||
|
$backdrop_bg_color: $bg_color;
|
||||||
|
$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
|
||||||
|
$backdrop_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%));
|
||||||
|
$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
|
||||||
|
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,221 @@
|
|||||||
|
// Drawing mixins
|
||||||
|
|
||||||
|
// generic drawing of more complex things
|
||||||
|
|
||||||
|
@function _widget_edge($c:$borders_edge) {
|
||||||
|
// outer highlight "used" on most widgets
|
||||||
|
@return 0 1px $c;
|
||||||
|
}
|
||||||
|
|
||||||
|
// provide font size in rem, with px fallback
|
||||||
|
@mixin fontsize($size: 24, $base: 16) {
|
||||||
|
font-size: round($size) + pt;
|
||||||
|
//font-size: ($size / $base) * 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin _shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) {
|
||||||
|
//
|
||||||
|
// Helper function to stack up to 4 box-shadows;
|
||||||
|
//
|
||||||
|
@if $shadow4!=none { box-shadow: $shadow1, $shadow2, $shadow3, $shadow4; }
|
||||||
|
@else if $shadow3!=none { box-shadow: $shadow1, $shadow2, $shadow3; }
|
||||||
|
@else if $shadow2!=none { box-shadow: $shadow1, $shadow2; }
|
||||||
|
@else { box-shadow: $shadow1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// entries
|
||||||
|
|
||||||
|
@mixin entry($t, $fc:$selected_bg_color, $edge: $borders_edge) {
|
||||||
|
//
|
||||||
|
// Entries drawing function
|
||||||
|
//
|
||||||
|
// $t: entry type
|
||||||
|
// $fc: focus color
|
||||||
|
// $edge: set to none to not draw the bottom edge or specify a color to not
|
||||||
|
// use the default one
|
||||||
|
//
|
||||||
|
// possible $t values:
|
||||||
|
// normal, focus, insensitive
|
||||||
|
//
|
||||||
|
$_inner_shadows: inset 0 2px 4px transparentize(black, 0.6);
|
||||||
|
|
||||||
|
@if $t==normal {
|
||||||
|
background-color: $base_color;
|
||||||
|
border-color: $borders_color;
|
||||||
|
@include _shadows($_inner_shadows);
|
||||||
|
|
||||||
|
}
|
||||||
|
@if $t==focus {
|
||||||
|
@include _shadows($_inner_shadows);
|
||||||
|
border-color: if($fc==$selected_bg_color,
|
||||||
|
$selected_borders_color,
|
||||||
|
darken($fc,35%));
|
||||||
|
}
|
||||||
|
@if $t==hover { }
|
||||||
|
@if $t==insensitive {
|
||||||
|
color: $insensitive_fg_color;
|
||||||
|
border-color: $insensitive_bg_color;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// buttons
|
||||||
|
|
||||||
|
@function _border_color ($c) { @return darken($c,25%); } // colored buttons want
|
||||||
|
// the border form the
|
||||||
|
// base color
|
||||||
|
|
||||||
|
@function _text_shadow_color ($tc:$fg_color, $bg:$bg_color) {
|
||||||
|
//
|
||||||
|
// calculate the color of text shadows
|
||||||
|
//
|
||||||
|
// $tc is the text color
|
||||||
|
// $bg is the background color
|
||||||
|
//
|
||||||
|
$_lbg: lightness($bg)/100%;
|
||||||
|
@if lightness($tc)<50% { @return transparentize(white,1-$_lbg/($_lbg*1.3)); }
|
||||||
|
@else { @return transparentize(black,$_lbg*0.8); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@function _button_hilight_color($c) {
|
||||||
|
//
|
||||||
|
// calculate the right top hilight color for buttons
|
||||||
|
//
|
||||||
|
// $c: base color;
|
||||||
|
//
|
||||||
|
@if lightness($c)>90% { @return white; }
|
||||||
|
@else if lightness($c)>80% { @return transparentize(white, 0.3); }
|
||||||
|
@else if lightness($c)>50% { @return transparentize(white, 0.5); }
|
||||||
|
@else if lightness($c)>40% { @return transparentize(white, 0.7); }
|
||||||
|
@else { @return transparentize(white, 0.9); }
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin _button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
|
||||||
|
//
|
||||||
|
// helper function for the text emboss effect
|
||||||
|
//
|
||||||
|
// $tc is the optional text color, not the shadow color
|
||||||
|
//
|
||||||
|
// TODO: this functions needs a way to deal with special cases
|
||||||
|
//
|
||||||
|
|
||||||
|
$_shadow: _text_shadow_color($tc, $bg);
|
||||||
|
|
||||||
|
@if lightness($tc)<50% {
|
||||||
|
text-shadow: 0 1px $_shadow;
|
||||||
|
icon-shadow: 0 1px $_shadow;
|
||||||
|
}
|
||||||
|
@else {
|
||||||
|
text-shadow: 0 -1px $_shadow;
|
||||||
|
icon-shadow: 0 -1px $_shadow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@mixin button($t, $c:$osd_bg_color, $tc:$fg_color, $edge: $borders_edge) {
|
||||||
|
//
|
||||||
|
// Button drawing function
|
||||||
|
//
|
||||||
|
// $t: button type,
|
||||||
|
// $c: base button color for colored* types
|
||||||
|
// $tc: optional text color for colored* types
|
||||||
|
// $edge: set to none to not draw the bottom edge or specify a color to not
|
||||||
|
// use the default one
|
||||||
|
//
|
||||||
|
// possible $t values:
|
||||||
|
// normal, hover, active, insensitive, insensitive-active,
|
||||||
|
// backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active,
|
||||||
|
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
|
||||||
|
//
|
||||||
|
|
||||||
|
$_hilight_color: _button_hilight_color($c);
|
||||||
|
$_button_edge: if($edge == none, none, _widget_edge($edge));
|
||||||
|
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
|
||||||
|
|
||||||
|
|
||||||
|
@if $t==normal {
|
||||||
|
//
|
||||||
|
// normal button
|
||||||
|
//
|
||||||
|
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.5),
|
||||||
|
$osd_bg_color);
|
||||||
|
|
||||||
|
color: $osd_fg_color;
|
||||||
|
background-color: $_bg;
|
||||||
|
border-color: $osd_borders_color;
|
||||||
|
box-shadow: inset 0 1px lighten($osd_bg_color,10%);
|
||||||
|
text-shadow: 0 1px black;
|
||||||
|
icon-shadow: 0 1px black;
|
||||||
|
}
|
||||||
|
@if $t==focus {
|
||||||
|
//
|
||||||
|
// focused button
|
||||||
|
//
|
||||||
|
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
|
||||||
|
lighten($osd_bg_color,3%));
|
||||||
|
|
||||||
|
color: $osd_fg_color;
|
||||||
|
text-shadow: 0 1px black;
|
||||||
|
icon-shadow: 0 1px black;
|
||||||
|
box-shadow: inset 0px 0px 0px 1px $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
@else if $t==hover {
|
||||||
|
//
|
||||||
|
// active osd button
|
||||||
|
//
|
||||||
|
$_bg: if($c!=$osd_bg_color, transparentize($c, 0.3),
|
||||||
|
lighten($osd_bg_color,3%));
|
||||||
|
|
||||||
|
color: white;
|
||||||
|
border-color: $osd_borders_color;
|
||||||
|
background-color: $_bg;
|
||||||
|
box-shadow: inset 0 1px lighten($osd_bg_color,20%);
|
||||||
|
text-shadow: 0 1px black;
|
||||||
|
icon-shadow: 0 1px black;
|
||||||
|
|
||||||
|
}
|
||||||
|
@else if $t==active {
|
||||||
|
//
|
||||||
|
// active osd button
|
||||||
|
//
|
||||||
|
$_bg: if($c!=$bg_color, $c, $osd_borders_color);
|
||||||
|
|
||||||
|
color: white;
|
||||||
|
border-color: $osd_borders_color;
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
// This should be none, but it's creating some issues with borders, so to
|
||||||
|
// workaround it for now, use inset wich goes through a different code path.
|
||||||
|
// see https://bugzilla.gnome.org/show_bug.cgi?id=752934
|
||||||
|
box-shadow: inset 0 0 black;
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none;
|
||||||
|
}
|
||||||
|
@else if $t==insensitive {
|
||||||
|
//
|
||||||
|
// insensitive osd button
|
||||||
|
//
|
||||||
|
$_bg: transparentize(mix($insensitive_fg_color,$osd_bg_color,20%),0.3);
|
||||||
|
|
||||||
|
color: $insensitive_fg_color;
|
||||||
|
border-color: $osd_borders_color;
|
||||||
|
background-color: $_bg;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none;
|
||||||
|
}
|
||||||
|
@else if $t==undecorated {
|
||||||
|
//
|
||||||
|
// reset
|
||||||
|
//
|
||||||
|
border-color: transparent;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: none;
|
||||||
|
|
||||||
|
@include _shadows(inset 0 1px transparentize(white,1),
|
||||||
|
$_blank_edge);
|
||||||
|
|
||||||
|
text-shadow: none;
|
||||||
|
icon-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
// When color definition differs for dark and light variant,
|
||||||
|
// it gets @if ed depending on $variant
|
||||||
|
|
||||||
|
|
||||||
|
$base_color: #222;
|
||||||
|
$bg_color: #000;
|
||||||
|
$fg_color: #fff;
|
||||||
|
|
||||||
|
$selected_fg_color: #ffffff;
|
||||||
|
$selected_bg_color: darken(#4a90d9,20%);
|
||||||
|
$selected_borders_color: darken($selected_bg_color, 20%);
|
||||||
|
$borders_color: darken($bg_color,12%);
|
||||||
|
$borders_edge: transparentize($fg_color, 0.9);
|
||||||
|
$link_color: lighten($selected_bg_color,20%);
|
||||||
|
$link_visited_color: lighten($selected_bg_color,10%);
|
||||||
|
$top_hilight: $borders_edge;
|
||||||
|
|
||||||
|
$warning_color: #f57900;
|
||||||
|
$error_color: #cc0000;
|
||||||
|
$success_color: darken(#73d216,10%);
|
||||||
|
$destructive_color: darken(#ef2929,10%);
|
||||||
|
|
||||||
|
$osd_fg_color: #eeeeec;
|
||||||
|
$osd_bg_color: #2e3436;
|
||||||
|
$osd_borders_color: transparentize(black, 0.3);
|
||||||
|
$osd_outer_borders_color: transparentize(white, 0.9);
|
||||||
|
|
||||||
|
$tooltip_borders_color: $osd_outer_borders_color;
|
||||||
|
|
||||||
|
//insensitive state derived colors
|
||||||
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
|
||||||
|
$insensitive_borders_color: $borders_color;
|
||||||
|
|
||||||
|
//colors for the backdrop state, derived from the main colors.
|
||||||
|
$backdrop_base_color: lighten($base_color,1%);
|
||||||
|
$backdrop_bg_color: $bg_color;
|
||||||
|
$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
|
||||||
|
$backdrop_insensitive_color: lighten($backdrop_bg_color,15%);
|
||||||
|
$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
|
||||||
|
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<Project xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
|
||||||
|
xmlns:foaf="http://xmlns.com/foaf/0.1/"
|
||||||
|
xmlns:gnome="http://api.gnome.org/doap-extensions#"
|
||||||
|
xmlns="http://usefulinc.com/ns/doap#">
|
||||||
|
|
||||||
|
<name xml:lang="en">GNOME Shell Sass</name>
|
||||||
|
<shortdesc xml:lang="en">Sass sources of GNOME Shell</shortdesc>
|
||||||
|
<description>GNOME Shell Sass is a project intended to allow the sharing of the
|
||||||
|
sass theme sources between gnome-shell and other projects like gnome-shell-extensions.</description>
|
||||||
|
|
||||||
|
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
||||||
|
<programming-language>sass</programming-language>
|
||||||
|
<programming-language>css</programming-language>
|
||||||
|
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Carlos Soriano</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:csoriano@gnome.org" />
|
||||||
|
<gnome:userid>csoriano</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Florian Müllner</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:fmuellner@gnome.org" />
|
||||||
|
<gnome:userid>fmuellner</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Jakub Steiner</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:jimmac@gmail.com" />
|
||||||
|
<gnome:userid>jimmac</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
|
</Project>
|
||||||
+28
-78
@@ -1,33 +1,17 @@
|
|||||||
session_desktop_base = 'gnome-classic'
|
sessions = [
|
||||||
|
['gnome-classic.session.desktop.in', sessiondir],
|
||||||
session_desktops = [
|
['gnome-classic.desktop.in', xsessiondir]
|
||||||
session_desktop_base,
|
|
||||||
session_desktop_base + '-xorg',
|
|
||||||
session_desktop_base + '-wayland',
|
|
||||||
]
|
]
|
||||||
|
foreach s : sessions
|
||||||
foreach name: session_desktops
|
name_array = s[0].split('.')
|
||||||
session_desktop = name + '.desktop'
|
i18n.merge_file('',
|
||||||
if name.endswith('-xorg')
|
input: s[0],
|
||||||
session_instdir = xsessiondir
|
output: '.'.join([name_array[0], name_array[1]]),
|
||||||
elif name.endswith('-wayland')
|
po_dir: '../po',
|
||||||
session_instdir = wlsessiondir
|
install: true,
|
||||||
else
|
install_dir: s[1],
|
||||||
# FIXME: The same target can not be copied into two directories.
|
type: 'desktop'
|
||||||
# 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
|
endforeach
|
||||||
|
|
||||||
classic_uuids = []
|
classic_uuids = []
|
||||||
@@ -50,62 +34,28 @@ theme_sources = files(
|
|||||||
'gnome-shell-sass/_colors.scss',
|
'gnome-shell-sass/_colors.scss',
|
||||||
'gnome-shell-sass/_common.scss',
|
'gnome-shell-sass/_common.scss',
|
||||||
'gnome-shell-sass/_drawing.scss',
|
'gnome-shell-sass/_drawing.scss',
|
||||||
'gnome-shell-sass/_high-contrast-colors.scss',
|
'gnome-shell-sass/_high-contrast-colors.scss'
|
||||||
'gnome-shell-sass/_widgets.scss',
|
|
||||||
'gnome-shell-sass/widgets/_a11y.scss',
|
|
||||||
'gnome-shell-sass/widgets/_app-grid.scss',
|
|
||||||
'gnome-shell-sass/widgets/_base.scss',
|
|
||||||
'gnome-shell-sass/widgets/_buttons.scss',
|
|
||||||
'gnome-shell-sass/widgets/_calendar.scss',
|
|
||||||
'gnome-shell-sass/widgets/_check-box.scss',
|
|
||||||
'gnome-shell-sass/widgets/_corner-ripple.scss',
|
|
||||||
'gnome-shell-sass/widgets/_dash.scss',
|
|
||||||
'gnome-shell-sass/widgets/_dialogs.scss',
|
|
||||||
'gnome-shell-sass/widgets/_entries.scss',
|
|
||||||
'gnome-shell-sass/widgets/_hotplug.scss',
|
|
||||||
'gnome-shell-sass/widgets/_ibus-popup.scss',
|
|
||||||
'gnome-shell-sass/widgets/_keyboard.scss',
|
|
||||||
'gnome-shell-sass/widgets/_login-dialog.scss',
|
|
||||||
'gnome-shell-sass/widgets/_looking-glass.scss',
|
|
||||||
'gnome-shell-sass/widgets/_message-list.scss',
|
|
||||||
'gnome-shell-sass/widgets/_misc.scss',
|
|
||||||
'gnome-shell-sass/widgets/_network-dialog.scss',
|
|
||||||
'gnome-shell-sass/widgets/_notifications.scss',
|
|
||||||
'gnome-shell-sass/widgets/_osd.scss',
|
|
||||||
'gnome-shell-sass/widgets/_overview.scss',
|
|
||||||
'gnome-shell-sass/widgets/_panel.scss',
|
|
||||||
'gnome-shell-sass/widgets/_popovers.scss',
|
|
||||||
'gnome-shell-sass/widgets/_screen-shield.scss',
|
|
||||||
'gnome-shell-sass/widgets/_scrollbars.scss',
|
|
||||||
'gnome-shell-sass/widgets/_search-entry.scss',
|
|
||||||
'gnome-shell-sass/widgets/_search-results.scss',
|
|
||||||
'gnome-shell-sass/widgets/_slider.scss',
|
|
||||||
'gnome-shell-sass/widgets/_switcher-popup.scss',
|
|
||||||
'gnome-shell-sass/widgets/_switches.scss',
|
|
||||||
'gnome-shell-sass/widgets/_window-picker.scss',
|
|
||||||
'gnome-shell-sass/widgets/_workspace-switcher.scss',
|
|
||||||
'gnome-shell-sass/widgets/_workspace-thumbnails.scss'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
theme_data = [
|
theme_data = [
|
||||||
|
'calendar-today.svg',
|
||||||
'classic-process-working.svg',
|
'classic-process-working.svg',
|
||||||
|
'classic-toggle-off-intl.svg',
|
||||||
|
'classic-toggle-off-us.svg',
|
||||||
|
'classic-toggle-on-intl.svg',
|
||||||
|
'classic-toggle-on-us.svg',
|
||||||
'gnome-classic-high-contrast.css'
|
'gnome-classic-high-contrast.css'
|
||||||
]
|
]
|
||||||
|
|
||||||
stylesheet = 'gnome-classic.css'
|
style = 'gnome-classic'
|
||||||
if fs.exists(stylesheet)
|
custom_target(style + '.css',
|
||||||
install_data(stylesheet, install_dir: themedir)
|
input: style + '.scss',
|
||||||
else
|
output: style + '.css',
|
||||||
sassc = find_program('sassc', required: true)
|
depend_files: theme_sources,
|
||||||
custom_target(stylesheet,
|
command: [sassc, '-a', '@INPUT@', '@OUTPUT@'],
|
||||||
input: fs.replace_suffix(stylesheet, '.scss'),
|
install: true,
|
||||||
output: stylesheet,
|
install_dir: themedir
|
||||||
depend_files: theme_sources,
|
)
|
||||||
command: [sassc, '-a', '@INPUT@', '@OUTPUT@'],
|
|
||||||
install: true,
|
|
||||||
install_dir: themedir
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
|
|
||||||
install_data(theme_data, install_dir: themedir)
|
install_data(theme_data, install_dir: themedir)
|
||||||
|
|
||||||
|
|||||||
Vendored
+592
@@ -0,0 +1,592 @@
|
|||||||
|
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
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
11
|
||||||
Vendored
+49
@@ -0,0 +1,49 @@
|
|||||||
|
# This file is autogenerated. DO NOT EDIT!
|
||||||
|
#
|
||||||
|
# Modifications should be made to debian/control.in instead.
|
||||||
|
# This file is regenerated automatically in the clean target.
|
||||||
|
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 Bicha <jbicha@debian.org>
|
||||||
|
Build-Depends: debhelper (>= 11.1.3),
|
||||||
|
gnome-pkg-tools,
|
||||||
|
meson (>= 0.44.0),
|
||||||
|
sassc
|
||||||
|
Rules-Requires-Root: no
|
||||||
|
Standards-Version: 4.2.1
|
||||||
|
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-atk-1.0,
|
||||||
|
gir1.2-clutter-1.0,
|
||||||
|
gir1.2-gdkpixbuf-2.0,
|
||||||
|
gir1.2-glib-2.0,
|
||||||
|
gir1.2-gmenu-3.0,
|
||||||
|
gir1.2-gtk-3.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-tweaks
|
||||||
|
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.
|
||||||
Vendored
+45
@@ -0,0 +1,45 @@
|
|||||||
|
Source: gnome-shell-extensions
|
||||||
|
Section: gnome
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
|
||||||
|
Uploaders: @GNOME_TEAM@
|
||||||
|
Build-Depends: debhelper (>= 11.1.3),
|
||||||
|
gnome-pkg-tools,
|
||||||
|
meson (>= 0.44.0),
|
||||||
|
sassc
|
||||||
|
Rules-Requires-Root: no
|
||||||
|
Standards-Version: 4.2.1
|
||||||
|
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-atk-1.0,
|
||||||
|
gir1.2-clutter-1.0,
|
||||||
|
gir1.2-gdkpixbuf-2.0,
|
||||||
|
gir1.2-glib-2.0,
|
||||||
|
gir1.2-gmenu-3.0,
|
||||||
|
gir1.2-gtk-3.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-tweaks
|
||||||
|
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.
|
||||||
Vendored
+28
@@ -0,0 +1,28 @@
|
|||||||
|
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: *
|
||||||
|
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".
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
NEWS
|
||||||
|
README.md
|
||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
[DEFAULT]
|
||||||
|
pristine-tar = True
|
||||||
|
debian-branch = debian/master
|
||||||
|
upstream-branch = upstream/latest
|
||||||
|
upstream-vcs-tag = %(version)s
|
||||||
|
|
||||||
|
[buildpackage]
|
||||||
|
sign-tags = True
|
||||||
|
|
||||||
|
[import-orig]
|
||||||
|
postimport = dch -v%(version)s New upstream release; git add debian/changelog; debcommit
|
||||||
|
|
||||||
|
[pq]
|
||||||
|
patch-numbers = False
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
debian/local/gnome-session-classic usr/bin
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic "$@"
|
||||||
@@ -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 055ce64..34827ee 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 --session gnome-classic
|
||||||
|
+Exec=gnome-session-classic
|
||||||
|
TryExec=gnome-session
|
||||||
|
Type=Application
|
||||||
|
DesktopNames=GNOME-Classic;GNOME;
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
gnome-session-classic-wrapper-script.patch
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
|
EXTENSIONS_ENABLED='apps-menu, places-menu, \
|
||||||
|
launch-new-instance, window-list, \
|
||||||
|
drive-menu, screenshot-window-sizer, \
|
||||||
|
windowsNavigator, workspace-indicator, \
|
||||||
|
auto-move-windows, native-window-placement, user-theme'
|
||||||
|
|
||||||
|
EXTENSIONS_DISABLED='example'
|
||||||
|
|
||||||
|
%:
|
||||||
|
dh $@ --with gnome
|
||||||
|
|
||||||
|
override_dh_auto_configure:
|
||||||
|
dh_auto_configure -- \
|
||||||
|
-Denable_extensions=$(EXTENSIONS_ENABLED) \
|
||||||
|
-Dclassic_mode=true
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
3.0 (quilt)
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
version=4
|
||||||
|
https://download.gnome.org/sources/@PACKAGE@/([\d\.]+)/ \
|
||||||
|
@PACKAGE@@ANY_VERSION@\.tar\.xz
|
||||||
+9
-19
@@ -7,40 +7,30 @@ builddir=`mktemp -p $srcdir -d _build.XXXXXX` || exit 1
|
|||||||
installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1
|
installdir=`mktemp -p $srcdir -d _install.XXXXXX` || exit 1
|
||||||
|
|
||||||
meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir
|
meson setup --prefix=$installdir -Dextension_set=all $srcdir $builddir
|
||||||
meson install -C $builddir
|
ninja -C$builddir install
|
||||||
|
|
||||||
rm -rf $srcdir/zip-files
|
rm -rf $srcdir/zip-files
|
||||||
mkdir $srcdir/zip-files
|
mkdir $srcdir/zip-files
|
||||||
|
|
||||||
extensiondir=$installdir/share/gnome-shell/extensions
|
extensiondir=$installdir/share/gnome-shell/extensions
|
||||||
schemadir=$installdir/share/glib-2.0/schemas
|
schemadir=$installdir/share/glib-2.0/schemas
|
||||||
|
localedir=$installdir/share/locale
|
||||||
|
|
||||||
for f in $extensiondir/*; do
|
for f in $extensiondir/*; do
|
||||||
name=`basename ${f%%@*}`
|
name=`basename ${f%%@*}`
|
||||||
uuid=$name@gnome-shell-extensions.gcampax.github.com
|
uuid=$name@gnome-shell-extensions.gcampax.github.com
|
||||||
schema=$schemadir/org.gnome.shell.extensions.$name.gschema.xml
|
schema=$schemadir/org.gnome.shell.extensions.$name.gschema.xml
|
||||||
|
|
||||||
olddomain=gnome-shell-extensions
|
cp $srcdir/NEWS $srcdir/COPYING $f
|
||||||
newdomain=gnome-shell-extension-$name
|
cp -r $localedir $f
|
||||||
sed -i "/gettext-domain/ s:$olddomain:$newdomain:" $f/metadata.json
|
|
||||||
|
|
||||||
xgettext --from-code=UTF-8 --output-dir=$builddir --output=$name.pot $f/*.js
|
if [ -f $schema ]; then
|
||||||
|
mkdir $f/schemas
|
||||||
if [ -f $builddir/$name.pot ]; then
|
cp $schema $f/schemas;
|
||||||
mkdir $f/po
|
glib-compile-schemas $f/schemas
|
||||||
for l in $(<$srcdir/po/LINGUAS); do
|
|
||||||
msgmerge --quiet --output-file=$f/po/$l.po \
|
|
||||||
$srcdir/po/$l.po $builddir/$name.pot
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cp $srcdir/NEWS $srcdir/COPYING $f
|
(cd $f && zip -rmq $srcdir/zip-files/$uuid.shell-extension.zip .)
|
||||||
sources=(NEWS COPYING $(cd $f; ls *.js))
|
|
||||||
|
|
||||||
[ -f $schema ] || unset schema
|
|
||||||
|
|
||||||
gnome-extensions pack ${sources[@]/#/--extra-source=} \
|
|
||||||
${schema:+--schema=$schema} --out-dir=$srcdir/zip-files $f
|
|
||||||
done
|
done
|
||||||
|
|
||||||
rm -rf $builddir
|
rm -rf $builddir
|
||||||
|
|||||||
+187
-119
@@ -2,17 +2,18 @@
|
|||||||
/* exported init enable disable */
|
/* exported init enable disable */
|
||||||
|
|
||||||
const {
|
const {
|
||||||
Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Meta, Shell, St,
|
Atk, Clutter, Gio, GLib, GMenu, GObject, Gtk, Meta, Shell, St
|
||||||
} = imports.gi;
|
} = imports.gi;
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
const appSys = Shell.AppSystem.get_default();
|
const appSys = Shell.AppSystem.get_default();
|
||||||
|
|
||||||
@@ -24,40 +25,50 @@ const NAVIGATION_REGION_OVERSHOOT = 50;
|
|||||||
Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish');
|
Gio._promisify(Gio._LocalFilePrototype, 'query_info_async', 'query_info_finish');
|
||||||
Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish');
|
Gio._promisify(Gio._LocalFilePrototype, 'set_attributes_async', 'set_attributes_finish');
|
||||||
|
|
||||||
class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
class ActivitiesMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
static {
|
constructor(button) {
|
||||||
GObject.registerClass(this);
|
super();
|
||||||
|
this._button = button;
|
||||||
|
this.actor.add_child(new St.Label({ text: _('Activities Overview') }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
activate(event) {
|
||||||
|
this._button.menu.toggle();
|
||||||
|
Main.overview.toggle();
|
||||||
|
super.activate(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
constructor(button, app) {
|
constructor(button, app) {
|
||||||
super();
|
super();
|
||||||
this._app = app;
|
this._app = app;
|
||||||
this._button = button;
|
this._button = button;
|
||||||
|
|
||||||
this._iconBin = new St.Bin();
|
this._iconBin = new St.Bin();
|
||||||
this.add_child(this._iconBin);
|
this.actor.add_child(this._iconBin);
|
||||||
|
|
||||||
let appLabel = new St.Label({
|
let appLabel = new St.Label({
|
||||||
text: app.get_name(),
|
text: app.get_name(),
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER
|
||||||
});
|
});
|
||||||
this.add_child(appLabel);
|
this.actor.add_child(appLabel);
|
||||||
this.label_actor = appLabel;
|
this.actor.label_actor = appLabel;
|
||||||
|
|
||||||
let textureCache = St.TextureCache.get_default();
|
let textureCache = St.TextureCache.get_default();
|
||||||
let iconThemeChangedId = textureCache.connect('icon-theme-changed',
|
let iconThemeChangedId = textureCache.connect('icon-theme-changed',
|
||||||
this._updateIcon.bind(this));
|
this._updateIcon.bind(this));
|
||||||
this.connect('destroy', () => {
|
this.actor.connect('destroy', () => {
|
||||||
textureCache.disconnect(iconThemeChangedId);
|
textureCache.disconnect(iconThemeChangedId);
|
||||||
});
|
});
|
||||||
this._updateIcon();
|
this._updateIcon();
|
||||||
|
|
||||||
this._delegate = this;
|
this.actor._delegate = this;
|
||||||
let draggable = DND.makeDraggable(this);
|
let draggable = DND.makeDraggable(this.actor);
|
||||||
|
|
||||||
let maybeStartDrag = draggable._maybeStartDrag;
|
let maybeStartDrag = draggable._maybeStartDrag;
|
||||||
draggable._maybeStartDrag = event => {
|
draggable._maybeStartDrag = (event) => {
|
||||||
if (this._dragEnabled)
|
if (this._dragEnabled)
|
||||||
return maybeStartDrag.call(draggable, event);
|
return maybeStartDrag.call(draggable, event);
|
||||||
return false;
|
return false;
|
||||||
@@ -69,8 +80,6 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
this._button.selectCategory(null);
|
this._button.selectCategory(null);
|
||||||
this._button.menu.toggle();
|
this._button.menu.toggle();
|
||||||
super.activate(event);
|
super.activate(event);
|
||||||
|
|
||||||
Main.overview.hide();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setActive(active, params) {
|
setActive(active, params) {
|
||||||
@@ -79,8 +88,8 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
super.setActive(active, params);
|
super.setActive(active, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
setDragEnabled(enabled) {
|
setDragEnabled(enable) {
|
||||||
this._dragEnabled = enabled;
|
this._dragEnabled = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
getDragActor() {
|
getDragActor() {
|
||||||
@@ -92,17 +101,11 @@ class ApplicationMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateIcon() {
|
_updateIcon() {
|
||||||
let icon = this.getDragActor();
|
this._iconBin.set_child(this.getDragActor());
|
||||||
icon.style_class = 'icon-dropshadow';
|
|
||||||
this._iconBin.set_child(icon);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(button, category) {
|
constructor(button, category) {
|
||||||
super();
|
super();
|
||||||
this._category = category;
|
this._category = category;
|
||||||
@@ -117,9 +120,8 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
else
|
else
|
||||||
name = _('Favorites');
|
name = _('Favorites');
|
||||||
|
|
||||||
this.add_child(new St.Label({ text: name }));
|
this.actor.add_child(new St.Label({ text: name }));
|
||||||
this.connect('motion-event', this._onMotionEvent.bind(this));
|
this.actor.connect('motion-event', this._onMotionEvent.bind(this));
|
||||||
this.connect('notify::active', this._onActiveChanged.bind(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
activate(event) {
|
activate(event) {
|
||||||
@@ -129,9 +131,9 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_isNavigatingSubmenu([x, y]) {
|
_isNavigatingSubmenu([x, y]) {
|
||||||
let [posX, posY] = this.get_transformed_position();
|
let [posX, posY] = this.actor.get_transformed_position();
|
||||||
|
|
||||||
if (this._oldX === -1) {
|
if (this._oldX == -1) {
|
||||||
this._oldX = x;
|
this._oldX = x;
|
||||||
this._oldY = y;
|
this._oldY = y;
|
||||||
return true;
|
return true;
|
||||||
@@ -144,11 +146,11 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
this._oldY = y;
|
this._oldY = y;
|
||||||
|
|
||||||
// If it lies outside the x-coordinates then it is definitely outside.
|
// If it lies outside the x-coordinates then it is definitely outside.
|
||||||
if (posX > x || posX + this.width < x)
|
if (posX > x || posX + this.actor.width < x)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// If it lies inside the menu item then it is definitely inside.
|
// If it lies inside the menu item then it is definitely inside.
|
||||||
if (posY <= y && posY + this.height >= y)
|
if (posY <= y && posY + this.actor.height >= y)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// We want the keep-up triangle only if the movement is more
|
// We want the keep-up triangle only if the movement is more
|
||||||
@@ -169,42 +171,37 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
// only check for triangle ABC.
|
// only check for triangle ABC.
|
||||||
if (posY > y) {
|
if (posY > y) {
|
||||||
let offset = posY - y;
|
let offset = posY - y;
|
||||||
y = posY + this.height + offset;
|
y = posY + this.actor.height + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that A is (0, 0).
|
// Ensure that A is (0, 0).
|
||||||
x -= posX;
|
x -= posX;
|
||||||
y -= posY + this.height;
|
y -= posY + this.actor.height;
|
||||||
|
|
||||||
// Check which side of line AB the point P lies on by taking the
|
// Check which side of line AB the point P lies on by taking the
|
||||||
// cross-product of AB and AP. See:
|
// cross-product of AB and AP. See:
|
||||||
// http://stackoverflow.com/questions/3461453/determine-which-side-of-a-line-a-point-lies
|
// http://stackoverflow.com/questions/3461453/determine-which-side-of-a-line-a-point-lies
|
||||||
if (this.width * y - NAVIGATION_REGION_OVERSHOOT * x <= 0)
|
if (((this.actor.width * y) - (NAVIGATION_REGION_OVERSHOOT * x)) <= 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onMotionEvent(actor, event) {
|
_onMotionEvent(actor, event) {
|
||||||
if (!this._grab) {
|
if (!Clutter.get_pointer_grab()) {
|
||||||
this._oldX = -1;
|
this._oldX = -1;
|
||||||
this._oldY = -1;
|
this._oldY = -1;
|
||||||
const grab = global.stage.grab(this);
|
Clutter.grab_pointer(this.actor);
|
||||||
if (grab.get_seat_state() !== Clutter.GrabState.NONE)
|
|
||||||
this._grab = grab;
|
|
||||||
else
|
|
||||||
grab.dismiss();
|
|
||||||
}
|
}
|
||||||
this.hover = true;
|
this.actor.hover = true;
|
||||||
|
|
||||||
if (this._isNavigatingSubmenu(event.get_coords()))
|
if (this._isNavigatingSubmenu(event.get_coords()))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
this._oldX = -1;
|
this._oldX = -1;
|
||||||
this._oldY = -1;
|
this._oldY = -1;
|
||||||
this.hover = false;
|
this.actor.hover = false;
|
||||||
this._grab?.dismiss();
|
Clutter.ungrab_pointer();
|
||||||
delete this._grab;
|
|
||||||
|
|
||||||
let source = event.get_source();
|
let source = event.get_source();
|
||||||
if (source instanceof St.Widget)
|
if (source instanceof St.Widget)
|
||||||
@@ -213,12 +210,12 @@ class CategoryMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onActiveChanged() {
|
setActive(active, params) {
|
||||||
if (!this.active)
|
if (active) {
|
||||||
return;
|
this._button.selectCategory(this._category);
|
||||||
|
this._button.scrollToCatButton(this);
|
||||||
this._button.selectCategory(this._category);
|
}
|
||||||
this._button.scrollToCatButton(this);
|
super.setActive(active, params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,9 +229,28 @@ class ApplicationsMenu extends PopupMenu.PopupMenu {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open(animate) {
|
||||||
|
this._button.hotCorner.setBarrierSize(0);
|
||||||
|
if (this._button.hotCorner.actor) // fallback corner
|
||||||
|
this._button.hotCorner.actor.hide();
|
||||||
|
super.open(animate);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(animate) {
|
||||||
|
let size = Main.layoutManager.panelBox.height;
|
||||||
|
this._button.hotCorner.setBarrierSize(size);
|
||||||
|
if (this._button.hotCorner.actor) // fallback corner
|
||||||
|
this._button.hotCorner.actor.show();
|
||||||
|
super.close(animate);
|
||||||
|
}
|
||||||
|
|
||||||
toggle() {
|
toggle() {
|
||||||
if (this.isOpen)
|
if (this.isOpen) {
|
||||||
this._button.selectCategory(null);
|
this._button.selectCategory(null);
|
||||||
|
} else {
|
||||||
|
if (Main.overview.visible)
|
||||||
|
Main.overview.hide();
|
||||||
|
}
|
||||||
super.toggle();
|
super.toggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -246,7 +262,7 @@ class DesktopTarget {
|
|||||||
|
|
||||||
this._windowAddedId =
|
this._windowAddedId =
|
||||||
global.window_group.connect('actor-added',
|
global.window_group.connect('actor-added',
|
||||||
this._onWindowAdded.bind(this));
|
this._onWindowAdded.bind(this));
|
||||||
|
|
||||||
global.get_window_actors().forEach(a => {
|
global.get_window_actors().forEach(a => {
|
||||||
this._onWindowAdded(a.get_parent(), a);
|
this._onWindowAdded(a.get_parent(), a);
|
||||||
@@ -254,14 +270,14 @@ class DesktopTarget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get hasDesktop() {
|
get hasDesktop() {
|
||||||
return this._desktop !== null;
|
return this._desktop != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onWindowAdded(group, actor) {
|
_onWindowAdded(group, actor) {
|
||||||
if (!(actor instanceof Meta.WindowActor))
|
if (!(actor instanceof Meta.WindowActor))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (actor.meta_window.get_window_type() === Meta.WindowType.DESKTOP)
|
if (actor.meta_window.get_window_type() == Meta.WindowType.DESKTOP)
|
||||||
this._setDesktop(actor);
|
this._setDesktop(actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,8 +322,8 @@ class DesktopTarget {
|
|||||||
|
|
||||||
// Hack: force nautilus to reload file info
|
// Hack: force nautilus to reload file info
|
||||||
info = new Gio.FileInfo();
|
info = new Gio.FileInfo();
|
||||||
info.set_attribute_uint64(
|
info.set_attribute_uint64(Gio.FILE_ATTRIBUTE_TIME_ACCESS,
|
||||||
Gio.FILE_ATTRIBUTE_TIME_ACCESS, GLib.get_real_time());
|
GLib.get_real_time());
|
||||||
try {
|
try {
|
||||||
await file.set_attributes_async(info, queryFlags, ioPriority, null);
|
await file.set_attributes_async(info, queryFlags, ioPriority, null);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -359,13 +375,10 @@ class DesktopTarget {
|
|||||||
}
|
}
|
||||||
Signals.addSignalMethods(DesktopTarget.prototype);
|
Signals.addSignalMethods(DesktopTarget.prototype);
|
||||||
|
|
||||||
|
let ApplicationsButton = GObject.registerClass(
|
||||||
class ApplicationsButton extends PanelMenu.Button {
|
class ApplicationsButton extends PanelMenu.Button {
|
||||||
static {
|
_init() {
|
||||||
GObject.registerClass(this);
|
super._init(1.0, null, false);
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super(1.0, null, false);
|
|
||||||
|
|
||||||
this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this));
|
this.setMenu(new ApplicationsMenu(this, 1.0, St.Side.TOP, this));
|
||||||
Main.panel.menuManager.addMenu(this.menu);
|
Main.panel.menuManager.addMenu(this.menu);
|
||||||
@@ -375,28 +388,31 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
// role ATK_ROLE_MENU like other elements of the panel.
|
// role ATK_ROLE_MENU like other elements of the panel.
|
||||||
this.accessible_role = Atk.Role.LABEL;
|
this.accessible_role = Atk.Role.LABEL;
|
||||||
|
|
||||||
|
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||||
|
|
||||||
this._label = new St.Label({
|
this._label = new St.Label({
|
||||||
text: _('Applications'),
|
text: _('Applications'),
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER
|
||||||
});
|
});
|
||||||
|
hbox.add_child(this._label);
|
||||||
|
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||||
|
|
||||||
this.add_actor(this._label);
|
this.add_actor(hbox);
|
||||||
this.name = 'panelApplications';
|
this.name = 'panelApplications';
|
||||||
this.label_actor = this._label;
|
this.label_actor = this._label;
|
||||||
|
|
||||||
|
this.connect('captured-event', this._onCapturedEvent.bind(this));
|
||||||
|
|
||||||
this._showingId = Main.overview.connect('showing', () => {
|
this._showingId = Main.overview.connect('showing', () => {
|
||||||
this.add_accessible_state(Atk.StateType.CHECKED);
|
this.add_accessible_state (Atk.StateType.CHECKED);
|
||||||
});
|
});
|
||||||
this._hidingId = Main.overview.connect('hiding', () => {
|
this._hidingId = Main.overview.connect('hiding', () => {
|
||||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
this.remove_accessible_state (Atk.StateType.CHECKED);
|
||||||
});
|
});
|
||||||
Main.wm.addKeybinding(
|
Main.layoutManager.connect('startup-complete',
|
||||||
'apps-menu-toggle-menu',
|
this._setKeybinding.bind(this));
|
||||||
ExtensionUtils.getSettings(),
|
this._setKeybinding();
|
||||||
Meta.KeyBindingFlags.IGNORE_AUTOREPEAT,
|
|
||||||
Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW,
|
|
||||||
() => this.menu.toggle());
|
|
||||||
|
|
||||||
this._desktopTarget = new DesktopTarget();
|
this._desktopTarget = new DesktopTarget();
|
||||||
this._desktopTarget.connect('app-dropped', () => {
|
this._desktopTarget.connect('app-dropped', () => {
|
||||||
@@ -410,14 +426,14 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
|
|
||||||
this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' });
|
this._tree = new GMenu.Tree({ menu_basename: 'applications.menu' });
|
||||||
this._treeChangedId = this._tree.connect('changed',
|
this._treeChangedId = this._tree.connect('changed',
|
||||||
this._onTreeChanged.bind(this));
|
this._onTreeChanged.bind(this));
|
||||||
|
|
||||||
this._applicationsButtons = new Map();
|
this._applicationsButtons = new Map();
|
||||||
this.reloadFlag = false;
|
this.reloadFlag = false;
|
||||||
this._createLayout();
|
this._createLayout();
|
||||||
this._display();
|
this._display();
|
||||||
this._installedChangedId = appSys.connect('installed-changed',
|
this._installedChangedId = appSys.connect('installed-changed',
|
||||||
this._onTreeChanged.bind(this));
|
this._onTreeChanged.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
_onTreeChanged() {
|
_onTreeChanged() {
|
||||||
@@ -429,34 +445,49 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get hotCorner() {
|
||||||
|
return Main.layoutManager.hotCorners[Main.layoutManager.primaryIndex];
|
||||||
|
}
|
||||||
|
|
||||||
_createVertSeparator() {
|
_createVertSeparator() {
|
||||||
let separator = new St.DrawingArea({
|
let separator = new St.DrawingArea({
|
||||||
style_class: 'calendar-vertical-separator',
|
style_class: 'calendar-vertical-separator',
|
||||||
pseudo_class: 'highlighted',
|
pseudo_class: 'highlighted'
|
||||||
});
|
});
|
||||||
separator.connect('repaint', this._onVertSepRepaint.bind(this));
|
separator.connect('repaint', this._onVertSepRepaint.bind(this));
|
||||||
return separator;
|
return separator;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
super._onDestroy();
|
|
||||||
|
|
||||||
Main.overview.disconnect(this._showingId);
|
Main.overview.disconnect(this._showingId);
|
||||||
Main.overview.disconnect(this._hidingId);
|
Main.overview.disconnect(this._hidingId);
|
||||||
appSys.disconnect(this._installedChangedId);
|
appSys.disconnect(this._installedChangedId);
|
||||||
this._tree.disconnect(this._treeChangedId);
|
this._tree.disconnect(this._treeChangedId);
|
||||||
this._tree = null;
|
this._tree = null;
|
||||||
|
|
||||||
Main.wm.removeKeybinding('apps-menu-toggle-menu');
|
let handler = Main.sessionMode.hasOverview ?
|
||||||
|
Main.overview.toggle.bind(Main.overview) : null;
|
||||||
|
Main.wm.setCustomKeybindingHandler('panel-main-menu',
|
||||||
|
Shell.ActionMode.NORMAL |
|
||||||
|
Shell.ActionMode.OVERVIEW,
|
||||||
|
handler);
|
||||||
|
|
||||||
this._desktopTarget.destroy();
|
this._desktopTarget.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_onCapturedEvent(actor, event) {
|
||||||
|
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
|
||||||
|
if (!Main.overview.shouldToggleByCornerOrButton())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
_onMenuKeyPress(actor, event) {
|
_onMenuKeyPress(actor, event) {
|
||||||
let symbol = event.get_key_symbol();
|
let symbol = event.get_key_symbol();
|
||||||
if (symbol === Clutter.KEY_Left || symbol === Clutter.KEY_Right) {
|
if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
|
||||||
let direction = symbol === Clutter.KEY_Left
|
let direction = symbol == Clutter.KEY_Left ?
|
||||||
? Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT;
|
Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT;
|
||||||
if (this.menu.actor.navigate_focus(global.stage.key_focus, direction, false))
|
if (this.menu.actor.navigate_focus(global.stage.key_focus, direction, false))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -489,6 +520,13 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
super._onOpenStateChanged(menu, open);
|
super._onOpenStateChanged(menu, open);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_setKeybinding() {
|
||||||
|
Main.wm.setCustomKeybindingHandler('panel-main-menu',
|
||||||
|
Shell.ActionMode.NORMAL |
|
||||||
|
Shell.ActionMode.OVERVIEW,
|
||||||
|
() => this.menu.toggle());
|
||||||
|
}
|
||||||
|
|
||||||
_redisplay() {
|
_redisplay() {
|
||||||
this.applicationsBox.destroy_all_children();
|
this.applicationsBox.destroy_all_children();
|
||||||
this.categoriesBox.destroy_all_children();
|
this.categoriesBox.destroy_all_children();
|
||||||
@@ -498,8 +536,8 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
_loadCategory(categoryId, dir) {
|
_loadCategory(categoryId, dir) {
|
||||||
let iter = dir.iter();
|
let iter = dir.iter();
|
||||||
let nextType;
|
let nextType;
|
||||||
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
||||||
if (nextType === GMenu.TreeItemType.ENTRY) {
|
if (nextType == GMenu.TreeItemType.ENTRY) {
|
||||||
let entry = iter.get_entry();
|
let entry = iter.get_entry();
|
||||||
let id;
|
let id;
|
||||||
try {
|
try {
|
||||||
@@ -512,9 +550,9 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
app = new Shell.App({ app_info: entry.get_app_info() });
|
app = new Shell.App({ app_info: entry.get_app_info() });
|
||||||
if (app.get_app_info().should_show())
|
if (app.get_app_info().should_show())
|
||||||
this.applicationsByCategory[categoryId].push(app);
|
this.applicationsByCategory[categoryId].push(app);
|
||||||
} else if (nextType === GMenu.TreeItemType.SEPARATOR) {
|
} else if (nextType == GMenu.TreeItemType.SEPARATOR) {
|
||||||
this.applicationsByCategory[categoryId].push('separator');
|
this.applicationsByCategory[categoryId].push('separator');
|
||||||
} else if (nextType === GMenu.TreeItemType.DIRECTORY) {
|
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
|
||||||
let subdir = iter.get_directory();
|
let subdir = iter.get_directory();
|
||||||
if (!subdir.get_is_nodisplay())
|
if (!subdir.get_is_nodisplay())
|
||||||
this._loadCategory(categoryId, subdir);
|
this._loadCategory(categoryId, subdir);
|
||||||
@@ -527,13 +565,13 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box();
|
let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box();
|
||||||
let currentScrollValue = appsScrollBoxAdj.get_value();
|
let currentScrollValue = appsScrollBoxAdj.get_value();
|
||||||
let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1;
|
let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1;
|
||||||
let buttonAlloc = button.get_allocation_box();
|
let buttonAlloc = button.actor.get_allocation_box();
|
||||||
let newScrollValue = currentScrollValue;
|
let newScrollValue = currentScrollValue;
|
||||||
if (currentScrollValue > buttonAlloc.y1 - 10)
|
if (currentScrollValue > buttonAlloc.y1 - 10)
|
||||||
newScrollValue = buttonAlloc.y1 - 10;
|
newScrollValue = buttonAlloc.y1 - 10;
|
||||||
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
||||||
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
||||||
if (newScrollValue !== currentScrollValue)
|
if (newScrollValue != currentScrollValue)
|
||||||
appsScrollBoxAdj.set_value(newScrollValue);
|
appsScrollBoxAdj.set_value(newScrollValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -542,13 +580,13 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box();
|
let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box();
|
||||||
let currentScrollValue = catsScrollBoxAdj.get_value();
|
let currentScrollValue = catsScrollBoxAdj.get_value();
|
||||||
let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1;
|
let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1;
|
||||||
let buttonAlloc = button.get_allocation_box();
|
let buttonAlloc = button.actor.get_allocation_box();
|
||||||
let newScrollValue = currentScrollValue;
|
let newScrollValue = currentScrollValue;
|
||||||
if (currentScrollValue > buttonAlloc.y1 - 10)
|
if (currentScrollValue > buttonAlloc.y1 - 10)
|
||||||
newScrollValue = buttonAlloc.y1 - 10;
|
newScrollValue = buttonAlloc.y1 - 10;
|
||||||
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
|
||||||
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
|
||||||
if (newScrollValue !== currentScrollValue)
|
if (newScrollValue != currentScrollValue)
|
||||||
catsScrollBoxAdj.set_value(newScrollValue);
|
catsScrollBoxAdj.set_value(newScrollValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -558,8 +596,10 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this.mainBox = new St.BoxLayout({ vertical: false });
|
this.mainBox = new St.BoxLayout({ vertical: false });
|
||||||
this.leftBox = new St.BoxLayout({ vertical: true });
|
this.leftBox = new St.BoxLayout({ vertical: true });
|
||||||
this.applicationsScrollBox = new St.ScrollView({
|
this.applicationsScrollBox = new St.ScrollView({
|
||||||
style_class: 'apps-menu vfade',
|
x_fill: true,
|
||||||
x_expand: true,
|
y_fill: false,
|
||||||
|
y_align: St.Align.START,
|
||||||
|
style_class: 'apps-menu vfade'
|
||||||
});
|
});
|
||||||
this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
let vscroll = this.applicationsScrollBox.get_vscroll_bar();
|
let vscroll = this.applicationsScrollBox.get_vscroll_bar();
|
||||||
@@ -570,13 +610,29 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this.menu.passEvents = false;
|
this.menu.passEvents = false;
|
||||||
});
|
});
|
||||||
this.categoriesScrollBox = new St.ScrollView({
|
this.categoriesScrollBox = new St.ScrollView({
|
||||||
style_class: 'vfade',
|
x_fill: true,
|
||||||
|
y_fill: false,
|
||||||
|
y_align: St.Align.START,
|
||||||
|
style_class: 'vfade'
|
||||||
});
|
});
|
||||||
this.categoriesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
this.categoriesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
vscroll = this.categoriesScrollBox.get_vscroll_bar();
|
vscroll = this.categoriesScrollBox.get_vscroll_bar();
|
||||||
vscroll.connect('scroll-start', () => (this.menu.passEvents = true));
|
vscroll.connect('scroll-start', () => this.menu.passEvents = true);
|
||||||
vscroll.connect('scroll-stop', () => (this.menu.passEvents = false));
|
vscroll.connect('scroll-stop', () => this.menu.passEvents = false);
|
||||||
this.leftBox.add_child(this.categoriesScrollBox);
|
this.leftBox.add(this.categoriesScrollBox, {
|
||||||
|
expand: true,
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: true,
|
||||||
|
y_align: St.Align.START
|
||||||
|
});
|
||||||
|
|
||||||
|
let activities = new ActivitiesMenuItem(this);
|
||||||
|
this.leftBox.add(activities.actor, {
|
||||||
|
expand: false,
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: false,
|
||||||
|
y_align: St.Align.START
|
||||||
|
});
|
||||||
|
|
||||||
this.applicationsBox = new St.BoxLayout({ vertical: true });
|
this.applicationsBox = new St.BoxLayout({ vertical: true });
|
||||||
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
this.applicationsScrollBox.add_actor(this.applicationsBox);
|
||||||
@@ -584,8 +640,16 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this.categoriesScrollBox.add_actor(this.categoriesBox);
|
this.categoriesScrollBox.add_actor(this.categoriesBox);
|
||||||
|
|
||||||
this.mainBox.add(this.leftBox);
|
this.mainBox.add(this.leftBox);
|
||||||
this.mainBox.add_child(this._createVertSeparator());
|
this.mainBox.add(this._createVertSeparator(), {
|
||||||
this.mainBox.add_child(this.applicationsScrollBox);
|
expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: true
|
||||||
|
});
|
||||||
|
this.mainBox.add(this.applicationsScrollBox, {
|
||||||
|
expand: true,
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: true
|
||||||
|
});
|
||||||
section.actor.add_actor(this.mainBox);
|
section.actor.add_actor(this.mainBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -594,16 +658,16 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this.mainBox.style = 'width: 35em;';
|
this.mainBox.style = 'width: 35em;';
|
||||||
this.mainBox.hide();
|
this.mainBox.hide();
|
||||||
|
|
||||||
// Load categories
|
//Load categories
|
||||||
this.applicationsByCategory = {};
|
this.applicationsByCategory = {};
|
||||||
this._tree.load_sync();
|
this._tree.load_sync();
|
||||||
let root = this._tree.get_root_directory();
|
let root = this._tree.get_root_directory();
|
||||||
let categoryMenuItem = new CategoryMenuItem(this, null);
|
let categoryMenuItem = new CategoryMenuItem(this, null);
|
||||||
this.categoriesBox.add_actor(categoryMenuItem);
|
this.categoriesBox.add_actor(categoryMenuItem.actor);
|
||||||
let iter = root.iter();
|
let iter = root.iter();
|
||||||
let nextType;
|
let nextType;
|
||||||
while ((nextType = iter.next()) !== GMenu.TreeItemType.INVALID) {
|
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
|
||||||
if (nextType !== GMenu.TreeItemType.DIRECTORY)
|
if (nextType != GMenu.TreeItemType.DIRECTORY)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let dir = iter.get_directory();
|
let dir = iter.get_directory();
|
||||||
@@ -614,12 +678,12 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
this.applicationsByCategory[categoryId] = [];
|
this.applicationsByCategory[categoryId] = [];
|
||||||
this._loadCategory(categoryId, dir);
|
this._loadCategory(categoryId, dir);
|
||||||
if (this.applicationsByCategory[categoryId].length > 0) {
|
if (this.applicationsByCategory[categoryId].length > 0) {
|
||||||
categoryMenuItem = new CategoryMenuItem(this, dir);
|
let categoryMenuItem = new CategoryMenuItem(this, dir);
|
||||||
this.categoriesBox.add_actor(categoryMenuItem);
|
this.categoriesBox.add_actor(categoryMenuItem.actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load applications
|
//Load applications
|
||||||
this._displayButtons(this._listApplications(null));
|
this._displayButtons(this._listApplications(null));
|
||||||
|
|
||||||
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
let themeContext = St.ThemeContext.get_for_stage(global.stage);
|
||||||
@@ -656,8 +720,8 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
item.setDragEnabled(this._desktopTarget.hasDesktop);
|
item.setDragEnabled(this._desktopTarget.hasDesktop);
|
||||||
this._applicationsButtons.set(app, item);
|
this._applicationsButtons.set(app, item);
|
||||||
}
|
}
|
||||||
if (!item.get_parent())
|
if (!item.actor.get_parent())
|
||||||
this.applicationsBox.add_actor(item);
|
this.applicationsBox.add_actor(item.actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -667,31 +731,35 @@ class ApplicationsButton extends PanelMenu.Button {
|
|||||||
if (categoryMenuId) {
|
if (categoryMenuId) {
|
||||||
applist = this.applicationsByCategory[categoryMenuId];
|
applist = this.applicationsByCategory[categoryMenuId];
|
||||||
} else {
|
} else {
|
||||||
applist = global.settings.get_strv('favorite-apps')
|
applist = new Array();
|
||||||
.map(id => appSys.lookup_app(id))
|
let favorites = global.settings.get_strv('favorite-apps');
|
||||||
.filter(app => app);
|
for (let i = 0; i < favorites.length; i++) {
|
||||||
|
let app = appSys.lookup_app(favorites[i]);
|
||||||
|
if (app)
|
||||||
|
applist.push(app);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return applist;
|
return applist;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
let appsMenuButton;
|
let appsMenuButton;
|
||||||
|
let activitiesButton;
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
|
activitiesButton = Main.panel.statusArea['activities'];
|
||||||
|
activitiesButton.container.hide();
|
||||||
appsMenuButton = new ApplicationsButton();
|
appsMenuButton = new ApplicationsButton();
|
||||||
let index = Main.sessionMode.panel.left.indexOf('activities') + 1;
|
Main.panel.addToStatusArea('apps-menu', appsMenuButton, 1, 'left');
|
||||||
Main.panel.addToStatusArea('apps-menu', appsMenuButton, index, 'left');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
Main.panel.menuManager.removeMenu(appsMenuButton.menu);
|
Main.panel.menuManager.removeMenu(appsMenuButton.menu);
|
||||||
appsMenuButton.destroy();
|
appsMenuButton.destroy();
|
||||||
|
activitiesButton.container.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,5 +3,3 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"extension-id": "@extension_id@",
|
"extension-id": "@extension_id@",
|
||||||
"uuid": "@uuid@",
|
"uuid": "@uuid@",
|
||||||
"settings-schema": "@gschemaname@",
|
|
||||||
"gettext-domain": "@gettext_domain@",
|
"gettext-domain": "@gettext_domain@",
|
||||||
"name": "Applications Menu",
|
"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.",
|
"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.",
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<schemalist gettext-domain="gnome-shell-extensions">
|
|
||||||
<schema id="org.gnome.shell.extensions.apps-menu"
|
|
||||||
path="/org/gnome/shell/extensions/apps-menu/">
|
|
||||||
<key name="apps-menu-toggle-menu" type="as">
|
|
||||||
<default>["<Alt>F1"]</default>
|
|
||||||
<summary>Keybinding to open the applications menu</summary>
|
|
||||||
<description>
|
|
||||||
Keybinding to open the applications menu.
|
|
||||||
</description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
</schemalist>
|
|
||||||
@@ -2,10 +2,11 @@
|
|||||||
// Start apps on custom workspaces
|
// Start apps on custom workspaces
|
||||||
/* exported init enable disable */
|
/* exported init enable disable */
|
||||||
|
|
||||||
const { Shell } = imports.gi;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Main = imports.ui.main;
|
|
||||||
|
|
||||||
class WindowMover {
|
class WindowMover {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -16,7 +17,7 @@ class WindowMover {
|
|||||||
|
|
||||||
this._appsChangedId =
|
this._appsChangedId =
|
||||||
this._appSystem.connect('installed-changed',
|
this._appSystem.connect('installed-changed',
|
||||||
this._updateAppData.bind(this));
|
this._updateAppData.bind(this));
|
||||||
|
|
||||||
this._settings.connect('changed', this._updateAppConfigs.bind(this));
|
this._settings.connect('changed', this._updateAppConfigs.bind(this));
|
||||||
this._updateAppConfigs();
|
this._updateAppConfigs();
|
||||||
@@ -35,22 +36,23 @@ class WindowMover {
|
|||||||
|
|
||||||
_updateAppData() {
|
_updateAppData() {
|
||||||
let ids = [...this._appConfigs.keys()];
|
let ids = [...this._appConfigs.keys()];
|
||||||
let removedApps = [...this._appData.keys()]
|
let removedApps = [...this._appData.keys()].filter(
|
||||||
.filter(a => !ids.includes(a.id));
|
a => !ids.includes(a.id)
|
||||||
|
);
|
||||||
removedApps.forEach(app => {
|
removedApps.forEach(app => {
|
||||||
app.disconnect(this._appData.get(app).windowsChangedId);
|
app.disconnect(this._appData.get(app).windowsChangedId);
|
||||||
this._appData.delete(app);
|
this._appData.delete(app);
|
||||||
});
|
});
|
||||||
|
|
||||||
let addedApps = ids
|
let addedApps = ids.map(id => this._appSystem.lookup_app(id)).filter(
|
||||||
.map(id => this._appSystem.lookup_app(id))
|
app => app != null && !this._appData.has(app)
|
||||||
.filter(app => app && !this._appData.has(app));
|
);
|
||||||
addedApps.forEach(app => {
|
addedApps.forEach(app => {
|
||||||
let data = {
|
let data = {
|
||||||
windowsChangedId: app.connect('windows-changed',
|
windowsChangedId: app.connect('windows-changed',
|
||||||
this._appWindowsChanged.bind(this)),
|
this._appWindowsChanged.bind(this)),
|
||||||
moveWindowsId: 0,
|
moveWindowsId: 0,
|
||||||
windows: app.get_windows(),
|
windows: app.get_windows()
|
||||||
};
|
};
|
||||||
this._appData.set(app, data);
|
this._appData.set(app, data);
|
||||||
});
|
});
|
||||||
@@ -72,7 +74,7 @@ class WindowMover {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_moveWindow(window, workspaceNum) {
|
_moveWindow(window, workspaceNum) {
|
||||||
if (window.skip_taskbar || window.is_on_all_workspaces())
|
if (window.skip_taskbar)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// ensure we have the required number of workspaces
|
// ensure we have the required number of workspaces
|
||||||
@@ -93,9 +95,9 @@ class WindowMover {
|
|||||||
// the window still exists and is just moved to a different workspace
|
// the window still exists and is just moved to a different workspace
|
||||||
// or something; assume it'll be added back immediately, so keep it
|
// or something; assume it'll be added back immediately, so keep it
|
||||||
// to avoid moving it again
|
// to avoid moving it again
|
||||||
windows.push(...data.windows.filter(w => {
|
windows.push(...data.windows.filter(
|
||||||
return !windows.includes(w) && w.get_compositor_private() !== null;
|
w => !windows.includes(w) && w.get_compositor_private() != null
|
||||||
}));
|
));
|
||||||
|
|
||||||
let workspaceNum = this._appConfigs.get(app.id);
|
let workspaceNum = this._appConfigs.get(app.id);
|
||||||
windows.filter(w => !data.windows.includes(w)).forEach(window => {
|
windows.filter(w => !data.windows.includes(w)).forEach(window => {
|
||||||
@@ -108,35 +110,28 @@ class WindowMover {
|
|||||||
let prevCheckWorkspaces;
|
let prevCheckWorkspaces;
|
||||||
let winMover;
|
let winMover;
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {bool} - false (used as MetaLater handler)
|
|
||||||
*/
|
|
||||||
function myCheckWorkspaces() {
|
function myCheckWorkspaces() {
|
||||||
let keepAliveWorkspaces = [];
|
let keepAliveWorkspaces = [];
|
||||||
let foundNonEmpty = false;
|
let foundNonEmpty = false;
|
||||||
for (let i = this._workspaces.length - 1; i >= 0; i--) {
|
for (let i = this._workspaces.length - 1; i >= 0; i--) {
|
||||||
if (!foundNonEmpty) {
|
if (!foundNonEmpty)
|
||||||
foundNonEmpty = this._workspaces[i].list_windows().some(
|
foundNonEmpty = this._workspaces[i].list_windows().length > 0;
|
||||||
w => !w.is_on_all_workspaces());
|
else if (!this._workspaces[i]._keepAliveId)
|
||||||
} else if (!this._workspaces[i]._keepAliveId) {
|
|
||||||
keepAliveWorkspaces.push(this._workspaces[i]);
|
keepAliveWorkspaces.push(this._workspaces[i]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure the original method only removes empty workspaces at the end
|
// make sure the original method only removes empty workspaces at the end
|
||||||
keepAliveWorkspaces.forEach(ws => (ws._keepAliveId = 1));
|
keepAliveWorkspaces.forEach(ws => ws._keepAliveId = 1);
|
||||||
prevCheckWorkspaces.call(this);
|
prevCheckWorkspaces.call(this);
|
||||||
keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId);
|
keepAliveWorkspaces.forEach(ws => delete ws._keepAliveId);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
|
prevCheckWorkspaces = Main.wm._workspaceTracker._checkWorkspaces;
|
||||||
Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces;
|
Main.wm._workspaceTracker._checkWorkspaces = myCheckWorkspaces;
|
||||||
@@ -144,7 +139,6 @@ function enable() {
|
|||||||
winMover = new WindowMover();
|
winMover = new WindowMover();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
|
Main.wm._workspaceTracker._checkWorkspaces = prevCheckWorkspaces;
|
||||||
winMover.destroy();
|
winMover.destroy();
|
||||||
|
|||||||
@@ -2,350 +2,282 @@
|
|||||||
// Start apps on custom workspaces
|
// Start apps on custom workspaces
|
||||||
/* exported init buildPrefsWidget */
|
/* exported init buildPrefsWidget */
|
||||||
|
|
||||||
const { Adw, Gio, GLib, GObject, Gtk } = imports.gi;
|
const { Gio, GObject, Gtk } = imports.gi;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
const N_ = e => e;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
|
||||||
|
|
||||||
const SETTINGS_KEY = 'application-list';
|
const SETTINGS_KEY = 'application-list';
|
||||||
|
|
||||||
const WORKSPACE_MAX = 36; // compiled in limit of mutter
|
const WORKSPACE_MAX = 36; // compiled in limit of mutter
|
||||||
|
|
||||||
class NewItem extends GObject.Object {}
|
const Columns = {
|
||||||
GObject.registerClass(NewItem);
|
APPINFO: 0,
|
||||||
|
DISPLAY_NAME: 1,
|
||||||
|
ICON: 2,
|
||||||
|
WORKSPACE: 3,
|
||||||
|
ADJUSTMENT: 4
|
||||||
|
};
|
||||||
|
|
||||||
class NewItemModel extends GObject.Object {
|
const Widget = GObject.registerClass({
|
||||||
static [GObject.interfaces] = [Gio.ListModel];
|
GTypeName: 'AutoMoveWindowsPrefsWidget',
|
||||||
static {
|
}, class Widget extends Gtk.Grid {
|
||||||
GObject.registerClass(this);
|
_init(params) {
|
||||||
}
|
super._init(params);
|
||||||
|
this.set_orientation(Gtk.Orientation.VERTICAL);
|
||||||
#item = new NewItem();
|
|
||||||
|
|
||||||
vfunc_get_item_type() {
|
|
||||||
return NewItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_n_items() {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_item(_pos) {
|
|
||||||
return this.#item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Rule extends GObject.Object {
|
|
||||||
static [GObject.properties] = {
|
|
||||||
'app-info': GObject.ParamSpec.object(
|
|
||||||
'app-info', 'app-info', 'app-info',
|
|
||||||
GObject.ParamFlags.READWRITE,
|
|
||||||
Gio.DesktopAppInfo),
|
|
||||||
'workspace': GObject.ParamSpec.uint(
|
|
||||||
'workspace', 'workspace', 'workspace',
|
|
||||||
GObject.ParamFlags.READWRITE,
|
|
||||||
1, WORKSPACE_MAX, 1),
|
|
||||||
};
|
|
||||||
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RulesList extends GObject.Object {
|
|
||||||
static [GObject.interfaces] = [Gio.ListModel];
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
#settings = ExtensionUtils.getSettings();
|
|
||||||
#rules = [];
|
|
||||||
#changedId;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
this.#changedId =
|
|
||||||
this.#settings.connect(`changed::${SETTINGS_KEY}`,
|
|
||||||
() => this.#sync());
|
|
||||||
this.#sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
append(appInfo) {
|
|
||||||
const pos = this.#rules.length;
|
|
||||||
|
|
||||||
this.#rules.push(new Rule({ appInfo }));
|
|
||||||
this.#saveRules();
|
|
||||||
|
|
||||||
this.items_changed(pos, 0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
remove(id) {
|
|
||||||
const pos = this.#rules.findIndex(r => r.appInfo.get_id() === id);
|
|
||||||
if (pos < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.#rules.splice(pos, 1);
|
|
||||||
this.#saveRules();
|
|
||||||
|
|
||||||
this.items_changed(pos, 1, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
changeWorkspace(id, workspace) {
|
|
||||||
const pos = this.#rules.findIndex(r => r.appInfo.get_id() === id);
|
|
||||||
if (pos < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.#rules[pos].set({ workspace });
|
|
||||||
this.#saveRules();
|
|
||||||
}
|
|
||||||
|
|
||||||
#saveRules() {
|
|
||||||
this.#settings.block_signal_handler(this.#changedId);
|
|
||||||
this.#settings.set_strv(SETTINGS_KEY,
|
|
||||||
this.#rules.map(r => `${r.app_info.get_id()}:${r.workspace}`));
|
|
||||||
this.#settings.unblock_signal_handler(this.#changedId);
|
|
||||||
}
|
|
||||||
|
|
||||||
#sync() {
|
|
||||||
const removed = this.#rules.length;
|
|
||||||
|
|
||||||
this.#rules = [];
|
|
||||||
for (const stringRule of this.#settings.get_strv(SETTINGS_KEY)) {
|
|
||||||
const [id, workspace] = stringRule.split(':');
|
|
||||||
const appInfo = Gio.DesktopAppInfo.new(id);
|
|
||||||
if (appInfo)
|
|
||||||
this.#rules.push(new Rule({ appInfo, workspace }));
|
|
||||||
else
|
|
||||||
log(`Invalid ID ${id}`);
|
|
||||||
}
|
|
||||||
this.items_changed(0, removed, this.#rules.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_item_type() {
|
|
||||||
return Rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_n_items() {
|
|
||||||
return this.#rules.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_get_item(pos) {
|
|
||||||
return this.#rules[pos] ?? null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AutoMoveSettingsWidget extends Adw.PreferencesGroup {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
|
|
||||||
this.install_action('rules.add', null, self => self._addNewRule());
|
|
||||||
this.install_action('rules.remove', 's',
|
|
||||||
(self, name, param) => self._rules.remove(param.unpack()));
|
|
||||||
this.install_action('rules.change-workspace', '(si)',
|
|
||||||
(self, name, param) => self._rules.changeWorkspace(...param.deepUnpack()));
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super({
|
|
||||||
title: _('Workspace Rules'),
|
|
||||||
});
|
|
||||||
|
|
||||||
this._rules = new RulesList();
|
|
||||||
|
|
||||||
const store = new Gio.ListStore({ item_type: Gio.ListModel });
|
|
||||||
const listModel = new Gtk.FlattenListModel({ model: store });
|
|
||||||
store.append(this._rules);
|
|
||||||
store.append(new NewItemModel());
|
|
||||||
|
|
||||||
this._list = new Gtk.ListBox({
|
|
||||||
selection_mode: Gtk.SelectionMode.NONE,
|
|
||||||
css_classes: ['boxed-list'],
|
|
||||||
});
|
|
||||||
this.add(this._list);
|
|
||||||
|
|
||||||
this._list.bind_model(listModel, item => {
|
|
||||||
return item instanceof NewItem
|
|
||||||
? new NewRuleRow()
|
|
||||||
: new RuleRow(item);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_addNewRule() {
|
|
||||||
const dialog = new NewRuleDialog(this.get_root());
|
|
||||||
dialog.connect('response', (dlg, id) => {
|
|
||||||
const appInfo = id === Gtk.ResponseType.OK
|
|
||||||
? dialog.get_widget().get_app_info() : null;
|
|
||||||
if (appInfo)
|
|
||||||
this._rules.append(appInfo);
|
|
||||||
dialog.destroy();
|
|
||||||
});
|
|
||||||
dialog.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class WorkspaceSelector extends Gtk.Widget {
|
|
||||||
static [GObject.properties] = {
|
|
||||||
'number': GObject.ParamSpec.uint(
|
|
||||||
'number', 'number', 'number',
|
|
||||||
GObject.ParamFlags.READWRITE,
|
|
||||||
1, WORKSPACE_MAX, 1),
|
|
||||||
};
|
|
||||||
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
|
|
||||||
this.set_layout_manager_type(Gtk.BoxLayout);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
|
|
||||||
this.layout_manager.spacing = 6;
|
|
||||||
|
|
||||||
const label = new Gtk.Label({
|
|
||||||
xalign: 1,
|
|
||||||
margin_end: 6,
|
|
||||||
});
|
|
||||||
this.bind_property('number',
|
|
||||||
label, 'label',
|
|
||||||
GObject.BindingFlags.SYNC_CREATE);
|
|
||||||
label.set_parent(this);
|
|
||||||
|
|
||||||
const buttonProps = {
|
|
||||||
css_classes: ['circular'],
|
|
||||||
valign: Gtk.Align.CENTER,
|
|
||||||
};
|
|
||||||
|
|
||||||
this._decButton = new Gtk.Button({
|
|
||||||
icon_name: 'list-remove-symbolic',
|
|
||||||
...buttonProps,
|
|
||||||
});
|
|
||||||
this._decButton.set_parent(this);
|
|
||||||
this._decButton.connect('clicked', () => this.number--);
|
|
||||||
|
|
||||||
this._incButton = new Gtk.Button({
|
|
||||||
icon_name: 'list-add-symbolic',
|
|
||||||
...buttonProps,
|
|
||||||
});
|
|
||||||
this._incButton.set_parent(this);
|
|
||||||
this._incButton.connect('clicked', () => this.number++);
|
|
||||||
|
|
||||||
this.connect('notify::number', () => this._syncButtons());
|
|
||||||
this._syncButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
_syncButtons() {
|
|
||||||
this._decButton.sensitive = this.number > 1;
|
|
||||||
this._incButton.sensitive = this.number < WORKSPACE_MAX;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RuleRow extends Adw.ActionRow {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(rule) {
|
|
||||||
const { appInfo } = rule;
|
|
||||||
const id = appInfo.get_id();
|
|
||||||
|
|
||||||
super({
|
|
||||||
activatable: false,
|
|
||||||
title: rule.appInfo.get_display_name(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const icon = new Gtk.Image({
|
|
||||||
css_classes: ['icon-dropshadow'],
|
|
||||||
gicon: appInfo.get_icon(),
|
|
||||||
pixel_size: 32,
|
|
||||||
});
|
|
||||||
this.add_prefix(icon);
|
|
||||||
|
|
||||||
const wsButton = new WorkspaceSelector();
|
|
||||||
rule.bind_property('workspace',
|
|
||||||
wsButton, 'number',
|
|
||||||
GObject.BindingFlags.SYNC_CREATE);
|
|
||||||
this.add_suffix(wsButton);
|
|
||||||
|
|
||||||
wsButton.connect('notify::number', () => {
|
|
||||||
this.activate_action('rules.change-workspace',
|
|
||||||
new GLib.Variant('(si)', [id, wsButton.number]));
|
|
||||||
});
|
|
||||||
|
|
||||||
const button = new Gtk.Button({
|
|
||||||
action_name: 'rules.remove',
|
|
||||||
action_target: new GLib.Variant('s', id),
|
|
||||||
icon_name: 'edit-delete-symbolic',
|
|
||||||
has_frame: false,
|
|
||||||
valign: Gtk.Align.CENTER,
|
|
||||||
});
|
|
||||||
this.add_suffix(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class NewRuleRow extends Gtk.ListBoxRow {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super({
|
|
||||||
action_name: 'rules.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 Rule')]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class NewRuleDialog extends Gtk.AppChooserDialog {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(parent) {
|
|
||||||
super({
|
|
||||||
transient_for: parent,
|
|
||||||
modal: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._settings = ExtensionUtils.getSettings();
|
this._settings = ExtensionUtils.getSettings();
|
||||||
|
this._settings.connect('changed', this._refresh.bind(this));
|
||||||
|
this._changedPermitted = false;
|
||||||
|
|
||||||
this.get_widget().set({
|
this._store = new Gtk.ListStore();
|
||||||
show_all: true,
|
this._store.set_column_types([
|
||||||
show_other: true, // hide more button
|
Gio.AppInfo,
|
||||||
|
GObject.TYPE_STRING,
|
||||||
|
Gio.Icon,
|
||||||
|
GObject.TYPE_INT,
|
||||||
|
Gtk.Adjustment
|
||||||
|
]);
|
||||||
|
|
||||||
|
let scrolled = new Gtk.ScrolledWindow({ shadow_type: Gtk.ShadowType.IN });
|
||||||
|
scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
|
this.add(scrolled);
|
||||||
|
|
||||||
|
|
||||||
|
this._treeView = new Gtk.TreeView({
|
||||||
|
model: this._store,
|
||||||
|
hexpand: true,
|
||||||
|
vexpand: true
|
||||||
});
|
});
|
||||||
|
this._treeView.get_selection().set_mode(Gtk.SelectionMode.SINGLE);
|
||||||
|
|
||||||
this.get_widget().connect('application-selected',
|
let appColumn = new Gtk.TreeViewColumn({
|
||||||
this._updateSensitivity.bind(this));
|
expand: true,
|
||||||
this._updateSensitivity();
|
sort_column_id: Columns.DISPLAY_NAME,
|
||||||
|
title: _('Application')
|
||||||
|
});
|
||||||
|
let iconRenderer = new Gtk.CellRendererPixbuf;
|
||||||
|
appColumn.pack_start(iconRenderer, false);
|
||||||
|
appColumn.add_attribute(iconRenderer, 'gicon', Columns.ICON);
|
||||||
|
let nameRenderer = new Gtk.CellRendererText;
|
||||||
|
appColumn.pack_start(nameRenderer, true);
|
||||||
|
appColumn.add_attribute(nameRenderer, 'text', Columns.DISPLAY_NAME);
|
||||||
|
this._treeView.append_column(appColumn);
|
||||||
|
|
||||||
|
let workspaceColumn = new Gtk.TreeViewColumn({
|
||||||
|
title: _('Workspace'),
|
||||||
|
sort_column_id: Columns.WORKSPACE
|
||||||
|
});
|
||||||
|
let workspaceRenderer = new Gtk.CellRendererSpin({ editable: true });
|
||||||
|
workspaceRenderer.connect('edited', this._workspaceEdited.bind(this));
|
||||||
|
workspaceColumn.pack_start(workspaceRenderer, true);
|
||||||
|
workspaceColumn.add_attribute(workspaceRenderer, 'adjustment', Columns.ADJUSTMENT);
|
||||||
|
workspaceColumn.add_attribute(workspaceRenderer, 'text', Columns.WORKSPACE);
|
||||||
|
this._treeView.append_column(workspaceColumn);
|
||||||
|
|
||||||
|
scrolled.add(this._treeView);
|
||||||
|
|
||||||
|
let toolbar = new Gtk.Toolbar({ icon_size: Gtk.IconSize.SMALL_TOOLBAR });
|
||||||
|
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
|
||||||
|
this.add(toolbar);
|
||||||
|
|
||||||
|
let newButton = new Gtk.ToolButton({
|
||||||
|
icon_name: 'bookmark-new-symbolic',
|
||||||
|
label: _('Add Rule'),
|
||||||
|
is_important: true
|
||||||
|
});
|
||||||
|
newButton.connect('clicked', this._createNew.bind(this));
|
||||||
|
toolbar.add(newButton);
|
||||||
|
|
||||||
|
let delButton = new Gtk.ToolButton({ icon_name: 'edit-delete-symbolic' });
|
||||||
|
delButton.connect('clicked', this._deleteSelected.bind(this));
|
||||||
|
toolbar.add(delButton);
|
||||||
|
|
||||||
|
let selection = this._treeView.get_selection();
|
||||||
|
selection.connect('changed', () => {
|
||||||
|
delButton.sensitive = selection.count_selected_rows() > 0;
|
||||||
|
});
|
||||||
|
delButton.sensitive = selection.count_selected_rows() > 0;
|
||||||
|
|
||||||
|
this._changedPermitted = true;
|
||||||
|
this._refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateSensitivity() {
|
_createNew() {
|
||||||
const rules = this._settings.get_strv(SETTINGS_KEY);
|
let dialog = new Gtk.Dialog({
|
||||||
const appInfo = this.get_widget().get_app_info();
|
title: _('Create new matching rule'),
|
||||||
this.set_response_sensitive(Gtk.ResponseType.OK,
|
transient_for: this.get_toplevel(),
|
||||||
appInfo && !rules.some(i => i.startsWith(appInfo.get_id())));
|
use_header_bar: true,
|
||||||
}
|
modal: true
|
||||||
}
|
});
|
||||||
|
dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
|
||||||
|
let addButton = dialog.add_button(_('Add'), Gtk.ResponseType.OK);
|
||||||
|
dialog.set_default_response(Gtk.ResponseType.OK);
|
||||||
|
|
||||||
|
let grid = new Gtk.Grid({
|
||||||
|
column_spacing: 10,
|
||||||
|
row_spacing: 15,
|
||||||
|
margin: 10
|
||||||
|
});
|
||||||
|
dialog._appChooser = new Gtk.AppChooserWidget({ show_all: true });
|
||||||
|
dialog._appChooser.connect('application-selected', (w, appInfo) => {
|
||||||
|
addButton.sensitive = appInfo && this._checkId(appInfo.get_id());
|
||||||
|
});
|
||||||
|
let appInfo = dialog._appChooser.get_app_info();
|
||||||
|
addButton.sensitive = appInfo && this._checkId(appInfo.get_id());
|
||||||
|
|
||||||
|
grid.attach(dialog._appChooser, 0, 0, 2, 1);
|
||||||
|
grid.attach(new Gtk.Label({
|
||||||
|
label: _('Workspace'),
|
||||||
|
halign: Gtk.Align.END
|
||||||
|
}), 0, 1, 1, 1);
|
||||||
|
let adjustment = new Gtk.Adjustment({
|
||||||
|
lower: 1,
|
||||||
|
upper: WORKSPACE_MAX,
|
||||||
|
step_increment: 1
|
||||||
|
});
|
||||||
|
dialog._spin = new Gtk.SpinButton({
|
||||||
|
adjustment: adjustment,
|
||||||
|
snap_to_ticks: true
|
||||||
|
});
|
||||||
|
dialog._spin.set_value(1);
|
||||||
|
grid.attach(dialog._spin, 1, 1, 1, 1);
|
||||||
|
dialog.get_content_area().add(grid);
|
||||||
|
|
||||||
|
dialog.connect('response', (dialog, id) => {
|
||||||
|
if (id != Gtk.ResponseType.OK) {
|
||||||
|
dialog.destroy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let appInfo = dialog._appChooser.get_app_info();
|
||||||
|
if (!appInfo)
|
||||||
|
return;
|
||||||
|
let index = Math.floor(dialog._spin.value);
|
||||||
|
if (isNaN(index) || index < 0)
|
||||||
|
index = 1;
|
||||||
|
|
||||||
|
this._changedPermitted = false;
|
||||||
|
this._appendItem(appInfo.get_id(), index);
|
||||||
|
this._changedPermitted = true;
|
||||||
|
|
||||||
|
this._appendRow(appInfo, index);
|
||||||
|
|
||||||
|
dialog.destroy();
|
||||||
|
});
|
||||||
|
dialog.show_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
_deleteSelected() {
|
||||||
|
let [any, model_, iter] = this._treeView.get_selection().get_selected();
|
||||||
|
|
||||||
|
if (any) {
|
||||||
|
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
||||||
|
|
||||||
|
this._changedPermitted = false;
|
||||||
|
this._removeItem(appInfo.get_id());
|
||||||
|
this._changedPermitted = true;
|
||||||
|
this._store.remove(iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_workspaceEdited(renderer, pathString, text) {
|
||||||
|
let index = parseInt(text);
|
||||||
|
if (isNaN(index) || index < 0)
|
||||||
|
index = 1;
|
||||||
|
let path = Gtk.TreePath.new_from_string(pathString);
|
||||||
|
let [model_, iter] = this._store.get_iter(path);
|
||||||
|
let appInfo = this._store.get_value(iter, Columns.APPINFO);
|
||||||
|
|
||||||
|
this._changedPermitted = false;
|
||||||
|
this._changeItem(appInfo.get_id(), index);
|
||||||
|
this._store.set_value(iter, Columns.WORKSPACE, index);
|
||||||
|
this._changedPermitted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_refresh() {
|
||||||
|
if (!this._changedPermitted)
|
||||||
|
// Ignore this notification, model is being modified outside
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._store.clear();
|
||||||
|
|
||||||
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
|
let validItems = [];
|
||||||
|
for (let i = 0; i < currentItems.length; i++) {
|
||||||
|
let [id, index] = currentItems[i].split(':');
|
||||||
|
let appInfo = Gio.DesktopAppInfo.new(id);
|
||||||
|
if (!appInfo)
|
||||||
|
continue;
|
||||||
|
validItems.push(currentItems[i]);
|
||||||
|
|
||||||
|
this._appendRow(appInfo, parseInt(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validItems.length != currentItems.length) // some items were filtered out
|
||||||
|
this._settings.set_strv(SETTINGS_KEY, validItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
_appendRow(appInfo, workspace) {
|
||||||
|
let iter = this._store.append();
|
||||||
|
let icon = appInfo.get_icon();
|
||||||
|
let displayName = appInfo.get_display_name();
|
||||||
|
let adj = new Gtk.Adjustment({
|
||||||
|
lower: 1,
|
||||||
|
upper: WORKSPACE_MAX,
|
||||||
|
step_increment: 1,
|
||||||
|
value: workspace
|
||||||
|
});
|
||||||
|
let { APPINFO, ICON, DISPLAY_NAME, WORKSPACE, ADJUSTMENT } = Columns;
|
||||||
|
this._store.set(iter,
|
||||||
|
[APPINFO, ICON, DISPLAY_NAME, WORKSPACE, ADJUSTMENT],
|
||||||
|
[appInfo, icon, displayName, workspace, adj]);
|
||||||
|
}
|
||||||
|
|
||||||
|
_checkId(id) {
|
||||||
|
let items = this._settings.get_strv(SETTINGS_KEY);
|
||||||
|
return !items.some(i => i.startsWith(`${id}:`));
|
||||||
|
}
|
||||||
|
|
||||||
|
_appendItem(id, workspace) {
|
||||||
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
|
currentItems.push(`${id}:${workspace}`);
|
||||||
|
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
_removeItem(id) {
|
||||||
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
|
let index = currentItems.map(el => el.split(':')[0]).indexOf(id);
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
return;
|
||||||
|
currentItems.splice(index, 1);
|
||||||
|
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
_changeItem(id, workspace) {
|
||||||
|
let currentItems = this._settings.get_strv(SETTINGS_KEY);
|
||||||
|
let index = currentItems.map(el => el.split(':')[0]).indexOf(id);
|
||||||
|
|
||||||
|
if (index < 0)
|
||||||
|
currentItems.push(`${id}:${workspace}`);
|
||||||
|
else
|
||||||
|
currentItems[index] = `${id}:${workspace}`;
|
||||||
|
this._settings.set_strv(SETTINGS_KEY, currentItems);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {Gtk.Widget} - the prefs widget
|
|
||||||
*/
|
|
||||||
function buildPrefsWidget() {
|
function buildPrefsWidget() {
|
||||||
return new AutoMoveSettingsWidget();
|
let widget = new Widget({ margin: 12 });
|
||||||
|
widget.show_all();
|
||||||
|
|
||||||
|
return widget;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
/* This extensions requires no special styling */
|
||||||
@@ -1,57 +1,40 @@
|
|||||||
/* exported init enable disable */
|
/* exported init enable disable */
|
||||||
// Drive menu extension
|
// Drive menu extension
|
||||||
const { Clutter, Gio, GObject, Shell, St } = imports.gi;
|
const { Gio, GObject, Shell, St } = imports.gi;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
Gio._promisify(Gio.File.prototype, 'query_filesystem_info_async');
|
|
||||||
|
|
||||||
class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(mount) {
|
constructor(mount) {
|
||||||
super({
|
super();
|
||||||
style_class: 'drive-menu-item',
|
|
||||||
});
|
|
||||||
|
|
||||||
this.label = new St.Label({
|
this.label = new St.Label({ text: mount.get_name() });
|
||||||
text: mount.get_name(),
|
this.actor.add(this.label, { expand: true });
|
||||||
x_expand: true,
|
this.actor.label_actor = this.label;
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
|
||||||
});
|
|
||||||
this.add_child(this.label);
|
|
||||||
this.label_actor = this.label;
|
|
||||||
|
|
||||||
this.mount = mount;
|
this.mount = mount;
|
||||||
|
|
||||||
this.connect('destroy', this._onDestroy.bind(this));
|
|
||||||
|
|
||||||
let ejectIcon = new St.Icon({
|
let ejectIcon = new St.Icon({
|
||||||
icon_name: 'media-eject-symbolic',
|
icon_name: 'media-eject-symbolic',
|
||||||
style_class: 'popup-menu-icon',
|
style_class: 'popup-menu-icon'
|
||||||
});
|
|
||||||
let ejectButton = new St.Button({
|
|
||||||
child: ejectIcon,
|
|
||||||
style_class: 'button',
|
|
||||||
});
|
});
|
||||||
|
let ejectButton = new St.Button({ child: ejectIcon });
|
||||||
ejectButton.connect('clicked', this._eject.bind(this));
|
ejectButton.connect('clicked', this._eject.bind(this));
|
||||||
this.add(ejectButton);
|
this.actor.add(ejectButton);
|
||||||
|
|
||||||
this.hide();
|
|
||||||
|
|
||||||
this._changedId = mount.connect('changed', this._syncVisibility.bind(this));
|
this._changedId = mount.connect('changed', this._syncVisibility.bind(this));
|
||||||
this._syncVisibility();
|
this._syncVisibility();
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
destroy() {
|
||||||
if (this._changedId) {
|
if (this._changedId) {
|
||||||
this.mount.disconnect(this._changedId);
|
this.mount.disconnect(this._changedId);
|
||||||
this._changedId = 0;
|
this._changedId = 0;
|
||||||
@@ -60,7 +43,7 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
super.destroy();
|
super.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
async _isInteresting() {
|
_isInteresting() {
|
||||||
if (!this.mount.can_eject() && !this.mount.can_unmount())
|
if (!this.mount.can_eject() && !this.mount.can_unmount())
|
||||||
return false;
|
return false;
|
||||||
if (this.mount.is_shadowed())
|
if (this.mount.is_shadowed())
|
||||||
@@ -68,41 +51,32 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
|
|
||||||
let volume = this.mount.get_volume();
|
let volume = this.mount.get_volume();
|
||||||
|
|
||||||
if (volume)
|
if (volume == null) {
|
||||||
return volume.get_identifier('class') !== 'network';
|
// probably a GDaemonMount, could be network or
|
||||||
|
// local, but we can't tell; assume it's local for now
|
||||||
const root = this.mount.get_root();
|
return true;
|
||||||
|
|
||||||
try {
|
|
||||||
const attr = Gio.FILE_ATTRIBUTE_FILESYSTEM_REMOTE;
|
|
||||||
const info = await root.query_filesystem_info_async(attr, null);
|
|
||||||
return !info.get_attribute_boolean(attr);
|
|
||||||
} catch (e) {
|
|
||||||
log(`Failed to query filesystem: ${e.message}`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hack, fall back to looking at GType
|
return volume.get_identifier('class') != 'network';
|
||||||
return Gio._LocalFilePrototype.isPrototypeOf(root);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async _syncVisibility() {
|
_syncVisibility() {
|
||||||
this.visible = await this._isInteresting();
|
this.actor.visible = this._isInteresting();
|
||||||
}
|
}
|
||||||
|
|
||||||
_eject() {
|
_eject() {
|
||||||
let unmountArgs = [
|
let unmountArgs = [
|
||||||
Gio.MountUnmountFlags.NONE,
|
Gio.MountUnmountFlags.NONE,
|
||||||
new ShellMountOperation.ShellMountOperation(this.mount).mountOp,
|
(new ShellMountOperation.ShellMountOperation(this.mount)).mountOp,
|
||||||
null, // Gio.Cancellable
|
null // Gio.Cancellable
|
||||||
];
|
];
|
||||||
|
|
||||||
if (this.mount.can_eject()) {
|
if (this.mount.can_eject())
|
||||||
this.mount.eject_with_operation(...unmountArgs,
|
this.mount.eject_with_operation(...unmountArgs,
|
||||||
this._ejectFinish.bind(this));
|
this._ejectFinish.bind(this));
|
||||||
} else {
|
else
|
||||||
this.mount.unmount_with_operation(...unmountArgs,
|
this.mount.unmount_with_operation(...unmountArgs,
|
||||||
this._unmountFinish.bind(this));
|
this._unmountFinish.bind(this));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_unmountFinish(mount, result) {
|
_unmountFinish(mount, result) {
|
||||||
@@ -128,32 +102,34 @@ class MountMenuItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
activate(event) {
|
activate(event) {
|
||||||
let uri = this.mount.get_root().get_uri();
|
|
||||||
let context = global.create_app_launch_context(event.get_time(), -1);
|
let context = global.create_app_launch_context(event.get_time(), -1);
|
||||||
Gio.AppInfo.launch_default_for_uri(uri, context);
|
Gio.AppInfo.launch_default_for_uri(this.mount.get_root().get_uri(),
|
||||||
|
context);
|
||||||
|
|
||||||
super.activate(event);
|
super.activate(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let DriveMenu = GObject.registerClass(
|
||||||
class DriveMenu extends PanelMenu.Button {
|
class DriveMenu extends PanelMenu.Button {
|
||||||
static {
|
_init() {
|
||||||
GObject.registerClass(this);
|
super._init(0.0, _('Removable devices'));
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super(0.0, _('Removable devices'));
|
|
||||||
|
|
||||||
|
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||||
let icon = new St.Icon({
|
let icon = new St.Icon({
|
||||||
icon_name: 'media-eject-symbolic',
|
icon_name: 'media-eject-symbolic',
|
||||||
style_class: 'system-status-icon',
|
style_class: 'system-status-icon'
|
||||||
});
|
});
|
||||||
|
|
||||||
this.add_child(icon);
|
hbox.add_child(icon);
|
||||||
|
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||||
|
this.add_child(hbox);
|
||||||
|
|
||||||
this._monitor = Gio.VolumeMonitor.get();
|
this._monitor = Gio.VolumeMonitor.get();
|
||||||
this._addedId = this._monitor.connect('mount-added',
|
this._addedId = this._monitor.connect('mount-added', (monitor, mount) => {
|
||||||
(monitor, mount) => this._addMount(mount));
|
this._addMount(mount);
|
||||||
|
this._updateMenuVisibility();
|
||||||
|
});
|
||||||
this._removedId = this._monitor.connect('mount-removed', (monitor, mount) => {
|
this._removedId = this._monitor.connect('mount-removed', (monitor, mount) => {
|
||||||
this._removeMount(mount);
|
this._removeMount(mount);
|
||||||
this._updateMenuVisibility();
|
this._updateMenuVisibility();
|
||||||
@@ -174,7 +150,7 @@ class DriveMenu extends PanelMenu.Button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updateMenuVisibility() {
|
_updateMenuVisibility() {
|
||||||
if (this._mounts.filter(i => i.visible).length > 0)
|
if (this._mounts.filter(i => i.actor.visible).length > 0)
|
||||||
this.show();
|
this.show();
|
||||||
else
|
else
|
||||||
this.hide();
|
this.hide();
|
||||||
@@ -184,20 +160,18 @@ class DriveMenu extends PanelMenu.Button {
|
|||||||
let item = new MountMenuItem(mount);
|
let item = new MountMenuItem(mount);
|
||||||
this._mounts.unshift(item);
|
this._mounts.unshift(item);
|
||||||
this.menu.addMenuItem(item, 0);
|
this.menu.addMenuItem(item, 0);
|
||||||
|
|
||||||
item.connect('notify::visible', () => this._updateMenuVisibility());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_removeMount(mount) {
|
_removeMount(mount) {
|
||||||
for (let i = 0; i < this._mounts.length; i++) {
|
for (let i = 0; i < this._mounts.length; i++) {
|
||||||
let item = this._mounts[i];
|
let item = this._mounts[i];
|
||||||
if (item.mount === mount) {
|
if (item.mount == mount) {
|
||||||
item.destroy();
|
item.destroy();
|
||||||
this._mounts.splice(i, 1);
|
this._mounts.splice(i, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log('Removing a mount that was never added to the menu');
|
log ('Removing a mount that was never added to the menu');
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@@ -210,22 +184,19 @@ class DriveMenu extends PanelMenu.Button {
|
|||||||
|
|
||||||
super._onDestroy();
|
super._onDestroy();
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
let _indicator;
|
let _indicator;
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
_indicator = new DriveMenu();
|
_indicator = new DriveMenu;
|
||||||
Main.panel.addToStatusArea('drive-menu', _indicator);
|
Main.panel.addToStatusArea('drive-menu', _indicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
_indicator.destroy();
|
_indicator.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,3 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
|
|||||||
@@ -1,7 +1 @@
|
|||||||
.drive-menu-item { spacing: 12px; }
|
/* This extensions requires no custom styling */
|
||||||
|
|
||||||
.drive-menu-item .button {
|
|
||||||
border-radius: 99px;
|
|
||||||
padding: 3px;
|
|
||||||
min-height: auto;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,15 +3,13 @@ const AppDisplay = imports.ui.appDisplay;
|
|||||||
|
|
||||||
let _activateOriginal = null;
|
let _activateOriginal = null;
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
_activateOriginal = AppDisplay.AppIcon.prototype.activate;
|
_activateOriginal = AppDisplay.AppIcon.prototype.activate;
|
||||||
AppDisplay.AppIcon.prototype.activate = function () {
|
AppDisplay.AppIcon.prototype.activate = function() {
|
||||||
_activateOriginal.call(this, 2);
|
_activateOriginal.call(this, 2);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
AppDisplay.AppIcon.prototype.activate = _activateOriginal;
|
AppDisplay.AppIcon.prototype.activate = _activateOriginal;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
/* This extensions requires no special styling */
|
||||||
+21
-5
@@ -3,7 +3,7 @@ js_sources = []
|
|||||||
|
|
||||||
metadata_name = 'metadata.json'
|
metadata_name = 'metadata.json'
|
||||||
|
|
||||||
foreach e : enabled_extensions
|
foreach e : all_extensions
|
||||||
uuid = e + uuid_suffix
|
uuid = e + uuid_suffix
|
||||||
|
|
||||||
metadata_conf = configuration_data()
|
metadata_conf = configuration_data()
|
||||||
@@ -15,15 +15,31 @@ foreach e : enabled_extensions
|
|||||||
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_sources = files(e + '/extension.js')
|
||||||
extension_data = []
|
extension_data = files(e + '/stylesheet.css')
|
||||||
|
|
||||||
subdir(e)
|
subdir(e)
|
||||||
|
|
||||||
install_data (extension_sources + extension_data,
|
js_sources += extension_sources
|
||||||
install_dir: join_paths(extensiondir, uuid)
|
|
||||||
)
|
if (enabled_extensions.contains(e))
|
||||||
|
install_data (extension_sources + extension_data,
|
||||||
|
install_dir: join_paths(extensiondir, uuid)
|
||||||
|
)
|
||||||
|
endif
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
install_data (extension_schemas,
|
install_data (extension_schemas,
|
||||||
install_dir: schemadir
|
install_dir: schemadir
|
||||||
)
|
)
|
||||||
|
|
||||||
|
foreach js_source : js_sources
|
||||||
|
if (js60.found())
|
||||||
|
path_array = '@0@'.format(js_source).split('/')
|
||||||
|
name = join_paths(path_array[-2], path_array[-1])
|
||||||
|
|
||||||
|
test('Checking syntax of ' + name, js60,
|
||||||
|
args: ['-s', '-c', js_source],
|
||||||
|
workdir: meson.current_source_dir()
|
||||||
|
)
|
||||||
|
endif
|
||||||
|
endforeach
|
||||||
|
|||||||
@@ -4,6 +4,5 @@ extension_data += configure_file(
|
|||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
|
|
||||||
# extension_data += files('stylesheet.css')
|
|
||||||
# extension_sources += files('prefs.js')
|
# extension_sources += files('prefs.js')
|
||||||
# extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
# extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||||
/* exported enable disable */
|
/* exported enable disable */
|
||||||
const { Clutter } = imports.gi;
|
const Workspace = imports.ui.workspace;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Main = imports.ui.main;
|
|
||||||
const { WindowPreview } = imports.ui.windowPreview;
|
|
||||||
const Workspace = imports.ui.workspace;
|
|
||||||
|
|
||||||
// testing settings for natural window placement strategy:
|
// testing settings for natural window placement strategy:
|
||||||
const WINDOW_PLACEMENT_NATURAL_ACCURACY = 20; // accuracy of window translate moves (KDE-default: 20)
|
const WINDOW_PLACEMENT_NATURAL_ACCURACY = 20; // accuracy of window translate moves (KDE-default: 20)
|
||||||
@@ -17,7 +14,9 @@ class Rect {
|
|||||||
[this.x, this.y, this.width, this.height] = [x, y, width, height];
|
[this.x, this.y, this.width, this.height] = [x, y, width, height];
|
||||||
}
|
}
|
||||||
|
|
||||||
// used in _calculateWindowTransformationsNatural to replace Meta.Rectangle that is too slow.
|
/**
|
||||||
|
* used in _calculateWindowTransformationsNatural to replace Meta.Rectangle that is too slow.
|
||||||
|
*/
|
||||||
copy() {
|
copy() {
|
||||||
return new Rect(this.x, this.y, this.width, this.height);
|
return new Rect(this.x, this.y, this.width, this.height);
|
||||||
}
|
}
|
||||||
@@ -50,10 +49,10 @@ class Rect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlap(rect2) {
|
overlap(rect2) {
|
||||||
return !(this.x + this.width <= rect2.x ||
|
return !((this.x + this.width <= rect2.x) ||
|
||||||
rect2.x + rect2.width <= this.x ||
|
(rect2.x + rect2.width <= this.x) ||
|
||||||
this.y + this.height <= rect2.y ||
|
(this.y + this.height <= rect2.y) ||
|
||||||
rect2.y + rect2.height <= this.y);
|
(rect2.y + rect2.height <= this.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
center() {
|
center() {
|
||||||
@@ -67,18 +66,16 @@ class Rect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
||||||
constructor(params, settings) {
|
constructor(settings) {
|
||||||
super(params);
|
super();
|
||||||
this._settings = settings;
|
this._settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
computeLayout(windows, _params) {
|
computeLayout(windows, layout) {
|
||||||
return {
|
layout.windows = windows;
|
||||||
windows,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/**
|
||||||
* Returns clones with matching target coordinates and scales to arrange windows in a natural way that no overlap exists and relative window size is preserved.
|
* Returns clones with matching target coordinates and scales to arrange windows in a natural way that no overlap exists and relative window size is preserved.
|
||||||
* This function is almost a 1:1 copy of the function
|
* This function is almost a 1:1 copy of the function
|
||||||
* PresentWindowsEffect::calculateWindowTransformationsNatural() from KDE, see:
|
* PresentWindowsEffect::calculateWindowTransformationsNatural() from KDE, see:
|
||||||
@@ -97,15 +94,16 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
|||||||
let rects = [];
|
let rects = [];
|
||||||
for (let i = 0; i < clones.length; i++) {
|
for (let i = 0; i < clones.length; i++) {
|
||||||
// save rectangles into 4-dimensional arrays representing two corners of the rectangular: [left_x, top_y, right_x, bottom_y]
|
// save rectangles into 4-dimensional arrays representing two corners of the rectangular: [left_x, top_y, right_x, bottom_y]
|
||||||
let rect = clones[i].boundingBox;
|
let rect = clones[i].metaWindow.get_frame_rect();
|
||||||
rects[i] = new Rect(rect.x, rect.y, rect.width, rect.height);
|
rects[i] = new Rect(rect.x, rect.y, rect.width, rect.height);
|
||||||
bounds = bounds.union(rects[i]);
|
bounds = bounds.union(rects[i]);
|
||||||
|
|
||||||
// This is used when the window is on the edge of the screen to try to use as much screen real estate as possible.
|
// This is used when the window is on the edge of the screen to try to use as much screen real estate as possible.
|
||||||
directions[i] = direction;
|
directions[i] = direction;
|
||||||
direction++;
|
direction++;
|
||||||
if (direction === 4)
|
if (direction == 4) {
|
||||||
direction = 0;
|
direction = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let loopCounter = 0;
|
let loopCounter = 0;
|
||||||
@@ -115,10 +113,10 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
|||||||
for (let i = 0; i < rects.length; i++) {
|
for (let i = 0; i < rects.length; i++) {
|
||||||
for (let j = 0; j < rects.length; j++) {
|
for (let j = 0; j < rects.length; j++) {
|
||||||
let adjustments = [-1, -1, 1, 1]
|
let adjustments = [-1, -1, 1, 1]
|
||||||
.map(v => (v *= WINDOW_PLACEMENT_NATURAL_GAPS));
|
.map(v => v *= WINDOW_PLACEMENT_NATURAL_GAPS);
|
||||||
let iAdjusted = rects[i].adjusted(...adjustments);
|
let iAdjusted = rects[i].adjusted(...adjustments);
|
||||||
let jAdjusted = rects[j].adjusted(...adjustments);
|
let jAdjusted = rects[j].adjusted(...adjustments);
|
||||||
if (i !== j && iAdjusted.overlap(jAdjusted)) {
|
if (i != j && iAdjusted.overlap(jAdjusted)) {
|
||||||
loopCounter++;
|
loopCounter++;
|
||||||
overlap = true;
|
overlap = true;
|
||||||
|
|
||||||
@@ -130,10 +128,10 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
|||||||
let diff = [jCenter[0] - iCenter[0], jCenter[1] - iCenter[1]];
|
let diff = [jCenter[0] - iCenter[0], jCenter[1] - iCenter[1]];
|
||||||
|
|
||||||
// Prevent dividing by zero and non-movement
|
// Prevent dividing by zero and non-movement
|
||||||
if (diff[0] === 0 && diff[1] === 0)
|
if (diff[0] == 0 && diff[1] == 0)
|
||||||
diff[0] = 1;
|
diff[0] = 1;
|
||||||
// Try to keep screen/workspace aspect ratio
|
// Try to keep screen/workspace aspect ratio
|
||||||
if (bounds.height / bounds.width > areaRect.height / areaRect.width)
|
if ( bounds.height / bounds.width > areaRect.height / areaRect.width )
|
||||||
diff[0] *= 2;
|
diff[0] *= 2;
|
||||||
else
|
else
|
||||||
diff[1] *= 2;
|
diff[1] *= 2;
|
||||||
@@ -162,33 +160,33 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
|||||||
let xSection = Math.round((rects[i].x - bounds.x) / (bounds.width / 3));
|
let xSection = Math.round((rects[i].x - bounds.x) / (bounds.width / 3));
|
||||||
let ySection = Math.round((rects[i].y - bounds.y) / (bounds.height / 3));
|
let ySection = Math.round((rects[i].y - bounds.y) / (bounds.height / 3));
|
||||||
|
|
||||||
iCenter = rects[i].center();
|
let iCenter = rects[i].center();
|
||||||
diff[0] = 0;
|
diff[0] = 0;
|
||||||
diff[1] = 0;
|
diff[1] = 0;
|
||||||
if (xSection !== 1 || ySection !== 1) { // Remove this if you want the center to pull as well
|
if (xSection != 1 || ySection != 1) { // Remove this if you want the center to pull as well
|
||||||
if (xSection === 1)
|
if (xSection == 1)
|
||||||
xSection = directions[i] / 2 ? 2 : 0;
|
xSection = (directions[i] / 2 ? 2 : 0);
|
||||||
if (ySection === 1)
|
if (ySection == 1)
|
||||||
ySection = directions[i] % 2 ? 2 : 0;
|
ySection = (directions[i] % 2 ? 2 : 0);
|
||||||
}
|
}
|
||||||
if (xSection === 0 && ySection === 0) {
|
if (xSection == 0 && ySection == 0) {
|
||||||
diff[0] = bounds.x - iCenter[0];
|
diff[0] = bounds.x - iCenter[0];
|
||||||
diff[1] = bounds.y - iCenter[1];
|
diff[1] = bounds.y - iCenter[1];
|
||||||
}
|
}
|
||||||
if (xSection === 2 && ySection === 0) {
|
if (xSection == 2 && ySection == 0) {
|
||||||
diff[0] = bounds.x + bounds.width - iCenter[0];
|
diff[0] = bounds.x + bounds.width - iCenter[0];
|
||||||
diff[1] = bounds.y - iCenter[1];
|
diff[1] = bounds.y - iCenter[1];
|
||||||
}
|
}
|
||||||
if (xSection === 2 && ySection === 2) {
|
if (xSection == 2 && ySection == 2) {
|
||||||
diff[0] = bounds.x + bounds.width - iCenter[0];
|
diff[0] = bounds.x + bounds.width - iCenter[0];
|
||||||
diff[1] = bounds.y + bounds.height - iCenter[1];
|
diff[1] = bounds.y + bounds.height - iCenter[1];
|
||||||
}
|
}
|
||||||
if (xSection === 0 && ySection === 2) {
|
if (xSection == 0 && ySection == 2) {
|
||||||
diff[0] = bounds.x - iCenter[0];
|
diff[0] = bounds.x - iCenter[0];
|
||||||
diff[1] = bounds.y + bounds.height - iCenter[1];
|
diff[1] = bounds.y + bounds.height - iCenter[1];
|
||||||
}
|
}
|
||||||
if (diff[0] !== 0 || diff[1] !== 0) {
|
if (diff[0] != 0 || diff[1] != 0) {
|
||||||
length = Math.sqrt(diff[0] * diff[0] + diff[1] * diff[1]);
|
let length = Math.sqrt(diff[0] * diff[0] + diff[1] * diff[1]);
|
||||||
diff[0] *= WINDOW_PLACEMENT_NATURAL_ACCURACY / length / 2; // /2 to make it less influencing than the normal center-move above
|
diff[0] *= WINDOW_PLACEMENT_NATURAL_ACCURACY / length / 2; // /2 to make it less influencing than the normal center-move above
|
||||||
diff[1] *= WINDOW_PLACEMENT_NATURAL_ACCURACY / length / 2;
|
diff[1] *= WINDOW_PLACEMENT_NATURAL_ACCURACY / length / 2;
|
||||||
rects[i].translate(diff[0], diff[1]);
|
rects[i].translate(diff[0], diff[1]);
|
||||||
@@ -205,31 +203,28 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
|||||||
|
|
||||||
// Work out scaling by getting the most top-left and most bottom-right window coords.
|
// Work out scaling by getting the most top-left and most bottom-right window coords.
|
||||||
let scale;
|
let scale;
|
||||||
scale = Math.min(
|
scale = Math.min(areaRect.width / bounds.width,
|
||||||
areaRect.width / bounds.width,
|
areaRect.height / bounds.height,
|
||||||
areaRect.height / bounds.height,
|
1.0);
|
||||||
1.0);
|
|
||||||
|
|
||||||
// Make bounding rect fill the screen size for later steps
|
// Make bounding rect fill the screen size for later steps
|
||||||
bounds.x -= (areaRect.width - bounds.width * scale) / 2;
|
bounds.x = bounds.x - (areaRect.width - bounds.width * scale) / 2;
|
||||||
bounds.y -= (areaRect.height - bounds.height * scale) / 2;
|
bounds.y = bounds.y - (areaRect.height - bounds.height * scale) / 2;
|
||||||
bounds.width = areaRect.width / scale;
|
bounds.width = areaRect.width / scale;
|
||||||
bounds.height = areaRect.height / scale;
|
bounds.height = areaRect.height / scale;
|
||||||
|
|
||||||
// Move all windows back onto the screen and set their scale
|
// Move all windows back onto the screen and set their scale
|
||||||
for (let i = 0; i < rects.length; i++)
|
for (let i = 0; i < rects.length; i++) {
|
||||||
rects[i].translate(-bounds.x, -bounds.y);
|
rects[i].translate(-bounds.x, -bounds.y);
|
||||||
|
}
|
||||||
|
|
||||||
// rescale to workspace
|
// rescale to workspace
|
||||||
let slots = [];
|
let slots = [];
|
||||||
for (let i = 0; i < rects.length; i++) {
|
for (let i = 0; i < rects.length; i++) {
|
||||||
rects[i].x = rects[i].x * scale + areaRect.x;
|
rects[i].x = rects[i].x * scale + areaRect.x;
|
||||||
rects[i].y = rects[i].y * scale + areaRect.y;
|
rects[i].y = rects[i].y * scale + areaRect.y;
|
||||||
rects[i].width *= scale;
|
|
||||||
rects[i].height *= scale;
|
|
||||||
|
|
||||||
slots.push([rects[i].x, rects[i].y, rects[i].width, rects[i].height, clones[i]]);
|
slots.push([rects[i].x, rects[i].y, scale, clones[i]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return slots;
|
return slots;
|
||||||
@@ -238,57 +233,37 @@ class NaturalLayoutStrategy extends Workspace.LayoutStrategy {
|
|||||||
|
|
||||||
let winInjections, workspaceInjections;
|
let winInjections, workspaceInjections;
|
||||||
|
|
||||||
/** */
|
|
||||||
function resetState() {
|
function resetState() {
|
||||||
winInjections = { };
|
winInjections = { };
|
||||||
workspaceInjections = { };
|
workspaceInjections = { };
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
resetState();
|
resetState();
|
||||||
|
|
||||||
let settings = ExtensionUtils.getSettings();
|
let settings = ExtensionUtils.getSettings();
|
||||||
|
|
||||||
workspaceInjections['_createBestLayout'] = Workspace.WorkspaceLayout.prototype._createBestLayout;
|
workspaceInjections['_getBestLayout'] = Workspace.Workspace.prototype._getBestLayout;
|
||||||
Workspace.WorkspaceLayout.prototype._createBestLayout = function (_area) {
|
Workspace.Workspace.prototype._getBestLayout = function(windows) {
|
||||||
this._layoutStrategy = new NaturalLayoutStrategy({
|
let strategy = new NaturalLayoutStrategy(settings);
|
||||||
monitor: Main.layoutManager.monitors[this._monitorIndex],
|
let layout = { strategy };
|
||||||
}, settings);
|
strategy.computeLayout(windows, layout);
|
||||||
return this._layoutStrategy.computeLayout(this._sortedWindows);
|
|
||||||
|
return layout;
|
||||||
};
|
};
|
||||||
|
|
||||||
// position window titles on top of windows in overlay
|
/// position window titles on top of windows in overlay ////
|
||||||
winInjections['_init'] = WindowPreview.prototype._init;
|
winInjections['relayout'] = Workspace.WindowOverlay.prototype.relayout;
|
||||||
WindowPreview.prototype._init = function (...args) {
|
Workspace.WindowOverlay.prototype.relayout = function(animate) {
|
||||||
winInjections['_init'].call(this, ...args);
|
if (settings.get_boolean('window-captions-on-top')) {
|
||||||
|
let [, , , cloneHeight] = this._windowClone.slot;
|
||||||
|
this.title.translation_y = -cloneHeight;
|
||||||
|
}
|
||||||
|
|
||||||
if (!settings.get_boolean('window-captions-on-top'))
|
winInjections['relayout'].call(this, animate);
|
||||||
return;
|
|
||||||
|
|
||||||
const alignConstraint = this._title.get_constraints().find(
|
|
||||||
c => c.align_axis && c.align_axis === Clutter.AlignAxis.Y_AXIS);
|
|
||||||
alignConstraint.factor = 0;
|
|
||||||
|
|
||||||
const bindConstraint = this._title.get_constraints().find(
|
|
||||||
c => c.coordinate && c.coordinate === Clutter.BindCoordinate.Y);
|
|
||||||
bindConstraint.offset = 0;
|
|
||||||
};
|
|
||||||
winInjections['_adjustOverlayOffsets'] =
|
|
||||||
WindowPreview.prototype._adjustOverlayOffsets;
|
|
||||||
WindowPreview.prototype._adjustOverlayOffsets = function (...args) {
|
|
||||||
winInjections['_adjustOverlayOffsets'].call(this, ...args);
|
|
||||||
|
|
||||||
if (settings.get_boolean('window-captions-on-top'))
|
|
||||||
this._title.translation_y = -this._title.translation_y;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} object - object that was modified
|
|
||||||
* @param {Object} injection - the map of previous injections
|
|
||||||
* @param {string} name - the @injection key that should be removed
|
|
||||||
*/
|
|
||||||
function removeInjection(object, injection, name) {
|
function removeInjection(object, injection, name) {
|
||||||
if (injection[name] === undefined)
|
if (injection[name] === undefined)
|
||||||
delete object[name];
|
delete object[name];
|
||||||
@@ -296,14 +271,13 @@ function removeInjection(object, injection, name) {
|
|||||||
object[name] = injection[name];
|
object[name] = injection[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
var i;
|
var i;
|
||||||
|
|
||||||
for (i in workspaceInjections)
|
for (i in workspaceInjections)
|
||||||
removeInjection(Workspace.WorkspaceLayout.prototype, workspaceInjections, i);
|
removeInjection(Workspace.Workspace.prototype, workspaceInjections, i);
|
||||||
for (i in winInjections)
|
for (i in winInjections)
|
||||||
removeInjection(WindowPreview.prototype, winInjections, i);
|
removeInjection(Workspace.WindowOverlay.prototype, winInjections, i);
|
||||||
|
|
||||||
global.stage.queue_relayout();
|
global.stage.queue_relayout();
|
||||||
resetState();
|
resetState();
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
.window-caption {
|
||||||
|
-shell-caption-spacing: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-picker {
|
||||||
|
-horizontal-spacing: 32px;
|
||||||
|
-vertical-spacing: 32px;
|
||||||
|
padding: 64px 32px;
|
||||||
|
}
|
||||||
@@ -3,58 +3,46 @@
|
|||||||
|
|
||||||
const { Clutter, GObject, St } = imports.gi;
|
const { Clutter, GObject, St } = imports.gi;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
const N_ = x => x;
|
||||||
|
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
const Me = ExtensionUtils.getCurrentExtension();
|
||||||
const PlaceDisplay = Me.imports.placeDisplay;
|
const PlaceDisplay = Me.imports.placeDisplay;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
|
||||||
const N_ = x => x;
|
|
||||||
|
|
||||||
const PLACE_ICON_SIZE = 16;
|
const PLACE_ICON_SIZE = 16;
|
||||||
|
|
||||||
class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
|
class PlaceMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(info) {
|
constructor(info) {
|
||||||
super({
|
super();
|
||||||
style_class: 'place-menu-item',
|
|
||||||
});
|
|
||||||
this._info = info;
|
this._info = info;
|
||||||
|
|
||||||
this._icon = new St.Icon({
|
this._icon = new St.Icon({
|
||||||
gicon: info.icon,
|
gicon: info.icon,
|
||||||
icon_size: PLACE_ICON_SIZE,
|
icon_size: PLACE_ICON_SIZE
|
||||||
});
|
});
|
||||||
this.add_child(this._icon);
|
this.actor.add_child(this._icon);
|
||||||
|
|
||||||
this._label = new St.Label({
|
this._label = new St.Label({ text: info.name, x_expand: true });
|
||||||
text: info.name,
|
this.actor.add_child(this._label);
|
||||||
x_expand: true,
|
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
|
||||||
});
|
|
||||||
this.add_child(this._label);
|
|
||||||
|
|
||||||
if (info.isRemovable()) {
|
if (info.isRemovable()) {
|
||||||
this._ejectIcon = new St.Icon({
|
this._ejectIcon = new St.Icon({
|
||||||
icon_name: 'media-eject-symbolic',
|
icon_name: 'media-eject-symbolic',
|
||||||
style_class: 'popup-menu-icon',
|
style_class: 'popup-menu-icon'
|
||||||
});
|
|
||||||
this._ejectButton = new St.Button({
|
|
||||||
child: this._ejectIcon,
|
|
||||||
style_class: 'button',
|
|
||||||
});
|
});
|
||||||
|
this._ejectButton = new St.Button({ child: this._ejectIcon });
|
||||||
this._ejectButton.connect('clicked', info.eject.bind(info));
|
this._ejectButton.connect('clicked', info.eject.bind(info));
|
||||||
this.add_child(this._ejectButton);
|
this.actor.add_child(this._ejectButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._changedId = info.connect('changed',
|
this._changedId = info.connect('changed',
|
||||||
this._propertiesChanged.bind(this));
|
this._propertiesChanged.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
@@ -82,23 +70,23 @@ const SECTIONS = [
|
|||||||
'special',
|
'special',
|
||||||
'devices',
|
'devices',
|
||||||
'bookmarks',
|
'bookmarks',
|
||||||
'network',
|
'network'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
let PlacesMenu = GObject.registerClass(
|
||||||
class PlacesMenu extends PanelMenu.Button {
|
class PlacesMenu extends PanelMenu.Button {
|
||||||
static {
|
_init() {
|
||||||
GObject.registerClass(this);
|
super._init(0.0, _('Places'));
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super(0.0, _('Places'));
|
|
||||||
|
|
||||||
|
let hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
|
||||||
let label = new St.Label({
|
let label = new St.Label({
|
||||||
text: _('Places'),
|
text: _('Places'),
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER
|
||||||
});
|
});
|
||||||
this.add_actor(label);
|
hbox.add_child(label);
|
||||||
|
hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
|
||||||
|
this.add_actor(hbox);
|
||||||
|
|
||||||
this.placesManager = new PlaceDisplay.PlacesManager();
|
this.placesManager = new PlaceDisplay.PlacesManager();
|
||||||
|
|
||||||
@@ -136,26 +124,23 @@ class PlacesMenu extends PanelMenu.Button {
|
|||||||
|
|
||||||
this._sections[id].actor.visible = places.length > 0;
|
this._sections[id].actor.visible = places.length > 0;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
let _indicator;
|
let _indicator;
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
_indicator = new PlacesMenu();
|
_indicator = new PlacesMenu;
|
||||||
|
|
||||||
let pos = Main.sessionMode.panel.left.indexOf('appMenu');
|
let pos = 1;
|
||||||
if ('apps-menu' in Main.panel.statusArea)
|
if ('apps-menu' in Main.panel.statusArea)
|
||||||
pos++;
|
pos = 2;
|
||||||
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
|
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
_indicator.destroy();
|
_indicator.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,5 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
|
|
||||||
extension_sources += files('placeDisplay.js')
|
extension_sources += files('placeDisplay.js')
|
||||||
|
|||||||
@@ -3,16 +3,13 @@
|
|||||||
const { Gio, GLib, Shell } = imports.gi;
|
const { Gio, GLib, Shell } = imports.gi;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
const N_ = x => x;
|
const N_ = x => x;
|
||||||
|
|
||||||
Gio._promisify(Gio.AppInfo, 'launch_default_for_uri_async');
|
|
||||||
Gio._promisify(Gio.File.prototype, 'mount_enclosing_volume');
|
|
||||||
|
|
||||||
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
||||||
|
|
||||||
const Hostname1Iface = '<node> \
|
const Hostname1Iface = '<node> \
|
||||||
@@ -23,8 +20,8 @@ const Hostname1Iface = '<node> \
|
|||||||
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
|
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
|
||||||
|
|
||||||
class PlaceInfo {
|
class PlaceInfo {
|
||||||
constructor(...params) {
|
constructor() {
|
||||||
this._init(...params);
|
this._init.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
_init(kind, file, name, icon) {
|
_init(kind, file, name, icon) {
|
||||||
@@ -43,19 +40,19 @@ class PlaceInfo {
|
|||||||
|
|
||||||
async _ensureMountAndLaunch(context, tryMount) {
|
async _ensureMountAndLaunch(context, tryMount) {
|
||||||
try {
|
try {
|
||||||
await Gio.AppInfo.launch_default_for_uri_async(this.file.get_uri(), context, null);
|
await this._launchDefaultForUri(this.file.get_uri(), context, null);
|
||||||
} catch (err) {
|
} catch (e) {
|
||||||
if (!err.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
|
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
|
||||||
Main.notifyError(_('Failed to launch “%s”').format(this.name), err.message);
|
Main.notifyError(_('Failed to launch “%s”').format(this.name), e.message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let source = {
|
let source = {
|
||||||
get_icon: () => this.icon,
|
get_icon: () => this.icon
|
||||||
};
|
};
|
||||||
let op = new ShellMountOperation.ShellMountOperation(source);
|
let op = new ShellMountOperation.ShellMountOperation(source);
|
||||||
try {
|
try {
|
||||||
await this.file.mount_enclosing_volume(0, op.mountOp, null);
|
await this._mountEnclosingVolume(0, op.mountOp, null);
|
||||||
|
|
||||||
if (tryMount)
|
if (tryMount)
|
||||||
this._ensureMountAndLaunch(context, false);
|
this._ensureMountAndLaunch(context, false);
|
||||||
@@ -74,21 +71,18 @@ class PlaceInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getIcon() {
|
getIcon() {
|
||||||
this.file.query_info_async('standard::symbolic-icon',
|
this.file.query_info_async('standard::symbolic-icon', 0, 0, null,
|
||||||
Gio.FileQueryInfoFlags.NONE,
|
(file, result) => {
|
||||||
0,
|
try {
|
||||||
null,
|
let info = file.query_info_finish(result);
|
||||||
(file, result) => {
|
this.icon = info.get_symbolic_icon();
|
||||||
try {
|
this.emit('changed');
|
||||||
let info = file.query_info_finish(result);
|
} catch (e) {
|
||||||
this.icon = info.get_symbolic_icon();
|
if (e instanceof Gio.IOErrorEnum)
|
||||||
this.emit('changed');
|
return;
|
||||||
} catch (e) {
|
throw e;
|
||||||
if (e instanceof Gio.IOErrorEnum)
|
}
|
||||||
return;
|
});
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// return a generic icon for this kind for now, until we have the
|
// return a generic icon for this kind for now, until we have the
|
||||||
// icon from the query info above
|
// icon from the query info above
|
||||||
@@ -117,6 +111,32 @@ class PlaceInfo {
|
|||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_launchDefaultForUri(uri, context, cancel) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
Gio.AppInfo.launch_default_for_uri_async(uri, context, cancel, (o, res) => {
|
||||||
|
try {
|
||||||
|
Gio.AppInfo.launch_default_for_uri_finish(res);
|
||||||
|
resolve();
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_mountEnclosingVolume(flags, mountOp, cancel) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.file.mount_enclosing_volume(flags, mountOp, cancel, (o, res) => {
|
||||||
|
try {
|
||||||
|
this.file.mount_enclosing_volume_finish(res);
|
||||||
|
resolve();
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Signals.addSignalMethods(PlaceInfo.prototype);
|
Signals.addSignalMethods(PlaceInfo.prototype);
|
||||||
|
|
||||||
@@ -132,7 +152,7 @@ class RootInfo extends PlaceInfo {
|
|||||||
|
|
||||||
this._proxy = obj;
|
this._proxy = obj;
|
||||||
this._proxy.connect('g-properties-changed',
|
this._proxy.connect('g-properties-changed',
|
||||||
this._propertiesChanged.bind(this));
|
this._propertiesChanged.bind(this));
|
||||||
this._propertiesChanged(obj);
|
this._propertiesChanged(obj);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -171,23 +191,22 @@ class PlaceDeviceInfo extends PlaceInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isRemovable() {
|
isRemovable() {
|
||||||
return this._mount.can_eject() || this._mount.can_unmount();
|
return this._mount.can_eject();
|
||||||
}
|
}
|
||||||
|
|
||||||
eject() {
|
eject() {
|
||||||
let unmountArgs = [
|
let unmountArgs = [
|
||||||
Gio.MountUnmountFlags.NONE,
|
Gio.MountUnmountFlags.NONE,
|
||||||
new ShellMountOperation.ShellMountOperation(this._mount).mountOp,
|
(new ShellMountOperation.ShellMountOperation(this._mount)).mountOp,
|
||||||
null, // Gio.Cancellable
|
null // Gio.Cancellable
|
||||||
];
|
];
|
||||||
|
|
||||||
if (this._mount.can_eject()) {
|
if (this._mount.can_eject())
|
||||||
this._mount.eject_with_operation(...unmountArgs,
|
this._mount.eject_with_operation(...unmountArgs,
|
||||||
this._ejectFinish.bind(this));
|
this._ejectFinish.bind(this));
|
||||||
} else {
|
else
|
||||||
this._mount.unmount_with_operation(...unmountArgs,
|
this._mount.unmount_with_operation(...unmountArgs,
|
||||||
this._unmountFinish.bind(this));
|
this._unmountFinish.bind(this));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_ejectFinish(mount, result) {
|
_ejectFinish(mount, result) {
|
||||||
@@ -256,8 +275,9 @@ var PlacesManager = class {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: BACKGROUND_SCHEMA });
|
||||||
this._showDesktopIconsChangedId = this._settings.connect(
|
this._showDesktopIconsChangedId =
|
||||||
'changed::show-desktop-icons', this._updateSpecials.bind(this));
|
this._settings.connect('changed::show-desktop-icons',
|
||||||
|
this._updateSpecials.bind(this));
|
||||||
this._updateSpecials();
|
this._updateSpecials();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -299,7 +319,7 @@ var PlacesManager = class {
|
|||||||
'mount-changed',
|
'mount-changed',
|
||||||
'drive-connected',
|
'drive-connected',
|
||||||
'drive-disconnected',
|
'drive-disconnected',
|
||||||
'drive-changed',
|
'drive-changed'
|
||||||
];
|
];
|
||||||
|
|
||||||
this._volumeMonitorSignals = [];
|
this._volumeMonitorSignals = [];
|
||||||
@@ -330,10 +350,9 @@ var PlacesManager = class {
|
|||||||
|
|
||||||
let homePath = GLib.get_home_dir();
|
let homePath = GLib.get_home_dir();
|
||||||
|
|
||||||
this._places.special.push(new PlaceInfo(
|
this._places.special.push(new PlaceInfo('special',
|
||||||
'special',
|
Gio.File.new_for_path(homePath),
|
||||||
Gio.File.new_for_path(homePath),
|
_('Home')));
|
||||||
_('Home')));
|
|
||||||
|
|
||||||
let specials = [];
|
let specials = [];
|
||||||
let dirs = DEFAULT_DIRECTORIES.slice();
|
let dirs = DEFAULT_DIRECTORIES.slice();
|
||||||
@@ -343,7 +362,7 @@ var PlacesManager = class {
|
|||||||
|
|
||||||
for (let i = 0; i < dirs.length; i++) {
|
for (let i = 0; i < dirs.length; i++) {
|
||||||
let specialPath = GLib.get_user_special_dir(dirs[i]);
|
let specialPath = GLib.get_user_special_dir(dirs[i]);
|
||||||
if (!specialPath || specialPath === homePath)
|
if (specialPath == null || specialPath == homePath)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let file = Gio.File.new_for_path(specialPath), info;
|
let file = Gio.File.new_for_path(specialPath), info;
|
||||||
@@ -375,11 +394,10 @@ var PlacesManager = class {
|
|||||||
|
|
||||||
/* Add standard places */
|
/* Add standard places */
|
||||||
this._places.devices.push(new RootInfo());
|
this._places.devices.push(new RootInfo());
|
||||||
this._places.network.push(new PlaceInfo(
|
this._places.network.push(new PlaceInfo('network',
|
||||||
'network',
|
Gio.File.new_for_uri('network:///'),
|
||||||
Gio.File.new_for_uri('network:///'),
|
_('Browse Network'),
|
||||||
_('Browse Network'),
|
'network-workgroup-symbolic'));
|
||||||
'network-workgroup-symbolic'));
|
|
||||||
|
|
||||||
/* first go through all connected drives */
|
/* first go through all connected drives */
|
||||||
let drives = this._volumeMonitor.get_connected_drives();
|
let drives = this._volumeMonitor.get_connected_drives();
|
||||||
@@ -392,7 +410,7 @@ var PlacesManager = class {
|
|||||||
networkVolumes.push(volumes[j]);
|
networkVolumes.push(volumes[j]);
|
||||||
} else {
|
} else {
|
||||||
let mount = volumes[j].get_mount();
|
let mount = volumes[j].get_mount();
|
||||||
if (mount)
|
if (mount != null)
|
||||||
this._addMount('devices', mount);
|
this._addMount('devices', mount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -401,7 +419,7 @@ var PlacesManager = class {
|
|||||||
/* add all volumes that is not associated with a drive */
|
/* add all volumes that is not associated with a drive */
|
||||||
let volumes = this._volumeMonitor.get_volumes();
|
let volumes = this._volumeMonitor.get_volumes();
|
||||||
for (let i = 0; i < volumes.length; i++) {
|
for (let i = 0; i < volumes.length; i++) {
|
||||||
if (volumes[i].get_drive())
|
if (volumes[i].get_drive() != null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let identifier = volumes[i].get_identifier('class');
|
let identifier = volumes[i].get_identifier('class');
|
||||||
@@ -409,7 +427,7 @@ var PlacesManager = class {
|
|||||||
networkVolumes.push(volumes[i]);
|
networkVolumes.push(volumes[i]);
|
||||||
} else {
|
} else {
|
||||||
let mount = volumes[i].get_mount();
|
let mount = volumes[i].get_mount();
|
||||||
if (mount)
|
if (mount != null)
|
||||||
this._addMount('devices', mount);
|
this._addMount('devices', mount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -440,9 +458,9 @@ var PlacesManager = class {
|
|||||||
this._addVolume('network', networkVolumes[i]);
|
this._addVolume('network', networkVolumes[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < networkMounts.length; i++)
|
for (let i = 0; i < networkMounts.length; i++) {
|
||||||
this._addMount('network', networkMounts[i]);
|
this._addMount('network', networkMounts[i]);
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('devices-updated');
|
this.emit('devices-updated');
|
||||||
this.emit('network-updated');
|
this.emit('network-updated');
|
||||||
@@ -463,6 +481,7 @@ var PlacesManager = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_reloadBookmarks() {
|
_reloadBookmarks() {
|
||||||
|
|
||||||
this._bookmarks = [];
|
this._bookmarks = [];
|
||||||
|
|
||||||
let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path());
|
let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path());
|
||||||
@@ -472,7 +491,7 @@ var PlacesManager = class {
|
|||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
let line = lines[i];
|
let line = lines[i];
|
||||||
let components = line.split(' ');
|
let components = line.split(' ');
|
||||||
let [bookmark] = components;
|
let bookmark = components[0];
|
||||||
|
|
||||||
if (!bookmark)
|
if (!bookmark)
|
||||||
continue;
|
continue;
|
||||||
@@ -482,16 +501,16 @@ var PlacesManager = class {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
let duplicate = false;
|
let duplicate = false;
|
||||||
for (let j = 0; j < this._places.special.length; j++) {
|
for (let i = 0; i < this._places.special.length; i++) {
|
||||||
if (file.equal(this._places.special[j].file)) {
|
if (file.equal(this._places.special[i].file)) {
|
||||||
duplicate = true;
|
duplicate = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (duplicate)
|
if (duplicate)
|
||||||
continue;
|
continue;
|
||||||
for (let j = 0; j < bookmarks.length; j++) {
|
for (let i = 0; i < bookmarks.length; i++) {
|
||||||
if (file.equal(bookmarks[j].file)) {
|
if (file.equal(bookmarks[i].file)) {
|
||||||
duplicate = true;
|
duplicate = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1 @@
|
|||||||
.place-menu-item .button {
|
/* none used*/
|
||||||
border-radius: 99px;
|
|
||||||
padding: 3px;
|
|
||||||
min-height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.place-menu-item .button:ltr { margin-left: 6px; }
|
|
||||||
.place-menu-item .button:rtl { margin-right: 6px; }
|
|
||||||
|
|||||||
@@ -19,45 +19,42 @@
|
|||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const { Clutter, Meta, Shell, St } = imports.gi;
|
const { Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const Main = imports.ui.main;
|
|
||||||
|
|
||||||
const MESSAGE_FADE_TIME = 2000;
|
const MESSAGE_FADE_TIME = 2;
|
||||||
|
|
||||||
let text;
|
let text;
|
||||||
|
|
||||||
/** */
|
|
||||||
function hideMessage() {
|
function hideMessage() {
|
||||||
text.destroy();
|
text.destroy();
|
||||||
text = null;
|
text = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {string} message - the message to flash
|
|
||||||
*/
|
|
||||||
function flashMessage(message) {
|
function flashMessage(message) {
|
||||||
if (!text) {
|
if (!text) {
|
||||||
text = new St.Label({ style_class: 'screenshot-sizer-message' });
|
text = new St.Label({ style_class: 'screenshot-sizer-message' });
|
||||||
Main.uiGroup.add_actor(text);
|
Main.uiGroup.add_actor(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
text.remove_all_transitions();
|
Tweener.removeTweens(text);
|
||||||
text.text = message;
|
text.text = message;
|
||||||
|
|
||||||
text.opacity = 255;
|
text.opacity = 255;
|
||||||
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
text.set_position(
|
text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
|
||||||
monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
|
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
|
||||||
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
|
|
||||||
|
|
||||||
text.ease({
|
Tweener.addTween(text, {
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
duration: MESSAGE_FADE_TIME,
|
time: MESSAGE_FADE_TIME,
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
transition: 'easeOutQuad',
|
||||||
onComplete: hideMessage,
|
onComplete: hideMessage
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,24 +63,17 @@ let SIZES = [
|
|||||||
[800, 450],
|
[800, 450],
|
||||||
[1024, 576],
|
[1024, 576],
|
||||||
[1200, 675],
|
[1200, 675],
|
||||||
[1600, 900],
|
[1600, 900]
|
||||||
[360, 654], // Phone portrait maximized
|
|
||||||
[720, 360], // Phone landscape fullscreen
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Meta.Display} display - the display
|
|
||||||
* @param {Meta.Window=} window - for per-window bindings, the window
|
|
||||||
* @param {Meta.KeyBinding} binding - the key binding
|
|
||||||
*/
|
|
||||||
function cycleScreenshotSizes(display, window, binding) {
|
function cycleScreenshotSizes(display, window, binding) {
|
||||||
// Probably this isn't useful with 5 sizes, but you can decrease instead
|
// Probably this isn't useful with 5 sizes, but you can decrease instead
|
||||||
// of increase by holding down shift.
|
// of increase by holding down shift.
|
||||||
let modifiers = binding.get_modifiers();
|
let modifiers = binding.get_modifiers();
|
||||||
let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) !== 0;
|
let backwards = (modifiers & Meta.VirtualModifier.SHIFT_MASK) != 0;
|
||||||
|
|
||||||
// Unmaximize first
|
// Unmaximize first
|
||||||
if (window.get_maximized() !== 0)
|
if (window.get_maximized() != 0)
|
||||||
window.unmaximize(Meta.MaximizeFlags.BOTH);
|
window.unmaximize(Meta.MaximizeFlags.BOTH);
|
||||||
|
|
||||||
let workArea = window.get_work_area_current_monitor();
|
let workArea = window.get_work_area_current_monitor();
|
||||||
@@ -91,8 +81,7 @@ function cycleScreenshotSizes(display, window, binding) {
|
|||||||
|
|
||||||
// Double both axes if on a hidpi display
|
// Double both axes if on a hidpi display
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
let scaledSizes = SIZES.map(size => size.map(wh => wh * scaleFactor))
|
let scaledSizes = SIZES.map(size => size.map(wh => wh * scaleFactor));
|
||||||
.filter(([w, h]) => w <= workArea.width && h <= workArea.height);
|
|
||||||
|
|
||||||
// Find the nearest 16:9 size for the current window size
|
// Find the nearest 16:9 size for the current window size
|
||||||
let nearestIndex;
|
let nearestIndex;
|
||||||
@@ -107,7 +96,7 @@ function cycleScreenshotSizes(display, window, binding) {
|
|||||||
|
|
||||||
// get the best initial window size
|
// get the best initial window size
|
||||||
let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
|
let error = Math.abs(width - outerRect.width) + Math.abs(height - outerRect.height);
|
||||||
if (nearestIndex === undefined || error < nearestError) {
|
if (nearestIndex == null || error < nearestError) {
|
||||||
nearestIndex = i;
|
nearestIndex = i;
|
||||||
nearestError = error;
|
nearestError = error;
|
||||||
}
|
}
|
||||||
@@ -115,7 +104,10 @@ function cycleScreenshotSizes(display, window, binding) {
|
|||||||
|
|
||||||
// get the next size up or down from ideal
|
// get the next size up or down from ideal
|
||||||
let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
|
let newIndex = (nearestIndex + (backwards ? -1 : 1)) % scaledSizes.length;
|
||||||
let [newWidth, newHeight] = scaledSizes[newIndex];
|
let newWidth, newHeight;
|
||||||
|
[newWidth, newHeight] = scaledSizes[newIndex];
|
||||||
|
if (newWidth > workArea.width || newHeight > workArea.height)
|
||||||
|
[newWidth, newHeight] = scaledSizes[0];
|
||||||
|
|
||||||
// Push the window onscreen if it would be resized offscreen
|
// Push the window onscreen if it would be resized offscreen
|
||||||
let newX = outerRect.x;
|
let newX = outerRect.x;
|
||||||
@@ -129,36 +121,33 @@ function cycleScreenshotSizes(display, window, binding) {
|
|||||||
|
|
||||||
let newOuterRect = window.get_frame_rect();
|
let newOuterRect = window.get_frame_rect();
|
||||||
let message = '%d×%d'.format(
|
let message = '%d×%d'.format(
|
||||||
newOuterRect.width / scaleFactor,
|
(newOuterRect.width / scaleFactor),
|
||||||
newOuterRect.height / scaleFactor);
|
(newOuterRect.height / scaleFactor));
|
||||||
|
|
||||||
// The new size might have been constrained by geometry hints (e.g. for
|
// The new size might have been constrained by geometry hints (e.g. for
|
||||||
// a terminal) - in that case, include the actual ratio to the message
|
// a terminal) - in that case, include the actual ratio to the message
|
||||||
// we flash
|
// we flash
|
||||||
let actualNumerator = 9 * newOuterRect.width / newOuterRect.height;
|
let actualNumerator = (newOuterRect.width / newOuterRect.height) * 9;
|
||||||
if (Math.abs(actualNumerator - 16) > 0.01)
|
if (Math.abs(actualNumerator - 16) > 0.01)
|
||||||
message += ' (%.2f:9)'.format(actualNumerator);
|
message += ' (%.2f:9)'.format(actualNumerator);
|
||||||
|
|
||||||
flashMessage(message);
|
flashMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
Main.wm.addKeybinding(
|
Main.wm.addKeybinding('cycle-screenshot-sizes',
|
||||||
'cycle-screenshot-sizes',
|
ExtensionUtils.getSettings(),
|
||||||
ExtensionUtils.getSettings(),
|
Meta.KeyBindingFlags.PER_WINDOW,
|
||||||
Meta.KeyBindingFlags.PER_WINDOW,
|
Shell.ActionMode.NORMAL,
|
||||||
Shell.ActionMode.NORMAL,
|
cycleScreenshotSizes);
|
||||||
cycleScreenshotSizes);
|
Main.wm.addKeybinding('cycle-screenshot-sizes-backward',
|
||||||
Main.wm.addKeybinding(
|
ExtensionUtils.getSettings(),
|
||||||
'cycle-screenshot-sizes-backward',
|
Meta.KeyBindingFlags.PER_WINDOW |
|
||||||
ExtensionUtils.getSettings(),
|
Meta.KeyBindingFlags.IS_REVERSED,
|
||||||
Meta.KeyBindingFlags.PER_WINDOW | Meta.KeyBindingFlags.IS_REVERSED,
|
Shell.ActionMode.NORMAL,
|
||||||
Shell.ActionMode.NORMAL,
|
cycleScreenshotSizes);
|
||||||
cycleScreenshotSizes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
Main.wm.removeKeybinding('cycle-screenshot-sizes');
|
Main.wm.removeKeybinding('cycle-screenshot-sizes');
|
||||||
Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');
|
Main.wm.removeKeybinding('cycle-screenshot-sizes-backward');
|
||||||
|
|||||||
@@ -3,6 +3,5 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
|
|
||||||
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||||
|
|||||||
@@ -2,26 +2,28 @@
|
|||||||
// Load shell theme from ~/.local/share/themes/name/gnome-shell
|
// Load shell theme from ~/.local/share/themes/name/gnome-shell
|
||||||
/* exported init */
|
/* exported init */
|
||||||
|
|
||||||
const { Gio } = imports.gi;
|
const { Gio, GLib } = imports.gi;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Util = Me.imports.util;
|
|
||||||
|
|
||||||
const SETTINGS_KEY = 'name';
|
const SETTINGS_KEY = 'name';
|
||||||
|
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
class ThemeManager {
|
class ThemeManager {
|
||||||
enable() {
|
constructor() {
|
||||||
this._settings = ExtensionUtils.getSettings();
|
this._settings = ExtensionUtils.getSettings();
|
||||||
this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
|
}
|
||||||
|
|
||||||
|
enable() {
|
||||||
|
this._changedId = this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
|
||||||
this._changeTheme();
|
this._changeTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
disable() {
|
disable() {
|
||||||
this._settings?.run_dispose();
|
if (this._changedId) {
|
||||||
this._settings = null;
|
this._settings.disconnect(this._changedId);
|
||||||
|
this._changedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
Main.setThemeStylesheet(null);
|
Main.setThemeStylesheet(null);
|
||||||
Main.loadTheme();
|
Main.loadTheme();
|
||||||
@@ -32,11 +34,13 @@ class ThemeManager {
|
|||||||
let themeName = this._settings.get_string(SETTINGS_KEY);
|
let themeName = this._settings.get_string(SETTINGS_KEY);
|
||||||
|
|
||||||
if (themeName) {
|
if (themeName) {
|
||||||
const stylesheetPaths = Util.getThemeDirs()
|
let stylesheetPaths = [
|
||||||
.map(dir => `${dir}/${themeName}/gnome-shell/gnome-shell.css`);
|
[GLib.get_home_dir(), '.themes'],
|
||||||
|
[GLib.get_user_data_dir(), 'themes'],
|
||||||
stylesheetPaths.push(...Util.getModeThemeDirs()
|
...GLib.get_system_data_dirs().map(dir => [dir, 'themes'])
|
||||||
.map(dir => `${dir}/${themeName}.css`));
|
].map(themeDir => GLib.build_filenamev([
|
||||||
|
...themeDir, themeName, 'gnome-shell', 'gnome-shell.css'
|
||||||
|
]));
|
||||||
|
|
||||||
stylesheet = stylesheetPaths.find(path => {
|
stylesheet = stylesheetPaths.find(path => {
|
||||||
let file = Gio.file_new_for_path(path);
|
let file = Gio.file_new_for_path(path);
|
||||||
@@ -53,9 +57,6 @@ class ThemeManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {ThemeManager} - the extension state object
|
|
||||||
*/
|
|
||||||
function init() {
|
function init() {
|
||||||
return new ThemeManager();
|
return new ThemeManager();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,5 +4,4 @@ extension_data += configure_file(
|
|||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
|
|
||||||
extension_sources += files('prefs.js', 'util.js')
|
|
||||||
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||||
|
|||||||
@@ -1,137 +0,0 @@
|
|||||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
|
||||||
/* exported init buildPrefsWidget */
|
|
||||||
|
|
||||||
// we use async/await here to not block the mainloop, not to parallelize
|
|
||||||
/* eslint-disable no-await-in-loop */
|
|
||||||
|
|
||||||
const { Adw, Gio, GLib, GObject, Gtk } = imports.gi;
|
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
|
|
||||||
const Me = ExtensionUtils.getCurrentExtension();
|
|
||||||
const Util = Me.imports.util;
|
|
||||||
|
|
||||||
Gio._promisify(Gio.File.prototype, 'enumerate_children_async');
|
|
||||||
Gio._promisify(Gio.File.prototype, 'query_info_async');
|
|
||||||
Gio._promisify(Gio.FileEnumerator.prototype, 'next_files_async');
|
|
||||||
|
|
||||||
class UserThemePrefsWidget extends Adw.PreferencesGroup {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super({ title: 'Themes' });
|
|
||||||
|
|
||||||
this._actionGroup = new Gio.SimpleActionGroup();
|
|
||||||
this.insert_action_group('theme', this._actionGroup);
|
|
||||||
|
|
||||||
this._settings = ExtensionUtils.getSettings();
|
|
||||||
this._actionGroup.add_action(
|
|
||||||
this._settings.create_action('name'));
|
|
||||||
|
|
||||||
this.connect('destroy', () => this._settings.run_dispose());
|
|
||||||
|
|
||||||
this._rows = new Map();
|
|
||||||
this._addTheme(''); // default
|
|
||||||
|
|
||||||
this._collectThemes();
|
|
||||||
}
|
|
||||||
|
|
||||||
async _collectThemes() {
|
|
||||||
for (const dirName of Util.getThemeDirs()) {
|
|
||||||
const dir = Gio.File.new_for_path(dirName);
|
|
||||||
for (const name of await this._enumerateDir(dir)) {
|
|
||||||
if (this._rows.has(name))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const file = dir.resolve_relative_path(
|
|
||||||
`${name}/gnome-shell/gnome-shell.css`);
|
|
||||||
try {
|
|
||||||
await file.query_info_async(
|
|
||||||
Gio.FILE_ATTRIBUTE_STANDARD_NAME,
|
|
||||||
Gio.FileQueryInfoFlags.NONE,
|
|
||||||
GLib.PRIORITY_DEFAULT, null);
|
|
||||||
this._addTheme(name);
|
|
||||||
} catch (e) {
|
|
||||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
|
|
||||||
logError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const dirName of Util.getModeThemeDirs()) {
|
|
||||||
const dir = Gio.File.new_for_path(dirName);
|
|
||||||
for (const filename of await this._enumerateDir(dir)) {
|
|
||||||
if (!filename.endsWith('.css'))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const name = filename.slice(0, -4);
|
|
||||||
if (!this._rows.has(name))
|
|
||||||
this._addTheme(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_addTheme(name) {
|
|
||||||
const row = new ThemeRow(name);
|
|
||||||
this._rows.set(name, row);
|
|
||||||
|
|
||||||
this.add(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
async _enumerateDir(dir) {
|
|
||||||
const fileInfos = [];
|
|
||||||
let fileEnum;
|
|
||||||
|
|
||||||
try {
|
|
||||||
fileEnum = await dir.enumerate_children_async(
|
|
||||||
Gio.FILE_ATTRIBUTE_STANDARD_NAME,
|
|
||||||
Gio.FileQueryInfoFlags.NONE,
|
|
||||||
GLib.PRIORITY_DEFAULT, null);
|
|
||||||
} catch (e) {
|
|
||||||
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
|
|
||||||
logError(e);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
let infos;
|
|
||||||
do {
|
|
||||||
infos = await fileEnum.next_files_async(100,
|
|
||||||
GLib.PRIORITY_DEFAULT, null);
|
|
||||||
fileInfos.push(...infos);
|
|
||||||
} while (infos.length > 0);
|
|
||||||
|
|
||||||
return fileInfos.map(info => info.get_name());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ThemeRow extends Adw.ActionRow {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(name) {
|
|
||||||
const check = new Gtk.CheckButton({
|
|
||||||
action_name: 'theme.name',
|
|
||||||
action_target: new GLib.Variant('s', name),
|
|
||||||
});
|
|
||||||
|
|
||||||
super({
|
|
||||||
title: name || 'Default',
|
|
||||||
activatable_widget: check,
|
|
||||||
});
|
|
||||||
this.add_prefix(check);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {Gtk.Widget} - the prefs widget
|
|
||||||
*/
|
|
||||||
function buildPrefsWidget() {
|
|
||||||
return new UserThemePrefsWidget();
|
|
||||||
}
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
/* none used */
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/* exported getThemeDirs getModeThemeDirs */
|
|
||||||
const { GLib } = imports.gi;
|
|
||||||
|
|
||||||
const fn = (...args) => GLib.build_filenamev(args);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {string[]} - an ordered list of theme directories
|
|
||||||
*/
|
|
||||||
function getThemeDirs() {
|
|
||||||
return [
|
|
||||||
fn(GLib.get_home_dir(), '.themes'),
|
|
||||||
fn(GLib.get_user_data_dir(), 'themes'),
|
|
||||||
...GLib.get_system_data_dirs().map(dir => fn(dir, 'themes')),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {string[]} - an ordered list of mode theme directories
|
|
||||||
*/
|
|
||||||
function getModeThemeDirs() {
|
|
||||||
return GLib.get_system_data_dirs()
|
|
||||||
.map(dir => fn(dir, 'gnome-shell', 'theme'));
|
|
||||||
}
|
|
||||||
@@ -4,39 +4,36 @@
|
|||||||
border-top-width: 1px;
|
border-top-width: 1px;
|
||||||
border-bottom-width: 0px;
|
border-bottom-width: 0px;
|
||||||
height: 2.25em ;
|
height: 2.25em ;
|
||||||
padding: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button > StWidget {
|
.bottom-panel .window-button > StWidget {
|
||||||
|
background-gradient-drection: vertical;
|
||||||
|
background-color: #fff;
|
||||||
|
background-gradient-start: #fff;
|
||||||
|
background-gradient-end: #eee;
|
||||||
|
color: #000;
|
||||||
-st-natural-width: 18.7em;
|
-st-natural-width: 18.7em;
|
||||||
max-width: 18.75em;
|
max-width: 18.75em;
|
||||||
|
color: #2e3436;
|
||||||
|
background-color: #eee;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 3px 6px 1px;
|
||||||
|
box-shadow: inset -1px -1px 1px rgba(0,0,0,0.5);
|
||||||
|
text-shadow: 0 0 transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button:hover > StWidget,
|
.bottom-panel .window-button:hover > StWidget {
|
||||||
.bottom-panel .window-picker-toggle:hover > StWidget {
|
|
||||||
background-color: #f9f9f9;
|
background-color: #f9f9f9;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button:active > StWidget,
|
.bottom-panel .window-button:active > StWidget,
|
||||||
.bottom-panel .window-button:focus > StWidget {
|
.bottom-panel .window-button:focus > StWidget {
|
||||||
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
box-shadow: inset 1px 1px 2px rgba(0,0,0,0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button.focused > StWidget,
|
.bottom-panel .window-button.focused > StWidget {
|
||||||
.bottom-panel .window-picker-toggle:checked > StWidget {
|
background-color: #ddd;
|
||||||
background-color: #ccc;
|
box-shadow: inset 1px 1px 1px rgba(0,0,0,0.5);
|
||||||
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.bottom-panel .window-button.focused:hover > StWidget {
|
.bottom-panel .window-button.focused:hover > StWidget {
|
||||||
@@ -45,24 +42,5 @@
|
|||||||
|
|
||||||
.bottom-panel .window-button.minimized > StWidget {
|
.bottom-panel .window-button.minimized > StWidget {
|
||||||
color: #888;
|
color: #888;
|
||||||
box-shadow: none;
|
box-shadow: inset -1px -1px 1px rgba(0,0,0,0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* workspace switcher */
|
|
||||||
.window-list-workspace-indicator .workspace {
|
|
||||||
border: 2px solid #f6f5f4;
|
|
||||||
background-color: #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspace.active {
|
|
||||||
border-color: #888;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-window-preview {
|
|
||||||
background-color: #ededed;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-window-preview.active {
|
|
||||||
background-color: #f6f5f4;
|
|
||||||
}
|
|
||||||
|
|||||||
+477
-385
File diff suppressed because it is too large
Load Diff
@@ -3,9 +3,8 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
|
|
||||||
extension_sources += files('prefs.js', 'windowPicker.js', 'workspaceIndicator.js')
|
extension_sources += files('prefs.js')
|
||||||
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
extension_schemas += files(metadata_conf.get('gschemaname') + '.gschema.xml')
|
||||||
|
|
||||||
if classic_mode_enabled
|
if classic_mode_enabled
|
||||||
|
|||||||
@@ -15,13 +15,6 @@
|
|||||||
window list. Possible values are “never”, “auto” and “always”.
|
window list. Possible values are “never”, “auto” and “always”.
|
||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="display-all-workspaces" type="b">
|
|
||||||
<default>false</default>
|
|
||||||
<summary>Show windows from all workspaces</summary>
|
|
||||||
<description>
|
|
||||||
Whether to show windows from all workspaces or only the current one.
|
|
||||||
</description>
|
|
||||||
</key>
|
|
||||||
<key name="show-on-all-monitors" type="b">
|
<key name="show-on-all-monitors" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Show the window list on all monitors</summary>
|
<summary>Show the window list on all monitors</summary>
|
||||||
|
|||||||
@@ -1,92 +1,88 @@
|
|||||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||||
/* exported init buildPrefsWidget */
|
/* exported init buildPrefsWidget */
|
||||||
|
|
||||||
const { Adw, Gio, GLib, GObject, Gtk } = imports.gi;
|
const { Gio, GObject, Gtk } = imports.gi;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
class WindowListPrefsWidget extends Adw.PreferencesPage {
|
const WindowListPrefsWidget = GObject.registerClass(
|
||||||
static {
|
class WindowListPrefsWidget extends Gtk.Grid {
|
||||||
GObject.registerClass(this);
|
_init(params) {
|
||||||
}
|
super._init(params);
|
||||||
|
|
||||||
constructor() {
|
this.margin = 24;
|
||||||
super();
|
this.row_spacing = 6;
|
||||||
|
this.orientation = Gtk.Orientation.VERTICAL;
|
||||||
|
|
||||||
this._actionGroup = new Gio.SimpleActionGroup();
|
let groupingLabel = '<b>%s</b>'.format(_('Window Grouping'));
|
||||||
this.insert_action_group('window-list', this._actionGroup);
|
this.add(new Gtk.Label({
|
||||||
|
label: groupingLabel, use_markup: true,
|
||||||
|
halign: Gtk.Align.START
|
||||||
|
}));
|
||||||
|
|
||||||
|
let align = new Gtk.Alignment({ left_padding: 12 });
|
||||||
|
this.add(align);
|
||||||
|
|
||||||
|
let grid = new Gtk.Grid({
|
||||||
|
orientation: Gtk.Orientation.VERTICAL,
|
||||||
|
row_spacing: 6,
|
||||||
|
column_spacing: 6
|
||||||
|
});
|
||||||
|
align.add(grid);
|
||||||
|
|
||||||
this._settings = ExtensionUtils.getSettings();
|
this._settings = ExtensionUtils.getSettings();
|
||||||
this._actionGroup.add_action(
|
let currentMode = this._settings.get_string('grouping-mode');
|
||||||
this._settings.create_action('grouping-mode'));
|
let range = this._settings.get_range('grouping-mode');
|
||||||
this._actionGroup.add_action(
|
let modes = range.deep_unpack()[1].deep_unpack();
|
||||||
this._settings.create_action('show-on-all-monitors'));
|
|
||||||
this._actionGroup.add_action(
|
|
||||||
this._settings.create_action('display-all-workspaces'));
|
|
||||||
|
|
||||||
const groupingGroup = new Adw.PreferencesGroup({
|
let modeLabels = {
|
||||||
title: _('Window Grouping'),
|
'never': _('Never group windows'),
|
||||||
});
|
'auto': _('Group windows when space is limited'),
|
||||||
this.add(groupingGroup);
|
'always': _('Always group windows')
|
||||||
|
};
|
||||||
|
|
||||||
const modes = [
|
let radio = null;
|
||||||
{ mode: 'never', title: _('Never group windows') },
|
for (let i = 0; i < modes.length; i++) {
|
||||||
{ mode: 'auto', title: _('Group windows when space is limited') },
|
let mode = modes[i];
|
||||||
{ mode: 'always', title: _('Always group windows') },
|
let label = modeLabels[mode];
|
||||||
];
|
if (!label) {
|
||||||
|
log('Unhandled option "%s" for grouping-mode'.format(mode));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
for (const { mode, title } of modes) {
|
radio = new Gtk.RadioButton({
|
||||||
const check = new Gtk.CheckButton({
|
active: currentMode == mode,
|
||||||
action_name: 'window-list.grouping-mode',
|
label: label,
|
||||||
action_target: new GLib.Variant('s', mode),
|
group: radio
|
||||||
});
|
});
|
||||||
const row = new Adw.ActionRow({
|
grid.add(radio);
|
||||||
activatable_widget: check,
|
|
||||||
title,
|
radio.connect('toggled', button => {
|
||||||
|
if (button.active)
|
||||||
|
this._settings.set_string('grouping-mode', mode);
|
||||||
});
|
});
|
||||||
row.add_prefix(check);
|
|
||||||
groupingGroup.add(row);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const miscGroup = new Adw.PreferencesGroup();
|
let check = new Gtk.CheckButton({
|
||||||
this.add(miscGroup);
|
label: _('Show on all monitors'),
|
||||||
|
margin_top: 6
|
||||||
let toggle = new Gtk.Switch({
|
|
||||||
action_name: 'window-list.show-on-all-monitors',
|
|
||||||
valign: Gtk.Align.CENTER,
|
|
||||||
});
|
});
|
||||||
let row = new Adw.ActionRow({
|
this._settings.bind('show-on-all-monitors', check, 'active', Gio.SettingsBindFlags.DEFAULT);
|
||||||
title: _('Show on all monitors'),
|
this.add(check);
|
||||||
activatable_widget: toggle,
|
|
||||||
});
|
|
||||||
row.add_suffix(toggle);
|
|
||||||
miscGroup.add(row);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {Gtk.Widget} - the prefs widget
|
|
||||||
*/
|
|
||||||
function buildPrefsWidget() {
|
function buildPrefsWidget() {
|
||||||
return new WindowListPrefsWidget();
|
let widget = new WindowListPrefsWidget();
|
||||||
|
widget.show_all();
|
||||||
|
|
||||||
|
return widget;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
.bottom-panel {
|
||||||
|
/* .window-button-icon height +
|
||||||
|
.window-button vertical padding +
|
||||||
|
.window-button > StWidget vertical padding) */
|
||||||
|
height: 2.25em;
|
||||||
|
}
|
||||||
|
|
||||||
.window-list {
|
.window-list {
|
||||||
spacing: 2px;
|
spacing: 2px;
|
||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
@@ -19,31 +26,18 @@
|
|||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button > StWidget,
|
.window-button > StWidget {
|
||||||
.window-picker-toggle > StWidget {
|
-st-natural-width: 18.75em;
|
||||||
|
max-width: 18.75em;
|
||||||
color: #bbb;
|
color: #bbb;
|
||||||
background-color: black;
|
background-color: black;
|
||||||
border-radius: 2px;
|
border-radius: 4px;
|
||||||
padding: 3px 6px 1px;
|
padding: 3px 6px 1px;
|
||||||
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.5);
|
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.5);
|
||||||
text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
|
text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-picker-toggle {
|
.window-button:hover > StWidget {
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-picker-toggle > StWidet {
|
|
||||||
border: 1px solid rgba(255,255,255,0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-button > StWidget {
|
|
||||||
-st-natural-width: 18.75em;
|
|
||||||
max-width: 18.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-button:hover > StWidget,
|
|
||||||
.window-picker-toggle:hover > StWidget {
|
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #1f1f1f;
|
background-color: #1f1f1f;
|
||||||
}
|
}
|
||||||
@@ -53,14 +47,12 @@
|
|||||||
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5);
|
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button.focused > StWidget,
|
.window-button.focused > StWidget {
|
||||||
.window-picker-toggle:checked > StWidget {
|
|
||||||
color: white;
|
color: white;
|
||||||
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7);
|
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-button.focused:active > StWidget,
|
.window-button.focused:active > StWidget {
|
||||||
.window-picker-toggle:checked:active > StWidget {
|
|
||||||
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7);
|
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,36 +70,13 @@
|
|||||||
height: 24px;
|
height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-workspace-indicator .status-label-bin {
|
.window-list-workspace-indicator {
|
||||||
background-color: rgba(200, 200, 200, .3);
|
|
||||||
border: 1px solid #cccccc;
|
|
||||||
padding: 0 3px;
|
|
||||||
margin: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspaces-box {
|
|
||||||
spacing: 3px;
|
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspace {
|
.window-list-workspace-indicator > StWidget {
|
||||||
border: 2px solid #000;
|
background-color: rgba(200, 200, 200, .3);
|
||||||
width: 52px;
|
border: 1px solid #cccccc;
|
||||||
border-radius: 4px;
|
|
||||||
background-color: #595959;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-workspace-indicator .workspace.active {
|
|
||||||
border-color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-window-preview {
|
|
||||||
background-color: #bebebe;
|
|
||||||
border: 1px solid #828282;
|
|
||||||
}
|
|
||||||
|
|
||||||
.window-list-window-preview.active {
|
|
||||||
background-color: #d4d4d4;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification {
|
.notification {
|
||||||
|
|||||||
@@ -1,364 +0,0 @@
|
|||||||
/* exported WindowPicker, WindowPickerToggle */
|
|
||||||
const { Clutter, GObject, Shell, St } = imports.gi;
|
|
||||||
|
|
||||||
const Layout = imports.ui.layout;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const { WorkspacesDisplay } = imports.ui.workspacesView;
|
|
||||||
const Workspace = imports.ui.workspace;
|
|
||||||
|
|
||||||
const { VIGNETTE_BRIGHTNESS } = imports.ui.lightbox;
|
|
||||||
const {
|
|
||||||
SIDE_CONTROLS_ANIMATION_TIME,
|
|
||||||
OverviewAdjustment,
|
|
||||||
ControlsState,
|
|
||||||
} = imports.ui.overviewControls;
|
|
||||||
|
|
||||||
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._workspaceAdjustment = workspaceAdjustment;
|
|
||||||
this._workspaceAdjustment.actor = this;
|
|
||||||
|
|
||||||
this._nWorkspacesChangedId =
|
|
||||||
workspaceManager.connect('notify::n-workspaces',
|
|
||||||
this._updateAdjustment.bind(this));
|
|
||||||
|
|
||||||
this.add_constraint(
|
|
||||||
new Layout.MonitorConstraint({
|
|
||||||
primary: true,
|
|
||||||
work_area: true,
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
prepareToEnterOverview(...args) {
|
|
||||||
if (!this._scrollEventId) {
|
|
||||||
this._scrollEventId = Main.windowPicker.connect('scroll-event',
|
|
||||||
this._onScrollEvent.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
super.prepareToEnterOverview(...args);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_hide(...args) {
|
|
||||||
if (this._scrollEventId > 0)
|
|
||||||
Main.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(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
if (this._nWorkspacesChangedId)
|
|
||||||
global.workspace_manager.disconnect(this._nWorkspacesChangedId);
|
|
||||||
this._nWorkspacesChangedId = 0;
|
|
||||||
|
|
||||||
super._onDestroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyWorkspace extends Workspace.Workspace {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(...args) {
|
|
||||||
super(...args);
|
|
||||||
|
|
||||||
this._adjChangedId =
|
|
||||||
this._overviewAdjustment.connect('notify::value', () => {
|
|
||||||
const { value: progress } = this._overviewAdjustment;
|
|
||||||
const brightness = 1 - (1 - VIGNETTE_BRIGHTNESS) * progress;
|
|
||||||
for (const bg of this._background?._backgroundGroup ?? []) {
|
|
||||||
bg.content.set({
|
|
||||||
vignette: true,
|
|
||||||
brightness,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
super._onDestroy();
|
|
||||||
|
|
||||||
if (this._adjChangedId)
|
|
||||||
this._overviewAdjustment.disconnect(this._adjChangedId);
|
|
||||||
this._adjChangedId = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyWorkspaceBackground extends Workspace.WorkspaceBackground {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
_updateBorderRadius() {
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_allocate(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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var WindowPicker = 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._overlayKeyId = 0;
|
|
||||||
this._stageKeyPressId = 0;
|
|
||||||
|
|
||||||
this._adjustment = new OverviewAdjustment(this);
|
|
||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
this._overlayKeyId = global.display.connect('overlay-key', () => {
|
|
||||||
if (!this._visible)
|
|
||||||
this.open();
|
|
||||||
else
|
|
||||||
this.close();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_injectBackgroundShade() {
|
|
||||||
this._origWorkspace = Workspace.Workspace;
|
|
||||||
this._origWorkspaceBackground = Workspace.WorkspaceBackground;
|
|
||||||
|
|
||||||
Workspace.Workspace = MyWorkspace;
|
|
||||||
Workspace.WorkspaceBackground = MyWorkspaceBackground;
|
|
||||||
}
|
|
||||||
|
|
||||||
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() {
|
|
||||||
if (this._origWorkspace)
|
|
||||||
Workspace.Workspace = this._origWorkspace;
|
|
||||||
|
|
||||||
if (this._origWorkspaceBackground)
|
|
||||||
Workspace.WorkspaceBackground = this._origWorkspaceBackground;
|
|
||||||
|
|
||||||
if (this._monitorsChangedId)
|
|
||||||
Main.layoutManager.disconnect(this._monitorsChangedId);
|
|
||||||
this._monitorsChangedId = 0;
|
|
||||||
|
|
||||||
if (this._overlayKeyId)
|
|
||||||
global.display.disconnect(this._overlayKeyId);
|
|
||||||
this._overlayKeyId = 0;
|
|
||||||
|
|
||||||
if (this._stageKeyPressId)
|
|
||||||
global.stage.disconnect(this._stageKeyPressId);
|
|
||||||
this._stageKeyPressId = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var WindowPickerToggle = 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,
|
|
||||||
});
|
|
||||||
|
|
||||||
this.connect('notify::checked', () => {
|
|
||||||
if (this.checked)
|
|
||||||
Main.windowPicker.open();
|
|
||||||
else
|
|
||||||
Main.windowPicker.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
Main.windowPicker.connect('open-state-changed', () => {
|
|
||||||
this.checked = Main.windowPicker.visible;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,450 +0,0 @@
|
|||||||
/* exported WorkspaceIndicator */
|
|
||||||
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
|
|
||||||
|
|
||||||
const DND = imports.ui.dnd;
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
|
||||||
|
|
||||||
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.connect('destroy', this._onDestroy.bind(this));
|
|
||||||
|
|
||||||
this._sizeChangedId = this._window.connect('size-changed',
|
|
||||||
() => this.queue_relayout());
|
|
||||||
this._positionChangedId = this._window.connect('position-changed',
|
|
||||||
() => {
|
|
||||||
this._updateVisible();
|
|
||||||
this.queue_relayout();
|
|
||||||
});
|
|
||||||
this._minimizedChangedId = this._window.connect('notify::minimized',
|
|
||||||
this._updateVisible.bind(this));
|
|
||||||
|
|
||||||
this._focusChangedId = global.display.connect('notify::focus-window',
|
|
||||||
this._onFocusChanged.bind(this));
|
|
||||||
this._onFocusChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
// needed for DND
|
|
||||||
get metaWindow() {
|
|
||||||
return this._window;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
this._window.disconnect(this._sizeChangedId);
|
|
||||||
this._window.disconnect(this._positionChangedId);
|
|
||||||
this._window.disconnect(this._minimizedChangedId);
|
|
||||||
global.display.disconnect(this._focusChangedId);
|
|
||||||
}
|
|
||||||
|
|
||||||
_onFocusChanged() {
|
|
||||||
if (global.display.focus_window === this._window)
|
|
||||||
this.add_style_class_name('active');
|
|
||||||
else
|
|
||||||
this.remove_style_class_name('active');
|
|
||||||
}
|
|
||||||
|
|
||||||
_updateVisible() {
|
|
||||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
|
||||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
|
||||||
this.visible = this._window.get_frame_rect().overlap(workArea) &&
|
|
||||||
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._windowAddedId = this._workspace.connect('window-added',
|
|
||||||
(ws, window) => {
|
|
||||||
this._addWindow(window);
|
|
||||||
});
|
|
||||||
this._windowRemovedId = this._workspace.connect('window-removed',
|
|
||||||
(ws, window) => {
|
|
||||||
this._removeWindow(window);
|
|
||||||
});
|
|
||||||
this._restackedId = global.display.connect('restacked',
|
|
||||||
this._onRestacked.bind(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();
|
|
||||||
|
|
||||||
this._workspace.disconnect(this._windowAddedId);
|
|
||||||
this._workspace.disconnect(this._windowRemovedId);
|
|
||||||
global.display.disconnect(this._restackedId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var WorkspaceIndicator = class WorkspaceIndicator extends PanelMenu.Button {
|
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super(0.0, _('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 = [];
|
|
||||||
|
|
||||||
this._workspaceManagerSignals = [
|
|
||||||
workspaceManager.connect('notify::n-workspaces',
|
|
||||||
this._nWorkspacesChanged.bind(this)),
|
|
||||||
workspaceManager.connect_after('workspace-switched',
|
|
||||||
this._onWorkspaceSwitched.bind(this)),
|
|
||||||
workspaceManager.connect('notify::layout-rows',
|
|
||||||
this._updateThumbnailVisibility.bind(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._settingsChangedId = this._settings.connect(
|
|
||||||
'changed::workspace-names', this._updateMenuLabels.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
for (let i = 0; i < this._workspaceManagerSignals.length; i++)
|
|
||||||
global.workspace_manager.disconnect(this._workspaceManagerSignals[i]);
|
|
||||||
|
|
||||||
if (this._settingsChangedId) {
|
|
||||||
this._settings.disconnect(this._settingsChangedId);
|
|
||||||
this._settingsChangedId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
super._onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
_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);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,184 +1,144 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
/* exported init */
|
/* exported enable disable */
|
||||||
const { Clutter, Graphene, GObject, St } = imports.gi;
|
const { Clutter, St } = imports.gi;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const OverviewControls = imports.ui.overviewControls;
|
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
const WorkspacesView = imports.ui.workspacesView;
|
const WorkspacesView = imports.ui.workspacesView;
|
||||||
|
|
||||||
const WINDOW_SLOT = 4;
|
function injectToFunction(parent, name, func) {
|
||||||
|
let origin = parent[name];
|
||||||
class MyWorkspace extends Workspace.Workspace {
|
parent[name] = function() {
|
||||||
static {
|
let ret;
|
||||||
GObject.registerClass(this);
|
ret = origin.apply(this, arguments);
|
||||||
}
|
if (ret === undefined)
|
||||||
|
ret = func.apply(this, arguments);
|
||||||
constructor(...args) {
|
return ret;
|
||||||
super(...args);
|
};
|
||||||
|
return origin;
|
||||||
if (this.metaWorkspace && this.metaWorkspace.index() < 9) {
|
|
||||||
this._tip = new St.Label({
|
|
||||||
style_class: 'extension-windowsNavigator-window-tooltip',
|
|
||||||
visible: false,
|
|
||||||
});
|
|
||||||
this.add_actor(this._tip);
|
|
||||||
|
|
||||||
this.connect('notify::scale-x', () => {
|
|
||||||
this._tip.set_scale(1 / this.scale_x, 1 / this.scale_x);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._tip = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_allocate(box) {
|
|
||||||
super.vfunc_allocate(box);
|
|
||||||
|
|
||||||
if (this._tip)
|
|
||||||
this._tip.allocate_preferred_size(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
showTooltip() {
|
|
||||||
if (!this._tip)
|
|
||||||
return;
|
|
||||||
this._tip.text = (this.metaWorkspace.index() + 1).toString();
|
|
||||||
this._tip.show();
|
|
||||||
this.set_child_below_sibling(this._tip, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
hideTooltip() {
|
|
||||||
if (this._tip)
|
|
||||||
this._tip.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
getWindowWithTooltip(id) {
|
|
||||||
const { layoutManager } = this._container;
|
|
||||||
const slot = layoutManager._windowSlots[id - 1];
|
|
||||||
return slot ? slot[WINDOW_SLOT].metaWindow : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
showWindowsTooltips() {
|
|
||||||
const { layoutManager } = this._container;
|
|
||||||
for (let i = 0; i < layoutManager._windowSlots.length; i++) {
|
|
||||||
if (layoutManager._windowSlots[i])
|
|
||||||
layoutManager._windowSlots[i][WINDOW_SLOT].showTooltip(`${i + 1}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hideWindowsTooltips() {
|
|
||||||
const { layoutManager } = this._container;
|
|
||||||
for (let i in layoutManager._windowSlots) {
|
|
||||||
if (layoutManager._windowSlots[i])
|
|
||||||
layoutManager._windowSlots[i][WINDOW_SLOT].hideTooltip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// overriding _addWindowClone to apply the tooltip patch on the cloned
|
|
||||||
// windowPreview
|
|
||||||
_addWindowClone(metaWindow) {
|
|
||||||
const clone = super._addWindowClone(metaWindow);
|
|
||||||
|
|
||||||
// appling the tooltip patch
|
|
||||||
(function patchPreview() {
|
|
||||||
this._text = new St.Label({
|
|
||||||
style_class: 'extension-windowsNavigator-window-tooltip',
|
|
||||||
visible: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._text.add_constraint(new Clutter.BindConstraint({
|
|
||||||
source: this.windowContainer,
|
|
||||||
coordinate: Clutter.BindCoordinate.POSITION,
|
|
||||||
}));
|
|
||||||
this._text.add_constraint(new Clutter.AlignConstraint({
|
|
||||||
source: this.windowContainer,
|
|
||||||
align_axis: Clutter.AlignAxis.X_AXIS,
|
|
||||||
pivot_point: new Graphene.Point({ x: 0.5, y: -1 }),
|
|
||||||
factor: this._closeButtonSide === St.Side.LEFT ? 1 : 0,
|
|
||||||
}));
|
|
||||||
this._text.add_constraint(new Clutter.AlignConstraint({
|
|
||||||
source: this.windowContainer,
|
|
||||||
align_axis: Clutter.AlignAxis.Y_AXIS,
|
|
||||||
pivot_point: new Graphene.Point({ x: -1, y: 0.5 }),
|
|
||||||
factor: 0,
|
|
||||||
}));
|
|
||||||
|
|
||||||
this.add_child(this._text);
|
|
||||||
}).call(clone);
|
|
||||||
|
|
||||||
clone.showTooltip = function (text) {
|
|
||||||
this._text.set({ text });
|
|
||||||
this._text.show();
|
|
||||||
};
|
|
||||||
|
|
||||||
clone.hideTooltip = function () {
|
|
||||||
if (this._text && this._text.visible)
|
|
||||||
this._text.hide();
|
|
||||||
};
|
|
||||||
|
|
||||||
return clone;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyWorkspacesView extends WorkspacesView.WorkspacesView {
|
let winInjections, workspaceInjections, workViewInjections, createdActors, connectedSignals;
|
||||||
static {
|
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(...args) {
|
function resetState() {
|
||||||
super(...args);
|
winInjections = {};
|
||||||
|
workspaceInjections = {};
|
||||||
|
workViewInjections = {};
|
||||||
|
createdActors = [];
|
||||||
|
connectedSignals = [];
|
||||||
|
}
|
||||||
|
|
||||||
this._pickWorkspace = false;
|
function enable() {
|
||||||
this._pickWindow = false;
|
resetState();
|
||||||
this._keyPressEventId =
|
|
||||||
global.stage.connect('key-press-event', this._onKeyPress.bind(this));
|
|
||||||
this._keyReleaseEventId =
|
|
||||||
global.stage.connect('key-release-event', this._onKeyRelease.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
Workspace.WindowOverlay.prototype.showTooltip = function() {
|
||||||
super._onDestroy();
|
this._text.raise_top();
|
||||||
|
this._text.show();
|
||||||
|
this._text.text = (this._windowClone.slotId + 1).toString();
|
||||||
|
};
|
||||||
|
winInjections['showTooltip'] = undefined;
|
||||||
|
|
||||||
global.stage.disconnect(this._keyPressEventId);
|
Workspace.WindowOverlay.prototype.hideTooltip = function() {
|
||||||
global.stage.disconnect(this._keyReleaseEventId);
|
if (this._text && this._text.visible)
|
||||||
}
|
this._text.hide();
|
||||||
|
};
|
||||||
|
winInjections['hideTooltip'] = undefined;
|
||||||
|
|
||||||
_hideTooltips() {
|
Workspace.Workspace.prototype.showTooltip = function() {
|
||||||
if (global.stage.get_key_focus() === global.stage)
|
if (this._tip == null || this._actualGeometry == null)
|
||||||
|
return;
|
||||||
|
this._tip.text = (this.metaWorkspace.index() + 1).toString();
|
||||||
|
|
||||||
|
// Hand code this instead of using _getSpacingAndPadding
|
||||||
|
// because that fails on empty workspaces
|
||||||
|
let node = this.actor.get_theme_node();
|
||||||
|
let padding = {
|
||||||
|
left: node.get_padding(St.Side.LEFT),
|
||||||
|
top: node.get_padding(St.Side.TOP),
|
||||||
|
bottom: node.get_padding(St.Side.BOTTOM),
|
||||||
|
right: node.get_padding(St.Side.RIGHT),
|
||||||
|
};
|
||||||
|
|
||||||
|
let area = Workspace.padArea(this._actualGeometry, padding);
|
||||||
|
this._tip.x = area.x;
|
||||||
|
this._tip.y = area.y;
|
||||||
|
this._tip.show();
|
||||||
|
this._tip.raise_top();
|
||||||
|
};
|
||||||
|
workspaceInjections['showTooltip'] = undefined;
|
||||||
|
|
||||||
|
Workspace.Workspace.prototype.hideTooltip = function() {
|
||||||
|
if (this._tip == null)
|
||||||
|
return;
|
||||||
|
if (!this._tip.get_parent())
|
||||||
|
return;
|
||||||
|
this._tip.hide();
|
||||||
|
};
|
||||||
|
workspaceInjections['hideTooltip'] = undefined;
|
||||||
|
|
||||||
|
Workspace.Workspace.prototype.getWindowWithTooltip = function(id) {
|
||||||
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
|
if ((this._windows[i].slotId + 1) == id)
|
||||||
|
return this._windows[i].metaWindow;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
workspaceInjections['getWindowWithTooltip'] = undefined;
|
||||||
|
|
||||||
|
Workspace.Workspace.prototype.showWindowsTooltips = function() {
|
||||||
|
for (let i in this._windowOverlays) {
|
||||||
|
if (this._windowOverlays[i] != null)
|
||||||
|
this._windowOverlays[i].showTooltip();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
workspaceInjections['showWindowsTooltips'] = undefined;
|
||||||
|
|
||||||
|
Workspace.Workspace.prototype.hideWindowsTooltips = function() {
|
||||||
|
for (let i in this._windowOverlays) {
|
||||||
|
if (this._windowOverlays[i] != null)
|
||||||
|
this._windowOverlays[i].hideTooltip();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
workspaceInjections['hideWindowsTooltips'] = undefined;
|
||||||
|
|
||||||
|
WorkspacesView.WorkspacesView.prototype._hideTooltips = function() {
|
||||||
|
if (global.stage.get_key_focus() == global.stage)
|
||||||
global.stage.set_key_focus(this._prevFocusActor);
|
global.stage.set_key_focus(this._prevFocusActor);
|
||||||
this._pickWindow = false;
|
this._pickWindow = false;
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
this._workspaces[i].hideWindowsTooltips();
|
this._workspaces[i].hideWindowsTooltips();
|
||||||
}
|
};
|
||||||
|
workViewInjections['_hideTooltips'] = undefined;
|
||||||
|
|
||||||
_hideWorkspacesTooltips() {
|
WorkspacesView.WorkspacesView.prototype._hideWorkspacesTooltips = function() {
|
||||||
global.stage.set_key_focus(this._prevFocusActor);
|
global.stage.set_key_focus(this._prevFocusActor);
|
||||||
this._pickWorkspace = false;
|
this._pickWorkspace = false;
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
this._workspaces[i].hideTooltip();
|
this._workspaces[i].hideTooltip();
|
||||||
}
|
};
|
||||||
|
workViewInjections['_hideWorkspacesTooltips'] = undefined;
|
||||||
|
|
||||||
_onKeyRelease(s, o) {
|
WorkspacesView.WorkspacesView.prototype._onKeyRelease = function(s, o) {
|
||||||
if (this._pickWindow &&
|
if (this._pickWindow &&
|
||||||
(o.get_key_symbol() === Clutter.KEY_Alt_L ||
|
(o.get_key_symbol() == Clutter.KEY_Alt_L ||
|
||||||
o.get_key_symbol() === Clutter.KEY_Alt_R))
|
o.get_key_symbol() == Clutter.KEY_Alt_R))
|
||||||
this._hideTooltips();
|
this._hideTooltips();
|
||||||
if (this._pickWorkspace &&
|
if (this._pickWorkspace &&
|
||||||
(o.get_key_symbol() === Clutter.KEY_Control_L ||
|
(o.get_key_symbol() == Clutter.KEY_Control_L ||
|
||||||
o.get_key_symbol() === Clutter.KEY_Control_R))
|
o.get_key_symbol() == Clutter.KEY_Control_R))
|
||||||
this._hideWorkspacesTooltips();
|
this._hideWorkspacesTooltips();
|
||||||
}
|
};
|
||||||
|
workViewInjections['_onKeyRelease'] = undefined;
|
||||||
|
|
||||||
_onKeyPress(s, o) {
|
WorkspacesView.WorkspacesView.prototype._onKeyPress = function(s, o) {
|
||||||
const { ControlsState } = OverviewControls;
|
if (Main.overview.viewSelector._activePage != Main.overview.viewSelector._workspacesPage)
|
||||||
if (this._overviewAdjustment.value !== ControlsState.WINDOW_PICKER)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
if ((o.get_key_symbol() === Clutter.KEY_Alt_L ||
|
if ((o.get_key_symbol() == Clutter.KEY_Alt_L ||
|
||||||
o.get_key_symbol() === Clutter.KEY_Alt_R) &&
|
o.get_key_symbol() == Clutter.KEY_Alt_R)
|
||||||
!this._pickWorkspace) {
|
&& !this._pickWorkspace) {
|
||||||
this._prevFocusActor = global.stage.get_key_focus();
|
this._prevFocusActor = global.stage.get_key_focus();
|
||||||
global.stage.set_key_focus(null);
|
global.stage.set_key_focus(null);
|
||||||
this._active = workspaceManager.get_active_workspace_index();
|
this._active = workspaceManager.get_active_workspace_index();
|
||||||
@@ -186,9 +146,9 @@ class MyWorkspacesView extends WorkspacesView.WorkspacesView {
|
|||||||
this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
|
this._workspaces[workspaceManager.get_active_workspace_index()].showWindowsTooltips();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ((o.get_key_symbol() === Clutter.KEY_Control_L ||
|
if ((o.get_key_symbol() == Clutter.KEY_Control_L ||
|
||||||
o.get_key_symbol() === Clutter.KEY_Control_R) &&
|
o.get_key_symbol() == Clutter.KEY_Control_R)
|
||||||
!this._pickWindow) {
|
&& !this._pickWindow) {
|
||||||
this._prevFocusActor = global.stage.get_key_focus();
|
this._prevFocusActor = global.stage.get_key_focus();
|
||||||
global.stage.set_key_focus(null);
|
global.stage.set_key_focus(null);
|
||||||
this._pickWorkspace = true;
|
this._pickWorkspace = true;
|
||||||
@@ -197,17 +157,17 @@ class MyWorkspacesView extends WorkspacesView.WorkspacesView {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (global.stage.get_key_focus() !== global.stage)
|
if (global.stage.get_key_focus() != global.stage)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// ignore shift presses, they're required to get numerals in azerty keyboards
|
// ignore shift presses, they're required to get numerals in azerty keyboards
|
||||||
if ((this._pickWindow || this._pickWorkspace) &&
|
if ((this._pickWindow || this._pickWorkspace) &&
|
||||||
(o.get_key_symbol() === Clutter.KEY_Shift_L ||
|
(o.get_key_symbol() == Clutter.KEY_Shift_L ||
|
||||||
o.get_key_symbol() === Clutter.KEY_Shift_R))
|
o.get_key_symbol() == Clutter.KEY_Shift_R))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (this._pickWindow) {
|
if (this._pickWindow) {
|
||||||
if (this._active !== workspaceManager.get_active_workspace_index()) {
|
if (this._active != workspaceManager.get_active_workspace_index()) {
|
||||||
this._hideTooltips();
|
this._hideTooltips();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -248,29 +208,81 @@ class MyWorkspacesView extends WorkspacesView.WorkspacesView {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
};
|
||||||
|
workViewInjections['_onKeyPress'] = undefined;
|
||||||
|
|
||||||
|
winInjections['_init'] = injectToFunction(Workspace.WindowOverlay.prototype, '_init', function(windowClone, parentActor) {
|
||||||
|
this._id = null;
|
||||||
|
createdActors.push(this._text = new St.Label({ style_class: 'extension-windowsNavigator-window-tooltip' }));
|
||||||
|
this._text.hide();
|
||||||
|
parentActor.add_actor(this._text);
|
||||||
|
});
|
||||||
|
|
||||||
|
winInjections['relayout'] = injectToFunction(Workspace.WindowOverlay.prototype, 'relayout', function(_animate) {
|
||||||
|
let [cloneX, cloneY, cloneWidth_, cloneHeight_] = this._windowClone.slot;
|
||||||
|
|
||||||
|
let textX = cloneX - 2;
|
||||||
|
let textY = cloneY - 2;
|
||||||
|
this._text.set_position(Math.floor(textX) + 5, Math.floor(textY) + 5);
|
||||||
|
this._text.raise_top();
|
||||||
|
});
|
||||||
|
|
||||||
|
workspaceInjections['_init'] = injectToFunction(Workspace.Workspace.prototype, '_init', function(metaWorkspace) {
|
||||||
|
if (metaWorkspace && metaWorkspace.index() < 9) {
|
||||||
|
createdActors.push(this._tip = new St.Label({
|
||||||
|
style_class: 'extension-windowsNavigator-window-tooltip',
|
||||||
|
visible: false
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.actor.add_actor(this._tip);
|
||||||
|
let signalId = this.actor.connect('notify::scale-x', () => {
|
||||||
|
this._tip.set_scale(1 / this.actor.scale_x, 1 / this.actor.scale_x);
|
||||||
|
});
|
||||||
|
connectedSignals.push({ obj: this.actor, id: signalId });
|
||||||
|
} else
|
||||||
|
this._tip = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
workViewInjections['_init'] = injectToFunction(WorkspacesView.WorkspacesView.prototype, '_init', function(_width, _height, _x, _y, _workspaces) {
|
||||||
|
this._pickWorkspace = false;
|
||||||
|
this._pickWindow = false;
|
||||||
|
this._keyPressEventId =
|
||||||
|
global.stage.connect('key-press-event', this._onKeyPress.bind(this));
|
||||||
|
this._keyReleaseEventId =
|
||||||
|
global.stage.connect('key-release-event', this._onKeyRelease.bind(this));
|
||||||
|
connectedSignals.push({ obj: global.stage, id: this._keyPressEventId });
|
||||||
|
connectedSignals.push({ obj: global.stage, id: this._keyReleaseEventId });
|
||||||
|
});
|
||||||
|
|
||||||
|
workViewInjections['_onDestroy'] = injectToFunction(WorkspacesView.WorkspacesView.prototype, '_onDestroy', function() {
|
||||||
|
global.stage.disconnect(this._keyPressEventId);
|
||||||
|
global.stage.disconnect(this._keyReleaseEventId);
|
||||||
|
connectedSignals = [];
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
class Extension {
|
function removeInjection(object, injection, name) {
|
||||||
constructor() {
|
if (injection[name] === undefined)
|
||||||
this._origWorkspace = Workspace.Workspace;
|
delete object[name];
|
||||||
this._origWorkspacesView = WorkspacesView.WorkspacesView;
|
else
|
||||||
}
|
object[name] = injection[name];
|
||||||
|
|
||||||
enable() {
|
|
||||||
Workspace.Workspace = MyWorkspace;
|
|
||||||
WorkspacesView.WorkspacesView = MyWorkspacesView;
|
|
||||||
}
|
|
||||||
|
|
||||||
disable() {
|
|
||||||
Workspace.Workspace = this._origWorkspace;
|
|
||||||
WorkspacesView.WorkspacesView = this._origWorkspacesView;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
function disable() {
|
||||||
* @returns {Extension} - the extension's state object
|
let i;
|
||||||
*/
|
|
||||||
function init() {
|
for (i in workspaceInjections)
|
||||||
return new Extension();
|
removeInjection(Workspace.Workspace.prototype, workspaceInjections, i);
|
||||||
|
for (i in winInjections)
|
||||||
|
removeInjection(Workspace.WindowOverlay.prototype, winInjections, i);
|
||||||
|
for (i in workViewInjections)
|
||||||
|
removeInjection(WorkspacesView.WorkspacesView.prototype, workViewInjections, i);
|
||||||
|
|
||||||
|
for (i of connectedSignals)
|
||||||
|
i.obj.disconnect(i.id);
|
||||||
|
|
||||||
|
for (i of createdActors)
|
||||||
|
i.destroy();
|
||||||
|
|
||||||
|
resetState();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,3 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
|
|||||||
@@ -2,318 +2,56 @@
|
|||||||
/* exported init enable disable */
|
/* exported init enable disable */
|
||||||
|
|
||||||
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
|
const { Clutter, Gio, GObject, Meta, St } = imports.gi;
|
||||||
|
|
||||||
const DND = imports.ui.dnd;
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||||
const WORKSPACE_KEY = 'workspace-names';
|
const WORKSPACE_KEY = 'workspace-names';
|
||||||
|
|
||||||
const TOOLTIP_OFFSET = 6;
|
let WorkspaceIndicator = GObject.registerClass(
|
||||||
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.connect('destroy', this._onDestroy.bind(this));
|
|
||||||
|
|
||||||
this._sizeChangedId = this._window.connect('size-changed',
|
|
||||||
() => this.queue_relayout());
|
|
||||||
this._positionChangedId = this._window.connect('position-changed',
|
|
||||||
() => {
|
|
||||||
this._updateVisible();
|
|
||||||
this.queue_relayout();
|
|
||||||
});
|
|
||||||
this._minimizedChangedId = this._window.connect('notify::minimized',
|
|
||||||
this._updateVisible.bind(this));
|
|
||||||
|
|
||||||
this._focusChangedId = global.display.connect('notify::focus-window',
|
|
||||||
this._onFocusChanged.bind(this));
|
|
||||||
this._onFocusChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
// needed for DND
|
|
||||||
get metaWindow() {
|
|
||||||
return this._window;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onDestroy() {
|
|
||||||
this._window.disconnect(this._sizeChangedId);
|
|
||||||
this._window.disconnect(this._positionChangedId);
|
|
||||||
this._window.disconnect(this._minimizedChangedId);
|
|
||||||
global.display.disconnect(this._focusChangedId);
|
|
||||||
}
|
|
||||||
|
|
||||||
_onFocusChanged() {
|
|
||||||
if (global.display.focus_window === this._window)
|
|
||||||
this.add_style_class_name('active');
|
|
||||||
else
|
|
||||||
this.remove_style_class_name('active');
|
|
||||||
}
|
|
||||||
|
|
||||||
_updateVisible() {
|
|
||||||
const monitor = Main.layoutManager.findIndexForActor(this);
|
|
||||||
const workArea = Main.layoutManager.getWorkAreaForMonitor(monitor);
|
|
||||||
this.visible = this._window.get_frame_rect().overlap(workArea) &&
|
|
||||||
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._windowAddedId = this._workspace.connect('window-added',
|
|
||||||
(ws, window) => {
|
|
||||||
this._addWindow(window);
|
|
||||||
});
|
|
||||||
this._windowRemovedId = this._workspace.connect('window-removed',
|
|
||||||
(ws, window) => {
|
|
||||||
this._removeWindow(window);
|
|
||||||
});
|
|
||||||
this._restackedId = global.display.connect('restacked',
|
|
||||||
this._onRestacked.bind(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();
|
|
||||||
|
|
||||||
this._workspace.disconnect(this._windowAddedId);
|
|
||||||
this._workspace.disconnect(this._windowRemovedId);
|
|
||||||
global.display.disconnect(this._restackedId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class WorkspaceIndicator extends PanelMenu.Button {
|
class WorkspaceIndicator extends PanelMenu.Button {
|
||||||
static {
|
_init() {
|
||||||
GObject.registerClass(this);
|
super._init(0.0, _('Workspace Indicator'));
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super(0.0, _('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;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
this._currentWorkspace = workspaceManager.get_active_workspace().index();
|
||||||
this._statusLabel = new St.Label({
|
this.statusLabel = new St.Label({
|
||||||
style_class: 'panel-workspace-indicator',
|
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
text: this._labelText(),
|
text: this._labelText()
|
||||||
});
|
});
|
||||||
|
|
||||||
container.add_actor(this._statusLabel);
|
this.add_actor(this.statusLabel);
|
||||||
|
|
||||||
this._thumbnailsBox = new St.BoxLayout({
|
this.workspacesItems = [];
|
||||||
style_class: 'panel-workspace-indicator-box',
|
|
||||||
y_expand: true,
|
|
||||||
reactive: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
container.add_actor(this._thumbnailsBox);
|
|
||||||
|
|
||||||
this._workspacesItems = [];
|
|
||||||
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
this._workspaceSection = new PopupMenu.PopupMenuSection();
|
||||||
this.menu.addMenuItem(this._workspaceSection);
|
this.menu.addMenuItem(this._workspaceSection);
|
||||||
|
|
||||||
this._workspaceManagerSignals = [
|
this._workspaceManagerSignals = [];
|
||||||
workspaceManager.connect_after('notify::n-workspaces',
|
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-added',
|
||||||
this._nWorkspacesChanged.bind(this)),
|
this._createWorkspacesSection.bind(this)));
|
||||||
workspaceManager.connect_after('workspace-switched',
|
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-removed',
|
||||||
this._onWorkspaceSwitched.bind(this)),
|
this._createWorkspacesSection.bind(this)));
|
||||||
workspaceManager.connect('notify::layout-rows',
|
this._workspaceManagerSignals.push(workspaceManager.connect_after('workspace-switched',
|
||||||
this._updateThumbnailVisibility.bind(this)),
|
this._updateIndicator.bind(this)));
|
||||||
];
|
|
||||||
|
|
||||||
this.connect('scroll-event', this._onScrollEvent.bind(this));
|
this.connect('scroll-event', this._onScrollEvent.bind(this));
|
||||||
this._thumbnailsBox.connect('scroll-event', this._onScrollEvent.bind(this));
|
|
||||||
this._createWorkspacesSection();
|
this._createWorkspacesSection();
|
||||||
this._updateThumbnails();
|
|
||||||
this._updateThumbnailVisibility();
|
//styling
|
||||||
|
this.statusLabel.add_style_class_name('panel-workspace-indicator');
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA });
|
||||||
this._settingsChangedId = this._settings.connect(
|
this._settingsChangedId =
|
||||||
`changed::${WORKSPACE_KEY}`,
|
this._settings.connect(`changed::${WORKSPACE_KEY}`,
|
||||||
this._updateMenuLabels.bind(this));
|
this._createWorkspacesSection.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
@@ -325,114 +63,53 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
this._settingsChangedId = 0;
|
this._settingsChangedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Main.panel.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
|
||||||
|
|
||||||
super._onDestroy();
|
super._onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateThumbnailVisibility() {
|
_updateIndicator() {
|
||||||
const { workspaceManager } = global;
|
this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.NONE);
|
||||||
const vertical = workspaceManager.layout_rows === -1;
|
this._currentWorkspace = global.workspace_manager.get_active_workspace().index();
|
||||||
const useMenu =
|
this.workspacesItems[this._currentWorkspace].setOrnament(PopupMenu.Ornament.DOT);
|
||||||
vertical || workspaceManager.n_workspaces > MAX_THUMBNAILS;
|
|
||||||
this.reactive = useMenu;
|
|
||||||
|
|
||||||
this._statusLabel.visible = useMenu;
|
this.statusLabel.set_text(this._labelText());
|
||||||
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) {
|
_labelText(workspaceIndex) {
|
||||||
if (workspaceIndex === undefined) {
|
if (workspaceIndex == undefined) {
|
||||||
workspaceIndex = this._currentWorkspace;
|
workspaceIndex = this._currentWorkspace;
|
||||||
return (workspaceIndex + 1).toString();
|
return (workspaceIndex + 1).toString();
|
||||||
}
|
}
|
||||||
return Meta.prefs_get_workspace_name(workspaceIndex);
|
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() {
|
_createWorkspacesSection() {
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
this._workspaceSection.removeAll();
|
this._workspaceSection.removeAll();
|
||||||
this._workspacesItems = [];
|
this.workspacesItems = [];
|
||||||
this._currentWorkspace = workspaceManager.get_active_workspace_index();
|
this._currentWorkspace = workspaceManager.get_active_workspace().index();
|
||||||
|
|
||||||
let i = 0;
|
let i = 0;
|
||||||
for (; i < workspaceManager.n_workspaces; i++) {
|
for (; i < workspaceManager.n_workspaces; i++) {
|
||||||
this._workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
|
this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
|
||||||
this._workspaceSection.addMenuItem(this._workspacesItems[i]);
|
this._workspaceSection.addMenuItem(this.workspacesItems[i]);
|
||||||
this._workspacesItems[i].workspaceId = i;
|
this.workspacesItems[i].workspaceId = i;
|
||||||
this._workspacesItems[i].label_actor = this._statusLabel;
|
this.workspacesItems[i].label_actor = this.statusLabel;
|
||||||
this._workspacesItems[i].connect('activate', (actor, _event) => {
|
this.workspacesItems[i].connect('activate', (actor, _event) => {
|
||||||
this._activate(actor.workspaceId);
|
this._activate(actor.workspaceId);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (i === this._currentWorkspace)
|
if (i == this._currentWorkspace)
|
||||||
this._workspacesItems[i].setOrnament(PopupMenu.Ornament.DOT);
|
this.workspacesItems[i].setOrnament(PopupMenu.Ornament.DOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._statusLabel.set_text(this._labelText());
|
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) {
|
_activate(index) {
|
||||||
let workspaceManager = global.workspace_manager;
|
let workspaceManager = global.workspace_manager;
|
||||||
|
|
||||||
if (index >= 0 && index < workspaceManager.n_workspaces) {
|
if (index >= 0 && index < workspaceManager.n_workspaces) {
|
||||||
let metaWorkspace = workspaceManager.get_workspace_by_index(index);
|
let metaWorkspace = workspaceManager.get_workspace_by_index(index);
|
||||||
metaWorkspace.activate(global.get_current_time());
|
metaWorkspace.activate(global.get_current_time());
|
||||||
}
|
}
|
||||||
@@ -441,33 +118,30 @@ class WorkspaceIndicator extends PanelMenu.Button {
|
|||||||
_onScrollEvent(actor, event) {
|
_onScrollEvent(actor, event) {
|
||||||
let direction = event.get_scroll_direction();
|
let direction = event.get_scroll_direction();
|
||||||
let diff = 0;
|
let diff = 0;
|
||||||
if (direction === Clutter.ScrollDirection.DOWN)
|
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||||
diff = 1;
|
diff = 1;
|
||||||
else if (direction === Clutter.ScrollDirection.UP)
|
} else if (direction == Clutter.ScrollDirection.UP) {
|
||||||
diff = -1;
|
diff = -1;
|
||||||
else
|
} else {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let newIndex = global.workspace_manager.get_active_workspace().index() + diff;
|
||||||
let newIndex = global.workspace_manager.get_active_workspace_index() + diff;
|
|
||||||
this._activate(newIndex);
|
this._activate(newIndex);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
let _indicator;
|
let _indicator;
|
||||||
|
|
||||||
/** */
|
|
||||||
function enable() {
|
function enable() {
|
||||||
_indicator = new WorkspaceIndicator();
|
_indicator = new WorkspaceIndicator;
|
||||||
Main.panel.addToStatusArea('workspace-indicator', _indicator);
|
Main.panel.addToStatusArea('workspace-indicator', _indicator);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
|
||||||
function disable() {
|
function disable() {
|
||||||
_indicator.destroy();
|
_indicator.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,5 @@ extension_data += configure_file(
|
|||||||
output: metadata_name,
|
output: metadata_name,
|
||||||
configuration: metadata_conf
|
configuration: metadata_conf
|
||||||
)
|
)
|
||||||
extension_data += files('stylesheet.css')
|
|
||||||
|
|
||||||
extension_sources += files('prefs.js')
|
extension_sources += files('prefs.js')
|
||||||
|
|||||||
@@ -1,269 +1,212 @@
|
|||||||
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||||||
/* exported init buildPrefsWidget */
|
/* exported init buildPrefsWidget */
|
||||||
|
|
||||||
const { Adw, Gio, GLib, GObject, Gtk, Pango } = imports.gi;
|
const { Gio, GObject, Gtk } = imports.gi;
|
||||||
|
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell-extensions');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
const N_ = e => e;
|
||||||
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
|
|
||||||
const _ = ExtensionUtils.gettext;
|
|
||||||
const N_ = e => e;
|
|
||||||
|
|
||||||
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
|
||||||
const WORKSPACE_KEY = 'workspace-names';
|
const WORKSPACE_KEY = 'workspace-names';
|
||||||
|
|
||||||
class NewItem extends GObject.Object {}
|
const WorkspaceNameModel = GObject.registerClass(
|
||||||
GObject.registerClass(NewItem);
|
class WorkspaceNameModel extends Gtk.ListStore {
|
||||||
|
_init(params) {
|
||||||
|
super._init(params);
|
||||||
|
this.set_column_types([GObject.TYPE_STRING]);
|
||||||
|
|
||||||
class NewItemModel extends GObject.Object {
|
this.Columns = {
|
||||||
static [GObject.interfaces] = [Gio.ListModel];
|
LABEL: 0,
|
||||||
static {
|
};
|
||||||
GObject.registerClass(this);
|
|
||||||
|
this._settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA });
|
||||||
|
//this._settings.connect('changed::workspace-names', this._reloadFromSettings.bind(this));
|
||||||
|
|
||||||
|
this._reloadFromSettings();
|
||||||
|
|
||||||
|
// overriding class closure doesn't work, because GtkTreeModel
|
||||||
|
// plays tricks with marshallers and class closures
|
||||||
|
this.connect('row-changed', this._onRowChanged.bind(this));
|
||||||
|
this.connect('row-inserted', this._onRowInserted.bind(this));
|
||||||
|
this.connect('row-deleted', this._onRowDeleted.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
#item = new NewItem();
|
_reloadFromSettings() {
|
||||||
|
if (this._preventChanges)
|
||||||
|
return;
|
||||||
|
this._preventChanges = true;
|
||||||
|
|
||||||
vfunc_get_item_type() {
|
let newNames = this._settings.get_strv(WORKSPACE_KEY);
|
||||||
return NewItem;
|
|
||||||
|
let i = 0;
|
||||||
|
let [ok, iter] = this.get_iter_first();
|
||||||
|
while (ok && i < newNames.length) {
|
||||||
|
this.set(iter, [this.Columns.LABEL], [newNames[i]]);
|
||||||
|
|
||||||
|
ok = this.iter_next(iter);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ok)
|
||||||
|
ok = this.remove(iter);
|
||||||
|
|
||||||
|
for ( ; i < newNames.length; i++) {
|
||||||
|
iter = this.append();
|
||||||
|
this.set(iter, [this.Columns.LABEL], [newNames[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._preventChanges = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_n_items() {
|
_onRowChanged(self, path, iter) {
|
||||||
return 1;
|
if (this._preventChanges)
|
||||||
|
return;
|
||||||
|
this._preventChanges = true;
|
||||||
|
|
||||||
|
let index = path.get_indices()[0];
|
||||||
|
let names = this._settings.get_strv(WORKSPACE_KEY);
|
||||||
|
|
||||||
|
if (index >= names.length) {
|
||||||
|
// fill with blanks
|
||||||
|
for (let i = names.length; i <= index; i++)
|
||||||
|
names[i] = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
names[index] = this.get_value(iter, this.Columns.LABEL);
|
||||||
|
|
||||||
|
this._settings.set_strv(WORKSPACE_KEY, names);
|
||||||
|
|
||||||
|
this._preventChanges = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_get_item(_pos) {
|
_onRowInserted(self, path, iter) {
|
||||||
return this.#item;
|
if (this._preventChanges)
|
||||||
}
|
return;
|
||||||
}
|
this._preventChanges = true;
|
||||||
|
|
||||||
class WorkspacesList extends GObject.Object {
|
let index = path.get_indices()[0];
|
||||||
static [GObject.interfaces] = [Gio.ListModel];
|
let names = this._settings.get_strv(WORKSPACE_KEY);
|
||||||
static {
|
let label = this.get_value(iter, this.Columns.LABEL) || '';
|
||||||
GObject.registerClass(this);
|
names.splice(index, 0, label);
|
||||||
|
|
||||||
|
this._settings.set_strv(WORKSPACE_KEY, names);
|
||||||
|
|
||||||
|
this._preventChanges = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings = new Gio.Settings({ schema_id: WORKSPACE_SCHEMA });
|
_onRowDeleted(self, path) {
|
||||||
#names = this.#settings.get_strv(WORKSPACE_KEY);
|
if (this._preventChanges)
|
||||||
#items = Gtk.StringList.new(this.#names);
|
return;
|
||||||
#changedId;
|
this._preventChanges = true;
|
||||||
|
|
||||||
constructor() {
|
let index = path.get_indices()[0];
|
||||||
super();
|
let names = this._settings.get_strv(WORKSPACE_KEY);
|
||||||
|
|
||||||
this.#changedId =
|
if (index >= names.length)
|
||||||
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;
|
return;
|
||||||
|
|
||||||
this.#names.splice(pos, 1);
|
names.splice(index, 1);
|
||||||
|
|
||||||
this.#settings.block_signal_handler(this.#changedId);
|
// compact the array
|
||||||
this.#settings.set_strv(WORKSPACE_KEY, this.#names);
|
for (let i = names.length - 1; i >= 0 && !names[i]; i++)
|
||||||
this.#settings.unblock_signal_handler(this.#changedId);
|
names.pop();
|
||||||
|
|
||||||
this.#items.remove(pos);
|
this._settings.set_strv(WORKSPACE_KEY, names);
|
||||||
this.items_changed(pos, 1, 0);
|
|
||||||
|
this._preventChanges = false;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
rename(oldName, newName) {
|
const WorkspaceSettingsWidget = GObject.registerClass(
|
||||||
const pos = this.#names.indexOf(oldName);
|
class WorkspaceSettingsWidget extends Gtk.Grid {
|
||||||
if (pos < 0)
|
_init(params) {
|
||||||
return;
|
super._init(params);
|
||||||
|
this.margin = 12;
|
||||||
|
this.orientation = Gtk.Orientation.VERTICAL;
|
||||||
|
|
||||||
this.#names.splice(pos, 1, newName);
|
this.add(new Gtk.Label({
|
||||||
this.#items.splice(pos, 1, [newName]);
|
label: '<b>%s</b>'.format(_('Workspace Names')),
|
||||||
|
use_markup: true,
|
||||||
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_bottom: 6,
|
||||||
margin_start: 6,
|
|
||||||
margin_end: 6,
|
|
||||||
});
|
|
||||||
|
|
||||||
const label = new Gtk.Label({
|
|
||||||
hexpand: true,
|
hexpand: true,
|
||||||
xalign: 0,
|
halign: Gtk.Align.START
|
||||||
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();
|
let scrolled = new Gtk.ScrolledWindow({ shadow_type: Gtk.ShadowType.IN });
|
||||||
this._stack.add_named(box, 'display');
|
scrolled.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
this._stack.add_named(this._entry, 'edit');
|
this.add(scrolled);
|
||||||
this.child = this._stack;
|
|
||||||
|
|
||||||
this._entry.connect('activate', () => {
|
this._store = new WorkspaceNameModel();
|
||||||
this.activate_action('workspaces.rename',
|
this._treeView = new Gtk.TreeView({
|
||||||
new GLib.Variant('(ss)', [this.name, this._entry.text]));
|
model: this._store,
|
||||||
this.name = this._entry.text;
|
headers_visible: false,
|
||||||
this._stopEdit();
|
reorderable: true,
|
||||||
|
hexpand: true,
|
||||||
|
vexpand: true
|
||||||
});
|
});
|
||||||
this._entry.connect('notify::has-focus', () => {
|
|
||||||
if (this._entry.has_focus)
|
let column = new Gtk.TreeViewColumn({ title: _('Name') });
|
||||||
return;
|
let renderer = new Gtk.CellRendererText({ editable: true });
|
||||||
this._stopEdit();
|
renderer.connect('edited', this._cellEdited.bind(this));
|
||||||
|
column.pack_start(renderer, true);
|
||||||
|
column.add_attribute(renderer, 'text', this._store.Columns.LABEL);
|
||||||
|
this._treeView.append_column(column);
|
||||||
|
|
||||||
|
scrolled.add(this._treeView);
|
||||||
|
|
||||||
|
let toolbar = new Gtk.Toolbar({ icon_size: Gtk.IconSize.SMALL_TOOLBAR });
|
||||||
|
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
|
||||||
|
|
||||||
|
let newButton = new Gtk.ToolButton({ icon_name: 'list-add-symbolic' });
|
||||||
|
newButton.connect('clicked', this._newClicked.bind(this));
|
||||||
|
toolbar.add(newButton);
|
||||||
|
|
||||||
|
let delButton = new Gtk.ToolButton({ icon_name: 'list-remove-symbolic' });
|
||||||
|
delButton.connect('clicked', this._delClicked.bind(this));
|
||||||
|
toolbar.add(delButton);
|
||||||
|
|
||||||
|
let selection = this._treeView.get_selection();
|
||||||
|
selection.connect('changed', () => {
|
||||||
|
delButton.sensitive = selection.count_selected_rows() > 0;
|
||||||
});
|
});
|
||||||
|
delButton.sensitive = selection.count_selected_rows() > 0;
|
||||||
|
|
||||||
|
this.add(toolbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
edit() {
|
_cellEdited(renderer, path, newText) {
|
||||||
this._entry.text = this.name;
|
let [ok, iter] = this._store.get_iter_from_string(path);
|
||||||
this._entry.grab_focus();
|
|
||||||
this._stack.visible_child_name = 'edit';
|
if (ok)
|
||||||
|
this._store.set(iter, [this._store.Columns.LABEL], [newText]);
|
||||||
}
|
}
|
||||||
|
|
||||||
_stopEdit() {
|
_newClicked() {
|
||||||
this.grab_focus();
|
let iter = this._store.append();
|
||||||
this._stack.visible_child_name = 'display';
|
let index = this._store.get_path(iter).get_indices()[0];
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class NewWorkspaceRow extends Adw.PreferencesRow {
|
let label = _('Workspace %d').format(index + 1);
|
||||||
static {
|
this._store.set(iter, [this._store.Columns.LABEL], [label]);
|
||||||
GObject.registerClass(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor() {
|
_delClicked() {
|
||||||
super({
|
let [any, model_, iter] = this._treeView.get_selection().get_selected();
|
||||||
action_name: 'workspaces.add',
|
|
||||||
child: new Gtk.Image({
|
if (any)
|
||||||
icon_name: 'list-add-symbolic',
|
this._store.remove(iter);
|
||||||
pixel_size: 16,
|
}
|
||||||
margin_top: 12,
|
});
|
||||||
margin_bottom: 12,
|
|
||||||
margin_start: 12,
|
|
||||||
margin_end: 12,
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
this.update_property(
|
|
||||||
[Gtk.AccessibleProperty.LABEL], [_('Add Workspace')]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** */
|
|
||||||
function init() {
|
function init() {
|
||||||
ExtensionUtils.initTranslations();
|
ExtensionUtils.initTranslations();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {Gtk.Widget} - the prefs widget
|
|
||||||
*/
|
|
||||||
function buildPrefsWidget() {
|
function buildPrefsWidget() {
|
||||||
return new WorkspaceSettingsWidget();
|
let widget = new WorkspaceSettingsWidget();
|
||||||
|
widget.show_all();
|
||||||
|
|
||||||
|
return widget;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,5 @@
|
|||||||
.panel-workspace-indicator {
|
.panel-workspace-indicator {
|
||||||
padding: 0 8px;
|
padding: 0 8px;
|
||||||
}
|
background-color: rgba(200, 200, 200, .5);
|
||||||
|
border: 1px solid #cccccc;
|
||||||
.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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,10 +34,4 @@ and will be picked automatically at next login.
|
|||||||
<gnome:userid>fmuellner</gnome:userid>
|
<gnome:userid>fmuellner</gnome:userid>
|
||||||
</foaf:Person>
|
</foaf:Person>
|
||||||
</maintainer>
|
</maintainer>
|
||||||
<maintainer>
|
|
||||||
<foaf:Person>
|
|
||||||
<foaf:name>Marge Bot</foaf:name>
|
|
||||||
<gnome:userid>marge-bot</gnome:userid>
|
|
||||||
</foaf:Person>
|
|
||||||
</maintainer>
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"es6": true
|
||||||
|
},
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"rules": {
|
||||||
|
"array-bracket-newline": [
|
||||||
|
"error",
|
||||||
|
"consistent"
|
||||||
|
],
|
||||||
|
"array-bracket-spacing": [
|
||||||
|
"error",
|
||||||
|
"never"
|
||||||
|
],
|
||||||
|
"arrow-spacing": "error",
|
||||||
|
"brace-style": "error",
|
||||||
|
"comma-spacing": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"before": false,
|
||||||
|
"after": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"indent": [
|
||||||
|
"error",
|
||||||
|
4,
|
||||||
|
{
|
||||||
|
"ignoredNodes": [
|
||||||
|
"CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child"
|
||||||
|
],
|
||||||
|
"MemberExpression": "off"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"key-spacing": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"beforeColon": false,
|
||||||
|
"afterColon": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"keyword-spacing": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"before": true,
|
||||||
|
"after": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"linebreak-style": [
|
||||||
|
"error",
|
||||||
|
"unix"
|
||||||
|
],
|
||||||
|
"no-empty": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"allowEmptyCatch": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-implicit-coercion": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"allow": ["!!"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-restricted-properties": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"object": "Lang",
|
||||||
|
"property": "bind",
|
||||||
|
"message": "Use arrow notation or Function.prototype.bind()"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"object": "Lang",
|
||||||
|
"property": "Class",
|
||||||
|
"message": "Use ES6 classes"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nonblock-statement-body-position": [
|
||||||
|
"error",
|
||||||
|
"below"
|
||||||
|
],
|
||||||
|
"object-curly-newline": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"consistent": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"object-curly-spacing": "error",
|
||||||
|
"prefer-template": "error",
|
||||||
|
"quotes": [
|
||||||
|
"error",
|
||||||
|
"single",
|
||||||
|
{
|
||||||
|
"avoidEscape": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"semi": [
|
||||||
|
"error",
|
||||||
|
"always"
|
||||||
|
],
|
||||||
|
"semi-spacing": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"before": false,
|
||||||
|
"after": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"space-before-blocks": "error",
|
||||||
|
"space-infix-ops": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"int32Hint": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"ARGV": false,
|
||||||
|
"Debugger": false,
|
||||||
|
"GIRepositoryGType": false,
|
||||||
|
"imports": false,
|
||||||
|
"Intl": false,
|
||||||
|
"log": false,
|
||||||
|
"logError": false,
|
||||||
|
"print": false,
|
||||||
|
"printerr": false,
|
||||||
|
"window": false
|
||||||
|
},
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2017
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,270 +0,0 @@
|
|||||||
---
|
|
||||||
# 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/newline-after-description: error
|
|
||||||
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
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"indent": [
|
||||||
|
"error",
|
||||||
|
4,
|
||||||
|
{
|
||||||
|
"ignoredNodes": [
|
||||||
|
"CallExpression > ArrowFunctionExpression",
|
||||||
|
"CallExpression[callee.object.name=GObject][callee.property.name=registerClass] > ClassExpression:first-child"
|
||||||
|
],
|
||||||
|
"CallExpression": { "arguments": "first" },
|
||||||
|
"MemberExpression": "off"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"rules": {
|
||||||
|
"camelcase": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"properties": "never",
|
||||||
|
"allow": ["^vfunc_"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-unused-vars": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"argsIgnorePattern": "^_",
|
||||||
|
"varsIgnorePattern": "_$"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"object-curly-spacing": [
|
||||||
|
"error",
|
||||||
|
"always"
|
||||||
|
],
|
||||||
|
"prefer-arrow-callback": "error"
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"global": false,
|
||||||
|
"_": false,
|
||||||
|
"C_": false,
|
||||||
|
"N_": false,
|
||||||
|
"ngettext": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
rules:
|
|
||||||
camelcase:
|
|
||||||
- error
|
|
||||||
- properties: never
|
|
||||||
allow: [^vfunc_, ^on_]
|
|
||||||
object-curly-spacing:
|
|
||||||
- error
|
|
||||||
- always
|
|
||||||
prefer-arrow-callback: error
|
|
||||||
globals:
|
|
||||||
global: readonly
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SEP=`printf '\t'`
|
||||||
|
OUTPUT=/dev/stderr
|
||||||
|
CWD=`pwd`
|
||||||
|
SRCDIR=`dirname $0`
|
||||||
|
|
||||||
|
run_lint() {
|
||||||
|
eslint -f unix "$@" .
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_opts() {
|
||||||
|
tmp=`getopt -l output: o: "$@"`
|
||||||
|
[ $? -ne 0 ] && exit 1
|
||||||
|
|
||||||
|
eval set -- $tmp
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
case $1 in
|
||||||
|
--output|-o)
|
||||||
|
OUTPUT=`realpath $2`; shift 2; continue ;;
|
||||||
|
--)
|
||||||
|
shift; break ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# delete lines that don't start with '/',
|
||||||
|
# replace the first space with tab, sort
|
||||||
|
process_for_join() {
|
||||||
|
sed -E "/\//!d; s|(\S+)\s|\1$SEP|" | sort -k 1b,1
|
||||||
|
}
|
||||||
|
|
||||||
|
# re-replace tab with space
|
||||||
|
process_post_join() {
|
||||||
|
sed -E "s|$SEP| |"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_report() {
|
||||||
|
tmp1=`mktemp --tmpdir lint-XXXX`
|
||||||
|
run_lint | process_for_join > $tmp1
|
||||||
|
|
||||||
|
tmp2=`mktemp --tmpdir lint-XXXX`
|
||||||
|
run_lint -c lint/eslintrc-legacy.json | process_for_join > $tmp2
|
||||||
|
|
||||||
|
join -t"$SEP" -o '0,1.2' $tmp1 $tmp2 | process_post_join
|
||||||
|
rm $tmp1 $tmp2
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
parse_opts "$@"
|
||||||
|
|
||||||
|
cd $SRCDIR/..
|
||||||
|
|
||||||
|
create_report | tee $OUTPUT | grep -q .
|
||||||
|
rv=$(( $? == 0 ))
|
||||||
|
|
||||||
|
cd $CWD
|
||||||
|
|
||||||
|
[ $rv -eq 0 -a -f $OUTPUT ] && rm $OUTPUT
|
||||||
|
|
||||||
|
exit $rv
|
||||||
+10
-14
@@ -1,12 +1,11 @@
|
|||||||
project('gnome-shell-extensions',
|
project('gnome-shell-extensions',
|
||||||
version: '42.2',
|
version: '3.32.0',
|
||||||
meson_version: '>= 0.53.0',
|
meson_version: '>= 0.44.0',
|
||||||
license: 'GPL2+'
|
license: 'GPL2+'
|
||||||
)
|
)
|
||||||
|
|
||||||
gettext_domain = meson.project_name()
|
gettext_domain = meson.project_name()
|
||||||
|
|
||||||
fs = import('fs')
|
|
||||||
gnome = import('gnome')
|
gnome = import('gnome')
|
||||||
i18n = import('i18n')
|
i18n = import('i18n')
|
||||||
|
|
||||||
@@ -20,10 +19,15 @@ themedir = join_paths(shelldir, 'theme')
|
|||||||
schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
|
schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
|
||||||
sessiondir = join_paths(datadir, 'gnome-session', 'sessions')
|
sessiondir = join_paths(datadir, 'gnome-session', 'sessions')
|
||||||
xsessiondir = join_paths(datadir, 'xsessions')
|
xsessiondir = join_paths(datadir, 'xsessions')
|
||||||
wlsessiondir = join_paths(datadir, 'wayland-sessions')
|
|
||||||
|
js60 = find_program('js60', required: false)
|
||||||
|
|
||||||
ver_arr = meson.project_version().split('.')
|
ver_arr = meson.project_version().split('.')
|
||||||
shell_version = ver_arr[0]
|
if ver_arr[1].to_int().is_even()
|
||||||
|
shell_version = '@0@.@1@'.format(ver_arr[0], ver_arr[1])
|
||||||
|
else
|
||||||
|
shell_version = '.'.join(ver_arr)
|
||||||
|
endif
|
||||||
|
|
||||||
uuid_suffix = '@gnome-shell-extensions.gcampax.github.com'
|
uuid_suffix = '@gnome-shell-extensions.gcampax.github.com'
|
||||||
|
|
||||||
@@ -83,17 +87,9 @@ foreach e : enabled_extensions
|
|||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
if classic_mode_enabled
|
if classic_mode_enabled
|
||||||
|
sassc = find_program('sassc', required: true)
|
||||||
subdir('data')
|
subdir('data')
|
||||||
meson.add_install_script(
|
|
||||||
'meson/session-post-install.py',
|
|
||||||
join_paths(get_option('prefix'), datadir)
|
|
||||||
)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
subdir('extensions')
|
subdir('extensions')
|
||||||
subdir('po')
|
subdir('po')
|
||||||
|
|
||||||
meson.add_dist_script('meson/generate-stylesheets.py')
|
|
||||||
meson.add_dist_script('meson/check-version.py',
|
|
||||||
meson.project_version(),
|
|
||||||
'NEWS')
|
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os, sys
|
|
||||||
from pathlib import Path
|
|
||||||
import argparse, subprocess
|
|
||||||
|
|
||||||
def check_version(version, file, type='news'):
|
|
||||||
if type == 'news':
|
|
||||||
line = file.open().readline()
|
|
||||||
ok = line.startswith(version)
|
|
||||||
print("{}: {}".format(file, "OK" if ok else "FAILED"))
|
|
||||||
if not ok:
|
|
||||||
raise Exception("{} does not start with {}".format(file, version))
|
|
||||||
elif type == 'metainfo':
|
|
||||||
subprocess.run(['appstream-util', 'validate-version', file, version],
|
|
||||||
check=True)
|
|
||||||
else:
|
|
||||||
raise Exception('Not implemented')
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description='Check release version information.')
|
|
||||||
parser.add_argument('--type', choices=['metainfo','news'], default='news')
|
|
||||||
parser.add_argument('version', help='the version to check for')
|
|
||||||
parser.add_argument('files', nargs='+', help='files to check')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
distroot = os.environ.get('MESON_DIST_ROOT', './')
|
|
||||||
|
|
||||||
try:
|
|
||||||
for file in args.files:
|
|
||||||
check_version(args.version, Path(distroot, file), args.type)
|
|
||||||
except:
|
|
||||||
sys.exit(1)
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
from pathlib import PurePath
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
sourceroot = os.environ.get('MESON_SOURCE_ROOT')
|
|
||||||
distroot = os.environ.get('MESON_DIST_ROOT')
|
|
||||||
|
|
||||||
stylesheet_path = PurePath('data/gnome-classic.css')
|
|
||||||
src = PurePath(sourceroot, stylesheet_path.with_suffix('.scss'))
|
|
||||||
dst = PurePath(distroot, stylesheet_path)
|
|
||||||
subprocess.run(['sassc', '-a', src, dst], check=True)
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import sys
|
|
||||||
|
|
||||||
if os.environ.get('DESTDIR'):
|
|
||||||
install_root = os.environ.get('DESTDIR') + os.path.abspath(sys.argv[1])
|
|
||||||
else:
|
|
||||||
install_root = sys.argv[1]
|
|
||||||
|
|
||||||
# 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, 'wayland-sessions')
|
|
||||||
if not os.path.exists(dst_dir):
|
|
||||||
os.makedirs(dst_dir)
|
|
||||||
|
|
||||||
src = os.path.join(install_root, 'xsessions', 'gnome-classic.desktop')
|
|
||||||
dst = os.path.join(dst_dir, 'gnome-classic.desktop')
|
|
||||||
shutil.copyfile(src, dst)
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
ab
|
|
||||||
af
|
af
|
||||||
an
|
an
|
||||||
ar
|
ar
|
||||||
@@ -33,15 +32,12 @@ id
|
|||||||
is
|
is
|
||||||
it
|
it
|
||||||
ja
|
ja
|
||||||
ka
|
|
||||||
kab
|
|
||||||
kk
|
kk
|
||||||
km
|
km
|
||||||
kn
|
kn
|
||||||
ko
|
ko
|
||||||
lt
|
lt
|
||||||
lv
|
lv
|
||||||
mjw
|
|
||||||
ml
|
ml
|
||||||
mr
|
mr
|
||||||
ms
|
ms
|
||||||
|
|||||||
+2
-3
@@ -1,6 +1,5 @@
|
|||||||
data/gnome-classic.desktop.in
|
data/gnome-classic.desktop.in
|
||||||
data/gnome-classic-wayland.desktop.in
|
data/gnome-classic.session.desktop.in
|
||||||
data/gnome-classic-xorg.desktop.in
|
|
||||||
extensions/apps-menu/extension.js
|
extensions/apps-menu/extension.js
|
||||||
extensions/auto-move-windows/extension.js
|
extensions/auto-move-windows/extension.js
|
||||||
extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml
|
extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml
|
||||||
@@ -11,11 +10,11 @@ extensions/native-window-placement/org.gnome.shell.extensions.native-window-plac
|
|||||||
extensions/places-menu/extension.js
|
extensions/places-menu/extension.js
|
||||||
extensions/places-menu/placeDisplay.js
|
extensions/places-menu/placeDisplay.js
|
||||||
extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml
|
extensions/screenshot-window-sizer/org.gnome.shell.extensions.screenshot-window-sizer.gschema.xml
|
||||||
|
extensions/user-theme/extension.js
|
||||||
extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml
|
extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml
|
||||||
extensions/window-list/extension.js
|
extensions/window-list/extension.js
|
||||||
extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml
|
extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml
|
||||||
extensions/window-list/prefs.js
|
extensions/window-list/prefs.js
|
||||||
extensions/window-list/workspaceIndicator.js
|
|
||||||
extensions/windowsNavigator/extension.js
|
extensions/windowsNavigator/extension.js
|
||||||
extensions/workspace-indicator/extension.js
|
extensions/workspace-indicator/extension.js
|
||||||
extensions/workspace-indicator/prefs.js
|
extensions/workspace-indicator/prefs.js
|
||||||
|
|||||||
@@ -1,261 +0,0 @@
|
|||||||
# Abkhazian translation for gnome-shell-extensions.
|
|
||||||
# Copyright (C) 2022 gnome-shell-extensions's COPYRIGHT HOLDER
|
|
||||||
# This file is distributed under the same license as the gnome-shell-extensions package.
|
|
||||||
# Нанба Наала <naala-nanba@rambler.ru>, 2022.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: gnome-shell-extensions main\n"
|
|
||||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell-extensions/"
|
|
||||||
"issues\n"
|
|
||||||
"POT-Creation-Date: 2022-02-12 02:08+0000\n"
|
|
||||||
"PO-Revision-Date: 2022-02-12 02:08+0000\n"
|
|
||||||
"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>, 2022\n"
|
|
||||||
"Language-Team: Abkhazian <ab@li.org>\n"
|
|
||||||
"Language: ab\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
|
|
||||||
#: data/gnome-classic.desktop.in:3
|
|
||||||
msgid "GNOME Classic"
|
|
||||||
msgstr "Аклассикатә GNOME"
|
|
||||||
|
|
||||||
#: data/gnome-classic.desktop.in:4 data/gnome-classic-wayland.desktop.in:4
|
|
||||||
#: data/gnome-classic-xorg.desktop.in:4
|
|
||||||
msgid "This session logs you into GNOME Classic"
|
|
||||||
msgstr "Ари асеанс аклассикатә усуратә еишәа GNOME хархәагас иамоуп "
|
|
||||||
|
|
||||||
#: data/gnome-classic-wayland.desktop.in:3
|
|
||||||
msgid "GNOME Classic on Wayland"
|
|
||||||
msgstr "Аклассикатә GNOME Wayland аҟны"
|
|
||||||
|
|
||||||
#: data/gnome-classic-xorg.desktop.in:3
|
|
||||||
msgid "GNOME Classic on Xorg"
|
|
||||||
msgstr "Аклассикатә GNOME Xorg аҟны"
|
|
||||||
|
|
||||||
#: extensions/apps-menu/extension.js:112
|
|
||||||
msgid "Favorites"
|
|
||||||
msgstr "Иалкаау"
|
|
||||||
|
|
||||||
#: extensions/apps-menu/extension.js:370
|
|
||||||
msgid "Applications"
|
|
||||||
msgstr "Аԥшьқәа"
|
|
||||||
|
|
||||||
#: 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:7
|
|
||||||
msgid ""
|
|
||||||
"A list of strings, each containing an application id (desktop file name), "
|
|
||||||
"followed by a colon and the workspace number"
|
|
||||||
msgstr "Ацәаҳәақәа рыхьӡынҵа аиԥшрагәаҭага аԥшьы (desktop-фаил ахьӡ )"
|
|
||||||
"змоу, зашьҭахь ҩ-кәаԥки аусуратә ҭыԥ аномери гылоу "
|
|
||||||
|
|
||||||
#: extensions/auto-move-windows/prefs.js:19
|
|
||||||
msgid "Workspace Rules"
|
|
||||||
msgstr "Аусуратә ҵакыра аԥҟаррақәа"
|
|
||||||
|
|
||||||
#: 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:210
|
|
||||||
#, javascript-format
|
|
||||||
msgid "Ejecting drive “%s” failed:"
|
|
||||||
msgstr "Адиск «%s» аҭыгара залымшахеит:"
|
|
||||||
|
|
||||||
#: extensions/drive-menu/extension.js:139
|
|
||||||
msgid "Removable devices"
|
|
||||||
msgstr "Иаҿыҵуа аиҿартәырақәа"
|
|
||||||
|
|
||||||
#: extensions/drive-menu/extension.js:161
|
|
||||||
msgid "Open Files"
|
|
||||||
msgstr "Афаил аартра"
|
|
||||||
|
|
||||||
#: 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: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 "Шәхы иашәырхәа изыцҵоу аекран аҵакыра аминиатиура атыԥаркразы"
|
|
||||||
"аекран аганқәа реизышәара ԥсахуа аҭыԥыркра шәыржәпала, анаҩс адаԥа ҳәаақәызҵо ашәагаа архәыҷразы"
|
|
||||||
"ари ахышәара ахархәара аиуоит аминиатиура «natural» аҭыԥыркра алгоритм ахархәараан"
|
|
||||||
|
|
||||||
#: 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: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 "Иалхзар, ахқәа аминиатиура хыхьтәи ахәҭаҟны аҭыԥ ааныркылалоит"
|
|
||||||
"(ишыҟоу еиԥш ахқәа ҵаҟатәи аҭыԥ ааныркылоит).Ари ахышәара аԥсахраан,"
|
|
||||||
"уи аус аура иалагарцазы, иаҭахуп Shell аиҭарура."
|
|
||||||
|
|
||||||
#: extensions/places-menu/extension.js:88
|
|
||||||
#: extensions/places-menu/extension.js:91
|
|
||||||
msgid "Places"
|
|
||||||
msgstr "Аҭыԥқәа"
|
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:49
|
|
||||||
#, javascript-format
|
|
||||||
msgid "Failed to launch “%s”"
|
|
||||||
msgstr " «%s» аус арура залшом"
|
|
||||||
|
|
||||||
#: extensions/places-menu/placeDisplay.js:64
|
|
||||||
#, javascript-format
|
|
||||||
msgid "Failed to mount volume for “%s”"
|
|
||||||
msgstr "Иамоуӡит атом аибыҭара «%s» азы"
|
|
||||||
|
|
||||||
#: 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:381
|
|
||||||
msgid "Browse Network"
|
|
||||||
msgstr "Аҳа алаԥшхагара"
|
|
||||||
|
|
||||||
#: 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:11
|
|
||||||
msgid "Cycle Screenshot Sizes Backward"
|
|
||||||
msgstr "Аекран аҭыхымҭа ашәагаақәа шьҭахьҟатәи ахырхарҭала рыԥсахра"
|
|
||||||
|
|
||||||
#: 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: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:72
|
|
||||||
msgid "Close"
|
|
||||||
msgstr "Аркра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:92
|
|
||||||
msgid "Unminimize"
|
|
||||||
msgstr "Архынҳәра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:92
|
|
||||||
msgid "Minimize"
|
|
||||||
msgstr "Аиҟәырҳәра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:99
|
|
||||||
msgid "Unmaximize"
|
|
||||||
msgstr "Аиҭашьақәыргылара"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:99
|
|
||||||
msgid "Maximize"
|
|
||||||
msgstr "Аиҵыхра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:434
|
|
||||||
msgid "Minimize all"
|
|
||||||
msgstr "Зегьы реиҟәырҳәра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:440
|
|
||||||
msgid "Unminimize all"
|
|
||||||
msgstr "Зегьы рырхынҳәра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:446
|
|
||||||
msgid "Maximize all"
|
|
||||||
msgstr "Зегьы реиҵыхра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:454
|
|
||||||
msgid "Unmaximize all"
|
|
||||||
msgstr "Зегьы реиҭашьақәыргылара"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:462
|
|
||||||
msgid "Close all"
|
|
||||||
msgstr "Зегьы рыркра"
|
|
||||||
|
|
||||||
#: extensions/window-list/extension.js:741
|
|
||||||
msgid "Window List"
|
|
||||||
msgstr "Аԥенџьырқәа рыхьӡынҵа"
|
|
||||||
|
|
||||||
#: 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: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» — есқьынгьы"
|
|
||||||
|
|
||||||
#: 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: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:27
|
|
||||||
msgid "Show the window list on all monitors"
|
|
||||||
msgstr "Аԥенџьырқәа рыхьӡынҵа амониторқәа зегьы рҟны рырбара"
|
|
||||||
|
|
||||||
#: 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/prefs.js:32
|
|
||||||
msgid "Window Grouping"
|
|
||||||
msgstr "Аԥенџьырқәа реидыргәыԥлара"
|
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:37
|
|
||||||
msgid "Never group windows"
|
|
||||||
msgstr "Ахаангьы аԥенџьырқәа реидмыргәыԥлара"
|
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:38
|
|
||||||
msgid "Group windows when space is limited"
|
|
||||||
msgstr "Аҭыԥ маҷхазар, аԥенџьырқәа еидшәыргәыԥла"
|
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:39
|
|
||||||
msgid "Always group windows"
|
|
||||||
msgstr "Еснагь аԥенџьырқәа реидыргәыԥлара"
|
|
||||||
|
|
||||||
#: extensions/window-list/prefs.js:63
|
|
||||||
msgid "Show on all monitors"
|
|
||||||
msgstr "Амониторқәа зегьы рҟны рырбара"
|
|
||||||
|
|
||||||
#: extensions/window-list/workspaceIndicator.js:249
|
|
||||||
#: extensions/workspace-indicator/extension.js:254
|
|
||||||
msgid "Workspace Indicator"
|
|
||||||
msgstr "Аусуратә ҵакыра аиндикатор"
|
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:18
|
|
||||||
msgid "Workspace Names"
|
|
||||||
msgstr "Аусуратә ҵакырақәа рыхьӡқәа"
|
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:39
|
|
||||||
#, javascript-format
|
|
||||||
msgid "Workspace %d"
|
|
||||||
msgstr "Аусуратә ҵакыра %d"
|
|
||||||
|
|
||||||
#: extensions/workspace-indicator/prefs.js:184
|
|
||||||
msgid "Add Workspace"
|
|
||||||
msgstr "Аусуратә ҵакыра ацҵара"
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user