Compare commits
139 Commits
wip/carlos
...
drop-porta
Author | SHA1 | Date | |
---|---|---|---|
b0362945f4 | |||
1fb955b8da | |||
0e3a2654d4 | |||
ef4009f17d | |||
31a2758606 | |||
f7153ed340 | |||
02e885b3a4 | |||
012dde3de9 | |||
b3db8fc73f | |||
aae3789142 | |||
184f980c18 | |||
11283339b6 | |||
765895fb19 | |||
a68762980f | |||
c565186ea8 | |||
efd6be60e3 | |||
84250bbf88 | |||
79ccf1a0b5 | |||
b3770fd923 | |||
f0e04e7892 | |||
889863f353 | |||
9726aba257 | |||
c4646c15e9 | |||
5195f6f92e | |||
7ed39f7905 | |||
ebf6e75b5e | |||
b0ca52ffdc | |||
fbfa22f964 | |||
260cce9d92 | |||
dcf7ba3bc7 | |||
2ae8606e5e | |||
9719b13cf8 | |||
d27638e37e | |||
e4cb1a8f4b | |||
2fc84e0fe3 | |||
845c52797b | |||
48f1c4b9d7 | |||
5d99bdbe5e | |||
929c2c3921 | |||
914c6e48b1 | |||
259c44395f | |||
5de713b262 | |||
882f6d9a72 | |||
aac01f1c9e | |||
8b15519160 | |||
69a5e89096 | |||
e784afe9ac | |||
8b8d3e28b2 | |||
9b673dc98b | |||
c0fcf2d3a8 | |||
3b46c3910c | |||
76961927d5 | |||
8064f4498e | |||
b21c8c1290 | |||
4c6a0678ff | |||
a8dcfa4656 | |||
3e6bcbb486 | |||
a11f417cd0 | |||
a0c0e52229 | |||
1f2116eaf8 | |||
ceda02f2da | |||
0df3b47366 | |||
e169e5a30a | |||
0d9dcd4e0a | |||
6233d87e5b | |||
57751a2bef | |||
f93e4d7424 | |||
3582133e29 | |||
39b206d862 | |||
29a561c0b1 | |||
276f912c45 | |||
46878d69f3 | |||
7c0b6c8413 | |||
5e1def2642 | |||
e30144a0dc | |||
e9d484f77f | |||
f2e9757862 | |||
d713d78745 | |||
fb3e5a4495 | |||
79a837b87a | |||
d50e06dcce | |||
891f2201c5 | |||
9ea745bcd4 | |||
eb2ebd2bf9 | |||
1ef4d85b50 | |||
fc7bcf4761 | |||
08ebfa1acf | |||
944b835fa9 | |||
9c1940ef9d | |||
f55ff01239 | |||
8f4414de97 | |||
24e631ffe2 | |||
248eb7419e | |||
49f32d2a43 | |||
b0753f78cc | |||
dfb9270a2c | |||
dd2e560255 | |||
d0507ec69f | |||
27b927448b | |||
2d4941f432 | |||
45fe925a1b | |||
9dc85d76d9 | |||
10818c74a6 | |||
460cf9df30 | |||
42af514c51 | |||
3244c280d8 | |||
e07a5749b7 | |||
a8f44be5c1 | |||
8f8892aa20 | |||
45a8b92d84 | |||
6b4017fbb6 | |||
28d42628d1 | |||
c1d738d60c | |||
c2609227ff | |||
f5f9bd2e5e | |||
15d74c9cd4 | |||
3c87ad5aab | |||
9db62236da | |||
93fa1034f5 | |||
35494f5d08 | |||
4f66b301e7 | |||
d1f87ca115 | |||
fe106358f5 | |||
1c3ad0f1cf | |||
89b3104f8f | |||
624cf1dad4 | |||
4e9154ca64 | |||
51518d4d96 | |||
26dc2a439d | |||
bfd5fc3f24 | |||
60721a7c23 | |||
df230989b1 | |||
474dda7ffe | |||
1d54f1e6ab | |||
a1238a0ea4 | |||
684b918915 | |||
b166de08dc | |||
281c87d11b | |||
14eeaf4a2a |
2
.gitignore
vendored
@ -21,6 +21,8 @@ data/org.gnome.shell.gschema.valid
|
|||||||
data/org.gnome.Shell.PortalHelper.desktop
|
data/org.gnome.Shell.PortalHelper.desktop
|
||||||
data/org.gnome.Shell.PortalHelper.service
|
data/org.gnome.Shell.PortalHelper.service
|
||||||
data/theme/.sass-cache
|
data/theme/.sass-cache
|
||||||
|
data/theme/gnome-shell*.css.map
|
||||||
|
data/theme/gnome-shell*.css
|
||||||
docs/reference/*/*.args
|
docs/reference/*/*.args
|
||||||
docs/reference/*/*.bak
|
docs/reference/*/*.bak
|
||||||
docs/reference/*/*.hierarchy
|
docs/reference/*/*.hierarchy
|
||||||
|
55
.gitlab/issue_templates/Bug.md
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<!--
|
||||||
|
Please read https://wiki.gnome.org/Community/GettingInTouch/BugReportingGuidelines
|
||||||
|
first to ensure that you create a clear and specific issue.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Affected version
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Provide at least the following information:
|
||||||
|
* Your OS and version
|
||||||
|
* Affected GNOME Shell version
|
||||||
|
* Does this issue appear in XOrg and/or Wayland
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Bug summary
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Provide a short summary of the bug you encountered.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Steps to reproduce
|
||||||
|
|
||||||
|
<!--
|
||||||
|
1. Step one
|
||||||
|
2. Step two
|
||||||
|
3. ...
|
||||||
|
-->
|
||||||
|
|
||||||
|
### What happened
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What did GNOME Shell do that was unexpected?
|
||||||
|
-->
|
||||||
|
|
||||||
|
### What did you expect to happen
|
||||||
|
|
||||||
|
<!--
|
||||||
|
What did you expect GNOME Shell to do?
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Relevant logs, screenshots, screencasts etc.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If you have further information, such as technical documentation, logs,
|
||||||
|
screenshots or screencasts related, please provide them here.
|
||||||
|
|
||||||
|
If the bug is a crash, please obtain a stack trace with installed debug
|
||||||
|
symbols (at least for GNOME Shell and Mutter) and attach it to
|
||||||
|
this issue following the instructions on
|
||||||
|
https://wiki.gnome.org/Community/GettingInTouch/Bugzilla/GettingTraces.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not remove the following line. -->
|
||||||
|
/label ~"1. Bug"
|
30
.gitlab/issue_templates/Feature.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<!--
|
||||||
|
Please read https://wiki.gnome.org/Community/GettingInTouch/BugReportingGuidelines
|
||||||
|
first to ensure that you create a clear and specific issue.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Feature summary
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Describe what you would like to be able to do with GNOME Shell
|
||||||
|
that you currently cannot do.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### How would you like it to work
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If you can think of a way GNOME Shell might be able to do this,
|
||||||
|
let us know here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
### Relevant links, screenshots, screencasts etc.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If you have further information, such as technical documentation,
|
||||||
|
code, mockups or a similar feature in another desktop environments,
|
||||||
|
please provide them here.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Do not remove the following line. -->
|
||||||
|
/label ~"1. Feature"
|
@ -29,9 +29,8 @@ what to do.
|
|||||||
bar = do_thing(b);
|
bar = do_thing(b);
|
||||||
|
|
||||||
if (var == 5) {
|
if (var == 5) {
|
||||||
for (let i = 0; i < 10; i++) {
|
for (let i = 0; i < 10; i++)
|
||||||
print(i);
|
print(i);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
print(20);
|
print(20);
|
||||||
}
|
}
|
||||||
@ -102,9 +101,8 @@ under the imports:
|
|||||||
Always use either `const` or `let` when defining a variable.
|
Always use either `const` or `let` when defining a variable.
|
||||||
```javascript
|
```javascript
|
||||||
// Iterating over an array
|
// Iterating over an array
|
||||||
for (let i = 0; i < arr.length; ++i) {
|
for (let i = 0; i < arr.length; ++i)
|
||||||
let item = arr[i];
|
let item = arr[i];
|
||||||
}
|
|
||||||
|
|
||||||
// Iterating over an object's properties
|
// Iterating over an object's properties
|
||||||
for (let prop in someobj) {
|
for (let prop in someobj) {
|
||||||
@ -252,7 +250,7 @@ variable that can be captured in closures.
|
|||||||
All closures should be wrapped with Function.prototype.bind or use arrow
|
All closures should be wrapped with Function.prototype.bind or use arrow
|
||||||
notation.
|
notation.
|
||||||
```javascript
|
```javascript
|
||||||
let closure1 = () => { this._fnorbate(); };
|
let closure1 = () => this._fnorbate();
|
||||||
let closure2 = this._fnorbate.bind(this);
|
let closure2 = this._fnorbate.bind(this);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
19
NEWS
@ -1,3 +1,22 @@
|
|||||||
|
3.35.3
|
||||||
|
======
|
||||||
|
* Add discrete GPU support for NVidia drivers [Bastien; #1810]
|
||||||
|
* Fix DND of window previews with tablet devices [Carlos; !897]
|
||||||
|
* Update pad OSD actions dynamically on mode changes [Carlos; !898]
|
||||||
|
* st: Add dedicated PasswordEntry widget [Umang; !619]
|
||||||
|
* Allow stand-alone builds of gnome-extensions tool [Florian; !877]
|
||||||
|
* extension-tool: Don't treat missing .js handler as error [Chuck; !905]
|
||||||
|
* Disallow top bar menus without top bar [Florian; #2002]
|
||||||
|
* Misc. bug fixes and cleanups [Georges, Florian, Robert, Umang; !901,
|
||||||
|
#789937, !909, !910, !911, !913, !916]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Michael Catanzaro, Chuck, Carlos Garnacho, Umang Jain, Robert Mader,
|
||||||
|
Florian Müllner, Georges Basile Stavracas Neto, Bastien Nocera
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Fabio Tomat [fur], Fran Dieguez [gl], Jordi Mas [ca], Daniel Mustieles [es]
|
||||||
|
|
||||||
3.35.2
|
3.35.2
|
||||||
======
|
======
|
||||||
* Fix unredirection after cancelled animations [Florian; #1788]
|
* Fix unredirection after cancelled animations [Florian; #1788]
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
<node>
|
|
||||||
<interface name="org.freedesktop.impl.portal.Access">
|
|
||||||
<method name="AccessDialog">
|
|
||||||
<arg type="o" name="handle" direction="in"/>
|
|
||||||
<arg type="s" name="app_id" direction="in"/>
|
|
||||||
<arg type="s" name="parent_window" direction="in"/>
|
|
||||||
<arg type="s" name="title" direction="in"/>
|
|
||||||
<arg type="s" name="subtitle" direction="in"/>
|
|
||||||
<arg type="s" name="body" direction="in"/>
|
|
||||||
<arg type="a{sv}" name="options" direction="in"/>
|
|
||||||
<arg type="u" name="response" direction="out"/>
|
|
||||||
<arg type="a{sv}" name="results" direction="out"/>
|
|
||||||
</method>
|
|
||||||
</interface>
|
|
||||||
</node>
|
|
@ -9,7 +9,6 @@
|
|||||||
<file preprocess="xml-stripblanks">org.freedesktop.DBus.xml</file>
|
<file preprocess="xml-stripblanks">org.freedesktop.DBus.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Agent.xml</file>
|
<file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Agent.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Manager.xml</file>
|
<file preprocess="xml-stripblanks">org.freedesktop.GeoClue2.Manager.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Access.xml</file>
|
|
||||||
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.PermissionStore.xml</file>
|
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.PermissionStore.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Request.xml</file>
|
<file preprocess="xml-stripblanks">org.freedesktop.impl.portal.Request.xml</file>
|
||||||
<file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file>
|
<file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file>
|
||||||
|
@ -3,10 +3,6 @@ Type=Application
|
|||||||
Name=Shell Extensions
|
Name=Shell Extensions
|
||||||
Comment=Configure GNOME Shell Extensions
|
Comment=Configure GNOME Shell Extensions
|
||||||
Exec=@bindir@/gnome-shell-extension-prefs %u
|
Exec=@bindir@/gnome-shell-extension-prefs %u
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
|
||||||
X-GNOME-Bugzilla-Component=extensions
|
|
||||||
X-GNOME-Bugzilla-Version=@VERSION@
|
|
||||||
Categories=GNOME;GTK;
|
Categories=GNOME;GTK;
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
<file>no-notifications.svg</file>
|
<file>no-notifications.svg</file>
|
||||||
<file>noise-texture.png</file>
|
<file>noise-texture.png</file>
|
||||||
<file>pad-osd.css</file>
|
<file>pad-osd.css</file>
|
||||||
|
<file alias="icons/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
|
||||||
|
<file alias="icons/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
|
||||||
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
<file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
|
||||||
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
<file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
|
||||||
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
<file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
[portal]
|
|
||||||
DBusName=org.freedesktop.impl.portal.desktop.gnome
|
|
||||||
Interfaces=org.freedesktop.impl.portal.Access
|
|
||||||
UseIn=gnome
|
|
@ -13,7 +13,6 @@ desktopconf = configuration_data()
|
|||||||
# We substitute in bindir so it works as an autostart
|
# We substitute in bindir so it works as an autostart
|
||||||
# file when built in a non-system prefix
|
# file when built in a non-system prefix
|
||||||
desktopconf.set('bindir', bindir)
|
desktopconf.set('bindir', bindir)
|
||||||
desktopconf.set('VERSION', meson.project_version())
|
|
||||||
desktopconf.set('systemd_hidden', have_systemd ? 'true' : 'false')
|
desktopconf.set('systemd_hidden', have_systemd ? 'true' : 'false')
|
||||||
|
|
||||||
foreach desktop_file : desktop_files
|
foreach desktop_file : desktop_files
|
||||||
@ -73,7 +72,6 @@ configure_file(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
install_data('gnome-shell.portal', install_dir: portaldir)
|
|
||||||
install_data('50-gnome-shell-system.xml', install_dir: keysdir)
|
install_data('50-gnome-shell-system.xml', install_dir: keysdir)
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,10 +3,6 @@ Type=Application
|
|||||||
Name=GNOME Shell
|
Name=GNOME Shell
|
||||||
Comment=Window management and application launching
|
Comment=Window management and application launching
|
||||||
Exec=@bindir@/gnome-shell
|
Exec=@bindir@/gnome-shell
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
|
||||||
X-GNOME-Bugzilla-Component=general
|
|
||||||
X-GNOME-Bugzilla-Version=@VERSION@
|
|
||||||
Categories=GNOME;GTK;Core;
|
Categories=GNOME;GTK;Core;
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
</description>
|
</description>
|
||||||
</key>
|
</key>
|
||||||
<key name="favorite-apps" type="as">
|
<key name="favorite-apps" type="as">
|
||||||
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'org.gnome.Shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
<default>[ 'org.gnome.Epiphany.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Photos.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||||
<summary>List of desktop file IDs for favorite applications</summary>
|
<summary>List of desktop file IDs for favorite applications</summary>
|
||||||
<description>
|
<description>
|
||||||
The applications corresponding to these identifiers
|
The applications corresponding to these identifiers
|
||||||
|
4
data/theme/eye-not-looking-symbolic.svg
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
|
||||||
|
<path d="M13.98 1.99a1 1 0 0 0-.687.303l-.984.984A8 8 0 0 0 8 2 8 8 0 0 0 .262 8.01a8 8 0 0 0 2.943 4.37l-.912.913a1 1 0 1 0 1.414 1.414l11-11a1 1 0 0 0-.727-1.717zM8 4a4 4 0 0 1 2.611.974l-1.42 1.42A2 2 0 0 0 8 6a2 2 0 0 0-2 2 2 2 0 0 0 .396 1.19l-1.42 1.42A4 4 0 0 1 4 8a4 4 0 0 1 4-4zm7.03 2.209l-3.344 3.343a4 4 0 0 1-2.127 2.127l-2.28 2.28a8 8 0 0 0 .721.04 8 8 0 0 0 7.738-6.01 8 8 0 0 0-.709-1.78zm-7.53.79a.5.5 0 0 1 .5.5.5.5 0 0 1-.5.5.5.5 0 0 1-.5-.5.5.5 0 0 1 .5-.5z" fill="#2e3436"/>
|
||||||
|
</svg>
|
||||||
|
|
After Width: | Height: | Size: 572 B |
27
data/theme/eye-open-negative-filled-symbolic.svg
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg xmlns:osb="http://www.openswatchbook.org/uri/2009/osb" 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" width="16" viewBox="0 0 16 16" version="1.1" id="svg7384" height="16">
|
||||||
|
<metadata id="metadata90">
|
||||||
|
<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>Gnome Symbolic Icon Theme</dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<title id="title9167">Gnome Symbolic Icon Theme</title>
|
||||||
|
<defs id="defs7386">
|
||||||
|
<linearGradient osb:paint="solid" id="linearGradient7212">
|
||||||
|
<stop style="stop-color:#000000;stop-opacity:1;" offset="0" id="stop7214"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g transform="translate(-341.0002,-13.000323)" style="display:inline" id="layer9"/>
|
||||||
|
<g transform="translate(-100,-380.00032)" id="layer1"/>
|
||||||
|
<g transform="translate(-100,-380.00032)" style="display:inline" id="layer10">
|
||||||
|
<path d="m 108,382 a 8,8 0 0 0 -7.73828,6.00977 A 8,8 0 0 0 108,394 8,8 0 0 0 115.73828,387.99023 8,8 0 0 0 108,382 Z m 0,2 a 4,4 0 0 1 4,4 4,4 0 0 1 -4,4 4,4 0 0 1 -4,-4 4,4 0 0 1 4,-4 z" id="path2314" style="opacity:1;vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;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"/>
|
||||||
|
<path id="path2318" d="m 110,388.00003 a 2,2 0 0 1 -2,2 2,2 0 0 1 -2,-2 2,2 0 0 1 2,-2 2,2 0 0 1 2,2 z" style="vector-effect:none;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(-100,-380.00032)" id="g6387"/>
|
||||||
|
<g transform="translate(-100,-380.00032)" id="layer11"/>
|
||||||
|
</svg>
|
||||||
|
|
After Width: | Height: | Size: 2.1 KiB |
@ -1,16 +1,17 @@
|
|||||||
$variant: 'light';
|
$variant: 'dark';
|
||||||
|
|
||||||
@import "gnome-shell-sass/_high-contrast-colors"; //use gtk colors
|
@import "gnome-shell-sass/_high-contrast-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";
|
||||||
|
|
||||||
//force symbolic icons
|
//force symbolic icons
|
||||||
stage {
|
stage {
|
||||||
-st-icon-style: symbolic;
|
-st-icon-style: symbolic;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toggle-switch { width: 48px; }
|
.toggle-switch { width: 48px; }
|
||||||
.toggle-switch-us, .toggle-switch-intl {
|
.toggle-switch-us, .toggle-switch-intl {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg");
|
background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg");
|
||||||
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
|
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
// When color definition differs for dark and light variant,
|
// When color definition differs for dark and light variant,
|
||||||
// it gets @if ed depending on $variant
|
// it gets @if ed depending on $variant
|
||||||
|
|
||||||
|
$base_color: if($variant == 'light', #fff, lighten(desaturate(#241f31, 20%), 2%));
|
||||||
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
|
|
||||||
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
|
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
|
||||||
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
$fg_color: if($variant == 'light', #2e3436, #eeeeec);
|
||||||
|
|
||||||
$selected_fg_color: #ffffff;
|
$selected_fg_color: #fff;
|
||||||
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
|
$selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 10%));
|
||||||
$selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
|
$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_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 8%));
|
||||||
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
|
$borders_edge: if($variant == 'light', rgba(255,255,255,0.8), transparentize($fg_color, 0.93));
|
||||||
$link_color: if($variant == 'light', darken($selected_bg_color, 10%), lighten($selected_bg_color, 20%));
|
$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%));
|
$link_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
|
||||||
$top_hilight: $borders_edge;
|
$top_hilight: $borders_edge;
|
||||||
@ -20,21 +19,20 @@ $error_color: #ff8080;
|
|||||||
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
|
||||||
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
|
||||||
|
|
||||||
$osd_fg_color: #eeeeec;
|
$osd_fg_color: $fg_color;
|
||||||
$osd_text_color: white;
|
$osd_text_color: if($variant == 'light', #000, #fff);
|
||||||
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
|
$osd_bg_color: if($variant == 'light', rgba(255,255,255,0.9), transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04));
|
||||||
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
|
$osd_insensitive_bg_color: transparentize(mix($osd_fg_color, opacify($osd_bg_color, 1), 10%), 0.5);
|
||||||
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
|
$osd_insensitive_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
|
||||||
$osd_borders_color: transparentize(black, 0.3);
|
$osd_borders_color: if($variant == 'light', rgba(255,255,255,0.1), rgba(0,0,0,0.7));
|
||||||
$osd_outer_borders_color: transparentize(white, 0.84);
|
$osd_outer_borders_color: if($variant == 'light', rgba(0,0,0,0.1), lighten($osd_bg_color, 7%));
|
||||||
|
|
||||||
$tooltip_borders_color: $osd_outer_borders_color;
|
$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
|
||||||
$shadow_color: transparentize(black, 0.9);
|
|
||||||
|
|
||||||
//insensitive state derived colors
|
//insensitive state derived colors
|
||||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
|
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
|
||||||
$insensitive_borders_color: $borders_color;
|
$insensitive_borders_color: mix($borders_color, $base_color, 60%);
|
||||||
|
|
||||||
//colors for the backdrop state, derived from the main colors.
|
//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_base_color: if($variant =='light', darken($base_color,1%), lighten($base_color,1%));
|
||||||
@ -42,4 +40,4 @@ $backdrop_bg_color: $bg_color;
|
|||||||
$backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 80%);
|
$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_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_borders_color: mix($borders_color, $bg_color, 90%);
|
||||||
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
|
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
// generic drawing of more complex things
|
// generic drawing of more complex things
|
||||||
|
|
||||||
@function _widget_edge($c:$borders_edge) {
|
@function draw_widget_edge($c:$borders_edge) {
|
||||||
// outer highlight "used" on most widgets
|
// outer highlight "used" on most widgets
|
||||||
@return 0 1px $c;
|
@return 0 1px $c;
|
||||||
}
|
}
|
||||||
@ -13,7 +13,7 @@
|
|||||||
//font-size: ($size / $base) * 1rem;
|
//font-size: ($size / $base) * 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin _shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) {
|
@mixin draw_shadows($shadow1, $shadow2:none, $shadow3:none, $shadow4:none) {
|
||||||
//
|
//
|
||||||
// Helper function to stack up to 4 box-shadows;
|
// Helper function to stack up to 4 box-shadows;
|
||||||
//
|
//
|
||||||
@ -31,8 +31,7 @@
|
|||||||
//
|
//
|
||||||
// $t: entry type
|
// $t: entry type
|
||||||
// $fc: focus color
|
// $fc: focus color
|
||||||
// $edge: set to none to not draw the bottom edge or specify a color to not
|
// $edge: set to none to not draw the bottom edge or specify a color to not use the default one
|
||||||
// use the default one
|
|
||||||
//
|
//
|
||||||
// possible $t values:
|
// possible $t values:
|
||||||
// normal, focus, insensitive
|
// normal, focus, insensitive
|
||||||
@ -45,8 +44,9 @@
|
|||||||
}
|
}
|
||||||
@if $t==focus {
|
@if $t==focus {
|
||||||
border-color: if($fc==$selected_bg_color,
|
border-color: if($fc==$selected_bg_color,
|
||||||
$selected_borders_color,
|
$selected_borders_color,
|
||||||
darken($fc,35%));
|
darken($fc,35%));
|
||||||
|
box-shadow: inset 0 0 0 1px $fc;
|
||||||
}
|
}
|
||||||
@if $t==hover { }
|
@if $t==hover { }
|
||||||
@if $t==insensitive {
|
@if $t==insensitive {
|
||||||
@ -58,36 +58,39 @@
|
|||||||
|
|
||||||
// buttons
|
// buttons
|
||||||
|
|
||||||
@function _border_color ($c) { @return darken($c,25%); } // colored buttons want
|
@function draw_border_color ($c) {
|
||||||
// the border form the
|
//
|
||||||
// base color
|
// colored buttons want the border form the base color
|
||||||
|
//
|
||||||
|
@return if($variant == 'light', darken($c, 18%), darken($c, 4%));
|
||||||
|
}
|
||||||
|
|
||||||
@function _text_shadow_color ($tc:$fg_color, $bg:$bg_color) {
|
@function draw_text_shadow_color ($tc:$fg_color, $bg:$bg_color) {
|
||||||
//
|
//
|
||||||
// calculate the color of text shadows
|
// calculate the color of text shadows
|
||||||
//
|
//
|
||||||
// $tc is the text color
|
// $tc is the text color
|
||||||
// $bg is the background color
|
// $bg is the background color
|
||||||
//
|
//
|
||||||
$_lbg: lightness($bg)/100%;
|
$lbg: lightness($bg)/100%;
|
||||||
@if lightness($tc)<50% { @return transparentize(white,1-$_lbg/($_lbg*1.3)); }
|
@if lightness($tc)<50% { @return rgba(255,255,255,$lbg/($lbg*1.3)); }
|
||||||
@else { @return transparentize(black,$_lbg*0.8); }
|
@else { @return rgba(0,0,0,1-$lbg*0.8); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@function _button_hilight_color($c) {
|
@function draw_button_hilight_color($c) {
|
||||||
//
|
//
|
||||||
// calculate the right top hilight color for buttons
|
// calculate the right top hilight color for buttons
|
||||||
//
|
//
|
||||||
// $c: base color;
|
// $c: base color;
|
||||||
//
|
//
|
||||||
@if lightness($c)>90% { @return white; }
|
@if lightness($c)>90% { @return white; }
|
||||||
@else if lightness($c)>80% { @return transparentize(white, 0.3); }
|
@else if lightness($c)>80% { @return rgba(255,255,255, 0.7); }
|
||||||
@else if lightness($c)>50% { @return transparentize(white, 0.5); }
|
@else if lightness($c)>50% { @return rgba(255,255,255, 0.5); }
|
||||||
@else if lightness($c)>40% { @return transparentize(white, 0.7); }
|
@else if lightness($c)>40% { @return rgba(255,255,255, 0.3); }
|
||||||
@else { @return transparentize(white, 0.9); }
|
@else { @return rgba(255,255,255, 0.1); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin _button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
|
@mixin draw_button_text_shadow ($tc:$fg_color, $bg:$bg_color) {
|
||||||
//
|
//
|
||||||
// helper function for the text emboss effect
|
// helper function for the text emboss effect
|
||||||
//
|
//
|
||||||
@ -96,19 +99,19 @@
|
|||||||
// TODO: this functions needs a way to deal with special cases
|
// TODO: this functions needs a way to deal with special cases
|
||||||
//
|
//
|
||||||
|
|
||||||
$_shadow: _text_shadow_color($tc, $bg);
|
$shadow: draw_text_shadow_color($tc, $bg);
|
||||||
|
|
||||||
@if lightness($tc)<50% {
|
@if lightness($tc)<50% {
|
||||||
text-shadow: 0 1px $_shadow;
|
text-shadow: 0 1px $shadow;
|
||||||
icon-shadow: 0 1px $_shadow;
|
icon-shadow: 0 1px $shadow;
|
||||||
}
|
}
|
||||||
@else {
|
@else {
|
||||||
text-shadow: 0 -1px $_shadow;
|
text-shadow: 0 -1px $shadow;
|
||||||
icon-shadow: 0 -1px $_shadow;
|
icon-shadow: 0 -1px $shadow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge) {
|
@mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: $borders_edge, $shadow: $shadow_color) {
|
||||||
//
|
//
|
||||||
// Button drawing function
|
// Button drawing function
|
||||||
//
|
//
|
||||||
@ -117,6 +120,8 @@
|
|||||||
// $tc: optional text 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
|
// $edge: set to none to not draw the bottom edge or specify a color to not
|
||||||
// use the default one
|
// use the default one
|
||||||
|
// $shadow: set to none to not draw the drop shadow or specify a color to not
|
||||||
|
// use the default one
|
||||||
//
|
//
|
||||||
// possible $t values:
|
// possible $t values:
|
||||||
// normal, hover, active, insensitive, insensitive-active,
|
// normal, hover, active, insensitive, insensitive-active,
|
||||||
@ -124,79 +129,68 @@
|
|||||||
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
|
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
|
||||||
//
|
//
|
||||||
|
|
||||||
$_hilight_color: _button_hilight_color($c);
|
$hilight_color: draw_button_hilight_color($c);
|
||||||
$_button_edge: if($edge == none, none, _widget_edge($edge));
|
$button_edge: if($edge == none, none, draw_widget_edge($edge));
|
||||||
$_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
|
$blank_edge: if($edge == none, none, draw_widget_edge(transparentize($edge,1)));
|
||||||
$_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03);
|
$button_shadow: if($shadow == none, none, 0 1px 1px 0 $shadow);
|
||||||
|
|
||||||
@if $t==normal {
|
|
||||||
//
|
|
||||||
// normal button
|
// normal button
|
||||||
//
|
@if $t==normal {
|
||||||
|
|
||||||
color: $tc;
|
color: $tc;
|
||||||
background-color: $c;
|
background-color: lighten($c, 3%) !important;
|
||||||
border-color: $borders_color;
|
border-color: draw_border_color($c);
|
||||||
box-shadow: $_button_shadow;
|
@include draw_shadows($button_shadow);
|
||||||
text-shadow: 0 1px black;
|
// box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
|
||||||
icon-shadow: 0 1px black;
|
text-shadow: 0 1px $text_shadow_color;
|
||||||
|
icon-shadow: 0 1px $text_shadow_color;
|
||||||
}
|
}
|
||||||
@if $t==focus {
|
|
||||||
//
|
|
||||||
// focused button
|
// focused button
|
||||||
//
|
@if $t==focus {
|
||||||
color: $tc;
|
color: $tc;
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px $text_shadow_color;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px $text_shadow_color;
|
||||||
box-shadow: inset 0px 0px 0px 2px $selected_bg_color;
|
box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.7);
|
||||||
//border-color: $selected_bg_color;
|
//border-color: $selected_bg_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hover button
|
||||||
@else if $t==hover {
|
@else if $t==hover {
|
||||||
//
|
|
||||||
// active osd button
|
|
||||||
//
|
|
||||||
color: $tc;
|
color: $tc;
|
||||||
border-color: $borders_color;
|
background-color: lighten($c, if($variant == 'light', 8%, 5%)) !important;
|
||||||
background-color: $c;
|
border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c));
|
||||||
box-shadow: $_button_shadow;
|
@include draw_shadows($button_shadow);
|
||||||
text-shadow: 0 1px black;
|
text-shadow: 0 1px $text_shadow_color;
|
||||||
icon-shadow: 0 1px black;
|
icon-shadow: 0 1px $text_shadow_color;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// active button
|
||||||
@else if $t==active {
|
@else if $t==active {
|
||||||
//
|
|
||||||
// active osd button
|
|
||||||
//
|
|
||||||
color: $tc;
|
color: $tc;
|
||||||
border-color: $borders_color;
|
background-color: darken($c,3%) !important;
|
||||||
background-color: $c;
|
border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%)));
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
@else if $t==insensitive {
|
|
||||||
|
|
||||||
|
// insensitive button
|
||||||
|
@else if $t==insensitive {
|
||||||
color: $insensitive_fg_color;
|
color: $insensitive_fg_color;
|
||||||
border-color: $insensitive_borders_color;
|
border-color: $insensitive_borders_color;
|
||||||
background-color: $insensitive_bg_color;
|
background-color: $insensitive_bg_color !important;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
}
|
}
|
||||||
@else if $t==undecorated {
|
|
||||||
//
|
|
||||||
// reset
|
// reset
|
||||||
//
|
@else if $t==undecorated {
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
|
@include draw_shadows(inset 0 1px rgba(255,255,255,0),$blank_edge);
|
||||||
@include _shadows(inset 0 1px transparentize(white,1),
|
|
||||||
$_blank_edge);
|
|
||||||
|
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
icon-shadow: none;
|
icon-shadow: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,11 +22,10 @@ $destructive_color: darken(#ef2929,10%);
|
|||||||
|
|
||||||
$osd_fg_color: #eeeeec;
|
$osd_fg_color: #eeeeec;
|
||||||
$osd_bg_color: #2e3436;
|
$osd_bg_color: #2e3436;
|
||||||
$osd_borders_color: transparentize(black, 0.3);
|
$osd_borders_color: rgba(0,0,0, 0.7);
|
||||||
$osd_outer_borders_color: transparentize(white, 0.9);
|
$osd_outer_borders_color: rgba(255,255,255, 0.1);
|
||||||
|
|
||||||
$tooltip_borders_color: $osd_outer_borders_color;
|
$shadow_color: rgba(0,0,0, 0.1);
|
||||||
$shadow_color: transparentize(black, 0.9);
|
|
||||||
|
|
||||||
//insensitive state derived colors
|
//insensitive state derived colors
|
||||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
|
||||||
|
39
data/theme/gnome-shell-sass/_widgets.scss
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
//
|
||||||
|
// Shell widgets stylesheets are placed in separate .scss files
|
||||||
|
// in 'widgets' and imported into the main stylesheet in this file.
|
||||||
|
// To create or update a widget for the shell modify the list below.
|
||||||
|
//
|
||||||
|
|
||||||
|
/* WIDGETS */
|
||||||
|
@import 'widgets/app-grid';
|
||||||
|
@import 'widgets/app-switcher';
|
||||||
|
@import 'widgets/buttons';
|
||||||
|
@import 'widgets/calendar';
|
||||||
|
@import 'widgets/check-box';
|
||||||
|
@import 'widgets/corner-ripple';
|
||||||
|
@import 'widgets/dash';
|
||||||
|
@import 'widgets/dialogs';
|
||||||
|
@import 'widgets/end-session-dialog';
|
||||||
|
@import 'widgets/entries';
|
||||||
|
@import 'widgets/hotplug';
|
||||||
|
@import 'widgets/ibus-popup';
|
||||||
|
@import 'widgets/keyboard';
|
||||||
|
@import 'widgets/login-dialog';
|
||||||
|
@import 'widgets/looking-glass';
|
||||||
|
@import 'widgets/message-list';
|
||||||
|
@import 'widgets/notifications';
|
||||||
|
@import 'widgets/misc';
|
||||||
|
@import 'widgets/network-dialog';
|
||||||
|
@import 'widgets/osd';
|
||||||
|
@import 'widgets/overview';
|
||||||
|
@import 'widgets/panel';
|
||||||
|
@import 'widgets/popovers';
|
||||||
|
@import 'widgets/screen-shield';
|
||||||
|
@import 'widgets/scrollbars';
|
||||||
|
@import 'widgets/search-entry';
|
||||||
|
@import 'widgets/search-results';
|
||||||
|
@import 'widgets/slider';
|
||||||
|
@import 'widgets/switches';
|
||||||
|
@import 'widgets/tiled-previews';
|
||||||
|
@import 'widgets/window-picker';
|
||||||
|
@import 'widgets/workspace-switcher';
|
208
data/theme/gnome-shell-sass/widgets/_app-grid.scss
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
/* App Grid */
|
||||||
|
|
||||||
|
$app_icon_size: 96px;
|
||||||
|
$app_icon_padding: 24px;
|
||||||
|
|
||||||
|
// app icons
|
||||||
|
.icon-grid {
|
||||||
|
-shell-grid-horizontal-item-size: $app_icon_size + $app_icon_padding * 2;
|
||||||
|
-shell-grid-vertical-item-size: $app_icon_size + $app_icon_padding * 2;
|
||||||
|
spacing: $base_spacing * 6;
|
||||||
|
|
||||||
|
.overview-icon {
|
||||||
|
icon-size: $app_icon_size;
|
||||||
|
StIcon { margin-bottom: $base_margin; } // margin on icon so label isn't close
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//.app-display { spacing: 20px; }
|
||||||
|
|
||||||
|
/* App Icons */
|
||||||
|
|
||||||
|
$app_grid_fg_color: #fff;
|
||||||
|
|
||||||
|
// Outline for low res icons
|
||||||
|
.lowres-icon {
|
||||||
|
icon-shadow: 0 1px 2px rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dropshadow for large icons
|
||||||
|
.icon-dropshadow {
|
||||||
|
icon-shadow: 0 1px 2px rgba(0,0,0,0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Icon tiles in the app grid
|
||||||
|
.app-well-app,
|
||||||
|
.app-folder {
|
||||||
|
|
||||||
|
.overview-icon {
|
||||||
|
@extend %icon_tile;
|
||||||
|
color: $app_grid_fg_color !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:selected {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($osd_bg_color,0.7);
|
||||||
|
color: $app_grid_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:selected {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($osd_fg_color,0.9);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($osd_fg_color,0.7 );
|
||||||
|
// border-color: $selected_bg_color;
|
||||||
|
color: $app_grid_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:drop {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($selected_bg_color,.15);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&:checked {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize(darken($osd_bg_color,10%), 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* App Folders */
|
||||||
|
.app-folder {
|
||||||
|
.overview-icon {
|
||||||
|
@extend %icon_tile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// expanded folder
|
||||||
|
.app-folder-popup {
|
||||||
|
-arrow-border-radius: 8px;
|
||||||
|
-arrow-background-color: transparentize(darken($osd_bg_color,10%), 0.5);
|
||||||
|
-arrow-base: 24px;
|
||||||
|
-arrow-rise: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-folder-popup-bin { padding: $base_padding - 1px; }
|
||||||
|
|
||||||
|
.app-folder-icon {
|
||||||
|
padding: $base_padding;
|
||||||
|
spacing-rows: $base_spacing;
|
||||||
|
spacing-columns: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Running app indicator (also shown in dash)
|
||||||
|
.app-well-app-running-dot {
|
||||||
|
height: 5px;
|
||||||
|
width: 5px;
|
||||||
|
border-radius:5px;
|
||||||
|
background-color: $osd_fg_color;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rename popup for app folders
|
||||||
|
.rename-folder-popup {
|
||||||
|
.rename-folder-popup-item {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
&:ltr, &:rtl { padding: 0 $base_padding * 2; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// right-click app menu
|
||||||
|
.app-menu,
|
||||||
|
.app-well-menu {
|
||||||
|
max-width: 27.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// App Grid pagination indicators
|
||||||
|
.page-indicator {
|
||||||
|
padding: 15px 20px;
|
||||||
|
|
||||||
|
.page-indicator-icon {
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 10px; // the same as height&width
|
||||||
|
background-color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some hacks I don't even know
|
||||||
|
.all-apps,
|
||||||
|
.frequent-apps > StBoxLayout {
|
||||||
|
// horizontal padding to make sure scrollbars or dash don't overlap content
|
||||||
|
padding: 0px 88px 10px 88px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-well-app > .overview-icon.overview-icon-with-label {
|
||||||
|
padding: 10px 8px 5px 8px;
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Label when no frequent apps
|
||||||
|
.no-frequent-applications-label { @extend %status_text; }
|
||||||
|
|
||||||
|
// shutdown and other actions in the grid
|
||||||
|
.system-action-icon {
|
||||||
|
background-color: rgba(0,0,0,0.8);
|
||||||
|
color: #fff;
|
||||||
|
border-radius: 99px;
|
||||||
|
icon-size: $app_icon_size * 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Frequent | All toggle */
|
||||||
|
|
||||||
|
// container
|
||||||
|
.app-view-controls {
|
||||||
|
padding-bottom: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// buttons
|
||||||
|
.app-view-control {
|
||||||
|
padding: $base_padding $base_padding*5;
|
||||||
|
margin: 0;
|
||||||
|
background-color: transparentize($osd_bg_color, 0.5);
|
||||||
|
border-width: 1px;
|
||||||
|
color: darken($osd_fg_color, 25%);
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: transparentize($osd_bg_color, 0.5) !important;
|
||||||
|
box-shadow:none !important;
|
||||||
|
color: darken($osd_fg_color, 25%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: $selected_bg_color !important;
|
||||||
|
&:hover {
|
||||||
|
background-color: lighten($selected_bg_color, 11%) !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:checked {
|
||||||
|
background-color: $selected_bg_color !important;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
box-shadow: none;
|
||||||
|
&:active { background-color: darken($selected_bg_color, 4%) !important; }
|
||||||
|
&:hover { background-color: lighten($selected_bg_color, 7%) !important; }
|
||||||
|
}
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
border-right-width: 0 !important;
|
||||||
|
border-radius: $base_border_radius 0 0 $base_border_radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-radius: 0 $base_border_radius $base_border_radius 0;
|
||||||
|
}
|
||||||
|
}
|
55
data/theme/gnome-shell-sass/widgets/_app-switcher.scss
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/* App Switcher */
|
||||||
|
|
||||||
|
.switcher-popup {
|
||||||
|
padding: 8px;
|
||||||
|
spacing: $base_spacing * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// switcher onscreen panel
|
||||||
|
.switcher-list {
|
||||||
|
@extend %osd_panel;
|
||||||
|
|
||||||
|
.item-box {
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: $base_border_radius + 1px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
|
||||||
|
&:outlined {
|
||||||
|
border: 1px solid darken($borders_color,5%);
|
||||||
|
background-color: transparentize($osd_fg_color, 0.9);
|
||||||
|
box-shadow: inset 0 2px 2px 0 rgba(0,0,0,0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:selected {
|
||||||
|
background-color: transparentize($osd_fg_color, 0.9);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// window thumbnails
|
||||||
|
.thumbnail-box {
|
||||||
|
padding: 2px;
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.thumbnail {
|
||||||
|
width: 256px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
width: 1px;
|
||||||
|
background: $borders_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.switcher-list-item-container {
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.switcher-arrow {
|
||||||
|
border-color: rgba(0,0,0,0);
|
||||||
|
color: transparentize($fg_color,0.2);
|
||||||
|
&:highlighted {
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
}
|
5
data/theme/gnome-shell-sass/widgets/_buttons.scss
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
/* Buttons */
|
||||||
|
|
||||||
|
.button {
|
||||||
|
@extend %button; // that's it
|
||||||
|
}
|
266
data/theme/gnome-shell-sass/widgets/_calendar.scss
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
/* Date/Time Menu */
|
||||||
|
|
||||||
|
// overall menu
|
||||||
|
#calendarArea {
|
||||||
|
padding:0;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calendar menu side column
|
||||||
|
.datemenu-calendar-column {
|
||||||
|
spacing: 0;
|
||||||
|
border: 0 solid $bubble_borders_color;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
padding-bottom: 3em; // account for the notifications clear button
|
||||||
|
padding-top:0;
|
||||||
|
|
||||||
|
&:ltr {margin-right: $base_margin * 2; border-left-width: 1px; }
|
||||||
|
&:rtl {margin-left: $base_margin * 2; border-right-width: 1px; }
|
||||||
|
|
||||||
|
// today button (the date)
|
||||||
|
.datemenu-today-button {
|
||||||
|
padding: $base_padding * 1.5;
|
||||||
|
margin: $base_margin;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $base_border_radius + 2px;
|
||||||
|
|
||||||
|
&:hover { @include button(hover);}
|
||||||
|
&:focus { @include button(focus);}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
@include button(active);
|
||||||
|
}
|
||||||
|
|
||||||
|
// weekday label
|
||||||
|
.day-label {
|
||||||
|
@include fontsize($base_font_size+1);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// date label
|
||||||
|
.date-label {
|
||||||
|
@include fontsize($base_font_size+7);
|
||||||
|
font-weight: 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// calendar
|
||||||
|
.calendar {
|
||||||
|
@extend %notification_bubble;
|
||||||
|
margin:$base_margin !important;
|
||||||
|
margin-bottom: $base_padding + $base_margin !important;
|
||||||
|
padding:$base_padding !important;
|
||||||
|
|
||||||
|
// more below for sub-elements
|
||||||
|
}
|
||||||
|
|
||||||
|
.datemenu-displays-section {
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.datemenu-displays-box {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
margin:0;
|
||||||
|
|
||||||
|
// world clocks and weather
|
||||||
|
.world-clocks-button,
|
||||||
|
.weather-button {
|
||||||
|
@extend %notification_bubble;
|
||||||
|
padding:$base_padding !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.events-section-title {
|
||||||
|
color: desaturate(darken($fg_color,40%), 10%);
|
||||||
|
font-weight: bold;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: .4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calendar */
|
||||||
|
.calendar {
|
||||||
|
|
||||||
|
// month
|
||||||
|
.calendar-month-label {
|
||||||
|
color: lighten($fg_color,5%);
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 8px 0;
|
||||||
|
&:focus {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// prev/next month icons
|
||||||
|
.calendar-change-month-back StIcon,
|
||||||
|
.calendar-change-month-forward StIcon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pager-button {
|
||||||
|
background-color: transparent;
|
||||||
|
height: 32px;
|
||||||
|
width: 32px;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
&:hover, &:focus { background-color: lighten($hover_bg_color, 5%); }
|
||||||
|
&:active { background-color: $active_bg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$calendar_day_size: 32px;
|
||||||
|
|
||||||
|
.calendar-day-base {
|
||||||
|
@include fontsize($base_font_size - 3);
|
||||||
|
text-align: center;
|
||||||
|
width: $calendar_day_size;
|
||||||
|
height: $calendar_day_size;
|
||||||
|
padding: 0;
|
||||||
|
margin: 2px;
|
||||||
|
border-radius: $calendar_day_size * 0.5 + 2px;
|
||||||
|
border: 1px solid transparent; //avoid jumparound due to today
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
&:hover, &:focus { background-color: $hover_bg_color; }
|
||||||
|
&:active,&:selected {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
background-color: darken($bg_color,5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// day of week heading
|
||||||
|
&.calendar-day-heading {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
margin-top: 1em;
|
||||||
|
@include fontsize($base_font_size - 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.calendar-day { //border collapse hack - see calendar.js
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-top {
|
||||||
|
border-top-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-day-left { border-left-width: 1px; }
|
||||||
|
.calendar-work-day {}
|
||||||
|
.calendar-nonwork-day {
|
||||||
|
color: $insensitive_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Today
|
||||||
|
.calendar-today {
|
||||||
|
font-weight: bold;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
|
||||||
|
&:hover,&:focus {
|
||||||
|
background-color:lighten($selected_bg_color, 3%);
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,&:selected {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
&:hover,&:focus {
|
||||||
|
background-color:lighten($selected_bg_color, 3%);
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
.calendar-day-with-events {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
font-weight: bold;
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-other-month-day {
|
||||||
|
color: transparentize($fg_color ,0.5);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-week-number {
|
||||||
|
@include fontsize($base_font_size - 4);
|
||||||
|
font-weight: bold;
|
||||||
|
height: 1.8em;
|
||||||
|
width: 2.3em;
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0.5em 0 0;
|
||||||
|
margin: 6px;
|
||||||
|
background-color: darken($bg_color, 2%);
|
||||||
|
color: lighten($fg_color, 5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Weather */
|
||||||
|
.weather-box {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
padding:$base_padding;
|
||||||
|
|
||||||
|
.weather-header {
|
||||||
|
color: desaturate(darken($fg_color,40%), 10%);
|
||||||
|
font-weight: bold;
|
||||||
|
&.location {
|
||||||
|
font-weight: normal;
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-grid {
|
||||||
|
margin-top: $base_margin;
|
||||||
|
spacing-rows: $base_spacing;
|
||||||
|
spacing-columns: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-forecast-time {
|
||||||
|
color: darken($fg_color,30%);
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
font-weight: normal;
|
||||||
|
padding-top: 0.2em;
|
||||||
|
padding-bottom: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-forecast-icon {
|
||||||
|
icon-size: $base_icon_size * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather-forecast-temp {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* World clocks */
|
||||||
|
.world-clocks-grid {
|
||||||
|
padding:$base_padding;
|
||||||
|
spacing-rows: $base_spacing;
|
||||||
|
spacing-columns: $base_spacing * 2;
|
||||||
|
|
||||||
|
// title
|
||||||
|
.world-clocks-header {
|
||||||
|
color: desaturate(darken($fg_color,40%), 10%);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// city label
|
||||||
|
.world-clocks-city {
|
||||||
|
color: $fg_color;
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// timezone time
|
||||||
|
.world-clocks-time {
|
||||||
|
font-weight: bold;
|
||||||
|
color: $fg_color;
|
||||||
|
font-feature-settings: "lnum";
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
// timezone offset label
|
||||||
|
.world-clocks-timezone {
|
||||||
|
color: darken($fg_color,20%);
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
}
|
18
data/theme/gnome-shell-sass/widgets/_check-box.scss
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/* Check Boxes */
|
||||||
|
|
||||||
|
// these are equal to the size of the SVG assets
|
||||||
|
$check_height: 22px;
|
||||||
|
$check_width: 24px;
|
||||||
|
|
||||||
|
|
||||||
|
.check-box {
|
||||||
|
StBoxLayout { spacing: .8em; }
|
||||||
|
StBin {
|
||||||
|
width: $check_width;
|
||||||
|
height: $check_height;
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg");
|
||||||
|
}
|
||||||
|
&:focus StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||||
|
&:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||||
|
&:focus:checked StBin { background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||||
|
}
|
24
data/theme/gnome-shell-sass/widgets/_corner-ripple.scss
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/* Activities Ripple */
|
||||||
|
|
||||||
|
$ripple_size: 50px;
|
||||||
|
|
||||||
|
.ripple-box {
|
||||||
|
background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
|
||||||
|
box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
|
||||||
|
// plus + 2px for the border (box-shadow)
|
||||||
|
width: $ripple_size + 2px;
|
||||||
|
height: $ripple_size + 2px;
|
||||||
|
border-radius: 0 0 $ripple_size + 2px 0; // radius equals the size of the box to give us the curve
|
||||||
|
|
||||||
|
// just a simple change to the border radius position
|
||||||
|
&:rtl { border-radius: 0 0 0 $ripple_size + 2px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer location
|
||||||
|
.ripple-pointer-location {
|
||||||
|
width: $ripple_size;
|
||||||
|
height: $ripple_size;
|
||||||
|
border-radius: $ripple_size * 0.5; // radius equals the size of the box to give us the curve
|
||||||
|
background-color: lighten(transparentize($selected_bg_color, 0.7), 30%);
|
||||||
|
box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%);
|
||||||
|
}
|
86
data/theme/gnome-shell-sass/widgets/_dash.scss
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/* Dash */
|
||||||
|
|
||||||
|
$dash_placeholder_size: 32px;
|
||||||
|
$dash_spacing: $base_padding + 4px;
|
||||||
|
$dash_border_radius: $modal_radius * 1.5;
|
||||||
|
|
||||||
|
#dash {
|
||||||
|
@extend %overview_panel;
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
padding: ($dash_spacing / 2) 0;
|
||||||
|
|
||||||
|
//fixme: can't have non uniform borders :(
|
||||||
|
border-radius: 0 $dash_border_radius $dash_border_radius 0;
|
||||||
|
border-left-width: 0 !important;
|
||||||
|
&:rtl {
|
||||||
|
border-radius: $dash_border_radius 0 0 $dash_border_radius;
|
||||||
|
border-right-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.placeholder {
|
||||||
|
// background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||||
|
background-image:none;
|
||||||
|
background-size: contain;
|
||||||
|
height: $dash_placeholder_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
.empty-dash-drop-target {
|
||||||
|
width: $dash_placeholder_size;
|
||||||
|
height: $dash_placeholder_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dash Items
|
||||||
|
.dash-item-container > StWidget {
|
||||||
|
padding: ($dash_spacing / 2) $dash_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OSD Tooltip
|
||||||
|
.dash-label {
|
||||||
|
background-color: transparentize($osd_bg_color,0.05);
|
||||||
|
border-radius: $base_border_radius + 2px;
|
||||||
|
border:none;
|
||||||
|
box-shadow:0 0 0 1px $osd_outer_borders_color;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
margin-top: $base_margin + 4px;
|
||||||
|
padding: $base_padding $base_padding + 2px;
|
||||||
|
text-align: center;
|
||||||
|
-x-offset: $base_margin * 2; // distance from the dash edge
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show apps button
|
||||||
|
.show-apps {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
|
||||||
|
& .overview-icon {
|
||||||
|
@extend %icon_tile;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:selected {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($osd_fg_color,0.9);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:drop .overview-icon {
|
||||||
|
background-color: transparentize($selected_bg_color,.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active, &:checked {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: darken($osd_bg_color,10%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:checked, &:focus {
|
||||||
|
.show-apps-icon {
|
||||||
|
color: $fg_color;
|
||||||
|
transition-duration: 100ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
283
data/theme/gnome-shell-sass/widgets/_dialogs.scss
Normal file
@ -0,0 +1,283 @@
|
|||||||
|
/* Modal Dialogs */
|
||||||
|
|
||||||
|
.modal-dialog {
|
||||||
|
border-radius: $modal_radius;
|
||||||
|
@extend %bubble_panel;
|
||||||
|
|
||||||
|
.modal-dialog-content-box {
|
||||||
|
margin: 32px 40px;
|
||||||
|
spacing: 32px;
|
||||||
|
max-width: 28em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog-linked-button {
|
||||||
|
@extend %bubble_button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog-subject {
|
||||||
|
@include fontsize($base_font_size + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Message Dialog */
|
||||||
|
.message-dialog-content {
|
||||||
|
spacing: 18px;
|
||||||
|
|
||||||
|
.message-dialog-title {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 18pt;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
.message-dialog-description { text-align: center; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dialog List */
|
||||||
|
.dialog-list {
|
||||||
|
spacing: 18px;
|
||||||
|
|
||||||
|
.dialog-list-title {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-list-scrollview { max-height: 200px; }
|
||||||
|
.dialog-list-box {
|
||||||
|
spacing: 1em;
|
||||||
|
|
||||||
|
.dialog-list-item {
|
||||||
|
spacing: 1em;
|
||||||
|
|
||||||
|
.dialog-list-item-title { font-weight: bold; }
|
||||||
|
.dialog-list-item-description {
|
||||||
|
color: darken($fg_color,5%);
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Run Dialog */
|
||||||
|
.run-dialog {
|
||||||
|
.run-dialog-entry { width: 20em; margin-bottom: 6px; }
|
||||||
|
.run-dialog-error-box {
|
||||||
|
padding-top: 16px;
|
||||||
|
spacing: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.run-dialog-label {
|
||||||
|
@include fontsize($base_font_size + 1.1);
|
||||||
|
font-weight: normal;
|
||||||
|
color: $fg_color;
|
||||||
|
padding-bottom: .4em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ShellMountOperation Dialogs */
|
||||||
|
.shell-mount-operation-icon {
|
||||||
|
icon-size: $base_icon_size * 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog {
|
||||||
|
spacing: 24px;
|
||||||
|
|
||||||
|
.message-dialog-title {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-left: 17px;
|
||||||
|
padding-bottom: 6px;
|
||||||
|
max-width: 34em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-dialog-title:rtl {
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-dialog-description {
|
||||||
|
padding-left: 17px;
|
||||||
|
width: 28em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-dialog-description:rtl {
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 17px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog-app-list {
|
||||||
|
max-height: 200px;
|
||||||
|
padding-top: 24px;
|
||||||
|
padding-left: 49px;
|
||||||
|
padding-right: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog-app-list:rtl {
|
||||||
|
padding-right: 49px;
|
||||||
|
padding-left: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog-app-list-item {
|
||||||
|
color: lighten($fg_color,10%);
|
||||||
|
&:hover { color: $fg_color; }
|
||||||
|
&:ltr { padding-right: 1em; }
|
||||||
|
&:rtl { padding-left: 1em; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog-app-list-item-icon {
|
||||||
|
&:ltr { padding-right: 17px; }
|
||||||
|
&:rtl { padding-left: 17px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.mount-dialog-app-list-item-name {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Password or Authentication Dialog */
|
||||||
|
|
||||||
|
.prompt-dialog {
|
||||||
|
//this is the width of the entire modal popup
|
||||||
|
width: 34em;
|
||||||
|
|
||||||
|
.message-dialog-content { spacing: $base_spacing * 4; }
|
||||||
|
.message-dialog-title { color: lighten($fg_color,15%); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-description:rtl {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-password-box {
|
||||||
|
spacing: 1em;
|
||||||
|
padding-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-error-label {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
color: $warning_color;
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-info-label {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-null-label {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
padding-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-pim-box {
|
||||||
|
spacing: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-grid {
|
||||||
|
spacing-rows: 15px;
|
||||||
|
spacing-columns: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-keyfiles-box {
|
||||||
|
spacing: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-button.button {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prompt-dialog-caps-lock-warning {
|
||||||
|
@extend .prompt-dialog-error-label;
|
||||||
|
padding-left: 6.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Polkit Dialog */
|
||||||
|
|
||||||
|
.polkit-dialog-user-layout {
|
||||||
|
padding-left: 10px;
|
||||||
|
spacing: 10px;
|
||||||
|
&:rtl {
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.polkit-dialog-user-root-label {
|
||||||
|
color: $warning_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.polkit-dialog-user-icon {
|
||||||
|
border-radius: 99px;
|
||||||
|
background-size: contain;
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Audio selection dialog */
|
||||||
|
.audio-device-selection-dialog {
|
||||||
|
spacing: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-content {
|
||||||
|
spacing: 20px;
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-title {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-box {
|
||||||
|
spacing: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-device {
|
||||||
|
border: 1px solid $bubble_borders_color;
|
||||||
|
border-radius: 12px;
|
||||||
|
&:hover,&:focus { background-color: $hover_bg_color; }
|
||||||
|
&:active {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-device-box {
|
||||||
|
padding: 20px;
|
||||||
|
spacing: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.audio-selection-device-icon {
|
||||||
|
icon-size: $base_icon_size * 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Access Dialog */
|
||||||
|
.access-dialog {
|
||||||
|
spacing: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Geolocation Dialog */
|
||||||
|
.geolocation-dialog {
|
||||||
|
spacing: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Extension Dialog */
|
||||||
|
.extension-dialog {
|
||||||
|
.message-dialog-title { font-weight: normal; color: $fg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inhibit-Shortcuts Dialog */
|
||||||
|
.inhibit-shortcuts-dialog {
|
||||||
|
spacing: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Network Agent Dialog */
|
||||||
|
|
||||||
|
.network-dialog-secret-table {
|
||||||
|
spacing-rows: 15px;
|
||||||
|
spacing-columns: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.keyring-dialog-control-table {
|
||||||
|
spacing-rows: 15px;
|
||||||
|
spacing-columns: 1em;
|
||||||
|
}
|
12
data/theme/gnome-shell-sass/widgets/_end-session-dialog.scss
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/* End Session Dialog */
|
||||||
|
|
||||||
|
$end_session_dialog_width: 28em;
|
||||||
|
|
||||||
|
.end-session-dialog-battery-warning {
|
||||||
|
width: $end_session_dialog_width;
|
||||||
|
color: $warning_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.end-session-dialog .dialog-list-title {
|
||||||
|
color: $warning_color;
|
||||||
|
}
|
23
data/theme/gnome-shell-sass/widgets/_entries.scss
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/* Entries */
|
||||||
|
|
||||||
|
StEntry {
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
padding: 4px;
|
||||||
|
border-width: 1px;
|
||||||
|
color: $fg_color;
|
||||||
|
@include entry(normal);
|
||||||
|
//&:hover { @include entry(hover);}
|
||||||
|
&:focus { @include entry(focus);}
|
||||||
|
&:insensitive { @include entry(insensitive);}
|
||||||
|
selection-background-color: $selected_bg_color;
|
||||||
|
selected-color: $selected_fg_color;
|
||||||
|
StIcon.capslock-warning {
|
||||||
|
icon-size: 16px;
|
||||||
|
warning-color: $warning_color;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
StIcon.peek-password {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
||||||
|
}
|
10
data/theme/gnome-shell-sass/widgets/_hotplug.scss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// hotplug
|
||||||
|
|
||||||
|
.hotplug-notification-item {
|
||||||
|
@extend %bubble_button;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hotplug-notification-item-icon {
|
||||||
|
icon-size: 24px;
|
||||||
|
padding: 0 4px;
|
||||||
|
}
|
30
data/theme/gnome-shell-sass/widgets/_ibus-popup.scss
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
// IBus Candidate Popup
|
||||||
|
.candidate-popup-content {
|
||||||
|
padding: 0.5em;
|
||||||
|
spacing: 0.3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-index {
|
||||||
|
padding: 0 0.5em 0 0;
|
||||||
|
color: darken($fg_color,10%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-box {
|
||||||
|
padding: 0.3em 0.5em 0.3em 0.5em;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
&:selected,&:hover { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-page-button-box {
|
||||||
|
height: 2em;
|
||||||
|
.vertical & { padding-top: 0.5em; }
|
||||||
|
.horizontal & { padding-left: 0.5em; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-page-button {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0; }
|
||||||
|
.candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px; }
|
||||||
|
.candidate-page-button-icon { icon-size: 1em; }
|
124
data/theme/gnome-shell-sass/widgets/_keyboard.scss
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/* On-screen Keyboard */
|
||||||
|
|
||||||
|
$key_size: 1.2em;
|
||||||
|
$key_border_radius: $base_border_radius + 3px;
|
||||||
|
$key_bg_color: $bg_color;
|
||||||
|
// $default_key_bg_color: darken($key_bg_color, 4%);
|
||||||
|
$default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten($osd_bg_color, 2%));
|
||||||
|
|
||||||
|
|
||||||
|
// draw keys using button function
|
||||||
|
#keyboard {
|
||||||
|
background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1);
|
||||||
|
box-shadow: inset 0 1px 0 0 $osd_outer_borders_color !important;
|
||||||
|
|
||||||
|
.page-indicator {
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
.page-indicator-icon {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// the container for individual keys
|
||||||
|
.key-container {
|
||||||
|
padding: $base_margin;
|
||||||
|
spacing: $base_margin;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the keys
|
||||||
|
.keyboard-key {
|
||||||
|
|
||||||
|
@include button(normal, $c:$key_bg_color);
|
||||||
|
|
||||||
|
&:focus { @include button(focus);}
|
||||||
|
&:hover, &:checked { @include button(hover, $c: $key_bg_color);}
|
||||||
|
&:active { @include button(active, $c: $key_bg_color); }
|
||||||
|
|
||||||
|
@include fontsize($base_font_size + 5);
|
||||||
|
min-height: $key_size;
|
||||||
|
min-width: $key_size;
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
border-radius: $key_border_radius;
|
||||||
|
|
||||||
|
&:grayed { //FIXMEy
|
||||||
|
background-color: darken($bg_color, 3%);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-color: $osd_borders_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// non-character keys
|
||||||
|
&.default-key {
|
||||||
|
|
||||||
|
// size of the icon asset
|
||||||
|
background-size: 24px;
|
||||||
|
|
||||||
|
@include button(normal, $c:$default_key_bg_color);
|
||||||
|
&:hover, &:checked {@include button(hover, $c: $default_key_bg_color);}
|
||||||
|
&:active { @include button(active, $c: $default_key_bg_color);}
|
||||||
|
}
|
||||||
|
|
||||||
|
// enter key is suggested-action
|
||||||
|
&.enter-key {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/key-enter.svg");
|
||||||
|
|
||||||
|
@include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
&:hover, &:checked { @include button(hover, $c: lighten($selected_bg_color, 3%));}
|
||||||
|
&:active {@include button(active, $c: darken($selected_bg_color, 2%));}
|
||||||
|
}
|
||||||
|
|
||||||
|
// key assets
|
||||||
|
&.shift-key-lowercase {background-image: url("resource:///org/gnome/shell/theme/key-shift.svg");}
|
||||||
|
&.shift-key-uppercase {background-image: url("resource:///org/gnome/shell/theme/key-shift-uppercase.svg");}
|
||||||
|
&.shift-key-uppercase:latched {background-image: url("resource:///org/gnome/shell/theme/key-shift-latched-uppercase.svg");}
|
||||||
|
&.hide-key {background-image: url("resource:///org/gnome/shell/theme/key-hide.svg");}
|
||||||
|
&.layout-key {background-image: url("resource:///org/gnome/shell/theme/key-layout.svg");}
|
||||||
|
}
|
||||||
|
|
||||||
|
// long press on a key popup
|
||||||
|
.keyboard-subkeys {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
-arrow-border-radius: $modal_radius;
|
||||||
|
-arrow-background-color: $osd_bg_color;
|
||||||
|
-arrow-border-width: 1px;
|
||||||
|
-arrow-border-color: lighten($osd_bg_color, 9%);
|
||||||
|
-arrow-base: 20px;
|
||||||
|
-arrow-rise: 10px;
|
||||||
|
-boxpointer-gap: $base_spacing;
|
||||||
|
|
||||||
|
.keyboard-key {
|
||||||
|
@include button(normal, $c:$key_bg_color);
|
||||||
|
|
||||||
|
&:focus { @include button(focus);}
|
||||||
|
&:hover, &:checked { @include button(hover, $c: $key_bg_color);}
|
||||||
|
&:active { @include button(active, $c: $key_bg_color); }
|
||||||
|
|
||||||
|
border-radius:$base_border_radius;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// emoji
|
||||||
|
.emoji-page {
|
||||||
|
.keyboard-key {
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
color: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.emoji-panel {
|
||||||
|
.keyboard-key:latched {
|
||||||
|
border-color: lighten($selected_bg_color, 5%);
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// suggestions
|
||||||
|
.word-suggestions {
|
||||||
|
@include fontsize($base_font_size + 3);
|
||||||
|
spacing: 12px;
|
||||||
|
min-height: 20pt;
|
||||||
|
}
|
151
data/theme/gnome-shell-sass/widgets/_login-dialog.scss
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/* Login Dialog */
|
||||||
|
|
||||||
|
.login-dialog-banner-view {
|
||||||
|
padding-top: 24px;
|
||||||
|
max-width: 23em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog {
|
||||||
|
//reset
|
||||||
|
border: none;
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
$_gdm_bg: lighten(#2e3436, 19%);
|
||||||
|
|
||||||
|
StEntry {
|
||||||
|
@if $variant=='dark' {
|
||||||
|
$_gdm_entry_bg: transparentize(lighten(desaturate(#241f31, 20%), 2%), 0.5);
|
||||||
|
background-color: $_gdm_entry_bg;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog-button-box { spacing: 3px; }
|
||||||
|
.modal-dialog-button {
|
||||||
|
padding: 4px 18px;
|
||||||
|
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
|
||||||
|
background-color: $_gdm_bg;
|
||||||
|
border-color: $_gdm_bg;
|
||||||
|
color: $fg_color;
|
||||||
|
|
||||||
|
$_hover_c: lighten($_gdm_bg, 5%);
|
||||||
|
&:hover, &:focus {
|
||||||
|
background-color: $_hover_c;
|
||||||
|
border-color: $_hover_c;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
$_active_c: darken($_gdm_bg, 5%);
|
||||||
|
box-shadow: none;
|
||||||
|
background-color: $_active_c;
|
||||||
|
border-color: $_active_c;
|
||||||
|
}
|
||||||
|
&:insensitive {
|
||||||
|
@include button(insensitive);
|
||||||
|
border-color: darken($_gdm_bg, 5%);
|
||||||
|
background-color: darken($_gdm_bg, 5%);
|
||||||
|
color: transparentize($fg_color, 0.3);
|
||||||
|
}
|
||||||
|
&:default {
|
||||||
|
@include button(normal, $c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
border-color: $selected_bg_color;
|
||||||
|
&:hover, &:focus {
|
||||||
|
@include button(hover,$c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
$_def_hover_c: lighten($selected_bg_color, 5%);
|
||||||
|
background-color: $_def_hover_c;
|
||||||
|
border-color: $_def_hover_c;
|
||||||
|
}
|
||||||
|
&:active {
|
||||||
|
@include button(active,$c:$selected_bg_color, $tc:$selected_fg_color);
|
||||||
|
$_def_active_c: darken($selected_bg_color, 5%);
|
||||||
|
background-color: $_def_active_c;
|
||||||
|
border-color: $_def_active_c;
|
||||||
|
}
|
||||||
|
&:insensitive {
|
||||||
|
@include button(insensitive);
|
||||||
|
border-color: darken($selected_bg_color, 10%);
|
||||||
|
background-color: darken($selected_bg_color, 10%);
|
||||||
|
color: transparentize($selected_fg_color, 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-logo-bin { padding: 24px 0px; }
|
||||||
|
.login-dialog-banner { color: darken($osd_fg_color,10%); }
|
||||||
|
.login-dialog-button-box { spacing: 5px; }
|
||||||
|
.login-dialog-message-warning { color: $warning_color; }
|
||||||
|
.login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; }
|
||||||
|
.login-dialog-user-selection-box { padding: 100px 0px; }
|
||||||
|
.login-dialog-not-listed-label {
|
||||||
|
padding-left: 2px;
|
||||||
|
.login-dialog-not-listed-button:focus &,
|
||||||
|
.login-dialog-not-listed-button:hover & {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-not-listed-label {
|
||||||
|
@include fontsize($base_font_size - 1);
|
||||||
|
font-weight: bold;
|
||||||
|
color: darken($osd_fg_color,30%);
|
||||||
|
padding-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-view { -st-vfade-offset: 1em; }
|
||||||
|
.login-dialog-user-list {
|
||||||
|
spacing: 12px;
|
||||||
|
width: 23em;
|
||||||
|
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
|
||||||
|
&:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-user-list-item {
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 6px;
|
||||||
|
color: darken($osd_fg_color,30%);
|
||||||
|
&:ltr .user-widget { padding-right: 1em; }
|
||||||
|
&:rtl .user-widget { padding-left: 1em; }
|
||||||
|
.login-dialog-timed-login-indicator {
|
||||||
|
height: 2px;
|
||||||
|
margin-top: 6px;
|
||||||
|
background-color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
&:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-username,
|
||||||
|
.user-widget-label {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
@include fontsize($base_font_size + 2);
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: left;
|
||||||
|
padding-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-widget-label {
|
||||||
|
&:ltr { padding-left: 14px; }
|
||||||
|
&:rtl { padding-right: 14px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-layout {
|
||||||
|
padding-top: 24px;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
width: 23em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-prompt-label {
|
||||||
|
color: darken($osd_fg_color, 20%);
|
||||||
|
@include fontsize($base_font_size + 1);
|
||||||
|
padding-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button StIcon {
|
||||||
|
icon-size: 1.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-dialog-session-list-button {
|
||||||
|
color: darken($osd_fg_color,30%);
|
||||||
|
&:hover,&:focus { color: $osd_fg_color; }
|
||||||
|
&:active { color: darken($osd_fg_color, 50%); }
|
||||||
|
}
|
97
data/theme/gnome-shell-sass/widgets/_looking-glass.scss
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/* Looking Glass */
|
||||||
|
|
||||||
|
// Dialog
|
||||||
|
#LookingGlassDialog {
|
||||||
|
background-color: $osd_bg_color;
|
||||||
|
spacing: $base_spacing;
|
||||||
|
padding: 4px;
|
||||||
|
border: 2px solid transparentize($osd_fg_color, 0.8);
|
||||||
|
border-top-width:0;
|
||||||
|
border-radius: 0 0 $base_border_radius $base_border_radius;
|
||||||
|
|
||||||
|
& > #Toolbar {
|
||||||
|
border: none;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
background-color: darken($osd_bg_color, 10%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.labels { spacing: $base_spacing; }
|
||||||
|
.notebook-tab {
|
||||||
|
-natural-hpadding: $base_padding * 2;
|
||||||
|
-minimum-hpadding: 6px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: $fg_color;
|
||||||
|
transition-duration: 100ms;
|
||||||
|
padding-left: .3em;
|
||||||
|
padding-right: .3em;
|
||||||
|
&:hover {
|
||||||
|
color: white;
|
||||||
|
text-shadow: black 0px 2px 2px;
|
||||||
|
}
|
||||||
|
&:selected {
|
||||||
|
border-bottom-width: 2px;
|
||||||
|
border-color: lighten($selected_bg_color,5%);
|
||||||
|
color: white;
|
||||||
|
text-shadow: black 0px 2px 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StBoxLayout#EvalBox { padding: 4px; spacing: $base_spacing; }
|
||||||
|
StBoxLayout#ResultsArea { spacing: $base_spacing; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-dialog {
|
||||||
|
StEntry {
|
||||||
|
selection-background-color: #bbbbbb;
|
||||||
|
selected-color: $osd_bg_color;
|
||||||
|
}
|
||||||
|
.shell-link {
|
||||||
|
color: #999999;
|
||||||
|
&:hover { color: #dddddd; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-completions-text {
|
||||||
|
font-size: .9em;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-obj-inspector-title {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-obj-inspector-button {
|
||||||
|
border: 1px solid gray;
|
||||||
|
padding: 4px;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
&:hover { border: 1px solid #ffffff; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extensions
|
||||||
|
#lookingGlassExtensions { padding: 4px; }
|
||||||
|
|
||||||
|
.lg-extensions-list {
|
||||||
|
padding: 4px;
|
||||||
|
spacing: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-extension {
|
||||||
|
border: 1px solid $osd_borders_color;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-extension-name {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lg-extension-meta {
|
||||||
|
spacing: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inspector
|
||||||
|
#LookingGlassPropertyInspector {
|
||||||
|
background: $osd_bg_color;
|
||||||
|
border: 1px solid $osd_borders_color;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
padding: 6px;
|
||||||
|
}
|
146
data/theme/gnome-shell-sass/widgets/_message-list.scss
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
/* Message List */
|
||||||
|
// a.k.a. notifications in the menu
|
||||||
|
|
||||||
|
// main list
|
||||||
|
.message-list {
|
||||||
|
width: 31.5em;
|
||||||
|
padding: 0 $base_padding * 2;
|
||||||
|
|
||||||
|
.message-list-placeholder { spacing: 12px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list-sections {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
margin: $base_margin * 4; // to account for scrollbar
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list-section,
|
||||||
|
.message-list-section-list {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-list-section-list {
|
||||||
|
&:ltr {padding:0;}
|
||||||
|
&:rtl {padding:0;}
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear button
|
||||||
|
.message-list-clear-button.button {
|
||||||
|
margin:$base_margin $base_margin*2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// message bubbles
|
||||||
|
.message {
|
||||||
|
@extend %notification_bubble;
|
||||||
|
|
||||||
|
// title
|
||||||
|
.message-title {
|
||||||
|
color: $fg_color;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom:4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// content
|
||||||
|
.message-content {
|
||||||
|
color: darken($fg_color, 10%);
|
||||||
|
padding: $base_padding 0;
|
||||||
|
margin:$base_margin * 2;
|
||||||
|
&:ltr {
|
||||||
|
margin-left: $base_margin;
|
||||||
|
padding-right:$base_padding;
|
||||||
|
}
|
||||||
|
&:rtl {
|
||||||
|
margin-right: $base_margin;
|
||||||
|
padding-left:$base_padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// close button
|
||||||
|
.message-close-button {
|
||||||
|
color: lighten($fg_color, 15%);
|
||||||
|
&:hover { color: if($variant=='light', lighten($fg_color, 30%), darken($fg_color, 10%)); }
|
||||||
|
&:active { color: if($variant=='light', lighten($fg_color, 40%), darken($fg_color, 20%)); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// icon container
|
||||||
|
.message-icon-bin {
|
||||||
|
padding: $base_padding;
|
||||||
|
margin:$base_padding 0;
|
||||||
|
|
||||||
|
&:rtl {
|
||||||
|
// padding: $base_padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
// icon size and color
|
||||||
|
> StIcon {
|
||||||
|
color: $fg_color;
|
||||||
|
icon-size: $base_icon_size*2; // 32px
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
|
||||||
|
padding:0;
|
||||||
|
margin:$base_padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback
|
||||||
|
> .fallback-window-icon {
|
||||||
|
width: $base_icon_size;
|
||||||
|
height: $base_icon_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// secondary container in title box
|
||||||
|
.message-secondary-bin {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
// notification time stamp
|
||||||
|
> .event-time {
|
||||||
|
color: transparentize($fg_color, 0.5);
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
text-align: right;
|
||||||
|
margin: 0 $base_margin * 2;
|
||||||
|
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
|
||||||
|
padding-bottom: $base_padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Media Controls */
|
||||||
|
.message-media-control {
|
||||||
|
padding: $base_padding * 2 $base_padding * 4;
|
||||||
|
color: darken($fg_color, 15%);
|
||||||
|
|
||||||
|
// uses $hover_bg_color since the media controls are in a notification_bubble
|
||||||
|
&:hover {
|
||||||
|
background-color: lighten($hover_bg_color, 5%);
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: darken($hover_bg_color, 2%);
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:insensitive { color: darken($fg_color,40%); }
|
||||||
|
|
||||||
|
// fix border-radius for last button on hover
|
||||||
|
&:last-child:ltr { &:hover {border-radius: 0 $base_border_radius+2 $base_border_radius+2 0;} }
|
||||||
|
&:last-child:rtl { &:hover {border-radius: $base_border_radius+2 0 0 $base_border_radius+2;} }
|
||||||
|
}
|
||||||
|
|
||||||
|
// album-art
|
||||||
|
.media-message-cover-icon {
|
||||||
|
icon-size: $base_icon_size*2 !important; // 48px
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
|
||||||
|
// when there is no artwork
|
||||||
|
&.fallback {
|
||||||
|
color: darken($fg_color, 17%);
|
||||||
|
background-color: $bg_color;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
border-radius: $base_border_radius;
|
||||||
|
icon-size: $base_icon_size * 2 !important;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
}
|
||||||
|
}
|
59
data/theme/gnome-shell-sass/widgets/_misc.scss
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Links/URLs
|
||||||
|
.shell-link {
|
||||||
|
color: $link_color;
|
||||||
|
&:hover { color: lighten($link_color,10%); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.url-highlighter { link-color: $link_color; }
|
||||||
|
|
||||||
|
// Rubberband for select-area screenshots
|
||||||
|
.select-area-rubberband {
|
||||||
|
background-color: transparentize($selected_bg_color,0.7);
|
||||||
|
border: 1px solid $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pointer accessibility notifications
|
||||||
|
.pie-timer {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
-pie-border-width: 3px;
|
||||||
|
-pie-border-color: $selected_bg_color;
|
||||||
|
-pie-background-color: lighten(transparentize($selected_bg_color, 0.7), 40%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Screen zoom/Magnifier
|
||||||
|
.magnifier-zoom-region {
|
||||||
|
border: 2px solid $selected_bg_color;
|
||||||
|
&.full-screen { border-width: 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// User icon
|
||||||
|
.user-icon {
|
||||||
|
background-size: contain;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-radius: 99px;
|
||||||
|
&:hover {
|
||||||
|
color: lighten($osd_fg_color,30%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Input Source Switcher
|
||||||
|
.input-source-switcher-symbol {
|
||||||
|
font-size: 34pt;
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Window cycler highlight
|
||||||
|
.cycler-highlight {
|
||||||
|
border: 5px solid $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Text
|
||||||
|
.headline { @include fontsize($base_font_size + 1); }
|
||||||
|
.lightbox { background-color: black; }
|
||||||
|
.flashspot { background-color: white; }
|
||||||
|
|
||||||
|
|
||||||
|
// Hidden
|
||||||
|
.hidden { color: rgba(0,0,0,0);}
|
56
data/theme/gnome-shell-sass/widgets/_network-dialog.scss
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/* Network Dialogs */
|
||||||
|
.nm-dialog {
|
||||||
|
max-height: 34em;
|
||||||
|
min-height: 31em;
|
||||||
|
min-width: 32em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nm-dialog-content {
|
||||||
|
spacing: 20px;
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nm-dialog-airplane-box { spacing: 12px; }
|
||||||
|
|
||||||
|
.nm-dialog-airplane-headline {
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nm-dialog-airplane-text { color: $fg_color; }
|
||||||
|
|
||||||
|
// header
|
||||||
|
.nm-dialog-header {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.nm-dialog-header-icon {
|
||||||
|
icon-size: $base_icon_size * 2;
|
||||||
|
}
|
||||||
|
.nm-dialog-header-hbox { spacing: 10px; }
|
||||||
|
|
||||||
|
// list of networks
|
||||||
|
.nm-dialog-scroll-view {
|
||||||
|
border: 1px solid $borders_color;
|
||||||
|
padding:0;
|
||||||
|
background-color: darken($bg_color, 3%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// list item
|
||||||
|
.nm-dialog-item {
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
border-bottom: 1px solid $borders_color;
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
spacing: 0px;
|
||||||
|
&:selected {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// icons in list
|
||||||
|
.nm-dialog-icon { icon-size: $base_icon_size; }
|
||||||
|
.nm-dialog-icons { spacing: $base_spacing * 2; }
|
||||||
|
|
||||||
|
// no networks
|
||||||
|
.no-networks-label { color: $insensitive_fg_color; }
|
||||||
|
.no-networks-box { spacing: $base_padding; }
|
90
data/theme/gnome-shell-sass/widgets/_notifications.scss
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/* Notifications & Mesage Tray */
|
||||||
|
|
||||||
|
$notification_banner_height: 64px;
|
||||||
|
$notification_banner_width: 34em;
|
||||||
|
|
||||||
|
// Banner notifications
|
||||||
|
.notification-banner {
|
||||||
|
min-height: $notification_banner_height;
|
||||||
|
width: $notification_banner_width;
|
||||||
|
@include fontsize($base_font_size);
|
||||||
|
margin: $base_margin;
|
||||||
|
border-radius: $modal_radius;
|
||||||
|
|
||||||
|
.message-title { color: $fg_color }
|
||||||
|
.message-content { color: $fg_color; }
|
||||||
|
|
||||||
|
&:hover { background: $bg_color; }
|
||||||
|
&, &:focus, &:active {
|
||||||
|
background-color: $bg_color;
|
||||||
|
.message-title { color: $fg_color }
|
||||||
|
.message-content { color: $fg_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// icon
|
||||||
|
.message-icon-bin > StIcon {
|
||||||
|
icon-size: $base_icon_size * 2;
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-icon {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-content {
|
||||||
|
padding: 5px;
|
||||||
|
spacing: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secondary-icon { icon-size: $base_icon_size; }
|
||||||
|
|
||||||
|
.notification-actions {
|
||||||
|
padding-top: 0;
|
||||||
|
spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-button {
|
||||||
|
@extend %bubble_button;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// counter
|
||||||
|
.summary-source-counter {
|
||||||
|
font-size: $base_font_size - 1pt;
|
||||||
|
font-weight: bold;
|
||||||
|
height: 1.6em;
|
||||||
|
width: 1.6em;
|
||||||
|
-shell-counter-overlap-x: 3px;
|
||||||
|
-shell-counter-overlap-y: 3px;
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
border: 2px solid $fg_color;
|
||||||
|
box-shadow: 0 2px 2px rgba(0,0,0,0.5);
|
||||||
|
border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.secondary-icon { icon-size: $base_icon_size; }
|
||||||
|
|
||||||
|
// chat bubbles
|
||||||
|
.chat-body { spacing: 5px; }
|
||||||
|
.chat-response { margin: 5px; }
|
||||||
|
.chat-log-message { color: darken($fg_color,10%); }
|
||||||
|
.chat-new-group { padding-top: 1em; }
|
||||||
|
.chat-received {
|
||||||
|
padding-left: 4px;
|
||||||
|
&:rtl { padding-left: 0px; padding-right: 4px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-sent {
|
||||||
|
padding-left: 18pt;
|
||||||
|
color: lighten($fg_color, 15%);
|
||||||
|
&:rtl { padding-left: 0; padding-right: 18pt; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-meta-message {
|
||||||
|
padding-left: 4px;
|
||||||
|
@include fontsize($base_font_size - 2);
|
||||||
|
font-weight: bold;
|
||||||
|
color: lighten($fg_color,18%);
|
||||||
|
&:rtl { padding-left: 0; padding-right: 4px; }
|
||||||
|
}
|
45
data/theme/gnome-shell-sass/widgets/_osd.scss
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/* OSD */
|
||||||
|
|
||||||
|
$osd_levelbar_height:8px;
|
||||||
|
|
||||||
|
.osd-window {
|
||||||
|
@extend %osd_panel;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
spacing: $base_spacing * 2; // 12px
|
||||||
|
margin: $base_margin * 8; // 32px
|
||||||
|
min-width: 64px;
|
||||||
|
min-height: 64px;
|
||||||
|
|
||||||
|
StIcon {
|
||||||
|
icon-size:$base_icon_size * 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.osd-monitor-label { font-size: 3em; }
|
||||||
|
|
||||||
|
.level {
|
||||||
|
height: $osd_levelbar_height;
|
||||||
|
-barlevel-height: $osd_levelbar_height;
|
||||||
|
-barlevel-background-color: transparentize($osd_fg_color, if($variant=='light', 0.7, 0.9));
|
||||||
|
-barlevel-active-background-color: $osd_fg_color;
|
||||||
|
-barlevel-overdrive-color: $destructive_color;
|
||||||
|
-barlevel-overdrive-separator-width: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pad OSD */
|
||||||
|
.pad-osd-window {
|
||||||
|
padding: 32px;
|
||||||
|
background-color: transparentize(#000, 0.2);
|
||||||
|
|
||||||
|
.pad-osd-title-box { spacing: 12px; }
|
||||||
|
.pad-osd-title-menu-box { spacing: 6px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.combo-box-label {
|
||||||
|
width: 15em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.resize-popup {
|
||||||
|
@extend %osd_panel;
|
||||||
|
}
|
10
data/theme/gnome-shell-sass/widgets/_overview.scss
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/* OVERVIEW */
|
||||||
|
|
||||||
|
#overview {
|
||||||
|
spacing: 24px;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overview-controls {
|
||||||
|
padding-bottom: 32px;
|
||||||
|
}
|
106
data/theme/gnome-shell-sass/widgets/_panel.scss
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/* Top Bar */
|
||||||
|
// a.k.a. the panel
|
||||||
|
|
||||||
|
$panel_corner_radius: $base_border_radius+1;
|
||||||
|
$panel_bg_color: if($variant == 'light', rgba(0,0,0,0.9), #000);
|
||||||
|
$panel_fg_color: if($variant == 'light', darken($fg_color, 15%), darken($fg_color, 10%));
|
||||||
|
$panel_height: 1.86em;
|
||||||
|
|
||||||
|
|
||||||
|
#panel {
|
||||||
|
background-color: $panel_bg_color;
|
||||||
|
font-weight: bold;
|
||||||
|
height: $panel_height;
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
|
||||||
|
// transparent panel on lock & login screens
|
||||||
|
&.unlock-screen,
|
||||||
|
&.login-screen,
|
||||||
|
&.lock-screen {
|
||||||
|
background-color: transparent;
|
||||||
|
|
||||||
|
.panel-corner {
|
||||||
|
-panel-corner-radius: 0;
|
||||||
|
-panel-corner-background-color: transparent;
|
||||||
|
-panel-corner-border-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// spacing between activities, app menu and such
|
||||||
|
#panelLeft, #panelCenter {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// the rounded outset corners
|
||||||
|
.panel-corner {
|
||||||
|
-panel-corner-radius: $panel_corner_radius;
|
||||||
|
-panel-corner-background-color: $panel_bg_color;
|
||||||
|
-panel-corner-border-width: 2px;
|
||||||
|
-panel-corner-border-color: transparent;
|
||||||
|
|
||||||
|
&:active, &:overview, &:focus {
|
||||||
|
-panel-corner-border-color: lighten($selected_bg_color,5%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// panel menus
|
||||||
|
.panel-button {
|
||||||
|
font-weight: bold;
|
||||||
|
color: $panel_fg_color;
|
||||||
|
-natural-hpadding: $base_padding * 2;
|
||||||
|
-minimum-hpadding: $base_padding;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: lighten($panel_fg_color, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active, &:overview, &:focus, &:checked {
|
||||||
|
background-color: $panel_bg_color; // Trick due to St limitations. It needs a background to draw a box-shadow
|
||||||
|
box-shadow: inset 0 -2px 0 0 lighten($selected_bg_color,5%);
|
||||||
|
|
||||||
|
color: lighten($panel_fg_color, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
// status area icons
|
||||||
|
.system-status-icon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
padding: $base_padding - 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// app menu icon
|
||||||
|
.app-menu-icon {
|
||||||
|
margin-left: $base_margin;
|
||||||
|
margin-right: $base_margin;
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
// dimensions of the icon are hardcoded
|
||||||
|
}
|
||||||
|
|
||||||
|
// lock & login screen styles
|
||||||
|
.unlock-screen &,
|
||||||
|
.login-screen &,
|
||||||
|
.lock-screen & {
|
||||||
|
color: lighten($fg_color, 10%);
|
||||||
|
&:focus, &:hover, &:active { color: lighten($fg_color, 10%); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-status-indicators-box,
|
||||||
|
.panel-status-menu-box {
|
||||||
|
spacing: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// spacing between power icon and (optional) percentage label
|
||||||
|
.power-status.panel-status-indicators-box {
|
||||||
|
spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// indicator for active
|
||||||
|
.screencast-indicator,
|
||||||
|
.remote-access-indicator { color: $warning_color; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// App Menu
|
||||||
|
#appMenu {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
.label-shadow { color: transparent; }
|
||||||
|
}
|
121
data/theme/gnome-shell-sass/widgets/_popovers.scss
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
/* Popovers/Menus */
|
||||||
|
|
||||||
|
$popover_arrow_height: 12px;
|
||||||
|
|
||||||
|
//.the popover itself
|
||||||
|
.popup-menu-boxpointer,
|
||||||
|
.candidate-popup-boxpointer {
|
||||||
|
-arrow-border-radius: $base_border_radius+4;
|
||||||
|
-arrow-background-color: $bg_color;
|
||||||
|
-arrow-border-width: 1px;
|
||||||
|
-arrow-border-color: $borders_color;
|
||||||
|
-arrow-base: $popover_arrow_height * 2;
|
||||||
|
-arrow-rise: $popover_arrow_height;
|
||||||
|
-arrow-box-shadow: 0 1px 3px rgba(0,0,0,0.5); // dreaming bugzilla #689995
|
||||||
|
}
|
||||||
|
|
||||||
|
// container of the popover menu
|
||||||
|
.popup-menu {
|
||||||
|
min-width: 15em;
|
||||||
|
color: $fg_color;
|
||||||
|
|
||||||
|
//.popup-status-menu-item { font-weight: normal; color: pink; } //dunno what that is
|
||||||
|
&.panel-menu {
|
||||||
|
-boxpointer-gap: $base_margin; // distance from the panel
|
||||||
|
margin-bottom: 1.75em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup-menu-content {
|
||||||
|
padding: $base_padding * 2 + $base_margin 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// menu items
|
||||||
|
.popup-menu-item {
|
||||||
|
spacing: $base_padding;
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
&:ltr { padding-right:1.75em; padding-left: 0; }
|
||||||
|
&:rtl { padding-right: 0; padding-left:1.75em; }
|
||||||
|
|
||||||
|
&:checked {
|
||||||
|
background-color: lighten($bg_color, 2%);
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.selected {
|
||||||
|
background-color: transparentize(white, if($variant=='light', 0.2, 0.9));
|
||||||
|
color: $fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:insensitive { color: transparentize($fg_color,0.5);}
|
||||||
|
}
|
||||||
|
|
||||||
|
// all icons and other graphical elements
|
||||||
|
.popup-inactive-menu-item {
|
||||||
|
color: $fg_color;
|
||||||
|
|
||||||
|
&:insensitive { color: transparentize($fg_color,0.5); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// symbolic icons in popover
|
||||||
|
.popup-menu-arrow,
|
||||||
|
.popup-menu-icon { icon-size: $base_icon_size; }
|
||||||
|
|
||||||
|
// popover submenus
|
||||||
|
.popup-sub-menu {
|
||||||
|
background-color: darken($bg_color, 3%);
|
||||||
|
box-shadow: none;
|
||||||
|
border-top: 1px solid transparentize($borders_color, 0.2);
|
||||||
|
border-bottom: 1px solid transparentize($borders_color, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// container for radio and check boxes
|
||||||
|
.popup-menu-ornament {
|
||||||
|
text-align: right;
|
||||||
|
width: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
// separator
|
||||||
|
.popup-separator-menu-item {
|
||||||
|
//-margin-horizontal: 24px;
|
||||||
|
height: 1px; //not really the whole box
|
||||||
|
margin: 6px 64px;
|
||||||
|
background-color: lighten($borders_color, 2%);
|
||||||
|
border: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// desktop background menu
|
||||||
|
.background-menu {
|
||||||
|
-boxpointer-gap: $base_margin;
|
||||||
|
-arrow-rise: 0px; // hide the beak on the menu
|
||||||
|
}
|
||||||
|
|
||||||
|
// system status menu
|
||||||
|
.aggregate-menu {
|
||||||
|
min-width: 21em;
|
||||||
|
|
||||||
|
// lock screen, shutdown, etc. buttons
|
||||||
|
.popup-menu-icon {
|
||||||
|
padding:0;
|
||||||
|
margin: 0 $base_margin;
|
||||||
|
-st-icon-style: symbolic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.popup-sub-menu .popup-menu-item > :first-child {
|
||||||
|
// account for icons in submenus with padding
|
||||||
|
&:ltr {
|
||||||
|
padding-left: $base_padding + $base_margin * 2;
|
||||||
|
margin-left: $base_icon_size;
|
||||||
|
}
|
||||||
|
&:rtl {
|
||||||
|
padding-right: $base_padding + $base_margin * 2; ;
|
||||||
|
margin-right: $base_icon_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
83
data/theme/gnome-shell-sass/widgets/_screen-shield.scss
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/* Screen Shield */
|
||||||
|
|
||||||
|
$_screenshield_shadow: 0px 0px 6px rgba(0, 0, 0, 0.726);
|
||||||
|
|
||||||
|
.screen-shield-arrows {
|
||||||
|
padding-bottom: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-arrows Gjs_Arrow {
|
||||||
|
color: white;
|
||||||
|
width: 80px;
|
||||||
|
height: 48px;
|
||||||
|
-arrow-thickness: 12px;
|
||||||
|
-arrow-shadow: $_screenshield_shadow;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-clock {
|
||||||
|
color: white;
|
||||||
|
text-shadow: $_screenshield_shadow;
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-clock-time {
|
||||||
|
font-size: 72pt;
|
||||||
|
text-shadow: $_screenshield_shadow;
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-clock-date {
|
||||||
|
font-size: 28pt;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-notifications-container {
|
||||||
|
spacing: 6px;
|
||||||
|
width: 30em;
|
||||||
|
background-color: transparent;
|
||||||
|
max-height: 500px;
|
||||||
|
.summary-notification-stack-scrollview {
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification,
|
||||||
|
.screen-shield-notification-source {
|
||||||
|
padding: 12px 6px;
|
||||||
|
border: 1px solid $osd_outer_borders_color;
|
||||||
|
background-color: transparentize($osd_bg_color,0.5);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.notification { margin-right: 15px; } //compensate for space allocated to the scrollbar
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.screen-shield-notification-label {
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0px 0px 0px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screen-shield-notification-count-text { padding: 0px 0px 0px 12px; }
|
||||||
|
|
||||||
|
#panel.lock-screen { background-color: transparentize($osd_bg_color, 0.5); }
|
||||||
|
|
||||||
|
.screen-shield-background { //just the shadow, really
|
||||||
|
background: black;
|
||||||
|
box-shadow: 0px 2px 4px rgba(0,0,0,0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
#lockDialogGroup {
|
||||||
|
background: lighten(#2e3436, 8%) url(resource:///org/gnome/shell/theme/noise-texture.png);
|
||||||
|
background-repeat: repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
#screenShieldNotifications {
|
||||||
|
StButton#vhandle, StButton#hhandle {
|
||||||
|
background-color: transparentize($bg_color,0.7);
|
||||||
|
&:hover, &:focus { background-color: transparentize($bg_color,0.5); }
|
||||||
|
&:active { background-color: transparentize($selected_bg_color,0.5); }
|
||||||
|
}
|
||||||
|
}
|
29
data/theme/gnome-shell-sass/widgets/_scrollbars.scss
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/* Scrollbars */
|
||||||
|
|
||||||
|
StScrollView {
|
||||||
|
&.vfade { -st-vfade-offset: 68px; }
|
||||||
|
&.hfade { -st-hfade-offset: 68px; }
|
||||||
|
}
|
||||||
|
|
||||||
|
StScrollBar {
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
StScrollView & {
|
||||||
|
min-width: 14px;
|
||||||
|
min-height: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
StBin#trough {
|
||||||
|
border-radius: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
StButton#vhandle, StButton#hhandle {
|
||||||
|
border-radius: 8px;
|
||||||
|
background-color: mix($fg_color, $bg_color, 60%);
|
||||||
|
//border: 3px solid transparent; //would be nice to margin or at least to transparent
|
||||||
|
margin: 3px;
|
||||||
|
&:hover { background-color: mix($fg_color, $bg_color, 80%); }
|
||||||
|
&:active { background-color: $selected_bg_color; }
|
||||||
|
}
|
||||||
|
}
|
35
data/theme/gnome-shell-sass/widgets/_search-entry.scss
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Search entry
|
||||||
|
|
||||||
|
$search_entry_width: 320px;
|
||||||
|
$search_entry_height: 36px;
|
||||||
|
|
||||||
|
%search_entry,
|
||||||
|
.search-entry {
|
||||||
|
width: $search_entry_width;
|
||||||
|
padding: $base_padding+1 $base_padding+3;
|
||||||
|
border-radius: $search_entry_height * 0.5; // half the height
|
||||||
|
color: transparentize($fg_color,0.3);
|
||||||
|
background-color: $bg_color;
|
||||||
|
border-color: $borders_color;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: $hover_bg_color;
|
||||||
|
border-color: $hover_borders_color;
|
||||||
|
color: $hover_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
padding: $base_padding $base_padding+2; // 1px less to account for wider border
|
||||||
|
border-width: 2px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: $selected_bg_color;
|
||||||
|
color: $fg_color;
|
||||||
|
box-shadow: inset 0 1px 2px 1px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-entry-icon {
|
||||||
|
icon-size: $base_icon_size;
|
||||||
|
padding: 0 4px;
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
}
|
151
data/theme/gnome-shell-sass/widgets/_search-results.scss
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/* Search */
|
||||||
|
|
||||||
|
// search overview container
|
||||||
|
#searchResultsContent {
|
||||||
|
max-width: 1024px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search results sections "the boxes"
|
||||||
|
.search-section {
|
||||||
|
spacing: $base_margin * 2;
|
||||||
|
padding:0 !important;
|
||||||
|
margin:0 !important;
|
||||||
|
background-color:transparent;
|
||||||
|
box-shadow:none;
|
||||||
|
border:none;
|
||||||
|
// separator
|
||||||
|
.search-section-separator {
|
||||||
|
// margin-top: $base_padding * 2;
|
||||||
|
// height: 1px;
|
||||||
|
// background-color: $osd_outer_borders_color;
|
||||||
|
height: 0;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// content
|
||||||
|
.search-section-content {
|
||||||
|
background-color: transparentize(lighten($osd_bg_color, 5%), 0.2);
|
||||||
|
border-radius: $modal_radius+3;
|
||||||
|
border: 1px solid $osd_outer_borders_color;
|
||||||
|
box-shadow: 0 2px 4px 0 $shadow_color;
|
||||||
|
text-shadow: 0 1px if($variant == 'light', rgba(255,255,255,0.2), rgba(0,0,0,0.2));
|
||||||
|
color: $osd_fg_color;
|
||||||
|
padding: $base_padding * 3;
|
||||||
|
margin: $base_margin 0;
|
||||||
|
spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// "no results" text
|
||||||
|
.search-statustext {
|
||||||
|
@extend %status_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search results with icons
|
||||||
|
.grid-search-result {
|
||||||
|
> .overview-icon {
|
||||||
|
@extend %icon_tile;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
> .overview-icon.overview-icon-with-label {
|
||||||
|
padding: 10px 8px 5px 8px;
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:selected {
|
||||||
|
.overview-icon {
|
||||||
|
background-color: transparentize($osd_bg_color,0.8);
|
||||||
|
color: $osd_fg_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:drop .overview-icon {
|
||||||
|
background-color: transparentize($selected_bg_color,.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active .overview-icon,
|
||||||
|
&:checked .overview-icon {
|
||||||
|
background-color: transparentize(darken($osd_bg_color,10%), 0.5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// search result provider
|
||||||
|
.search-provider-icon {
|
||||||
|
@extend %icon_tile;
|
||||||
|
|
||||||
|
padding: $base_padding;
|
||||||
|
spacing: 0;
|
||||||
|
margin-right: $base_margin * 2;
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:selected,
|
||||||
|
&:hover {
|
||||||
|
background-color: transparentize($osd_fg_color,.9);
|
||||||
|
transition-duration: 200ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active,
|
||||||
|
&:checked {
|
||||||
|
background-color: transparentize(darken($osd_bg_color,10%),.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// content
|
||||||
|
.list-search-provider-content {
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
|
||||||
|
// provider labels
|
||||||
|
.list-search-provider-details {
|
||||||
|
width: 120px;
|
||||||
|
margin-top: 0;
|
||||||
|
color: darken($osd_fg_color, 8%);
|
||||||
|
// font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// search results list
|
||||||
|
.list-search-results {
|
||||||
|
spacing: $base_spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// search result listitem
|
||||||
|
.list-search-result {
|
||||||
|
@extend %icon_tile;
|
||||||
|
spacing: 0;
|
||||||
|
padding: $base_padding;
|
||||||
|
color: $osd_fg_color;
|
||||||
|
|
||||||
|
border-radius: $base_border_radius + 2px !important;
|
||||||
|
|
||||||
|
&:focus,
|
||||||
|
&:selected,
|
||||||
|
&:hover {
|
||||||
|
background-color: transparentize($osd_fg_color,.9);
|
||||||
|
transition-duration: 200ms;
|
||||||
|
}
|
||||||
|
&:active,
|
||||||
|
&:checked {
|
||||||
|
background-color: transparentize(darken($osd_bg_color,10%),.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// content
|
||||||
|
.list-search-result-content {
|
||||||
|
spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list item title
|
||||||
|
.list-search-result-title {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
padding-right: $base_padding;
|
||||||
|
// font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list item description
|
||||||
|
.list-search-result-description {
|
||||||
|
color: darken($osd_fg_color, 30%);
|
||||||
|
}
|
||||||
|
}
|
27
data/theme/gnome-shell-sass/widgets/_slider.scss
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/* Slider */
|
||||||
|
|
||||||
|
$slider_size: 15px;
|
||||||
|
|
||||||
|
.slider {
|
||||||
|
height: $slider_size;
|
||||||
|
// slider trough
|
||||||
|
-barlevel-height: 3px; // has to be an odd number
|
||||||
|
-barlevel-background-color: $borders_color; //background of the trough
|
||||||
|
-barlevel-border-width: 1px;
|
||||||
|
-barlevel-border-color: $borders_color; // trough border color
|
||||||
|
// fill style
|
||||||
|
-barlevel-active-background-color: $selected_bg_color; //active trough fill
|
||||||
|
-barlevel-active-border-color: if($variant == 'light', darken($selected_bg_color, 4%), lighten($selected_bg_color, 2%)); //active trough border
|
||||||
|
// overfill style (red in this case)
|
||||||
|
-barlevel-overdrive-color: $destructive_color;
|
||||||
|
-barlevel-overdrive-border-color: if($variant == 'light', darken($destructive_color, 4%), lighten($destructive_color, 2%)); //trough border when red;
|
||||||
|
-barlevel-overdrive-separator-width:1px;
|
||||||
|
// slider hander
|
||||||
|
-slider-handle-radius: $slider_size * 0.5; // half the size of the size
|
||||||
|
-slider-handle-border-width: 1px;
|
||||||
|
-slider-handle-border-color: if($variant == 'light', $borders_color, $fg_color);
|
||||||
|
|
||||||
|
color: if($variant == 'light', lighten($bg_color, 10%), $fg_color);
|
||||||
|
&:hover { color: $hover_bg_color; }
|
||||||
|
&:active { color: $active_bg_color; }
|
||||||
|
}
|
16
data/theme/gnome-shell-sass/widgets/_switches.scss
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/* Switches */
|
||||||
|
|
||||||
|
// these are equal to the size of the SVG assets
|
||||||
|
$switch_height: 22px;
|
||||||
|
$switch_width: 46px;
|
||||||
|
|
||||||
|
.toggle-switch {
|
||||||
|
color: $fg_color;
|
||||||
|
height: $switch_height;
|
||||||
|
width: $switch_width;
|
||||||
|
background-size: contain;
|
||||||
|
background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-off.svg"),url("resource:///org/gnome/shell/theme/toggle-off-dark.svg"));
|
||||||
|
&:checked {
|
||||||
|
background-image: if($variant == 'light', url("resource:///org/gnome/shell/theme/toggle-on.svg"),url("resource:///org/gnome/shell/theme/toggle-on-dark.svg"));
|
||||||
|
}
|
||||||
|
}
|
19
data/theme/gnome-shell-sass/widgets/_tiled-previews.scss
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
/* Tiled window previews */
|
||||||
|
$tile_corner_radius: $base_border_radius + 1px;
|
||||||
|
.tile-preview {
|
||||||
|
background-color: transparentize($selected_bg_color,0.5);
|
||||||
|
border: 1px solid $selected_bg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-left.on-primary {
|
||||||
|
border-radius: $tile_corner_radius 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-right.on-primary {
|
||||||
|
border-radius: 0 $tile_corner_radius 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile-preview-left.tile-preview-right.on-primary {
|
||||||
|
border-radius: $tile_corner_radius $tile_corner_radius 0 0;
|
||||||
|
}
|
66
data/theme/gnome-shell-sass/widgets/_window-picker.scss
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* Window Picker */
|
||||||
|
|
||||||
|
$window_picker_spacing: $base_spacing * 8; // 48px
|
||||||
|
$window_picker_padding: $base_padding * 10; // 60px
|
||||||
|
|
||||||
|
$window_thumbnail_border_color:transparentize($selected_fg_color, 0.65);
|
||||||
|
|
||||||
|
$window_close_button_size: 24px;
|
||||||
|
$window_close_button_padding: 3px;
|
||||||
|
|
||||||
|
|
||||||
|
// Window picker
|
||||||
|
.window-picker {
|
||||||
|
// Space between window thumbnails
|
||||||
|
-horizontal-spacing: $window_picker_spacing;
|
||||||
|
-vertical-spacing: $window_picker_spacing;
|
||||||
|
// Padding for container around window thumbnails
|
||||||
|
padding: $window_picker_padding;
|
||||||
|
|
||||||
|
&.external-monitor { padding: $window_picker_padding; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Borders on window thumbnails
|
||||||
|
.window-clone-border {
|
||||||
|
border-width: 6px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: $window_thumbnail_border_color;
|
||||||
|
border-radius: $base_border_radius + 2;
|
||||||
|
// For window decorations with round corners we can't match
|
||||||
|
// the exact shape when the window is scaled. So apply a shadow
|
||||||
|
// to fix that case
|
||||||
|
box-shadow: inset 0 0 0 1px transparentize($borders_color, 0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Window titles
|
||||||
|
.window-caption {
|
||||||
|
color: $osd_fg_color;
|
||||||
|
background-color: $osd_bg_color;
|
||||||
|
border:1px solid $osd_outer_borders_color;
|
||||||
|
border-radius: $base_border_radius + 1;
|
||||||
|
padding: $base_padding $base_padding * 2;
|
||||||
|
font-weight: bold;
|
||||||
|
@include fontsize($base_font_size + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close button
|
||||||
|
.window-close {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
border: none;
|
||||||
|
border-radius: $window_close_button_size * 0.5 + $window_close_button_padding * 2;
|
||||||
|
padding: $window_close_button_padding;
|
||||||
|
height: $window_close_button_size;
|
||||||
|
width: $window_close_button_size;
|
||||||
|
box-shadow: -1px 1px 5px 0px rgba(0,0,0,0.5);
|
||||||
|
|
||||||
|
-shell-close-overlap: $window_close_button_size * 0.5;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: lighten($selected_bg_color, 5%);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: darken($selected_bg_color, 5%);
|
||||||
|
}
|
||||||
|
}
|
72
data/theme/gnome-shell-sass/widgets/_workspace-switcher.scss
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/* Workspace Switcher */
|
||||||
|
.workspace-switcher-group {
|
||||||
|
padding: $base_padding * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-switcher-container {
|
||||||
|
@extend %osd_panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
.workspace-switcher {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
padding: 0;
|
||||||
|
spacing: $base_spacing * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ws-switcher-box {
|
||||||
|
// background: transparent;
|
||||||
|
background: transparent;
|
||||||
|
height: 50px;
|
||||||
|
background-size: 32px;
|
||||||
|
border: 1px solid transparentize($osd_fg_color,0.9);
|
||||||
|
border-radius: $base_border_radius + 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// active workspace in the switcher
|
||||||
|
.ws-switcher-active-up,
|
||||||
|
.ws-switcher-active-down,
|
||||||
|
.ws-switcher-active-left,
|
||||||
|
.ws-switcher-active-right {
|
||||||
|
background-color: $selected_bg_color;
|
||||||
|
border: 1px solid if($variant=='light', darken($selected_bg_color, 8%), lighten($selected_bg_color, 5%));
|
||||||
|
border-radius: $base_border_radius + 3px;
|
||||||
|
color: $selected_fg_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workspace pager */
|
||||||
|
|
||||||
|
// thumbnails in overview
|
||||||
|
.workspace-thumbnails {
|
||||||
|
@extend %overview_panel;
|
||||||
|
visible-width: 32px; //amount visible before hover
|
||||||
|
spacing: $base_spacing;
|
||||||
|
padding: $base_padding;
|
||||||
|
|
||||||
|
border-radius: $modal_radius 0 0 $modal_radius;
|
||||||
|
border-right-width: 0 !important;
|
||||||
|
//fixme: can't have non uniform borders :(
|
||||||
|
border-top-left-radius:0 !important;
|
||||||
|
border-bottom-left-radius:0 !important;
|
||||||
|
|
||||||
|
&:rtl {
|
||||||
|
border-radius: 0 $modal_radius $modal_radius 0;
|
||||||
|
border-left-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
// drag and drop indicator
|
||||||
|
.placeholder {
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/dash-placeholder.svg");
|
||||||
|
background-size: contain;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// selected indicator
|
||||||
|
.workspace-thumbnail-indicator {
|
||||||
|
border: 3px solid $selected_bg_color;
|
||||||
|
border-radius: 3px;
|
||||||
|
padding: 0px;
|
||||||
|
// background-color: transparentize($selected_bg_color, 0.9);
|
||||||
|
}
|
@ -3,3 +3,4 @@ $variant: 'dark';
|
|||||||
@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";
|
||||||
|
@ -1,109 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" class="keyboard-key" width="24" height="24">
|
||||||
<svg
|
<path overflow="visible" font-weight="400" style="line-height:normal;-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration-line:none;text-transform:none;marker:none" d="M10 23H8.5c-.398 0-.796-.14-1.079-.422L.345 15.5l7.078-7.078C7.704 8.14 8.102 8 8.5 8H10v1.5c0 .398-.14.796-.422 1.079L4.657 15.5l4.921 4.922c.282.282.422.68.422 1.078z" color="#000" font-family="Bitstream Vera Sans" fill="#fff"/>
|
||||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
<path overflow="visible" d="M22 1.5v9a5 5 0 01-5 5H4" style="marker:none" color="#000" fill="none" stroke="#fff" stroke-width="3"/>
|
||||||
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
version="1.1"
|
|
||||||
id="svg7384"
|
|
||||||
height="32"
|
|
||||||
sodipodi:docname="key-enter.svg"
|
|
||||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1744"
|
|
||||||
inkscape:window-height="866"
|
|
||||||
id="namedview19"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="14.75"
|
|
||||||
inkscape:cx="7.9322034"
|
|
||||||
inkscape:cy="14.554666"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="55"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg7384" />
|
|
||||||
<metadata
|
|
||||||
id="metadata90">
|
|
||||||
<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>Gnome Symbolic Icon Theme</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<title
|
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
|
||||||
<defs
|
|
||||||
id="defs7386">
|
|
||||||
<linearGradient
|
|
||||||
osb:paint="solid"
|
|
||||||
id="linearGradient19282"
|
|
||||||
gradientTransform="matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#666666;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop19284" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer9" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer10" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer11" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer13" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer14" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer15" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g71291" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g4953" />
|
|
||||||
<g
|
|
||||||
transform="matrix(2,0,0,2,-281.56285,-1615.0002)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer12">
|
|
||||||
<path
|
|
||||||
id="path16589"
|
|
||||||
d="m 148.00015,821.0002 h -1 c -0.26528,0 -0.53057,-0.093 -0.71875,-0.2812 l -3.71875,-3.7188 c 0,0 2.47917,-2.4792 3.71875,-3.7187 0.18817,-0.1882 0.45344,-0.2813 0.71875,-0.2813 h 1 v 1 c 0,0.2653 -0.0931,0.5306 -0.28125,0.7188 l -2.28125,2.2812 2.28125,2.2813 c 0.18811,0.1881 0.28129,0.4534 0.28125,0.7187 z"
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:accumulate"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:#bebebe;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
|
||||||
d="m 154.0002,810 v 4.5 c 0,1.3807 -1.11929,2.5 -2.5,2.5 h -6.50005"
|
|
||||||
id="path16591"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 676 B |
@ -1,114 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
|
||||||
<svg
|
<path d="M12 20.875L.562 9.438C.171 9.046 0 8.51 0 8V6h2c.511 0 1.046.17 1.438.563L12 15.125l8.563-8.562C20.953 6.17 21.488 6 22 6h2v2c0 .511-.17 1.046-.563 1.438z" fill="#e5e5e5"/>
|
||||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
|
||||||
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
version="1.1"
|
|
||||||
id="svg7384"
|
|
||||||
height="32"
|
|
||||||
sodipodi:docname="key-hide.svg"
|
|
||||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1919"
|
|
||||||
inkscape:window-height="1011"
|
|
||||||
id="namedview19"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="14.75"
|
|
||||||
inkscape:cx="-12.338983"
|
|
||||||
inkscape:cy="14.554666"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="55"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg7384" />
|
|
||||||
<metadata
|
|
||||||
id="metadata90">
|
|
||||||
<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>Gnome Symbolic Icon Theme</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<title
|
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
|
||||||
<defs
|
|
||||||
id="defs7386">
|
|
||||||
<linearGradient
|
|
||||||
osb:paint="solid"
|
|
||||||
id="linearGradient19282"
|
|
||||||
gradientTransform="matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#666666;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop19284" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer9" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer10" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer11" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer13" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer14" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer15" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g71291" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g4953" />
|
|
||||||
<g
|
|
||||||
style="display:inline"
|
|
||||||
inkscape:label="go-down"
|
|
||||||
id="g11722"
|
|
||||||
transform="matrix(2,0,0,2,-362.0004,-1494)">
|
|
||||||
<rect
|
|
||||||
transform="rotate(90)"
|
|
||||||
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1;marker:none;enable-background:new"
|
|
||||||
id="rect11718"
|
|
||||||
y="-197.0002"
|
|
||||||
x="747"
|
|
||||||
height="16"
|
|
||||||
width="16" />
|
|
||||||
<path
|
|
||||||
style="display:inline;fill:#e5e5e5;fill-opacity:1;stroke:none"
|
|
||||||
d="m 189.0002,759.4375 -5.71875,-5.7187 C 183.08558,753.5229 183.0002,753.2556 183.0002,753 v -1 h 1 c 0.25562,0 0.52288,0.085 0.71875,0.2813 l 4.28125,4.2812 4.28125,-4.2812 C 193.47732,752.0854 193.74458,752 194.0002,752 h 1 v 1 c 0,0.2556 -0.0854,0.5229 -0.28125,0.7188 z"
|
|
||||||
id="path11720"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccscsccsscscc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 278 B |
@ -1,129 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" class="keyboard-key" width="24" height="24">
|
||||||
<svg
|
<path d="M4.5 2v21" fill="#e5e5e5" fill-rule="evenodd" stroke="#e5e5e5" stroke-width="3"/>
|
||||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
<path d="M4 12h6l2 4h8V6h-6l-2-4H4z" fill="none" stroke="#e5e5e5" stroke-width="2" stroke-linejoin="round"/>
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
<path d="M4 12h6l2 4h8V6h-6l-2-4H4z" fill="#e5e5e5" fill-rule="evenodd"/>
|
||||||
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
version="1.1"
|
|
||||||
id="svg7384"
|
|
||||||
height="32"
|
|
||||||
sodipodi:docname="key-layout.svg"
|
|
||||||
inkscape:version="0.92.3 (2405546, 2018-03-11)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="3440"
|
|
||||||
inkscape:window-height="1376"
|
|
||||||
id="namedview19"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="1"
|
|
||||||
inkscape:cx="46.246852"
|
|
||||||
inkscape:cy="17.474578"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="27"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="svg7384">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid861" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata90">
|
|
||||||
<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>Gnome Symbolic Icon Theme</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<title
|
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
|
||||||
<defs
|
|
||||||
id="defs7386">
|
|
||||||
<linearGradient
|
|
||||||
osb:paint="solid"
|
|
||||||
id="linearGradient19282"
|
|
||||||
gradientTransform="matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#666666;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop19284" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer9" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer10" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer11" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer13" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer14" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer15" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g71291" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g4953" />
|
|
||||||
<g
|
|
||||||
style="stroke-width:0.5;enable-background:new"
|
|
||||||
id="g3561"
|
|
||||||
inkscape:label="preferences-desktop-locale"
|
|
||||||
transform="matrix(2,0,0,2,135.99464,-895.9793)">
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="cc"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path3535"
|
|
||||||
d="m -65,450 v 12"
|
|
||||||
style="fill:#e5e5e5;fill-opacity:1;fill-rule:evenodd;stroke:#e5e5e5;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
sodipodi:nodetypes="ccccccccc"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path3537"
|
|
||||||
d="m -65,456 h 4 l 1,2 h 5 v -6 h -4 l -1,-2 h -5 z"
|
|
||||||
style="fill:none;fill-rule:evenodd;stroke:#e5e5e5;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
|
||||||
<path
|
|
||||||
style="opacity:1;vector-effect:none;fill:#e5e5e5;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
d="m -65,456 h 4 l 1,2 h 5 v -6 h -4 l -1,-2 h -5 z"
|
|
||||||
id="path3539"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccccccccc" />
|
|
||||||
<rect
|
|
||||||
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0.89050001;marker:none;enable-background:new"
|
|
||||||
id="rect3543"
|
|
||||||
y="448"
|
|
||||||
x="-68"
|
|
||||||
height="16"
|
|
||||||
width="16" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 378 B |
@ -1,109 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
|
||||||
<svg
|
<path style="marker:none" d="M12 0L2 12h6v6h8v-6h6zM8 21v3h8v-3z" color="#000" overflow="visible" fill="#3584e4"/>
|
||||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
|
||||||
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
version="1.1"
|
|
||||||
id="svg7384"
|
|
||||||
height="32"
|
|
||||||
sodipodi:docname="key-shift-latched-uppercase.svg"
|
|
||||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1791"
|
|
||||||
inkscape:window-height="984"
|
|
||||||
id="namedview19"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="14.75"
|
|
||||||
inkscape:cx="-0.77966097"
|
|
||||||
inkscape:cy="18.847458"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="55"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg7384" />
|
|
||||||
<metadata
|
|
||||||
id="metadata90">
|
|
||||||
<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>Gnome Symbolic Icon Theme</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<title
|
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
|
||||||
<defs
|
|
||||||
id="defs7386">
|
|
||||||
<linearGradient
|
|
||||||
osb:paint="solid"
|
|
||||||
id="linearGradient19282"
|
|
||||||
gradientTransform="matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#666666;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop19284" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer9" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer10" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer11" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer13" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer14" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer15" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g71291" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g4953" />
|
|
||||||
<g
|
|
||||||
transform="matrix(2,0,0,2,-282.0004,-1614.2187)"
|
|
||||||
style="display:inline;fill:#006098;fill-opacity:1"
|
|
||||||
id="layer12">
|
|
||||||
<path
|
|
||||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#006098;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new"
|
|
||||||
d="m 147,818 v -4 h -3.1248 l 5.125,-5.7813 5.125,5.7813 h -3.1875 v 4 z"
|
|
||||||
id="path16532"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
id="path16534"
|
|
||||||
d="m 147,822 v -2 h 3.9377 v 2 z"
|
|
||||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#006098;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 211 B |
@ -1,104 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
|
||||||
<svg
|
<path d="M8 22v-8H2L12 2l10 12h-6v8z" style="marker:none" color="#000" overflow="visible" fill="#3584e4"/>
|
||||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
|
||||||
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
version="1.1"
|
|
||||||
id="svg7384"
|
|
||||||
height="32"
|
|
||||||
sodipodi:docname="key-shift-uppercase.svg"
|
|
||||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="2160"
|
|
||||||
inkscape:window-height="1311"
|
|
||||||
id="namedview18"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="14.75"
|
|
||||||
inkscape:cx="-27.898305"
|
|
||||||
inkscape:cy="8"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="55"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:current-layer="svg7384" />
|
|
||||||
<metadata
|
|
||||||
id="metadata90">
|
|
||||||
<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>Gnome Symbolic Icon Theme</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<title
|
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
|
||||||
<defs
|
|
||||||
id="defs7386">
|
|
||||||
<linearGradient
|
|
||||||
osb:paint="solid"
|
|
||||||
id="linearGradient19282"
|
|
||||||
gradientTransform="matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#666666;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop19284" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer9" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer10" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer11" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer13" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
id="layer14" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer15" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g71291" />
|
|
||||||
<g
|
|
||||||
transform="translate(-141.0002,-791)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g4953" />
|
|
||||||
<g
|
|
||||||
transform="matrix(2,0,0,2,-282.0008,-1614.2187)"
|
|
||||||
style="display:inline;fill:#006098;fill-opacity:1"
|
|
||||||
id="layer12">
|
|
||||||
<path
|
|
||||||
id="path16548"
|
|
||||||
d="m 147.0002,820 v -4 h -3.1248 l 5.125,-5.7813 5.125,5.7813 h -3.1875 v 4 z"
|
|
||||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#006098;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 203 B |
@ -1,108 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
|
||||||
<svg
|
<path d="M8 22v-8H2L12 2l10 12h-6v8z" style="marker:none" color="#000" overflow="visible" fill="#bebebe"/>
|
||||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
|
||||||
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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
version="1.1"
|
|
||||||
id="svg7384"
|
|
||||||
height="32"
|
|
||||||
sodipodi:docname="key-shift.svg"
|
|
||||||
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)">
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1400"
|
|
||||||
inkscape:window-height="1034"
|
|
||||||
id="namedview4569"
|
|
||||||
showgrid="false"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0"
|
|
||||||
inkscape:zoom="14.75"
|
|
||||||
inkscape:cx="1.5993763"
|
|
||||||
inkscape:cy="5"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="55"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg7384" />
|
|
||||||
<metadata
|
|
||||||
id="metadata90">
|
|
||||||
<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>Gnome Symbolic Icon Theme</dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<title
|
|
||||||
id="title9167">Gnome Symbolic Icon Theme</title>
|
|
||||||
<defs
|
|
||||||
id="defs7386">
|
|
||||||
<linearGradient
|
|
||||||
osb:paint="solid"
|
|
||||||
id="linearGradient19282"
|
|
||||||
gradientTransform="matrix(-2.7365795,0.28202934,-0.18908311,-0.99988321,239.54008,-879.45557)">
|
|
||||||
<stop
|
|
||||||
style="stop-color:#666666;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop19284" />
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer9" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer10" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
id="layer11" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer13" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
id="layer14" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer15" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g71291" />
|
|
||||||
<g
|
|
||||||
transform="translate(-143.8754,-788)"
|
|
||||||
style="display:inline"
|
|
||||||
id="g4953" />
|
|
||||||
<g
|
|
||||||
transform="matrix(2,0,0,2,-282.0008,-1614.2187)"
|
|
||||||
style="display:inline"
|
|
||||||
id="layer12">
|
|
||||||
<path
|
|
||||||
id="path16548"
|
|
||||||
d="m 147.0002,820 v -4 h -3.1248 l 5.125,-5.7813 5.125,5.7813 h -3.1875 v 4 z"
|
|
||||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:2;marker:none;enable-background:new"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 203 B |
@ -4,7 +4,40 @@ 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/_app-grid.scss',
|
||||||
|
'gnome-shell-sass/widgets/_app-switcher.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/_end-session-dialog.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/_switches.scss',
|
||||||
|
'gnome-shell-sass/widgets/_tiled-previews.scss',
|
||||||
|
'gnome-shell-sass/widgets/_window-picker.scss',
|
||||||
|
'gnome-shell-sass/widgets/_workspace-switcher.scss'
|
||||||
])
|
])
|
||||||
|
|
||||||
styles = [
|
styles = [
|
||||||
@ -23,3 +56,4 @@ foreach style: styles
|
|||||||
],
|
],
|
||||||
depend_files: theme_sources)
|
depend_files: theme_sources)
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
|
@ -66,4 +66,11 @@ its dependencies to build from tarballs.</description>
|
|||||||
<gnome:userid>fmuellner</gnome:userid>
|
<gnome:userid>fmuellner</gnome:userid>
|
||||||
</foaf:Person>
|
</foaf:Person>
|
||||||
</maintainer>
|
</maintainer>
|
||||||
|
<maintainer>
|
||||||
|
<foaf:Person>
|
||||||
|
<foaf:name>Georges Basile Stavracas Neto</foaf:name>
|
||||||
|
<foaf:mbox rdf:resource="mailto:gbsneto@gnome.org" />
|
||||||
|
<gnome:userid>gbsneto</gnome:userid>
|
||||||
|
</foaf:Person>
|
||||||
|
</maintainer>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -8,7 +8,6 @@ const Format = imports.format;
|
|||||||
|
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
|
||||||
const ExtensionUtils = imports.misc.extensionUtils;
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
@ -692,8 +691,5 @@ function initEnvironment() {
|
|||||||
function main(argv) {
|
function main(argv) {
|
||||||
initEnvironment();
|
initEnvironment();
|
||||||
|
|
||||||
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
|
||||||
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
|
||||||
|
|
||||||
new Application().run(argv);
|
new Application().run(argv);
|
||||||
}
|
}
|
||||||
|
@ -98,18 +98,30 @@ var AuthPrompt = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.add_child(this._label);
|
this.add_child(this._label);
|
||||||
this._entry = new St.Entry({
|
|
||||||
|
let entryParams = {
|
||||||
style_class: 'login-dialog-prompt-entry',
|
style_class: 'login-dialog-prompt-entry',
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
x_expand: false,
|
x_expand: false,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
});
|
};
|
||||||
ShellEntry.addContextMenu(this._entry, { isPassword: true, actionMode: Shell.ActionMode.NONE });
|
|
||||||
|
|
||||||
|
this._entry = null;
|
||||||
|
|
||||||
|
this._textEntry = new St.Entry(entryParams);
|
||||||
|
ShellEntry.addContextMenu(this._textEntry, { actionMode: Shell.ActionMode.NONE });
|
||||||
|
|
||||||
|
this._passwordEntry = new St.PasswordEntry(entryParams);
|
||||||
|
ShellEntry.addContextMenu(this._passwordEntry, { actionMode: Shell.ActionMode.NONE });
|
||||||
|
|
||||||
|
this._entry = this._passwordEntry;
|
||||||
this.add_child(this._entry);
|
this.add_child(this._entry);
|
||||||
|
|
||||||
this._entry.grab_key_focus();
|
this._entry.grab_key_focus();
|
||||||
|
|
||||||
|
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
|
||||||
|
this.add_child(this._capsLockWarningLabel);
|
||||||
|
|
||||||
this._message = new St.Label({
|
this._message = new St.Label({
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
styleClass: 'login-dialog-message',
|
styleClass: 'login-dialog-message',
|
||||||
@ -195,7 +207,18 @@ var AuthPrompt = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_onAskQuestion(verifier, serviceName, question, passwordChar) {
|
_updateEntry(secret) {
|
||||||
|
if (secret && (this._entry != this._passwordEntry)) {
|
||||||
|
this.replace_child(this._entry, this._passwordEntry);
|
||||||
|
this._entry = this._passwordEntry;
|
||||||
|
} else if (!secret && (this._entry != this._textEntry)) {
|
||||||
|
this.replace_child(this._entry, this._textEntry);
|
||||||
|
this._entry = this._textEntry;
|
||||||
|
}
|
||||||
|
this._capsLockWarningLabel.visible = secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
_onAskQuestion(verifier, serviceName, question, secret) {
|
||||||
if (this._queryingService)
|
if (this._queryingService)
|
||||||
this.clear();
|
this.clear();
|
||||||
|
|
||||||
@ -205,10 +228,11 @@ var AuthPrompt = GObject.registerClass({
|
|||||||
this._preemptiveAnswer = null;
|
this._preemptiveAnswer = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.setPasswordChar(passwordChar);
|
|
||||||
|
this._updateEntry(secret);
|
||||||
this.setQuestion(question);
|
this.setQuestion(question);
|
||||||
|
|
||||||
if (passwordChar) {
|
if (secret) {
|
||||||
if (this._userVerifier.reauthenticating)
|
if (this._userVerifier.reauthenticating)
|
||||||
this.nextButton.label = _("Unlock");
|
this.nextButton.label = _("Unlock");
|
||||||
else
|
else
|
||||||
@ -358,11 +382,6 @@ var AuthPrompt = GObject.registerClass({
|
|||||||
this.stopSpinning();
|
this.stopSpinning();
|
||||||
}
|
}
|
||||||
|
|
||||||
setPasswordChar(passwordChar) {
|
|
||||||
this._entry.clutter_text.set_password_char(passwordChar);
|
|
||||||
this._entry.menu.isPassword = passwordChar != '';
|
|
||||||
}
|
|
||||||
|
|
||||||
setQuestion(question) {
|
setQuestion(question) {
|
||||||
this._label.set_text(question);
|
this._label.set_text(question);
|
||||||
|
|
||||||
|
@ -896,7 +896,6 @@ var LoginDialog = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
_askForUsernameAndBeginVerification() {
|
_askForUsernameAndBeginVerification() {
|
||||||
this._authPrompt.setPasswordChar('');
|
|
||||||
this._authPrompt.setQuestion(_("Username: "));
|
this._authPrompt.setQuestion(_("Username: "));
|
||||||
|
|
||||||
this._showRealmLoginHint(this._realmManager.loginFormat);
|
this._showRealmLoginHint(this._realmManager.loginFormat);
|
||||||
|
@ -485,7 +485,7 @@ var ShellUserVerifier = class {
|
|||||||
if (!this.serviceIsForeground(serviceName))
|
if (!this.serviceIsForeground(serviceName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.emit('ask-question', serviceName, question, '');
|
this.emit('ask-question', serviceName, question, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onSecretInfoQuery(client, serviceName, secretQuestion) {
|
_onSecretInfoQuery(client, serviceName, secretQuestion) {
|
||||||
@ -498,7 +498,7 @@ var ShellUserVerifier = class {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
|
this.emit('ask-question', serviceName, secretQuestion, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_onReset() {
|
_onReset() {
|
||||||
|
@ -32,7 +32,6 @@
|
|||||||
<file>perf/core.js</file>
|
<file>perf/core.js</file>
|
||||||
<file>perf/hwtest.js</file>
|
<file>perf/hwtest.js</file>
|
||||||
|
|
||||||
<file>ui/accessDialog.js</file>
|
|
||||||
<file>ui/altTab.js</file>
|
<file>ui/altTab.js</file>
|
||||||
<file>ui/animation.js</file>
|
<file>ui/animation.js</file>
|
||||||
<file>ui/appDisplay.js</file>
|
<file>ui/appDisplay.js</file>
|
||||||
@ -98,6 +97,7 @@
|
|||||||
<file>ui/shellEntry.js</file>
|
<file>ui/shellEntry.js</file>
|
||||||
<file>ui/shellMountOperation.js</file>
|
<file>ui/shellMountOperation.js</file>
|
||||||
<file>ui/slider.js</file>
|
<file>ui/slider.js</file>
|
||||||
|
<file>ui/swipeTracker.js</file>
|
||||||
<file>ui/switcherPopup.js</file>
|
<file>ui/switcherPopup.js</file>
|
||||||
<file>ui/switchMonitor.js</file>
|
<file>ui/switchMonitor.js</file>
|
||||||
<file>ui/tweener.js</file>
|
<file>ui/tweener.js</file>
|
||||||
|
@ -89,7 +89,7 @@ const SystemActions = GObject.registerClass({
|
|||||||
name: C_("search-result", "Power Off"),
|
name: C_("search-result", "Power Off"),
|
||||||
iconName: 'system-shutdown-symbolic',
|
iconName: 'system-shutdown-symbolic',
|
||||||
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
// Translators: A list of keywords that match the power-off action, separated by semicolons
|
||||||
keywords: _("power off;shutdown;reboot;restart").split(/[; ]/),
|
keywords: _('power off;shutdown;reboot;restart;halt;stop').split(/[; ]/),
|
||||||
available: false,
|
available: false,
|
||||||
});
|
});
|
||||||
this._actions.set(LOCK_SCREEN_ACTION_ID, {
|
this._actions.set(LOCK_SCREEN_ACTION_ID, {
|
||||||
|
@ -1,154 +0,0 @@
|
|||||||
/* exported AccessDialogDBus */
|
|
||||||
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi;
|
|
||||||
|
|
||||||
const CheckBox = imports.ui.checkBox;
|
|
||||||
const Dialog = imports.ui.dialog;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
|
||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
|
||||||
|
|
||||||
const RequestIface = loadInterfaceXML('org.freedesktop.impl.portal.Request');
|
|
||||||
const AccessIface = loadInterfaceXML('org.freedesktop.impl.portal.Access');
|
|
||||||
|
|
||||||
var DialogResponse = {
|
|
||||||
OK: 0,
|
|
||||||
CANCEL: 1,
|
|
||||||
CLOSED: 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
var AccessDialog = GObject.registerClass(
|
|
||||||
class AccessDialog extends ModalDialog.ModalDialog {
|
|
||||||
_init(invocation, handle, title, subtitle, body, options) {
|
|
||||||
super._init({ styleClass: 'access-dialog' });
|
|
||||||
|
|
||||||
this._invocation = invocation;
|
|
||||||
this._handle = handle;
|
|
||||||
|
|
||||||
this._requestExported = false;
|
|
||||||
this._request = Gio.DBusExportedObject.wrapJSObject(RequestIface, this);
|
|
||||||
|
|
||||||
for (let option in options)
|
|
||||||
options[option] = options[option].deep_unpack();
|
|
||||||
|
|
||||||
this._buildLayout(title, subtitle, body, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
_buildLayout(title, subtitle, body, options) {
|
|
||||||
// No support for non-modal system dialogs, so ignore the option
|
|
||||||
// let modal = options['modal'] || true;
|
|
||||||
let denyLabel = options['deny_label'] || _("Deny Access");
|
|
||||||
let grantLabel = options['grant_label'] || _("Grant Access");
|
|
||||||
let iconName = options['icon'] || null;
|
|
||||||
let choices = options['choices'] || [];
|
|
||||||
|
|
||||||
let contentParams = { title, subtitle, body };
|
|
||||||
if (iconName)
|
|
||||||
contentParams.icon = new Gio.ThemedIcon({ name: iconName });
|
|
||||||
let content = new Dialog.MessageDialogContent(contentParams);
|
|
||||||
this.contentLayout.add_actor(content);
|
|
||||||
|
|
||||||
this._choices = new Map();
|
|
||||||
|
|
||||||
for (let i = 0; i < choices.length; i++) {
|
|
||||||
let [id, name, opts, selected] = choices[i];
|
|
||||||
if (opts.length > 0)
|
|
||||||
continue; // radio buttons, not implemented
|
|
||||||
|
|
||||||
let check = new CheckBox.CheckBox();
|
|
||||||
check.getLabelActor().text = name;
|
|
||||||
check.checked = selected == "true";
|
|
||||||
content.insertBeforeBody(check);
|
|
||||||
|
|
||||||
this._choices.set(id, check);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.addButton({ label: denyLabel,
|
|
||||||
action: () => {
|
|
||||||
this._sendResponse(DialogResponse.CANCEL);
|
|
||||||
},
|
|
||||||
key: Clutter.KEY_Escape });
|
|
||||||
this.addButton({ label: grantLabel,
|
|
||||||
action: () => {
|
|
||||||
this._sendResponse(DialogResponse.OK);
|
|
||||||
} });
|
|
||||||
}
|
|
||||||
|
|
||||||
open() {
|
|
||||||
super.open();
|
|
||||||
|
|
||||||
let connection = this._invocation.get_connection();
|
|
||||||
this._requestExported = this._request.export(connection, this._handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
CloseAsync(invocation, _params) {
|
|
||||||
if (this._invocation.get_sender() != invocation.get_sender()) {
|
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
|
||||||
Gio.DBusError.ACCESS_DENIED,
|
|
||||||
'');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._sendResponse(DialogResponse.CLOSED);
|
|
||||||
}
|
|
||||||
|
|
||||||
_sendResponse(response) {
|
|
||||||
if (this._requestExported)
|
|
||||||
this._request.unexport();
|
|
||||||
this._requestExported = false;
|
|
||||||
|
|
||||||
let results = {};
|
|
||||||
if (response == DialogResponse.OK) {
|
|
||||||
for (let [id, check] of this._choices) {
|
|
||||||
let checked = check.checked ? 'true' : 'false';
|
|
||||||
results[id] = new GLib.Variant('s', checked);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay actual response until the end of the close animation (if any)
|
|
||||||
this.connect('closed', () => {
|
|
||||||
this._invocation.return_value(new GLib.Variant('(ua{sv})',
|
|
||||||
[response, results]));
|
|
||||||
});
|
|
||||||
this.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AccessDialogDBus = class {
|
|
||||||
constructor() {
|
|
||||||
this._accessDialog = null;
|
|
||||||
|
|
||||||
this._windowTracker = Shell.WindowTracker.get_default();
|
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AccessIface, this);
|
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
|
|
||||||
|
|
||||||
Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
AccessDialogAsync(params, invocation) {
|
|
||||||
if (this._accessDialog) {
|
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
|
||||||
Gio.DBusError.LIMITS_EXCEEDED,
|
|
||||||
'Already showing a system access dialog');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let [handle, appId, parentWindow_, title, subtitle, body, options] = params;
|
|
||||||
// We probably want to use parentWindow and global.display.focus_window
|
|
||||||
// for this check in the future
|
|
||||||
if (appId && `${appId}.desktop` != this._windowTracker.focus_app.id) {
|
|
||||||
invocation.return_error_literal(Gio.DBusError,
|
|
||||||
Gio.DBusError.ACCESS_DENIED,
|
|
||||||
'Only the focused app is allowed to show a system access dialog');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let dialog = new AccessDialog(invocation, handle, title,
|
|
||||||
subtitle, body, options);
|
|
||||||
dialog.open();
|
|
||||||
|
|
||||||
dialog.connect('closed', () => (this._accessDialog = null));
|
|
||||||
|
|
||||||
this._accessDialog = dialog;
|
|
||||||
}
|
|
||||||
};
|
|
@ -64,9 +64,6 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
|
|
||||||
let apps = Shell.AppSystem.get_default().get_running();
|
let apps = Shell.AppSystem.get_default().get_running();
|
||||||
|
|
||||||
if (apps.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._switcherList = new AppSwitcher(apps, this);
|
this._switcherList = new AppSwitcher(apps, this);
|
||||||
this._items = this._switcherList.icons;
|
this._items = this._switcherList.icons;
|
||||||
}
|
}
|
||||||
@ -178,7 +175,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
this._select(this._next());
|
this._select(this._next());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
|
||||||
this._select(this._previous());
|
this._select(this._previous());
|
||||||
} else if (keysym === Clutter.KEY_q) {
|
} else if (keysym == Clutter.KEY_q || keysym === Clutter.KEY_Q) {
|
||||||
this._quitApplication(this._selectedIndex);
|
this._quitApplication(this._selectedIndex);
|
||||||
} else if (this._thumbnailsFocused) {
|
} else if (this._thumbnailsFocused) {
|
||||||
if (keysym === Clutter.KEY_Left)
|
if (keysym === Clutter.KEY_Left)
|
||||||
@ -187,7 +184,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
this._select(this._selectedIndex, this._nextWindow());
|
this._select(this._selectedIndex, this._nextWindow());
|
||||||
else if (keysym === Clutter.KEY_Up)
|
else if (keysym === Clutter.KEY_Up)
|
||||||
this._select(this._selectedIndex, null, true);
|
this._select(this._selectedIndex, null, true);
|
||||||
else if (keysym === Clutter.KEY_w || keysym === Clutter.KEY_F4)
|
else if (keysym === Clutter.KEY_w || keysym === Clutter.KEY_W || keysym === Clutter.KEY_F4)
|
||||||
this._closeAppWindow(this._selectedIndex, this._currentWindow);
|
this._closeAppWindow(this._selectedIndex, this._currentWindow);
|
||||||
else
|
else
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
@ -248,20 +245,20 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
this._select(n);
|
this._select(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
_windowActivated(thumbnailList, n) {
|
_windowActivated(thumbnailSwitcher, n) {
|
||||||
let appIcon = this._items[this._selectedIndex];
|
let appIcon = this._items[this._selectedIndex];
|
||||||
Main.activateWindow(appIcon.cachedWindows[n]);
|
Main.activateWindow(appIcon.cachedWindows[n]);
|
||||||
this.fadeAndDestroy();
|
this.fadeAndDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
_windowEntered(thumbnailList, n) {
|
_windowEntered(thumbnailSwitcher, n) {
|
||||||
if (!this.mouseActive)
|
if (!this.mouseActive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._select(this._selectedIndex, n);
|
this._select(this._selectedIndex, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
_windowRemoved(thumbnailList, n) {
|
_windowRemoved(thumbnailSwitcher, n) {
|
||||||
let appIcon = this._items[this._selectedIndex];
|
let appIcon = this._items[this._selectedIndex];
|
||||||
if (!appIcon)
|
if (!appIcon)
|
||||||
return;
|
return;
|
||||||
@ -373,7 +370,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_createThumbnails() {
|
_createThumbnails() {
|
||||||
this._thumbnails = new ThumbnailList(this._items[this._selectedIndex].cachedWindows);
|
this._thumbnails = new ThumbnailSwitcher(this._items[this._selectedIndex].cachedWindows);
|
||||||
this._thumbnails.connect('item-activated', this._windowActivated.bind(this));
|
this._thumbnails.connect('item-activated', this._windowActivated.bind(this));
|
||||||
this._thumbnails.connect('item-entered', this._windowEntered.bind(this));
|
this._thumbnails.connect('item-entered', this._windowEntered.bind(this));
|
||||||
this._thumbnails.connect('item-removed', this._windowRemoved.bind(this));
|
this._thumbnails.connect('item-removed', this._windowRemoved.bind(this));
|
||||||
@ -481,9 +478,6 @@ var CyclerPopup = GObject.registerClass({
|
|||||||
|
|
||||||
this._items = this._getWindows();
|
this._items = this._getWindows();
|
||||||
|
|
||||||
if (this._items.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._highlight = new CyclerHighlight();
|
this._highlight = new CyclerHighlight();
|
||||||
global.window_group.add_actor(this._highlight);
|
global.window_group.add_actor(this._highlight);
|
||||||
|
|
||||||
@ -559,11 +553,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
|
|
||||||
let windows = this._getWindowList();
|
let windows = this._getWindowList();
|
||||||
|
|
||||||
if (windows.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let mode = this._settings.get_enum('app-icon-mode');
|
let mode = this._settings.get_enum('app-icon-mode');
|
||||||
this._switcherList = new WindowList(windows, mode);
|
this._switcherList = new WindowSwitcher(windows, mode);
|
||||||
this._items = this._switcherList.icons;
|
this._items = this._switcherList.icons;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,7 +587,7 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
|
|||||||
this._select(this._previous());
|
this._select(this._previous());
|
||||||
else if (keysym == Clutter.KEY_Right)
|
else if (keysym == Clutter.KEY_Right)
|
||||||
this._select(this._next());
|
this._select(this._next());
|
||||||
else if (keysym == Clutter.KEY_w || keysym == Clutter.KEY_F4)
|
else if (keysym === Clutter.KEY_w || keysym === Clutter.KEY_W || keysym === Clutter.KEY_F4)
|
||||||
this._closeWindow(this._selectedIndex);
|
this._closeWindow(this._selectedIndex);
|
||||||
else
|
else
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
@ -811,7 +802,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We override SwitcherList's highlight() method to also deal with
|
// We override SwitcherList's highlight() method to also deal with
|
||||||
// the AppSwitcher->ThumbnailList arrows. Apps with only 1 window
|
// the AppSwitcher->ThumbnailSwitcher arrows. Apps with only 1 window
|
||||||
// will hide their arrows by default, but show them when their
|
// will hide their arrows by default, but show them when their
|
||||||
// thumbnails are visible (ie, when the app icon is supposed to be
|
// thumbnails are visible (ie, when the app icon is supposed to be
|
||||||
// in justOutline mode). Apps with multiple windows will normally
|
// in justOutline mode). Apps with multiple windows will normally
|
||||||
@ -868,8 +859,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ThumbnailList = GObject.registerClass(
|
var ThumbnailSwitcher = GObject.registerClass(
|
||||||
class ThumbnailList extends SwitcherPopup.SwitcherList {
|
class ThumbnailSwitcher extends SwitcherPopup.SwitcherList {
|
||||||
_init(windows) {
|
_init(windows) {
|
||||||
super._init(false);
|
super._init(false);
|
||||||
|
|
||||||
@ -1022,8 +1013,8 @@ class WindowIcon extends St.BoxLayout {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var WindowList = GObject.registerClass(
|
var WindowSwitcher = GObject.registerClass(
|
||||||
class WindowList extends SwitcherPopup.SwitcherList {
|
class WindowSwitcher extends SwitcherPopup.SwitcherList {
|
||||||
_init(windows, mode) {
|
_init(windows, mode) {
|
||||||
super._init(true);
|
super._init(true);
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ const Main = imports.ui.main;
|
|||||||
const PageIndicators = imports.ui.pageIndicators;
|
const PageIndicators = imports.ui.pageIndicators;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Search = imports.ui.search;
|
const Search = imports.ui.search;
|
||||||
|
const SwipeTracker = imports.ui.swipeTracker;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
const SystemActions = imports.misc.systemActions;
|
const SystemActions = imports.misc.systemActions;
|
||||||
@ -35,7 +36,7 @@ var MIN_FREQUENT_APPS_COUNT = 3;
|
|||||||
var VIEWS_SWITCH_TIME = 400;
|
var VIEWS_SWITCH_TIME = 400;
|
||||||
var VIEWS_SWITCH_ANIMATION_DELAY = 100;
|
var VIEWS_SWITCH_ANIMATION_DELAY = 100;
|
||||||
|
|
||||||
var PAGE_SWITCH_TIME = 300;
|
var PAGE_SWITCH_TIME = 250;
|
||||||
|
|
||||||
var APP_ICON_SCALE_IN_TIME = 500;
|
var APP_ICON_SCALE_IN_TIME = 500;
|
||||||
var APP_ICON_SCALE_IN_DELAY = 700;
|
var APP_ICON_SCALE_IN_DELAY = 700;
|
||||||
@ -327,7 +328,9 @@ var AllView = GObject.registerClass({
|
|||||||
(indicators, pageIndex) => {
|
(indicators, pageIndex) => {
|
||||||
this.goToPage(pageIndex);
|
this.goToPage(pageIndex);
|
||||||
});
|
});
|
||||||
this._pageIndicators.connect('scroll-event', this._onScroll.bind(this));
|
this._pageIndicators.connect('scroll-event', (actor, event) => {
|
||||||
|
this._scrollView.event(event, false);
|
||||||
|
});
|
||||||
this.add_actor(this._pageIndicators);
|
this.add_actor(this._pageIndicators);
|
||||||
|
|
||||||
this._folderIcons = [];
|
this._folderIcons = [];
|
||||||
@ -353,13 +356,12 @@ var AllView = GObject.registerClass({
|
|||||||
|
|
||||||
this._scrollView.connect('scroll-event', this._onScroll.bind(this));
|
this._scrollView.connect('scroll-event', this._onScroll.bind(this));
|
||||||
|
|
||||||
let panAction = new Clutter.PanAction({ interpolate: false });
|
this._swipeTracker = new SwipeTracker.SwipeTracker(
|
||||||
panAction.connect('pan', this._onPan.bind(this));
|
this._scrollView, Shell.ActionMode.OVERVIEW);
|
||||||
panAction.connect('gesture-cancel', this._onPanEnd.bind(this));
|
this._swipeTracker.connect('begin', this._swipeBegin.bind(this));
|
||||||
panAction.connect('gesture-end', this._onPanEnd.bind(this));
|
this._swipeTracker.connect('update', this._swipeUpdate.bind(this));
|
||||||
this._panAction = panAction;
|
this._swipeTracker.connect('end', this._swipeEnd.bind(this));
|
||||||
this._scrollView.add_action(panAction);
|
|
||||||
this._panning = false;
|
|
||||||
this._clickAction = new Clutter.ClickAction();
|
this._clickAction = new Clutter.ClickAction();
|
||||||
this._clickAction.connect('clicked', () => {
|
this._clickAction.connect('clicked', () => {
|
||||||
if (!this._currentPopup)
|
if (!this._currentPopup)
|
||||||
@ -376,6 +378,9 @@ var AllView = GObject.registerClass({
|
|||||||
this._displayingPopup = false;
|
this._displayingPopup = false;
|
||||||
this._currentPopupDestroyId = 0;
|
this._currentPopupDestroyId = 0;
|
||||||
|
|
||||||
|
this._canScroll = true; // limiting scrolling speed
|
||||||
|
this._scrollTimeoutId = 0;
|
||||||
|
|
||||||
this._availWidth = 0;
|
this._availWidth = 0;
|
||||||
this._availHeight = 0;
|
this._availHeight = 0;
|
||||||
|
|
||||||
@ -406,12 +411,22 @@ var AllView = GObject.registerClass({
|
|||||||
|
|
||||||
Main.overview.connect('item-drag-begin', this._onDragBegin.bind(this));
|
Main.overview.connect('item-drag-begin', this._onDragBegin.bind(this));
|
||||||
Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
|
Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
|
||||||
|
|
||||||
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
if (this._scrollTimeoutId !== 0) {
|
||||||
|
GLib.source_remove(this._scrollTimeoutId);
|
||||||
|
this._scrollTimeoutId = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_map() {
|
vfunc_map() {
|
||||||
this._keyPressEventId =
|
this._keyPressEventId =
|
||||||
global.stage.connect('key-press-event',
|
global.stage.connect('key-press-event',
|
||||||
this._onKeyPressEvent.bind(this));
|
this._onKeyPressEvent.bind(this));
|
||||||
|
this._swipeTracker.enabled = true;
|
||||||
super.vfunc_map();
|
super.vfunc_map();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,6 +435,7 @@ var AllView = GObject.registerClass({
|
|||||||
global.stage.disconnect(this._keyPressEventId);
|
global.stage.disconnect(this._keyPressEventId);
|
||||||
this._keyPressEventId = 0;
|
this._keyPressEventId = 0;
|
||||||
}
|
}
|
||||||
|
this._swipeTracker.enabled = false;
|
||||||
super.vfunc_unmap();
|
super.vfunc_unmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -565,7 +581,7 @@ var AllView = GObject.registerClass({
|
|||||||
return this._grid.getPageY(this._grid.currentPage);
|
return this._grid.getPageY(this._grid.currentPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
goToPage(pageNumber) {
|
goToPage(pageNumber, animate = true) {
|
||||||
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
|
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
|
||||||
|
|
||||||
if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup)
|
if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup)
|
||||||
@ -580,42 +596,16 @@ var AllView = GObject.registerClass({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let velocity;
|
if (this._grid.currentPage === pageNumber)
|
||||||
if (!this._panning)
|
return;
|
||||||
velocity = 0;
|
|
||||||
else
|
|
||||||
velocity = Math.abs(this._panAction.get_velocity(0)[2]);
|
|
||||||
// Tween the change between pages.
|
|
||||||
// If velocity is not specified (i.e. scrolling with mouse wheel),
|
|
||||||
// use the same speed regardless of original position
|
|
||||||
// if velocity is specified, it's in pixels per milliseconds
|
|
||||||
let diffToPage = this._diffToPage(pageNumber);
|
|
||||||
let childBox = this._scrollView.get_allocation_box();
|
|
||||||
let totalHeight = childBox.y2 - childBox.y1;
|
|
||||||
let time;
|
|
||||||
// Only take the velocity into account on page changes, otherwise
|
|
||||||
// return smoothly to the current page using the default velocity
|
|
||||||
if (this._grid.currentPage != pageNumber) {
|
|
||||||
let minVelocity = totalHeight / PAGE_SWITCH_TIME;
|
|
||||||
velocity = Math.max(minVelocity, velocity);
|
|
||||||
time = diffToPage / velocity;
|
|
||||||
} else {
|
|
||||||
time = PAGE_SWITCH_TIME * diffToPage / totalHeight;
|
|
||||||
}
|
|
||||||
// When changing more than one page, make sure to not take
|
|
||||||
// longer than PAGE_SWITCH_TIME
|
|
||||||
time = Math.min(time, PAGE_SWITCH_TIME);
|
|
||||||
|
|
||||||
this._grid.currentPage = pageNumber;
|
this._grid.currentPage = pageNumber;
|
||||||
this._adjustment.ease(this._grid.getPageY(pageNumber), {
|
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
|
||||||
duration: time,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_diffToPage(pageNumber) {
|
// Tween the change between pages.
|
||||||
let currentScrollPosition = this._adjustment.value;
|
this._adjustment.ease(this._grid.getPageY(this._grid.currentPage), {
|
||||||
return Math.abs(currentScrollPosition - this._grid.getPageY(pageNumber));
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
|
duration: animate ? PAGE_SWITCH_TIME : 0,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
openSpaceForPopup(item, side, nRows) {
|
openSpaceForPopup(item, side, nRows) {
|
||||||
@ -638,43 +628,62 @@ var AllView = GObject.registerClass({
|
|||||||
if (this._displayingPopup || !this._scrollView.reactive)
|
if (this._displayingPopup || !this._scrollView.reactive)
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
|
|
||||||
|
if (this._swipeTracker.canHandleScrollEvent(event))
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
if (!this._canScroll)
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
|
||||||
let direction = event.get_scroll_direction();
|
let direction = event.get_scroll_direction();
|
||||||
if (direction == Clutter.ScrollDirection.UP)
|
if (direction == Clutter.ScrollDirection.UP)
|
||||||
this.goToPage(this._grid.currentPage - 1);
|
this.goToPage(this._grid.currentPage - 1);
|
||||||
else if (direction == Clutter.ScrollDirection.DOWN)
|
else if (direction == Clutter.ScrollDirection.DOWN)
|
||||||
this.goToPage(this._grid.currentPage + 1);
|
this.goToPage(this._grid.currentPage + 1);
|
||||||
|
else
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
|
||||||
|
this._canScroll = false;
|
||||||
|
this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
|
||||||
|
PAGE_SWITCH_TIME, () => {
|
||||||
|
this._canScroll = true;
|
||||||
|
this._scrollTimeoutId = 0;
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onPan(action) {
|
_swipeBegin(tracker, monitor) {
|
||||||
if (this._displayingPopup)
|
if (monitor !== Main.layoutManager.primaryIndex)
|
||||||
return false;
|
|
||||||
this._panning = true;
|
|
||||||
this._clickAction.release();
|
|
||||||
let [dist_, dx_, dy] = action.get_motion_delta(0);
|
|
||||||
let adjustment = this._adjustment;
|
|
||||||
adjustment.value -= (dy / this._scrollView.height) * adjustment.page_size;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onPanEnd(action) {
|
|
||||||
if (this._displayingPopup)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let pageHeight = this._grid.getPageHeight();
|
let adjustment = this._adjustment;
|
||||||
|
adjustment.remove_transition('value');
|
||||||
|
|
||||||
// Calculate the scroll value we'd be at, which is our current
|
let progress = adjustment.value / adjustment.page_size;
|
||||||
// scroll plus any velocity the user had when they released
|
let points = Array.from({ length: this._grid.nPages() }, (v, i) => i);
|
||||||
// their finger.
|
|
||||||
|
|
||||||
let velocity = -action.get_velocity(0)[2];
|
tracker.confirmSwipe(this._scrollView.height,
|
||||||
let endPanValue = this._adjustment.value + velocity;
|
points, progress, Math.round(progress));
|
||||||
|
}
|
||||||
|
|
||||||
let closestPage = Math.round(endPanValue / pageHeight);
|
_swipeUpdate(tracker, progress) {
|
||||||
this.goToPage(closestPage);
|
let adjustment = this._adjustment;
|
||||||
|
adjustment.value = progress * adjustment.page_size;
|
||||||
|
}
|
||||||
|
|
||||||
this._panning = false;
|
_swipeEnd(tracker, duration, endProgress) {
|
||||||
|
let adjustment = this._adjustment;
|
||||||
|
let value = endProgress * adjustment.page_size;
|
||||||
|
|
||||||
|
adjustment.ease(value, {
|
||||||
|
mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
|
||||||
|
duration,
|
||||||
|
onComplete: () => {
|
||||||
|
this.goToPage(endProgress, false);
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_onKeyPressEvent(actor, event) {
|
_onKeyPressEvent(actor, event) {
|
||||||
|
@ -55,6 +55,7 @@ const RENAMED_DESKTOP_IDS = {
|
|||||||
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
|
||||||
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
|
'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
|
||||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||||
|
'seahorse.desktop': 'org.gnome.seahorse.Application.desktop',
|
||||||
'shotwell.desktop': 'org.gnome.Shotwell.desktop',
|
'shotwell.desktop': 'org.gnome.Shotwell.desktop',
|
||||||
'tali.desktop': 'org.gnome.Tali.desktop',
|
'tali.desktop': 'org.gnome.Tali.desktop',
|
||||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||||
|
@ -863,12 +863,10 @@ class EventsSection extends MessageList.MessageListSection {
|
|||||||
let now = new Date();
|
let now = new Date();
|
||||||
if (sameYear(this._date, now)) {
|
if (sameYear(this._date, now)) {
|
||||||
/* Translators: Shown on calendar heading when selected day occurs on current year */
|
/* Translators: Shown on calendar heading when selected day occurs on current year */
|
||||||
dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
|
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d"));
|
||||||
"%A, %B %-d"));
|
|
||||||
} else {
|
} else {
|
||||||
/* Translators: Shown on calendar heading when selected day occurs on different year */
|
/* Translators: Shown on calendar heading when selected day occurs on different year */
|
||||||
dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
|
dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d, %Y"));
|
||||||
"%A, %B %-d, %Y"));
|
|
||||||
}
|
}
|
||||||
this._title.label = this._date.toLocaleFormat(dayFormat);
|
this._title.label = this._date.toLocaleFormat(dayFormat);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported CloseDialog */
|
/* exported CloseDialog */
|
||||||
|
|
||||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -40,10 +40,9 @@ var CloseDialog = GObject.registerClass({
|
|||||||
|
|
||||||
/* Translators: %s is an application name */
|
/* Translators: %s is an application name */
|
||||||
let title = _("“%s” is not responding.").format(windowApp.get_name());
|
let title = _("“%s” is not responding.").format(windowApp.get_name());
|
||||||
let subtitle = _("You may choose to wait a short while for it to " +
|
let description = _('You may choose to wait a short while for it to ' +
|
||||||
"continue or force the application to quit entirely.");
|
'continue or force the application to quit entirely.');
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' });
|
return new Dialog.MessageDialogContent({ title, description });
|
||||||
return new Dialog.MessageDialogContent({ icon, title, subtitle });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateScale() {
|
_updateScale() {
|
||||||
@ -67,7 +66,7 @@ var CloseDialog = GObject.registerClass({
|
|||||||
this._dialog.width = windowActor.width;
|
this._dialog.width = windowActor.width;
|
||||||
this._dialog.height = windowActor.height;
|
this._dialog.height = windowActor.height;
|
||||||
|
|
||||||
this._dialog.addContent(this._createDialogContent());
|
this._dialog.contentLayout.add_child(this._createDialogContent());
|
||||||
this._dialog.addButton({ label: _('Force Quit'),
|
this._dialog.addButton({ label: _('Force Quit'),
|
||||||
action: this._onClose.bind(this),
|
action: this._onClose.bind(this),
|
||||||
default: true });
|
default: true });
|
||||||
|
@ -21,12 +21,11 @@ class KeyringDialog extends ModalDialog.ModalDialog {
|
|||||||
this.prompt.connect('show-confirm', this._onShowConfirm.bind(this));
|
this.prompt.connect('show-confirm', this._onShowConfirm.bind(this));
|
||||||
this.prompt.connect('prompt-close', this._onHidePrompt.bind(this));
|
this.prompt.connect('prompt-close', this._onHidePrompt.bind(this));
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
this._content = new Dialog.MessageDialogContent();
|
||||||
this._content = new Dialog.MessageDialogContent({ icon });
|
|
||||||
this.contentLayout.add(this._content);
|
this.contentLayout.add(this._content);
|
||||||
|
|
||||||
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('description', this._content, 'description', GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
|
||||||
this._workSpinner = null;
|
this._workSpinner = null;
|
||||||
this._controlTable = null;
|
this._controlTable = null;
|
||||||
@ -70,12 +69,13 @@ class KeyringDialog extends ModalDialog.ModalDialog {
|
|||||||
y_align: Clutter.ActorAlign.CENTER });
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
label.set_text(_("Password:"));
|
label.set_text(_("Password:"));
|
||||||
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._passwordEntry = new St.PasswordEntry({
|
||||||
text: '',
|
style_class: 'prompt-dialog-password-entry',
|
||||||
can_focus: true,
|
text: '',
|
||||||
x_expand: true });
|
can_focus: true,
|
||||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
x_expand: true,
|
||||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
});
|
||||||
|
ShellEntry.addContextMenu(this._passwordEntry);
|
||||||
this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this));
|
this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this));
|
||||||
|
|
||||||
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
|
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
|
||||||
@ -102,12 +102,13 @@ class KeyringDialog extends ModalDialog.ModalDialog {
|
|||||||
x_align: Clutter.ActorAlign.START,
|
x_align: Clutter.ActorAlign.START,
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
label.set_text(_("Type again:"));
|
label.set_text(_("Type again:"));
|
||||||
this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._confirmEntry = new St.PasswordEntry({
|
||||||
text: '',
|
style_class: 'prompt-dialog-password-entry',
|
||||||
can_focus: true,
|
text: '',
|
||||||
x_expand: true });
|
can_focus: true,
|
||||||
this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
x_expand: true,
|
||||||
ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
|
});
|
||||||
|
ShellEntry.addContextMenu(this._confirmEntry);
|
||||||
this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this));
|
this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this));
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
layout.attach(this._confirmEntry, 0, row, 1, 1);
|
layout.attach(this._confirmEntry, 0, row, 1, 1);
|
||||||
@ -124,6 +125,12 @@ class KeyringDialog extends ModalDialog.ModalDialog {
|
|||||||
this.prompt.set_password_actor(this._passwordEntry ? this._passwordEntry.clutter_text : null);
|
this.prompt.set_password_actor(this._passwordEntry ? this._passwordEntry.clutter_text : null);
|
||||||
this.prompt.set_confirm_actor(this._confirmEntry ? this._confirmEntry.clutter_text : null);
|
this.prompt.set_confirm_actor(this._confirmEntry ? this._confirmEntry.clutter_text : null);
|
||||||
|
|
||||||
|
if (this._passwordEntry || this._confirmEntry) {
|
||||||
|
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
|
||||||
|
layout.attach(this._capsLockWarningLabel, 1, row, 1, 1);
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.prompt.choice_visible) {
|
if (this.prompt.choice_visible) {
|
||||||
let choice = new CheckBox.CheckBox();
|
let choice = new CheckBox.CheckBox();
|
||||||
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
|
||||||
@ -146,7 +153,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._controlTable = table;
|
this._controlTable = table;
|
||||||
this._content.messageBox.add_child(table);
|
this._content.add_child(table);
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateSensitivity(sensitive) {
|
_updateSensitivity(sensitive) {
|
||||||
|
@ -29,11 +29,10 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
|
|||||||
else
|
else
|
||||||
this._content = this._getContent();
|
this._content = this._getContent();
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
let contentBox = new Dialog.MessageDialogContent({
|
||||||
let contentParams = { icon,
|
title: this._content.title,
|
||||||
title: this._content.title,
|
description: this._content.message,
|
||||||
body: this._content.message };
|
});
|
||||||
let contentBox = new Dialog.MessageDialogContent(contentParams);
|
|
||||||
this.contentLayout.add_actor(contentBox);
|
this.contentLayout.add_actor(contentBox);
|
||||||
|
|
||||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
@ -54,12 +53,18 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
|
|||||||
|
|
||||||
let reactive = secret.key != null;
|
let reactive = secret.key != null;
|
||||||
|
|
||||||
secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
let entryParams = {
|
||||||
text: secret.value, can_focus: reactive,
|
style_class: 'prompt-dialog-password-entry',
|
||||||
reactive,
|
text: secret.value,
|
||||||
x_expand: true });
|
can_focus: reactive,
|
||||||
ShellEntry.addContextMenu(secret.entry,
|
reactive,
|
||||||
{ isPassword: secret.password });
|
x_expand: true,
|
||||||
|
};
|
||||||
|
if (secret.password)
|
||||||
|
secret.entry = new St.PasswordEntry(entryParams);
|
||||||
|
else
|
||||||
|
secret.entry = new St.Entry(entryParams);
|
||||||
|
ShellEntry.addContextMenu(secret.entry);
|
||||||
|
|
||||||
if (secret.validate)
|
if (secret.validate)
|
||||||
secret.valid = secret.validate(secret);
|
secret.valid = secret.validate(secret);
|
||||||
@ -93,12 +98,17 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
|
|||||||
layout.attach(secret.entry, 1, pos, 1, 1);
|
layout.attach(secret.entry, 1, pos, 1, 1);
|
||||||
}
|
}
|
||||||
pos++;
|
pos++;
|
||||||
|
|
||||||
if (secret.password)
|
|
||||||
secret.entry.clutter_text.set_password_char('\u25cf');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
contentBox.messageBox.add(secretTable);
|
if (this._content.secrets.some(s => s.password)) {
|
||||||
|
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
|
||||||
|
if (rtl)
|
||||||
|
layout.attach(this._capsLockWarningLabel, 0, pos, 1, 1);
|
||||||
|
else
|
||||||
|
layout.attach(this._capsLockWarningLabel, 1, pos, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
contentBox.add_child(secretTable);
|
||||||
|
|
||||||
if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) {
|
if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) {
|
||||||
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
|
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
|
||||||
@ -106,7 +116,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
|
|||||||
descriptionLabel.clutter_text.line_wrap = true;
|
descriptionLabel.clutter_text.line_wrap = true;
|
||||||
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
|
||||||
contentBox.messageBox.add_child(descriptionLabel);
|
contentBox.add_child(descriptionLabel);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._okButton = {
|
this._okButton = {
|
||||||
@ -714,6 +724,10 @@ var NetworkAgent = class {
|
|||||||
title = _("Mobile broadband network password");
|
title = _("Mobile broadband network password");
|
||||||
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
|
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
|
||||||
break;
|
break;
|
||||||
|
case 'vpn':
|
||||||
|
title = _("VPN password");
|
||||||
|
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
log(`Invalid connection type: ${connectionType}`);
|
log(`Invalid connection type: ${connectionType}`);
|
||||||
this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported Component */
|
/* exported Component */
|
||||||
|
|
||||||
const { AccountsService, Clutter, Gio, GLib,
|
const { AccountsService, Clutter, GLib,
|
||||||
GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
|
GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
@ -25,11 +25,11 @@ const DELAYED_RESET_TIMEOUT = 200;
|
|||||||
var AuthenticationDialog = GObject.registerClass({
|
var AuthenticationDialog = GObject.registerClass({
|
||||||
Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } },
|
Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } },
|
||||||
}, class AuthenticationDialog extends ModalDialog.ModalDialog {
|
}, class AuthenticationDialog extends ModalDialog.ModalDialog {
|
||||||
_init(actionId, body, cookie, userNames) {
|
_init(actionId, description, cookie, userNames) {
|
||||||
super._init({ styleClass: 'prompt-dialog' });
|
super._init({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
this.actionId = actionId;
|
this.actionId = actionId;
|
||||||
this.message = body;
|
this.message = description;
|
||||||
this.userNames = userNames;
|
this.userNames = userNames;
|
||||||
|
|
||||||
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
|
this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
|
||||||
@ -38,10 +38,9 @@ var AuthenticationDialog = GObject.registerClass({
|
|||||||
|
|
||||||
this.connect('closed', this._onDialogClosed.bind(this));
|
this.connect('closed', this._onDialogClosed.bind(this));
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
|
||||||
let title = _("Authentication Required");
|
let title = _("Authentication Required");
|
||||||
|
|
||||||
let content = new Dialog.MessageDialogContent({ icon, title, body });
|
let content = new Dialog.MessageDialogContent({ title, description });
|
||||||
this.contentLayout.add_actor(content);
|
this.contentLayout.add_actor(content);
|
||||||
|
|
||||||
if (userNames.length > 1) {
|
if (userNames.length > 1) {
|
||||||
@ -62,7 +61,7 @@ var AuthenticationDialog = GObject.registerClass({
|
|||||||
style_class: 'polkit-dialog-user-layout',
|
style_class: 'polkit-dialog-user-layout',
|
||||||
vertical: false,
|
vertical: false,
|
||||||
});
|
});
|
||||||
content.messageBox.add(userBox);
|
content.add_child(userBox);
|
||||||
|
|
||||||
this._userAvatar = new UserWidget.Avatar(this._user, {
|
this._userAvatar = new UserWidget.Avatar(this._user, {
|
||||||
iconSize: DIALOG_ICON_SIZE,
|
iconSize: DIALOG_ICON_SIZE,
|
||||||
@ -84,19 +83,19 @@ var AuthenticationDialog = GObject.registerClass({
|
|||||||
userBox.add_child(this._userLabel);
|
userBox.add_child(this._userLabel);
|
||||||
|
|
||||||
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
||||||
content.messageBox.add(this._passwordBox);
|
content.add_child(this._passwordBox);
|
||||||
this._passwordLabel = new St.Label({
|
this._passwordLabel = new St.Label({
|
||||||
style_class: 'prompt-dialog-password-label',
|
style_class: 'prompt-dialog-password-label',
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
});
|
});
|
||||||
this._passwordBox.add_child(this._passwordLabel);
|
this._passwordBox.add_child(this._passwordLabel);
|
||||||
this._passwordEntry = new St.Entry({
|
this._passwordEntry = new St.PasswordEntry({
|
||||||
style_class: 'prompt-dialog-password-entry',
|
style_class: 'prompt-dialog-password-entry',
|
||||||
text: "",
|
text: "",
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
x_expand: true,
|
x_expand: true,
|
||||||
});
|
});
|
||||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
ShellEntry.addContextMenu(this._passwordEntry);
|
||||||
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||||
this._passwordEntry.bind_property('reactive',
|
this._passwordEntry.bind_property('reactive',
|
||||||
this._passwordEntry.clutter_text, 'editable',
|
this._passwordEntry.clutter_text, 'editable',
|
||||||
@ -109,17 +108,19 @@ var AuthenticationDialog = GObject.registerClass({
|
|||||||
this._passwordBox.add(this._workSpinner);
|
this._passwordBox.add(this._workSpinner);
|
||||||
|
|
||||||
this._passwordBox.hide();
|
this._passwordBox.hide();
|
||||||
|
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning({ style_class: 'prompt-dialog-caps-lock-warning' });
|
||||||
|
content.add_child(this._capsLockWarningLabel);
|
||||||
|
|
||||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
||||||
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._errorMessageLabel.clutter_text.line_wrap = true;
|
this._errorMessageLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add_child(this._errorMessageLabel);
|
content.add_child(this._errorMessageLabel);
|
||||||
this._errorMessageLabel.hide();
|
this._errorMessageLabel.hide();
|
||||||
|
|
||||||
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
|
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
|
||||||
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._infoMessageLabel.clutter_text.line_wrap = true;
|
this._infoMessageLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add(this._infoMessageLabel);
|
content.add_child(this._infoMessageLabel);
|
||||||
this._infoMessageLabel.hide();
|
this._infoMessageLabel.hide();
|
||||||
|
|
||||||
/* text is intentionally non-blank otherwise the height is not the same as for
|
/* text is intentionally non-blank otherwise the height is not the same as for
|
||||||
@ -131,7 +132,7 @@ var AuthenticationDialog = GObject.registerClass({
|
|||||||
this._nullMessageLabel.add_style_class_name('hidden');
|
this._nullMessageLabel.add_style_class_name('hidden');
|
||||||
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._nullMessageLabel.clutter_text.line_wrap = true;
|
this._nullMessageLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add(this._nullMessageLabel);
|
content.add_child(this._nullMessageLabel);
|
||||||
this._nullMessageLabel.show();
|
this._nullMessageLabel.show();
|
||||||
|
|
||||||
this._cancelButton = this.addButton({ label: _("Cancel"),
|
this._cancelButton = this.addButton({ label: _("Cancel"),
|
||||||
@ -278,10 +279,7 @@ var AuthenticationDialog = GObject.registerClass({
|
|||||||
else
|
else
|
||||||
this._passwordLabel.set_text(request);
|
this._passwordLabel.set_text(request);
|
||||||
|
|
||||||
if (echoOn)
|
this._passwordEntry.password_visible = echoOn;
|
||||||
this._passwordEntry.clutter_text.set_password_char('');
|
|
||||||
else
|
|
||||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
|
||||||
|
|
||||||
this._passwordBox.show();
|
this._passwordBox.show();
|
||||||
this._passwordEntry.set_text('');
|
this._passwordEntry.set_text('');
|
||||||
|
@ -348,7 +348,14 @@ class WeatherSection extends St.Button {
|
|||||||
timeOnly: true,
|
timeOnly: true,
|
||||||
ampm: false,
|
ampm: false,
|
||||||
});
|
});
|
||||||
|
const [, tempValue] = fc.get_value_temp(GWeather.TemperatureUnit.DEFAULT);
|
||||||
|
const tempPrefix = tempValue >= 0 ? ' ' : '';
|
||||||
|
|
||||||
|
let time = new St.Label({
|
||||||
|
style_class: 'weather-forecast-time',
|
||||||
|
text: timeStr,
|
||||||
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
let icon = new St.Icon({
|
let icon = new St.Icon({
|
||||||
style_class: 'weather-forecast-icon',
|
style_class: 'weather-forecast-icon',
|
||||||
icon_name: fc.get_symbolic_icon_name(),
|
icon_name: fc.get_symbolic_icon_name(),
|
||||||
@ -357,21 +364,16 @@ class WeatherSection extends St.Button {
|
|||||||
});
|
});
|
||||||
let temp = new St.Label({
|
let temp = new St.Label({
|
||||||
style_class: 'weather-forecast-temp',
|
style_class: 'weather-forecast-temp',
|
||||||
text: fc.get_temp_summary(),
|
text: '%s%.0f°'.format(tempPrefix, tempValue),
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
|
||||||
});
|
|
||||||
let time = new St.Label({
|
|
||||||
style_class: 'weather-forecast-time',
|
|
||||||
text: timeStr,
|
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
});
|
});
|
||||||
|
|
||||||
temp.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
temp.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
time.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
time.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
|
||||||
layout.attach(icon, col, 0, 1, 1);
|
layout.attach(time, col, 0, 1, 1);
|
||||||
layout.attach(temp, col, 1, 1, 1);
|
layout.attach(icon, col, 1, 1, 1);
|
||||||
layout.attach(time, col, 2, 1, 1);
|
layout.attach(temp, col, 2, 1, 1);
|
||||||
col++;
|
col++;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
268
js/ui/dialog.js
@ -1,7 +1,14 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported Dialog, MessageDialogContent */
|
/* exported Dialog, MessageDialogContent, ListSection, ListSectionItem */
|
||||||
|
|
||||||
const { Clutter, Gio, GObject, Pango, St } = imports.gi;
|
const { Clutter, GObject, Pango, St } = imports.gi;
|
||||||
|
|
||||||
|
function _setLabel(label, value) {
|
||||||
|
label.set({
|
||||||
|
text: value || '',
|
||||||
|
visible: value !== null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
var Dialog = GObject.registerClass(
|
var Dialog = GObject.registerClass(
|
||||||
class Dialog extends St.Widget {
|
class Dialog extends St.Widget {
|
||||||
@ -25,10 +32,12 @@ class Dialog extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_createDialog() {
|
_createDialog() {
|
||||||
this._dialog = new St.BoxLayout({ style_class: 'modal-dialog',
|
this._dialog = new St.BoxLayout({
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
style_class: 'modal-dialog',
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
vertical: true });
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
vertical: true,
|
||||||
|
});
|
||||||
|
|
||||||
// modal dialogs are fixed width and grow vertically; set the request
|
// modal dialogs are fixed width and grow vertically; set the request
|
||||||
// mode accordingly so wrapped labels are handled correctly during
|
// mode accordingly so wrapped labels are handled correctly during
|
||||||
@ -43,7 +52,9 @@ class Dialog extends St.Widget {
|
|||||||
});
|
});
|
||||||
this._dialog.add_child(this.contentLayout);
|
this._dialog.add_child(this.contentLayout);
|
||||||
|
|
||||||
this.buttonLayout = new St.Widget({ layout_manager: new Clutter.BoxLayout({ homogeneous: true }) });
|
this.buttonLayout = new St.Widget({
|
||||||
|
layout_manager: new Clutter.BoxLayout({ homogeneous: true }),
|
||||||
|
});
|
||||||
this._dialog.add_child(this.buttonLayout);
|
this._dialog.add_child(this.buttonLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,10 +106,6 @@ class Dialog extends St.Widget {
|
|||||||
return this._initialKeyFocus || this;
|
return this._initialKeyFocus || this;
|
||||||
}
|
}
|
||||||
|
|
||||||
addContent(actor) {
|
|
||||||
this.contentLayout.add(actor, { expand: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
addButton(buttonInfo) {
|
addButton(buttonInfo) {
|
||||||
let { label, action, key } = buttonInfo;
|
let { label, action, key } = buttonInfo;
|
||||||
let isDefault = buttonInfo['default'];
|
let isDefault = buttonInfo['default'];
|
||||||
@ -111,13 +118,15 @@ class Dialog extends St.Widget {
|
|||||||
else
|
else
|
||||||
keys = [];
|
keys = [];
|
||||||
|
|
||||||
let button = new St.Button({ style_class: 'modal-dialog-linked-button',
|
let button = new St.Button({
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
style_class: 'modal-dialog-linked-button',
|
||||||
reactive: true,
|
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||||
can_focus: true,
|
reactive: true,
|
||||||
x_expand: true,
|
can_focus: true,
|
||||||
y_expand: true,
|
x_expand: true,
|
||||||
label });
|
y_expand: true,
|
||||||
|
label,
|
||||||
|
});
|
||||||
button.connect('clicked', action);
|
button.connect('clicked', action);
|
||||||
|
|
||||||
buttonInfo['button'] = button;
|
buttonInfo['button'] = button;
|
||||||
@ -144,99 +153,170 @@ class Dialog extends St.Widget {
|
|||||||
|
|
||||||
var MessageDialogContent = GObject.registerClass({
|
var MessageDialogContent = GObject.registerClass({
|
||||||
Properties: {
|
Properties: {
|
||||||
'icon': GObject.ParamSpec.object('icon', 'icon', 'icon',
|
'title': GObject.ParamSpec.string(
|
||||||
GObject.ParamFlags.READWRITE |
|
'title', 'title', 'title',
|
||||||
GObject.ParamFlags.CONSTRUCT,
|
GObject.ParamFlags.READWRITE |
|
||||||
Gio.Icon.$gtype),
|
GObject.ParamFlags.CONSTRUCT,
|
||||||
'title': GObject.ParamSpec.string('title', 'title', 'title',
|
null),
|
||||||
GObject.ParamFlags.READWRITE |
|
'description': GObject.ParamSpec.string(
|
||||||
GObject.ParamFlags.CONSTRUCT,
|
'description', 'description', 'description',
|
||||||
null),
|
GObject.ParamFlags.READWRITE |
|
||||||
'subtitle': GObject.ParamSpec.string('subtitle', 'subtitle', 'subtitle',
|
GObject.ParamFlags.CONSTRUCT,
|
||||||
GObject.ParamFlags.READWRITE |
|
null),
|
||||||
GObject.ParamFlags.CONSTRUCT,
|
|
||||||
null),
|
|
||||||
'body': GObject.ParamSpec.string('body', 'body', 'body',
|
|
||||||
GObject.ParamFlags.READWRITE |
|
|
||||||
GObject.ParamFlags.CONSTRUCT,
|
|
||||||
null),
|
|
||||||
},
|
},
|
||||||
}, class MessageDialogContent extends St.BoxLayout {
|
}, class MessageDialogContent extends St.BoxLayout {
|
||||||
_init(params) {
|
_init(params) {
|
||||||
this._icon = new St.Icon({ y_align: Clutter.ActorAlign.START });
|
this._title = new St.Label({ style_class: 'message-dialog-title' });
|
||||||
this._title = new St.Label({ style_class: 'headline' });
|
this._description = new St.Label({ style_class: 'message-dialog-description' });
|
||||||
this._subtitle = new St.Label();
|
|
||||||
this._body = new St.Label();
|
|
||||||
|
|
||||||
['icon', 'title', 'subtitle', 'body'].forEach(prop => {
|
this._description.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
|
this._description.clutter_text.line_wrap = true;
|
||||||
});
|
|
||||||
|
|
||||||
let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
|
let defaultParams = {
|
||||||
line_wrap: true };
|
style_class: 'message-dialog-content',
|
||||||
this._subtitle.clutter_text.set(textProps);
|
x_expand: true,
|
||||||
this._body.clutter_text.set(textProps);
|
vertical: true,
|
||||||
|
};
|
||||||
let defaultParams = { style_class: 'message-dialog-main-layout' };
|
|
||||||
super._init(Object.assign(defaultParams, params));
|
super._init(Object.assign(defaultParams, params));
|
||||||
|
|
||||||
this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content',
|
this.add_child(this._title);
|
||||||
x_expand: true,
|
this.add_child(this._description);
|
||||||
vertical: true });
|
|
||||||
|
|
||||||
this.messageBox.add_actor(this._title);
|
|
||||||
this.messageBox.add_actor(this._subtitle);
|
|
||||||
this.messageBox.add_actor(this._body);
|
|
||||||
|
|
||||||
this.add_actor(this._icon);
|
|
||||||
this.add_actor(this.messageBox);
|
|
||||||
}
|
|
||||||
|
|
||||||
get icon() {
|
|
||||||
return this._icon.gicon;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get title() {
|
get title() {
|
||||||
return this._title.text;
|
return this._title.text;
|
||||||
}
|
}
|
||||||
|
|
||||||
get subtitle() {
|
get description() {
|
||||||
return this._subtitle.text;
|
return this._description.text;
|
||||||
}
|
|
||||||
|
|
||||||
get body() {
|
|
||||||
return this._body.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
set icon(icon) {
|
|
||||||
this._icon.set({
|
|
||||||
gicon: icon,
|
|
||||||
visible: icon != null,
|
|
||||||
});
|
|
||||||
this.notify('icon');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set title(title) {
|
set title(title) {
|
||||||
this._setLabel(this._title, 'title', title);
|
_setLabel(this._title, title);
|
||||||
|
this.notify('title');
|
||||||
}
|
}
|
||||||
|
|
||||||
set subtitle(subtitle) {
|
set description(description) {
|
||||||
this._setLabel(this._subtitle, 'subtitle', subtitle);
|
_setLabel(this._description, description);
|
||||||
}
|
this.notify('description');
|
||||||
|
}
|
||||||
set body(body) {
|
});
|
||||||
this._setLabel(this._body, 'body', body);
|
|
||||||
}
|
var ListSection = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
_setLabel(label, prop, value) {
|
'title': GObject.ParamSpec.string(
|
||||||
label.set({
|
'title', 'title', 'title',
|
||||||
text: value || '',
|
GObject.ParamFlags.READWRITE |
|
||||||
visible: value != null,
|
GObject.ParamFlags.CONSTRUCT,
|
||||||
});
|
null),
|
||||||
this.notify(prop);
|
},
|
||||||
}
|
}, class ListSection extends St.BoxLayout {
|
||||||
|
_init(params) {
|
||||||
insertBeforeBody(actor) {
|
this._title = new St.Label({ style_class: 'dialog-list-title' });
|
||||||
this.messageBox.insert_child_below(actor, this._body);
|
|
||||||
|
this._listScrollView = new St.ScrollView({
|
||||||
|
style_class: 'dialog-list-scrollview',
|
||||||
|
hscrollbar_policy: St.PolicyType.NEVER,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.list = new St.BoxLayout({
|
||||||
|
style_class: 'dialog-list-box',
|
||||||
|
vertical: true,
|
||||||
|
});
|
||||||
|
this._listScrollView.add_actor(this.list);
|
||||||
|
|
||||||
|
let defaultParams = {
|
||||||
|
style_class: 'dialog-list',
|
||||||
|
x_expand: true,
|
||||||
|
vertical: true,
|
||||||
|
};
|
||||||
|
super._init(Object.assign(defaultParams, params));
|
||||||
|
|
||||||
|
this.label_actor = this._title;
|
||||||
|
this.add_child(this._title);
|
||||||
|
this.add_child(this._listScrollView);
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
return this._title.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
set title(title) {
|
||||||
|
_setLabel(this._title, title);
|
||||||
|
this.notify('title');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var ListSectionItem = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
|
'icon-actor': GObject.ParamSpec.object(
|
||||||
|
'icon-actor', 'icon-actor', 'Icon actor',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
Clutter.Actor.$gtype),
|
||||||
|
'title': GObject.ParamSpec.string(
|
||||||
|
'title', 'title', 'title',
|
||||||
|
GObject.ParamFlags.READWRITE |
|
||||||
|
GObject.ParamFlags.CONSTRUCT,
|
||||||
|
null),
|
||||||
|
'description': GObject.ParamSpec.string(
|
||||||
|
'description', 'description', 'description',
|
||||||
|
GObject.ParamFlags.READWRITE |
|
||||||
|
GObject.ParamFlags.CONSTRUCT,
|
||||||
|
null),
|
||||||
|
},
|
||||||
|
}, class ListSectionItem extends St.BoxLayout {
|
||||||
|
_init(params) {
|
||||||
|
this._iconActorBin = new St.Bin();
|
||||||
|
|
||||||
|
let textLayout = new St.BoxLayout({
|
||||||
|
vertical: true,
|
||||||
|
y_expand: true,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
|
|
||||||
|
this._title = new St.Label({ style_class: 'dialog-list-item-title' });
|
||||||
|
|
||||||
|
this._description = new St.Label({
|
||||||
|
style_class: 'dialog-list-item-title-description',
|
||||||
|
});
|
||||||
|
|
||||||
|
textLayout.add_child(this._title);
|
||||||
|
textLayout.add_child(this._description);
|
||||||
|
|
||||||
|
let defaultParams = { style_class: 'dialog-list-item' };
|
||||||
|
super._init(Object.assign(defaultParams, params));
|
||||||
|
|
||||||
|
this.label_actor = this._title;
|
||||||
|
this.add_child(this._iconActorBin);
|
||||||
|
this.add_child(textLayout);
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
get icon_actor() {
|
||||||
|
return this._iconActorBin.get_child();
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line camelcase
|
||||||
|
set icon_actor(actor) {
|
||||||
|
this._iconActorBin.set_child(actor);
|
||||||
|
this.notify('icon-actor');
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
return this._title.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
set title(title) {
|
||||||
|
_setLabel(this._title, title);
|
||||||
|
this.notify('title');
|
||||||
|
}
|
||||||
|
|
||||||
|
get description() {
|
||||||
|
return this._description.text;
|
||||||
|
}
|
||||||
|
|
||||||
|
set description(description) {
|
||||||
|
_setLabel(this._description, description);
|
||||||
|
this.notify('description');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -21,6 +21,7 @@ const { AccountsService, Clutter, Gio,
|
|||||||
GLib, GObject, Pango, Polkit, Shell, St } = imports.gi;
|
GLib, GObject, Pango, Polkit, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const CheckBox = imports.ui.checkBox;
|
const CheckBox = imports.ui.checkBox;
|
||||||
|
const Dialog = imports.ui.dialog;
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
const LoginManager = imports.misc.loginManager;
|
const LoginManager = imports.misc.loginManager;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
@ -28,8 +29,7 @@ const UserWidget = imports.ui.userWidget;
|
|||||||
|
|
||||||
const { loadInterfaceXML } = imports.misc.fileUtils;
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
||||||
|
|
||||||
const _ITEM_ICON_SIZE = 48;
|
const _ITEM_ICON_SIZE = 64;
|
||||||
const _DIALOG_ICON_SIZE = 48;
|
|
||||||
|
|
||||||
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
|
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
|
||||||
|
|
||||||
@ -49,7 +49,6 @@ const logoutDialogContent = {
|
|||||||
showBatteryWarning: false,
|
showBatteryWarning: false,
|
||||||
confirmButtons: [{ signal: 'ConfirmedLogout',
|
confirmButtons: [{ signal: 'ConfirmedLogout',
|
||||||
label: C_("button", "Log Out") }],
|
label: C_("button", "Log Out") }],
|
||||||
iconStyleClass: 'end-session-dialog-logout-icon',
|
|
||||||
showOtherSessions: false,
|
showOtherSessions: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -68,7 +67,6 @@ const shutdownDialogContent = {
|
|||||||
{ signal: 'ConfirmedShutdown',
|
{ signal: 'ConfirmedShutdown',
|
||||||
label: C_("button", "Power Off") }],
|
label: C_("button", "Power Off") }],
|
||||||
iconName: 'system-shutdown-symbolic',
|
iconName: 'system-shutdown-symbolic',
|
||||||
iconStyleClass: 'end-session-dialog-shutdown-icon',
|
|
||||||
showOtherSessions: true,
|
showOtherSessions: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -83,7 +81,6 @@ const restartDialogContent = {
|
|||||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||||
label: C_("button", "Restart") }],
|
label: C_("button", "Restart") }],
|
||||||
iconName: 'view-refresh-symbolic',
|
iconName: 'view-refresh-symbolic',
|
||||||
iconStyleClass: 'end-session-dialog-shutdown-icon',
|
|
||||||
showOtherSessions: true,
|
showOtherSessions: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -101,7 +98,6 @@ const restartUpdateDialogContent = {
|
|||||||
unusedFutureButtonForTranslation: C_("button", "Install & Power Off"),
|
unusedFutureButtonForTranslation: C_("button", "Install & Power Off"),
|
||||||
unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
|
unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
|
||||||
iconName: 'view-refresh-symbolic',
|
iconName: 'view-refresh-symbolic',
|
||||||
iconStyleClass: 'end-session-dialog-shutdown-icon',
|
|
||||||
showOtherSessions: true,
|
showOtherSessions: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -119,7 +115,6 @@ const restartUpgradeDialogContent = {
|
|||||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||||
label: C_("button", "Restart & Install") }],
|
label: C_("button", "Restart & Install") }],
|
||||||
iconName: 'view-refresh-symbolic',
|
iconName: 'view-refresh-symbolic',
|
||||||
iconStyleClass: 'end-session-dialog-shutdown-icon',
|
|
||||||
showOtherSessions: true,
|
showOtherSessions: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -192,16 +187,6 @@ function _roundSecondsToInterval(totalSeconds, secondsLeft, interval) {
|
|||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _setLabelText(label, text) {
|
|
||||||
if (text) {
|
|
||||||
label.set_text(text);
|
|
||||||
label.show();
|
|
||||||
} else {
|
|
||||||
label.set_text('');
|
|
||||||
label.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _setCheckBoxLabel(checkBox, text) {
|
function _setCheckBoxLabel(checkBox, text) {
|
||||||
let label = checkBox.getLabelActor();
|
let label = checkBox.getLabelActor();
|
||||||
|
|
||||||
@ -260,75 +245,34 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this.connect('opened',
|
this.connect('opened',
|
||||||
this._onOpened.bind(this));
|
this._onOpened.bind(this));
|
||||||
|
|
||||||
this._userLoadedId = this._user.connect('notify::is_loaded', this._sync.bind(this));
|
this._userLoadedId = this._user.connect('notify::is-loaded', this._sync.bind(this));
|
||||||
this._userChangedId = this._user.connect('changed', this._sync.bind(this));
|
this._userChangedId = this._user.connect('changed', this._sync.bind(this));
|
||||||
|
|
||||||
let mainContentLayout = new St.BoxLayout({
|
this._messageDialogContent = new Dialog.MessageDialogContent();
|
||||||
vertical: false,
|
|
||||||
x_expand: true,
|
|
||||||
y_expand: false,
|
|
||||||
});
|
|
||||||
this.contentLayout.add_child(mainContentLayout);
|
|
||||||
|
|
||||||
this._iconBin = new St.Bin({
|
|
||||||
x_expand: true,
|
|
||||||
x_align: Clutter.ActorAlign.END,
|
|
||||||
});
|
|
||||||
mainContentLayout.add_child(this._iconBin);
|
|
||||||
|
|
||||||
let messageLayout = new St.BoxLayout({ vertical: true,
|
|
||||||
style_class: 'end-session-dialog-layout' });
|
|
||||||
mainContentLayout.add_child(messageLayout);
|
|
||||||
|
|
||||||
this._subjectLabel = new St.Label({ style_class: 'end-session-dialog-subject' });
|
|
||||||
|
|
||||||
messageLayout.add_child(this._subjectLabel);
|
|
||||||
|
|
||||||
this._descriptionLabel = new St.Label({
|
|
||||||
style_class: 'end-session-dialog-description',
|
|
||||||
y_expand: true,
|
|
||||||
});
|
|
||||||
this._descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
this._descriptionLabel.clutter_text.line_wrap = true;
|
|
||||||
|
|
||||||
messageLayout.add_child(this._descriptionLabel);
|
|
||||||
|
|
||||||
this._checkBox = new CheckBox.CheckBox();
|
this._checkBox = new CheckBox.CheckBox();
|
||||||
this._checkBox.connect('clicked', this._sync.bind(this));
|
this._checkBox.connect('clicked', this._sync.bind(this));
|
||||||
messageLayout.add(this._checkBox);
|
this._messageDialogContent.add_child(this._checkBox);
|
||||||
|
|
||||||
this._batteryWarning = new St.Label({ style_class: 'end-session-dialog-warning',
|
this._batteryWarning = new St.Label({
|
||||||
text: _("Running on battery power: please plug in before installing updates.") });
|
style_class: 'end-session-dialog-battery-warning',
|
||||||
|
text: _('Running on battery power: Please plug in before installing updates.'),
|
||||||
|
});
|
||||||
this._batteryWarning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._batteryWarning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._batteryWarning.clutter_text.line_wrap = true;
|
this._batteryWarning.clutter_text.line_wrap = true;
|
||||||
messageLayout.add(this._batteryWarning);
|
this._messageDialogContent.add_child(this._batteryWarning);
|
||||||
|
|
||||||
this._scrollView = new St.ScrollView({
|
this.contentLayout.add_child(this._messageDialogContent);
|
||||||
style_class: 'end-session-dialog-list',
|
|
||||||
x_expand: true,
|
this._applicationSection = new Dialog.ListSection({
|
||||||
y_expand: true,
|
title: _('Some applications are busy or have unsaved work'),
|
||||||
});
|
});
|
||||||
this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC);
|
this.contentLayout.add_child(this._applicationSection);
|
||||||
this.contentLayout.add_child(this._scrollView);
|
|
||||||
this._scrollView.hide();
|
|
||||||
|
|
||||||
this._inhibitorSection = new St.BoxLayout({ vertical: true,
|
this._sessionSection = new Dialog.ListSection({
|
||||||
style_class: 'end-session-dialog-inhibitor-layout' });
|
title: _('Other users are logged in'),
|
||||||
this._scrollView.add_actor(this._inhibitorSection);
|
});
|
||||||
|
this.contentLayout.add_child(this._sessionSection);
|
||||||
this._applicationHeader = new St.Label({ style_class: 'end-session-dialog-list-header',
|
|
||||||
text: _("Some applications are busy or have unsaved work.") });
|
|
||||||
this._applicationList = new St.BoxLayout({ style_class: 'end-session-dialog-app-list',
|
|
||||||
vertical: true });
|
|
||||||
this._inhibitorSection.add_actor(this._applicationHeader);
|
|
||||||
this._inhibitorSection.add_actor(this._applicationList);
|
|
||||||
|
|
||||||
this._sessionHeader = new St.Label({ style_class: 'end-session-dialog-list-header',
|
|
||||||
text: _("Other users are logged in.") });
|
|
||||||
this._sessionList = new St.BoxLayout({ style_class: 'end-session-dialog-session-list',
|
|
||||||
vertical: true });
|
|
||||||
this._inhibitorSection.add_actor(this._sessionHeader);
|
|
||||||
this._inhibitorSection.add_actor(this._sessionList);
|
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
|
||||||
@ -379,11 +323,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
subject = dialogContent.subjectWithUpdates;
|
subject = dialogContent.subjectWithUpdates;
|
||||||
|
|
||||||
if (dialogContent.showBatteryWarning) {
|
if (dialogContent.showBatteryWarning) {
|
||||||
// Warn when running on battery power
|
this._batteryWarning.visible =
|
||||||
if (this._powerProxy.OnBattery && this._checkBox.checked)
|
this._powerProxy.OnBattery && this._checkBox.checked;
|
||||||
this._batteryWarning.opacity = 255;
|
|
||||||
else
|
|
||||||
this._batteryWarning.opacity = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let description;
|
let description;
|
||||||
@ -417,26 +358,14 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
if (!description)
|
if (!description)
|
||||||
description = dialogContent.description(displayTime);
|
description = dialogContent.description(displayTime);
|
||||||
|
|
||||||
_setLabelText(this._descriptionLabel, description);
|
this._messageDialogContent.title = subject;
|
||||||
_setLabelText(this._subjectLabel, subject);
|
this._messageDialogContent.description = description;
|
||||||
|
|
||||||
if (dialogContent.iconName) {
|
|
||||||
this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
|
|
||||||
icon_size: _DIALOG_ICON_SIZE,
|
|
||||||
style_class: dialogContent.iconStyleClass });
|
|
||||||
} else {
|
|
||||||
let avatarWidget = new UserWidget.Avatar(this._user,
|
|
||||||
{ iconSize: _DIALOG_ICON_SIZE,
|
|
||||||
styleClass: dialogContent.iconStyleClass });
|
|
||||||
this._iconBin.child = avatarWidget;
|
|
||||||
avatarWidget.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
let hasApplications = this._applications.length > 0;
|
let hasApplications = this._applications.length > 0;
|
||||||
let hasSessions = this._sessions.length > 0;
|
let hasSessions = this._sessions.length > 0;
|
||||||
this._scrollView.visible = hasApplications || hasSessions;
|
|
||||||
this._applicationHeader.visible = hasApplications;
|
this._applicationSection.visible = hasApplications;
|
||||||
this._sessionHeader.visible = hasSessions;
|
this._sessionSection.visible = hasSessions;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateButtons() {
|
_updateButtons() {
|
||||||
@ -593,31 +522,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._secondsLeft = 0;
|
this._secondsLeft = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_constructListItemForApp(inhibitor, app) {
|
|
||||||
let actor = new St.BoxLayout({ style_class: 'end-session-dialog-app-list-item',
|
|
||||||
can_focus: true });
|
|
||||||
actor.add(app.create_icon_texture(_ITEM_ICON_SIZE));
|
|
||||||
|
|
||||||
let textLayout = new St.BoxLayout({ vertical: true,
|
|
||||||
y_expand: true,
|
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
|
||||||
actor.add(textLayout);
|
|
||||||
|
|
||||||
let nameLabel = new St.Label({ text: app.get_name(),
|
|
||||||
style_class: 'end-session-dialog-app-list-item-name' });
|
|
||||||
textLayout.add(nameLabel);
|
|
||||||
actor.label_actor = nameLabel;
|
|
||||||
|
|
||||||
let [reason] = inhibitor.GetReasonSync();
|
|
||||||
if (reason) {
|
|
||||||
let reasonLabel = new St.Label({ text: reason,
|
|
||||||
style_class: 'end-session-dialog-app-list-item-description' });
|
|
||||||
textLayout.add(reasonLabel);
|
|
||||||
}
|
|
||||||
|
|
||||||
return actor;
|
|
||||||
}
|
|
||||||
|
|
||||||
_onInhibitorLoaded(inhibitor) {
|
_onInhibitorLoaded(inhibitor) {
|
||||||
if (!this._applications.includes(inhibitor)) {
|
if (!this._applications.includes(inhibitor)) {
|
||||||
// Stale inhibitor
|
// Stale inhibitor
|
||||||
@ -627,8 +531,13 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
let app = findAppFromInhibitor(inhibitor);
|
let app = findAppFromInhibitor(inhibitor);
|
||||||
|
|
||||||
if (app) {
|
if (app) {
|
||||||
let actor = this._constructListItemForApp(inhibitor, app);
|
let [description] = inhibitor.GetReasonSync();
|
||||||
this._applicationList.add(actor);
|
let listItem = new Dialog.ListSectionItem({
|
||||||
|
icon_actor: app.create_icon_texture(_ITEM_ICON_SIZE),
|
||||||
|
title: app.get_name(),
|
||||||
|
description,
|
||||||
|
});
|
||||||
|
this._applicationSection.list.add_child(listItem);
|
||||||
} else {
|
} else {
|
||||||
// inhibiting app is a service, not an application
|
// inhibiting app is a service, not an application
|
||||||
this._applications.splice(this._applications.indexOf(inhibitor), 1);
|
this._applications.splice(this._applications.indexOf(inhibitor), 1);
|
||||||
@ -637,36 +546,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
this._sync();
|
this._sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
_constructListItemForSession(session) {
|
|
||||||
let avatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE });
|
|
||||||
avatar.update();
|
|
||||||
|
|
||||||
let userName = session.user.get_real_name() ? session.user.get_real_name() : session.username;
|
|
||||||
let userLabelText;
|
|
||||||
|
|
||||||
if (session.remote)
|
|
||||||
/* Translators: Remote here refers to a remote session, like a ssh login */
|
|
||||||
userLabelText = _("%s (remote)").format(userName);
|
|
||||||
else if (session.type == "tty")
|
|
||||||
/* Translators: Console here refers to a tty like a VT console */
|
|
||||||
userLabelText = _("%s (console)").format(userName);
|
|
||||||
else
|
|
||||||
userLabelText = userName;
|
|
||||||
|
|
||||||
let actor = new St.BoxLayout({ style_class: 'end-session-dialog-session-list-item',
|
|
||||||
can_focus: true });
|
|
||||||
actor.add(avatar);
|
|
||||||
|
|
||||||
let nameLabel = new St.Label({ text: userLabelText,
|
|
||||||
style_class: 'end-session-dialog-session-list-item-name',
|
|
||||||
y_expand: true,
|
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
|
||||||
actor.add(nameLabel);
|
|
||||||
actor.label_actor = nameLabel;
|
|
||||||
|
|
||||||
return actor;
|
|
||||||
}
|
|
||||||
|
|
||||||
_loadSessions() {
|
_loadSessions() {
|
||||||
this._loginManager.listSessions(result => {
|
this._loginManager.listSessions(result => {
|
||||||
let n = 0;
|
let n = 0;
|
||||||
@ -697,8 +576,27 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
remote: proxy.Remote };
|
remote: proxy.Remote };
|
||||||
this._sessions.push(session);
|
this._sessions.push(session);
|
||||||
|
|
||||||
let actor = this._constructListItemForSession(session);
|
let userAvatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE });
|
||||||
this._sessionList.add(actor);
|
userAvatar.update();
|
||||||
|
|
||||||
|
userName = session.user.get_real_name()
|
||||||
|
? session.user.get_real_name() : session.username;
|
||||||
|
|
||||||
|
let userLabelText;
|
||||||
|
if (session.remote)
|
||||||
|
/* Translators: Remote here refers to a remote session, like a ssh login */
|
||||||
|
userLabelText = _('%s (remote)').format(userName);
|
||||||
|
else if (session.type === 'tty')
|
||||||
|
/* Translators: Console here refers to a tty like a VT console */
|
||||||
|
userLabelText = _('%s (console)').format(userName);
|
||||||
|
else
|
||||||
|
userLabelText = userName;
|
||||||
|
|
||||||
|
let listItem = new Dialog.ListSectionItem({
|
||||||
|
icon_actor: userAvatar,
|
||||||
|
title: userLabelText,
|
||||||
|
});
|
||||||
|
this._sessionSection.list.add_child(listItem);
|
||||||
|
|
||||||
// limit the number of entries
|
// limit the number of entries
|
||||||
n++;
|
n++;
|
||||||
@ -724,10 +622,10 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._applications = [];
|
this._applications = [];
|
||||||
this._applicationList.destroy_all_children();
|
this._applicationSection.list.destroy_all_children();
|
||||||
|
|
||||||
this._sessions = [];
|
this._sessions = [];
|
||||||
this._sessionList.destroy_all_children();
|
this._sessionSection.list.destroy_all_children();
|
||||||
|
|
||||||
if (!(this._type in DialogContent)) {
|
if (!(this._type in DialogContent)) {
|
||||||
invocation.return_dbus_error('org.gnome.Shell.ModalDialog.TypeError',
|
invocation.return_dbus_error('org.gnome.Shell.ModalDialog.TypeError',
|
||||||
|
@ -247,8 +247,8 @@ function init() {
|
|||||||
origSetEasingDelay.call(this, adjustAnimationTime(msecs));
|
origSetEasingDelay.call(this, adjustAnimationTime(msecs));
|
||||||
};
|
};
|
||||||
|
|
||||||
Clutter.Actor.prototype.ease = function (props, easingParams) {
|
Clutter.Actor.prototype.ease = function (props) {
|
||||||
_easeActor(this, props, easingParams);
|
_easeActor(this, props);
|
||||||
};
|
};
|
||||||
Clutter.Actor.prototype.ease_property = function (propName, target, params) {
|
Clutter.Actor.prototype.ease_property = function (propName, target, params) {
|
||||||
_easeActorProperty(this, propName, target, params);
|
_easeActorProperty(this, propName, target, params);
|
||||||
|
@ -198,9 +198,6 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
|
|||||||
|
|
||||||
let content = new Dialog.MessageDialogContent({
|
let content = new Dialog.MessageDialogContent({
|
||||||
title: _("Download and install “%s” from extensions.gnome.org?").format(info.name),
|
title: _("Download and install “%s” from extensions.gnome.org?").format(info.name),
|
||||||
icon: new Gio.FileIcon({
|
|
||||||
file: Gio.File.new_for_uri(`${REPOSITORY_URL_BASE}${info.icon}`),
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.contentLayout.add(content);
|
this.contentLayout.add(content);
|
||||||
|
@ -194,6 +194,15 @@ var GrabHelper = class GrabHelper {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grabAsync(params) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
params.onUngrab = resolve;
|
||||||
|
|
||||||
|
if (!this.grab(params))
|
||||||
|
reject(new Error('Grab failed'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
_takeModalGrab() {
|
_takeModalGrab() {
|
||||||
let firstGrab = this._modalCount == 0;
|
let firstGrab = this._modalCount == 0;
|
||||||
if (firstGrab) {
|
if (firstGrab) {
|
||||||
|
@ -28,6 +28,8 @@ var AnimationDirection = {
|
|||||||
var APPICON_ANIMATION_OUT_SCALE = 3;
|
var APPICON_ANIMATION_OUT_SCALE = 3;
|
||||||
var APPICON_ANIMATION_OUT_TIME = 250;
|
var APPICON_ANIMATION_OUT_TIME = 250;
|
||||||
|
|
||||||
|
const ICON_POSITION_DELAY = 25;
|
||||||
|
|
||||||
var BaseIcon = GObject.registerClass(
|
var BaseIcon = GObject.registerClass(
|
||||||
class BaseIcon extends St.Bin {
|
class BaseIcon extends St.Bin {
|
||||||
_init(label, params) {
|
_init(label, params) {
|
||||||
@ -51,7 +53,7 @@ class BaseIcon extends St.Bin {
|
|||||||
this.set_child(this._box);
|
this.set_child(this._box);
|
||||||
|
|
||||||
this.iconSize = ICON_SIZE;
|
this.iconSize = ICON_SIZE;
|
||||||
this._iconBin = new St.Bin();
|
this._iconBin = new St.Bin({ x_align: Clutter.ActorAlign.CENTER });
|
||||||
|
|
||||||
this._box.add_actor(this._iconBin);
|
this._box.add_actor(this._iconBin);
|
||||||
|
|
||||||
@ -194,6 +196,23 @@ function zoomOutActorAtPos(actor, x, y) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function animateIconPosition(icon, box, flags, nChangedIcons) {
|
||||||
|
if (!icon.has_allocation() || icon.allocation.equal(box)) {
|
||||||
|
icon.allocate(box, flags);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
icon.save_easing_state();
|
||||||
|
icon.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
|
||||||
|
icon.set_easing_delay(nChangedIcons * ICON_POSITION_DELAY);
|
||||||
|
|
||||||
|
icon.allocate(box, flags);
|
||||||
|
|
||||||
|
icon.restore_easing_state();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
var IconGrid = GObject.registerClass({
|
var IconGrid = GObject.registerClass({
|
||||||
Signals: { 'animation-done': {},
|
Signals: { 'animation-done': {},
|
||||||
'child-focused': { param_types: [Clutter.Actor.$gtype] } },
|
'child-focused': { param_types: [Clutter.Actor.$gtype] } },
|
||||||
@ -366,6 +385,7 @@ var IconGrid = GObject.registerClass({
|
|||||||
let y = box.y1 + this.topPadding;
|
let y = box.y1 + this.topPadding;
|
||||||
let columnIndex = 0;
|
let columnIndex = 0;
|
||||||
let rowIndex = 0;
|
let rowIndex = 0;
|
||||||
|
let nChangedIcons = 0;
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
let childBox = this._calculateChildBox(children[i], x, y, box);
|
let childBox = this._calculateChildBox(children[i], x, y, box);
|
||||||
|
|
||||||
@ -375,7 +395,9 @@ var IconGrid = GObject.registerClass({
|
|||||||
} else {
|
} else {
|
||||||
if (!animating)
|
if (!animating)
|
||||||
children[i].opacity = 255;
|
children[i].opacity = 255;
|
||||||
children[i].allocate(childBox, flags);
|
|
||||||
|
if (animateIconPosition(children[i], childBox, flags, nChangedIcons))
|
||||||
|
nChangedIcons++;
|
||||||
}
|
}
|
||||||
|
|
||||||
columnIndex++;
|
columnIndex++;
|
||||||
@ -557,14 +579,14 @@ var IconGrid = GObject.registerClass({
|
|||||||
|
|
||||||
actorClone.opacity = 0;
|
actorClone.opacity = 0;
|
||||||
actorClone.set_scale(scaleX, scaleY);
|
actorClone.set_scale(scaleX, scaleY);
|
||||||
|
actorClone.set_translation(
|
||||||
actorClone.set_position(adjustedSourcePositionX, adjustedSourcePositionY);
|
adjustedSourcePositionX, adjustedSourcePositionY, 0);
|
||||||
|
|
||||||
let delay = (1 - (actor._distance - minDist) / normalization) * ANIMATION_MAX_DELAY_FOR_ITEM;
|
let delay = (1 - (actor._distance - minDist) / normalization) * ANIMATION_MAX_DELAY_FOR_ITEM;
|
||||||
let [finalX, finalY] = actor._transformedPosition;
|
let [finalX, finalY] = actor._transformedPosition;
|
||||||
movementParams = {
|
movementParams = {
|
||||||
x: finalX,
|
translation_x: finalX,
|
||||||
y: finalY,
|
translation_y: finalY,
|
||||||
scale_x: 1,
|
scale_x: 1,
|
||||||
scale_y: 1,
|
scale_y: 1,
|
||||||
duration: ANIMATION_TIME_IN,
|
duration: ANIMATION_TIME_IN,
|
||||||
@ -585,12 +607,12 @@ var IconGrid = GObject.registerClass({
|
|||||||
let isLastItem = actor._distance == maxDist;
|
let isLastItem = actor._distance == maxDist;
|
||||||
|
|
||||||
let [startX, startY] = actor._transformedPosition;
|
let [startX, startY] = actor._transformedPosition;
|
||||||
actorClone.set_position(startX, startY);
|
actorClone.set_translation(startX, startY, 0);
|
||||||
|
|
||||||
let delay = (actor._distance - minDist) / normalization * ANIMATION_MAX_DELAY_OUT_FOR_ITEM;
|
let delay = (actor._distance - minDist) / normalization * ANIMATION_MAX_DELAY_OUT_FOR_ITEM;
|
||||||
movementParams = {
|
movementParams = {
|
||||||
x: adjustedSourcePositionX,
|
translation_x: adjustedSourcePositionX,
|
||||||
y: adjustedSourcePositionY,
|
translation_y: adjustedSourcePositionY,
|
||||||
scale_x: scaleX,
|
scale_x: scaleX,
|
||||||
scale_y: scaleY,
|
scale_y: scaleY,
|
||||||
duration: ANIMATION_TIME_OUT,
|
duration: ANIMATION_TIME_OUT,
|
||||||
@ -875,9 +897,13 @@ var PaginatedIconGrid = GObject.registerClass({
|
|||||||
let y = box.y1 + this.topPadding;
|
let y = box.y1 + this.topPadding;
|
||||||
let columnIndex = 0;
|
let columnIndex = 0;
|
||||||
|
|
||||||
|
let nChangedIcons = 0;
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
let childBox = this._calculateChildBox(children[i], x, y, box);
|
let childBox = this._calculateChildBox(children[i], x, y, box);
|
||||||
children[i].allocate(childBox, flags);
|
|
||||||
|
if (animateIconPosition(children[i], childBox, flags, nChangedIcons))
|
||||||
|
nChangedIcons++;
|
||||||
|
|
||||||
children[i].show();
|
children[i].show();
|
||||||
|
|
||||||
columnIndex++;
|
columnIndex++;
|
||||||
|
@ -79,13 +79,12 @@ var InhibitShortcutsDialog = GObject.registerClass({
|
|||||||
let title = name
|
let title = name
|
||||||
? _("%s wants to inhibit shortcuts").format(name)
|
? _("%s wants to inhibit shortcuts").format(name)
|
||||||
: _("Application wants to inhibit shortcuts");
|
: _("Application wants to inhibit shortcuts");
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' });
|
|
||||||
|
|
||||||
let contentParams = { icon, title };
|
let contentParams = { title };
|
||||||
|
|
||||||
let restoreAccel = this._getRestoreAccel();
|
let restoreAccel = this._getRestoreAccel();
|
||||||
if (restoreAccel) {
|
if (restoreAccel) {
|
||||||
contentParams.subtitle =
|
contentParams.description =
|
||||||
/* Translators: %s is a keyboard shortcut like "Super+x" */
|
/* Translators: %s is a keyboard shortcut like "Super+x" */
|
||||||
_("You can restore shortcuts by pressing %s.").format(restoreAccel);
|
_("You can restore shortcuts by pressing %s.").format(restoreAccel);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class KbdA11yDialog extends GObject.Object {
|
|||||||
|
|
||||||
_showKbdA11yDialog(deviceManager, newFlags, whatChanged) {
|
_showKbdA11yDialog(deviceManager, newFlags, whatChanged) {
|
||||||
let dialog = new ModalDialog.ModalDialog();
|
let dialog = new ModalDialog.ModalDialog();
|
||||||
let title, body;
|
let title, description;
|
||||||
let key, enabled;
|
let key, enabled;
|
||||||
|
|
||||||
if (whatChanged & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
|
if (whatChanged & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
|
||||||
@ -31,8 +31,8 @@ class KbdA11yDialog extends GObject.Object {
|
|||||||
title = enabled
|
title = enabled
|
||||||
? _("Slow Keys Turned On")
|
? _("Slow Keys Turned On")
|
||||||
: _("Slow Keys Turned Off");
|
: _("Slow Keys Turned Off");
|
||||||
body = _("You just held down the Shift key for 8 seconds. This is the shortcut " +
|
description = _('You just held down the Shift key for 8 seconds. This is the shortcut ' +
|
||||||
"for the Slow Keys feature, which affects the way your keyboard works.");
|
'for the Slow Keys feature, which affects the way your keyboard works.');
|
||||||
|
|
||||||
} else if (whatChanged & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
|
} else if (whatChanged & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
|
||||||
key = KEY_STICKY_KEYS_ENABLED;
|
key = KEY_STICKY_KEYS_ENABLED;
|
||||||
@ -40,7 +40,7 @@ class KbdA11yDialog extends GObject.Object {
|
|||||||
title = enabled
|
title = enabled
|
||||||
? _("Sticky Keys Turned On")
|
? _("Sticky Keys Turned On")
|
||||||
: _("Sticky Keys Turned Off");
|
: _("Sticky Keys Turned Off");
|
||||||
body = enabled
|
description = enabled
|
||||||
? _("You just pressed the Shift key 5 times in a row. This is the shortcut " +
|
? _("You just pressed the Shift key 5 times in a row. This is the shortcut " +
|
||||||
"for the Sticky Keys feature, which affects the way your keyboard works.")
|
"for the Sticky Keys feature, which affects the way your keyboard works.")
|
||||||
: _("You just pressed two keys at once, or pressed the Shift key 5 times in a row. " +
|
: _("You just pressed two keys at once, or pressed the Shift key 5 times in a row. " +
|
||||||
@ -49,8 +49,7 @@ class KbdA11yDialog extends GObject.Object {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'preferences-desktop-accessibility-symbolic' });
|
let contentParams = { title, description, styleClass: 'access-dialog' };
|
||||||
let contentParams = { icon, title, body, styleClass: 'access-dialog' };
|
|
||||||
let content = new Dialog.MessageDialogContent(contentParams);
|
let content = new Dialog.MessageDialogContent(contentParams);
|
||||||
|
|
||||||
dialog.contentLayout.add_actor(content);
|
dialog.contentLayout.add_actor(content);
|
||||||
|
@ -6,7 +6,7 @@ const { Clutter, GObject, Shell, St } = imports.gi;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
var DEFAULT_FADE_FACTOR = 0.4;
|
var DEFAULT_FADE_FACTOR = 0.4;
|
||||||
var VIGNETTE_BRIGHTNESS = 0.2;
|
var VIGNETTE_BRIGHTNESS = 0.5;
|
||||||
var VIGNETTE_SHARPNESS = 0.7;
|
var VIGNETTE_SHARPNESS = 0.7;
|
||||||
|
|
||||||
const VIGNETTE_DECLARATIONS = '\
|
const VIGNETTE_DECLARATIONS = '\
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/* exported componentManager, notificationDaemon, windowAttentionHandler,
|
/* exported componentManager, notificationDaemon, windowAttentionHandler,
|
||||||
ctrlAltTabManager, padOsdService, osdWindowManager,
|
ctrlAltTabManager, padOsdService, osdWindowManager,
|
||||||
osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
|
osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
|
||||||
shellAccessDialogDBusService, shellAudioSelectionDBusService,
|
shellAudioSelectionDBusService,
|
||||||
screenSaverDBus, screencastService, uiGroup, magnifier,
|
screenSaverDBus, screencastService, uiGroup, magnifier,
|
||||||
xdndHandler, keyboard, kbdA11yDialog, introspectService,
|
xdndHandler, keyboard, kbdA11yDialog, introspectService,
|
||||||
start, pushModal, popModal, activateWindow, createLookingGlass,
|
start, pushModal, popModal, activateWindow, createLookingGlass,
|
||||||
@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const AccessDialog = imports.ui.accessDialog;
|
|
||||||
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
|
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
|
||||||
const Components = imports.ui.components;
|
const Components = imports.ui.components;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
@ -68,7 +67,6 @@ var padOsdService = null;
|
|||||||
var osdWindowManager = null;
|
var osdWindowManager = null;
|
||||||
var osdMonitorLabeler = null;
|
var osdMonitorLabeler = null;
|
||||||
var sessionMode = null;
|
var sessionMode = null;
|
||||||
var shellAccessDialogDBusService = null;
|
|
||||||
var shellAudioSelectionDBusService = null;
|
var shellAudioSelectionDBusService = null;
|
||||||
var shellDBusService = null;
|
var shellDBusService = null;
|
||||||
var shellMountOpDBusService = null;
|
var shellMountOpDBusService = null;
|
||||||
@ -137,7 +135,6 @@ function start() {
|
|||||||
St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet);
|
St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet);
|
||||||
_initializeUI();
|
_initializeUI();
|
||||||
|
|
||||||
shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus();
|
|
||||||
shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
|
shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
|
||||||
shellDBusService = new ShellDBus.GnomeShell();
|
shellDBusService = new ShellDBus.GnomeShell();
|
||||||
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
||||||
|
@ -436,11 +436,28 @@ class ControlsManager extends St.Widget {
|
|||||||
this._dashSpacer = new DashSpacer();
|
this._dashSpacer = new DashSpacer();
|
||||||
this._dashSpacer.setDashActor(this._dashSlider);
|
this._dashSpacer.setDashActor(this._dashSlider);
|
||||||
|
|
||||||
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index();
|
||||||
|
|
||||||
|
this._workspaceAdjustment = new St.Adjustment({
|
||||||
|
value: activeWorkspaceIndex,
|
||||||
|
lower: 0,
|
||||||
|
page_increment: 1,
|
||||||
|
page_size: 1,
|
||||||
|
step_increment: 0,
|
||||||
|
upper: workspaceManager.n_workspaces,
|
||||||
|
});
|
||||||
|
|
||||||
|
this._nWorkspacesNotifyId =
|
||||||
|
workspaceManager.connect('notify::n-workspaces',
|
||||||
|
this._updateAdjustment.bind(this));
|
||||||
|
|
||||||
|
this._thumbnailsBox =
|
||||||
|
new WorkspaceThumbnail.ThumbnailsBox(this._workspaceAdjustment);
|
||||||
this._thumbnailsSlider = new ThumbnailsSlider(this._thumbnailsBox);
|
this._thumbnailsSlider = new ThumbnailsSlider(this._thumbnailsBox);
|
||||||
|
|
||||||
this.viewSelector = new ViewSelector.ViewSelector(searchEntry,
|
this.viewSelector = new ViewSelector.ViewSelector(searchEntry,
|
||||||
this.dash.showAppsButton);
|
this._workspaceAdjustment, this.dash.showAppsButton);
|
||||||
this.viewSelector.connect('page-changed', this._setVisibility.bind(this));
|
this.viewSelector.connect('page-changed', this._setVisibility.bind(this));
|
||||||
this.viewSelector.connect('page-empty', this._onPageEmpty.bind(this));
|
this.viewSelector.connect('page-empty', this._onPageEmpty.bind(this));
|
||||||
|
|
||||||
@ -457,6 +474,24 @@ class ControlsManager extends St.Widget {
|
|||||||
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
|
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
|
||||||
|
|
||||||
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
|
Main.overview.connect('showing', this._updateSpacerVisibility.bind(this));
|
||||||
|
|
||||||
|
this.connect('destroy', this._onDestroy.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
_onDestroy() {
|
||||||
|
global.workspace_manager.disconnect(this._nWorkspacesNotifyId);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateAdjustment() {
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let newNumWorkspaces = workspaceManager.n_workspaces;
|
||||||
|
let activeIndex = workspaceManager.get_active_workspace_index();
|
||||||
|
|
||||||
|
this._workspaceAdjustment.upper = newNumWorkspaces;
|
||||||
|
|
||||||
|
// A workspace might have been inserted or removed before the active
|
||||||
|
// one, causing the adjustment to go out of sync, so update the value
|
||||||
|
this._workspaceAdjustment.value = activeIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateWorkspacesGeometry() {
|
_updateWorkspacesGeometry() {
|
||||||
|
@ -564,6 +564,14 @@ var PadDiagram = GObject.registerClass({
|
|||||||
this.add_actor(label);
|
this.add_actor(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateLabels(getText) {
|
||||||
|
for (let i = 0; i < this._labels.length; i++) {
|
||||||
|
let [label, action, idx, dir] = this._labels[i];
|
||||||
|
let str = getText(action, idx, dir);
|
||||||
|
label.set_text(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_applyLabel(label, action, idx, dir, str) {
|
_applyLabel(label, action, idx, dir, str) {
|
||||||
if (str != null) {
|
if (str != null) {
|
||||||
label.set_text(str);
|
label.set_text(str);
|
||||||
@ -776,17 +784,29 @@ var PadOsd = GObject.registerClass({
|
|||||||
global.display.request_pad_osd(pad, editionMode);
|
global.display.request_pad_osd(pad, editionMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
_createLabel(type, number, dir) {
|
_getActionText(type, number) {
|
||||||
let str = global.display.get_pad_action_label(this.padDevice, type, number);
|
let str = global.display.get_pad_action_label(this.padDevice, type, number);
|
||||||
let label = new St.Label({ text: str ? str : _("None") });
|
return str ? str : _("None");
|
||||||
|
}
|
||||||
|
|
||||||
|
_createLabel(type, number, dir) {
|
||||||
|
let label = new St.Label({ text: this._getActionText(type, number) });
|
||||||
this._padDiagram.addLabel(label, type, number, dir);
|
this._padDiagram.addLabel(label, type, number, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_updateActionLabels() {
|
||||||
|
this._padDiagram.updateLabels(this._getActionText.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
_onCapturedEvent(actor, event) {
|
_onCapturedEvent(actor, event) {
|
||||||
|
let isModeSwitch =
|
||||||
|
(event.type() == Clutter.EventType.PAD_BUTTON_PRESS ||
|
||||||
|
event.type() == Clutter.EventType.PAD_BUTTON_RELEASE) &&
|
||||||
|
this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0;
|
||||||
|
|
||||||
if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
|
if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS &&
|
||||||
event.get_source_device() == this.padDevice) {
|
event.get_source_device() == this.padDevice) {
|
||||||
this._padDiagram.activateButton(event.get_button());
|
this._padDiagram.activateButton(event.get_button());
|
||||||
let isModeSwitch = this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0;
|
|
||||||
|
|
||||||
/* Buttons that switch between modes cannot be edited */
|
/* Buttons that switch between modes cannot be edited */
|
||||||
if (this._editionMode && !isModeSwitch)
|
if (this._editionMode && !isModeSwitch)
|
||||||
@ -795,6 +815,11 @@ var PadOsd = GObject.registerClass({
|
|||||||
} else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
|
} else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
|
||||||
event.get_source_device() == this.padDevice) {
|
event.get_source_device() == this.padDevice) {
|
||||||
this._padDiagram.deactivateButton(event.get_button());
|
this._padDiagram.deactivateButton(event.get_button());
|
||||||
|
|
||||||
|
if (isModeSwitch) {
|
||||||
|
this._endActionEdition();
|
||||||
|
this._updateActionLabels();
|
||||||
|
}
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
} else if (event.type() == Clutter.EventType.KEY_PRESS &&
|
} else if (event.type() == Clutter.EventType.KEY_PRESS &&
|
||||||
(!this._editionMode || event.get_key_symbol() === Clutter.KEY_Escape)) {
|
(!this._editionMode || event.get_key_symbol() === Clutter.KEY_Escape)) {
|
||||||
|
@ -962,7 +962,7 @@ class Panel extends St.Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_toggleMenu(indicator) {
|
_toggleMenu(indicator) {
|
||||||
if (!indicator || !indicator.container.visible)
|
if (!indicator || !indicator.mapped)
|
||||||
return; // menu not supported by current session mode
|
return; // menu not supported by current session mode
|
||||||
|
|
||||||
let menu = indicator.menu;
|
let menu = indicator.menu;
|
||||||
|
@ -814,7 +814,12 @@ var PopupMenu = class extends PopupMenuBase {
|
|||||||
|
|
||||||
if (this.sourceActor) {
|
if (this.sourceActor) {
|
||||||
this._keyPressId = this.sourceActor.connect('key-press-event',
|
this._keyPressId = this.sourceActor.connect('key-press-event',
|
||||||
this._onKeyPress.bind(this));
|
this._onKeyPress.bind(this));
|
||||||
|
this._notifyMappedId = this.sourceActor.connect('notify::mapped',
|
||||||
|
() => {
|
||||||
|
if (!this.sourceActor.mapped)
|
||||||
|
this.close();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._systemModalOpenedId = 0;
|
this._systemModalOpenedId = 0;
|
||||||
@ -928,6 +933,9 @@ var PopupMenu = class extends PopupMenuBase {
|
|||||||
if (this._keyPressId)
|
if (this._keyPressId)
|
||||||
this.sourceActor.disconnect(this._keyPressId);
|
this.sourceActor.disconnect(this._keyPressId);
|
||||||
|
|
||||||
|
if (this._notifyMappedId)
|
||||||
|
this.sourceActor.disconnect(this._notifyMappedId);
|
||||||
|
|
||||||
if (this._systemModalOpenedId)
|
if (this._systemModalOpenedId)
|
||||||
Main.layoutManager.disconnect(this._systemModalOpenedId);
|
Main.layoutManager.disconnect(this._systemModalOpenedId);
|
||||||
this._systemModalOpenedId = 0;
|
this._systemModalOpenedId = 0;
|
||||||
|
@ -777,7 +777,7 @@ var ScreenShield = class {
|
|||||||
let newY = currentY - origY;
|
let newY = currentY - origY;
|
||||||
newY = clamp(newY, -global.stage.height, 0);
|
newY = clamp(newY, -global.stage.height, 0);
|
||||||
|
|
||||||
this._lockScreenGroup.y = newY;
|
this._lockScreenGroup.translation_y = newY;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -785,7 +785,7 @@ var ScreenShield = class {
|
|||||||
_onDragEnd(_action, _actor, _eventX, _eventY, _modifiers) {
|
_onDragEnd(_action, _actor, _eventX, _eventY, _modifiers) {
|
||||||
if (this._lockScreenState != MessageTray.State.HIDING)
|
if (this._lockScreenState != MessageTray.State.HIDING)
|
||||||
return;
|
return;
|
||||||
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
|
if (this._lockScreenGroup.translation_y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
|
||||||
// Complete motion automatically
|
// Complete motion automatically
|
||||||
let [velocity_, velocityX_, velocityY] = this._dragAction.get_velocity(0);
|
let [velocity_, velocityX_, velocityY] = this._dragAction.get_velocity(0);
|
||||||
this._liftShield(true, -velocityY);
|
this._liftShield(true, -velocityY);
|
||||||
@ -793,14 +793,13 @@ var ScreenShield = class {
|
|||||||
// restore the lock screen to its original place
|
// restore the lock screen to its original place
|
||||||
// try to use the same speed as the normal animation
|
// try to use the same speed as the normal animation
|
||||||
let h = global.stage.height;
|
let h = global.stage.height;
|
||||||
let duration = MANUAL_FADE_TIME * -this._lockScreenGroup.y / h;
|
let duration = MANUAL_FADE_TIME * -this._lockScreenGroup.translation_y / h;
|
||||||
this._lockScreenGroup.remove_all_transitions();
|
this._lockScreenGroup.remove_all_transitions();
|
||||||
this._lockScreenGroup.ease({
|
this._lockScreenGroup.ease({
|
||||||
y: 0,
|
translation_y: 0,
|
||||||
duration,
|
duration,
|
||||||
mode: Clutter.AnimationMode.EASE_IN_QUAD,
|
mode: Clutter.AnimationMode.EASE_IN_QUAD,
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
this._lockScreenGroup.fixed_position_set = false;
|
|
||||||
this._lockScreenState = MessageTray.State.SHOWN;
|
this._lockScreenState = MessageTray.State.SHOWN;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
@ -945,14 +944,14 @@ var ScreenShield = class {
|
|||||||
// use the same speed regardless of original position
|
// use the same speed regardless of original position
|
||||||
// if velocity is specified, it's in pixels per milliseconds
|
// if velocity is specified, it's in pixels per milliseconds
|
||||||
let h = global.stage.height;
|
let h = global.stage.height;
|
||||||
let delta = h + this._lockScreenGroup.y;
|
let delta = h + this._lockScreenGroup.translation_y;
|
||||||
let minVelocity = global.stage.height / CURTAIN_SLIDE_TIME;
|
let minVelocity = global.stage.height / CURTAIN_SLIDE_TIME;
|
||||||
|
|
||||||
velocity = Math.max(minVelocity, velocity);
|
velocity = Math.max(minVelocity, velocity);
|
||||||
let duration = delta / velocity;
|
let duration = delta / velocity;
|
||||||
|
|
||||||
this._lockScreenGroup.ease({
|
this._lockScreenGroup.ease({
|
||||||
y: -h,
|
translation_y: -h,
|
||||||
duration,
|
duration,
|
||||||
mode: Clutter.AnimationMode.EASE_IN_QUAD,
|
mode: Clutter.AnimationMode.EASE_IN_QUAD,
|
||||||
onComplete: () => this._hideLockScreenComplete(),
|
onComplete: () => this._hideLockScreenComplete(),
|
||||||
@ -1014,10 +1013,10 @@ var ScreenShield = class {
|
|||||||
let fadeToBlack = params.fadeToBlack;
|
let fadeToBlack = params.fadeToBlack;
|
||||||
|
|
||||||
if (params.animateLockScreen) {
|
if (params.animateLockScreen) {
|
||||||
this._lockScreenGroup.y = -global.screen_height;
|
this._lockScreenGroup.translation_y = -global.screen_height;
|
||||||
this._lockScreenGroup.remove_all_transitions();
|
this._lockScreenGroup.remove_all_transitions();
|
||||||
this._lockScreenGroup.ease({
|
this._lockScreenGroup.ease({
|
||||||
y: 0,
|
translation_y: 0,
|
||||||
duration: MANUAL_FADE_TIME,
|
duration: MANUAL_FADE_TIME,
|
||||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||||
onComplete: () => {
|
onComplete: () => {
|
||||||
@ -1025,7 +1024,7 @@ var ScreenShield = class {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this._lockScreenGroup.fixed_position_set = false;
|
this._lockScreenGroup.translation_y = 0;
|
||||||
this._lockScreenShown({ fadeToBlack, animateFade: false });
|
this._lockScreenShown({ fadeToBlack, animateFade: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1103,7 +1102,6 @@ var ScreenShield = class {
|
|||||||
this._cursorTracker.set_pointer_visible(false);
|
this._cursorTracker.set_pointer_visible(false);
|
||||||
|
|
||||||
this._lockScreenState = MessageTray.State.SHOWN;
|
this._lockScreenState = MessageTray.State.SHOWN;
|
||||||
this._lockScreenGroup.fixed_position_set = false;
|
|
||||||
this._lockScreenScrollCounter = 0;
|
this._lockScreenScrollCounter = 0;
|
||||||
|
|
||||||
if (params.fadeToBlack && params.animateFade) {
|
if (params.fadeToBlack && params.animateFade) {
|
||||||
|
@ -65,8 +65,7 @@ var ScreenshotService = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
*_resolveRelativeFilename(filename) {
|
*_resolveRelativeFilename(filename) {
|
||||||
if (GLib.str_has_suffix(filename, '.png'))
|
filename = filename.replace(/\.png$/, '');
|
||||||
filename = filename.substr(0, -4);
|
|
||||||
|
|
||||||
let path = [
|
let path = [
|
||||||
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES),
|
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES),
|
||||||
@ -227,20 +226,19 @@ var ScreenshotService = class {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
SelectAreaAsync(params, invocation) {
|
async SelectAreaAsync(params, invocation) {
|
||||||
let selectArea = new SelectArea();
|
let selectArea = new SelectArea();
|
||||||
selectArea.show();
|
try {
|
||||||
selectArea.connect('finished', (o, areaRectangle) => {
|
let areaRectangle = await selectArea.selectAsync();
|
||||||
if (areaRectangle) {
|
let retRectangle = this._unscaleArea(
|
||||||
let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y,
|
areaRectangle.x, areaRectangle.y,
|
||||||
areaRectangle.width, areaRectangle.height);
|
areaRectangle.width, areaRectangle.height);
|
||||||
let retval = GLib.Variant.new('(iiii)', retRectangle);
|
invocation.return_value(GLib.Variant.new('(iiii)', retRectangle));
|
||||||
invocation.return_value(retval);
|
} catch (e) {
|
||||||
} else {
|
invocation.return_error_literal(
|
||||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||||
"Operation was cancelled");
|
'Operation was cancelled');
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FlashAreaAsync(params, invocation) {
|
FlashAreaAsync(params, invocation) {
|
||||||
@ -257,38 +255,38 @@ var ScreenshotService = class {
|
|||||||
invocation.return_value(null);
|
invocation.return_value(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
PickColorAsync(params, invocation) {
|
async PickColorAsync(params, invocation) {
|
||||||
let pickPixel = new PickPixel();
|
let pickPixel = new PickPixel();
|
||||||
pickPixel.show();
|
try {
|
||||||
pickPixel.connect('finished', (obj, coords) => {
|
const coords = await pickPixel.pickAsync();
|
||||||
if (coords) {
|
|
||||||
let screenshot = this._createScreenshot(invocation, false);
|
let screenshot = this._createScreenshot(invocation, false);
|
||||||
if (!screenshot)
|
if (!screenshot)
|
||||||
return;
|
return;
|
||||||
screenshot.pick_color(coords.x, coords.y, (_o, res) => {
|
|
||||||
let [success_, color] = screenshot.pick_color_finish(res);
|
screenshot.pick_color(coords.x, coords.y, (_o, res) => {
|
||||||
let { red, green, blue } = color;
|
let [success_, color] = screenshot.pick_color_finish(res);
|
||||||
let retval = GLib.Variant.new('(a{sv})', [{
|
let { red, green, blue } = color;
|
||||||
color: GLib.Variant.new('(ddd)', [
|
let retval = GLib.Variant.new('(a{sv})', [{
|
||||||
red / 255.0,
|
color: GLib.Variant.new('(ddd)', [
|
||||||
green / 255.0,
|
red / 255.0,
|
||||||
blue / 255.0,
|
green / 255.0,
|
||||||
]),
|
blue / 255.0,
|
||||||
}]);
|
]),
|
||||||
this._removeShooterForSender(invocation.get_sender());
|
}]);
|
||||||
invocation.return_value(retval);
|
this._removeShooterForSender(invocation.get_sender());
|
||||||
});
|
invocation.return_value(retval);
|
||||||
} else {
|
});
|
||||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
} catch (e) {
|
||||||
"Operation was cancelled");
|
invocation.return_error_literal(
|
||||||
}
|
Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||||
});
|
'Operation was cancelled');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var SelectArea = GObject.registerClass({
|
var SelectArea = GObject.registerClass(
|
||||||
Signals: { 'finished': { param_types: [Meta.Rectangle.$gtype] } },
|
class SelectArea extends St.Widget {
|
||||||
}, class SelectArea extends St.Widget {
|
|
||||||
_init() {
|
_init() {
|
||||||
this._startX = -1;
|
this._startX = -1;
|
||||||
this._startY = -1;
|
this._startY = -1;
|
||||||
@ -317,14 +315,21 @@ var SelectArea = GObject.registerClass({
|
|||||||
this.add_actor(this._rubberband);
|
this.add_actor(this._rubberband);
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_show() {
|
async selectAsync() {
|
||||||
if (!this._grabHelper.grab({ actor: this,
|
|
||||||
onUngrab: this._onUngrab.bind(this) }))
|
|
||||||
return;
|
|
||||||
|
|
||||||
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
|
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
|
||||||
Main.uiGroup.set_child_above_sibling(this, null);
|
Main.uiGroup.set_child_above_sibling(this, null);
|
||||||
super.vfunc_show();
|
this.show();
|
||||||
|
|
||||||
|
await this._grabHelper.grabAsync({ actor: this });
|
||||||
|
|
||||||
|
global.display.set_cursor(Meta.Cursor.DEFAULT);
|
||||||
|
|
||||||
|
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
||||||
|
this.destroy();
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._result;
|
||||||
}
|
}
|
||||||
|
|
||||||
_getGeometry() {
|
_getGeometry() {
|
||||||
@ -371,21 +376,10 @@ var SelectArea = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onUngrab() {
|
|
||||||
global.display.set_cursor(Meta.Cursor.DEFAULT);
|
|
||||||
this.emit('finished', this._result);
|
|
||||||
|
|
||||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
|
||||||
this.destroy();
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var PickPixel = GObject.registerClass({
|
var PickPixel = GObject.registerClass(
|
||||||
Signals: { 'finished': { param_types: [Graphene.Point.$gtype] } },
|
class PickPixel extends St.Widget {
|
||||||
}, class PickPixel extends St.Widget {
|
|
||||||
_init() {
|
_init() {
|
||||||
super._init({ visible: false, reactive: true });
|
super._init({ visible: false, reactive: true });
|
||||||
|
|
||||||
@ -400,14 +394,21 @@ var PickPixel = GObject.registerClass({
|
|||||||
this.add_constraint(constraint);
|
this.add_constraint(constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_show() {
|
async pickAsync() {
|
||||||
if (!this._grabHelper.grab({ actor: this,
|
|
||||||
onUngrab: this._onUngrab.bind(this) }))
|
|
||||||
return;
|
|
||||||
|
|
||||||
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
|
global.display.set_cursor(Meta.Cursor.CROSSHAIR);
|
||||||
Main.uiGroup.set_child_above_sibling(this, null);
|
Main.uiGroup.set_child_above_sibling(this, null);
|
||||||
super.vfunc_show();
|
this.show();
|
||||||
|
|
||||||
|
await this._grabHelper.grabAsync({ actor: this });
|
||||||
|
|
||||||
|
global.display.set_cursor(Meta.Cursor.DEFAULT);
|
||||||
|
|
||||||
|
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
||||||
|
this.destroy();
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._result;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_button_release_event(buttonEvent) {
|
vfunc_button_release_event(buttonEvent) {
|
||||||
@ -416,16 +417,6 @@ var PickPixel = GObject.registerClass({
|
|||||||
this._grabHelper.ungrab();
|
this._grabHelper.ungrab();
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onUngrab() {
|
|
||||||
global.display.set_cursor(Meta.Cursor.DEFAULT);
|
|
||||||
this.emit('finished', this._result);
|
|
||||||
|
|
||||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
|
|
||||||
this.destroy();
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var FLASHSPOT_ANIMATION_OUT_TIME = 500; // milliseconds
|
var FLASHSPOT_ANIMATION_OUT_TIME = 500; // milliseconds
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported addContextMenu */
|
/* exported addContextMenu CapsLockWarning */
|
||||||
|
|
||||||
const { Clutter, Shell, St } = imports.gi;
|
const { Clutter, GObject, Pango, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const BoxPointer = imports.ui.boxpointer;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -27,7 +27,8 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
|
|||||||
this.addMenuItem(item);
|
this.addMenuItem(item);
|
||||||
this._pasteItem = item;
|
this._pasteItem = item;
|
||||||
|
|
||||||
this._passwordItem = null;
|
if (entry instanceof St.PasswordEntry)
|
||||||
|
this._makePasswordItem();
|
||||||
|
|
||||||
Main.uiGroup.add_actor(this.actor);
|
Main.uiGroup.add_actor(this.actor);
|
||||||
this.actor.hide();
|
this.actor.hide();
|
||||||
@ -40,24 +41,6 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
|
|||||||
this._passwordItem = item;
|
this._passwordItem = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
get isPassword() {
|
|
||||||
return this._passwordItem != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
set isPassword(v) {
|
|
||||||
if (v == this.isPassword)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (v) {
|
|
||||||
this._makePasswordItem();
|
|
||||||
this._entry.input_purpose = Clutter.InputContentPurpose.PASSWORD;
|
|
||||||
} else {
|
|
||||||
this._passwordItem.destroy();
|
|
||||||
this._passwordItem = null;
|
|
||||||
this._entry.input_purpose = Clutter.InputContentPurpose.NORMAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open(animate) {
|
open(animate) {
|
||||||
this._updatePasteItem();
|
this._updatePasteItem();
|
||||||
this._updateCopyItem();
|
this._updateCopyItem();
|
||||||
@ -86,8 +69,7 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_updatePasswordItem() {
|
_updatePasswordItem() {
|
||||||
let textHidden = this._entry.clutter_text.password_char;
|
if (!this._entry.password_visible)
|
||||||
if (textHidden)
|
|
||||||
this._passwordItem.label.set_text(_("Show Text"));
|
this._passwordItem.label.set_text(_("Show Text"));
|
||||||
else
|
else
|
||||||
this._passwordItem.label.set_text(_("Hide Text"));
|
this._passwordItem.label.set_text(_("Hide Text"));
|
||||||
@ -110,8 +92,7 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onPasswordActivated() {
|
_onPasswordActivated() {
|
||||||
let visible = !!this._entry.clutter_text.password_char;
|
this._entry.password_visible = !this._entry.password_visible;
|
||||||
this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -135,7 +116,8 @@ function _onButtonPressEvent(actor, event, entry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function _onPopup(actor, entry) {
|
function _onPopup(actor, entry) {
|
||||||
let [success, textX, textY_, lineHeight_] = entry.clutter_text.position_to_coords(-1);
|
let cursorPosition = entry.clutter_text.get_cursor_position();
|
||||||
|
let [success, textX, textY_, lineHeight_] = entry.clutter_text.position_to_coords(cursorPosition);
|
||||||
if (success)
|
if (success)
|
||||||
entry.menu.setSourceAlignment(textX / entry.width);
|
entry.menu.setSourceAlignment(textX / entry.width);
|
||||||
entry.menu.open(BoxPointer.PopupAnimation.FULL);
|
entry.menu.open(BoxPointer.PopupAnimation.FULL);
|
||||||
@ -145,10 +127,9 @@ function addContextMenu(entry, params) {
|
|||||||
if (entry.menu)
|
if (entry.menu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
params = Params.parse(params, { isPassword: false, actionMode: Shell.ActionMode.POPUP });
|
params = Params.parse(params, { actionMode: Shell.ActionMode.POPUP });
|
||||||
|
|
||||||
entry.menu = new EntryMenu(entry);
|
entry.menu = new EntryMenu(entry);
|
||||||
entry.menu.isPassword = params.isPassword;
|
|
||||||
entry._menuManager = new PopupMenu.PopupMenuManager(entry,
|
entry._menuManager = new PopupMenu.PopupMenuManager(entry,
|
||||||
{ actionMode: params.actionMode });
|
{ actionMode: params.actionMode });
|
||||||
entry._menuManager.addMenu(entry.menu);
|
entry._menuManager.addMenu(entry.menu);
|
||||||
@ -171,3 +152,40 @@ function addContextMenu(entry, params) {
|
|||||||
entry._menuManager = null;
|
entry._menuManager = null;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var CapsLockWarning = GObject.registerClass(
|
||||||
|
class CapsLockWarning extends St.Label {
|
||||||
|
_init(params) {
|
||||||
|
let defaultParams = { style_class: 'prompt-dialog-error-label' };
|
||||||
|
super._init(Object.assign(defaultParams, params));
|
||||||
|
|
||||||
|
this.text = _('Caps lock is on.');
|
||||||
|
|
||||||
|
this._keymap = Clutter.get_default_backend().get_keymap();
|
||||||
|
|
||||||
|
this.connect('notify::mapped', () => {
|
||||||
|
if (this.is_mapped()) {
|
||||||
|
this.stateChangedId = this._keymap.connect('state-changed',
|
||||||
|
this._updateCapsLockWarningOpacity.bind(this));
|
||||||
|
} else {
|
||||||
|
this._keymap.disconnect(this.stateChangedId);
|
||||||
|
this.stateChangedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._updateCapsLockWarningOpacity();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.connect('destroy', () => {
|
||||||
|
if (this.stateChangedId > 0)
|
||||||
|
this._keymap.disconnect(this.stateChangedId);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
this.clutter_text.line_wrap = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateCapsLockWarningOpacity() {
|
||||||
|
let capsLockOn = this._keymap.get_caps_lock_state();
|
||||||
|
this.opacity = capsLockOn ? 255 : 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
@ -38,7 +38,7 @@ function _setLabelsForMessage(content, message) {
|
|||||||
let labels = message.split('\n');
|
let labels = message.split('\n');
|
||||||
|
|
||||||
content.title = labels.shift();
|
content.title = labels.shift();
|
||||||
content.body = labels.join('\n');
|
content.description = labels.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------- */
|
/* -------------------------------------------------------- */
|
||||||
@ -99,8 +99,6 @@ var ShellMountOperation = class {
|
|||||||
this.close.bind(this));
|
this.close.bind(this));
|
||||||
this.mountOp.connect('show-unmount-progress',
|
this.mountOp.connect('show-unmount-progress',
|
||||||
this._onShowUnmountProgress.bind(this));
|
this._onShowUnmountProgress.bind(this));
|
||||||
|
|
||||||
this._gicon = source.get_icon();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_closeExistingDialog() {
|
_closeExistingDialog() {
|
||||||
@ -113,7 +111,7 @@ var ShellMountOperation = class {
|
|||||||
|
|
||||||
_onAskQuestion(op, message, choices) {
|
_onAskQuestion(op, message, choices) {
|
||||||
this._closeExistingDialog();
|
this._closeExistingDialog();
|
||||||
this._dialog = new ShellMountQuestionDialog(this._gicon);
|
this._dialog = new ShellMountQuestionDialog();
|
||||||
|
|
||||||
this._dialogId = this._dialog.connect('response',
|
this._dialogId = this._dialog.connect('response',
|
||||||
(object, choice) => {
|
(object, choice) => {
|
||||||
@ -132,7 +130,7 @@ var ShellMountOperation = class {
|
|||||||
this._dialog = this._existingDialog;
|
this._dialog = this._existingDialog;
|
||||||
this._dialog.reaskPassword();
|
this._dialog.reaskPassword();
|
||||||
} else {
|
} else {
|
||||||
this._dialog = new ShellMountPasswordDialog(message, this._gicon, flags);
|
this._dialog = new ShellMountPasswordDialog(message, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._dialogId = this._dialog.connect('response',
|
this._dialogId = this._dialog.connect('response',
|
||||||
@ -178,7 +176,7 @@ var ShellMountOperation = class {
|
|||||||
let message = op.get_show_processes_message();
|
let message = op.get_show_processes_message();
|
||||||
|
|
||||||
if (!this._processesDialog) {
|
if (!this._processesDialog) {
|
||||||
this._processesDialog = new ShellProcessesDialog(this._gicon);
|
this._processesDialog = new ShellProcessesDialog();
|
||||||
this._dialog = this._processesDialog;
|
this._dialog = this._processesDialog;
|
||||||
|
|
||||||
this._dialogId = this._processesDialog.connect('response',
|
this._dialogId = this._processesDialog.connect('response',
|
||||||
@ -259,10 +257,10 @@ class ShellUnmountNotifier extends MessageTray.Source {
|
|||||||
var ShellMountQuestionDialog = GObject.registerClass({
|
var ShellMountQuestionDialog = GObject.registerClass({
|
||||||
Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
|
Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
|
||||||
}, class ShellMountQuestionDialog extends ModalDialog.ModalDialog {
|
}, class ShellMountQuestionDialog extends ModalDialog.ModalDialog {
|
||||||
_init(icon) {
|
_init() {
|
||||||
super._init({ styleClass: 'mount-dialog' });
|
super._init({ styleClass: 'mount-dialog' });
|
||||||
|
|
||||||
this._content = new Dialog.MessageDialogContent({ icon });
|
this._content = new Dialog.MessageDialogContent();
|
||||||
this.contentLayout.add_child(this._content);
|
this.contentLayout.add_child(this._content);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,17 +278,16 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
GObject.TYPE_BOOLEAN,
|
GObject.TYPE_BOOLEAN,
|
||||||
GObject.TYPE_UINT] } },
|
GObject.TYPE_UINT] } },
|
||||||
}, class ShellMountPasswordDialog extends ModalDialog.ModalDialog {
|
}, class ShellMountPasswordDialog extends ModalDialog.ModalDialog {
|
||||||
_init(message, icon, flags) {
|
_init(message, flags) {
|
||||||
let strings = message.split('\n');
|
let strings = message.split('\n');
|
||||||
let title = strings.shift() || null;
|
let title = strings.shift() || null;
|
||||||
let body = strings.shift() || null;
|
let description = strings.shift() || null;
|
||||||
super._init({ styleClass: 'prompt-dialog' });
|
super._init({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
|
||||||
|
|
||||||
let content = new Dialog.MessageDialogContent({ icon, title, body });
|
let content = new Dialog.MessageDialogContent({ title, description });
|
||||||
this.contentLayout.add_actor(content);
|
this.contentLayout.add_actor(content);
|
||||||
content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
|
|
||||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
|
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
|
||||||
@ -306,14 +303,14 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
|
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
|
||||||
content.messageBox.add(this._hiddenVolume);
|
content.add_child(this._hiddenVolume);
|
||||||
|
|
||||||
this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
|
this._systemVolume = new CheckBox.CheckBox(_("Windows System Volume"));
|
||||||
content.messageBox.add(this._systemVolume);
|
content.add_child(this._systemVolume);
|
||||||
|
|
||||||
this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
|
this._keyfilesCheckbox = new CheckBox.CheckBox(_("Uses Keyfiles"));
|
||||||
this._keyfilesCheckbox.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
|
this._keyfilesCheckbox.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
|
||||||
content.messageBox.add(this._keyfilesCheckbox);
|
content.add_child(this._keyfilesCheckbox);
|
||||||
|
|
||||||
this._keyfilesLabel.clutter_text.set_markup(
|
this._keyfilesLabel.clutter_text.set_markup(
|
||||||
/* Translators: %s is the Disks application */
|
/* Translators: %s is the Disks application */
|
||||||
@ -321,17 +318,18 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
);
|
);
|
||||||
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._keyfilesLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._keyfilesLabel.clutter_text.line_wrap = true;
|
this._keyfilesLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add_child(this._keyfilesLabel);
|
content.add_child(this._keyfilesLabel);
|
||||||
|
|
||||||
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||||
text: _("PIM Number"),
|
text: _("PIM Number"),
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._pimEntry = new St.PasswordEntry({
|
||||||
can_focus: true,
|
style_class: 'prompt-dialog-password-entry',
|
||||||
x_expand: true });
|
can_focus: true,
|
||||||
|
x_expand: true,
|
||||||
|
});
|
||||||
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||||
this._pimEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
ShellEntry.addContextMenu(this._pimEntry);
|
||||||
ShellEntry.addContextMenu(this._pimEntry, { isPassword: true });
|
|
||||||
|
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
layout.attach(this._pimEntry, 0, 0, 1, 1);
|
layout.attach(this._pimEntry, 0, 0, 1, 1);
|
||||||
@ -355,40 +353,44 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||||
text: _("Password"),
|
text: _("Password"),
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._passwordEntry = new St.PasswordEntry({
|
||||||
can_focus: true,
|
style_class: 'prompt-dialog-password-entry',
|
||||||
x_expand: true });
|
can_focus: true,
|
||||||
|
x_expand: true,
|
||||||
|
});
|
||||||
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
|
||||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
ShellEntry.addContextMenu(this._passwordEntry);
|
||||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
|
||||||
this.setInitialKeyFocus(this._passwordEntry);
|
this.setInitialKeyFocus(this._passwordEntry);
|
||||||
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
|
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
|
||||||
animate: true,
|
animate: true,
|
||||||
});
|
});
|
||||||
this._passwordEntry.secondary_icon = this._workSpinner;
|
this._passwordEntry.secondary_icon = this._workSpinner;
|
||||||
|
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
|
||||||
|
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
layout.attach(this._passwordEntry, 0, 1, 1, 1);
|
layout.attach(this._passwordEntry, 0, 1, 1, 1);
|
||||||
layout.attach(this._passwordLabel, 1, 1, 1, 1);
|
layout.attach(this._passwordLabel, 1, 1, 1, 1);
|
||||||
|
layout.attach(this._capsLockWarningLabel, 0, 2, 1, 1);
|
||||||
} else {
|
} else {
|
||||||
layout.attach(this._passwordLabel, 0, 1, 1, 1);
|
layout.attach(this._passwordLabel, 0, 1, 1, 1);
|
||||||
layout.attach(this._passwordEntry, 1, 1, 1, 1);
|
layout.attach(this._passwordEntry, 1, 1, 1, 1);
|
||||||
|
layout.attach(this._capsLockWarningLabel, 1, 2, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
content.messageBox.add(grid);
|
content.add_child(grid);
|
||||||
|
|
||||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
|
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
|
||||||
text: _("Sorry, that didn’t work. Please try again.") });
|
text: _("Sorry, that didn’t work. Please try again.") });
|
||||||
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._errorMessageLabel.clutter_text.line_wrap = true;
|
this._errorMessageLabel.clutter_text.line_wrap = true;
|
||||||
this._errorMessageLabel.hide();
|
this._errorMessageLabel.hide();
|
||||||
content.messageBox.add(this._errorMessageLabel);
|
content.add_child(this._errorMessageLabel);
|
||||||
|
|
||||||
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
|
||||||
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
|
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
|
||||||
this._rememberChoice.checked =
|
this._rememberChoice.checked =
|
||||||
global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
|
global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
|
||||||
content.messageBox.add(this._rememberChoice);
|
content.add_child(this._rememberChoice);
|
||||||
} else {
|
} else {
|
||||||
this._rememberChoice = null;
|
this._rememberChoice = null;
|
||||||
}
|
}
|
||||||
@ -493,10 +495,10 @@ var ShellMountPasswordDialog = GObject.registerClass({
|
|||||||
var ShellProcessesDialog = GObject.registerClass({
|
var ShellProcessesDialog = GObject.registerClass({
|
||||||
Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
|
Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
|
||||||
}, class ShellProcessesDialog extends ModalDialog.ModalDialog {
|
}, class ShellProcessesDialog extends ModalDialog.ModalDialog {
|
||||||
_init(icon) {
|
_init() {
|
||||||
super._init({ styleClass: 'mount-dialog' });
|
super._init({ styleClass: 'mount-dialog' });
|
||||||
|
|
||||||
this._content = new Dialog.MessageDialogContent({ icon });
|
this._content = new Dialog.MessageDialogContent();
|
||||||
this.contentLayout.add_child(this._content);
|
this.contentLayout.add_child(this._content);
|
||||||
|
|
||||||
let scrollView = new St.ScrollView({
|
let scrollView = new St.ScrollView({
|
||||||
@ -612,12 +614,6 @@ var GnomeShellMountOpHandler = class {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_createGIcon(iconName) {
|
|
||||||
let realIconName = iconName ? iconName : 'drive-harddisk';
|
|
||||||
return new Gio.ThemedIcon({ name: realIconName,
|
|
||||||
use_default_fallbacks: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AskPassword:
|
* AskPassword:
|
||||||
* @param {Array} params
|
* @param {Array} params
|
||||||
@ -644,7 +640,7 @@ var GnomeShellMountOpHandler = class {
|
|||||||
* attempt went wrong.
|
* attempt went wrong.
|
||||||
*/
|
*/
|
||||||
AskPasswordAsync(params, invocation) {
|
AskPasswordAsync(params, invocation) {
|
||||||
let [id, message, iconName, defaultUser_, defaultDomain_, flags] = params;
|
let [id, message, iconName_, defaultUser_, defaultDomain_, flags] = params;
|
||||||
|
|
||||||
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_PASSWORD)) {
|
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_PASSWORD)) {
|
||||||
this._dialog.reaskPassword();
|
this._dialog.reaskPassword();
|
||||||
@ -653,7 +649,7 @@ var GnomeShellMountOpHandler = class {
|
|||||||
|
|
||||||
this._closeDialog();
|
this._closeDialog();
|
||||||
|
|
||||||
this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
|
this._dialog = new ShellMountPasswordDialog(message, flags);
|
||||||
this._dialog.connect('response',
|
this._dialog.connect('response',
|
||||||
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
|
(object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
|
||||||
let details = {};
|
let details = {};
|
||||||
@ -694,7 +690,7 @@ var GnomeShellMountOpHandler = class {
|
|||||||
* update the dialog with the new question.
|
* update the dialog with the new question.
|
||||||
*/
|
*/
|
||||||
AskQuestionAsync(params, invocation) {
|
AskQuestionAsync(params, invocation) {
|
||||||
let [id, message, iconName, choices] = params;
|
let [id, message, iconName_, choices] = params;
|
||||||
|
|
||||||
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_QUESTION)) {
|
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_QUESTION)) {
|
||||||
this._dialog.update(message, choices);
|
this._dialog.update(message, choices);
|
||||||
@ -703,7 +699,7 @@ var GnomeShellMountOpHandler = class {
|
|||||||
|
|
||||||
this._closeDialog();
|
this._closeDialog();
|
||||||
|
|
||||||
this._dialog = new ShellMountQuestionDialog(this._createGIcon(iconName), message);
|
this._dialog = new ShellMountQuestionDialog(message);
|
||||||
this._dialog.connect('response', (object, choice) => {
|
this._dialog.connect('response', (object, choice) => {
|
||||||
this._clearCurrentRequest(Gio.MountOperationResult.HANDLED,
|
this._clearCurrentRequest(Gio.MountOperationResult.HANDLED,
|
||||||
{ choice: GLib.Variant.new('i', choice) });
|
{ choice: GLib.Variant.new('i', choice) });
|
||||||
@ -732,7 +728,7 @@ var GnomeShellMountOpHandler = class {
|
|||||||
* of processes.
|
* of processes.
|
||||||
*/
|
*/
|
||||||
ShowProcessesAsync(params, invocation) {
|
ShowProcessesAsync(params, invocation) {
|
||||||
let [id, message, iconName, applicationPids, choices] = params;
|
let [id, message, iconName_, applicationPids, choices] = params;
|
||||||
|
|
||||||
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.SHOW_PROCESSES)) {
|
if (this._setCurrentRequest(invocation, id, ShellMountOperationType.SHOW_PROCESSES)) {
|
||||||
this._dialog.update(message, applicationPids, choices);
|
this._dialog.update(message, applicationPids, choices);
|
||||||
@ -741,7 +737,7 @@ var GnomeShellMountOpHandler = class {
|
|||||||
|
|
||||||
this._closeDialog();
|
this._closeDialog();
|
||||||
|
|
||||||
this._dialog = new ShellProcessesDialog(this._createGIcon(iconName));
|
this._dialog = new ShellProcessesDialog();
|
||||||
this._dialog.connect('response', (object, choice) => {
|
this._dialog.connect('response', (object, choice) => {
|
||||||
let response;
|
let response;
|
||||||
let details = {};
|
let details = {};
|
||||||
|
@ -117,11 +117,18 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
|
|||||||
let box = new St.BoxLayout({ vertical: true });
|
let box = new St.BoxLayout({ vertical: true });
|
||||||
|
|
||||||
let bin = new St.Bin({ style_class: 'input-source-switcher-symbol' });
|
let bin = new St.Bin({ style_class: 'input-source-switcher-symbol' });
|
||||||
let symbol = new St.Label({ text: item.shortName });
|
let symbol = new St.Label({
|
||||||
|
text: item.shortName,
|
||||||
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
bin.set_child(symbol);
|
bin.set_child(symbol);
|
||||||
box.add_child(bin);
|
box.add_child(bin);
|
||||||
|
|
||||||
let text = new St.Label({ text: item.displayName });
|
let text = new St.Label({
|
||||||
|
text: item.displayName,
|
||||||
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
box.add_child(text);
|
box.add_child(text);
|
||||||
|
|
||||||
this.addItem(box, text);
|
this.addItem(box, text);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/* exported Indicator */
|
/* exported Indicator */
|
||||||
|
|
||||||
const { Clutter, Gio, GLib, GObject, Shell } = imports.gi;
|
const { Clutter, Gio, GLib, GObject, Shell, St } = imports.gi;
|
||||||
|
|
||||||
const Dialog = imports.ui.dialog;
|
const Dialog = imports.ui.dialog;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -347,20 +347,22 @@ var AppAuthorizer = class {
|
|||||||
var GeolocationDialog = GObject.registerClass({
|
var GeolocationDialog = GObject.registerClass({
|
||||||
Signals: { 'response': { param_types: [GObject.TYPE_UINT] } },
|
Signals: { 'response': { param_types: [GObject.TYPE_UINT] } },
|
||||||
}, class GeolocationDialog extends ModalDialog.ModalDialog {
|
}, class GeolocationDialog extends ModalDialog.ModalDialog {
|
||||||
_init(name, subtitle, reqAccuracyLevel) {
|
_init(name, description, reqAccuracyLevel) {
|
||||||
super._init({ styleClass: 'geolocation-dialog' });
|
super._init({ styleClass: 'geolocation-dialog' });
|
||||||
this.reqAccuracyLevel = reqAccuracyLevel;
|
this.reqAccuracyLevel = reqAccuracyLevel;
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' });
|
|
||||||
|
|
||||||
/* Translators: %s is an application name */
|
/* Translators: %s is an application name */
|
||||||
let title = _("Give %s access to your location?").format(name);
|
let title = _("Give %s access to your location?").format(name);
|
||||||
let body = _("Location access can be changed at any time from the privacy settings.");
|
|
||||||
|
|
||||||
let contentParams = { icon, title, subtitle, body };
|
let content = new Dialog.MessageDialogContent({ title, description });
|
||||||
let content = new Dialog.MessageDialogContent(contentParams);
|
|
||||||
this.contentLayout.add_actor(content);
|
this.contentLayout.add_actor(content);
|
||||||
|
|
||||||
|
let infoLabel = new St.Label({
|
||||||
|
text: _('Location access can be changed at any time from the privacy settings.'),
|
||||||
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
});
|
||||||
|
content.add_child(infoLabel);
|
||||||
|
|
||||||
let button = this.addButton({ label: _("Deny Access"),
|
let button = this.addButton({ label: _("Deny Access"),
|
||||||
action: this._onDenyClicked.bind(this),
|
action: this._onDenyClicked.bind(this),
|
||||||
key: Clutter.KEY_Escape });
|
key: Clutter.KEY_Escape });
|
||||||
|
@ -2069,6 +2069,6 @@ class Indicator extends PanelMenu.SystemIndicator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon();
|
this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon();
|
||||||
this._vpnIndicator.visible = this._vpnIndicator.icon_name != '';
|
this._vpnIndicator.visible = this._vpnIndicator.icon_name !== null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
648
js/ui/swipeTracker.js
Normal file
@ -0,0 +1,648 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
/* exported SwipeTracker */
|
||||||
|
|
||||||
|
const { Clutter, Gio, GObject, Meta } = imports.gi;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
|
// FIXME: ideally these values matches physical touchpad size. We can get the
|
||||||
|
// correct values for gnome-shell specifically, since mutter uses libinput
|
||||||
|
// directly, but GTK apps cannot get it, so use an arbitrary value so that
|
||||||
|
// it's consistent with apps.
|
||||||
|
const TOUCHPAD_BASE_HEIGHT = 300;
|
||||||
|
const TOUCHPAD_BASE_WIDTH = 400;
|
||||||
|
|
||||||
|
const SCROLL_MULTIPLIER = 10;
|
||||||
|
const SWIPE_MULTIPLIER = 0.5;
|
||||||
|
|
||||||
|
const MIN_ANIMATION_DURATION = 100;
|
||||||
|
const MAX_ANIMATION_DURATION = 400;
|
||||||
|
const VELOCITY_THRESHOLD = 0.4;
|
||||||
|
// Derivative of easeOutCubic at t=0
|
||||||
|
const DURATION_MULTIPLIER = 3;
|
||||||
|
const ANIMATION_BASE_VELOCITY = 0.002;
|
||||||
|
|
||||||
|
const State = {
|
||||||
|
NONE: 0,
|
||||||
|
SCROLLING: 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
function clamp(value, min, max) {
|
||||||
|
return Math.max(min, Math.min(max, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
const TouchpadSwipeGesture = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
|
'enabled': GObject.ParamSpec.boolean(
|
||||||
|
'enabled', 'enabled', 'enabled',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
true),
|
||||||
|
'orientation': GObject.ParamSpec.enum(
|
||||||
|
'orientation', 'orientation', 'orientation',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
Clutter.Orientation, Clutter.Orientation.VERTICAL),
|
||||||
|
},
|
||||||
|
Signals: {
|
||||||
|
'begin': { param_types: [GObject.TYPE_UINT, GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
|
||||||
|
'update': { param_types: [GObject.TYPE_UINT, GObject.TYPE_DOUBLE] },
|
||||||
|
'end': { param_types: [GObject.TYPE_UINT] },
|
||||||
|
},
|
||||||
|
}, class TouchpadSwipeGesture extends GObject.Object {
|
||||||
|
_init(allowedModes) {
|
||||||
|
super._init();
|
||||||
|
this._allowedModes = allowedModes;
|
||||||
|
this._touchpadSettings = new Gio.Settings({
|
||||||
|
schema_id: 'org.gnome.desktop.peripherals.touchpad',
|
||||||
|
});
|
||||||
|
this._orientation = Clutter.Orientation.VERTICAL;
|
||||||
|
this._enabled = true;
|
||||||
|
|
||||||
|
global.stage.connect('captured-event', this._handleEvent.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
get enabled() {
|
||||||
|
return this._enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
set enabled(enabled) {
|
||||||
|
if (this._enabled === enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._enabled = enabled;
|
||||||
|
this.notify('enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
get orientation() {
|
||||||
|
return this._orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
set orientation(orientation) {
|
||||||
|
if (this._orientation === orientation)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._orientation = orientation;
|
||||||
|
this.notify('orientation');
|
||||||
|
}
|
||||||
|
|
||||||
|
_handleEvent(actor, event) {
|
||||||
|
if (event.type() !== Clutter.EventType.TOUCHPAD_SWIPE)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
if (event.get_touchpad_gesture_finger_count() !== 4)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
if ((this._allowedModes & Main.actionMode) === 0)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
if (!this.enabled)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
let time = event.get_time();
|
||||||
|
|
||||||
|
let [x, y] = event.get_coords();
|
||||||
|
let [dx, dy] = event.get_gesture_motion_delta();
|
||||||
|
|
||||||
|
let delta;
|
||||||
|
if (this._orientation === Clutter.Orientation.VERTICAL)
|
||||||
|
delta = dy / TOUCHPAD_BASE_HEIGHT;
|
||||||
|
else
|
||||||
|
delta = dx / TOUCHPAD_BASE_WIDTH;
|
||||||
|
|
||||||
|
switch (event.get_gesture_phase()) {
|
||||||
|
case Clutter.TouchpadGesturePhase.BEGIN:
|
||||||
|
this.emit('begin', time, x, y);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Clutter.TouchpadGesturePhase.UPDATE:
|
||||||
|
if (this._touchpadSettings.get_boolean('natural-scroll'))
|
||||||
|
delta = -delta;
|
||||||
|
|
||||||
|
this.emit('update', time, delta * SWIPE_MULTIPLIER);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Clutter.TouchpadGesturePhase.END:
|
||||||
|
case Clutter.TouchpadGesturePhase.CANCEL:
|
||||||
|
this.emit('end', time);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const TouchSwipeGesture = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
|
'distance': GObject.ParamSpec.double(
|
||||||
|
'distance', 'distance', 'distance',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
0, Infinity, 0),
|
||||||
|
'orientation': GObject.ParamSpec.enum(
|
||||||
|
'orientation', 'orientation', 'orientation',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
Clutter.Orientation, Clutter.Orientation.VERTICAL),
|
||||||
|
},
|
||||||
|
Signals: {
|
||||||
|
'begin': { param_types: [GObject.TYPE_UINT, GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
|
||||||
|
'update': { param_types: [GObject.TYPE_UINT, GObject.TYPE_DOUBLE] },
|
||||||
|
'end': { param_types: [GObject.TYPE_UINT] },
|
||||||
|
'cancel': { param_types: [GObject.TYPE_UINT] },
|
||||||
|
},
|
||||||
|
}, class TouchSwipeGesture extends Clutter.GestureAction {
|
||||||
|
_init(allowedModes, nTouchPoints, thresholdTriggerEdge) {
|
||||||
|
super._init();
|
||||||
|
this.set_n_touch_points(nTouchPoints);
|
||||||
|
this.set_threshold_trigger_edge(thresholdTriggerEdge);
|
||||||
|
|
||||||
|
this._allowedModes = allowedModes;
|
||||||
|
this._distance = global.screen_height;
|
||||||
|
this._orientation = Clutter.Orientation.VERTICAL;
|
||||||
|
|
||||||
|
global.display.connect('grab-op-begin', () => {
|
||||||
|
this.cancel();
|
||||||
|
});
|
||||||
|
|
||||||
|
this._lastPosition = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
get distance() {
|
||||||
|
return this._distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
set distance(distance) {
|
||||||
|
if (this._distance === distance)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._distance = distance;
|
||||||
|
this.notify('distance');
|
||||||
|
}
|
||||||
|
|
||||||
|
get orientation() {
|
||||||
|
return this._orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
set orientation(orientation) {
|
||||||
|
if (this._orientation === orientation)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._orientation = orientation;
|
||||||
|
this.notify('orientation');
|
||||||
|
}
|
||||||
|
|
||||||
|
vfunc_gesture_prepare(actor) {
|
||||||
|
if (!super.vfunc_gesture_prepare(actor))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((this._allowedModes & Main.actionMode) === 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let time = this.get_last_event(0).get_time();
|
||||||
|
let [xPress, yPress] = this.get_press_coords(0);
|
||||||
|
let [x, y] = this.get_motion_coords(0);
|
||||||
|
|
||||||
|
this._lastPosition =
|
||||||
|
this._orientation === Clutter.Orientation.VERTICAL ? y : x;
|
||||||
|
|
||||||
|
this.emit('begin', time, xPress, yPress);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
vfunc_gesture_progress(_actor) {
|
||||||
|
let [x, y] = this.get_motion_coords(0);
|
||||||
|
let pos = this._orientation === Clutter.Orientation.VERTICAL ? y : x;
|
||||||
|
|
||||||
|
let delta = pos - this._lastPosition;
|
||||||
|
this._lastPosition = pos;
|
||||||
|
|
||||||
|
let time = this.get_last_event(0).get_time();
|
||||||
|
|
||||||
|
this.emit('update', time, -delta / this._distance);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
vfunc_gesture_end(_actor) {
|
||||||
|
let time = this.get_last_event(0).get_time();
|
||||||
|
|
||||||
|
this.emit('end', time);
|
||||||
|
}
|
||||||
|
|
||||||
|
vfunc_gesture_cancel(_actor) {
|
||||||
|
let time = Clutter.get_current_event_time();
|
||||||
|
|
||||||
|
this.emit('cancel', time);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const ScrollGesture = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
|
'enabled': GObject.ParamSpec.boolean(
|
||||||
|
'enabled', 'enabled', 'enabled',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
true),
|
||||||
|
'orientation': GObject.ParamSpec.enum(
|
||||||
|
'orientation', 'orientation', 'orientation',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
Clutter.Orientation, Clutter.Orientation.VERTICAL),
|
||||||
|
},
|
||||||
|
Signals: {
|
||||||
|
'begin': { param_types: [GObject.TYPE_UINT, GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE] },
|
||||||
|
'update': { param_types: [GObject.TYPE_UINT, GObject.TYPE_DOUBLE] },
|
||||||
|
'end': { param_types: [GObject.TYPE_UINT] },
|
||||||
|
},
|
||||||
|
}, class ScrollGesture extends GObject.Object {
|
||||||
|
_init(actor, allowedModes) {
|
||||||
|
super._init();
|
||||||
|
this._allowedModes = allowedModes;
|
||||||
|
this._began = false;
|
||||||
|
this._enabled = true;
|
||||||
|
this._orientation = Clutter.Orientation.VERTICAL;
|
||||||
|
|
||||||
|
actor.connect('scroll-event', this._handleEvent.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
get enabled() {
|
||||||
|
return this._enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
set enabled(enabled) {
|
||||||
|
if (this._enabled === enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._enabled = enabled;
|
||||||
|
this.notify('enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
get orientation() {
|
||||||
|
return this._orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
set orientation(orientation) {
|
||||||
|
if (this._orientation === orientation)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._orientation = orientation;
|
||||||
|
this.notify('orientation');
|
||||||
|
}
|
||||||
|
|
||||||
|
canHandleEvent(event) {
|
||||||
|
if (event.type() !== Clutter.EventType.SCROLL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (event.get_scroll_source() !== Clutter.ScrollSource.FINGER &&
|
||||||
|
event.get_source_device().get_device_type() !== Clutter.InputDeviceType.TOUCHPAD_DEVICE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!this.enabled)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((this._allowedModes & Main.actionMode) === 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_handleEvent(actor, event) {
|
||||||
|
if (!this.canHandleEvent(event))
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
if (event.get_scroll_direction() !== Clutter.ScrollDirection.SMOOTH)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
let time = event.get_time();
|
||||||
|
let [dx, dy] = event.get_scroll_delta();
|
||||||
|
if (dx === 0 && dy === 0) {
|
||||||
|
this.emit('end', time);
|
||||||
|
this._began = false;
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._began) {
|
||||||
|
let [x, y] = event.get_coords();
|
||||||
|
this.emit('begin', time, x, y);
|
||||||
|
this._began = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let delta;
|
||||||
|
if (this._orientation === Clutter.Orientation.VERTICAL)
|
||||||
|
delta = dy / TOUCHPAD_BASE_HEIGHT;
|
||||||
|
else
|
||||||
|
delta = dx / TOUCHPAD_BASE_WIDTH;
|
||||||
|
|
||||||
|
this.emit('update', time, delta * SCROLL_MULTIPLIER);
|
||||||
|
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// USAGE:
|
||||||
|
//
|
||||||
|
// To correctly implement the gesture, there must be handlers for the following
|
||||||
|
// signals:
|
||||||
|
//
|
||||||
|
// begin(tracker, monitor)
|
||||||
|
// The handler should check whether a deceleration animation is currently
|
||||||
|
// running. If it is, it should stop the animation (without resetting
|
||||||
|
// progress). Then it should call:
|
||||||
|
// tracker.confirmSwipe(distance, snapPoints, currentProgress, cancelProgress)
|
||||||
|
// If it's not called, the swipe would be ignored.
|
||||||
|
// The parameters are:
|
||||||
|
// * distance: the page size;
|
||||||
|
// * snapPoints: an (sorted with ascending order) array of snap points;
|
||||||
|
// * currentProgress: the current progress;
|
||||||
|
// * cancelprogress: a non-transient value that would be used if the gesture
|
||||||
|
// is cancelled.
|
||||||
|
// If no animation was running, currentProgress and cancelProgress should be
|
||||||
|
// same. The handler may set 'orientation' property here.
|
||||||
|
//
|
||||||
|
// update(tracker, progress)
|
||||||
|
// The handler should set the progress to the given value.
|
||||||
|
//
|
||||||
|
// end(tracker, duration, endProgress)
|
||||||
|
// The handler should animate the progress to endProgress. If endProgress is
|
||||||
|
// 0, it should do nothing after the animation, otherwise it should change the
|
||||||
|
// state, e.g. change the current page or switch workspace.
|
||||||
|
// NOTE: duration can be 0 in some cases, in this case it should finish
|
||||||
|
// instantly.
|
||||||
|
|
||||||
|
/** A class for handling swipe gestures */
|
||||||
|
var SwipeTracker = GObject.registerClass({
|
||||||
|
Properties: {
|
||||||
|
'enabled': GObject.ParamSpec.boolean(
|
||||||
|
'enabled', 'enabled', 'enabled',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
true),
|
||||||
|
'orientation': GObject.ParamSpec.enum(
|
||||||
|
'orientation', 'orientation', 'orientation',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
Clutter.Orientation, Clutter.Orientation.VERTICAL),
|
||||||
|
'distance': GObject.ParamSpec.double(
|
||||||
|
'distance', 'distance', 'distance',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
0, Infinity, 0),
|
||||||
|
},
|
||||||
|
Signals: {
|
||||||
|
'begin': { param_types: [GObject.TYPE_UINT] },
|
||||||
|
'update': { param_types: [GObject.TYPE_DOUBLE] },
|
||||||
|
'end': { param_types: [GObject.TYPE_UINT64, GObject.TYPE_DOUBLE] },
|
||||||
|
},
|
||||||
|
}, class SwipeTracker extends GObject.Object {
|
||||||
|
_init(actor, allowedModes, params) {
|
||||||
|
super._init();
|
||||||
|
params = Params.parse(params, { allowDrag: true, allowScroll: true });
|
||||||
|
|
||||||
|
this._allowedModes = allowedModes;
|
||||||
|
this._enabled = true;
|
||||||
|
this._orientation = Clutter.Orientation.VERTICAL;
|
||||||
|
this._distance = global.screen_height;
|
||||||
|
|
||||||
|
this._reset();
|
||||||
|
|
||||||
|
this._touchpadGesture = new TouchpadSwipeGesture(allowedModes);
|
||||||
|
this._touchpadGesture.connect('begin', this._beginGesture.bind(this));
|
||||||
|
this._touchpadGesture.connect('update', this._updateGesture.bind(this));
|
||||||
|
this._touchpadGesture.connect('end', this._endGesture.bind(this));
|
||||||
|
this.bind_property('enabled', this._touchpadGesture, 'enabled', 0);
|
||||||
|
this.bind_property('orientation', this._touchpadGesture, 'orientation', 0);
|
||||||
|
|
||||||
|
this._touchGesture = new TouchSwipeGesture(allowedModes, 4,
|
||||||
|
Clutter.GestureTriggerEdge.NONE);
|
||||||
|
this._touchGesture.connect('begin', this._beginTouchSwipe.bind(this));
|
||||||
|
this._touchGesture.connect('update', this._updateGesture.bind(this));
|
||||||
|
this._touchGesture.connect('end', this._endGesture.bind(this));
|
||||||
|
this._touchGesture.connect('cancel', this._cancelGesture.bind(this));
|
||||||
|
this.bind_property('enabled', this._touchGesture, 'enabled', 0);
|
||||||
|
this.bind_property('orientation', this._touchGesture, 'orientation', 0);
|
||||||
|
this.bind_property('distance', this._touchGesture, 'distance', 0);
|
||||||
|
global.stage.add_action(this._touchGesture);
|
||||||
|
|
||||||
|
if (params.allowDrag) {
|
||||||
|
this._dragGesture = new TouchSwipeGesture(allowedModes, 1,
|
||||||
|
Clutter.GestureTriggerEdge.AFTER);
|
||||||
|
this._dragGesture.connect('begin', this._beginGesture.bind(this));
|
||||||
|
this._dragGesture.connect('update', this._updateGesture.bind(this));
|
||||||
|
this._dragGesture.connect('end', this._endGesture.bind(this));
|
||||||
|
this._dragGesture.connect('cancel', this._cancelGesture.bind(this));
|
||||||
|
this.bind_property('enabled', this._dragGesture, 'enabled', 0);
|
||||||
|
this.bind_property('orientation', this._dragGesture, 'orientation', 0);
|
||||||
|
this.bind_property('distance', this._dragGesture, 'distance', 0);
|
||||||
|
actor.add_action(this._dragGesture);
|
||||||
|
} else {
|
||||||
|
this._dragGesture = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.allowScroll) {
|
||||||
|
this._scrollGesture = new ScrollGesture(actor, allowedModes);
|
||||||
|
this._scrollGesture.connect('begin', this._beginGesture.bind(this));
|
||||||
|
this._scrollGesture.connect('update', this._updateGesture.bind(this));
|
||||||
|
this._scrollGesture.connect('end', this._endGesture.bind(this));
|
||||||
|
this.bind_property('enabled', this._scrollGesture, 'enabled', 0);
|
||||||
|
this.bind_property('orientation', this._scrollGesture, 'orientation', 0);
|
||||||
|
} else {
|
||||||
|
this._scrollGesture = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* canHandleScrollEvent:
|
||||||
|
* @param {Clutter.Event} scrollEvent: an event to check
|
||||||
|
* @returns {bool} whether the event can be handled by the tracker
|
||||||
|
*
|
||||||
|
* This function can be used to combine swipe gesture and mouse
|
||||||
|
* scrolling.
|
||||||
|
*/
|
||||||
|
canHandleScrollEvent(scrollEvent) {
|
||||||
|
if (!this.enabled || this._scrollGesture === null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this._scrollGesture.canHandleEvent(scrollEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
get enabled() {
|
||||||
|
return this._enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
set enabled(enabled) {
|
||||||
|
if (this._enabled === enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._enabled = enabled;
|
||||||
|
if (!enabled && this._state === State.SCROLLING)
|
||||||
|
this._interrupt();
|
||||||
|
this.notify('enabled');
|
||||||
|
}
|
||||||
|
|
||||||
|
get orientation() {
|
||||||
|
return this._orientation;
|
||||||
|
}
|
||||||
|
|
||||||
|
set orientation(orientation) {
|
||||||
|
if (this._orientation === orientation)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._orientation = orientation;
|
||||||
|
this.notify('orientation');
|
||||||
|
}
|
||||||
|
|
||||||
|
get distance() {
|
||||||
|
return this._distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
set distance(distance) {
|
||||||
|
if (this._distance === distance)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._distance = distance;
|
||||||
|
this.notify('distance');
|
||||||
|
}
|
||||||
|
|
||||||
|
_reset() {
|
||||||
|
this._state = State.NONE;
|
||||||
|
|
||||||
|
this._snapPoints = [];
|
||||||
|
this._initialProgress = 0;
|
||||||
|
this._cancelProgress = 0;
|
||||||
|
|
||||||
|
this._prevOffset = 0;
|
||||||
|
this._progress = 0;
|
||||||
|
|
||||||
|
this._prevTime = 0;
|
||||||
|
this._velocity = 0;
|
||||||
|
|
||||||
|
this._cancelled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_interrupt() {
|
||||||
|
this.emit('end', 0, this._cancelProgress);
|
||||||
|
this._reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
_beginTouchSwipe(gesture, time, x, y) {
|
||||||
|
if (this._dragGesture)
|
||||||
|
this._dragGesture.cancel();
|
||||||
|
|
||||||
|
this._beginGesture(gesture, time, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
_beginGesture(gesture, time, x, y) {
|
||||||
|
if (this._state === State.SCROLLING)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._prevTime = time;
|
||||||
|
|
||||||
|
let rect = new Meta.Rectangle({ x, y, width: 1, height: 1 });
|
||||||
|
let monitor = global.display.get_monitor_index_for_rect(rect);
|
||||||
|
|
||||||
|
this.emit('begin', monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
_updateGesture(gesture, time, delta) {
|
||||||
|
if (this._state !== State.SCROLLING)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((this._allowedModes & Main.actionMode) === 0 || !this.enabled) {
|
||||||
|
this._interrupt();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.orientation === Clutter.Orientation.HORIZONTAL &&
|
||||||
|
Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
|
||||||
|
delta = -delta;
|
||||||
|
|
||||||
|
this._progress += delta;
|
||||||
|
|
||||||
|
if (time !== this._prevTime)
|
||||||
|
this._velocity = delta / (time - this._prevTime);
|
||||||
|
|
||||||
|
let firstPoint = this._snapPoints[0];
|
||||||
|
let lastPoint = this._snapPoints[this._snapPoints.length - 1];
|
||||||
|
this._progress = clamp(this._progress, firstPoint, lastPoint);
|
||||||
|
this._progress = clamp(this._progress,
|
||||||
|
this._initialProgress - 1, this._initialProgress + 1);
|
||||||
|
|
||||||
|
this.emit('update', this._progress);
|
||||||
|
|
||||||
|
this._prevTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
_getClosestSnapPoints() {
|
||||||
|
let upper = this._snapPoints.find(p => p >= this._progress);
|
||||||
|
let lower = this._snapPoints.slice().reverse().find(p => p <= this._progress);
|
||||||
|
return [lower, upper];
|
||||||
|
}
|
||||||
|
|
||||||
|
_getEndProgress() {
|
||||||
|
if (this._cancelled)
|
||||||
|
return this._cancelProgress;
|
||||||
|
|
||||||
|
let [lower, upper] = this._getClosestSnapPoints();
|
||||||
|
let middle = (upper + lower) / 2;
|
||||||
|
|
||||||
|
if (this._progress > middle) {
|
||||||
|
let thresholdMet = this._velocity * this._distance > -VELOCITY_THRESHOLD;
|
||||||
|
return thresholdMet || this._initialProgress > upper ? upper : lower;
|
||||||
|
} else {
|
||||||
|
let thresholdMet = this._velocity * this._distance < VELOCITY_THRESHOLD;
|
||||||
|
return thresholdMet || this._initialProgress < lower ? lower : upper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_endGesture(_gesture, _time) {
|
||||||
|
if (this._state !== State.SCROLLING)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((this._allowedModes & Main.actionMode) === 0 || !this.enabled) {
|
||||||
|
this._interrupt();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let endProgress = this._getEndProgress();
|
||||||
|
|
||||||
|
let velocity = ANIMATION_BASE_VELOCITY;
|
||||||
|
if ((endProgress - this._progress) * this._velocity > 0)
|
||||||
|
velocity = this._velocity;
|
||||||
|
|
||||||
|
let duration = Math.abs((this._progress - endProgress) / velocity * DURATION_MULTIPLIER);
|
||||||
|
if (duration > 0) {
|
||||||
|
duration = clamp(duration,
|
||||||
|
MIN_ANIMATION_DURATION, MAX_ANIMATION_DURATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.emit('end', duration, endProgress);
|
||||||
|
this._reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
_cancelGesture(gesture, time) {
|
||||||
|
if (this._state !== State.SCROLLING)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._cancelled = true;
|
||||||
|
this._endGesture(gesture, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* confirmSwipe:
|
||||||
|
* @param {number} distance: swipe distance in pixels
|
||||||
|
* @param {number[]} snapPoints:
|
||||||
|
* An array of snap points, sorted in ascending order
|
||||||
|
* @param {number} currentProgress: initial progress value
|
||||||
|
* @param {number} cancelProgress: the value to be used on cancelling
|
||||||
|
*
|
||||||
|
* Confirms a swipe. User has to call this in 'begin' signal handler,
|
||||||
|
* otherwise the swipe wouldn't start. If there's an animation running,
|
||||||
|
* it should be stopped first.
|
||||||
|
*
|
||||||
|
* @cancel_progress must always be a snap point, or a value matching
|
||||||
|
* some other non-transient state.
|
||||||
|
*/
|
||||||
|
confirmSwipe(distance, snapPoints, currentProgress, cancelProgress) {
|
||||||
|
this.distance = distance;
|
||||||
|
this._snapPoints = snapPoints;
|
||||||
|
this._initialProgress = currentProgress;
|
||||||
|
this._progress = currentProgress;
|
||||||
|
this._cancelProgress = cancelProgress;
|
||||||
|
|
||||||
|
this._velocity = 0;
|
||||||
|
this._state = State.SCROLLING;
|
||||||
|
}
|
||||||
|
});
|