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.service
 | 
			
		||||
data/theme/.sass-cache
 | 
			
		||||
data/theme/gnome-shell*.css.map
 | 
			
		||||
data/theme/gnome-shell*.css
 | 
			
		||||
docs/reference/*/*.args
 | 
			
		||||
docs/reference/*/*.bak
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
        if (var == 5) {
 | 
			
		||||
            for (let i = 0; i < 10; i++) {
 | 
			
		||||
            for (let i = 0; i < 10; i++)
 | 
			
		||||
                print(i);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            print(20);
 | 
			
		||||
        }
 | 
			
		||||
@@ -102,9 +101,8 @@ under the imports:
 | 
			
		||||
Always use either `const` or `let` when defining a variable.
 | 
			
		||||
```javascript
 | 
			
		||||
    // Iterating over an array
 | 
			
		||||
    for (let i = 0; i < arr.length; ++i) {
 | 
			
		||||
    for (let i = 0; i < arr.length; ++i)
 | 
			
		||||
        let item = arr[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Iterating over an object's properties
 | 
			
		||||
    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
 | 
			
		||||
notation.
 | 
			
		||||
```javascript
 | 
			
		||||
    let closure1 = () => { this._fnorbate(); };
 | 
			
		||||
    let closure1 = () => this._fnorbate();
 | 
			
		||||
    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
 | 
			
		||||
======
 | 
			
		||||
* 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.GeoClue2.Agent.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.Request.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.login1.Manager.xml</file>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,6 @@ Type=Application
 | 
			
		||||
Name=Shell Extensions
 | 
			
		||||
Comment=Configure GNOME Shell Extensions
 | 
			
		||||
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;
 | 
			
		||||
OnlyShowIn=GNOME;
 | 
			
		||||
NoDisplay=true
 | 
			
		||||
 
 | 
			
		||||
@@ -20,6 +20,8 @@
 | 
			
		||||
    <file>no-notifications.svg</file>
 | 
			
		||||
    <file>noise-texture.png</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-drag-symbolic.svg">pointer-drag-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
 | 
			
		||||
# file when built in a non-system prefix
 | 
			
		||||
desktopconf.set('bindir', bindir)
 | 
			
		||||
desktopconf.set('VERSION', meson.project_version())
 | 
			
		||||
desktopconf.set('systemd_hidden', have_systemd ? 'true' : 'false')
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,6 @@ Type=Application
 | 
			
		||||
Name=GNOME Shell
 | 
			
		||||
Comment=Window management and application launching
 | 
			
		||||
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;
 | 
			
		||||
OnlyShowIn=GNOME;
 | 
			
		||||
NoDisplay=true
 | 
			
		||||
 
 | 
			
		||||
@@ -50,7 +50,7 @@
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <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>
 | 
			
		||||
      <description>
 | 
			
		||||
        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/_drawing";
 | 
			
		||||
@import "gnome-shell-sass/_common";
 | 
			
		||||
@import "gnome-shell-sass/_widgets";
 | 
			
		||||
 | 
			
		||||
//force symbolic icons
 | 
			
		||||
stage {
 | 
			
		||||
  -st-icon-style: symbolic;
 | 
			
		||||
	-st-icon-style: symbolic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.toggle-switch { width: 48px; }
 | 
			
		||||
.toggle-switch-us, .toggle-switch-intl {
 | 
			
		||||
  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"); }
 | 
			
		||||
	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"); }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,15 @@
 | 
			
		||||
// When color definition differs for dark and light variant,
 | 
			
		||||
// it gets @if ed depending on $variant
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
$base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 20%), 2%));
 | 
			
		||||
$base_color: if($variant == 'light', #fff, lighten(desaturate(#241f31, 20%), 2%));
 | 
			
		||||
$bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%));
 | 
			
		||||
$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_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%));
 | 
			
		||||
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%));
 | 
			
		||||
$borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93));
 | 
			
		||||
$borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 8%));
 | 
			
		||||
$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_visited_color: if($variant == 'light', darken($selected_bg_color, 20%), lighten($selected_bg_color, 10%));
 | 
			
		||||
$top_hilight: $borders_edge;
 | 
			
		||||
@@ -20,21 +19,20 @@ $error_color: #ff8080;
 | 
			
		||||
$success_color: if($variant == 'light', #33d17a, darken(#33d17a, 10%));
 | 
			
		||||
$destructive_color: if($variant == 'light', #e01b24, darken(#e01b24, 10%));
 | 
			
		||||
 | 
			
		||||
$osd_fg_color: #eeeeec;
 | 
			
		||||
$osd_text_color: white;
 | 
			
		||||
$osd_bg_color: transparentize(darken(desaturate(#3d3846, 100%), 12%),0.04);
 | 
			
		||||
$osd_fg_color: $fg_color;
 | 
			
		||||
$osd_text_color: if($variant == 'light', #000, #fff);
 | 
			
		||||
$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_fg_color: mix($osd_fg_color, opacify($osd_bg_color, 1), 50%);
 | 
			
		||||
$osd_borders_color: transparentize(black, 0.3);
 | 
			
		||||
$osd_outer_borders_color: transparentize(white, 0.84);
 | 
			
		||||
$osd_borders_color: if($variant == 'light', rgba(255,255,255,0.1), rgba(0,0,0,0.7));
 | 
			
		||||
$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: transparentize(black, 0.9);
 | 
			
		||||
$shadow_color: if($variant == 'light', rgba(0,0,0,0.1), rgba(0,0,0,0.2));
 | 
			
		||||
 | 
			
		||||
//insensitive state derived colors
 | 
			
		||||
$insensitive_fg_color: mix($fg_color, $bg_color, 50%);
 | 
			
		||||
$insensitive_bg_color: mix($bg_color, $base_color, 60%);
 | 
			
		||||
$insensitive_borders_color: $borders_color;
 | 
			
		||||
$insensitive_borders_color: mix($borders_color, $base_color, 60%);
 | 
			
		||||
 | 
			
		||||
//colors for the backdrop state, derived from the main colors.
 | 
			
		||||
$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_insensitive_color: if($variant =='light', darken($backdrop_bg_color,15%), lighten($backdrop_bg_color,15%));
 | 
			
		||||
$backdrop_borders_color: mix($borders_color, $bg_color, 90%);
 | 
			
		||||
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
 | 
			
		||||
$backdrop_dark_fill: mix($backdrop_borders_color,$backdrop_bg_color, 35%);
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
  @return 0 1px $c;
 | 
			
		||||
}
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
  //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;
 | 
			
		||||
//
 | 
			
		||||
@@ -31,8 +31,7 @@
 | 
			
		||||
//
 | 
			
		||||
// $t: entry type
 | 
			
		||||
// $fc: focus color
 | 
			
		||||
// $edge: set to none to not draw the bottom edge or specify a color to not
 | 
			
		||||
//        use the default one
 | 
			
		||||
// $edge: set to none to not draw the bottom edge or specify a color to not use the default one
 | 
			
		||||
//
 | 
			
		||||
// possible $t values:
 | 
			
		||||
// normal, focus, insensitive
 | 
			
		||||
@@ -45,8 +44,9 @@
 | 
			
		||||
  }
 | 
			
		||||
  @if $t==focus {
 | 
			
		||||
    border-color: if($fc==$selected_bg_color,
 | 
			
		||||
                     $selected_borders_color,
 | 
			
		||||
                     darken($fc,35%));
 | 
			
		||||
              $selected_borders_color,
 | 
			
		||||
              darken($fc,35%));
 | 
			
		||||
    box-shadow: inset 0 0 0 1px $fc;
 | 
			
		||||
  }
 | 
			
		||||
  @if $t==hover { }
 | 
			
		||||
  @if $t==insensitive {
 | 
			
		||||
@@ -58,36 +58,39 @@
 | 
			
		||||
 | 
			
		||||
// buttons
 | 
			
		||||
 | 
			
		||||
@function _border_color ($c) { @return darken($c,25%); } // colored buttons want
 | 
			
		||||
                                                         // the border form the
 | 
			
		||||
                                                         // base color
 | 
			
		||||
@function draw_border_color ($c) {
 | 
			
		||||
  //
 | 
			
		||||
  // 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
 | 
			
		||||
//
 | 
			
		||||
// $tc is the text color
 | 
			
		||||
// $bg is the background color
 | 
			
		||||
//
 | 
			
		||||
  $_lbg: lightness($bg)/100%;
 | 
			
		||||
  @if lightness($tc)<50% { @return transparentize(white,1-$_lbg/($_lbg*1.3)); }
 | 
			
		||||
  @else { @return transparentize(black,$_lbg*0.8); }
 | 
			
		||||
  $lbg: lightness($bg)/100%;
 | 
			
		||||
  @if lightness($tc)<50% { @return rgba(255,255,255,$lbg/($lbg*1.3)); }
 | 
			
		||||
  @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
 | 
			
		||||
//
 | 
			
		||||
// $c: base color;
 | 
			
		||||
//
 | 
			
		||||
  @if lightness($c)>90% { @return white; }
 | 
			
		||||
  @else if lightness($c)>80% { @return transparentize(white, 0.3); }
 | 
			
		||||
  @else if lightness($c)>50% { @return transparentize(white, 0.5); }
 | 
			
		||||
  @else if lightness($c)>40% { @return transparentize(white, 0.7); }
 | 
			
		||||
  @else { @return transparentize(white, 0.9); }
 | 
			
		||||
  @else if lightness($c)>80% { @return rgba(255,255,255, 0.7); }
 | 
			
		||||
  @else if lightness($c)>50% { @return rgba(255,255,255, 0.5); }
 | 
			
		||||
  @else if lightness($c)>40% { @return rgba(255,255,255, 0.3); }
 | 
			
		||||
  @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
 | 
			
		||||
//
 | 
			
		||||
@@ -96,19 +99,19 @@
 | 
			
		||||
// 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% {
 | 
			
		||||
    text-shadow: 0 1px $_shadow;
 | 
			
		||||
    icon-shadow: 0 1px $_shadow;
 | 
			
		||||
    text-shadow: 0 1px $shadow;
 | 
			
		||||
    icon-shadow: 0 1px $shadow;
 | 
			
		||||
  }
 | 
			
		||||
  @else {
 | 
			
		||||
    text-shadow: 0 -1px $_shadow;
 | 
			
		||||
    icon-shadow: 0 -1px $_shadow;
 | 
			
		||||
    text-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
 | 
			
		||||
//
 | 
			
		||||
@@ -117,6 +120,8 @@
 | 
			
		||||
// $tc:   optional text color for colored* types
 | 
			
		||||
// $edge: set to none to not draw the bottom edge or specify a color to not
 | 
			
		||||
//        use the default one
 | 
			
		||||
// $shadow: set to none to not draw the drop shadow or specify a color to not
 | 
			
		||||
//          use the default one
 | 
			
		||||
//
 | 
			
		||||
// possible $t values:
 | 
			
		||||
// normal, hover, active, insensitive, insensitive-active,
 | 
			
		||||
@@ -124,79 +129,68 @@
 | 
			
		||||
// osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
  $_hilight_color: _button_hilight_color($c);
 | 
			
		||||
  $_button_edge: if($edge == none, none, _widget_edge($edge));
 | 
			
		||||
  $_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1)));
 | 
			
		||||
  $_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03);
 | 
			
		||||
  $hilight_color: draw_button_hilight_color($c);
 | 
			
		||||
  $button_edge: if($edge == none, none, draw_widget_edge($edge));
 | 
			
		||||
  $blank_edge: if($edge == none, none, draw_widget_edge(transparentize($edge,1)));
 | 
			
		||||
  $button_shadow: if($shadow == none, none, 0 1px 1px 0 $shadow);
 | 
			
		||||
 | 
			
		||||
  @if $t==normal {
 | 
			
		||||
  //
 | 
			
		||||
  // normal button
 | 
			
		||||
  //
 | 
			
		||||
 | 
			
		||||
  @if $t==normal {
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    background-color: $c;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    box-shadow: $_button_shadow;
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
    background-color: lighten($c, 3%) !important;
 | 
			
		||||
    border-color: draw_border_color($c);
 | 
			
		||||
    @include draw_shadows($button_shadow);
 | 
			
		||||
    // box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
 | 
			
		||||
    text-shadow: 0 1px $text_shadow_color;
 | 
			
		||||
    icon-shadow: 0 1px $text_shadow_color;
 | 
			
		||||
  }
 | 
			
		||||
  @if $t==focus {
 | 
			
		||||
  //
 | 
			
		||||
 | 
			
		||||
  // focused button
 | 
			
		||||
  //  
 | 
			
		||||
  @if $t==focus {
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
    box-shadow: inset 0px 0px 0px 2px $selected_bg_color;
 | 
			
		||||
    text-shadow: 0 1px $text_shadow_color;
 | 
			
		||||
    icon-shadow: 0 1px $text_shadow_color;
 | 
			
		||||
    box-shadow: inset 0 0 0 2px transparentize($selected_bg_color, 0.7);
 | 
			
		||||
    //border-color: $selected_bg_color;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // hover button
 | 
			
		||||
  @else if $t==hover {
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    background-color: $c;
 | 
			
		||||
    box-shadow: $_button_shadow;
 | 
			
		||||
    text-shadow: 0 1px black;
 | 
			
		||||
    icon-shadow: 0 1px black;
 | 
			
		||||
 | 
			
		||||
    background-color: lighten($c, if($variant == 'light', 8%, 5%)) !important;
 | 
			
		||||
    border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c));
 | 
			
		||||
    @include draw_shadows($button_shadow);
 | 
			
		||||
    text-shadow: 0 1px $text_shadow_color;
 | 
			
		||||
    icon-shadow: 0 1px $text_shadow_color;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // active button
 | 
			
		||||
  @else if $t==active {
 | 
			
		||||
  //
 | 
			
		||||
  // active osd button
 | 
			
		||||
  //
 | 
			
		||||
    color: $tc;
 | 
			
		||||
    border-color: $borders_color;
 | 
			
		||||
    background-color: $c;
 | 
			
		||||
    background-color: darken($c,3%) !important;
 | 
			
		||||
    border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%)));
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
  @else if $t==insensitive {
 | 
			
		||||
 | 
			
		||||
  // insensitive button
 | 
			
		||||
  @else if $t==insensitive {
 | 
			
		||||
    color: $insensitive_fg_color;
 | 
			
		||||
    border-color: $insensitive_borders_color;
 | 
			
		||||
    background-color: $insensitive_bg_color;
 | 
			
		||||
    background-color: $insensitive_bg_color !important;
 | 
			
		||||
    box-shadow: none;
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
  @else if $t==undecorated {
 | 
			
		||||
  //
 | 
			
		||||
 | 
			
		||||
  // reset
 | 
			
		||||
  //
 | 
			
		||||
  @else if $t==undecorated {
 | 
			
		||||
    border-color: transparent;
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
    background-image: none;
 | 
			
		||||
 | 
			
		||||
    @include _shadows(inset 0 1px transparentize(white,1),
 | 
			
		||||
                      $_blank_edge);
 | 
			
		||||
 | 
			
		||||
    @include draw_shadows(inset 0 1px rgba(255,255,255,0),$blank_edge);
 | 
			
		||||
    text-shadow: none;
 | 
			
		||||
    icon-shadow: none;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,11 +22,10 @@ $destructive_color: darken(#ef2929,10%);
 | 
			
		||||
 | 
			
		||||
$osd_fg_color: #eeeeec;
 | 
			
		||||
$osd_bg_color: #2e3436;
 | 
			
		||||
$osd_borders_color: transparentize(black, 0.3);
 | 
			
		||||
$osd_outer_borders_color: transparentize(white, 0.9);
 | 
			
		||||
$osd_borders_color: rgba(0,0,0, 0.7);
 | 
			
		||||
$osd_outer_borders_color: rgba(255,255,255, 0.1);
 | 
			
		||||
 | 
			
		||||
$tooltip_borders_color: $osd_outer_borders_color;
 | 
			
		||||
$shadow_color: transparentize(black, 0.9);
 | 
			
		||||
$shadow_color: rgba(0,0,0, 0.1);
 | 
			
		||||
 | 
			
		||||
//insensitive state derived colors
 | 
			
		||||
$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/_drawing";
 | 
			
		||||
@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: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-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 xmlns="http://www.w3.org/2000/svg" class="keyboard-key" width="24" height="24">
 | 
			
		||||
    <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"/>
 | 
			
		||||
    <path overflow="visible" d="M22 1.5v9a5 5 0 01-5 5H4" style="marker:none" color="#000" fill="none" stroke="#fff" stroke-width="3"/>
 | 
			
		||||
</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
 | 
			
		||||
   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 class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
 | 
			
		||||
    <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"/>
 | 
			
		||||
</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: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-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 xmlns="http://www.w3.org/2000/svg" class="keyboard-key" width="24" height="24">
 | 
			
		||||
    <path d="M4.5 2v21" fill="#e5e5e5" fill-rule="evenodd" stroke="#e5e5e5" stroke-width="3"/>
 | 
			
		||||
    <path d="M4 12h6l2 4h8V6h-6l-2-4H4z" fill="none" stroke="#e5e5e5" stroke-width="2" stroke-linejoin="round"/>
 | 
			
		||||
    <path d="M4 12h6l2 4h8V6h-6l-2-4H4z" fill="#e5e5e5" fill-rule="evenodd"/>
 | 
			
		||||
</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
 | 
			
		||||
   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 class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
 | 
			
		||||
    <path style="marker:none" d="M12 0L2 12h6v6h8v-6h6zM8 21v3h8v-3z" color="#000" overflow="visible" fill="#3584e4"/>
 | 
			
		||||
</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
 | 
			
		||||
   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 class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
 | 
			
		||||
    <path d="M8 22v-8H2L12 2l10 12h-6v8z" style="marker:none" color="#000" overflow="visible" fill="#3584e4"/>
 | 
			
		||||
</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
 | 
			
		||||
   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 class="keyboard-key" xmlns="http://www.w3.org/2000/svg" width="24" height="24">
 | 
			
		||||
    <path d="M8 22v-8H2L12 2l10 12h-6v8z" style="marker:none" color="#000" overflow="visible" fill="#bebebe"/>
 | 
			
		||||
</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/_common.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 = [
 | 
			
		||||
@@ -23,3 +56,4 @@ foreach style: styles
 | 
			
		||||
                              ],
 | 
			
		||||
                              depend_files: theme_sources)
 | 
			
		||||
endforeach
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -66,4 +66,11 @@ its dependencies to build from tarballs.</description>
 | 
			
		||||
      <gnome:userid>fmuellner</gnome:userid>
 | 
			
		||||
    </foaf:Person>
 | 
			
		||||
  </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>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ const Format = imports.format;
 | 
			
		||||
 | 
			
		||||
const _ = Gettext.gettext;
 | 
			
		||||
 | 
			
		||||
const Config = imports.misc.config;
 | 
			
		||||
const ExtensionUtils = imports.misc.extensionUtils;
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
@@ -692,8 +691,5 @@ function initEnvironment() {
 | 
			
		||||
function main(argv) {
 | 
			
		||||
    initEnvironment();
 | 
			
		||||
 | 
			
		||||
    Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
 | 
			
		||||
    Gettext.textdomain(Config.GETTEXT_PACKAGE);
 | 
			
		||||
 | 
			
		||||
    new Application().run(argv);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -98,18 +98,30 @@ var AuthPrompt = GObject.registerClass({
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.add_child(this._label);
 | 
			
		||||
        this._entry = new St.Entry({
 | 
			
		||||
 | 
			
		||||
        let entryParams = {
 | 
			
		||||
            style_class: 'login-dialog-prompt-entry',
 | 
			
		||||
            can_focus: true,
 | 
			
		||||
            x_expand: false,
 | 
			
		||||
            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._entry.grab_key_focus();
 | 
			
		||||
 | 
			
		||||
        this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
 | 
			
		||||
        this.add_child(this._capsLockWarningLabel);
 | 
			
		||||
 | 
			
		||||
        this._message = new St.Label({
 | 
			
		||||
            opacity: 0,
 | 
			
		||||
            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)
 | 
			
		||||
            this.clear();
 | 
			
		||||
 | 
			
		||||
@@ -205,10 +228,11 @@ var AuthPrompt = GObject.registerClass({
 | 
			
		||||
            this._preemptiveAnswer = null;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        this.setPasswordChar(passwordChar);
 | 
			
		||||
 | 
			
		||||
        this._updateEntry(secret);
 | 
			
		||||
        this.setQuestion(question);
 | 
			
		||||
 | 
			
		||||
        if (passwordChar) {
 | 
			
		||||
        if (secret) {
 | 
			
		||||
            if (this._userVerifier.reauthenticating)
 | 
			
		||||
                this.nextButton.label = _("Unlock");
 | 
			
		||||
            else
 | 
			
		||||
@@ -358,11 +382,6 @@ var AuthPrompt = GObject.registerClass({
 | 
			
		||||
        this.stopSpinning();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setPasswordChar(passwordChar) {
 | 
			
		||||
        this._entry.clutter_text.set_password_char(passwordChar);
 | 
			
		||||
        this._entry.menu.isPassword = passwordChar != '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    setQuestion(question) {
 | 
			
		||||
        this._label.set_text(question);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -896,7 +896,6 @@ var LoginDialog = GObject.registerClass({
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _askForUsernameAndBeginVerification() {
 | 
			
		||||
        this._authPrompt.setPasswordChar('');
 | 
			
		||||
        this._authPrompt.setQuestion(_("Username: "));
 | 
			
		||||
 | 
			
		||||
        this._showRealmLoginHint(this._realmManager.loginFormat);
 | 
			
		||||
 
 | 
			
		||||
@@ -485,7 +485,7 @@ var ShellUserVerifier = class {
 | 
			
		||||
        if (!this.serviceIsForeground(serviceName))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this.emit('ask-question', serviceName, question, '');
 | 
			
		||||
        this.emit('ask-question', serviceName, question, false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onSecretInfoQuery(client, serviceName, secretQuestion) {
 | 
			
		||||
@@ -498,7 +498,7 @@ var ShellUserVerifier = class {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
 | 
			
		||||
        this.emit('ask-question', serviceName, secretQuestion, true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onReset() {
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@
 | 
			
		||||
    <file>perf/core.js</file>
 | 
			
		||||
    <file>perf/hwtest.js</file>
 | 
			
		||||
 | 
			
		||||
    <file>ui/accessDialog.js</file>
 | 
			
		||||
    <file>ui/altTab.js</file>
 | 
			
		||||
    <file>ui/animation.js</file>
 | 
			
		||||
    <file>ui/appDisplay.js</file>
 | 
			
		||||
@@ -98,6 +97,7 @@
 | 
			
		||||
    <file>ui/shellEntry.js</file>
 | 
			
		||||
    <file>ui/shellMountOperation.js</file>
 | 
			
		||||
    <file>ui/slider.js</file>
 | 
			
		||||
    <file>ui/swipeTracker.js</file>
 | 
			
		||||
    <file>ui/switcherPopup.js</file>
 | 
			
		||||
    <file>ui/switchMonitor.js</file>
 | 
			
		||||
    <file>ui/tweener.js</file>
 | 
			
		||||
 
 | 
			
		||||
@@ -89,7 +89,7 @@ const SystemActions = GObject.registerClass({
 | 
			
		||||
            name: C_("search-result", "Power Off"),
 | 
			
		||||
            iconName: 'system-shutdown-symbolic',
 | 
			
		||||
            // 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,
 | 
			
		||||
        });
 | 
			
		||||
        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();
 | 
			
		||||
 | 
			
		||||
        if (apps.length == 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._switcherList = new AppSwitcher(apps, this);
 | 
			
		||||
        this._items = this._switcherList.icons;
 | 
			
		||||
    }
 | 
			
		||||
@@ -178,7 +175,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
            this._select(this._next());
 | 
			
		||||
        } else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
 | 
			
		||||
            this._select(this._previous());
 | 
			
		||||
        } else if (keysym === Clutter.KEY_q) {
 | 
			
		||||
        } else if (keysym == Clutter.KEY_q || keysym === Clutter.KEY_Q) {
 | 
			
		||||
            this._quitApplication(this._selectedIndex);
 | 
			
		||||
        } else if (this._thumbnailsFocused) {
 | 
			
		||||
            if (keysym === Clutter.KEY_Left)
 | 
			
		||||
@@ -187,7 +184,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
                this._select(this._selectedIndex, this._nextWindow());
 | 
			
		||||
            else if (keysym === Clutter.KEY_Up)
 | 
			
		||||
                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);
 | 
			
		||||
            else
 | 
			
		||||
                return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
@@ -248,20 +245,20 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
        this._select(n);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _windowActivated(thumbnailList, n) {
 | 
			
		||||
    _windowActivated(thumbnailSwitcher, n) {
 | 
			
		||||
        let appIcon = this._items[this._selectedIndex];
 | 
			
		||||
        Main.activateWindow(appIcon.cachedWindows[n]);
 | 
			
		||||
        this.fadeAndDestroy();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _windowEntered(thumbnailList, n) {
 | 
			
		||||
    _windowEntered(thumbnailSwitcher, n) {
 | 
			
		||||
        if (!this.mouseActive)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._select(this._selectedIndex, n);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _windowRemoved(thumbnailList, n) {
 | 
			
		||||
    _windowRemoved(thumbnailSwitcher, n) {
 | 
			
		||||
        let appIcon = this._items[this._selectedIndex];
 | 
			
		||||
        if (!appIcon)
 | 
			
		||||
            return;
 | 
			
		||||
@@ -373,7 +370,7 @@ class AppSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _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-entered', this._windowEntered.bind(this));
 | 
			
		||||
        this._thumbnails.connect('item-removed', this._windowRemoved.bind(this));
 | 
			
		||||
@@ -481,9 +478,6 @@ var CyclerPopup = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        this._items = this._getWindows();
 | 
			
		||||
 | 
			
		||||
        if (this._items.length == 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._highlight = new CyclerHighlight();
 | 
			
		||||
        global.window_group.add_actor(this._highlight);
 | 
			
		||||
 | 
			
		||||
@@ -559,11 +553,8 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
 | 
			
		||||
        let windows = this._getWindowList();
 | 
			
		||||
 | 
			
		||||
        if (windows.length == 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -596,7 +587,7 @@ class WindowSwitcherPopup extends SwitcherPopup.SwitcherPopup {
 | 
			
		||||
            this._select(this._previous());
 | 
			
		||||
        else if (keysym == Clutter.KEY_Right)
 | 
			
		||||
            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);
 | 
			
		||||
        else
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
@@ -811,7 +802,7 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // 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
 | 
			
		||||
    // thumbnails are visible (ie, when the app icon is supposed to be
 | 
			
		||||
    // in justOutline mode). Apps with multiple windows will normally
 | 
			
		||||
@@ -868,8 +859,8 @@ class AppSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var ThumbnailList = GObject.registerClass(
 | 
			
		||||
class ThumbnailList extends SwitcherPopup.SwitcherList {
 | 
			
		||||
var ThumbnailSwitcher = GObject.registerClass(
 | 
			
		||||
class ThumbnailSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
    _init(windows) {
 | 
			
		||||
        super._init(false);
 | 
			
		||||
 | 
			
		||||
@@ -1022,8 +1013,8 @@ class WindowIcon extends St.BoxLayout {
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var WindowList = GObject.registerClass(
 | 
			
		||||
class WindowList extends SwitcherPopup.SwitcherList {
 | 
			
		||||
var WindowSwitcher = GObject.registerClass(
 | 
			
		||||
class WindowSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
    _init(windows, mode) {
 | 
			
		||||
        super._init(true);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ const Main = imports.ui.main;
 | 
			
		||||
const PageIndicators = imports.ui.pageIndicators;
 | 
			
		||||
const PopupMenu = imports.ui.popupMenu;
 | 
			
		||||
const Search = imports.ui.search;
 | 
			
		||||
const SwipeTracker = imports.ui.swipeTracker;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
const Util = imports.misc.util;
 | 
			
		||||
const SystemActions = imports.misc.systemActions;
 | 
			
		||||
@@ -35,7 +36,7 @@ var MIN_FREQUENT_APPS_COUNT = 3;
 | 
			
		||||
var VIEWS_SWITCH_TIME = 400;
 | 
			
		||||
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_DELAY = 700;
 | 
			
		||||
@@ -327,7 +328,9 @@ var AllView = GObject.registerClass({
 | 
			
		||||
            (indicators, 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._folderIcons = [];
 | 
			
		||||
@@ -353,13 +356,12 @@ var AllView = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        this._scrollView.connect('scroll-event', this._onScroll.bind(this));
 | 
			
		||||
 | 
			
		||||
        let panAction = new Clutter.PanAction({ interpolate: false });
 | 
			
		||||
        panAction.connect('pan', this._onPan.bind(this));
 | 
			
		||||
        panAction.connect('gesture-cancel', this._onPanEnd.bind(this));
 | 
			
		||||
        panAction.connect('gesture-end', this._onPanEnd.bind(this));
 | 
			
		||||
        this._panAction = panAction;
 | 
			
		||||
        this._scrollView.add_action(panAction);
 | 
			
		||||
        this._panning = false;
 | 
			
		||||
        this._swipeTracker = new SwipeTracker.SwipeTracker(
 | 
			
		||||
            this._scrollView, Shell.ActionMode.OVERVIEW);
 | 
			
		||||
        this._swipeTracker.connect('begin', this._swipeBegin.bind(this));
 | 
			
		||||
        this._swipeTracker.connect('update', this._swipeUpdate.bind(this));
 | 
			
		||||
        this._swipeTracker.connect('end', this._swipeEnd.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._clickAction = new Clutter.ClickAction();
 | 
			
		||||
        this._clickAction.connect('clicked', () => {
 | 
			
		||||
            if (!this._currentPopup)
 | 
			
		||||
@@ -376,6 +378,9 @@ var AllView = GObject.registerClass({
 | 
			
		||||
        this._displayingPopup = false;
 | 
			
		||||
        this._currentPopupDestroyId = 0;
 | 
			
		||||
 | 
			
		||||
        this._canScroll = true; // limiting scrolling speed
 | 
			
		||||
        this._scrollTimeoutId = 0;
 | 
			
		||||
 | 
			
		||||
        this._availWidth = 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-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() {
 | 
			
		||||
        this._keyPressEventId =
 | 
			
		||||
            global.stage.connect('key-press-event',
 | 
			
		||||
                this._onKeyPressEvent.bind(this));
 | 
			
		||||
        this._swipeTracker.enabled = true;
 | 
			
		||||
        super.vfunc_map();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -420,6 +435,7 @@ var AllView = GObject.registerClass({
 | 
			
		||||
            global.stage.disconnect(this._keyPressEventId);
 | 
			
		||||
            this._keyPressEventId = 0;
 | 
			
		||||
        }
 | 
			
		||||
        this._swipeTracker.enabled = false;
 | 
			
		||||
        super.vfunc_unmap();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -565,7 +581,7 @@ var AllView = GObject.registerClass({
 | 
			
		||||
        return this._grid.getPageY(this._grid.currentPage);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    goToPage(pageNumber) {
 | 
			
		||||
    goToPage(pageNumber, animate = true) {
 | 
			
		||||
        pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
 | 
			
		||||
 | 
			
		||||
        if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup)
 | 
			
		||||
@@ -580,42 +596,16 @@ var AllView = GObject.registerClass({
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let velocity;
 | 
			
		||||
        if (!this._panning)
 | 
			
		||||
            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);
 | 
			
		||||
        if (this._grid.currentPage === pageNumber)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._grid.currentPage = pageNumber;
 | 
			
		||||
        this._adjustment.ease(this._grid.getPageY(pageNumber), {
 | 
			
		||||
            mode: Clutter.AnimationMode.EASE_OUT_QUAD,
 | 
			
		||||
            duration: time,
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _diffToPage(pageNumber) {
 | 
			
		||||
        let currentScrollPosition = this._adjustment.value;
 | 
			
		||||
        return Math.abs(currentScrollPosition - this._grid.getPageY(pageNumber));
 | 
			
		||||
        // Tween the change between pages.
 | 
			
		||||
        this._adjustment.ease(this._grid.getPageY(this._grid.currentPage), {
 | 
			
		||||
            mode: Clutter.AnimationMode.EASE_OUT_CUBIC,
 | 
			
		||||
            duration: animate ? PAGE_SWITCH_TIME : 0,
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    openSpaceForPopup(item, side, nRows) {
 | 
			
		||||
@@ -638,43 +628,62 @@ var AllView = GObject.registerClass({
 | 
			
		||||
        if (this._displayingPopup || !this._scrollView.reactive)
 | 
			
		||||
            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();
 | 
			
		||||
        if (direction == Clutter.ScrollDirection.UP)
 | 
			
		||||
            this.goToPage(this._grid.currentPage - 1);
 | 
			
		||||
        else if (direction == Clutter.ScrollDirection.DOWN)
 | 
			
		||||
            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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onPan(action) {
 | 
			
		||||
        if (this._displayingPopup)
 | 
			
		||||
            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)
 | 
			
		||||
    _swipeBegin(tracker, monitor) {
 | 
			
		||||
        if (monitor !== Main.layoutManager.primaryIndex)
 | 
			
		||||
            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
 | 
			
		||||
        // scroll plus any velocity the user had when they released
 | 
			
		||||
        // their finger.
 | 
			
		||||
        let progress = adjustment.value / adjustment.page_size;
 | 
			
		||||
        let points = Array.from({ length: this._grid.nPages() }, (v, i) => i);
 | 
			
		||||
 | 
			
		||||
        let velocity = -action.get_velocity(0)[2];
 | 
			
		||||
        let endPanValue = this._adjustment.value + velocity;
 | 
			
		||||
        tracker.confirmSwipe(this._scrollView.height,
 | 
			
		||||
            points, progress, Math.round(progress));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        let closestPage = Math.round(endPanValue / pageHeight);
 | 
			
		||||
        this.goToPage(closestPage);
 | 
			
		||||
    _swipeUpdate(tracker, progress) {
 | 
			
		||||
        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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -55,6 +55,7 @@ const RENAMED_DESKTOP_IDS = {
 | 
			
		||||
    'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop',
 | 
			
		||||
    'org.gnome.Weather.Application.desktop': 'org.gnome.Weather.desktop',
 | 
			
		||||
    'polari.desktop': 'org.gnome.Polari.desktop',
 | 
			
		||||
    'seahorse.desktop': 'org.gnome.seahorse.Application.desktop',
 | 
			
		||||
    'shotwell.desktop': 'org.gnome.Shotwell.desktop',
 | 
			
		||||
    'tali.desktop': 'org.gnome.Tali.desktop',
 | 
			
		||||
    'totem.desktop': 'org.gnome.Totem.desktop',
 | 
			
		||||
 
 | 
			
		||||
@@ -863,12 +863,10 @@ class EventsSection extends MessageList.MessageListSection {
 | 
			
		||||
        let now = new Date();
 | 
			
		||||
        if (sameYear(this._date, now)) {
 | 
			
		||||
            /* Translators: Shown on calendar heading when selected day occurs on current year */
 | 
			
		||||
            dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
 | 
			
		||||
                                                             "%A, %B %-d"));
 | 
			
		||||
            dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d"));
 | 
			
		||||
        } else {
 | 
			
		||||
            /* Translators: Shown on calendar heading when selected day occurs on different year */
 | 
			
		||||
            dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
 | 
			
		||||
                                                             "%A, %B %-d, %Y"));
 | 
			
		||||
            dayFormat = Shell.util_translate_time_string(NC_("calendar heading", "%A, %B %-d, %Y"));
 | 
			
		||||
        }
 | 
			
		||||
        this._title.label = this._date.toLocaleFormat(dayFormat);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
/* 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 Main = imports.ui.main;
 | 
			
		||||
@@ -40,10 +40,9 @@ var CloseDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        /* Translators: %s is an application name */
 | 
			
		||||
        let title = _("“%s” is not responding.").format(windowApp.get_name());
 | 
			
		||||
        let subtitle = _("You may choose to wait a short while for it to " +
 | 
			
		||||
                         "continue or force the application to quit entirely.");
 | 
			
		||||
        let icon = new Gio.ThemedIcon({ name: 'dialog-warning-symbolic' });
 | 
			
		||||
        return new Dialog.MessageDialogContent({ icon, title, subtitle });
 | 
			
		||||
        let description = _('You may choose to wait a short while for it to ' +
 | 
			
		||||
                            'continue or force the application to quit entirely.');
 | 
			
		||||
        return new Dialog.MessageDialogContent({ title, description });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateScale() {
 | 
			
		||||
@@ -67,7 +66,7 @@ var CloseDialog = GObject.registerClass({
 | 
			
		||||
        this._dialog.width = windowActor.width;
 | 
			
		||||
        this._dialog.height = windowActor.height;
 | 
			
		||||
 | 
			
		||||
        this._dialog.addContent(this._createDialogContent());
 | 
			
		||||
        this._dialog.contentLayout.add_child(this._createDialogContent());
 | 
			
		||||
        this._dialog.addButton({ label: _('Force Quit'),
 | 
			
		||||
                                 action: this._onClose.bind(this),
 | 
			
		||||
                                 default: true });
 | 
			
		||||
 
 | 
			
		||||
@@ -21,12 +21,11 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this.prompt.connect('show-confirm', this._onShowConfirm.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({ icon });
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent();
 | 
			
		||||
        this.contentLayout.add(this._content);
 | 
			
		||||
 | 
			
		||||
        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._controlTable = null;
 | 
			
		||||
@@ -70,12 +69,13 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                                       y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
            label.set_text(_("Password:"));
 | 
			
		||||
            label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
            this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                                 text: '',
 | 
			
		||||
                                                 can_focus: true,
 | 
			
		||||
                                                 x_expand: true });
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
            ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
 | 
			
		||||
            this._passwordEntry = new St.PasswordEntry({
 | 
			
		||||
                style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                text: '',
 | 
			
		||||
                can_focus: true,
 | 
			
		||||
                x_expand: true,
 | 
			
		||||
            });
 | 
			
		||||
            ShellEntry.addContextMenu(this._passwordEntry);
 | 
			
		||||
            this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this));
 | 
			
		||||
 | 
			
		||||
            this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
 | 
			
		||||
@@ -102,12 +102,13 @@ class KeyringDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                                       x_align: Clutter.ActorAlign.START,
 | 
			
		||||
                                       y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
            label.set_text(_("Type again:"));
 | 
			
		||||
            this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                                text: '',
 | 
			
		||||
                                                can_focus: true,
 | 
			
		||||
                                                x_expand: true });
 | 
			
		||||
            this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
            ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
 | 
			
		||||
            this._confirmEntry = new St.PasswordEntry({
 | 
			
		||||
                style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                text: '',
 | 
			
		||||
                can_focus: true,
 | 
			
		||||
                x_expand: true,
 | 
			
		||||
            });
 | 
			
		||||
            ShellEntry.addContextMenu(this._confirmEntry);
 | 
			
		||||
            this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this));
 | 
			
		||||
            if (rtl) {
 | 
			
		||||
                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_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) {
 | 
			
		||||
            let choice = new CheckBox.CheckBox();
 | 
			
		||||
            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._content.messageBox.add_child(table);
 | 
			
		||||
        this._content.add_child(table);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateSensitivity(sensitive) {
 | 
			
		||||
 
 | 
			
		||||
@@ -29,11 +29,10 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        else
 | 
			
		||||
            this._content = this._getContent();
 | 
			
		||||
 | 
			
		||||
        let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
 | 
			
		||||
        let contentParams = { icon,
 | 
			
		||||
                              title: this._content.title,
 | 
			
		||||
                              body: this._content.message };
 | 
			
		||||
        let contentBox = new Dialog.MessageDialogContent(contentParams);
 | 
			
		||||
        let contentBox = new Dialog.MessageDialogContent({
 | 
			
		||||
            title: this._content.title,
 | 
			
		||||
            description: this._content.message,
 | 
			
		||||
        });
 | 
			
		||||
        this.contentLayout.add_actor(contentBox);
 | 
			
		||||
 | 
			
		||||
        let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
 | 
			
		||||
@@ -54,12 +53,18 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
            let reactive = secret.key != null;
 | 
			
		||||
 | 
			
		||||
            secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                          text: secret.value, can_focus: reactive,
 | 
			
		||||
                                          reactive,
 | 
			
		||||
                                          x_expand: true });
 | 
			
		||||
            ShellEntry.addContextMenu(secret.entry,
 | 
			
		||||
                                      { isPassword: secret.password });
 | 
			
		||||
            let entryParams = {
 | 
			
		||||
                style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                text: secret.value,
 | 
			
		||||
                can_focus: reactive,
 | 
			
		||||
                reactive,
 | 
			
		||||
                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)
 | 
			
		||||
                secret.valid = secret.validate(secret);
 | 
			
		||||
@@ -93,12 +98,17 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                layout.attach(secret.entry, 1, pos, 1, 1);
 | 
			
		||||
            }
 | 
			
		||||
            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) {
 | 
			
		||||
            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.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
 | 
			
		||||
            contentBox.messageBox.add_child(descriptionLabel);
 | 
			
		||||
            contentBox.add_child(descriptionLabel);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._okButton = {
 | 
			
		||||
@@ -714,6 +724,10 @@ var NetworkAgent = class {
 | 
			
		||||
            title = _("Mobile broadband network password");
 | 
			
		||||
            body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
 | 
			
		||||
            break;
 | 
			
		||||
        case 'vpn':
 | 
			
		||||
            title = _("VPN password");
 | 
			
		||||
            body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            log(`Invalid connection type: ${connectionType}`);
 | 
			
		||||
            this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
/* exported Component */
 | 
			
		||||
 | 
			
		||||
const { AccountsService, Clutter, Gio, GLib,
 | 
			
		||||
const { AccountsService, Clutter, GLib,
 | 
			
		||||
        GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const Animation = imports.ui.animation;
 | 
			
		||||
@@ -25,11 +25,11 @@ const DELAYED_RESET_TIMEOUT = 200;
 | 
			
		||||
var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'done': { param_types: [GObject.TYPE_BOOLEAN] } },
 | 
			
		||||
}, class AuthenticationDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(actionId, body, cookie, userNames) {
 | 
			
		||||
    _init(actionId, description, cookie, userNames) {
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        this.actionId = actionId;
 | 
			
		||||
        this.message = body;
 | 
			
		||||
        this.message = description;
 | 
			
		||||
        this.userNames = userNames;
 | 
			
		||||
 | 
			
		||||
        this._sessionUpdatedId = Main.sessionMode.connect('updated', () => {
 | 
			
		||||
@@ -38,10 +38,9 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
        this.connect('closed', this._onDialogClosed.bind(this));
 | 
			
		||||
 | 
			
		||||
        let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
 | 
			
		||||
        let title = _("Authentication Required");
 | 
			
		||||
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({ icon, title, body });
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({ title, description });
 | 
			
		||||
        this.contentLayout.add_actor(content);
 | 
			
		||||
 | 
			
		||||
        if (userNames.length > 1) {
 | 
			
		||||
@@ -62,7 +61,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
            style_class: 'polkit-dialog-user-layout',
 | 
			
		||||
            vertical: false,
 | 
			
		||||
        });
 | 
			
		||||
        content.messageBox.add(userBox);
 | 
			
		||||
        content.add_child(userBox);
 | 
			
		||||
 | 
			
		||||
        this._userAvatar = new UserWidget.Avatar(this._user, {
 | 
			
		||||
            iconSize: DIALOG_ICON_SIZE,
 | 
			
		||||
@@ -84,19 +83,19 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        userBox.add_child(this._userLabel);
 | 
			
		||||
 | 
			
		||||
        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({
 | 
			
		||||
            style_class: 'prompt-dialog-password-label',
 | 
			
		||||
            y_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
        });
 | 
			
		||||
        this._passwordBox.add_child(this._passwordLabel);
 | 
			
		||||
        this._passwordEntry = new St.Entry({
 | 
			
		||||
        this._passwordEntry = new St.PasswordEntry({
 | 
			
		||||
            style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
            text: "",
 | 
			
		||||
            can_focus: 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.bind_property('reactive',
 | 
			
		||||
            this._passwordEntry.clutter_text, 'editable',
 | 
			
		||||
@@ -109,17 +108,19 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        this._passwordBox.add(this._workSpinner);
 | 
			
		||||
 | 
			
		||||
        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.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._errorMessageLabel.clutter_text.line_wrap = true;
 | 
			
		||||
        content.messageBox.add_child(this._errorMessageLabel);
 | 
			
		||||
        content.add_child(this._errorMessageLabel);
 | 
			
		||||
        this._errorMessageLabel.hide();
 | 
			
		||||
 | 
			
		||||
        this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
 | 
			
		||||
        this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._infoMessageLabel.clutter_text.line_wrap = true;
 | 
			
		||||
        content.messageBox.add(this._infoMessageLabel);
 | 
			
		||||
        content.add_child(this._infoMessageLabel);
 | 
			
		||||
        this._infoMessageLabel.hide();
 | 
			
		||||
 | 
			
		||||
        /* 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.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._nullMessageLabel.clutter_text.line_wrap = true;
 | 
			
		||||
        content.messageBox.add(this._nullMessageLabel);
 | 
			
		||||
        content.add_child(this._nullMessageLabel);
 | 
			
		||||
        this._nullMessageLabel.show();
 | 
			
		||||
 | 
			
		||||
        this._cancelButton = this.addButton({ label: _("Cancel"),
 | 
			
		||||
@@ -278,10 +279,7 @@ var AuthenticationDialog = GObject.registerClass({
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordLabel.set_text(request);
 | 
			
		||||
 | 
			
		||||
        if (echoOn)
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('');
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
 | 
			
		||||
        this._passwordEntry.password_visible = echoOn;
 | 
			
		||||
 | 
			
		||||
        this._passwordBox.show();
 | 
			
		||||
        this._passwordEntry.set_text('');
 | 
			
		||||
 
 | 
			
		||||
@@ -348,7 +348,14 @@ class WeatherSection extends St.Button {
 | 
			
		||||
                timeOnly: true,
 | 
			
		||||
                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({
 | 
			
		||||
                style_class: 'weather-forecast-icon',
 | 
			
		||||
                icon_name: fc.get_symbolic_icon_name(),
 | 
			
		||||
@@ -357,21 +364,16 @@ class WeatherSection extends St.Button {
 | 
			
		||||
            });
 | 
			
		||||
            let temp = new St.Label({
 | 
			
		||||
                style_class: 'weather-forecast-temp',
 | 
			
		||||
                text: fc.get_temp_summary(),
 | 
			
		||||
                x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
            });
 | 
			
		||||
            let time = new St.Label({
 | 
			
		||||
                style_class: 'weather-forecast-time',
 | 
			
		||||
                text: timeStr,
 | 
			
		||||
                text: '%s%.0f°'.format(tempPrefix, tempValue),
 | 
			
		||||
                x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            temp.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
            time.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
 | 
			
		||||
            layout.attach(icon, col, 0, 1, 1);
 | 
			
		||||
            layout.attach(temp, col, 1, 1, 1);
 | 
			
		||||
            layout.attach(time, col, 2, 1, 1);
 | 
			
		||||
            layout.attach(time, col, 0, 1, 1);
 | 
			
		||||
            layout.attach(icon, col, 1, 1, 1);
 | 
			
		||||
            layout.attach(temp, col, 2, 1, 1);
 | 
			
		||||
            col++;
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										268
									
								
								js/ui/dialog.js
									
									
									
									
									
								
							
							
						
						@@ -1,7 +1,14 @@
 | 
			
		||||
// -*- 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(
 | 
			
		||||
class Dialog extends St.Widget {
 | 
			
		||||
@@ -25,10 +32,12 @@ class Dialog extends St.Widget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _createDialog() {
 | 
			
		||||
        this._dialog = new St.BoxLayout({ style_class: 'modal-dialog',
 | 
			
		||||
                                          x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          y_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
                                          vertical: true });
 | 
			
		||||
        this._dialog = new St.BoxLayout({
 | 
			
		||||
            style_class: 'modal-dialog',
 | 
			
		||||
            x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
            y_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
            vertical: true,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // modal dialogs are fixed width and grow vertically; set the request
 | 
			
		||||
        // 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.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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -95,10 +106,6 @@ class Dialog extends St.Widget {
 | 
			
		||||
        return this._initialKeyFocus || this;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addContent(actor) {
 | 
			
		||||
        this.contentLayout.add(actor, { expand: true });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    addButton(buttonInfo) {
 | 
			
		||||
        let { label, action, key } = buttonInfo;
 | 
			
		||||
        let isDefault = buttonInfo['default'];
 | 
			
		||||
@@ -111,13 +118,15 @@ class Dialog extends St.Widget {
 | 
			
		||||
        else
 | 
			
		||||
            keys = [];
 | 
			
		||||
 | 
			
		||||
        let button = new St.Button({ style_class: 'modal-dialog-linked-button',
 | 
			
		||||
                                     button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
 | 
			
		||||
                                     reactive: true,
 | 
			
		||||
                                     can_focus: true,
 | 
			
		||||
                                     x_expand: true,
 | 
			
		||||
                                     y_expand: true,
 | 
			
		||||
                                     label });
 | 
			
		||||
        let button = new St.Button({
 | 
			
		||||
            style_class: 'modal-dialog-linked-button',
 | 
			
		||||
            button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
 | 
			
		||||
            reactive: true,
 | 
			
		||||
            can_focus: true,
 | 
			
		||||
            x_expand: true,
 | 
			
		||||
            y_expand: true,
 | 
			
		||||
            label,
 | 
			
		||||
        });
 | 
			
		||||
        button.connect('clicked', action);
 | 
			
		||||
 | 
			
		||||
        buttonInfo['button'] = button;
 | 
			
		||||
@@ -144,99 +153,170 @@ class Dialog extends St.Widget {
 | 
			
		||||
 | 
			
		||||
var MessageDialogContent = GObject.registerClass({
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'icon': GObject.ParamSpec.object('icon', 'icon', 'icon',
 | 
			
		||||
                                         GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                         GObject.ParamFlags.CONSTRUCT,
 | 
			
		||||
                                         Gio.Icon.$gtype),
 | 
			
		||||
        'title': GObject.ParamSpec.string('title', 'title', 'title',
 | 
			
		||||
                                          GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                          GObject.ParamFlags.CONSTRUCT,
 | 
			
		||||
                                          null),
 | 
			
		||||
        'subtitle': GObject.ParamSpec.string('subtitle', 'subtitle', 'subtitle',
 | 
			
		||||
                                             GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                             GObject.ParamFlags.CONSTRUCT,
 | 
			
		||||
                                             null),
 | 
			
		||||
        'body': GObject.ParamSpec.string('body', 'body', 'body',
 | 
			
		||||
                                         GObject.ParamFlags.READWRITE |
 | 
			
		||||
                                         GObject.ParamFlags.CONSTRUCT,
 | 
			
		||||
                                         null),
 | 
			
		||||
        '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 MessageDialogContent extends St.BoxLayout {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        this._icon = new St.Icon({ y_align: Clutter.ActorAlign.START });
 | 
			
		||||
        this._title = new St.Label({ style_class: 'headline' });
 | 
			
		||||
        this._subtitle = new St.Label();
 | 
			
		||||
        this._body = new St.Label();
 | 
			
		||||
        this._title = new St.Label({ style_class: 'message-dialog-title' });
 | 
			
		||||
        this._description = new St.Label({ style_class: 'message-dialog-description' });
 | 
			
		||||
 | 
			
		||||
        ['icon', 'title', 'subtitle', 'body'].forEach(prop => {
 | 
			
		||||
            this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
 | 
			
		||||
        });
 | 
			
		||||
        this._description.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._description.clutter_text.line_wrap = true;
 | 
			
		||||
 | 
			
		||||
        let textProps = { ellipsize: Pango.EllipsizeMode.NONE,
 | 
			
		||||
                          line_wrap: true };
 | 
			
		||||
        this._subtitle.clutter_text.set(textProps);
 | 
			
		||||
        this._body.clutter_text.set(textProps);
 | 
			
		||||
 | 
			
		||||
        let defaultParams = { style_class: 'message-dialog-main-layout' };
 | 
			
		||||
        let defaultParams = {
 | 
			
		||||
            style_class: 'message-dialog-content',
 | 
			
		||||
            x_expand: true,
 | 
			
		||||
            vertical: true,
 | 
			
		||||
        };
 | 
			
		||||
        super._init(Object.assign(defaultParams, params));
 | 
			
		||||
 | 
			
		||||
        this.messageBox = new St.BoxLayout({ style_class: 'message-dialog-content',
 | 
			
		||||
                                             x_expand: true,
 | 
			
		||||
                                             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;
 | 
			
		||||
        this.add_child(this._title);
 | 
			
		||||
        this.add_child(this._description);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get title() {
 | 
			
		||||
        return this._title.text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get subtitle() {
 | 
			
		||||
        return this._subtitle.text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get body() {
 | 
			
		||||
        return this._body.text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set icon(icon) {
 | 
			
		||||
        this._icon.set({
 | 
			
		||||
            gicon: icon,
 | 
			
		||||
            visible: icon != null,
 | 
			
		||||
        });
 | 
			
		||||
        this.notify('icon');
 | 
			
		||||
    get description() {
 | 
			
		||||
        return this._description.text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set title(title) {
 | 
			
		||||
        this._setLabel(this._title, 'title', title);
 | 
			
		||||
        _setLabel(this._title, title);
 | 
			
		||||
        this.notify('title');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set subtitle(subtitle) {
 | 
			
		||||
        this._setLabel(this._subtitle, 'subtitle', subtitle);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set body(body) {
 | 
			
		||||
        this._setLabel(this._body, 'body', body);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _setLabel(label, prop, value) {
 | 
			
		||||
        label.set({
 | 
			
		||||
            text: value || '',
 | 
			
		||||
            visible: value != null,
 | 
			
		||||
        });
 | 
			
		||||
        this.notify(prop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    insertBeforeBody(actor) {
 | 
			
		||||
        this.messageBox.insert_child_below(actor, this._body);
 | 
			
		||||
    set description(description) {
 | 
			
		||||
        _setLabel(this._description, description);
 | 
			
		||||
        this.notify('description');
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var ListSection = GObject.registerClass({
 | 
			
		||||
    Properties: {
 | 
			
		||||
        'title': GObject.ParamSpec.string(
 | 
			
		||||
            'title', 'title', 'title',
 | 
			
		||||
            GObject.ParamFlags.READWRITE |
 | 
			
		||||
            GObject.ParamFlags.CONSTRUCT,
 | 
			
		||||
            null),
 | 
			
		||||
    },
 | 
			
		||||
}, class ListSection extends St.BoxLayout {
 | 
			
		||||
    _init(params) {
 | 
			
		||||
        this._title = new St.Label({ style_class: 'dialog-list-title' });
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
 | 
			
		||||
const CheckBox = imports.ui.checkBox;
 | 
			
		||||
const Dialog = imports.ui.dialog;
 | 
			
		||||
const GnomeSession = imports.misc.gnomeSession;
 | 
			
		||||
const LoginManager = imports.misc.loginManager;
 | 
			
		||||
const ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
@@ -28,8 +29,7 @@ const UserWidget = imports.ui.userWidget;
 | 
			
		||||
 | 
			
		||||
const { loadInterfaceXML } = imports.misc.fileUtils;
 | 
			
		||||
 | 
			
		||||
const _ITEM_ICON_SIZE = 48;
 | 
			
		||||
const _DIALOG_ICON_SIZE = 48;
 | 
			
		||||
const _ITEM_ICON_SIZE = 64;
 | 
			
		||||
 | 
			
		||||
const EndSessionDialogIface = loadInterfaceXML('org.gnome.SessionManager.EndSessionDialog');
 | 
			
		||||
 | 
			
		||||
@@ -49,7 +49,6 @@ const logoutDialogContent = {
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedLogout',
 | 
			
		||||
                       label: C_("button", "Log Out") }],
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-logout-icon',
 | 
			
		||||
    showOtherSessions: false,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -68,7 +67,6 @@ const shutdownDialogContent = {
 | 
			
		||||
                     { signal: 'ConfirmedShutdown',
 | 
			
		||||
                       label: C_("button", "Power Off") }],
 | 
			
		||||
    iconName: 'system-shutdown-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -83,7 +81,6 @@ const restartDialogContent = {
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label: C_("button", "Restart") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -101,7 +98,6 @@ const restartUpdateDialogContent = {
 | 
			
		||||
    unusedFutureButtonForTranslation: C_("button", "Install & Power Off"),
 | 
			
		||||
    unusedFutureCheckBoxForTranslation: C_("checkbox", "Power off after updates are installed"),
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -119,7 +115,6 @@ const restartUpgradeDialogContent = {
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label: C_("button", "Restart & Install") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -192,16 +187,6 @@ function _roundSecondsToInterval(totalSeconds, secondsLeft, interval) {
 | 
			
		||||
    return time;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _setLabelText(label, text) {
 | 
			
		||||
    if (text) {
 | 
			
		||||
        label.set_text(text);
 | 
			
		||||
        label.show();
 | 
			
		||||
    } else {
 | 
			
		||||
        label.set_text('');
 | 
			
		||||
        label.hide();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _setCheckBoxLabel(checkBox, text) {
 | 
			
		||||
    let label = checkBox.getLabelActor();
 | 
			
		||||
 | 
			
		||||
@@ -260,75 +245,34 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        this.connect('opened',
 | 
			
		||||
                     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));
 | 
			
		||||
 | 
			
		||||
        let mainContentLayout = new St.BoxLayout({
 | 
			
		||||
            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._messageDialogContent = new Dialog.MessageDialogContent();
 | 
			
		||||
 | 
			
		||||
        this._checkBox = new CheckBox.CheckBox();
 | 
			
		||||
        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',
 | 
			
		||||
                                              text: _("Running on battery power: please plug in before installing updates.") });
 | 
			
		||||
        this._batteryWarning = new St.Label({
 | 
			
		||||
            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.line_wrap = true;
 | 
			
		||||
        messageLayout.add(this._batteryWarning);
 | 
			
		||||
        this._messageDialogContent.add_child(this._batteryWarning);
 | 
			
		||||
 | 
			
		||||
        this._scrollView = new St.ScrollView({
 | 
			
		||||
            style_class: 'end-session-dialog-list',
 | 
			
		||||
            x_expand: true,
 | 
			
		||||
            y_expand: true,
 | 
			
		||||
        this.contentLayout.add_child(this._messageDialogContent);
 | 
			
		||||
 | 
			
		||||
        this._applicationSection = new Dialog.ListSection({
 | 
			
		||||
            title: _('Some applications are busy or have unsaved work'),
 | 
			
		||||
        });
 | 
			
		||||
        this._scrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC);
 | 
			
		||||
        this.contentLayout.add_child(this._scrollView);
 | 
			
		||||
        this._scrollView.hide();
 | 
			
		||||
        this.contentLayout.add_child(this._applicationSection);
 | 
			
		||||
 | 
			
		||||
        this._inhibitorSection = new St.BoxLayout({ vertical: true,
 | 
			
		||||
                                                    style_class: 'end-session-dialog-inhibitor-layout' });
 | 
			
		||||
        this._scrollView.add_actor(this._inhibitorSection);
 | 
			
		||||
 | 
			
		||||
        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._sessionSection = new Dialog.ListSection({
 | 
			
		||||
            title: _('Other users are logged in'),
 | 
			
		||||
        });
 | 
			
		||||
        this.contentLayout.add_child(this._sessionSection);
 | 
			
		||||
 | 
			
		||||
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this);
 | 
			
		||||
        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
 | 
			
		||||
@@ -379,11 +323,8 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
            subject = dialogContent.subjectWithUpdates;
 | 
			
		||||
 | 
			
		||||
        if (dialogContent.showBatteryWarning) {
 | 
			
		||||
            // Warn when running on battery power
 | 
			
		||||
            if (this._powerProxy.OnBattery && this._checkBox.checked)
 | 
			
		||||
                this._batteryWarning.opacity = 255;
 | 
			
		||||
            else
 | 
			
		||||
                this._batteryWarning.opacity = 0;
 | 
			
		||||
            this._batteryWarning.visible =
 | 
			
		||||
                this._powerProxy.OnBattery && this._checkBox.checked;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let description;
 | 
			
		||||
@@ -417,26 +358,14 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        if (!description)
 | 
			
		||||
            description = dialogContent.description(displayTime);
 | 
			
		||||
 | 
			
		||||
        _setLabelText(this._descriptionLabel, description);
 | 
			
		||||
        _setLabelText(this._subjectLabel, subject);
 | 
			
		||||
 | 
			
		||||
        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();
 | 
			
		||||
        }
 | 
			
		||||
        this._messageDialogContent.title = subject;
 | 
			
		||||
        this._messageDialogContent.description = description;
 | 
			
		||||
 | 
			
		||||
        let hasApplications = this._applications.length > 0;
 | 
			
		||||
        let hasSessions = this._sessions.length > 0;
 | 
			
		||||
        this._scrollView.visible = hasApplications || hasSessions;
 | 
			
		||||
        this._applicationHeader.visible = hasApplications;
 | 
			
		||||
        this._sessionHeader.visible = hasSessions;
 | 
			
		||||
 | 
			
		||||
        this._applicationSection.visible = hasApplications;
 | 
			
		||||
        this._sessionSection.visible = hasSessions;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateButtons() {
 | 
			
		||||
@@ -593,31 +522,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        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) {
 | 
			
		||||
        if (!this._applications.includes(inhibitor)) {
 | 
			
		||||
            // Stale inhibitor
 | 
			
		||||
@@ -627,8 +531,13 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        let app = findAppFromInhibitor(inhibitor);
 | 
			
		||||
 | 
			
		||||
        if (app) {
 | 
			
		||||
            let actor = this._constructListItemForApp(inhibitor, app);
 | 
			
		||||
            this._applicationList.add(actor);
 | 
			
		||||
            let [description] = inhibitor.GetReasonSync();
 | 
			
		||||
            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 {
 | 
			
		||||
            // inhibiting app is a service, not an application
 | 
			
		||||
            this._applications.splice(this._applications.indexOf(inhibitor), 1);
 | 
			
		||||
@@ -637,36 +546,6 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        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() {
 | 
			
		||||
        this._loginManager.listSessions(result => {
 | 
			
		||||
            let n = 0;
 | 
			
		||||
@@ -697,8 +576,27 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
                                remote: proxy.Remote };
 | 
			
		||||
                this._sessions.push(session);
 | 
			
		||||
 | 
			
		||||
                let actor = this._constructListItemForSession(session);
 | 
			
		||||
                this._sessionList.add(actor);
 | 
			
		||||
                let userAvatar = new UserWidget.Avatar(session.user, { iconSize: _ITEM_ICON_SIZE });
 | 
			
		||||
                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
 | 
			
		||||
                n++;
 | 
			
		||||
@@ -724,10 +622,10 @@ class EndSessionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._applications = [];
 | 
			
		||||
        this._applicationList.destroy_all_children();
 | 
			
		||||
        this._applicationSection.list.destroy_all_children();
 | 
			
		||||
 | 
			
		||||
        this._sessions = [];
 | 
			
		||||
        this._sessionList.destroy_all_children();
 | 
			
		||||
        this._sessionSection.list.destroy_all_children();
 | 
			
		||||
 | 
			
		||||
        if (!(this._type in DialogContent)) {
 | 
			
		||||
            invocation.return_dbus_error('org.gnome.Shell.ModalDialog.TypeError',
 | 
			
		||||
 
 | 
			
		||||
@@ -247,8 +247,8 @@ function init() {
 | 
			
		||||
        origSetEasingDelay.call(this, adjustAnimationTime(msecs));
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    Clutter.Actor.prototype.ease = function (props, easingParams) {
 | 
			
		||||
        _easeActor(this, props, easingParams);
 | 
			
		||||
    Clutter.Actor.prototype.ease = function (props) {
 | 
			
		||||
        _easeActor(this, props);
 | 
			
		||||
    };
 | 
			
		||||
    Clutter.Actor.prototype.ease_property = function (propName, target, params) {
 | 
			
		||||
        _easeActorProperty(this, propName, target, params);
 | 
			
		||||
 
 | 
			
		||||
@@ -198,9 +198,6 @@ class InstallExtensionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({
 | 
			
		||||
            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);
 | 
			
		||||
 
 | 
			
		||||
@@ -194,6 +194,15 @@ var GrabHelper = class GrabHelper {
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    grabAsync(params) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            params.onUngrab = resolve;
 | 
			
		||||
 | 
			
		||||
            if (!this.grab(params))
 | 
			
		||||
                reject(new Error('Grab failed'));
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _takeModalGrab() {
 | 
			
		||||
        let firstGrab = this._modalCount == 0;
 | 
			
		||||
        if (firstGrab) {
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,8 @@ var AnimationDirection = {
 | 
			
		||||
var APPICON_ANIMATION_OUT_SCALE = 3;
 | 
			
		||||
var APPICON_ANIMATION_OUT_TIME = 250;
 | 
			
		||||
 | 
			
		||||
const ICON_POSITION_DELAY = 25;
 | 
			
		||||
 | 
			
		||||
var BaseIcon = GObject.registerClass(
 | 
			
		||||
class BaseIcon extends St.Bin {
 | 
			
		||||
    _init(label, params) {
 | 
			
		||||
@@ -51,7 +53,7 @@ class BaseIcon extends St.Bin {
 | 
			
		||||
        this.set_child(this._box);
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
 | 
			
		||||
@@ -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({
 | 
			
		||||
    Signals: { 'animation-done': {},
 | 
			
		||||
               'child-focused': { param_types: [Clutter.Actor.$gtype] } },
 | 
			
		||||
@@ -366,6 +385,7 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
        let y = box.y1 + this.topPadding;
 | 
			
		||||
        let columnIndex = 0;
 | 
			
		||||
        let rowIndex = 0;
 | 
			
		||||
        let nChangedIcons = 0;
 | 
			
		||||
        for (let i = 0; i < children.length; i++) {
 | 
			
		||||
            let childBox = this._calculateChildBox(children[i], x, y, box);
 | 
			
		||||
 | 
			
		||||
@@ -375,7 +395,9 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
            } else {
 | 
			
		||||
                if (!animating)
 | 
			
		||||
                    children[i].opacity = 255;
 | 
			
		||||
                children[i].allocate(childBox, flags);
 | 
			
		||||
 | 
			
		||||
                if (animateIconPosition(children[i], childBox, flags, nChangedIcons))
 | 
			
		||||
                    nChangedIcons++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            columnIndex++;
 | 
			
		||||
@@ -557,14 +579,14 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
 | 
			
		||||
                actorClone.opacity = 0;
 | 
			
		||||
                actorClone.set_scale(scaleX, scaleY);
 | 
			
		||||
 | 
			
		||||
                actorClone.set_position(adjustedSourcePositionX, adjustedSourcePositionY);
 | 
			
		||||
                actorClone.set_translation(
 | 
			
		||||
                    adjustedSourcePositionX, adjustedSourcePositionY, 0);
 | 
			
		||||
 | 
			
		||||
                let delay = (1 - (actor._distance - minDist) / normalization) * ANIMATION_MAX_DELAY_FOR_ITEM;
 | 
			
		||||
                let [finalX, finalY]  = actor._transformedPosition;
 | 
			
		||||
                movementParams = {
 | 
			
		||||
                    x: finalX,
 | 
			
		||||
                    y: finalY,
 | 
			
		||||
                    translation_x: finalX,
 | 
			
		||||
                    translation_y: finalY,
 | 
			
		||||
                    scale_x: 1,
 | 
			
		||||
                    scale_y: 1,
 | 
			
		||||
                    duration: ANIMATION_TIME_IN,
 | 
			
		||||
@@ -585,12 +607,12 @@ var IconGrid = GObject.registerClass({
 | 
			
		||||
                let isLastItem = actor._distance == maxDist;
 | 
			
		||||
 | 
			
		||||
                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;
 | 
			
		||||
                movementParams = {
 | 
			
		||||
                    x: adjustedSourcePositionX,
 | 
			
		||||
                    y: adjustedSourcePositionY,
 | 
			
		||||
                    translation_x: adjustedSourcePositionX,
 | 
			
		||||
                    translation_y: adjustedSourcePositionY,
 | 
			
		||||
                    scale_x: scaleX,
 | 
			
		||||
                    scale_y: scaleY,
 | 
			
		||||
                    duration: ANIMATION_TIME_OUT,
 | 
			
		||||
@@ -875,9 +897,13 @@ var PaginatedIconGrid = GObject.registerClass({
 | 
			
		||||
        let y = box.y1 + this.topPadding;
 | 
			
		||||
        let columnIndex = 0;
 | 
			
		||||
 | 
			
		||||
        let nChangedIcons = 0;
 | 
			
		||||
        for (let i = 0; i < children.length; i++) {
 | 
			
		||||
            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();
 | 
			
		||||
 | 
			
		||||
            columnIndex++;
 | 
			
		||||
 
 | 
			
		||||
@@ -79,13 +79,12 @@ var InhibitShortcutsDialog = GObject.registerClass({
 | 
			
		||||
        let title = name
 | 
			
		||||
            ? _("%s wants to inhibit shortcuts").format(name)
 | 
			
		||||
            : _("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();
 | 
			
		||||
        if (restoreAccel) {
 | 
			
		||||
            contentParams.subtitle =
 | 
			
		||||
            contentParams.description =
 | 
			
		||||
                /* Translators: %s is a keyboard shortcut like "Super+x" */
 | 
			
		||||
                _("You can restore shortcuts by pressing %s.").format(restoreAccel);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ class KbdA11yDialog extends GObject.Object {
 | 
			
		||||
 | 
			
		||||
    _showKbdA11yDialog(deviceManager, newFlags, whatChanged) {
 | 
			
		||||
        let dialog = new ModalDialog.ModalDialog();
 | 
			
		||||
        let title, body;
 | 
			
		||||
        let title, description;
 | 
			
		||||
        let key, enabled;
 | 
			
		||||
 | 
			
		||||
        if (whatChanged & Clutter.KeyboardA11yFlags.SLOW_KEYS_ENABLED) {
 | 
			
		||||
@@ -31,8 +31,8 @@ class KbdA11yDialog extends GObject.Object {
 | 
			
		||||
            title = enabled
 | 
			
		||||
                ? _("Slow Keys Turned On")
 | 
			
		||||
                : _("Slow Keys Turned Off");
 | 
			
		||||
            body = _("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.");
 | 
			
		||||
            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.');
 | 
			
		||||
 | 
			
		||||
        } else  if (whatChanged & Clutter.KeyboardA11yFlags.STICKY_KEYS_ENABLED) {
 | 
			
		||||
            key = KEY_STICKY_KEYS_ENABLED;
 | 
			
		||||
@@ -40,7 +40,7 @@ class KbdA11yDialog extends GObject.Object {
 | 
			
		||||
            title = enabled
 | 
			
		||||
                ? _("Sticky Keys Turned On")
 | 
			
		||||
                : _("Sticky Keys Turned Off");
 | 
			
		||||
            body = enabled
 | 
			
		||||
            description = enabled
 | 
			
		||||
                ? _("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.")
 | 
			
		||||
                : _("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;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let icon = new Gio.ThemedIcon({ name: 'preferences-desktop-accessibility-symbolic' });
 | 
			
		||||
        let contentParams = { icon, title, body, styleClass: 'access-dialog' };
 | 
			
		||||
        let contentParams = { title, description, styleClass: 'access-dialog' };
 | 
			
		||||
        let content = new Dialog.MessageDialogContent(contentParams);
 | 
			
		||||
 | 
			
		||||
        dialog.contentLayout.add_actor(content);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ const { Clutter, GObject, Shell, St } = imports.gi;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
 | 
			
		||||
var DEFAULT_FADE_FACTOR = 0.4;
 | 
			
		||||
var VIGNETTE_BRIGHTNESS = 0.2;
 | 
			
		||||
var VIGNETTE_BRIGHTNESS = 0.5;
 | 
			
		||||
var VIGNETTE_SHARPNESS = 0.7;
 | 
			
		||||
 | 
			
		||||
const VIGNETTE_DECLARATIONS = '\
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
/* exported componentManager, notificationDaemon, windowAttentionHandler,
 | 
			
		||||
            ctrlAltTabManager, padOsdService, osdWindowManager,
 | 
			
		||||
            osdMonitorLabeler, shellMountOpDBusService, shellDBusService,
 | 
			
		||||
            shellAccessDialogDBusService, shellAudioSelectionDBusService,
 | 
			
		||||
            shellAudioSelectionDBusService,
 | 
			
		||||
            screenSaverDBus, screencastService, uiGroup, magnifier,
 | 
			
		||||
            xdndHandler, keyboard, kbdA11yDialog, introspectService,
 | 
			
		||||
            start, pushModal, popModal, activateWindow, createLookingGlass,
 | 
			
		||||
@@ -10,7 +10,6 @@
 | 
			
		||||
 | 
			
		||||
const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
 | 
			
		||||
 | 
			
		||||
const AccessDialog = imports.ui.accessDialog;
 | 
			
		||||
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
 | 
			
		||||
const Components = imports.ui.components;
 | 
			
		||||
const CtrlAltTab = imports.ui.ctrlAltTab;
 | 
			
		||||
@@ -68,7 +67,6 @@ var padOsdService = null;
 | 
			
		||||
var osdWindowManager = null;
 | 
			
		||||
var osdMonitorLabeler = null;
 | 
			
		||||
var sessionMode = null;
 | 
			
		||||
var shellAccessDialogDBusService = null;
 | 
			
		||||
var shellAudioSelectionDBusService = null;
 | 
			
		||||
var shellDBusService = null;
 | 
			
		||||
var shellMountOpDBusService = null;
 | 
			
		||||
@@ -137,7 +135,6 @@ function start() {
 | 
			
		||||
    St.Settings.get().connect('notify::gtk-theme', _loadDefaultStylesheet);
 | 
			
		||||
    _initializeUI();
 | 
			
		||||
 | 
			
		||||
    shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus();
 | 
			
		||||
    shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
 | 
			
		||||
    shellDBusService = new ShellDBus.GnomeShell();
 | 
			
		||||
    shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
 | 
			
		||||
 
 | 
			
		||||
@@ -436,11 +436,28 @@ class ControlsManager extends St.Widget {
 | 
			
		||||
        this._dashSpacer = new DashSpacer();
 | 
			
		||||
        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.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-empty', this._onPageEmpty.bind(this));
 | 
			
		||||
 | 
			
		||||
@@ -457,6 +474,24 @@ class ControlsManager extends St.Widget {
 | 
			
		||||
        layout.connect('allocation-changed', this._updateWorkspacesGeometry.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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -564,6 +564,14 @@ var PadDiagram = GObject.registerClass({
 | 
			
		||||
        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) {
 | 
			
		||||
        if (str != null) {
 | 
			
		||||
            label.set_text(str);
 | 
			
		||||
@@ -776,17 +784,29 @@ var PadOsd = GObject.registerClass({
 | 
			
		||||
        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 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updateActionLabels() {
 | 
			
		||||
        this._padDiagram.updateLabels(this._getActionText.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _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 &&
 | 
			
		||||
            event.get_source_device() == this.padDevice) {
 | 
			
		||||
            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 */
 | 
			
		||||
            if (this._editionMode && !isModeSwitch)
 | 
			
		||||
@@ -795,6 +815,11 @@ var PadOsd = GObject.registerClass({
 | 
			
		||||
        } else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE &&
 | 
			
		||||
                   event.get_source_device() == this.padDevice) {
 | 
			
		||||
            this._padDiagram.deactivateButton(event.get_button());
 | 
			
		||||
 | 
			
		||||
            if (isModeSwitch) {
 | 
			
		||||
                this._endActionEdition();
 | 
			
		||||
                this._updateActionLabels();
 | 
			
		||||
            }
 | 
			
		||||
            return Clutter.EVENT_STOP;
 | 
			
		||||
        } else if (event.type() == Clutter.EventType.KEY_PRESS &&
 | 
			
		||||
                   (!this._editionMode || event.get_key_symbol() === Clutter.KEY_Escape)) {
 | 
			
		||||
 
 | 
			
		||||
@@ -962,7 +962,7 @@ class Panel extends St.Widget {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _toggleMenu(indicator) {
 | 
			
		||||
        if (!indicator || !indicator.container.visible)
 | 
			
		||||
        if (!indicator || !indicator.mapped)
 | 
			
		||||
            return; // menu not supported by current session mode
 | 
			
		||||
 | 
			
		||||
        let menu = indicator.menu;
 | 
			
		||||
 
 | 
			
		||||
@@ -814,7 +814,12 @@ var PopupMenu = class extends PopupMenuBase {
 | 
			
		||||
 | 
			
		||||
        if (this.sourceActor) {
 | 
			
		||||
            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;
 | 
			
		||||
@@ -928,6 +933,9 @@ var PopupMenu = class extends PopupMenuBase {
 | 
			
		||||
        if (this._keyPressId)
 | 
			
		||||
            this.sourceActor.disconnect(this._keyPressId);
 | 
			
		||||
 | 
			
		||||
        if (this._notifyMappedId)
 | 
			
		||||
            this.sourceActor.disconnect(this._notifyMappedId);
 | 
			
		||||
 | 
			
		||||
        if (this._systemModalOpenedId)
 | 
			
		||||
            Main.layoutManager.disconnect(this._systemModalOpenedId);
 | 
			
		||||
        this._systemModalOpenedId = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -777,7 +777,7 @@ var ScreenShield = class {
 | 
			
		||||
        let newY = currentY - origY;
 | 
			
		||||
        newY = clamp(newY, -global.stage.height, 0);
 | 
			
		||||
 | 
			
		||||
        this._lockScreenGroup.y = newY;
 | 
			
		||||
        this._lockScreenGroup.translation_y = newY;
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -785,7 +785,7 @@ var ScreenShield = class {
 | 
			
		||||
    _onDragEnd(_action, _actor, _eventX, _eventY, _modifiers) {
 | 
			
		||||
        if (this._lockScreenState != MessageTray.State.HIDING)
 | 
			
		||||
            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
 | 
			
		||||
            let [velocity_, velocityX_, velocityY] = this._dragAction.get_velocity(0);
 | 
			
		||||
            this._liftShield(true, -velocityY);
 | 
			
		||||
@@ -793,14 +793,13 @@ var ScreenShield = class {
 | 
			
		||||
            // restore the lock screen to its original place
 | 
			
		||||
            // try to use the same speed as the normal animation
 | 
			
		||||
            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.ease({
 | 
			
		||||
                y: 0,
 | 
			
		||||
                translation_y: 0,
 | 
			
		||||
                duration,
 | 
			
		||||
                mode: Clutter.AnimationMode.EASE_IN_QUAD,
 | 
			
		||||
                onComplete: () => {
 | 
			
		||||
                    this._lockScreenGroup.fixed_position_set = false;
 | 
			
		||||
                    this._lockScreenState = MessageTray.State.SHOWN;
 | 
			
		||||
                },
 | 
			
		||||
            });
 | 
			
		||||
@@ -945,14 +944,14 @@ var ScreenShield = class {
 | 
			
		||||
            // use the same speed regardless of original position
 | 
			
		||||
            // if velocity is specified, it's in pixels per milliseconds
 | 
			
		||||
            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;
 | 
			
		||||
 | 
			
		||||
            velocity = Math.max(minVelocity, velocity);
 | 
			
		||||
            let duration = delta / velocity;
 | 
			
		||||
 | 
			
		||||
            this._lockScreenGroup.ease({
 | 
			
		||||
                y: -h,
 | 
			
		||||
                translation_y: -h,
 | 
			
		||||
                duration,
 | 
			
		||||
                mode: Clutter.AnimationMode.EASE_IN_QUAD,
 | 
			
		||||
                onComplete: () => this._hideLockScreenComplete(),
 | 
			
		||||
@@ -1014,10 +1013,10 @@ var ScreenShield = class {
 | 
			
		||||
        let fadeToBlack = params.fadeToBlack;
 | 
			
		||||
 | 
			
		||||
        if (params.animateLockScreen) {
 | 
			
		||||
            this._lockScreenGroup.y = -global.screen_height;
 | 
			
		||||
            this._lockScreenGroup.translation_y = -global.screen_height;
 | 
			
		||||
            this._lockScreenGroup.remove_all_transitions();
 | 
			
		||||
            this._lockScreenGroup.ease({
 | 
			
		||||
                y: 0,
 | 
			
		||||
                translation_y: 0,
 | 
			
		||||
                duration: MANUAL_FADE_TIME,
 | 
			
		||||
                mode: Clutter.AnimationMode.EASE_OUT_QUAD,
 | 
			
		||||
                onComplete: () => {
 | 
			
		||||
@@ -1025,7 +1024,7 @@ var ScreenShield = class {
 | 
			
		||||
                },
 | 
			
		||||
            });
 | 
			
		||||
        } else {
 | 
			
		||||
            this._lockScreenGroup.fixed_position_set = false;
 | 
			
		||||
            this._lockScreenGroup.translation_y = 0;
 | 
			
		||||
            this._lockScreenShown({ fadeToBlack, animateFade: false });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -1103,7 +1102,6 @@ var ScreenShield = class {
 | 
			
		||||
        this._cursorTracker.set_pointer_visible(false);
 | 
			
		||||
 | 
			
		||||
        this._lockScreenState = MessageTray.State.SHOWN;
 | 
			
		||||
        this._lockScreenGroup.fixed_position_set = false;
 | 
			
		||||
        this._lockScreenScrollCounter = 0;
 | 
			
		||||
 | 
			
		||||
        if (params.fadeToBlack && params.animateFade) {
 | 
			
		||||
 
 | 
			
		||||
@@ -65,8 +65,7 @@ var ScreenshotService = class {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *_resolveRelativeFilename(filename) {
 | 
			
		||||
        if (GLib.str_has_suffix(filename, '.png'))
 | 
			
		||||
            filename = filename.substr(0, -4);
 | 
			
		||||
        filename = filename.replace(/\.png$/, '');
 | 
			
		||||
 | 
			
		||||
        let path = [
 | 
			
		||||
            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();
 | 
			
		||||
        selectArea.show();
 | 
			
		||||
        selectArea.connect('finished', (o, areaRectangle) => {
 | 
			
		||||
            if (areaRectangle) {
 | 
			
		||||
                let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y,
 | 
			
		||||
                                                     areaRectangle.width, areaRectangle.height);
 | 
			
		||||
                let retval = GLib.Variant.new('(iiii)', retRectangle);
 | 
			
		||||
                invocation.return_value(retval);
 | 
			
		||||
            } else {
 | 
			
		||||
                invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
 | 
			
		||||
                                                "Operation was cancelled");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        try {
 | 
			
		||||
            let areaRectangle = await selectArea.selectAsync();
 | 
			
		||||
            let retRectangle = this._unscaleArea(
 | 
			
		||||
                areaRectangle.x, areaRectangle.y,
 | 
			
		||||
                areaRectangle.width, areaRectangle.height);
 | 
			
		||||
            invocation.return_value(GLib.Variant.new('(iiii)', retRectangle));
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            invocation.return_error_literal(
 | 
			
		||||
                Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
 | 
			
		||||
                'Operation was cancelled');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    FlashAreaAsync(params, invocation) {
 | 
			
		||||
@@ -257,38 +255,38 @@ var ScreenshotService = class {
 | 
			
		||||
        invocation.return_value(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    PickColorAsync(params, invocation) {
 | 
			
		||||
    async PickColorAsync(params, invocation) {
 | 
			
		||||
        let pickPixel = new PickPixel();
 | 
			
		||||
        pickPixel.show();
 | 
			
		||||
        pickPixel.connect('finished', (obj, coords) => {
 | 
			
		||||
            if (coords) {
 | 
			
		||||
                let screenshot = this._createScreenshot(invocation, false);
 | 
			
		||||
                if (!screenshot)
 | 
			
		||||
                    return;
 | 
			
		||||
                screenshot.pick_color(coords.x, coords.y, (_o, res) => {
 | 
			
		||||
                    let [success_, color] = screenshot.pick_color_finish(res);
 | 
			
		||||
                    let { red, green, blue } = color;
 | 
			
		||||
                    let retval = GLib.Variant.new('(a{sv})', [{
 | 
			
		||||
                        color: GLib.Variant.new('(ddd)', [
 | 
			
		||||
                            red / 255.0,
 | 
			
		||||
                            green / 255.0,
 | 
			
		||||
                            blue / 255.0,
 | 
			
		||||
                        ]),
 | 
			
		||||
                    }]);
 | 
			
		||||
                    this._removeShooterForSender(invocation.get_sender());
 | 
			
		||||
                    invocation.return_value(retval);
 | 
			
		||||
                });
 | 
			
		||||
            } else {
 | 
			
		||||
                invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
 | 
			
		||||
                                                "Operation was cancelled");
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        try {
 | 
			
		||||
            const coords = await pickPixel.pickAsync();
 | 
			
		||||
 | 
			
		||||
            let screenshot = this._createScreenshot(invocation, false);
 | 
			
		||||
            if (!screenshot)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            screenshot.pick_color(coords.x, coords.y, (_o, res) => {
 | 
			
		||||
                let [success_, color] = screenshot.pick_color_finish(res);
 | 
			
		||||
                let { red, green, blue } = color;
 | 
			
		||||
                let retval = GLib.Variant.new('(a{sv})', [{
 | 
			
		||||
                    color: GLib.Variant.new('(ddd)', [
 | 
			
		||||
                        red / 255.0,
 | 
			
		||||
                        green / 255.0,
 | 
			
		||||
                        blue / 255.0,
 | 
			
		||||
                    ]),
 | 
			
		||||
                }]);
 | 
			
		||||
                this._removeShooterForSender(invocation.get_sender());
 | 
			
		||||
                invocation.return_value(retval);
 | 
			
		||||
            });
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            invocation.return_error_literal(
 | 
			
		||||
                Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
 | 
			
		||||
                'Operation was cancelled');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var SelectArea = GObject.registerClass({
 | 
			
		||||
    Signals: { 'finished': { param_types: [Meta.Rectangle.$gtype] } },
 | 
			
		||||
}, class SelectArea extends St.Widget {
 | 
			
		||||
var SelectArea = GObject.registerClass(
 | 
			
		||||
class SelectArea extends St.Widget {
 | 
			
		||||
    _init() {
 | 
			
		||||
        this._startX = -1;
 | 
			
		||||
        this._startY = -1;
 | 
			
		||||
@@ -317,14 +315,21 @@ var SelectArea = GObject.registerClass({
 | 
			
		||||
        this.add_actor(this._rubberband);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_show() {
 | 
			
		||||
        if (!this._grabHelper.grab({ actor: this,
 | 
			
		||||
                                     onUngrab: this._onUngrab.bind(this) }))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
    async selectAsync() {
 | 
			
		||||
        global.display.set_cursor(Meta.Cursor.CROSSHAIR);
 | 
			
		||||
        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() {
 | 
			
		||||
@@ -371,21 +376,10 @@ var SelectArea = GObject.registerClass({
 | 
			
		||||
        });
 | 
			
		||||
        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({
 | 
			
		||||
    Signals: { 'finished': { param_types: [Graphene.Point.$gtype] } },
 | 
			
		||||
}, class PickPixel extends St.Widget {
 | 
			
		||||
var PickPixel = GObject.registerClass(
 | 
			
		||||
class PickPixel extends St.Widget {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ visible: false, reactive: true });
 | 
			
		||||
 | 
			
		||||
@@ -400,14 +394,21 @@ var PickPixel = GObject.registerClass({
 | 
			
		||||
        this.add_constraint(constraint);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    vfunc_show() {
 | 
			
		||||
        if (!this._grabHelper.grab({ actor: this,
 | 
			
		||||
                                     onUngrab: this._onUngrab.bind(this) }))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
    async pickAsync() {
 | 
			
		||||
        global.display.set_cursor(Meta.Cursor.CROSSHAIR);
 | 
			
		||||
        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) {
 | 
			
		||||
@@ -416,16 +417,6 @@ var PickPixel = GObject.registerClass({
 | 
			
		||||
        this._grabHelper.ungrab();
 | 
			
		||||
        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
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// -*- 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 Main = imports.ui.main;
 | 
			
		||||
@@ -27,7 +27,8 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
 | 
			
		||||
        this.addMenuItem(item);
 | 
			
		||||
        this._pasteItem = item;
 | 
			
		||||
 | 
			
		||||
        this._passwordItem = null;
 | 
			
		||||
        if (entry instanceof St.PasswordEntry)
 | 
			
		||||
            this._makePasswordItem();
 | 
			
		||||
 | 
			
		||||
        Main.uiGroup.add_actor(this.actor);
 | 
			
		||||
        this.actor.hide();
 | 
			
		||||
@@ -40,24 +41,6 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
 | 
			
		||||
        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) {
 | 
			
		||||
        this._updatePasteItem();
 | 
			
		||||
        this._updateCopyItem();
 | 
			
		||||
@@ -86,8 +69,7 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _updatePasswordItem() {
 | 
			
		||||
        let textHidden = this._entry.clutter_text.password_char;
 | 
			
		||||
        if (textHidden)
 | 
			
		||||
        if (!this._entry.password_visible)
 | 
			
		||||
            this._passwordItem.label.set_text(_("Show Text"));
 | 
			
		||||
        else
 | 
			
		||||
            this._passwordItem.label.set_text(_("Hide Text"));
 | 
			
		||||
@@ -110,8 +92,7 @@ var EntryMenu = class extends PopupMenu.PopupMenu {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _onPasswordActivated() {
 | 
			
		||||
        let visible = !!this._entry.clutter_text.password_char;
 | 
			
		||||
        this._entry.clutter_text.set_password_char(visible ? '' : '\u25cf');
 | 
			
		||||
        this._entry.password_visible  = !this._entry.password_visible;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -135,7 +116,8 @@ function _onButtonPressEvent(actor, event, 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)
 | 
			
		||||
        entry.menu.setSourceAlignment(textX / entry.width);
 | 
			
		||||
    entry.menu.open(BoxPointer.PopupAnimation.FULL);
 | 
			
		||||
@@ -145,10 +127,9 @@ function addContextMenu(entry, params) {
 | 
			
		||||
    if (entry.menu)
 | 
			
		||||
        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.isPassword = params.isPassword;
 | 
			
		||||
    entry._menuManager = new PopupMenu.PopupMenuManager(entry,
 | 
			
		||||
                                                        { actionMode: params.actionMode });
 | 
			
		||||
    entry._menuManager.addMenu(entry.menu);
 | 
			
		||||
@@ -171,3 +152,40 @@ function addContextMenu(entry, params) {
 | 
			
		||||
        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');
 | 
			
		||||
 | 
			
		||||
    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.mountOp.connect('show-unmount-progress',
 | 
			
		||||
                             this._onShowUnmountProgress.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._gicon = source.get_icon();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _closeExistingDialog() {
 | 
			
		||||
@@ -113,7 +111,7 @@ var ShellMountOperation = class {
 | 
			
		||||
 | 
			
		||||
    _onAskQuestion(op, message, choices) {
 | 
			
		||||
        this._closeExistingDialog();
 | 
			
		||||
        this._dialog = new ShellMountQuestionDialog(this._gicon);
 | 
			
		||||
        this._dialog = new ShellMountQuestionDialog();
 | 
			
		||||
 | 
			
		||||
        this._dialogId = this._dialog.connect('response',
 | 
			
		||||
            (object, choice) => {
 | 
			
		||||
@@ -132,7 +130,7 @@ var ShellMountOperation = class {
 | 
			
		||||
            this._dialog = this._existingDialog;
 | 
			
		||||
            this._dialog.reaskPassword();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._dialog = new ShellMountPasswordDialog(message, this._gicon, flags);
 | 
			
		||||
            this._dialog = new ShellMountPasswordDialog(message, flags);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._dialogId = this._dialog.connect('response',
 | 
			
		||||
@@ -178,7 +176,7 @@ var ShellMountOperation = class {
 | 
			
		||||
        let message = op.get_show_processes_message();
 | 
			
		||||
 | 
			
		||||
        if (!this._processesDialog) {
 | 
			
		||||
            this._processesDialog = new ShellProcessesDialog(this._gicon);
 | 
			
		||||
            this._processesDialog = new ShellProcessesDialog();
 | 
			
		||||
            this._dialog = this._processesDialog;
 | 
			
		||||
 | 
			
		||||
            this._dialogId = this._processesDialog.connect('response',
 | 
			
		||||
@@ -259,10 +257,10 @@ class ShellUnmountNotifier extends MessageTray.Source {
 | 
			
		||||
var ShellMountQuestionDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
 | 
			
		||||
}, class ShellMountQuestionDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(icon) {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'mount-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent({ icon });
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent();
 | 
			
		||||
        this.contentLayout.add_child(this._content);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -280,17 +278,16 @@ var ShellMountPasswordDialog = GObject.registerClass({
 | 
			
		||||
                                           GObject.TYPE_BOOLEAN,
 | 
			
		||||
                                           GObject.TYPE_UINT] } },
 | 
			
		||||
}, class ShellMountPasswordDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(message, icon, flags) {
 | 
			
		||||
    _init(message, flags) {
 | 
			
		||||
        let strings = message.split('\n');
 | 
			
		||||
        let title = strings.shift() || null;
 | 
			
		||||
        let body = strings.shift() || null;
 | 
			
		||||
        let description = strings.shift() || null;
 | 
			
		||||
        super._init({ styleClass: 'prompt-dialog' });
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
        content._body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
 | 
			
		||||
        let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
 | 
			
		||||
        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"));
 | 
			
		||||
            content.messageBox.add(this._hiddenVolume);
 | 
			
		||||
            content.add_child(this._hiddenVolume);
 | 
			
		||||
 | 
			
		||||
            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.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
 | 
			
		||||
            content.messageBox.add(this._keyfilesCheckbox);
 | 
			
		||||
            content.add_child(this._keyfilesCheckbox);
 | 
			
		||||
 | 
			
		||||
            this._keyfilesLabel.clutter_text.set_markup(
 | 
			
		||||
                /* 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.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',
 | 
			
		||||
                                            text: _("PIM Number"),
 | 
			
		||||
                                            y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
            this._pimEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                            can_focus: true,
 | 
			
		||||
                                            x_expand: true });
 | 
			
		||||
            this._pimEntry = new St.PasswordEntry({
 | 
			
		||||
                style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                can_focus: true,
 | 
			
		||||
                x_expand: true,
 | 
			
		||||
            });
 | 
			
		||||
            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, { isPassword: true });
 | 
			
		||||
            ShellEntry.addContextMenu(this._pimEntry);
 | 
			
		||||
 | 
			
		||||
            if (rtl) {
 | 
			
		||||
                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',
 | 
			
		||||
                                             text: _("Password"),
 | 
			
		||||
                                             y_align: Clutter.ActorAlign.CENTER });
 | 
			
		||||
        this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
                                             can_focus: true,
 | 
			
		||||
                                             x_expand: true });
 | 
			
		||||
        this._passwordEntry = new St.PasswordEntry({
 | 
			
		||||
            style_class: 'prompt-dialog-password-entry',
 | 
			
		||||
            can_focus: true,
 | 
			
		||||
            x_expand: true,
 | 
			
		||||
        });
 | 
			
		||||
        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, { isPassword: true });
 | 
			
		||||
        ShellEntry.addContextMenu(this._passwordEntry);
 | 
			
		||||
        this.setInitialKeyFocus(this._passwordEntry);
 | 
			
		||||
        this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
 | 
			
		||||
            animate: true,
 | 
			
		||||
        });
 | 
			
		||||
        this._passwordEntry.secondary_icon = this._workSpinner;
 | 
			
		||||
        this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
 | 
			
		||||
 | 
			
		||||
        if (rtl) {
 | 
			
		||||
            layout.attach(this._passwordEntry, 0, 1, 1, 1);
 | 
			
		||||
            layout.attach(this._passwordLabel, 1, 1, 1, 1);
 | 
			
		||||
            layout.attach(this._capsLockWarningLabel, 0, 2, 1, 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            layout.attach(this._passwordLabel, 0, 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',
 | 
			
		||||
                                                 text: _("Sorry, that didn’t work. Please try again.") });
 | 
			
		||||
        this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        this._errorMessageLabel.clutter_text.line_wrap = true;
 | 
			
		||||
        this._errorMessageLabel.hide();
 | 
			
		||||
        content.messageBox.add(this._errorMessageLabel);
 | 
			
		||||
        content.add_child(this._errorMessageLabel);
 | 
			
		||||
 | 
			
		||||
        if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
 | 
			
		||||
            this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
 | 
			
		||||
            this._rememberChoice.checked =
 | 
			
		||||
                global.settings.get_boolean(REMEMBER_MOUNT_PASSWORD_KEY);
 | 
			
		||||
            content.messageBox.add(this._rememberChoice);
 | 
			
		||||
            content.add_child(this._rememberChoice);
 | 
			
		||||
        } else {
 | 
			
		||||
            this._rememberChoice = null;
 | 
			
		||||
        }
 | 
			
		||||
@@ -493,10 +495,10 @@ var ShellMountPasswordDialog = GObject.registerClass({
 | 
			
		||||
var ShellProcessesDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_INT] } },
 | 
			
		||||
}, class ShellProcessesDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(icon) {
 | 
			
		||||
    _init() {
 | 
			
		||||
        super._init({ styleClass: 'mount-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent({ icon });
 | 
			
		||||
        this._content = new Dialog.MessageDialogContent();
 | 
			
		||||
        this.contentLayout.add_child(this._content);
 | 
			
		||||
 | 
			
		||||
        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:
 | 
			
		||||
     * @param {Array} params
 | 
			
		||||
@@ -644,7 +640,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
     * attempt went wrong.
 | 
			
		||||
     */
 | 
			
		||||
    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)) {
 | 
			
		||||
            this._dialog.reaskPassword();
 | 
			
		||||
@@ -653,7 +649,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
 | 
			
		||||
        this._closeDialog();
 | 
			
		||||
 | 
			
		||||
        this._dialog = new ShellMountPasswordDialog(message, this._createGIcon(iconName), flags);
 | 
			
		||||
        this._dialog = new ShellMountPasswordDialog(message, flags);
 | 
			
		||||
        this._dialog.connect('response',
 | 
			
		||||
            (object, choice, password, remember, hiddenVolume, systemVolume, pim) => {
 | 
			
		||||
                let details = {};
 | 
			
		||||
@@ -694,7 +690,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
     * update the dialog with the new question.
 | 
			
		||||
     */
 | 
			
		||||
    AskQuestionAsync(params, invocation) {
 | 
			
		||||
        let [id, message, iconName, choices] = params;
 | 
			
		||||
        let [id, message, iconName_, choices] = params;
 | 
			
		||||
 | 
			
		||||
        if (this._setCurrentRequest(invocation, id, ShellMountOperationType.ASK_QUESTION)) {
 | 
			
		||||
            this._dialog.update(message, choices);
 | 
			
		||||
@@ -703,7 +699,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
 | 
			
		||||
        this._closeDialog();
 | 
			
		||||
 | 
			
		||||
        this._dialog = new ShellMountQuestionDialog(this._createGIcon(iconName), message);
 | 
			
		||||
        this._dialog = new ShellMountQuestionDialog(message);
 | 
			
		||||
        this._dialog.connect('response', (object, choice) => {
 | 
			
		||||
            this._clearCurrentRequest(Gio.MountOperationResult.HANDLED,
 | 
			
		||||
                                      { choice: GLib.Variant.new('i', choice) });
 | 
			
		||||
@@ -732,7 +728,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
     * of processes.
 | 
			
		||||
     */
 | 
			
		||||
    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)) {
 | 
			
		||||
            this._dialog.update(message, applicationPids, choices);
 | 
			
		||||
@@ -741,7 +737,7 @@ var GnomeShellMountOpHandler = class {
 | 
			
		||||
 | 
			
		||||
        this._closeDialog();
 | 
			
		||||
 | 
			
		||||
        this._dialog = new ShellProcessesDialog(this._createGIcon(iconName));
 | 
			
		||||
        this._dialog = new ShellProcessesDialog();
 | 
			
		||||
        this._dialog.connect('response', (object, choice) => {
 | 
			
		||||
            let response;
 | 
			
		||||
            let details = {};
 | 
			
		||||
 
 | 
			
		||||
@@ -117,11 +117,18 @@ class InputSourceSwitcher extends SwitcherPopup.SwitcherList {
 | 
			
		||||
        let box = new St.BoxLayout({ vertical: true });
 | 
			
		||||
 | 
			
		||||
        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);
 | 
			
		||||
        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);
 | 
			
		||||
 | 
			
		||||
        this.addItem(box, text);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
/* 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 Main = imports.ui.main;
 | 
			
		||||
@@ -347,20 +347,22 @@ var AppAuthorizer = class {
 | 
			
		||||
var GeolocationDialog = GObject.registerClass({
 | 
			
		||||
    Signals: { 'response': { param_types: [GObject.TYPE_UINT] } },
 | 
			
		||||
}, class GeolocationDialog extends ModalDialog.ModalDialog {
 | 
			
		||||
    _init(name, subtitle, reqAccuracyLevel) {
 | 
			
		||||
    _init(name, description, reqAccuracyLevel) {
 | 
			
		||||
        super._init({ styleClass: 'geolocation-dialog' });
 | 
			
		||||
        this.reqAccuracyLevel = reqAccuracyLevel;
 | 
			
		||||
 | 
			
		||||
        let icon = new Gio.ThemedIcon({ name: 'find-location-symbolic' });
 | 
			
		||||
 | 
			
		||||
        /* Translators: %s is an application 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(contentParams);
 | 
			
		||||
        let content = new Dialog.MessageDialogContent({ title, description });
 | 
			
		||||
        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"),
 | 
			
		||||
                                      action: this._onDenyClicked.bind(this),
 | 
			
		||||
                                      key: Clutter.KEY_Escape });
 | 
			
		||||
 
 | 
			
		||||
@@ -2069,6 +2069,6 @@ class Indicator extends PanelMenu.SystemIndicator {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||