Compare commits
1 Commits
3.27.1
...
wip/halfli
Author | SHA1 | Date | |
---|---|---|---|
832240a80b |
28
.gitignore
vendored
28
.gitignore
vendored
@ -6,10 +6,21 @@
|
|||||||
ABOUT-NLS
|
ABOUT-NLS
|
||||||
ChangeLog
|
ChangeLog
|
||||||
INSTALL
|
INSTALL
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
aclocal.m4
|
aclocal.m4
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
data/org.gnome.Shell.desktop
|
config.h
|
||||||
data/org.gnome.Shell.desktop.in
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.status
|
||||||
|
config
|
||||||
|
configure
|
||||||
|
data/50-gnome-shell-*.xml
|
||||||
|
data/gnome-shell.desktop
|
||||||
|
data/gnome-shell.desktop.in
|
||||||
|
data/gnome-shell-wayland.desktop
|
||||||
|
data/gnome-shell-wayland.desktop.in
|
||||||
data/gnome-shell-extension-prefs.desktop
|
data/gnome-shell-extension-prefs.desktop
|
||||||
data/gnome-shell-extension-prefs.desktop.in
|
data/gnome-shell-extension-prefs.desktop.in
|
||||||
data/gnome-shell-theme.gresource
|
data/gnome-shell-theme.gresource
|
||||||
@ -17,6 +28,8 @@ data/gschemas.compiled
|
|||||||
data/perf-background.xml
|
data/perf-background.xml
|
||||||
data/org.gnome.shell.gschema.xml
|
data/org.gnome.shell.gschema.xml
|
||||||
data/org.gnome.shell.gschema.valid
|
data/org.gnome.shell.gschema.valid
|
||||||
|
data/org.gnome.shell.evolution.calendar.gschema.xml
|
||||||
|
data/org.gnome.shell.evolution.calendar.gschema.valid
|
||||||
data/org.gnome.Shell.PortalHelper.desktop
|
data/org.gnome.Shell.PortalHelper.desktop
|
||||||
data/org.gnome.Shell.PortalHelper.service
|
data/org.gnome.Shell.PortalHelper.service
|
||||||
data/theme/.sass-cache
|
data/theme/.sass-cache
|
||||||
@ -33,9 +46,15 @@ docs/reference/*/*.types
|
|||||||
docs/reference/*/html/
|
docs/reference/*/html/
|
||||||
docs/reference/*/xml/
|
docs/reference/*/xml/
|
||||||
docs/reference/shell/doc-gen-*
|
docs/reference/shell/doc-gen-*
|
||||||
|
gtk-doc.make
|
||||||
js/misc/config.js
|
js/misc/config.js
|
||||||
js/js-resources.c
|
js/js-resources.c
|
||||||
js/js-resources.h
|
js/js-resources.h
|
||||||
|
intltool-extract.in
|
||||||
|
intltool-merge.in
|
||||||
|
intltool-update.in
|
||||||
|
libtool
|
||||||
|
m4/
|
||||||
man/gnome-shell.1
|
man/gnome-shell.1
|
||||||
omf.make
|
omf.make
|
||||||
po/*.gmo
|
po/*.gmo
|
||||||
@ -44,6 +63,7 @@ po/*.header
|
|||||||
po/*.sed
|
po/*.sed
|
||||||
po/*.sin
|
po/*.sin
|
||||||
po/.intltool-merge-cache
|
po/.intltool-merge-cache
|
||||||
|
po/Makefile.in.in
|
||||||
po/Makevars.template
|
po/Makevars.template
|
||||||
po/POTFILES
|
po/POTFILES
|
||||||
po/Rules-quot
|
po/Rules-quot
|
||||||
@ -53,7 +73,10 @@ src/*.gir
|
|||||||
src/*.typelib
|
src/*.typelib
|
||||||
src/*-enum-types.[ch]
|
src/*-enum-types.[ch]
|
||||||
src/*-marshal.[ch]
|
src/*-marshal.[ch]
|
||||||
|
src/Makefile
|
||||||
|
src/Makefile.in
|
||||||
src/calendar-server/evolution-calendar.desktop
|
src/calendar-server/evolution-calendar.desktop
|
||||||
|
src/calendar-server/evolution-calendar.desktop.in
|
||||||
src/calendar-server/org.gnome.Shell.CalendarServer.service
|
src/calendar-server/org.gnome.Shell.CalendarServer.service
|
||||||
src/gnome-shell
|
src/gnome-shell
|
||||||
src/gnome-shell-calendar-server
|
src/gnome-shell-calendar-server
|
||||||
@ -76,6 +99,7 @@ src/st-scroll-view-fade-generated.c
|
|||||||
src/stamp-st-scroll-view-fade-generated.c
|
src/stamp-st-scroll-view-fade-generated.c
|
||||||
stamp-h1
|
stamp-h1
|
||||||
tests/run-test.sh
|
tests/run-test.sh
|
||||||
|
xmldocs.make
|
||||||
*~
|
*~
|
||||||
*.patch
|
*.patch
|
||||||
*.sw?
|
*.sw?
|
||||||
|
8
.gitmodules
vendored
8
.gitmodules
vendored
@ -1,6 +1,6 @@
|
|||||||
|
[submodule "src/gvc"]
|
||||||
|
path = src/gvc
|
||||||
|
url = git://git.gnome.org/libgnome-volume-control
|
||||||
[submodule "data/theme/gnome-shell-sass"]
|
[submodule "data/theme/gnome-shell-sass"]
|
||||||
path = data/theme/gnome-shell-sass
|
path = data/theme/gnome-shell-sass
|
||||||
url = https://git.gnome.org/browse/gnome-shell-sass
|
url = git://git.gnome.org/gnome-shell-sass
|
||||||
[submodule "subprojects/gvc"]
|
|
||||||
path = subprojects/gvc
|
|
||||||
url = https://git.gnome.org/browse/libgnome-volume-control
|
|
||||||
|
12
HACKING
12
HACKING
@ -132,7 +132,7 @@ There are many approaches to classes in JavaScript. We use our own class framewo
|
|||||||
(sigh), which is built in gjs. The advantage is that it supports inheriting from
|
(sigh), which is built in gjs. The advantage is that it supports inheriting from
|
||||||
GObjects, although this feature isn't used very often in the Shell itself.
|
GObjects, although this feature isn't used very often in the Shell itself.
|
||||||
|
|
||||||
var IconLabelMenuItem = new Lang.Class({
|
const IconLabelMenuItem = new Lang.Class({
|
||||||
Name: 'IconLabelMenuItem',
|
Name: 'IconLabelMenuItem',
|
||||||
Extends: PopupMenu.PopupMenuBaseItem,
|
Extends: PopupMenu.PopupMenuBaseItem,
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ GObject Introspection is a powerful feature that allows us to have native
|
|||||||
bindings for almost any library built around GObject. If a library requires
|
bindings for almost any library built around GObject. If a library requires
|
||||||
you to inherit from a type to use it, you can do so:
|
you to inherit from a type to use it, you can do so:
|
||||||
|
|
||||||
var MyClutterActor = new Lang.Class({
|
const MyClutterActor = new Lang.Class({
|
||||||
Name: 'MyClutterActor',
|
Name: 'MyClutterActor',
|
||||||
Extends: Clutter.Actor,
|
Extends: Clutter.Actor,
|
||||||
|
|
||||||
@ -215,7 +215,7 @@ that has a property called `actor`. We call this wrapper class the "delegate".
|
|||||||
We sometimes use expando properties to set a property called `_delegate` on
|
We sometimes use expando properties to set a property called `_delegate` on
|
||||||
the actor itself:
|
the actor itself:
|
||||||
|
|
||||||
var MyClass = new Lang.Class({
|
const MyClass = new Lang.Class({
|
||||||
Name: 'MyClass',
|
Name: 'MyClass',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -264,7 +264,7 @@ prototype:
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const FnorbLib = imports.fborbLib;
|
const FnorbLib = imports.fborbLib;
|
||||||
|
|
||||||
var MyClass = new Lang.Class({
|
const MyClass = new Lang.Class({
|
||||||
_init: function() {
|
_init: function() {
|
||||||
let fnorb = new FnorbLib.Fnorb();
|
let fnorb = new FnorbLib.Fnorb();
|
||||||
fnorb.connect('frobate', Lang.bind(this, this._onFnorbFrobate));
|
fnorb.connect('frobate', Lang.bind(this, this._onFnorbFrobate));
|
||||||
@ -304,9 +304,9 @@ designed around setting properties, like Tweener. If you want to animate an
|
|||||||
arbitrary property, create a getter and setter, and use Tweener to animate the
|
arbitrary property, create a getter and setter, and use Tweener to animate the
|
||||||
property.
|
property.
|
||||||
|
|
||||||
var ANIMATION_TIME = 2000;
|
const ANIMATION_TIME = 2000;
|
||||||
|
|
||||||
var MyClass = new Lang.Class({
|
const MyClass = new Lang.Class({
|
||||||
Name: 'MyClass',
|
Name: 'MyClass',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
33
Makefile.am
Normal file
33
Makefile.am
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# Point to our macro directory and pick up user flags from the environment
|
||||||
|
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||||
|
|
||||||
|
SUBDIRS = data js src tests po docs
|
||||||
|
|
||||||
|
if BUILD_BROWSER_PLUGIN
|
||||||
|
SUBDIRS += browser-plugin
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ENABLE_MAN
|
||||||
|
SUBDIRS += man
|
||||||
|
endif
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
.project \
|
||||||
|
.settings \
|
||||||
|
autogen.sh \
|
||||||
|
tools/check-for-missing.py
|
||||||
|
|
||||||
|
# These are files checked into Git that we don't want to distribute
|
||||||
|
DIST_EXCLUDE = \
|
||||||
|
.gitignore \
|
||||||
|
.gitmodules \
|
||||||
|
gnome-shell.doap \
|
||||||
|
HACKING \
|
||||||
|
MAINTAINERS \
|
||||||
|
tools/build/*
|
||||||
|
|
||||||
|
distcheck-hook:
|
||||||
|
@echo "Checking disted files against files in git"
|
||||||
|
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
|
||||||
|
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man
|
644
NEWS
644
NEWS
@ -1,647 +1,3 @@
|
|||||||
3.27.1
|
|
||||||
======
|
|
||||||
* Fix using icon-name strings with PopupImageMenuItems [Florian; #789018]
|
|
||||||
* Misc. bug fixes [Jonas, Florian; #788607, #788943]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Xavi Ivars [ca@valencia], Matej Urbančič [sl], Fabio Tomat [fur]
|
|
||||||
|
|
||||||
3.26.1
|
|
||||||
======
|
|
||||||
* Don't detach launched apps to not break pkexec and friends [Florian; #763531]
|
|
||||||
* Allow search providers to not autostart [Bastien, Florian; #785380, #787986]
|
|
||||||
* Fix crash when tray icons are hidden/shown in quick succession [Ray; #787361]
|
|
||||||
* Make window group switcher more consistent [Didier; #786009]
|
|
||||||
* Improve legibility of the top bar when translucent [Jakub; #787940]
|
|
||||||
* Don't crash when running outside a logind session [Florian; #788046]
|
|
||||||
* Allow to run headless [Mario, Jonas; #730551]
|
|
||||||
* Update calendar on timezone changes [Martin; #678507]
|
|
||||||
* Improve keyboard navigation of window previews [Florian; #786546]
|
|
||||||
* Run unit tests on `meson test` [Florian; #786497]
|
|
||||||
* Misc. bug fixes [Florian, Marc-Antoine, Mario, Jakub, Krzesimir; #787423,
|
|
||||||
#766368, #787580, #787907, #787901, #788039, #788003, #786343, #787902,
|
|
||||||
#788265, #788339, #787905, #788282, #787676]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Martin Andersson, Florian Müllner, Bastien Nocera, Krzesimir Nowak,
|
|
||||||
Marc-Antoine Perennou, Didier Roche, Mario Sanchez Prada, Jakub Steiner,
|
|
||||||
Ray Strode
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Efstathios Iosifidis [el], Khaled Hosny [ar], Stas Solovey [ru],
|
|
||||||
Arash Mousavi [fa], Sveinn í Felli [is], Athul R T [ml],
|
|
||||||
Cheng-Chia Tseng [zh_TW], Anders Jonsson [sv]
|
|
||||||
|
|
||||||
3.26.0
|
|
||||||
======
|
|
||||||
* Misc. bug fixes [Ray, Michael, Jonas; #786332] #786783, #786886, #786868]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Michael Catanzaro, Sebastian Keller, Ray Strode
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Daniel Mustieles [es], Fran Dieguez [gl], Baurzhan Muftakhidinov [kk],
|
|
||||||
Marek Cernocky [cs], Andika Triwidada [id], Aurimas Černius [lt],
|
|
||||||
Piotr Drąg [pl], Trần Ngọc Quân [vi], Jordi Mas [ca], Fabio Tomat [fur],
|
|
||||||
gogo [hr], Dušan Kazik [sk], Piotr Drąg [ne], Emin Tufan Çetin [tr],
|
|
||||||
Ask Hjorth Larsen [da], Cheng-Chia Tseng [zh_TW], Rūdolfs Mazurs [lv],
|
|
||||||
Balázs Meskó [hu], Matej Urbančič [sl], Jiri Grönroos [fi],
|
|
||||||
Милош Поповић [sr], Милош Поповић [sr@latin], Rafael Fontenelle [pt_BR],
|
|
||||||
Wolfgang Stöggl [de], Milo Casagrande [it], hanniedu [nl],
|
|
||||||
Yuras Shumovich [be], Changwoo Ryu [ko], Alain Lojewski [fr],
|
|
||||||
Alexander Shopov [bg], Daniel Korostil [uk], Kris Thomsen [da],
|
|
||||||
A S Alam [pa], Sebastian Rasmussen [sv], Inaki Larranaga Murgoitio [eu],
|
|
||||||
Jiro Matsuzawa [ja]
|
|
||||||
|
|
||||||
3.25.91
|
|
||||||
=======
|
|
||||||
* Open context menu of highlighted search result on Shift+F10 [Florian; #675315]
|
|
||||||
* Fix mid-sentence capitalization in weather forecasts [Florian; #779873]
|
|
||||||
* Add switcher popup to cycle through monitor configurations [Rui; #783550]
|
|
||||||
* Offer system actions in search [Rares; #691900]
|
|
||||||
* Misc. bug fixes [Mario, Florian, Rui; #777519, #786120, #786145, #786419,
|
|
||||||
#786526, #786520, #786520, #786146]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Emmanuele Bassi, Marek Cernocky, Piotr Drąg, Carlos Garnacho, Rui Matos,
|
|
||||||
Florian Müllner, Mario Sanchez Prada, Rares Visalom
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Marek Cernocky [cs], Piotr Drąg [pl], Muhammet Kara [tr],
|
|
||||||
Мирослав Николић [sr, sr@latin], Kukuh Syafaat [id],
|
|
||||||
Baurzhan Muftakhidinov [kk], Aurimas Černius [lt], Fran Dieguez [gl],
|
|
||||||
gogo [hr], Jordi Mas [ca]
|
|
||||||
|
|
||||||
3.25.90
|
|
||||||
=======
|
|
||||||
* Add permission dialog for inhibiting shortucts [Florian; #783342]
|
|
||||||
* Improve window picker layout [Florian, Jakub; #783953]
|
|
||||||
* Remove legacy status icon tray [Florian; #785956]
|
|
||||||
* Drop autotools support [Florian; #785153]
|
|
||||||
* Misc. bug fixes [Florian, Carlos, Cosimo; #785090, #785309, #767805,
|
|
||||||
#747794, #785358, #785556]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Emmanuele Bassi, Cosimo Cecchi, Carlos Garnacho, Florian Müllner,
|
|
||||||
Jakub Steiner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Fabio Tomat [fur], Pawan Chitrakar [ne], Aurimas Černius [lt], gogo [hr],
|
|
||||||
Daniel Mustieles [es], Baurzhan Muftakhidinov [kk], Matej Urbančič [sl],
|
|
||||||
Marek Cernocky [cs], Dušan Kazik [sk], Jordi Mas [ca], Fran Dieguez [gl],
|
|
||||||
Andika Triwidada [id], Anders Jonsson [sv], Balázs Meskó [hu]
|
|
||||||
|
|
||||||
3.25.4
|
|
||||||
======
|
|
||||||
* gdm: Fix "Not listed" focus indication [Florian; #784040]
|
|
||||||
* Fix missing icons in freedesktop notifications [Florian; #784245]
|
|
||||||
* gdm: Disable user list when empty [Xiaoguang; #731320]
|
|
||||||
* gdm: Allow empty reponse to PAM messages [Ray; #784360]
|
|
||||||
* Fix blocked clicks in shutdown dialog [Florian; #781738]
|
|
||||||
* Show OSD popup when changing volume via scroll wheel [Florian; #781028]
|
|
||||||
* Refine list search results [Rares; #749957]
|
|
||||||
* Replace mutter's unresponsive app dialog [Carlos; #762083]
|
|
||||||
* Improve handling of extension errors [Florian; #781728]
|
|
||||||
* Implement tablet rings/strips configuration [Carlos; #782033]
|
|
||||||
* Adjust to mozjs52 update in gjs [Florian; #785084, #785090]
|
|
||||||
* Support the meson build system [Florian; #783229]
|
|
||||||
* Misc. bug fixes [Ray, Florian, Jonas, Marco, Shih-Yuan, Joaquim, Carlos S.;
|
|
||||||
#780403, #772589, #784130, #783975, #784353, #784361, #772284, #765011,
|
|
||||||
#765011, #765011, #784985, #781471, #785047, #736148, #736148]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Alessandro Bono, Michael Catanzaro, Carlos Garnacho,
|
|
||||||
Shih-Yuan Lee (FourDollars), Florian Müllner, Joaquim Rocha,
|
|
||||||
Mario Sanchez Prada, Carlos Soriano, Ray Strode, Marco Trevisan (Treviño),
|
|
||||||
Rares Visalom, Xiaoguang Wang
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Jeremy Bicha po/es, he.po, Kukuh Syafaat [id], Fabio Tomat [fur]
|
|
||||||
|
|
||||||
3.25.3
|
|
||||||
======
|
|
||||||
* Bypass proxies for captive portal [Bastien; #769692]
|
|
||||||
* Correctly handle "text-shadow: none;" [Matt; #783485]
|
|
||||||
* Add StEntry:hint-actor property [Mario; #783484]
|
|
||||||
* Support text-shadow CSS property in StEntry [Mario; #783484]
|
|
||||||
* Misc. bug fixes [Jonas, Florian, Bastien, Ting-Wei, Cosimo, Mario, Sebastian;
|
|
||||||
#777732, #783202, #783210, #783206, #783286, #783439, #783483, #783823,
|
|
||||||
#781950]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Cosimo Cecchi, Sebastian Keller, Ting-Wei Lan, Florian Müllner,
|
|
||||||
Bastien Nocera, Mario Sanchez Prada, Matt Watson
|
|
||||||
|
|
||||||
3.25.2
|
|
||||||
======
|
|
||||||
* Fix StEntry::primary-icon-clicked emission [Florian; #782190]
|
|
||||||
* Add an optional icon parameter to PopupMenu.addAction() [Mario; #782166]
|
|
||||||
* Allow search providers to include clipboard text with results [Daiki; #775099]
|
|
||||||
* Reduce dependency on Caribou [Carlos; #777342]
|
|
||||||
* Add transparency to top bar when free floating [Alessandro; #747163]
|
|
||||||
* Animate maximize/unmaximize operations [Alessandro; #766685]
|
|
||||||
* Misc. bug fixes [Florian, Matthias, Jeremy, Michael, Carlos, Lan; #782000,
|
|
||||||
#780215, #782802, #782637, #782930, #755164, #780215, #782982]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jeremy Bicha, Michael Biebl, Alessandro Bono, Carlos Garnacho, Ting-Wei Lan,
|
|
||||||
Matthias Liertzer, Florian Müllner, Mario Sanchez Prada, Daiki Ueno
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Jordi Mas [ca], Christian Stadelmann [de], Милош Поповић [sr],
|
|
||||||
Милош Поповић [sr@latin], Furkan Ahmet Kara [tr]
|
|
||||||
|
|
||||||
3.25.1
|
|
||||||
======
|
|
||||||
* Close Wifi selection dialog on lock [Florian; #780054]
|
|
||||||
* Fix DND over window previews in overview [Florian; #737166]
|
|
||||||
* Do not lock the screen when disabled by lockdown settings [Florian; #780212]
|
|
||||||
* Follow GNOME Weather's location permissions [Florian; #780252]
|
|
||||||
* Fix portals that require a new window to be loaded [Catalin; #759044]
|
|
||||||
* Fix restricting menus to screen height on HiDPI displays [Cosimo; #753305]
|
|
||||||
* Misc. bug fixes and cleanups [Florian, Cosimo, Bastien, Catalin, Carlos G.,
|
|
||||||
Jonas, Carlos S., Xiaoguang, Rares, Emilio; #780063, #780321, #780381,
|
|
||||||
#780453, #758873, #780606, #642652, #777732, #780157, #781482, #780404,
|
|
||||||
#781545, #781728]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Cosimo Cecchi, Philip Chimento, Carlos Garnacho, Catalin Iacob,
|
|
||||||
Florian Müllner, Bastien Nocera, Emilio Pozuelo Monfort, Carlos Soriano,
|
|
||||||
Rares Visalom, Xiaoguang Wang
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Marek Cernocky [cs], Piotr Drąg [pl], Anders Jonsson [sv], Stas Solovey [ru],
|
|
||||||
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Daniel Korostil [uk],
|
|
||||||
Kukuh Syafaat [id], Milo Casagrande [it], Jiri Grönroos [fi],
|
|
||||||
Daniel Mustieles [es], Balázs Úr [hu], Guillaume Bernard [fr],
|
|
||||||
Changwoo Ryu [ko], Mario Blättermann [de], Fran Dieguez [gl],
|
|
||||||
Dušan Kazik [sk], Yuras Shumovich [be], Fabio Tomat [fur],
|
|
||||||
Kjartan Maraas [nb], Aurimas Černius [lt], Trần Ngọc Quân [vi],
|
|
||||||
Rūdolfs Mazurs [lv], Γιάννης Κουτσούκος [el], gogo [hr], Марко Костић [sr],
|
|
||||||
Jordi Mas [ca], Khaled Hosny [ar]
|
|
||||||
|
|
||||||
3.24.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
GNOME Translation Robot [tg], Мирослав Николић [sr, sr@latin],
|
|
||||||
Guillaume Bernard [fr], Rūdolfs Mazurs [lv], Emin Tufan Çetin [tr],
|
|
||||||
sujiniku [ja], Daniel Korostil [uk]
|
|
||||||
|
|
||||||
3.23.92
|
|
||||||
=======
|
|
||||||
* Implement DND to overview on wayland [Hyungwon; #765003]
|
|
||||||
* Make telepathy optional at runtime [Florian; #771721, #779878]
|
|
||||||
* Don't show forecasts for NYC when geoclue gets stuck [Sebastian; #779898]
|
|
||||||
* Add bottom edge drag gesture to bring up the OSK [Jan-Michael; #757712]
|
|
||||||
* Allow switching between pads in the same group [Carlos; #779986]
|
|
||||||
* Ignore showBanners policy for critical notifications [Florian; #779974]
|
|
||||||
* Misc. bug fixes [Florian; #779435, #779819, #779820]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jan-Michael Brummer, Allan Day, Carlos Garnacho, Hyungwon Hwang,
|
|
||||||
Sebastian Keller, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Enrico Nicoletto [pt_BR], Jiri Grönroos [fi], Chao-Hsiung Liao [zh_TW],
|
|
||||||
Piotr Drąg [pl], Piotr Drąg [he], Balázs Meskó [hu], Kris Thomsen [da],
|
|
||||||
Yuras Shumovich [be], Sveinn í Felli [is], Inaki Larranaga Murgoitio [eu],
|
|
||||||
Changwoo Ryu [ko], Jordi Mas [ca], Aurimas Černius [lt],
|
|
||||||
Мирослав Николић [sr, sr@latin], Christian Kirbach [de], Anders Jonsson [sv],
|
|
||||||
Fabio Tomat [fur], GNOME Translation Robot [gd], Dušan Kazik [sk],
|
|
||||||
Kukuh Syafaat [id], Marek Černocký [cs], Stas Solovey [ru],
|
|
||||||
Milo Casagrande [it], Fran Dieguez [gl], Daniel Boles [gl], A S Alam [pa],
|
|
||||||
Daniel Mustieles [es]
|
|
||||||
|
|
||||||
3.23.91
|
|
||||||
=======
|
|
||||||
* Use the original timestamps for restored notifications [Florian; #766410]
|
|
||||||
* Add weather information to date+time drop-down [Florian; #754031]
|
|
||||||
* Refine message list layout in date+time drop-down [Florian; #775763]
|
|
||||||
* Make next/prev media controls insensitive when unavailable [Florian; #773884]
|
|
||||||
* Misc. bug fixes [Piotr, Bastien, Florian; #772210, #769546, #775799]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Piotr Drąg, Carlos Garnacho, Florian Müllner, Bastien Nocera
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Baurzhan Muftakhidinov [kk], Jordi Mas [ca], Ask Hjorth Larsen [da],
|
|
||||||
Inaki Larranaga Murgoitio [eu], Daniel Mustieles [es], Dušan Kazik [sk],
|
|
||||||
Aurimas Černius [lt], Jiri Grönroos [fi], Kjartan Maraas [nb],
|
|
||||||
Piotr Drąg [pl], Daniel Korostil [uk], Kukuh Syafaat [id],
|
|
||||||
Milo Casagrande [it], Fabio Tomat [fur], Rafael Fontenelle [pt_BR],
|
|
||||||
Fran Dieguez [gl], Мирослав Николић [sr, sr@latin], Balázs Meskó [hu],
|
|
||||||
Chao-Hsiung Liao [zh_TW]
|
|
||||||
|
|
||||||
3.23.90
|
|
||||||
=======
|
|
||||||
* Handle Ctrl+Q and Ctrl+W in portal window [Bastien; #764133]
|
|
||||||
* Allow to scroll through ibus candidates with mouse [Peng; #776032]
|
|
||||||
* Reload apps on .desktop file content changes [Adrian; #773636]
|
|
||||||
* Use private data/cache directories in portal helper [Bastien; #775639]
|
|
||||||
* Fix subsurfaces not showing up in previews [Rui; #756715]
|
|
||||||
* Fix theme node transitions [Florian; #778145]
|
|
||||||
* Update pad (o)leds on mode switches [Carlos; #776543]
|
|
||||||
* Add security indicators to defend against malicious portals [Bastien; #749197]
|
|
||||||
* Don't allow type ahead at the login screen [Ray; #766139]
|
|
||||||
* Don't fail to load because of TLS errors [Bastien; #778253]
|
|
||||||
* Ensure the network lists remains sorted on rename [Benjamin; #778686]
|
|
||||||
* Toggle power-off/suspend button on long-press [Florian; #721173]
|
|
||||||
* Add "kill-switch" for user extensions [Florian; #778664]
|
|
||||||
* Add night light indicator to status area [Florian; #741224]
|
|
||||||
* Misc. bug fixes [Michael, Bastien, Carlos, Rui, Florian, Alan, Philip, Jonas;
|
|
||||||
#759793, #735233, #762444, #777784, #777934, #778158, #776199, #778425,
|
|
||||||
#771098, #778552, #777317, #778660, #778661, #745626, #778672]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Benjamin Berg, Michael Catanzaro, Philip Chimento,
|
|
||||||
Alan Coopersmith, Piotr Drąg, Carlos Garnacho, Yuri Konotopov,
|
|
||||||
Lionel Landwerlin, Rui Matos, Florian Müllner, Bastien Nocera,
|
|
||||||
Adrian Perez de Castro, Robert Roth, Ray Strode, Peng Wu
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Jiri Grönroos [fi], Balázs Meskó [hu], Gábor Kelemen [hu],
|
|
||||||
Daniel Mustieles [es], Dušan Kazik [sk],
|
|
||||||
Piotr Drąg [ar, eu, fa, hr, pa, pt, sr, sr@latin], Rafael Fontenelle [pt_BR],
|
|
||||||
Jordi Mas [ca], Piotr Drąg [pl], Alexandre Franke [fr],
|
|
||||||
Baurzhan Muftakhidinov [kk], Yuras Shumovich [be], Mandy Wang [zh_CN],
|
|
||||||
Marek Černocký [cs], Kukuh Syafaat [id], Kjartan Maraas [nb],
|
|
||||||
Daniel Korostil [uk]
|
|
||||||
|
|
||||||
3.23.3
|
|
||||||
======
|
|
||||||
* Fix replacing of GNotifications [Florian; #775149]
|
|
||||||
* Prepare for mozjs31 GJS [Philip; #775374]
|
|
||||||
* Misc. bug fixes [Niels, Jonas; #775507, #776130]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Michael Catanzaro, Philip Chimento, Niels De Graef,
|
|
||||||
Carlos Garnacho, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Muhammet Kara [tr], Christian Kirbach [de], Baurzhan Muftakhidinov [kk],
|
|
||||||
Cheng-Chia Tseng [zh_TW], A S Alam [pa], Gianvito Cavasoli [it]
|
|
||||||
|
|
||||||
3.23.2
|
|
||||||
======
|
|
||||||
* Implement Pad configuration OSD [Carlos; #771067]
|
|
||||||
* Show overview on three-finger touchpad pinch [Carlos; #765937]
|
|
||||||
* Summarize network sections with too many devices [Florian; #773892]
|
|
||||||
* Always show primary network icon when connected [Florian; #773890]
|
|
||||||
* Fix fullscreen transitions on wayland [Rui; #770345]
|
|
||||||
* Work around portal failures by using a URL without HTPPS redirect [Debarshi; #769940]
|
|
||||||
* Fix app view hiding when no usage data is available [Florian, Xiaoguang; #774381]
|
|
||||||
* Misc. bug fixes [Florian, Ray; #773875, #740043, #773893, #774643, #774805]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Carlos Garnacho, Rui Matos, Florian Müllner, Debarshi Ray, Ray Strode,
|
|
||||||
Xiaoguang Wang
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Balázs Meskó [hu], Fabio Tomat [fur], Marek Cernocky [cs], Stas Solovey [ru],
|
|
||||||
Daniel Mustieles [es], Marek Černocký [cs], Piotr Drąg [pl],
|
|
||||||
Rafael Fontenelle [pt_BR], Baurzhan Muftakhidinov [kk], Jiri Grönroos [fi],
|
|
||||||
Kjartan Maraas [nb]
|
|
||||||
|
|
||||||
3.23.1
|
|
||||||
======
|
|
||||||
* Request periodic scans while WiFi list is open [Dan; #767918]
|
|
||||||
* Include extension UUID in structured log metadata [Jonh; #770717]
|
|
||||||
* Line-wrap PAM messages on login screen [Tao; #764445]
|
|
||||||
* Add a way to launch an app on the discrete GPU [Bastien; #773117]
|
|
||||||
* Only allow graphs to lift screen shield when locked [Florian; #773328]
|
|
||||||
* Add reload option to gnome-shell-extension-tool [Jonh; #772593]
|
|
||||||
* Update background animations when resuming from suspend [Florian; #773265]
|
|
||||||
* Misc. bug fixes [Cosimo, Bastien, Florian, Philip, Carlos; #772723, #772287,
|
|
||||||
#756432, #772386, #772386, #773085, #773634]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Cosimo Cecchi, Philip Chimento, Carlos Garcia Campos, Florian Müllner,
|
|
||||||
Bastien Nocera, Jonh Wendell, Dan Williams, Tao Yang
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Fabio Tomat [fur], Philip Chimento [zh_CN], YunQiang Su [zh_CN],
|
|
||||||
Jordi Mas [ca], Piotr Drąg [pl], Muhammet Kara [tr], Marek Černocký [cs],
|
|
||||||
Daniel Korostil [uk], Dušan Kazik [sk]
|
|
||||||
|
|
||||||
3.22.1
|
|
||||||
======
|
|
||||||
* Fix hidden network indicator on startup [Florian; #772249]
|
|
||||||
* Fix order of windows with modal dialogs in window switcher [Florian; #747153]
|
|
||||||
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
|
|
||||||
* Reliably match windows from Flatpak apps [Florian; #772615]
|
|
||||||
* Misc. bug fixes [Philip; #742249]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Philip Chimento, Carlos Garnacho, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Inaki Larranaga Murgoitio [eu], Khaled Hosny [ar], BM [uz@cyrillic],
|
|
||||||
Milo Casagrande [it], Cheng-Chia Tseng [zh_TW], gogo [hr]
|
|
||||||
|
|
||||||
3.22.0
|
|
||||||
======
|
|
||||||
* Misc. bug fixes [Florian, Rui; #771391, #771536] #771656]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Rui Matos, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Ask Hjorth Larsen [da], GNOME Translation Robot [gd], Alexandre Franke [fr],
|
|
||||||
Daniel Korostil [uk], Jordi Mas [ca], Khaled Hosny [ar], David King [en_GB]
|
|
||||||
|
|
||||||
3.21.92
|
|
||||||
=======
|
|
||||||
* Adjust screen capture to work with multiple stage views [Jonas; #770128]
|
|
||||||
* Improve handling of cycle shortcuts [Florian; #771063]
|
|
||||||
* Fix windows not getting undimmed in some cases [Rui; #770163, #752524]
|
|
||||||
* Disable extension version check by default [Florian; #770887]
|
|
||||||
* Misc. bug fixes [Rui, Florian, Michael; #770382, #770888, #770328]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Michael Catanzaro, Fran Dieguez, Olivier Fourdan, Rui Matos,
|
|
||||||
Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Aurimas Černius [lt],
|
|
||||||
Muhammet Kara [tr], Trần Ngọc Quân [vi], A S Alam [pa], Yosef Or Boczko [he],
|
|
||||||
Anders Jonsson [sv], Tiago Santos [pt], Hannie Dumoleyn [nl],
|
|
||||||
Rūdolfs Mazurs [lv], Claude Paroz [fr], Arash Mousavi [fa],
|
|
||||||
Fran Dieguez [gl], Stas Solovey [ru], Tom Tryfonidis [el]
|
|
||||||
|
|
||||||
3.21.91
|
|
||||||
=======
|
|
||||||
Translations:
|
|
||||||
Mario Blättermann [de], Jiri Grönroos [fi], Dušan Kazik [sk],
|
|
||||||
Andika Triwidada [id], Daniel Mustieles [es], Fabio Tomat [fur],
|
|
||||||
Enrico Nicoletto [pt_BR], Matej Urbančič [sl], Мирослав Николић [sr, sr@latin]
|
|
||||||
|
|
||||||
3.21.90.1
|
|
||||||
=========
|
|
||||||
Contributors:
|
|
||||||
Piotr Drąg
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Marek Černocký [cs], Balázs Úr [hu]
|
|
||||||
|
|
||||||
3.21.90
|
|
||||||
=======
|
|
||||||
* Improve on-screen keyboard on wayland [Carlos; #765009]
|
|
||||||
* Misc. bug fixes [Florian; #769156, #769216, #769074]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Carlos Garnacho, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Fabio Tomat [fur], Tiago Santos [pt], Daniel Mustieles [es],
|
|
||||||
Bernd Homuth [de], Aurimas Černius [lt], Balázs Úr [hu],
|
|
||||||
Yosef Or Boczko [he], Jiri Grönroos [fi], Marek Cernocky [cs],
|
|
||||||
Muhammet Kara [tr], Enrico Nicoletto [pt_BR], Andika Triwidada [id]
|
|
||||||
|
|
||||||
3.21.4
|
|
||||||
======
|
|
||||||
* overview: Fix switching workspaces when scrolling on non-primary monitors
|
|
||||||
[Florian; #766883, #768316]
|
|
||||||
* Fix crash when using screen recorder under wayland [Rui; #767001]
|
|
||||||
* Update theme on video memory purge errors [Rui; #739178]
|
|
||||||
* Free old backgrounds immediately [Hyungwon; #766353]
|
|
||||||
* Add support for system upgrades to end session dialog [Kalev; #763611]
|
|
||||||
* Fix maximized windows flickering to the wrong size on restart [Owen; #761566]
|
|
||||||
* Hide ignored events in calendar as well [Florian; #768538]
|
|
||||||
* calendar: Only hide dismissed occurrence of recurring event [Florian; #748226]
|
|
||||||
* Provide org.freedesktop.impl.portal.access implementation [Florian; #768669]
|
|
||||||
* Misc. bug fixes and cleanups [Rui, Florian, Marinus, Jonas; #767954, #768317,
|
|
||||||
#746867, #762206, #768956, #768979]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Piotr Drąg, Hyungwon Hwang, Kalev Lember, Rui Matos,
|
|
||||||
Florian Müllner, Marinus Schraal, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Andika Triwidada [id], Daniel Mustieles [es], Bruce Cowan [en_GB],
|
|
||||||
Dušan Kazik [sk], Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK]
|
|
||||||
|
|
||||||
3.21.3
|
|
||||||
======
|
|
||||||
* Do not disable suspend action when locked [Florian; #725960]
|
|
||||||
* Remember input sources MRU list [Cosimo; #766826]
|
|
||||||
* networkAgent: Handle VPN service aliases [David; #658484]
|
|
||||||
* Plug a memory leak [Hans; #710230]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Cosimo Cecchi, Florian Müllner, Hans Petter Jansson, David Woodhouse
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Tiago Santos [pt], Cédric Valmary [oc], Muhammet Kara [tr],
|
|
||||||
Daniel Mustieles [es], Rafael Fontenelle [pt_BR]
|
|
||||||
|
|
||||||
3.21.2
|
|
||||||
======
|
|
||||||
* Fix sorting of hidden apps in app switcher [Florian; #766238]
|
|
||||||
* Set logind's LockedHint property when locked [Victor; #764773]
|
|
||||||
* Allocate framebuffers early to fix a crash on NVIDIA [Martin; #764898]
|
|
||||||
* Fix cycle-windows/cycle-group keybindings [Florian; #730739]
|
|
||||||
* Switch to shared desktop schema for calendar settings [Iain; #766318]
|
|
||||||
* Misc. bug fixes [Florian, Cosimo, Michele; #766325, #758471, #757556,
|
|
||||||
#757019, #766598]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Cosimo Cecchi, Michele Gaio, Iain Lane, Florian Müllner, Martin Szulecki,
|
|
||||||
Victor Toso
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Tiago Santos [pt], Kjartan Maraas [nb], Jiro Matsuzawa [ja],
|
|
||||||
Cédric Valmary [oc], Sveinn í Felli [is]
|
|
||||||
|
|
||||||
3.21.1
|
|
||||||
======
|
|
||||||
* Save screencasts in HOME if XDG_VIDEO_DIR doesn't exist [Florian; #765015]
|
|
||||||
* Don't show orientation lock when g-s-d won't rotate [Florian; #765267]
|
|
||||||
* Misc. bug fixes [Heiher, Florian, Marek, Rui; #722752, #765061, #763068,
|
|
||||||
#765607, #757676, #760439]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Heiher, Marek Chalupa, Rui Matos, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Arash Mousavi [fa], Kristjan SCHMIDT [eo], GNOME Translation Robot [gd]
|
|
||||||
|
|
||||||
3.20.1
|
|
||||||
======
|
|
||||||
* Plug a memory leak [Aaron; #735705]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Aaron Plattner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Daniel Korostil [uk], Matej Urbančič [sl], Inaki Larranaga Murgoitio [eu],
|
|
||||||
Cheng-Chia Tseng [zh_TW], Fabio Tomat [fur], Trần Ngọc Quân [vi],
|
|
||||||
YunQiang Su [zh_CN], Marek Černocký [cs], Arash Mousavi [fa],
|
|
||||||
Alexander Shopov [bg], Khaled Hosny [ar]
|
|
||||||
|
|
||||||
3.20.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Milo Casagrande [it],
|
|
||||||
Anders Jonsson [sv], Muhammet Kara [tr], Alexandre Franke [fr],
|
|
||||||
Rūdolfs Mazurs [lv], Ask Hjorth Larsen [da], Jiro Matsuzawa [ja]
|
|
||||||
|
|
||||||
3.19.92
|
|
||||||
=======
|
|
||||||
* Update location dialog according to latest mockups [Zeeshan; #762480]
|
|
||||||
* Fix deleting chat notifications in calendar [Florian; #747991]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Zeeshan Ali (Khattak), Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Rūdolfs Mazurs [lv], Changwoo Ryu [ko], Matej Urbančič [sl],
|
|
||||||
Justin van Steijn [nl], Fabio Tomat [fur], Kris Thomsen [da],
|
|
||||||
Marek Černocký [cs], Piotr Drąg [pl], Dušan Kazik [sk],
|
|
||||||
Мирослав Николић [sr, sr@latin], Balázs Úr [hu], Yosef Or Boczko [he],
|
|
||||||
Daniel Mustieles [es], Fran Dieguez [gl], Bernd Homuth [de],
|
|
||||||
Tom Tryfonidis [el], Jiri Grönroos [fi], Gil Forcada [ca],
|
|
||||||
Artur Morais [pt_BR], Aurimas Černius [lt], Stas Solovey [ru]
|
|
||||||
|
|
||||||
3.19.91
|
|
||||||
=======
|
|
||||||
* location: Ask user only once [Zeeshan; #762559]
|
|
||||||
* Fix jiggling when auto-hiding legacy tray [Florian; #747957]
|
|
||||||
* Misc. bug fixes [Florian, Michael, Ting-Wei; #762475, #762507, #755659]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Zeeshan Ali (Khattak), Michael Catanzaro, Ting-Wei Lan, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Мирослав Николић [sr, sr@latin], Piotr Drąg [pl], A S Alam [pa],
|
|
||||||
Artur de Aquino Morais [pt_BR], Daniel Mustieles [es],
|
|
||||||
Chao-Hsiung Liao [zh_TW], Daniel Korostil [uk], Fran Dieguez [gl],
|
|
||||||
Tom Tryfonidis [el], Bernd Homuth [de], Sebastian Rasmussen [sv],
|
|
||||||
Jordi Mas [ca], Piotr Drąg [ga], Cédric Valmary [oc], Gábor Kelemen [hu],
|
|
||||||
Baurzhan Muftakhidinov [kk], Friedel Wolff [af], Marek Černocký [cs],
|
|
||||||
Mingye Wang (Arthur2e5) [zh_CN], Aron Xu [zh_CN], Khaled Hosny [ar],
|
|
||||||
Aurimas Černius [lt], Stas Solovey [ru], Yosef Or Boczko [he]
|
|
||||||
|
|
||||||
3.19.90
|
|
||||||
=======
|
|
||||||
* Correctly identify VPN secret requests [Lubomir; #760999]
|
|
||||||
* Improve week number presentation [Jakub; #683245]
|
|
||||||
* Add audio device selection dialog [Florian; #760284]
|
|
||||||
* Add media controls to the time and date drop down [Florian; #756491]
|
|
||||||
* Fix IBus candidate popup position under wayland [Rui; #753476]
|
|
||||||
* Ask user to grant applications access to location [Zeeshan; #762119]
|
|
||||||
* Misc. bug fixes [Mario, Jakub, Florian; #761208, #761772, #762270]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Zeeshan Ali (Khattak), Michael Catanzaro, Rui Matos, Florian Müllner,
|
|
||||||
Lubomir Rintel, Mario Sanchez Prada, Jakub Steiner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Alexander Shopov [bg], Balázs Meskó [hu], Fabio Tomat [fur],
|
|
||||||
Dušan Kazik [sk], Piotr Drąg [pl], Alexandre Franke [fr],
|
|
||||||
Mario Blättermann [de], Milo Casagrande [it], Jordi Mas [ca]
|
|
||||||
|
|
||||||
3.19.4
|
|
||||||
======
|
|
||||||
* gdm: Do not allow bypassing disabled Sign In button [Michael; #746180]
|
|
||||||
* Style week numbers in calendar [Jakub; #683245]
|
|
||||||
* Misc. bug fixes [Christophe, Jakub, Rui; #759708, #760577, #760945]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Michael Catanzaro, Marek Černocký, Christophe Fergeau, Rui Matos,
|
|
||||||
Jakub Steiner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Aurimas Černius [lt], Enrico Nicoletto [pt_BR], Andika Triwidada [id],
|
|
||||||
Mario Blättermann [de], Marek Černocký [cs], Kjartan Maraas [nb],
|
|
||||||
Muhammet Kara [tr], Stas Solovey [ru]
|
|
||||||
|
|
||||||
3.19.3
|
|
||||||
======
|
|
||||||
* Fix thumbnail scaling in window switcher on HiDPI [Florian; #758676]
|
|
||||||
* Update animated backgrounds on timezone changes [Florian; #758939]
|
|
||||||
* loginDialog: Update user list on user changes [Michael; #758568]
|
|
||||||
* Fix touch interaction on wayland [Carlos; #756748]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Michael Catanzaro, Carlos Garnacho, Kalev Lember, Florian Müllner
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Daniel Korostil [uk], Muhammet Kara [tr], Dušan Kazik [sk],
|
|
||||||
Baurzhan Muftakhidinov [kk], Marek Černocký [cs]
|
|
||||||
|
|
||||||
3.19.2
|
|
||||||
======
|
|
||||||
* Make gnome-shell DBus activatable [Ray; #741666]
|
|
||||||
* Fix browser plugin crash in Firefox [Carlos; #737932, #757940]
|
|
||||||
* Optionally show battery percentage in system status area [Bastien; #735771]
|
|
||||||
* Misc. bug fixes [Kalev, Florian, Bastien; #757418, #757668, #757779, #757816,
|
|
||||||
#745626, #758220]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Michael Biebl, Michael Catanzaro, Piotr Drąg, Carlos Garcia Campos,
|
|
||||||
Kalev Lember, Florian Müllner, Bastien Nocera, Ray Strode
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Pedro Albuquerque [pt], liushuyu [zh_CN], Yosef Or Boczko [he],
|
|
||||||
Jiri Grönroos [fi], Kjartan Maraas [nb], GNOME Translation Robot [gd],
|
|
||||||
Daniel Mustieles [es], Marek Černocký [cs], Kristjan SCHMIDT [eo],
|
|
||||||
Stas Solovey [ru]
|
|
||||||
|
|
||||||
3.19.1
|
|
||||||
======
|
|
||||||
* Respect text-scaling factor under wayland [Owen; #756447]
|
|
||||||
* Show the Bluetooth submenu when there were setup devices [Bastien; #723848]
|
|
||||||
* Misc. bug fixes [Florian, Cosimo, Rui, Ray, Owen, Jakub, Bastien;
|
|
||||||
#756697, #756714, #756605, #754814, #738942, #756983, #756925,
|
|
||||||
#757011, #673235, #757150]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Cosimo Cecchi, Rui Matos, Florian Müllner, Bastien Nocera, Jakub Steiner,
|
|
||||||
Ray Strode, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Kjartan Maraas [nb], Khaled Hosny [ar], Balázs Meskó [hu],
|
|
||||||
Daniel Șerbănescu [ro], Marek Černocký [cs]
|
|
||||||
|
|
||||||
3.18.1
|
|
||||||
======
|
|
||||||
* Fix screen freezes when a notification is pushed [Carlos; #755425]
|
|
||||||
* Fix overzealous ellipsization in system status menu [Adel, Florian; #708472]
|
|
||||||
* Hide app menu when disabled by setting [Florian; #745919]
|
|
||||||
* Fix lightbox effect when animations are disabled [Rui; #755827]
|
|
||||||
* Do not mark hotplug notifications as critical [Florian; #657923]
|
|
||||||
* Fix icons getting cut off in dash [Florian; #745649]
|
|
||||||
* Animate fullscreen/unfullscreen operations [Cosimo; #707248]
|
|
||||||
* Misc. bug fixes [Florian, Owen; #748919, #674799, #754581]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Emmanuele Bassi, Michael Catanzaro, Cosimo Cecchi, Matthias Clasen,
|
|
||||||
Adel Gadllah, Carlos Garnacho, Ekaterina Gerasimova, Rui Matos,
|
|
||||||
Florian Müllner, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Марко Костић [sr], Милош Поповић [sr@latin], Khaled Hosny [ar],
|
|
||||||
Trần Ngọc Quân [vi], Petr Kovar [cs], Alexandre Franke [fr],
|
|
||||||
Fran Dieguez [gl], Anders Jonsson [sv], Piotr Drąg [pl], Dušan Kazik [sk],
|
|
||||||
Milo Casagrande [it], Changwoo Ryu [ko], Stas Solovey [ru],
|
|
||||||
Rafael Fontenelle [pt_BR], Tom Tryfonidis [el], Aurimas Černius [lt],
|
|
||||||
Seán de Búrca [ga], Christian Kirbach [de], Jiri Grönroos [fi],
|
|
||||||
Pedro Albuquerque [pt], Baurzhan Muftakhidinov [kk], Daniel Mustieles [es],
|
|
||||||
Marek Černocký [cs], Ask Hjorth Larsen [da], Inaki Larranaga Murgoitio [eu]
|
|
||||||
|
|
||||||
3.18.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Sendy Aditya Suryana [id], Kris Thomsen [da], Seán de Búrca [ga],
|
|
||||||
Andika Triwidada [id], Enrico Nicoletto [pt_BR], Anders Jonsson [sv],
|
|
||||||
Rūdolfs Mazurs [lv]
|
|
||||||
|
|
||||||
3.17.92
|
3.17.92
|
||||||
=======
|
=======
|
||||||
* Fix race when loading multiple background animations [Josselin; #741453]
|
* Fix race when loading multiple background animations [Josselin; #741453]
|
||||||
|
27
autogen.sh
Executable file
27
autogen.sh
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Run this to generate all the initial makefiles, etc.
|
||||||
|
|
||||||
|
srcdir=`dirname $0`
|
||||||
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
|
(test -f $srcdir/configure.ac \
|
||||||
|
&& test -d $srcdir/src) || {
|
||||||
|
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
|
||||||
|
echo " top-level gnome-shell directory"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fetch submodules if needed
|
||||||
|
if test ! -f src/gvc/Makefile.am || test ! -f data/theme/gnome-shell-sass/COPYING;
|
||||||
|
then
|
||||||
|
echo "+ Setting up submodules"
|
||||||
|
git submodule init
|
||||||
|
fi
|
||||||
|
git submodule update
|
||||||
|
|
||||||
|
which gnome-autogen.sh || {
|
||||||
|
echo "You need to install gnome-common from GNOME Git (or from"
|
||||||
|
echo "your OS vendor's package manager)."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
. gnome-autogen.sh
|
20
browser-plugin/Makefile.am
Normal file
20
browser-plugin/Makefile.am
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
mozillalibdir = $(BROWSER_PLUGIN_DIR)
|
||||||
|
|
||||||
|
mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la
|
||||||
|
|
||||||
|
libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined
|
||||||
|
|
||||||
|
libgnome_shell_browser_plugin_la_LIBADD = \
|
||||||
|
$(BROWSER_PLUGIN_LIBS)
|
||||||
|
|
||||||
|
libgnome_shell_browser_plugin_la_SOURCES = \
|
||||||
|
browser-plugin.c \
|
||||||
|
npapi/npapi.h \
|
||||||
|
npapi/npfunctions.h \
|
||||||
|
npapi/npruntime.h \
|
||||||
|
npapi/nptypes.h
|
||||||
|
|
||||||
|
libgnome_shell_browser_plugin_la_CFLAGS = \
|
||||||
|
$(BROWSER_PLUGIN_CFLAGS) \
|
||||||
|
-DG_LOG_DOMAIN=\"GnomeShellBrowserPlugin\"
|
@ -33,16 +33,20 @@
|
|||||||
#include <json-glib/json-glib.h>
|
#include <json-glib/json-glib.h>
|
||||||
|
|
||||||
#define ORIGIN "extensions.gnome.org"
|
#define ORIGIN "extensions.gnome.org"
|
||||||
#define PLUGIN_NAME "GNOME Shell Integration"
|
#define PLUGIN_NAME "Gnome Shell Integration"
|
||||||
#define PLUGIN_DESCRIPTION "This plugin provides integration with GNOME Shell " \
|
#define PLUGIN_DESCRIPTION "This plugin provides integration with Gnome Shell " \
|
||||||
"for live extension enabling and disabling. " \
|
"for live extension enabling and disabling. " \
|
||||||
"It can be used only by extensions.gnome.org"
|
"It can be used only by extensions.gnome.org"
|
||||||
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::GNOME Shell Integration Dummy Content-Type";
|
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
|
||||||
|
|
||||||
#define PLUGIN_API_VERSION 5
|
#define PLUGIN_API_VERSION 5
|
||||||
|
|
||||||
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
|
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GDBusProxy *proxy;
|
||||||
|
} PluginData;
|
||||||
|
|
||||||
static NPNetscapeFuncs funcs;
|
static NPNetscapeFuncs funcs;
|
||||||
|
|
||||||
static inline gchar *
|
static inline gchar *
|
||||||
@ -141,6 +145,121 @@ check_origin_and_protocol (NPP instance)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* =============== public entry points =================== */
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
||||||
|
{
|
||||||
|
/* global initialization routine, called once when plugin
|
||||||
|
is loaded */
|
||||||
|
|
||||||
|
g_debug ("plugin loaded");
|
||||||
|
|
||||||
|
memcpy (&funcs, pfuncs, sizeof (funcs));
|
||||||
|
|
||||||
|
plugin->size = sizeof(NPPluginFuncs);
|
||||||
|
plugin->newp = NPP_New;
|
||||||
|
plugin->destroy = NPP_Destroy;
|
||||||
|
plugin->getvalue = NPP_GetValue;
|
||||||
|
plugin->setwindow = NPP_SetWindow;
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_Shutdown(void)
|
||||||
|
{
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char*
|
||||||
|
NP_GetMIMEDescription(void)
|
||||||
|
{
|
||||||
|
return PLUGIN_MIME_STRING;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NP_GetValue(void *instance,
|
||||||
|
NPPVariable variable,
|
||||||
|
void *value)
|
||||||
|
{
|
||||||
|
switch (variable) {
|
||||||
|
case NPPVpluginNameString:
|
||||||
|
*(char**)value = PLUGIN_NAME;
|
||||||
|
break;
|
||||||
|
case NPPVpluginDescriptionString:
|
||||||
|
*(char**)value = PLUGIN_DESCRIPTION;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NPP_New(NPMIMEType mimetype,
|
||||||
|
NPP instance,
|
||||||
|
uint16_t mode,
|
||||||
|
int16_t argc,
|
||||||
|
char **argn,
|
||||||
|
char **argv,
|
||||||
|
NPSavedData *saved)
|
||||||
|
{
|
||||||
|
/* instance initialization function */
|
||||||
|
PluginData *data;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
g_debug ("plugin created");
|
||||||
|
|
||||||
|
if (!check_origin_and_protocol (instance))
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
|
|
||||||
|
data = g_slice_new (PluginData);
|
||||||
|
instance->pdata = data;
|
||||||
|
|
||||||
|
data->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||||
|
G_DBUS_PROXY_FLAGS_NONE,
|
||||||
|
NULL, /* interface info */
|
||||||
|
"org.gnome.Shell",
|
||||||
|
"/org/gnome/Shell",
|
||||||
|
"org.gnome.Shell.Extensions",
|
||||||
|
NULL, /* GCancellable */
|
||||||
|
&error);
|
||||||
|
if (!data->proxy)
|
||||||
|
{
|
||||||
|
/* ignore error if the shell is not running, otherwise warn */
|
||||||
|
if (error->domain != G_DBUS_ERROR ||
|
||||||
|
error->code != G_DBUS_ERROR_NAME_HAS_NO_OWNER)
|
||||||
|
{
|
||||||
|
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
||||||
|
}
|
||||||
|
g_clear_error (&error);
|
||||||
|
return NPERR_GENERIC_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_debug ("plugin created successfully");
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
NPError
|
||||||
|
NPP_Destroy(NPP instance,
|
||||||
|
NPSavedData **saved)
|
||||||
|
{
|
||||||
|
/* instance finalization function */
|
||||||
|
|
||||||
|
PluginData *data = instance->pdata;
|
||||||
|
|
||||||
|
g_debug ("plugin destroyed");
|
||||||
|
|
||||||
|
g_object_unref (data->proxy);
|
||||||
|
|
||||||
|
g_slice_free (PluginData, data);
|
||||||
|
|
||||||
|
return NPERR_NO_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
/* =================== scripting interface =================== */
|
/* =================== scripting interface =================== */
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -211,18 +330,45 @@ static NPObject *
|
|||||||
plugin_object_allocate (NPP instance,
|
plugin_object_allocate (NPP instance,
|
||||||
NPClass *klass)
|
NPClass *klass)
|
||||||
{
|
{
|
||||||
PluginObject *obj = (PluginObject *) funcs.memalloc (sizeof (PluginObject));
|
PluginData *data = instance->pdata;
|
||||||
|
PluginObject *obj = g_slice_new0 (PluginObject);
|
||||||
|
|
||||||
memset (obj, 0, sizeof (PluginObject));
|
|
||||||
obj->instance = instance;
|
obj->instance = instance;
|
||||||
|
obj->proxy = g_object_ref (data->proxy);
|
||||||
|
obj->settings = g_settings_new (SHELL_SCHEMA);
|
||||||
|
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
||||||
|
G_CALLBACK (on_shell_signal), obj);
|
||||||
|
|
||||||
return (NPObject*) obj;
|
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
||||||
|
"org.gnome.Shell",
|
||||||
|
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
||||||
|
on_shell_appeared,
|
||||||
|
NULL,
|
||||||
|
obj,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
g_debug ("plugin object created");
|
||||||
|
|
||||||
|
return (NPObject*)obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
plugin_object_deallocate (NPObject *npobj)
|
plugin_object_deallocate (NPObject *npobj)
|
||||||
{
|
{
|
||||||
funcs.memfree (npobj);
|
PluginObject *obj = (PluginObject*)npobj;
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
||||||
|
g_object_unref (obj->proxy);
|
||||||
|
|
||||||
|
if (obj->listener)
|
||||||
|
funcs.releaseobject (obj->listener);
|
||||||
|
|
||||||
|
if (obj->watch_name_id)
|
||||||
|
g_bus_unwatch_name (obj->watch_name_id);
|
||||||
|
|
||||||
|
g_debug ("plugin object destroyed");
|
||||||
|
|
||||||
|
g_slice_free (PluginObject, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
@ -873,149 +1019,6 @@ init_methods_and_properties (void)
|
|||||||
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* =============== public entry points =================== */
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
|
||||||
{
|
|
||||||
/* global initialization routine, called once when plugin
|
|
||||||
is loaded */
|
|
||||||
|
|
||||||
g_debug ("plugin loaded");
|
|
||||||
|
|
||||||
memcpy (&funcs, pfuncs, sizeof (funcs));
|
|
||||||
|
|
||||||
plugin->size = sizeof(NPPluginFuncs);
|
|
||||||
plugin->newp = NPP_New;
|
|
||||||
plugin->destroy = NPP_Destroy;
|
|
||||||
plugin->getvalue = NPP_GetValue;
|
|
||||||
plugin->setwindow = NPP_SetWindow;
|
|
||||||
plugin->event = NPP_HandleEvent;
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_Shutdown(void)
|
|
||||||
{
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char*
|
|
||||||
NP_GetMIMEDescription(void)
|
|
||||||
{
|
|
||||||
return PLUGIN_MIME_STRING;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NP_GetValue(void *instance,
|
|
||||||
NPPVariable variable,
|
|
||||||
void *value)
|
|
||||||
{
|
|
||||||
switch (variable) {
|
|
||||||
case NPPVpluginNameString:
|
|
||||||
*(char**)value = PLUGIN_NAME;
|
|
||||||
break;
|
|
||||||
case NPPVpluginDescriptionString:
|
|
||||||
*(char**)value = PLUGIN_DESCRIPTION;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NPP_New(NPMIMEType mimetype,
|
|
||||||
NPP instance,
|
|
||||||
uint16_t mode,
|
|
||||||
int16_t argc,
|
|
||||||
char **argn,
|
|
||||||
char **argv,
|
|
||||||
NPSavedData *saved)
|
|
||||||
{
|
|
||||||
/* instance initialization function */
|
|
||||||
PluginObject *obj;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
g_debug ("plugin created");
|
|
||||||
|
|
||||||
if (!check_origin_and_protocol (instance))
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
|
|
||||||
/* set windowless mode */
|
|
||||||
funcs.setvalue(instance, NPPVpluginWindowBool, NULL);
|
|
||||||
|
|
||||||
g_debug ("creating scriptable object");
|
|
||||||
init_methods_and_properties ();
|
|
||||||
obj = (PluginObject *) funcs.createobject (instance, &plugin_class);
|
|
||||||
instance->pdata = obj;
|
|
||||||
|
|
||||||
obj->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
|
||||||
G_DBUS_PROXY_FLAGS_NONE,
|
|
||||||
NULL, /* interface info */
|
|
||||||
"org.gnome.Shell",
|
|
||||||
"/org/gnome/Shell",
|
|
||||||
"org.gnome.Shell.Extensions",
|
|
||||||
NULL, /* GCancellable */
|
|
||||||
&error);
|
|
||||||
if (!obj->proxy)
|
|
||||||
{
|
|
||||||
/* ignore error if the shell is not running, otherwise warn */
|
|
||||||
if (!g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER))
|
|
||||||
{
|
|
||||||
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
|
||||||
}
|
|
||||||
g_clear_error (&error);
|
|
||||||
return NPERR_GENERIC_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj->settings = g_settings_new (SHELL_SCHEMA);
|
|
||||||
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
|
||||||
G_CALLBACK (on_shell_signal), obj);
|
|
||||||
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
|
||||||
"org.gnome.Shell",
|
|
||||||
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
|
||||||
on_shell_appeared,
|
|
||||||
NULL,
|
|
||||||
obj,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
g_debug ("plugin created successfully");
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
|
||||||
NPP_Destroy(NPP instance,
|
|
||||||
NPSavedData **saved)
|
|
||||||
{
|
|
||||||
/* instance finalization function */
|
|
||||||
PluginObject *obj = (PluginObject *) instance->pdata;
|
|
||||||
|
|
||||||
if (!obj)
|
|
||||||
return NPERR_INVALID_INSTANCE_ERROR;
|
|
||||||
|
|
||||||
g_debug ("plugin destroyed");
|
|
||||||
|
|
||||||
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
|
||||||
g_object_unref (obj->proxy);
|
|
||||||
|
|
||||||
if (obj->listener)
|
|
||||||
funcs.releaseobject (obj->listener);
|
|
||||||
|
|
||||||
if (obj->restart_listener)
|
|
||||||
funcs.releaseobject (obj->restart_listener);
|
|
||||||
|
|
||||||
if (obj->watch_name_id)
|
|
||||||
g_bus_unwatch_name (obj->watch_name_id);
|
|
||||||
|
|
||||||
funcs.releaseobject((NPObject *)obj);
|
|
||||||
|
|
||||||
return NPERR_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
NPError
|
NPError
|
||||||
NPP_GetValue(NPP instance,
|
NPP_GetValue(NPP instance,
|
||||||
NPPVariable variable,
|
NPPVariable variable,
|
||||||
@ -1026,11 +1029,13 @@ NPP_GetValue(NPP instance,
|
|||||||
switch (variable) {
|
switch (variable) {
|
||||||
case NPPVpluginScriptableNPObject:
|
case NPPVpluginScriptableNPObject:
|
||||||
g_debug ("creating scriptable object");
|
g_debug ("creating scriptable object");
|
||||||
if (!instance->pdata)
|
init_methods_and_properties ();
|
||||||
return NPERR_INVALID_INSTANCE_ERROR;
|
|
||||||
|
|
||||||
funcs.retainobject (instance->pdata);
|
*(NPObject**)value = funcs.createobject (instance, &plugin_class);
|
||||||
*(NPObject**)value = instance->pdata;
|
break;
|
||||||
|
|
||||||
|
case NPPVpluginNeedsXEmbed:
|
||||||
|
*(bool *)value = TRUE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1048,11 +1053,3 @@ NPP_SetWindow(NPP instance,
|
|||||||
{
|
{
|
||||||
return NPERR_NO_ERROR;
|
return NPERR_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t
|
|
||||||
NPP_HandleEvent(NPP instance,
|
|
||||||
void *event)
|
|
||||||
{
|
|
||||||
/* Ignore the event */
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
plugin_sources = [
|
|
||||||
'browser-plugin.c',
|
|
||||||
'npapi/npapi.h',
|
|
||||||
'npapi/npfunctions.h',
|
|
||||||
'npapi/npruntime.h',
|
|
||||||
'npapi/nptypes.h'
|
|
||||||
]
|
|
||||||
|
|
||||||
shared_module('gnome-shell-browser-plugin', plugin_sources,
|
|
||||||
dependencies: [gio_dep, json_glib_dep],
|
|
||||||
c_args: ['-DG_LOG_DOMAIN="GnomeShellBrowserPlugin"'],
|
|
||||||
# Browsers can unload and reload the module while browsing, which is not
|
|
||||||
# supported by GObject.
|
|
||||||
# We pass -Wl,-z,nodelete to the linker to ensure the module is never
|
|
||||||
# unloaded. See https://bugzilla.gnome.org/show_bug.cgi?id=737932.
|
|
||||||
link_args: ['-Wl,-z,nodelete'],
|
|
||||||
install: true,
|
|
||||||
install_dir: plugindir
|
|
||||||
)
|
|
@ -1,26 +0,0 @@
|
|||||||
/* The prefix for our gettext translation domains. */
|
|
||||||
#mesondefine GETTEXT_PACKAGE
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#mesondefine VERSION
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#mesondefine PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fdwalk' function. */
|
|
||||||
#mesondefine HAVE_FDWALK
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mallinfo' function. */
|
|
||||||
#mesondefine HAVE_MALLINFO
|
|
||||||
|
|
||||||
/* Define to 1 fi you have the <sys/resource.h> header file. */
|
|
||||||
#mesondefine HAVE_SYS_RESOURCE_H
|
|
||||||
|
|
||||||
/* Define if we have NetworkManager */
|
|
||||||
#mesondefine HAVE_NETWORKMANAGER
|
|
||||||
|
|
||||||
/* Define if we have systemd */
|
|
||||||
#mesondefine HAVE_SYSTEMD
|
|
||||||
|
|
||||||
/* Define if _NL_TIME_FIRST_WEEKDATE is available */
|
|
||||||
#mesondefine HAVE__NL_TIME_FIRST_WEEKDAY
|
|
158
configure
vendored
158
configure
vendored
@ -1,158 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# configure script adapter for Meson
|
|
||||||
# Based on build-api: https://github.com/cgwalters/build-api
|
|
||||||
# Copyright 2010, 2011, 2013 Colin Walters <walters@verbum.org>
|
|
||||||
# Copyright 2016, 2017 Emmanuele Bassi
|
|
||||||
# Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php)
|
|
||||||
|
|
||||||
# Build API variables:
|
|
||||||
|
|
||||||
# Little helper function for reading args from the commandline.
|
|
||||||
# it automatically handles -a b and -a=b variants, and returns 1 if
|
|
||||||
# we need to shift $3.
|
|
||||||
read_arg() {
|
|
||||||
# $1 = arg name
|
|
||||||
# $2 = arg value
|
|
||||||
# $3 = arg parameter
|
|
||||||
local rematch='^[^=]*=(.*)$'
|
|
||||||
if [[ $2 =~ $rematch ]]; then
|
|
||||||
read "$1" <<< "${BASH_REMATCH[1]}"
|
|
||||||
else
|
|
||||||
read "$1" <<< "$3"
|
|
||||||
# There is no way to shift our callers args, so
|
|
||||||
# return 1 to indicate they should do it instead.
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
sanitycheck() {
|
|
||||||
# $1 = arg name
|
|
||||||
# $1 = arg command
|
|
||||||
# $2 = arg alternates
|
|
||||||
local cmd=$( which $2 2>/dev/null )
|
|
||||||
|
|
||||||
if [ -x "$cmd" ]; then
|
|
||||||
read "$1" <<< "$cmd"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
test -z $3 || {
|
|
||||||
for alt in $3; do
|
|
||||||
cmd=$( which $alt 2>/dev/null )
|
|
||||||
|
|
||||||
if [ -x "$cmd" ]; then
|
|
||||||
read "$1" <<< "$cmd"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
echo -e "\e[1;31mERROR\e[0m: Command '$2' not found"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
sanitycheck MESON 'meson'
|
|
||||||
sanitycheck NINJA 'ninja' 'ninja-build'
|
|
||||||
|
|
||||||
enable_docs='-Denable-gtk-doc=false'
|
|
||||||
enable_man='-Denable-man=false'
|
|
||||||
enable_introspection=''
|
|
||||||
|
|
||||||
while (($# > 0)); do
|
|
||||||
case "${1%%=*}" in
|
|
||||||
--prefix) read_arg prefix "$@" || shift;;
|
|
||||||
--bindir) read_arg bindir "$@" || shift;;
|
|
||||||
--sbindir) read_arg sbindir "$@" || shift;;
|
|
||||||
--libexecdir) read_arg libexecdir "$@" || shift;;
|
|
||||||
--datarootdir) read_arg datarootdir "$@" || shift;;
|
|
||||||
--datadir) read_arg datadir "$@" || shift;;
|
|
||||||
--sysconfdir) read_arg sysconfdir "$@" || shift;;
|
|
||||||
--libdir) read_arg libdir "$@" || shift;;
|
|
||||||
--mandir) read_arg mandir "$@" || shift;;
|
|
||||||
--includedir) read_arg includedir "$@" || shift;;
|
|
||||||
--enable-gtk-doc) enable_docs='-Denable-gtk-doc=true';;
|
|
||||||
--disable-gtk-doc) enable_docs='-Denable-gtk-doc=false';;
|
|
||||||
--enable-man) enable_man='-Denable-man=true';;
|
|
||||||
--disable-man) enable_man='-Denable-man=false';;
|
|
||||||
--enable-introspection) enable_introspection='';;
|
|
||||||
--disable-introspection) enable_introspection='-Ddisable_introspection=true';;
|
|
||||||
*) echo -e "\e[1;33mINFO\e[0m: Ignoring unknown option '$1'";;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
# Defaults
|
|
||||||
test -z ${prefix} && prefix="/usr/local"
|
|
||||||
test -z ${bindir} && bindir=${prefix}/bin
|
|
||||||
test -z ${sbindir} && sbindir=${prefix}/sbin
|
|
||||||
test -z ${libexecdir} && libexecdir=${prefix}/bin
|
|
||||||
test -z ${datarootdir} && datarootdir=${prefix}/share
|
|
||||||
test -z ${datadir} && datadir=${datarootdir}
|
|
||||||
test -z ${sysconfdir} && sysconfdir=${prefix}/etc
|
|
||||||
test -z ${libdir} && libdir=${prefix}/lib
|
|
||||||
test -z ${mandir} && mandir=${prefix}/share/man
|
|
||||||
test -z ${includedir} && includedir=${prefix}/include
|
|
||||||
|
|
||||||
# The source directory is the location of this file
|
|
||||||
srcdir=$(dirname $0)
|
|
||||||
|
|
||||||
# The build directory is the current location
|
|
||||||
builddir=`pwd`
|
|
||||||
|
|
||||||
# If we're calling this file from the source directory then
|
|
||||||
# we automatically create a build directory and ensure that
|
|
||||||
# both Meson and Ninja invocations are relative to that
|
|
||||||
# location
|
|
||||||
if [[ -f "${builddir}/meson.build" ]]; then
|
|
||||||
mkdir -p _build
|
|
||||||
builddir="${builddir}/_build"
|
|
||||||
NINJA_OPT="-C ${builddir}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Wrapper Makefile for Ninja
|
|
||||||
cat > Makefile <<END
|
|
||||||
# Generated by configure; do not edit
|
|
||||||
|
|
||||||
all:
|
|
||||||
CC="\$(CC)" CXX="\$(CXX)" ${NINJA} ${NINJA_OPT}
|
|
||||||
|
|
||||||
install:
|
|
||||||
DESTDIR="\$(DESTDIR)" ${NINJA} ${NINJA_OPT} install
|
|
||||||
|
|
||||||
check:
|
|
||||||
${MESON} test ${NINJA_OPT}
|
|
||||||
END
|
|
||||||
|
|
||||||
echo "Summary:"
|
|
||||||
echo " meson:....... ${MESON}"
|
|
||||||
echo " ninja:....... ${NINJA}"
|
|
||||||
echo " prefix:...... ${prefix}"
|
|
||||||
echo " bindir:...... ${bindir}"
|
|
||||||
echo " sbindir:..... ${sbindir}"
|
|
||||||
echo " libexecdir:.. ${libexecdir}"
|
|
||||||
echo " datarootdir:. ${datarootdir}"
|
|
||||||
echo " datadir:..... ${datadir}"
|
|
||||||
echo " sysconfdir:.. ${sysconfdir}"
|
|
||||||
echo " libdir:...... ${libdir}"
|
|
||||||
echo " mandir:...... ${mandir}"
|
|
||||||
echo " includedir:.. ${includedir}"
|
|
||||||
echo " additional:.."
|
|
||||||
echo " - ${enable_docs} ${enable_man} ${enable_introspection}"
|
|
||||||
|
|
||||||
exec ${MESON} \
|
|
||||||
--prefix=${prefix} \
|
|
||||||
--libdir=${libdir} \
|
|
||||||
--libexecdir=${libexecdir} \
|
|
||||||
--datadir=${datadir} \
|
|
||||||
--sysconfdir=${sysconfdir} \
|
|
||||||
--bindir=${bindir} \
|
|
||||||
--includedir=${includedir} \
|
|
||||||
--mandir=${mandir} \
|
|
||||||
--default-library shared \
|
|
||||||
${enable_docs} \
|
|
||||||
${enable_man} \
|
|
||||||
${enable_introspection} \
|
|
||||||
${builddir} \
|
|
||||||
${srcdir}
|
|
||||||
|
|
||||||
# vim: ai ts=8 noet sts=2 ft=sh
|
|
276
configure.ac
Normal file
276
configure.ac
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
AC_PREREQ(2.63)
|
||||||
|
AC_INIT([gnome-shell],[3.17.92],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
|
AC_CONFIG_HEADERS([config.h])
|
||||||
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
AC_CONFIG_AUX_DIR([config])
|
||||||
|
|
||||||
|
AC_SUBST([PACKAGE_NAME], ["$PACKAGE_NAME"])
|
||||||
|
AC_SUBST([PACKAGE_VERSION], ["$PACKAGE_VERSION"])
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar foreign])
|
||||||
|
AM_MAINTAINER_MODE([enable])
|
||||||
|
|
||||||
|
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_CXX
|
||||||
|
|
||||||
|
# Initialize libtool
|
||||||
|
LT_PREREQ([2.2.6])
|
||||||
|
LT_INIT([disable-static])
|
||||||
|
|
||||||
|
# i18n
|
||||||
|
IT_PROG_INTLTOOL([0.40])
|
||||||
|
|
||||||
|
GETTEXT_PACKAGE=gnome-shell
|
||||||
|
AC_SUBST(GETTEXT_PACKAGE)
|
||||||
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
||||||
|
[The prefix for our gettext translation domains.])
|
||||||
|
|
||||||
|
PKG_PROG_PKG_CONFIG([0.22])
|
||||||
|
|
||||||
|
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
||||||
|
|
||||||
|
GLIB_GSETTINGS
|
||||||
|
|
||||||
|
# Get a value to substitute into gnome-shell.in
|
||||||
|
AM_PATH_PYTHON([3])
|
||||||
|
AC_SUBST(PYTHON)
|
||||||
|
|
||||||
|
# We need at least this, since gst_plugin_register_static() was added
|
||||||
|
# in 0.10.16, but nothing older than 0.10.21 has been tested.
|
||||||
|
GSTREAMER_MIN_VERSION=0.11.92
|
||||||
|
|
||||||
|
recorder_modules=
|
||||||
|
build_recorder=false
|
||||||
|
AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
|
||||||
|
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
build_recorder=true
|
||||||
|
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
|
||||||
|
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([systemd],
|
||||||
|
AS_HELP_STRING([--enable-systemd], [Use systemd]),
|
||||||
|
[enable_systemd=$enableval],
|
||||||
|
[enable_systemd=auto])
|
||||||
|
AS_IF([test x$enable_systemd != xno], [
|
||||||
|
AC_MSG_CHECKING([for libsystemd])
|
||||||
|
PKG_CHECK_EXISTS([libsystemd],
|
||||||
|
[have_systemd=yes
|
||||||
|
AC_DEFINE([HAVE_SYSTEMD], [1], [Define if we have systemd])],
|
||||||
|
[have_systemd=no])
|
||||||
|
AC_MSG_RESULT($have_systemd)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_MSG_RESULT($enable_systemd)
|
||||||
|
|
||||||
|
CLUTTER_MIN_VERSION=1.21.5
|
||||||
|
GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4
|
||||||
|
GJS_MIN_VERSION=1.39.0
|
||||||
|
MUTTER_MIN_VERSION=3.17.92
|
||||||
|
GTK_MIN_VERSION=3.15.0
|
||||||
|
GIO_MIN_VERSION=2.45.3
|
||||||
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
|
LIBEDATASERVER_MIN_VERSION=3.17.2
|
||||||
|
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
||||||
|
POLKIT_MIN_VERSION=0.100
|
||||||
|
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||||
|
GCR_MIN_VERSION=3.7.5
|
||||||
|
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
||||||
|
NETWORKMANAGER_MIN_VERSION=0.9.8
|
||||||
|
PULSE_MIN_VERS=2.0
|
||||||
|
|
||||||
|
# Collect more than 20 libraries for a prize!
|
||||||
|
SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||||
|
libxml-2.0
|
||||||
|
gtk+-3.0 >= $GTK_MIN_VERSION
|
||||||
|
atk-bridge-2.0
|
||||||
|
gjs-internals-1.0 >= $GJS_MIN_VERSION
|
||||||
|
$recorder_modules
|
||||||
|
gdk-x11-3.0 libsoup-2.4
|
||||||
|
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
||||||
|
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
||||||
|
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
||||||
|
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
||||||
|
libcanberra libcanberra-gtk3
|
||||||
|
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
||||||
|
polkit-agent-1 >= $POLKIT_MIN_VERSION
|
||||||
|
gcr-base-3 >= $GCR_MIN_VERSION"
|
||||||
|
if test x$have_systemd = xyes; then
|
||||||
|
SHARED_PCS="${SHARED_PCS} libsystemd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
|
||||||
|
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
||||||
|
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
||||||
|
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||||
|
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
||||||
|
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||||
|
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
|
||||||
|
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.13.1)
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(browser-plugin,
|
||||||
|
[AS_HELP_STRING([--enable-browser-plugin],
|
||||||
|
[Enable browser plugin [default=yes]])],,
|
||||||
|
enable_browser_plugin=yes)
|
||||||
|
AS_IF([test x$enable_browser_plugin = xyes], [
|
||||||
|
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
|
||||||
|
])
|
||||||
|
AM_CONDITIONAL(BUILD_BROWSER_PLUGIN, test x$enable_browser_plugin = xyes)
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(BLUETOOTH, gnome-bluetooth-1.0 >= 3.9.0,
|
||||||
|
[AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
|
||||||
|
AC_SUBST([HAVE_BLUETOOTH],[1])],
|
||||||
|
[AC_DEFINE([HAVE_BLUETOOTH],[0])
|
||||||
|
AC_SUBST([HAVE_BLUETOOTH],[0])])
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
|
||||||
|
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
||||||
|
AC_SUBST(CALENDAR_SERVER_LIBS)
|
||||||
|
|
||||||
|
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
|
||||||
|
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
|
||||||
|
|
||||||
|
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
||||||
|
|
||||||
|
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
|
||||||
|
AC_SUBST(MUTTER_GIR_DIR)
|
||||||
|
|
||||||
|
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
|
||||||
|
AC_SUBST(MUTTER_TYPELIB_DIR)
|
||||||
|
|
||||||
|
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
||||||
|
AC_SUBST(GJS_CONSOLE)
|
||||||
|
|
||||||
|
GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
|
||||||
|
AC_SUBST(GLIB_COMPILE_RESOURCES)
|
||||||
|
|
||||||
|
AC_CHECK_FUNCS(fdwalk)
|
||||||
|
AC_CHECK_FUNCS(mallinfo)
|
||||||
|
AC_CHECK_HEADERS([sys/resource.h])
|
||||||
|
|
||||||
|
# _NL_TIME_FIRST_WEEKDAY is an enum and not a define
|
||||||
|
AC_MSG_CHECKING([for _NL_TIME_FIRST_WEEKDAY])
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <langinfo.h>]],
|
||||||
|
[[nl_langinfo(_NL_TIME_FIRST_WEEKDAY);]])],
|
||||||
|
[langinfo_ok=yes], [langinfo_ok=no])
|
||||||
|
AC_MSG_RESULT($langinfo_ok)
|
||||||
|
if test "$langinfo_ok" = "yes"; then
|
||||||
|
AC_DEFINE([HAVE__NL_TIME_FIRST_WEEKDAY], [1],
|
||||||
|
[Define if _NL_TIME_FIRST_WEEKDAY is available])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(networkmanager,
|
||||||
|
AS_HELP_STRING([--disable-networkmanager],
|
||||||
|
[disable NetworkManager support @<:@default=auto@:>@]),,
|
||||||
|
[enable_networkmanager=auto])
|
||||||
|
|
||||||
|
if test "x$enable_networkmanager" != "xno"; then
|
||||||
|
PKG_CHECK_MODULES(NETWORKMANAGER,
|
||||||
|
[libnm-glib
|
||||||
|
libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
||||||
|
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
||||||
|
libsecret-unstable],
|
||||||
|
[have_networkmanager=yes],
|
||||||
|
[have_networkmanager=no])
|
||||||
|
|
||||||
|
GNOME_SHELL_CFLAGS="$GNOME_SHELL_CFLAGS $NETWORKMANAGER_CFLAGS"
|
||||||
|
GNOME_SHELL_LIBS="$GNOME_SHELL_LIBS $NETWORKMANAGER_LIBS"
|
||||||
|
else
|
||||||
|
have_networkmanager="no (disabled)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "x$have_networkmanager" = "xyes"; then
|
||||||
|
AC_DEFINE(HAVE_NETWORKMANAGER, [1], [Define if we have NetworkManager])
|
||||||
|
AC_SUBST([HAVE_NETWORKMANAGER], [1])
|
||||||
|
else
|
||||||
|
if test "x$enable_networkmanager" = "xyes"; then
|
||||||
|
AC_MSG_ERROR([Couldn't find NetworkManager.])
|
||||||
|
fi
|
||||||
|
AC_SUBST([HAVE_NETWORKMANAGER], [0])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_CONDITIONAL(HAVE_NETWORKMANAGER, test "$have_networkmanager" = "yes")
|
||||||
|
|
||||||
|
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||||
|
AM_PATH_GLIB_2_0()
|
||||||
|
|
||||||
|
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(man,
|
||||||
|
[AS_HELP_STRING([--enable-man],
|
||||||
|
[generate man pages [default=yes]])],,
|
||||||
|
enable_man=yes)
|
||||||
|
if test "$enable_man" != no; then
|
||||||
|
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
||||||
|
if test -z "$XSLTPROC"; then
|
||||||
|
AC_MSG_ERROR([xsltproc is required for --enable-man])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
||||||
|
|
||||||
|
GNOME_COMPILE_WARNINGS([error])
|
||||||
|
case "$WARN_CFLAGS" in
|
||||||
|
*-Werror*)
|
||||||
|
WARN_CFLAGS="$WARN_CFLAGS -Wno-error=deprecated-declarations"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
|
||||||
|
AC_SUBST(AM_CFLAGS)
|
||||||
|
|
||||||
|
if test -z "${BROWSER_PLUGIN_DIR}"; then
|
||||||
|
BROWSER_PLUGIN_DIR="\${libdir}/mozilla/plugins"
|
||||||
|
fi
|
||||||
|
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
|
||||||
|
|
||||||
|
AC_ARG_VAR([GDBUS_CODEGEN],[the gdbus-codegen programme])
|
||||||
|
AC_PATH_PROG([GDBUS_CODEGEN],[gdbus-codegen],[])
|
||||||
|
if test -z "$GDBUS_CODEGEN"; then
|
||||||
|
AC_MSG_ERROR([gdbus-codegen not found])
|
||||||
|
fi
|
||||||
|
|
||||||
|
AC_PATH_PROG([SASS],[sass],[])
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([
|
||||||
|
Makefile
|
||||||
|
data/Makefile
|
||||||
|
docs/Makefile
|
||||||
|
docs/reference/Makefile
|
||||||
|
docs/reference/shell/Makefile
|
||||||
|
docs/reference/shell/shell-docs.sgml
|
||||||
|
docs/reference/st/Makefile
|
||||||
|
docs/reference/st/st-docs.sgml
|
||||||
|
js/Makefile
|
||||||
|
src/calendar-server/evolution-calendar.desktop.in
|
||||||
|
src/Makefile
|
||||||
|
src/gvc/Makefile
|
||||||
|
browser-plugin/Makefile
|
||||||
|
tests/Makefile
|
||||||
|
po/Makefile.in
|
||||||
|
man/Makefile
|
||||||
|
])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
|
echo "
|
||||||
|
Build configuration:
|
||||||
|
|
||||||
|
Prefix: ${prefix}
|
||||||
|
Source code location: ${srcdir}
|
||||||
|
Compiler: ${CC}
|
||||||
|
Compiler Warnings: $enable_compile_warnings
|
||||||
|
|
||||||
|
Support for NetworkManager: $have_networkmanager
|
||||||
|
Support for GStreamer recording: $build_recorder
|
||||||
|
"
|
@ -1,24 +1,24 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<KeyListEntries schema="org.gnome.shell.keybindings"
|
<KeyListEntries schema="org.gnome.shell.keybindings"
|
||||||
group="system"
|
group="system"
|
||||||
name="System"
|
_name="System"
|
||||||
wm_name="GNOME Shell"
|
wm_name="GNOME Shell"
|
||||||
package="gnome-shell">
|
package="gnome-shell">
|
||||||
|
|
||||||
<KeyListEntry name="toggle-message-tray"
|
<KeyListEntry name="toggle-message-tray"
|
||||||
description="Show the notification list"/>
|
_description="Show the notification list"/>
|
||||||
|
|
||||||
<KeyListEntry name="focus-active-notification"
|
<KeyListEntry name="focus-active-notification"
|
||||||
description="Focus the active notification"/>
|
_description="Focus the active notification"/>
|
||||||
|
|
||||||
<KeyListEntry name="toggle-overview"
|
<KeyListEntry name="toggle-overview"
|
||||||
description="Show the overview"/>
|
_description="Show the overview"/>
|
||||||
|
|
||||||
<KeyListEntry name="toggle-application-view"
|
<KeyListEntry name="toggle-application-view"
|
||||||
description="Show all applications"/>
|
_description="Show all applications"/>
|
||||||
|
|
||||||
<KeyListEntry name="open-application-menu"
|
<KeyListEntry name="open-application-menu"
|
||||||
description="Open the application menu"/>
|
_description="Open the application menu"/>
|
||||||
|
|
||||||
</KeyListEntries>
|
</KeyListEntries>
|
||||||
|
|
135
data/Makefile.am
Normal file
135
data/Makefile.am
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
CLEANFILES =
|
||||||
|
NULL =
|
||||||
|
|
||||||
|
desktopdir=$(datadir)/applications
|
||||||
|
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop
|
||||||
|
|
||||||
|
if HAVE_NETWORKMANAGER
|
||||||
|
desktop_DATA += org.gnome.Shell.PortalHelper.desktop
|
||||||
|
|
||||||
|
servicedir = $(datadir)/dbus-1/services
|
||||||
|
service_DATA = org.gnome.Shell.PortalHelper.service
|
||||||
|
|
||||||
|
CLEANFILES += \
|
||||||
|
org.gnome.Shell.PortalHelper.service \
|
||||||
|
org.gnome.Shell.PortalHelper.desktop \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
%.service: %.service.in
|
||||||
|
$(AM_V_GEN) sed -e "s|@libexecdir[@]|$(libexecdir)|" \
|
||||||
|
$< > $@ || rm $@
|
||||||
|
|
||||||
|
# We substitute in bindir so it works as an autostart
|
||||||
|
# file when built in a non-system prefix
|
||||||
|
%.desktop.in:%.desktop.in.in
|
||||||
|
$(AM_V_GEN) sed -e "s|@bindir[@]|$(bindir)|" \
|
||||||
|
-e "s|@VERSION[@]|$(VERSION)|" \
|
||||||
|
$< > $@ || rm $@
|
||||||
|
|
||||||
|
@INTLTOOL_DESKTOP_RULE@
|
||||||
|
|
||||||
|
introspectiondir = $(datadir)/dbus-1/interfaces
|
||||||
|
introspection_DATA = \
|
||||||
|
org.gnome.Shell.Screencast.xml \
|
||||||
|
org.gnome.Shell.Screenshot.xml \
|
||||||
|
org.gnome.ShellSearchProvider.xml \
|
||||||
|
org.gnome.ShellSearchProvider2.xml \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
theme_sources = \
|
||||||
|
theme/gnome-shell-high-contrast.scss \
|
||||||
|
theme/gnome-shell.scss \
|
||||||
|
theme/gnome-shell-sass/_colors.scss \
|
||||||
|
theme/gnome-shell-sass/_common.scss \
|
||||||
|
theme/gnome-shell-sass/_drawing.scss \
|
||||||
|
theme/gnome-shell-sass/_high-contrast-colors.scss \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
dist_theme_files = \
|
||||||
|
$(theme_sources) \
|
||||||
|
theme/Gemfile \
|
||||||
|
theme/HACKING \
|
||||||
|
theme/README \
|
||||||
|
theme/gnome-shell-sass/COPYING \
|
||||||
|
theme/gnome-shell-sass/HACKING \
|
||||||
|
theme/gnome-shell-sass/NEWS \
|
||||||
|
theme/gnome-shell-sass/README \
|
||||||
|
theme/gnome-shell-sass/gnome-shell-sass.doap \
|
||||||
|
theme/parse-sass.sh \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
%.css: %.scss $(theme_sources)
|
||||||
|
@if test -n "$(SASS)"; then \
|
||||||
|
if $(AM_V_P); then PS4= set -x; else echo " GEN $@"; fi; \
|
||||||
|
$(SASS) --sourcemap=none -f -q --update $<; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/theme --generate-dependencies $(srcdir)/gnome-shell-theme.gresource.xml)
|
||||||
|
gnome-shell-theme.gresource: gnome-shell-theme.gresource.xml $(resource_files)
|
||||||
|
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir)/theme $<
|
||||||
|
resourcedir = $(pkgdatadir)
|
||||||
|
resource_DATA = gnome-shell-theme.gresource
|
||||||
|
|
||||||
|
backgrounddir = $(pkgdatadir)
|
||||||
|
background_DATA = perf-background.xml
|
||||||
|
|
||||||
|
perf-background.xml: perf-background.xml.in
|
||||||
|
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
|
||||||
|
$< > $@ || rm $@
|
||||||
|
|
||||||
|
keysdir = @GNOME_KEYBINDINGS_KEYSDIR@
|
||||||
|
keys_in_files = 50-gnome-shell-system.xml.in
|
||||||
|
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
||||||
|
|
||||||
|
gsettings_SCHEMAS = org.gnome.shell.gschema.xml
|
||||||
|
|
||||||
|
@INTLTOOL_XML_NOMERGE_RULE@
|
||||||
|
|
||||||
|
%.gschema.xml.in: %.gschema.xml.in.in Makefile
|
||||||
|
$(AM_V_GEN) sed -e 's|@GETTEXT_PACKAGE[@]|$(GETTEXT_PACKAGE)|g' \
|
||||||
|
$< > $@ || rm $@
|
||||||
|
|
||||||
|
@GSETTINGS_RULES@
|
||||||
|
|
||||||
|
# We need to compile schemas at make time
|
||||||
|
# to run from source tree
|
||||||
|
gschemas.compiled: $(gsettings_SCHEMAS:.xml=.valid)
|
||||||
|
$(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) --targetdir=. .
|
||||||
|
|
||||||
|
all-local: gschemas.compiled
|
||||||
|
|
||||||
|
convertdir = $(datadir)/GConf/gsettings
|
||||||
|
convert_DATA = gnome-shell-overrides.convert
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
gnome-shell.desktop.in.in \
|
||||||
|
gnome-shell-wayland.desktop.in.in \
|
||||||
|
gnome-shell-extension-prefs.desktop.in.in \
|
||||||
|
$(introspection_DATA) \
|
||||||
|
$(menu_DATA) \
|
||||||
|
$(convert_DATA) \
|
||||||
|
$(keys_in_files) \
|
||||||
|
$(dist_theme_files) \
|
||||||
|
perf-background.xml.in \
|
||||||
|
org.gnome.Shell.PortalHelper.desktop.in \
|
||||||
|
org.gnome.Shell.PortalHelper.service.in \
|
||||||
|
org.gnome.shell.gschema.xml.in.in \
|
||||||
|
gnome-shell-theme.gresource.xml \
|
||||||
|
$(resource_files) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
CLEANFILES += \
|
||||||
|
gnome-shell.desktop.in \
|
||||||
|
gnome-shell-wayland.desktop.in \
|
||||||
|
gnome-shell-extension-prefs.in \
|
||||||
|
$(desktop_DATA) \
|
||||||
|
$(keys_DATA) \
|
||||||
|
$(gsettings_SCHEMAS) \
|
||||||
|
perf-background.xml \
|
||||||
|
gschemas.compiled \
|
||||||
|
org.gnome.shell.gschema.valid \
|
||||||
|
org.gnome.shell.gschema.xml.in \
|
||||||
|
gnome-shell-theme.gresource \
|
||||||
|
$(NULL)
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Name=Shell Extensions
|
_Name=GNOME Shell Extension Preferences
|
||||||
Comment=Configure GNOME Shell Extensions
|
_Comment=Configure GNOME Shell Extensions
|
||||||
Exec=@bindir@/gnome-shell-extension-prefs %u
|
Exec=@bindir@/gnome-shell-extension-prefs %u
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
X-GNOME-Bugzilla-Product=gnome-shell
|
||||||
|
@ -9,8 +9,6 @@
|
|||||||
<file>checkbox-off.svg</file>
|
<file>checkbox-off.svg</file>
|
||||||
<file>checkbox.svg</file>
|
<file>checkbox.svg</file>
|
||||||
<file>close-window.svg</file>
|
<file>close-window.svg</file>
|
||||||
<file>close-window-active.svg</file>
|
|
||||||
<file>close-window-hover.svg</file>
|
|
||||||
<file>close.svg</file>
|
<file>close.svg</file>
|
||||||
<file>corner-ripple-ltr.png</file>
|
<file>corner-ripple-ltr.png</file>
|
||||||
<file>corner-ripple-rtl.png</file>
|
<file>corner-ripple-rtl.png</file>
|
||||||
@ -20,11 +18,10 @@
|
|||||||
<file>gnome-shell.css</file>
|
<file>gnome-shell.css</file>
|
||||||
<file>gnome-shell-high-contrast.css</file>
|
<file>gnome-shell-high-contrast.css</file>
|
||||||
<file>logged-in-indicator.svg</file>
|
<file>logged-in-indicator.svg</file>
|
||||||
<file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
|
<file>more-results.svg</file>
|
||||||
<file>no-events.svg</file>
|
<file>no-events.svg</file>
|
||||||
<file>no-notifications.svg</file>
|
<file>no-notifications.svg</file>
|
||||||
<file>noise-texture.png</file>
|
<file>noise-texture.png</file>
|
||||||
<file>pad-osd.css</file>
|
|
||||||
<file>page-indicator-active.svg</file>
|
<file>page-indicator-active.svg</file>
|
||||||
<file>page-indicator-inactive.svg</file>
|
<file>page-indicator-inactive.svg</file>
|
||||||
<file>page-indicator-checked.svg</file>
|
<file>page-indicator-checked.svg</file>
|
||||||
|
15
data/gnome-shell-wayland.desktop.in.in
Normal file
15
data/gnome-shell-wayland.desktop.in.in
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
_Name=GNOME Shell (wayland compositor)
|
||||||
|
_Comment=Window management and application launching
|
||||||
|
Exec=@bindir@/gnome-shell --wayland --display-server
|
||||||
|
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
|
||||||
|
X-GNOME-Autostart-Phase=DisplayServer
|
||||||
|
X-GNOME-Autostart-Notify=true
|
||||||
|
X-GNOME-AutoRestart=false
|
@ -1,7 +1,7 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Name=GNOME Shell
|
_Name=GNOME Shell
|
||||||
Comment=Window management and application launching
|
_Comment=Window management and application launching
|
||||||
Exec=@bindir@/gnome-shell
|
Exec=@bindir@/gnome-shell
|
||||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||||
X-GNOME-Bugzilla-Product=gnome-shell
|
X-GNOME-Bugzilla-Product=gnome-shell
|
||||||
@ -10,7 +10,7 @@ X-GNOME-Bugzilla-Version=@VERSION@
|
|||||||
Categories=GNOME;GTK;Core;
|
Categories=GNOME;GTK;Core;
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
X-GNOME-Autostart-Phase=DisplayServer
|
X-GNOME-Autostart-Phase=WindowManager
|
||||||
X-GNOME-Provides=panel;windowmanager;
|
X-GNOME-Provides=panel;windowmanager;
|
||||||
X-GNOME-Autostart-Notify=true
|
X-GNOME-Autostart-Notify=true
|
||||||
X-GNOME-AutoRestart=false
|
X-GNOME-AutoRestart=false
|
@ -1,4 +0,0 @@
|
|||||||
[portal]
|
|
||||||
DBusName=org.freedesktop.impl.portal.desktop.gnome
|
|
||||||
Interfaces=org.freedesktop.impl.portal.Access
|
|
||||||
UseIn=gnome
|
|
@ -1,95 +0,0 @@
|
|||||||
desktop_files = [
|
|
||||||
'org.gnome.Shell.desktop',
|
|
||||||
'gnome-shell-extension-prefs.desktop'
|
|
||||||
]
|
|
||||||
service_files = []
|
|
||||||
|
|
||||||
if have_networkmanager
|
|
||||||
desktop_files += 'org.gnome.Shell.PortalHelper.desktop'
|
|
||||||
service_files += 'org.gnome.Shell.PortalHelper.service'
|
|
||||||
endif
|
|
||||||
|
|
||||||
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())
|
|
||||||
foreach desktop_file : desktop_files
|
|
||||||
i18n.merge_file('desktop',
|
|
||||||
input: configure_file(
|
|
||||||
input: desktop_file + '.in.in',
|
|
||||||
output: desktop_file + '.in',
|
|
||||||
configuration: desktopconf
|
|
||||||
),
|
|
||||||
output: desktop_file,
|
|
||||||
po_dir: '../po',
|
|
||||||
install: true,
|
|
||||||
install_dir: desktopdir,
|
|
||||||
type: 'desktop'
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
serviceconf = configuration_data()
|
|
||||||
serviceconf.set('libexecdir', libexecdir)
|
|
||||||
foreach service_file : service_files
|
|
||||||
configure_file(
|
|
||||||
input: service_file + '.in',
|
|
||||||
output: service_file,
|
|
||||||
configuration: serviceconf,
|
|
||||||
install_dir: servicedir
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
|
|
||||||
dbus_interfaces = [
|
|
||||||
'org.gnome.Shell.PadOsd.xml',
|
|
||||||
'org.gnome.Shell.Screencast.xml',
|
|
||||||
'org.gnome.Shell.Screenshot.xml',
|
|
||||||
'org.gnome.ShellSearchProvider.xml',
|
|
||||||
'org.gnome.ShellSearchProvider2.xml'
|
|
||||||
]
|
|
||||||
install_data(dbus_interfaces, install_dir: ifacedir)
|
|
||||||
|
|
||||||
|
|
||||||
subdir('theme')
|
|
||||||
|
|
||||||
theme_resources = gnome.compile_resources(
|
|
||||||
'gnome-shell-theme', 'gnome-shell-theme.gresource.xml',
|
|
||||||
source_dir: 'theme',
|
|
||||||
dependencies: theme_deps,
|
|
||||||
gresource_bundle: true,
|
|
||||||
install: true,
|
|
||||||
install_dir: pkgdatadir
|
|
||||||
)
|
|
||||||
|
|
||||||
perfconf = configuration_data()
|
|
||||||
perfconf.set('datadir', datadir)
|
|
||||||
configure_file(
|
|
||||||
input: 'perf-background.xml.in',
|
|
||||||
output: 'perf-background.xml',
|
|
||||||
configuration: perfconf,
|
|
||||||
install_dir: pkgdatadir
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
install_data('gnome-shell.portal', install_dir: portaldir)
|
|
||||||
install_data('50-gnome-shell-system.xml', install_dir: keysdir)
|
|
||||||
|
|
||||||
|
|
||||||
schemaconf = configuration_data()
|
|
||||||
schemaconf.set('GETTEXT_PACKAGE', meson.project_name())
|
|
||||||
schema = configure_file(
|
|
||||||
input: 'org.gnome.shell.gschema.xml.in',
|
|
||||||
output: 'org.gnome.shell.gschema.xml',
|
|
||||||
configuration: schemaconf,
|
|
||||||
install_dir: schemadir
|
|
||||||
)
|
|
||||||
|
|
||||||
# for unit tests - gnome.compile_schemas() only looks in srcdir
|
|
||||||
custom_target('compile-schemas',
|
|
||||||
input: schema,
|
|
||||||
output: 'gschemas.compiled',
|
|
||||||
command: [find_program('glib-compile-schemas'), meson.current_build_dir()],
|
|
||||||
build_by_default: true)
|
|
||||||
|
|
||||||
install_data('gnome-shell-overrides.convert', install_dir: convertdir)
|
|
@ -1,28 +0,0 @@
|
|||||||
<!DOCTYPE node PUBLIC
|
|
||||||
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
|
|
||||||
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
|
|
||||||
<node>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
org.gnome.Shell.PadOSD:
|
|
||||||
@short_description: Pad OSD interface
|
|
||||||
|
|
||||||
The interface used to show button map OSD on pad devices.
|
|
||||||
-->
|
|
||||||
<interface name='org.gnome.Shell.Wacom.PadOsd'>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Show:
|
|
||||||
@device_node: device node file, usually in /dev/input/...
|
|
||||||
@edition_mode: whether toggling edition mode on when showing
|
|
||||||
|
|
||||||
Shows the pad button map OSD for the requested device, the OSD
|
|
||||||
will be shown according the current device settings (output
|
|
||||||
mapping, left handed mode, ...)
|
|
||||||
-->
|
|
||||||
<method name='Show'>
|
|
||||||
<arg name='device_node' direction='in' type='o'/>
|
|
||||||
<arg name='edition_mode' direction='in' type='b'/>
|
|
||||||
</method>
|
|
||||||
</interface>
|
|
||||||
</node>
|
|
@ -1,10 +1,9 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Name=Network Login
|
_Name=Network Login
|
||||||
Type=Application
|
Type=Application
|
||||||
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
||||||
DBusActivatable=true
|
DBusActivatable=true
|
||||||
NoDisplay=true
|
NoDisplay=true
|
||||||
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
|
|
||||||
Icon=network-workgroup
|
Icon=network-workgroup
|
||||||
StartupNotify=true
|
StartupNotify=true
|
||||||
OnlyShowIn=GNOME;
|
OnlyShowIn=GNOME;
|
@ -3,139 +3,133 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="development-tools" type="b">
|
<key name="development-tools" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>
|
<_summary>
|
||||||
Enable internal tools useful for developers and testers from Alt-F2
|
Enable internal tools useful for developers and testers from Alt-F2
|
||||||
</summary>
|
</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Allows access to internal debugging and monitoring tools
|
Allows access to internal debugging and monitoring tools
|
||||||
using the Alt-F2 dialog.
|
using the Alt-F2 dialog.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="enabled-extensions" type="as">
|
<key name="enabled-extensions" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<summary>UUIDs of extensions to enable</summary>
|
<_summary>UUIDs of extensions to enable</_summary>
|
||||||
<description>
|
<_description>
|
||||||
GNOME Shell extensions have a UUID property; this key lists extensions
|
GNOME Shell extensions have a UUID property; this key lists extensions
|
||||||
which should be loaded. Any extension that wants to be loaded needs
|
which should be loaded. Any extension that wants to be loaded needs
|
||||||
to be in this list. You can also manipulate this list with the
|
to be in this list. You can also manipulate this list with the
|
||||||
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
|
||||||
<key name="disable-user-extensions" type="b">
|
|
||||||
<default>false</default>
|
|
||||||
<summary>Disable user extensions</summary>
|
|
||||||
<description>
|
|
||||||
Disable all extensions the user has enabled without affecting
|
|
||||||
the “enabled-extension” setting.
|
|
||||||
</description>
|
|
||||||
</key>
|
</key>
|
||||||
<key name="disable-extension-version-validation" type="b">
|
<key name="disable-extension-version-validation" type="b">
|
||||||
<default>true</default>
|
<default>false</default>
|
||||||
<summary>Disables the validation of extension version compatibility</summary>
|
<_summary>Disables the validation of extension version compatibility</_summary>
|
||||||
<description>
|
<_description>
|
||||||
GNOME Shell will only load extensions that claim to support the current
|
GNOME Shell will only load extensions that claim to support the current
|
||||||
running version. Enabling this option will disable this check and try to
|
running version. Enabling this option will disable this check and try to
|
||||||
load all extensions regardless of the versions they claim to support.
|
load all extensions regardless of the versions they claim to support.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="favorite-apps" type="as">
|
<key name="favorite-apps" type="as">
|
||||||
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||||
<summary>List of desktop file IDs for favorite applications</summary>
|
<_summary>List of desktop file IDs for favorite applications</_summary>
|
||||||
<description>
|
<_description>
|
||||||
The applications corresponding to these identifiers
|
The applications corresponding to these identifiers
|
||||||
will be displayed in the favorites area.
|
will be displayed in the favorites area.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="app-picker-view" type="u">
|
<key name="app-picker-view" type="u">
|
||||||
<default>0</default>
|
<default>0</default>
|
||||||
<summary>App Picker View</summary>
|
<_summary>App Picker View</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Index of the currently selected view in the application picker.
|
Index of the currently selected view in the application picker.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="command-history" type="as">
|
<key name="command-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<summary>History for command (Alt-F2) dialog</summary>
|
<_summary>History for command (Alt-F2) dialog</_summary>
|
||||||
</key>
|
</key>
|
||||||
<key name="looking-glass-history" type="as">
|
<key name="looking-glass-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<!-- Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass -->
|
<!-- Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass -->
|
||||||
<summary>History for the looking glass dialog</summary>
|
<_summary>History for the looking glass dialog</_summary>
|
||||||
</key>
|
</key>
|
||||||
<key name="always-show-log-out" type="b">
|
<key name="always-show-log-out" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Always show the “Log out” menu item in the user menu.</summary>
|
<_summary>Always show the 'Log out' menu item in the user menu.</_summary>
|
||||||
<description>
|
<_description>
|
||||||
This key overrides the automatic hiding of the “Log out”
|
This key overrides the automatic hiding of the 'Log out'
|
||||||
menu item in single-user, single-session situations.
|
menu item in single-user, single-session situations.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="remember-mount-password" type="b">
|
<key name="remember-mount-password" type="b">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Whether to remember password for mounting encrypted or remote filesystems</summary>
|
<_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary>
|
||||||
<description>
|
<_description>
|
||||||
The shell will request a password when an encrypted device or a
|
The shell will request a password when an encrypted device or a
|
||||||
remote filesystem is mounted. If the password can be saved for
|
remote filesystem is mounted. If the password can be saved for
|
||||||
future use a “Remember Password” checkbox will be present.
|
future use a 'Remember Password' checkbox will be present.
|
||||||
This key sets the default state of the checkbox.
|
This key sets the default state of the checkbox.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
|
||||||
<key name="had-bluetooth-devices-setup" type="b">
|
|
||||||
<default>false</default>
|
|
||||||
<summary>Whether the default Bluetooth adapter had set up devices associated to it</summary>
|
|
||||||
<description>
|
|
||||||
The shell will only show a Bluetooth menu item if a Bluetooth
|
|
||||||
adapter is powered, or if there were devices set up associated
|
|
||||||
with the default adapter. This will be reset if the default
|
|
||||||
adapter is ever seen not to have devices associated to it.
|
|
||||||
</description>
|
|
||||||
</key>
|
</key>
|
||||||
|
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
|
||||||
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
|
<key name="show-weekdate" type="b">
|
||||||
|
<default>false</default>
|
||||||
|
<_summary>Show the week date in the calendar</_summary>
|
||||||
|
<_description>
|
||||||
|
If true, display the ISO week date in the calendar.
|
||||||
|
</_description>
|
||||||
|
</key>
|
||||||
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="open-application-menu" type="as">
|
<key name="open-application-menu" type="as">
|
||||||
<default>["<Super>F10"]</default>
|
<default>["<Super>F10"]</default>
|
||||||
<summary>Keybinding to open the application menu</summary>
|
<_summary>Keybinding to open the application menu</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Keybinding to open the application menu.
|
Keybinding to open the application menu.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-application-view" type="as">
|
<key name="toggle-application-view" type="as">
|
||||||
<default>["<Super>a"]</default>
|
<default>["<Super>a"]</default>
|
||||||
<summary>Keybinding to open the “Show Applications” view</summary>
|
<_summary>Keybinding to open the "Show Applications" view</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Keybinding to open the “Show Applications” view of the Activities
|
Keybinding to open the "Show Applications" view of the Activities
|
||||||
Overview.
|
Overview.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-overview" type="as">
|
<key name="toggle-overview" type="as">
|
||||||
<default>["<Super>s"]</default>
|
<default>["<Super>s"]</default>
|
||||||
<summary>Keybinding to open the overview</summary>
|
<_summary>Keybinding to open the overview</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Keybinding to open the Activities Overview.
|
Keybinding to open the Activities Overview.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="toggle-message-tray" type="as">
|
<key name="toggle-message-tray" type="as">
|
||||||
<default>["<Super>v","<Super>m"]</default>
|
<default>["<Super>v","<Super>m"]</default>
|
||||||
<summary>Keybinding to toggle the visibility of the notification list</summary>
|
<_summary>Keybinding to toggle the visibility of the notification list</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Keybinding to toggle the visibility of the notification list.
|
Keybinding to toggle the visibility of the notification list.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="focus-active-notification" type="as">
|
<key name="focus-active-notification" type="as">
|
||||||
<default>["<Super>n"]</default>
|
<default>["<Super>n"]</default>
|
||||||
<summary>Keybinding to focus the active notification</summary>
|
<_summary>Keybinding to focus the active notification</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Keybinding to focus the active notification.
|
Keybinding to focus the active notification.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="pause-resume-tweens" type="as">
|
<key name="pause-resume-tweens" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</summary>
|
<_summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</_summary>
|
||||||
<description></description>
|
<_description></_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -143,10 +137,10 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="keyboard-type" type="s">
|
<key name="keyboard-type" type="s">
|
||||||
<default>'touch'</default>
|
<default>'touch'</default>
|
||||||
<summary>Which keyboard to use</summary>
|
<_summary>Which keyboard to use</_summary>
|
||||||
<description>
|
<_description>
|
||||||
The type of keyboard to use.
|
The type of keyboard to use.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -155,11 +149,11 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Limit switcher to current workspace.</summary>
|
<_summary>Limit switcher to current workspace.</_summary>
|
||||||
<description>
|
<_description>
|
||||||
If true, only applications that have windows on the current workspace are shown in the switcher.
|
If true, only applications that have windows on the current workspace are shown in the switcher.
|
||||||
Otherwise, all applications are included.
|
Otherwise, all applications are included.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -173,20 +167,20 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="app-icon-mode" enum="org.gnome.shell.window-switcher.AppIconMode">
|
<key name="app-icon-mode" enum="org.gnome.shell.window-switcher.AppIconMode">
|
||||||
<default>'both'</default>
|
<default>'both'</default>
|
||||||
<summary>The application icon mode.</summary>
|
<_summary>The application icon mode.</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Configures how the windows are shown in the switcher. Valid possibilities
|
Configures how the windows are shown in the switcher. Valid possibilities
|
||||||
are “thumbnail-only” (shows a thumbnail of the window), “app-icon-only”
|
are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-only'
|
||||||
(shows only the application icon) or “both”.
|
(shows only the application icon) or 'both'.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Limit switcher to current workspace.</summary>
|
<_summary>Limit switcher to current workspace.</_summary>
|
||||||
<description>
|
<_description>
|
||||||
If true, only windows from the current workspace are shown in the switcher.
|
If true, only windows from the current workspace are shown in the switcher.
|
||||||
Otherwise, all windows are included.
|
Otherwise, all windows are included.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -194,43 +188,43 @@
|
|||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key name="attach-modal-dialogs" type="b">
|
<key name="attach-modal-dialogs" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Attach modal dialog to the parent window</summary>
|
<_summary>Attach modal dialog to the parent window</_summary>
|
||||||
<description>
|
<_description>
|
||||||
This key overrides the key in org.gnome.mutter when running
|
This key overrides the key in org.gnome.mutter when running
|
||||||
GNOME Shell.
|
GNOME Shell.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="edge-tiling" type="b">
|
<key name="edge-tiling" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Enable edge tiling when dropping windows on screen edges</summary>
|
<_summary>Enable edge tiling when dropping windows on screen edges</_summary>
|
||||||
<description>
|
<_description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="dynamic-workspaces" type="b">
|
<key name="dynamic-workspaces" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Workspaces are managed dynamically</summary>
|
<_summary>Workspaces are managed dynamically</_summary>
|
||||||
<description>
|
<_description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="workspaces-only-on-primary" type="b">
|
<key name="workspaces-only-on-primary" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Workspaces only on primary monitor</summary>
|
<_summary>Workspaces only on primary monitor</_summary>
|
||||||
<description>
|
<_description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
|
|
||||||
<key name="focus-change-on-pointer-rest" type="b">
|
<key name="focus-change-on-pointer-rest" type="b">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Delay focus changes in mouse mode until the pointer stops moving</summary>
|
<_summary>Delay focus changes in mouse mode until the pointer stops moving</_summary>
|
||||||
<description>
|
<_description>
|
||||||
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
This key overrides the key in org.gnome.mutter when running GNOME Shell.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
1
data/theme/Gemfile
Normal file
1
data/theme/Gemfile
Normal file
@ -0,0 +1 @@
|
|||||||
|
gem "sass", "~> 3.4.0"
|
@ -3,10 +3,10 @@ Summary
|
|||||||
|
|
||||||
* Do not edit the CSS directly, edit the source SCSS files and process them with SASS (running
|
* Do not edit the CSS directly, edit the source SCSS files and process them with SASS (running
|
||||||
`make` should do that when you have the required software installed, as described below;
|
`make` should do that when you have the required software installed, as described below;
|
||||||
run `./parse-sass.sh` manually if it doesn't)
|
run `/.parse-sass.sh` manually if it doesn't)
|
||||||
* Most SASS preprocessors should produce similar results, however the build system
|
* To be able to use the lates/adequate version of sass, install ruby, gem, sass & bundle.
|
||||||
integration and 'parse-sass.sh' script use sassc. You should be able to install
|
On Fedora F20, this is done with `sudo dnf install rubygems && gem install bundle && bundle install`
|
||||||
it with `pkcon install sassc` or your distribution's package manager.
|
from the same directory this README resides in.
|
||||||
|
|
||||||
How to tweak the theme
|
How to tweak the theme
|
||||||
----------------------
|
----------------------
|
||||||
@ -31,4 +31,6 @@ _common.scss - actual definitions of style for each widget. This is where
|
|||||||
your changes.
|
your changes.
|
||||||
|
|
||||||
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
|
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
|
||||||
_common.scss file, you can either run make or the ./parse-sass.sh script.
|
_common.scss file, you can either run the ./parse-sass.sh script or keep SASS watching for changes as you
|
||||||
|
edit. This is done by running `bundle exec sass --watch --sourcemap=none .` If sass is out of date, or is
|
||||||
|
missing, you can install it with `bundle install`.
|
||||||
|
@ -1,81 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
version="1.0"
|
|
||||||
id="Foreground"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
width="32"
|
|
||||||
height="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
enable-background="new 0 0 16 16"
|
|
||||||
xml:space="preserve"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
|
||||||
sodipodi:docname="close-window-active.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
|
||||||
id="metadata2399"><rdf:RDF><cc:Work
|
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
|
||||||
id="defs2397"><linearGradient
|
|
||||||
id="linearGradient3173"><stop
|
|
||||||
style="stop-color:#c4c4c4;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3175" /><stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3177" /></linearGradient><inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 11 : 1"
|
|
||||||
inkscape:vp_y="0 : 1375 : 0"
|
|
||||||
inkscape:vp_z="22 : 11 : 1"
|
|
||||||
inkscape:persp3d-origin="11 : 7.3333334 : 1"
|
|
||||||
id="perspective2401" /></defs><sodipodi:namedview
|
|
||||||
inkscape:window-height="1106"
|
|
||||||
inkscape:window-width="1700"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
guidetolerance="10.0"
|
|
||||||
gridtolerance="10.0"
|
|
||||||
objecttolerance="10.0"
|
|
||||||
borderopacity="1.0"
|
|
||||||
bordercolor="#666666"
|
|
||||||
pagecolor="#797979"
|
|
||||||
id="base"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="4"
|
|
||||||
inkscape:cx="28.483745"
|
|
||||||
inkscape:cy="67.714004"
|
|
||||||
inkscape:window-x="1427"
|
|
||||||
inkscape:window-y="127"
|
|
||||||
inkscape:current-layer="Foreground"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:document-rotation="0"><inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid11246"
|
|
||||||
empspacing="32"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" /></sodipodi:namedview><path
|
|
||||||
d="m 4.4362021,16 c 0,-6.410121 5.1728276,-11.60728 11.5529359,-11.60728 6.380109,0 11.552937,5.197159 11.552937,11.60728 0,6.410122 -5.172828,11.607281 -11.552937,11.607281 C 9.6090297,27.607281 4.4362021,22.410122 4.4362021,16 Z"
|
|
||||||
id="path883"
|
|
||||||
style="color:#000000;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;fill:#a5c8ec;fill-opacity:1;fill-rule:nonzero;stroke:#2975c4;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
|
||||||
sodipodi:nodetypes="csssc"
|
|
||||||
inkscape:connector-curvature="0" /><path
|
|
||||||
d="m 11.718386,11.764547 h 1.055207 c 0.01091,-1.26e-4 0.02193,-4.86e-4 0.03298,0 0.269026,0.01183 0.538019,0.135679 0.725455,0.329752 l 2.407192,2.407192 2.440166,-2.407192 c 0.28029,-0.243226 0.471333,-0.322366 0.725455,-0.329752 h 1.055207 v 1.055208 c 0,0.302285 -0.03623,0.581049 -0.263801,0.791405 l -2.407191,2.407191 2.374217,2.374216 c 0.198577,0.198559 0.296768,0.478484 0.296775,0.758432 v 1.055206 h -1.055211 c -0.279947,-10e-6 -0.559877,-0.09824 -0.75843,-0.296777 l -2.407192,-2.407192 -2.407192,2.407192 c -0.198551,0.198579 -0.478493,0.296777 -0.758429,0.296777 H 11.71839 v -1.055206 c -3e-6,-0.279936 0.0982,-0.559873 0.296777,-0.758432 L 14.422359,16.018351 12.015167,13.61116 C 11.79279,13.405784 11.69527,13.116003 11.71839,12.819755 Z"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path887"
|
|
||||||
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';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:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.87958801;marker:none;enable-background:new"
|
|
||||||
sodipodi:nodetypes="ccsccccccccccccccccccccccc" /></svg>
|
|
Before Width: | Height: | Size: 4.6 KiB |
@ -1,81 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
version="1.0"
|
|
||||||
id="Foreground"
|
|
||||||
x="0px"
|
|
||||||
y="0px"
|
|
||||||
width="32"
|
|
||||||
height="32"
|
|
||||||
viewBox="0 0 32 32"
|
|
||||||
enable-background="new 0 0 16 16"
|
|
||||||
xml:space="preserve"
|
|
||||||
sodipodi:version="0.32"
|
|
||||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
|
||||||
sodipodi:docname="close-window-hover.svg"
|
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
|
||||||
id="metadata2399"><rdf:RDF><cc:Work
|
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
|
||||||
id="defs2397"><linearGradient
|
|
||||||
id="linearGradient3173"><stop
|
|
||||||
style="stop-color:#c4c4c4;stop-opacity:1;"
|
|
||||||
offset="0"
|
|
||||||
id="stop3175" /><stop
|
|
||||||
style="stop-color:#ffffff;stop-opacity:1;"
|
|
||||||
offset="1"
|
|
||||||
id="stop3177" /></linearGradient><inkscape:perspective
|
|
||||||
sodipodi:type="inkscape:persp3d"
|
|
||||||
inkscape:vp_x="0 : 11 : 1"
|
|
||||||
inkscape:vp_y="0 : 1375 : 0"
|
|
||||||
inkscape:vp_z="22 : 11 : 1"
|
|
||||||
inkscape:persp3d-origin="11 : 7.3333334 : 1"
|
|
||||||
id="perspective2401" /></defs><sodipodi:namedview
|
|
||||||
inkscape:window-height="1106"
|
|
||||||
inkscape:window-width="1700"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
guidetolerance="10.0"
|
|
||||||
gridtolerance="10.0"
|
|
||||||
objecttolerance="10.0"
|
|
||||||
borderopacity="1.0"
|
|
||||||
bordercolor="#666666"
|
|
||||||
pagecolor="#797979"
|
|
||||||
id="base"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="4"
|
|
||||||
inkscape:cx="28.483745"
|
|
||||||
inkscape:cy="67.714004"
|
|
||||||
inkscape:window-x="1427"
|
|
||||||
inkscape:window-y="127"
|
|
||||||
inkscape:current-layer="Foreground"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
borderlayer="true"
|
|
||||||
inkscape:showpageshadow="false"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:document-rotation="0"><inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid11246"
|
|
||||||
empspacing="32"
|
|
||||||
visible="true"
|
|
||||||
enabled="true"
|
|
||||||
snapvisiblegridlinesonly="true" /></sodipodi:namedview><path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="csssc"
|
|
||||||
style="color:#000000;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;fill:#2975c4;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
|
||||||
id="path822"
|
|
||||||
d="m 4.4362021,16 c 0,-6.410121 5.1728276,-11.60728 11.5529359,-11.60728 6.380109,0 11.552937,5.197159 11.552937,11.60728 0,6.410122 -5.172828,11.607281 -11.552937,11.607281 C 9.6090297,27.607281 4.4362021,22.410122 4.4362021,16 Z" /><path
|
|
||||||
sodipodi:nodetypes="ccsccccccccccccccccccccccc"
|
|
||||||
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';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:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.87958801;marker:none;enable-background:new"
|
|
||||||
id="path826"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
d="m 11.718386,11.764547 h 1.055207 c 0.01091,-1.26e-4 0.02193,-4.86e-4 0.03298,0 0.269026,0.01183 0.538019,0.135679 0.725455,0.329752 l 2.407192,2.407192 2.440166,-2.407192 c 0.28029,-0.243226 0.471333,-0.322366 0.725455,-0.329752 h 1.055207 v 1.055208 c 0,0.302285 -0.03623,0.581049 -0.263801,0.791405 l -2.407191,2.407191 2.374217,2.374216 c 0.198577,0.198559 0.296768,0.478484 0.296775,0.758432 v 1.055206 h -1.055211 c -0.279947,-10e-6 -0.559877,-0.09824 -0.75843,-0.296777 l -2.407192,-2.407192 -2.407192,2.407192 c -0.198551,0.198579 -0.478493,0.296777 -0.758429,0.296777 H 11.71839 v -1.055206 c -3e-6,-0.279936 0.0982,-0.559873 0.296777,-0.758432 L 14.422359,16.018351 12.015167,13.61116 C 11.79279,13.405784 11.69527,13.116003 11.71839,12.819755 Z" /></svg>
|
|
Before Width: | Height: | Size: 4.6 KiB |
@ -7,6 +7,7 @@
|
|||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
version="1.0"
|
version="1.0"
|
||||||
@ -15,71 +16,137 @@
|
|||||||
y="0px"
|
y="0px"
|
||||||
width="32"
|
width="32"
|
||||||
height="32"
|
height="32"
|
||||||
viewBox="0 0 32 32"
|
viewBox="0 0 23.272727 23.272727"
|
||||||
enable-background="new 0 0 16 16"
|
enable-background="new 0 0 16 16"
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
sodipodi:version="0.32"
|
sodipodi:version="0.32"
|
||||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
inkscape:version="0.48+devel r10081 custom"
|
||||||
sodipodi:docname="close-window.svg"
|
sodipodi:docname="close-window.svg"
|
||||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
||||||
id="metadata2399"><rdf:RDF><cc:Work
|
id="metadata2399"><rdf:RDF><cc:Work
|
||||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||||
id="defs2397"><linearGradient
|
id="defs2397"><linearGradient
|
||||||
id="linearGradient3173"><stop
|
id="linearGradient3173"><stop
|
||||||
style="stop-color:#c4c4c4;stop-opacity:1;"
|
style="stop-color:#c4c4c4;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop3175" /><stop
|
id="stop3175" /><stop
|
||||||
style="stop-color:#ffffff;stop-opacity:1;"
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
offset="1"
|
offset="1"
|
||||||
id="stop3177" /></linearGradient><inkscape:perspective
|
id="stop3177" /></linearGradient><inkscape:perspective
|
||||||
sodipodi:type="inkscape:persp3d"
|
sodipodi:type="inkscape:persp3d"
|
||||||
inkscape:vp_x="0 : 11 : 1"
|
inkscape:vp_x="0 : 8 : 1"
|
||||||
inkscape:vp_y="0 : 1375 : 0"
|
inkscape:vp_y="0 : 1000 : 0"
|
||||||
inkscape:vp_z="22 : 11 : 1"
|
inkscape:vp_z="16 : 8 : 1"
|
||||||
inkscape:persp3d-origin="11 : 7.3333334 : 1"
|
inkscape:persp3d-origin="8 : 5.3333333 : 1"
|
||||||
id="perspective2401" /></defs><sodipodi:namedview
|
id="perspective2401" /><filter
|
||||||
inkscape:window-height="1106"
|
color-interpolation-filters="sRGB"
|
||||||
inkscape:window-width="1700"
|
inkscape:collect="always"
|
||||||
inkscape:pageshadow="2"
|
id="filter16494-4"
|
||||||
inkscape:pageopacity="0"
|
x="-0.20989846"
|
||||||
guidetolerance="10.0"
|
width="1.4197969"
|
||||||
gridtolerance="10.0"
|
y="-0.20903821"
|
||||||
objecttolerance="10.0"
|
height="1.4180764"><feGaussianBlur
|
||||||
borderopacity="1.0"
|
inkscape:collect="always"
|
||||||
bordercolor="#666666"
|
stdDeviation="1.3282637"
|
||||||
pagecolor="#797979"
|
id="feGaussianBlur16496-8" /></filter><radialGradient
|
||||||
id="base"
|
inkscape:collect="always"
|
||||||
showgrid="false"
|
xlink:href="#linearGradient16498-6"
|
||||||
inkscape:zoom="4"
|
id="radialGradient16504-1"
|
||||||
inkscape:cx="28.483745"
|
cx="7.6582627"
|
||||||
inkscape:cy="67.714004"
|
cy="5.8191104"
|
||||||
inkscape:window-x="1427"
|
fx="7.6582627"
|
||||||
inkscape:window-y="127"
|
fy="5.8191104"
|
||||||
inkscape:current-layer="Foreground"
|
r="8.6928644"
|
||||||
showguides="true"
|
gradientTransform="matrix(1.0474339,0,0,1.0517402,-0.3632615,-0.42032492)"
|
||||||
inkscape:guide-bbox="true"
|
gradientUnits="userSpaceOnUse" /><linearGradient
|
||||||
borderlayer="true"
|
inkscape:collect="always"
|
||||||
inkscape:showpageshadow="false"
|
id="linearGradient16498-6"><stop
|
||||||
inkscape:window-maximized="0"
|
style="stop-color:#7b7b7b;stop-opacity:1"
|
||||||
inkscape:document-rotation="0"><inkscape:grid
|
offset="0"
|
||||||
type="xygrid"
|
id="stop16500-8" /><stop
|
||||||
id="grid11246"
|
style="stop-color:#101010;stop-opacity:1"
|
||||||
empspacing="32"
|
offset="1"
|
||||||
visible="true"
|
id="stop16502-0" /></linearGradient><filter
|
||||||
enabled="true"
|
color-interpolation-filters="sRGB"
|
||||||
snapvisiblegridlinesonly="true" /></sodipodi:namedview><path
|
inkscape:collect="always"
|
||||||
d="m 4.4362021,15.860384 c 0,-6.410121 5.1728276,-11.60728 11.5529359,-11.60728 6.380109,0 11.552937,5.197159 11.552937,11.60728 0,6.410122 -5.172828,11.607281 -11.552937,11.607281 -6.3801083,0 -11.5529359,-5.197159 -11.5529359,-11.607281 z"
|
id="filter16524-9"
|
||||||
id="path2394-32"
|
x="-0.212979"
|
||||||
style="color:#000000;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#2975c4;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
width="1.425958"
|
||||||
sodipodi:nodetypes="csssc"
|
y="-0.21305652"
|
||||||
inkscape:connector-curvature="0" /><path
|
height="1.426113"><feGaussianBlur
|
||||||
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.49900004;fill:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.74932218;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
|
inkscape:collect="always"
|
||||||
d="m 6.4654832,15.001321 c -0.025906,0.288419 -0.044417,0.579469 -0.044417,0.874662 0,5.313347 4.2883848,9.621271 9.5768588,9.621271 5.288466,0 9.575143,-4.307924 9.575143,-9.621271 0,-0.295193 -0.01852,-0.586243 -0.04441,-0.874662 -0.440376,4.903023 -4.536071,8.746611 -9.53073,8.746611 -4.994659,0 -9.0920617,-3.843588 -9.5324391,-8.746611 z"
|
stdDeviation="0.71020915"
|
||||||
id="path2561"
|
id="feGaussianBlur16526-0" /></filter></defs><sodipodi:namedview
|
||||||
inkscape:connector-curvature="0" /><path
|
inkscape:window-height="1114"
|
||||||
d="m 11.718386,11.639547 h 1.055207 c 0.01091,-1.26e-4 0.02193,-4.86e-4 0.03298,0 0.269026,0.01183 0.538019,0.135679 0.725455,0.329752 l 2.407192,2.407192 2.440166,-2.407192 c 0.28029,-0.243226 0.471333,-0.322366 0.725455,-0.329752 h 1.055207 v 1.055208 c 0,0.302285 -0.03623,0.581049 -0.263801,0.791405 l -2.407191,2.407191 2.374217,2.374216 c 0.198577,0.198559 0.296768,0.478484 0.296775,0.758432 v 1.055206 h -1.055211 c -0.279947,-10e-6 -0.559877,-0.09824 -0.75843,-0.296777 l -2.407192,-2.407192 -2.407192,2.407192 c -0.198551,0.198579 -0.478493,0.296777 -0.758429,0.296777 H 11.71839 v -1.055206 c -3e-6,-0.279936 0.0982,-0.559873 0.296777,-0.758432 L 14.422359,15.893351 12.015167,13.48616 C 11.79279,13.280784 11.69527,12.991003 11.71839,12.694755 Z"
|
inkscape:window-width="1463"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:pageshadow="2"
|
||||||
id="path27279-0-5"
|
inkscape:pageopacity="0"
|
||||||
style="color:#bebebe;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono';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:#4a90d9;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.87958801;marker:none;enable-background:new"
|
guidetolerance="10.0"
|
||||||
sodipodi:nodetypes="ccsccccccccccccccccccccccc" /></svg>
|
gridtolerance="10.0"
|
||||||
|
objecttolerance="10.0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#000000"
|
||||||
|
id="base"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1"
|
||||||
|
inkscape:cx="10.720189"
|
||||||
|
inkscape:cy="13.739577"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="26"
|
||||||
|
inkscape:current-layer="Foreground"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-maximized="0"><inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid11246"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" /></sodipodi:namedview>
|
||||||
|
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
id="g16402-8"
|
||||||
|
transform="translate(4.7533483,2.8238929)"><g
|
||||||
|
id="g3175-4"><path
|
||||||
|
sodipodi:type="inkscape:offset"
|
||||||
|
inkscape:radius="0"
|
||||||
|
inkscape:original="M 7.65625 0.125 C 3.2589349 0.125 -0.3125 3.7070002 -0.3125 8.125 C -0.3125 12.543001 3.2589349 16.125 7.65625 16.125 C 12.053566 16.125 15.625 12.543001 15.625 8.125 C 15.625 3.7070002 12.053566 0.125 7.65625 0.125 z "
|
||||||
|
xlink:href="#path2394-32"
|
||||||
|
style="opacity:0.52994014;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.18181825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16494-4);enable-background:accumulate"
|
||||||
|
id="path16480-5"
|
||||||
|
inkscape:href="#path2394-32"
|
||||||
|
d="m 7.65625,0.125 c -4.3973151,0 -7.96875,3.5820002 -7.96875,8 0,4.418001 3.5714349,8 7.96875,8 4.397316,0 7.96875,-3.581999 7.96875,-8 0,-4.4179998 -3.571434,-8 -7.96875,-8 z"
|
||||||
|
transform="translate(0,1.028519)" /><path
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="m -0.30428257,8.1237596 c 0,-4.4179998 3.56522987,-7.9999996 7.96254497,-7.9999996 4.3973156,0 7.9625456,3.5819998 7.9625456,7.9999996 0,4.4180014 -3.56523,8.0000004 -7.9625456,8.0000004 -4.3973151,0 -7.96254497,-3.581999 -7.96254497,-8.0000004 z"
|
||||||
|
id="path2394-32"
|
||||||
|
style="color:#000000;fill:url(#radialGradient16504-1);fill-opacity:1;fill-rule:nonzero;stroke:#eeeeec;stroke-width:1.4545455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
sodipodi:nodetypes="csssc"
|
||||||
|
inkscape:connector-curvature="0" /><g
|
||||||
|
id="g3172-6" /></g><g
|
||||||
|
transform="matrix(0.72727273,0,0,0.72727273,2.368236,2.1803254)"
|
||||||
|
style="fill:#ffffff;fill-opacity:1;display:inline"
|
||||||
|
id="g27275-6-6"
|
||||||
|
inkscape:label="window-close"><g
|
||||||
|
style="fill:#ffffff;fill-opacity:1;display:inline"
|
||||||
|
id="g27277-1-1"
|
||||||
|
transform="translate(-41,-760)"><path
|
||||||
|
sodipodi:type="inkscape:offset"
|
||||||
|
inkscape:radius="0"
|
||||||
|
inkscape:original="M 44.21875 764.1875 L 44.21875 765.1875 C 44.19684 765.46825 44.289258 765.74287 44.5 765.9375 L 46.78125 768.21875 L 44.5 770.46875 C 44.31181 770.65692 44.218747 770.92221 44.21875 771.1875 L 44.21875 772.1875 L 45.21875 772.1875 C 45.48404 772.1875 45.749336 772.09444 45.9375 771.90625 L 48.21875 769.625 L 50.5 771.90625 C 50.688164 772.0944 50.953449 772.18749 51.21875 772.1875 L 52.21875 772.1875 L 52.21875 771.1875 C 52.218742 770.9222 52.125688 770.65692 51.9375 770.46875 L 49.6875 768.21875 L 51.96875 765.9375 C 52.18441 765.73815 52.21875 765.47397 52.21875 765.1875 L 52.21875 764.1875 L 51.21875 764.1875 C 50.977922 764.1945 50.796875 764.2695 50.53125 764.5 L 48.21875 766.78125 L 45.9375 764.5 C 45.75987 764.31608 45.504951 764.1987 45.25 764.1875 C 45.23954 764.18704 45.22912 764.18738 45.21875 764.1875 L 44.21875 764.1875 z "
|
||||||
|
xlink:href="#path27279-0-5"
|
||||||
|
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16524-9);enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono"
|
||||||
|
id="path16506-5"
|
||||||
|
inkscape:href="#path27279-0-5"
|
||||||
|
d="m 44.21875,764.1875 0,1 c -0.02191,0.28075 0.07051,0.55537 0.28125,0.75 l 2.28125,2.28125 -2.28125,2.25 c -0.18819,0.18817 -0.281253,0.45346 -0.28125,0.71875 l 0,1 1,0 c 0.26529,0 0.530586,-0.0931 0.71875,-0.28125 L 48.21875,769.625 50.5,771.90625 c 0.188164,0.18815 0.453449,0.28124 0.71875,0.28125 l 1,0 0,-1 c -8e-6,-0.2653 -0.09306,-0.53058 -0.28125,-0.71875 l -2.25,-2.25 2.28125,-2.28125 c 0.21566,-0.19935 0.25,-0.46353 0.25,-0.75 l 0,-1 -1,0 c -0.240828,0.007 -0.421875,0.082 -0.6875,0.3125 l -2.3125,2.28125 L 45.9375,764.5 c -0.17763,-0.18392 -0.432549,-0.3013 -0.6875,-0.3125 -0.01046,-4.6e-4 -0.02088,-1.2e-4 -0.03125,0 l -1,0 z"
|
||||||
|
transform="translate(0,1.3535534)" /><path
|
||||||
|
sodipodi:nodetypes="ccsccccccccccccccccccccccc"
|
||||||
|
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono"
|
||||||
|
id="path27279-0-5"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 44.226475,764.17222 1,0 c 0.01037,-1.2e-4 0.02079,-4.6e-4 0.03125,0 0.254951,0.0112 0.50987,0.12858 0.6875,0.3125 l 2.28125,2.28125 2.3125,-2.28125 c 0.265625,-0.2305 0.446672,-0.3055 0.6875,-0.3125 l 1,0 0,1 c 0,0.28647 -0.03434,0.55065 -0.25,0.75 l -2.28125,2.28125 2.25,2.25 c 0.188188,0.18817 0.281242,0.45345 0.28125,0.71875 l 0,1 -1,0 c -0.265301,-1e-5 -0.530586,-0.0931 -0.71875,-0.28125 l -2.28125,-2.28125 -2.28125,2.28125 c -0.188164,0.18819 -0.45346,0.28125 -0.71875,0.28125 l -1,0 0,-1 c -3e-6,-0.26529 0.09306,-0.53058 0.28125,-0.71875 l 2.28125,-2.25 -2.28125,-2.28125 c -0.210742,-0.19463 -0.30316,-0.46925 -0.28125,-0.75 l 0,-1 z" /></g></g></g></svg>
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 9.4 KiB |
@ -118,7 +118,6 @@ StEntry {
|
|||||||
/* Scrollbars */
|
/* Scrollbars */
|
||||||
StScrollView.vfade {
|
StScrollView.vfade {
|
||||||
-st-vfade-offset: 68px; }
|
-st-vfade-offset: 68px; }
|
||||||
|
|
||||||
StScrollView.hfade {
|
StScrollView.hfade {
|
||||||
-st-hfade-offset: 68px; }
|
-st-hfade-offset: 68px; }
|
||||||
|
|
||||||
@ -153,18 +152,14 @@ StScrollBar {
|
|||||||
/* Check Boxes */
|
/* Check Boxes */
|
||||||
.check-box StBoxLayout {
|
.check-box StBoxLayout {
|
||||||
spacing: .8em; }
|
spacing: .8em; }
|
||||||
|
|
||||||
.check-box StBin {
|
.check-box StBin {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 22px;
|
height: 22px;
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
||||||
|
|
||||||
.check-box:focus StBin {
|
.check-box:focus StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||||
|
|
||||||
.check-box:checked StBin {
|
.check-box:checked StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||||
|
|
||||||
.check-box:focus:checked StBin {
|
.check-box:focus:checked StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||||
|
|
||||||
@ -204,7 +199,7 @@ StScrollBar {
|
|||||||
border-radius: 9px;
|
border-radius: 9px;
|
||||||
color: #eeeeec;
|
color: #eeeeec;
|
||||||
background-color: rgba(23, 25, 26, 0.95);
|
background-color: rgba(23, 25, 26, 0.95);
|
||||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.5); }
|
||||||
.modal-dialog .modal-dialog-content-box {
|
.modal-dialog .modal-dialog-content-box {
|
||||||
padding: 24px; }
|
padding: 24px; }
|
||||||
.modal-dialog .run-dialog-entry {
|
.modal-dialog .run-dialog-entry {
|
||||||
@ -221,34 +216,15 @@ StScrollBar {
|
|||||||
color: #d6d6d1;
|
color: #d6d6d1;
|
||||||
padding-bottom: .4em; }
|
padding-bottom: .4em; }
|
||||||
|
|
||||||
.mount-dialog-subject,
|
.show-processes-dialog-subject,
|
||||||
|
.mount-question-dialog-subject,
|
||||||
.end-session-dialog-subject {
|
.end-session-dialog-subject {
|
||||||
font-size: 14pt; }
|
font-size: 14pt; }
|
||||||
|
|
||||||
/* Message Dialog */
|
|
||||||
.message-dialog-main-layout {
|
|
||||||
padding: 12px 20px 0;
|
|
||||||
spacing: 12px; }
|
|
||||||
|
|
||||||
.message-dialog-content {
|
|
||||||
max-width: 28em;
|
|
||||||
spacing: 20px; }
|
|
||||||
|
|
||||||
.message-dialog-icon {
|
|
||||||
min-width: 48px;
|
|
||||||
icon-size: 48px; }
|
|
||||||
|
|
||||||
.message-dialog-title {
|
|
||||||
font-weight: bold; }
|
|
||||||
|
|
||||||
.message-dialog-subtitle {
|
|
||||||
color: #999999;
|
|
||||||
font-weight: bold; }
|
|
||||||
|
|
||||||
/* End Session Dialog */
|
/* End Session Dialog */
|
||||||
.end-session-dialog {
|
.end-session-dialog {
|
||||||
spacing: 42px;
|
spacing: 42px;
|
||||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||||
|
|
||||||
.end-session-dialog-list {
|
.end-session-dialog-list {
|
||||||
padding-top: 20px; }
|
padding-top: 20px; }
|
||||||
@ -313,62 +289,75 @@ StScrollBar {
|
|||||||
.shell-mount-operation-icon {
|
.shell-mount-operation-icon {
|
||||||
icon-size: 48px; }
|
icon-size: 48px; }
|
||||||
|
|
||||||
.mount-dialog {
|
.show-processes-dialog,
|
||||||
|
.mount-question-dialog {
|
||||||
spacing: 24px; }
|
spacing: 24px; }
|
||||||
.mount-dialog .message-dialog-title {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-left: 17px;
|
|
||||||
padding-bottom: 6px;
|
|
||||||
max-width: 34em; }
|
|
||||||
.mount-dialog .message-dialog-title:rtl {
|
|
||||||
padding-left: 0px;
|
|
||||||
padding-right: 17px; }
|
|
||||||
.mount-dialog .message-dialog-body {
|
|
||||||
padding-left: 17px;
|
|
||||||
width: 28em; }
|
|
||||||
.mount-dialog .message-dialog-body:rtl {
|
|
||||||
padding-left: 0px;
|
|
||||||
padding-right: 17px; }
|
|
||||||
|
|
||||||
.mount-dialog-app-list {
|
.show-processes-dialog-subject,
|
||||||
|
.mount-question-dialog-subject {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-left: 17px;
|
||||||
|
padding-bottom: 6px; }
|
||||||
|
|
||||||
|
.mount-question-dialog-subject {
|
||||||
|
max-width: 500px; }
|
||||||
|
|
||||||
|
.show-processes-dialog-subject:rtl,
|
||||||
|
.mount-question-dialog-subject:rtl {
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 17px; }
|
||||||
|
|
||||||
|
.show-processes-dialog-description,
|
||||||
|
.mount-question-dialog-description {
|
||||||
|
padding-left: 17px;
|
||||||
|
width: 28em; }
|
||||||
|
|
||||||
|
.show-processes-dialog-description:rtl,
|
||||||
|
.mount-question-dialog-description:rtl {
|
||||||
|
padding-right: 17px; }
|
||||||
|
|
||||||
|
.show-processes-dialog-app-list {
|
||||||
max-height: 200px;
|
max-height: 200px;
|
||||||
padding-top: 24px;
|
padding-top: 24px;
|
||||||
padding-left: 49px;
|
padding-left: 49px;
|
||||||
padding-right: 32px; }
|
padding-right: 32px; }
|
||||||
|
|
||||||
.mount-dialog-app-list:rtl {
|
.show-processes-dialog-app-list:rtl {
|
||||||
padding-right: 49px;
|
padding-right: 49px;
|
||||||
padding-left: 32px; }
|
padding-left: 32px; }
|
||||||
|
|
||||||
.mount-dialog-app-list-item {
|
.show-processes-dialog-app-list-item {
|
||||||
color: #e6e6e6; }
|
color: #e6e6e6; }
|
||||||
.mount-dialog-app-list-item:hover {
|
.show-processes-dialog-app-list-item:hover {
|
||||||
color: #fff; }
|
color: #fff; }
|
||||||
.mount-dialog-app-list-item:ltr {
|
.show-processes-dialog-app-list-item:ltr {
|
||||||
padding-right: 1em; }
|
padding-right: 1em; }
|
||||||
.mount-dialog-app-list-item:rtl {
|
.show-processes-dialog-app-list-item:rtl {
|
||||||
padding-left: 1em; }
|
padding-left: 1em; }
|
||||||
|
|
||||||
.mount-dialog-app-list-item-icon:ltr {
|
.show-processes-dialog-app-list-item-icon:ltr {
|
||||||
padding-right: 17px; }
|
padding-right: 17px; }
|
||||||
|
.show-processes-dialog-app-list-item-icon:rtl {
|
||||||
.mount-dialog-app-list-item-icon:rtl {
|
|
||||||
padding-left: 17px; }
|
padding-left: 17px; }
|
||||||
|
|
||||||
.mount-dialog-app-list-item-name {
|
.show-processes-dialog-app-list-item-name {
|
||||||
font-size: 10pt; }
|
font-size: 10pt; }
|
||||||
|
|
||||||
/* Password or Authentication Dialog */
|
/* Password or Authentication Dialog */
|
||||||
.prompt-dialog {
|
.prompt-dialog {
|
||||||
width: 34em;
|
width: 500px;
|
||||||
border: 3px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||||
.prompt-dialog .message-dialog-main-layout {
|
|
||||||
spacing: 24px;
|
.prompt-dialog-main-layout {
|
||||||
padding: 10px; }
|
spacing: 24px;
|
||||||
.prompt-dialog .message-dialog-content {
|
padding: 10px; }
|
||||||
spacing: 16px; }
|
|
||||||
.prompt-dialog .message-dialog-title {
|
.prompt-dialog-message-layout {
|
||||||
color: #b2b2a9; }
|
spacing: 16px; }
|
||||||
|
|
||||||
|
.prompt-dialog-headline {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #b2b2a9; }
|
||||||
|
|
||||||
.prompt-dialog-description:rtl {
|
.prompt-dialog-description:rtl {
|
||||||
text-align: right; }
|
text-align: right; }
|
||||||
@ -410,54 +399,6 @@ StScrollBar {
|
|||||||
width: 48px;
|
width: 48px;
|
||||||
height: 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 rgba(238, 238, 236, 0.2);
|
|
||||||
border-radius: 12px; }
|
|
||||||
.audio-selection-device:active, .audio-selection-device:hover, .audio-selection-device:focus {
|
|
||||||
background-color: #215d9c; }
|
|
||||||
|
|
||||||
.audio-selection-device-box {
|
|
||||||
padding: 20px;
|
|
||||||
spacing: 20px; }
|
|
||||||
|
|
||||||
.audio-selection-device-icon {
|
|
||||||
icon-size: 64px; }
|
|
||||||
|
|
||||||
/* Access Dialog */
|
|
||||||
.access-dialog {
|
|
||||||
spacing: 30px; }
|
|
||||||
|
|
||||||
/* Geolocation Dialog */
|
|
||||||
.geolocation-dialog {
|
|
||||||
spacing: 30px; }
|
|
||||||
|
|
||||||
/* Extension Dialog */
|
|
||||||
.extension-dialog .message-dialog-main-layout {
|
|
||||||
spacing: 24px;
|
|
||||||
padding: 10px; }
|
|
||||||
|
|
||||||
.extension-dialog .message-dialog-title {
|
|
||||||
color: #b2b2a9; }
|
|
||||||
|
|
||||||
/* Inhibit-Shortcuts Dialog */
|
|
||||||
.inhibit-shortcuts-dialog {
|
|
||||||
spacing: 30px; }
|
|
||||||
|
|
||||||
/* Network Agent Dialog */
|
/* Network Agent Dialog */
|
||||||
.network-dialog-secret-table {
|
.network-dialog-secret-table {
|
||||||
spacing-rows: 15px;
|
spacing-rows: 15px;
|
||||||
@ -467,9 +408,9 @@ StScrollBar {
|
|||||||
spacing-rows: 15px;
|
spacing-rows: 15px;
|
||||||
spacing-columns: 1em; }
|
spacing-columns: 1em; }
|
||||||
|
|
||||||
/* Popovers/Menus */
|
/* Popvers/Menus */
|
||||||
.popup-menu {
|
.popup-menu {
|
||||||
min-width: 15em; }
|
min-width: 200px; }
|
||||||
.popup-menu .popup-sub-menu {
|
.popup-menu .popup-sub-menu {
|
||||||
background-color: black;
|
background-color: black;
|
||||||
box-shadow: inset 0 -1px 0px #0d0d0d; }
|
box-shadow: inset 0 -1px 0px #0d0d0d; }
|
||||||
@ -546,21 +487,6 @@ StScrollBar {
|
|||||||
border-radius: 0.3em;
|
border-radius: 0.3em;
|
||||||
background-color: rgba(11, 12, 13, 0.5);
|
background-color: rgba(11, 12, 13, 0.5);
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
.osd-window .level-bar {
|
|
||||||
background-color: #eeeeec;
|
|
||||||
border-radius: 0.3em; }
|
|
||||||
|
|
||||||
/* Pad OSD */
|
|
||||||
.pad-osd-window {
|
|
||||||
padding: 32px;
|
|
||||||
background-color: rgba(0, 0, 0, 0.8); }
|
|
||||||
.pad-osd-window .pad-osd-title-box {
|
|
||||||
spacing: 12px; }
|
|
||||||
.pad-osd-window .pad-osd-title-menu-box {
|
|
||||||
spacing: 6px; }
|
|
||||||
|
|
||||||
.combo-box-label {
|
|
||||||
width: 15em; }
|
|
||||||
|
|
||||||
/* App Switcher */
|
/* App Switcher */
|
||||||
.switcher-popup {
|
.switcher-popup {
|
||||||
@ -604,10 +530,6 @@ StScrollBar {
|
|||||||
width: 96px;
|
width: 96px;
|
||||||
height: 96px; }
|
height: 96px; }
|
||||||
|
|
||||||
/* Window Cycler */
|
|
||||||
.cycler-highlight {
|
|
||||||
border: 5px solid #215d9c; }
|
|
||||||
|
|
||||||
/* Workspace Switcher */
|
/* Workspace Switcher */
|
||||||
.workspace-switcher-group {
|
.workspace-switcher-group {
|
||||||
padding: 12px; }
|
padding: 12px; }
|
||||||
@ -657,9 +579,7 @@ StScrollBar {
|
|||||||
|
|
||||||
/* TOP BAR */
|
/* TOP BAR */
|
||||||
#panel {
|
#panel {
|
||||||
background-color: rgba(0, 0, 0, 0.35);
|
background-color: black;
|
||||||
/* transition from solid to transparent */
|
|
||||||
transition-duration: 500ms;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
height: 1.86em; }
|
height: 1.86em; }
|
||||||
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
|
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
|
||||||
@ -668,7 +588,7 @@ StScrollBar {
|
|||||||
spacing: 4px; }
|
spacing: 4px; }
|
||||||
#panel .panel-corner {
|
#panel .panel-corner {
|
||||||
-panel-corner-radius: 6px;
|
-panel-corner-radius: 6px;
|
||||||
-panel-corner-background-color: rgba(0, 0, 0, 0.35);
|
-panel-corner-background-color: black;
|
||||||
-panel-corner-border-width: 2px;
|
-panel-corner-border-width: 2px;
|
||||||
-panel-corner-border-color: transparent; }
|
-panel-corner-border-color: transparent; }
|
||||||
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
||||||
@ -681,24 +601,14 @@ StScrollBar {
|
|||||||
-natural-hpadding: 12px;
|
-natural-hpadding: 12px;
|
||||||
-minimum-hpadding: 6px;
|
-minimum-hpadding: 6px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #eee;
|
color: #ccc;
|
||||||
text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9);
|
|
||||||
transition-duration: 100ms; }
|
transition-duration: 100ms; }
|
||||||
#panel .panel-button .app-menu-icon {
|
#panel .panel-button .app-menu-icon {
|
||||||
-st-icon-style: symbolic;
|
-st-icon-style: symbolic;
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
margin-right: 4px; }
|
margin-right: 4px; }
|
||||||
#panel .panel-button .system-status-icon,
|
|
||||||
#panel .panel-button .app-menu-icon > StIcon,
|
|
||||||
#panel .panel-button .popup-menu-arrow {
|
|
||||||
icon-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9); }
|
|
||||||
#panel .panel-button:hover {
|
#panel .panel-button:hover {
|
||||||
color: white;
|
color: white; }
|
||||||
text-shadow: 0px 1px 6px black; }
|
|
||||||
#panel .panel-button:hover .system-status-icon,
|
|
||||||
#panel .panel-button:hover .app-menu-icon > StIcon,
|
|
||||||
#panel .panel-button:hover .popup-menu-arrow {
|
|
||||||
icon-shadow: 0px 1px 6px black; }
|
|
||||||
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||||
background-color: rgba(0, 0, 0, 0.01);
|
background-color: rgba(0, 0, 0, 0.01);
|
||||||
box-shadow: inset 0 -2px 0px #256ab1;
|
box-shadow: inset 0 -2px 0px #256ab1;
|
||||||
@ -708,40 +618,15 @@ StScrollBar {
|
|||||||
#panel .panel-button .system-status-icon {
|
#panel .panel-button .system-status-icon {
|
||||||
icon-size: 1.09em;
|
icon-size: 1.09em;
|
||||||
padding: 0 5px; }
|
padding: 0 5px; }
|
||||||
.unlock-screen #panel .panel-button,
|
.unlock-screen #panel .panel-button, .login-screen #panel .panel-button, .lock-screen #panel .panel-button {
|
||||||
.login-screen #panel .panel-button,
|
|
||||||
.lock-screen #panel .panel-button {
|
|
||||||
color: white; }
|
color: white; }
|
||||||
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active,
|
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active, .login-screen #panel .panel-button:focus, .login-screen #panel .panel-button:hover, .login-screen #panel .panel-button:active, .lock-screen #panel .panel-button:focus, .lock-screen #panel .panel-button:hover, .lock-screen #panel .panel-button:active {
|
||||||
.login-screen #panel .panel-button:focus,
|
|
||||||
.login-screen #panel .panel-button:hover,
|
|
||||||
.login-screen #panel .panel-button:active,
|
|
||||||
.lock-screen #panel .panel-button:focus,
|
|
||||||
.lock-screen #panel .panel-button:hover,
|
|
||||||
.lock-screen #panel .panel-button:active {
|
|
||||||
color: white; }
|
color: white; }
|
||||||
#panel .panel-status-indicators-box,
|
#panel .panel-status-indicators-box,
|
||||||
#panel .panel-status-menu-box {
|
#panel .panel-status-menu-box {
|
||||||
spacing: 2px; }
|
spacing: 2px; }
|
||||||
#panel .power-status.panel-status-indicators-box {
|
|
||||||
spacing: 0; }
|
|
||||||
#panel .screencast-indicator {
|
#panel .screencast-indicator {
|
||||||
color: #f57900; }
|
color: #f57900; }
|
||||||
#panel.solid {
|
|
||||||
background-color: black;
|
|
||||||
/* transition from transparent to solid */
|
|
||||||
transition-duration: 300ms; }
|
|
||||||
#panel.solid .panel-corner {
|
|
||||||
-panel-corner-background-color: black; }
|
|
||||||
#panel.solid .panel-button {
|
|
||||||
color: #ccc;
|
|
||||||
text-shadow: none; }
|
|
||||||
#panel.solid .panel-button:hover {
|
|
||||||
color: white; }
|
|
||||||
#panel.solid .system-status-icon,
|
|
||||||
#panel.solid .app-menu-icon > StIcon,
|
|
||||||
#panel.solid .popup-menu-arrow {
|
|
||||||
icon-shadow: none; }
|
|
||||||
|
|
||||||
#calendarArea {
|
#calendarArea {
|
||||||
padding: 0.75em 1.0em; }
|
padding: 0.75em 1.0em; }
|
||||||
@ -761,20 +646,9 @@ StScrollBar {
|
|||||||
.datemenu-displays-section {
|
.datemenu-displays-section {
|
||||||
padding-bottom: 3em; }
|
padding-bottom: 3em; }
|
||||||
|
|
||||||
.datemenu-displays-box {
|
|
||||||
spacing: 1em; }
|
|
||||||
|
|
||||||
.datemenu-calendar-column {
|
|
||||||
border: 0 solid #0d0d0d; }
|
|
||||||
.datemenu-calendar-column:ltr {
|
|
||||||
border-left-width: 1px; }
|
|
||||||
.datemenu-calendar-column:rtl {
|
|
||||||
border-right-width: 1px; }
|
|
||||||
|
|
||||||
.datemenu-today-button,
|
.datemenu-today-button,
|
||||||
.world-clocks-button,
|
.world-clocks-button,
|
||||||
.weather-button,
|
.message-list-section-title {
|
||||||
.events-section-title {
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: .4em; }
|
padding: .4em; }
|
||||||
|
|
||||||
@ -787,16 +661,12 @@ StScrollBar {
|
|||||||
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
||||||
.world-clocks-button:hover,
|
.world-clocks-button:hover,
|
||||||
.world-clocks-button:focus,
|
.world-clocks-button:focus,
|
||||||
.weather-button:hover,
|
.message-list-section-title:hover,
|
||||||
.weather-button:focus,
|
.message-list-section-title:focus {
|
||||||
.events-section-title:hover,
|
|
||||||
.events-section-title:focus {
|
|
||||||
background-color: #0d0d0d; }
|
background-color: #0d0d0d; }
|
||||||
|
|
||||||
.datemenu-today-button:active,
|
.datemenu-today-button:active,
|
||||||
.world-clocks-button:active,
|
.world-clocks-button:active,
|
||||||
.weather-button:active,
|
.message-list-section-title:active {
|
||||||
.events-section-title:active {
|
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #215d9c; }
|
background-color: #215d9c; }
|
||||||
|
|
||||||
@ -804,17 +674,13 @@ StScrollBar {
|
|||||||
font-size: 1.5em; }
|
font-size: 1.5em; }
|
||||||
|
|
||||||
.world-clocks-header,
|
.world-clocks-header,
|
||||||
.weather-header,
|
.message-list-section-title {
|
||||||
.events-section-title {
|
|
||||||
color: #999999;
|
color: #999999;
|
||||||
font-weight: bold; }
|
font-weight: bold; }
|
||||||
|
|
||||||
.world-clocks-grid {
|
.world-clocks-grid {
|
||||||
spacing-rows: 0.4em; }
|
spacing-rows: 0.4em; }
|
||||||
|
|
||||||
.weather-box {
|
|
||||||
spacing: 0.4em; }
|
|
||||||
|
|
||||||
.calendar-month-label {
|
.calendar-month-label {
|
||||||
color: #f2f2f2;
|
color: #f2f2f2;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -850,7 +716,7 @@ StScrollBar {
|
|||||||
border-radius: 1.4em; }
|
border-radius: 1.4em; }
|
||||||
.calendar-day-base:hover, .calendar-day-base:focus {
|
.calendar-day-base:hover, .calendar-day-base:focus {
|
||||||
background-color: #0d0d0d; }
|
background-color: #0d0d0d; }
|
||||||
.calendar-day-base:active, .calendar-day-base:selected {
|
.calendar-day-base:active {
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
border-color: transparent; }
|
border-color: transparent; }
|
||||||
@ -884,90 +750,63 @@ StScrollBar {
|
|||||||
color: rgba(255, 255, 255, 0.15);
|
color: rgba(255, 255, 255, 0.15);
|
||||||
opacity: 0.5; }
|
opacity: 0.5; }
|
||||||
|
|
||||||
.calendar-week-number {
|
|
||||||
font-size: 70%;
|
|
||||||
font-weight: bold;
|
|
||||||
width: 2.3em;
|
|
||||||
height: 1.8em;
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 0.5em 0 0;
|
|
||||||
margin: 6px;
|
|
||||||
background-color: rgba(255, 255, 255, 0.3);
|
|
||||||
color: #000; }
|
|
||||||
|
|
||||||
/* Message list */
|
/* Message list */
|
||||||
.message-list {
|
.message-list {
|
||||||
width: 31.5em; }
|
width: 420px; }
|
||||||
|
|
||||||
.message-list-clear-button.button {
|
|
||||||
background-color: transparent;
|
|
||||||
margin: 1.5em 1.5em 0; }
|
|
||||||
.message-list-clear-button.button:hover, .message-list-clear-button.button:focus {
|
|
||||||
background-color: #0d0d0d; }
|
|
||||||
|
|
||||||
.message-list-sections {
|
.message-list-sections {
|
||||||
spacing: 1em; }
|
spacing: 1.5em; }
|
||||||
|
|
||||||
.message-list-section,
|
.message-list-section,
|
||||||
.message-list-section-list {
|
.message-list-section-list {
|
||||||
|
spacing: 0.7em; }
|
||||||
|
|
||||||
|
.message-list-section-title-box {
|
||||||
spacing: 0.4em; }
|
spacing: 0.4em; }
|
||||||
|
|
||||||
|
.message-list-section-close > StIcon {
|
||||||
|
icon-size: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #000;
|
||||||
|
background-color: #666666; }
|
||||||
|
|
||||||
|
/* FIXME: how do you do this in sass? */
|
||||||
|
.message-list-section-close:hover > StIcon,
|
||||||
|
.message-list-section-close:focus > StIcon {
|
||||||
|
background-color: #999999; }
|
||||||
|
|
||||||
.message {
|
.message {
|
||||||
|
background-color: #0d0d0d;
|
||||||
border-radius: 3px; }
|
border-radius: 3px; }
|
||||||
.message:hover, .message:focus {
|
.message:hover, .message:focus {
|
||||||
background-color: #0d0d0d; }
|
background-color: #262626; }
|
||||||
|
|
||||||
.message-icon-bin {
|
.message-icon-bin {
|
||||||
padding: 0.68em 0.2em 0.68em 0.68em; }
|
padding: 8px 0px 8px 8px; }
|
||||||
.message-icon-bin:rtl {
|
.message-icon-bin:rtl {
|
||||||
padding: 0.68em 0.68em 0.68em 0.2em; }
|
padding: 8px 8px 8px 0px; }
|
||||||
|
|
||||||
.message-icon-bin > StIcon {
|
.message-icon-bin > StIcon {
|
||||||
color: #cccccc;
|
icon-size: 32px; }
|
||||||
icon-size: 1.09em;
|
|
||||||
-st-icon-style: symbolic; }
|
.message-secondary-bin:ltr {
|
||||||
|
padding-left: 8px; }
|
||||||
|
.message-secondary-bin:rtl {
|
||||||
|
padding-right: 8px; }
|
||||||
|
|
||||||
.message-secondary-bin {
|
.message-secondary-bin {
|
||||||
padding: 0 0.82em; }
|
color: #999999; }
|
||||||
|
|
||||||
.message-secondary-bin > .event-time {
|
|
||||||
color: #999999;
|
|
||||||
font-size: 0.7em;
|
|
||||||
/* HACK: the label should be baseline-aligned with a 1em label,
|
|
||||||
fake this with some bottom padding */
|
|
||||||
padding-bottom: 0.13em; }
|
|
||||||
|
|
||||||
.message-secondary-bin > StIcon {
|
.message-secondary-bin > StIcon {
|
||||||
icon-size: 1.09em; }
|
icon-size: 16px; }
|
||||||
|
|
||||||
.message-title {
|
.message-title {
|
||||||
color: #f2f2f2; }
|
font-weight: bold;
|
||||||
|
font-size: 1.1em; }
|
||||||
|
|
||||||
.message-content {
|
.message-content {
|
||||||
color: #cccccc;
|
padding: 8px;
|
||||||
padding: 10px; }
|
font-size: .9em; }
|
||||||
|
|
||||||
.message-media-control {
|
|
||||||
padding: 12px;
|
|
||||||
color: #cccccc; }
|
|
||||||
.message-media-control:last-child:ltr {
|
|
||||||
padding-right: 18px; }
|
|
||||||
.message-media-control:last-child:rtl {
|
|
||||||
padding-left: 18px; }
|
|
||||||
.message-media-control:hover {
|
|
||||||
color: #fff; }
|
|
||||||
.message-media-control:insensitive {
|
|
||||||
color: #999999; }
|
|
||||||
|
|
||||||
.media-message-cover-icon {
|
|
||||||
icon-size: 48px !important; }
|
|
||||||
.media-message-cover-icon.fallback {
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #000;
|
|
||||||
border: 2px solid #000;
|
|
||||||
border-radius: 2px;
|
|
||||||
icon-size: 16px;
|
|
||||||
padding: 8px; }
|
|
||||||
|
|
||||||
.system-switch-user-submenu-icon.user-icon {
|
.system-switch-user-submenu-icon.user-icon {
|
||||||
icon-size: 20px;
|
icon-size: 20px;
|
||||||
@ -984,7 +823,7 @@ StScrollBar {
|
|||||||
color: transparent; }
|
color: transparent; }
|
||||||
|
|
||||||
.aggregate-menu {
|
.aggregate-menu {
|
||||||
min-width: 21em; }
|
width: 360px; }
|
||||||
.aggregate-menu .popup-menu-icon {
|
.aggregate-menu .popup-menu-icon {
|
||||||
padding: 0 4px; }
|
padding: 0 4px; }
|
||||||
|
|
||||||
@ -1025,18 +864,18 @@ StScrollBar {
|
|||||||
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
||||||
background-size: 32px;
|
background-size: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
width: 32px;
|
width: 32px; }
|
||||||
|
|
||||||
|
.window-close {
|
||||||
-shell-close-overlap: 16px; }
|
-shell-close-overlap: 16px; }
|
||||||
.window-close:hover {
|
.window-close:rtl {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/close-window-hover.svg"); }
|
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
|
||||||
.window-close:active {
|
|
||||||
background-image: url("resource:///org/gnome/shell/theme/close-window-active.svg"); }
|
|
||||||
|
|
||||||
/* NETWORK DIALOGS */
|
/* NETWORK DIALOGS */
|
||||||
.nm-dialog {
|
.nm-dialog {
|
||||||
max-height: 34em;
|
max-height: 500px;
|
||||||
min-height: 31em;
|
min-height: 450px;
|
||||||
min-width: 32em; }
|
min-width: 470px; }
|
||||||
|
|
||||||
.nm-dialog-content {
|
.nm-dialog-content {
|
||||||
spacing: 20px;
|
spacing: 20px;
|
||||||
@ -1094,11 +933,13 @@ StScrollBar {
|
|||||||
padding-bottom: 32px; }
|
padding-bottom: 32px; }
|
||||||
|
|
||||||
.window-picker {
|
.window-picker {
|
||||||
-horizontal-spacing: 16px;
|
-horizontal-spacing: 32px;
|
||||||
-vertical-spacing: 16px;
|
-vertical-spacing: 32px;
|
||||||
padding: 0 16px 16px; }
|
padding-left: 32px;
|
||||||
|
padding-right: 32px;
|
||||||
|
padding-bottom: 48px; }
|
||||||
.window-picker.external-monitor {
|
.window-picker.external-monitor {
|
||||||
padding: 16px; }
|
padding: 32px; }
|
||||||
|
|
||||||
.window-clone-border {
|
.window-clone-border {
|
||||||
border: 4px solid #215d9c;
|
border: 4px solid #215d9c;
|
||||||
@ -1107,22 +948,22 @@ StScrollBar {
|
|||||||
|
|
||||||
.window-caption {
|
.window-caption {
|
||||||
spacing: 25px;
|
spacing: 25px;
|
||||||
color: #ffffff;
|
color: #eeeeec;
|
||||||
background-color: #215d9c;
|
background-color: rgba(46, 52, 54, 0.7);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 4px 12px; }
|
padding: 4px 12px;
|
||||||
|
-shell-caption-spacing: 12px; }
|
||||||
|
.window-caption:hover {
|
||||||
|
background-color: #215d9c;
|
||||||
|
color: #ffffff; }
|
||||||
|
|
||||||
.search-entry {
|
.search-entry {
|
||||||
width: 320px;
|
width: 320px;
|
||||||
padding: 7px 9px;
|
padding: 7px 9px;
|
||||||
border-radius: 6px;
|
border-radius: 6px; }
|
||||||
border-color: #747467;
|
|
||||||
color: #eeeeec;
|
|
||||||
background-color: #2e3436; }
|
|
||||||
.search-entry:focus {
|
.search-entry:focus {
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
border-width: 2px;
|
border-width: 2px; }
|
||||||
border-color: #215d9c; }
|
|
||||||
.search-entry .search-entry-icon {
|
.search-entry .search-entry-icon {
|
||||||
icon-size: 1em;
|
icon-size: 1em;
|
||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
@ -1148,30 +989,31 @@ StScrollBar {
|
|||||||
spacing: 3px; }
|
spacing: 3px; }
|
||||||
|
|
||||||
.search-section-separator {
|
.search-section-separator {
|
||||||
height: 2px;
|
-gradient-height: 1px;
|
||||||
background-color: rgba(255, 255, 255, 0.2); }
|
-gradient-start: rgba(255, 255, 255, 0);
|
||||||
|
-gradient-end: rgba(255, 255, 255, 0.1);
|
||||||
|
-margin-horizontal: 1.5em;
|
||||||
|
height: 1px; }
|
||||||
|
|
||||||
.list-search-result-content {
|
.list-search-result-content {
|
||||||
spacing: 30px; }
|
spacing: 12px;
|
||||||
|
padding: 12px; }
|
||||||
|
|
||||||
.list-search-result-title {
|
.list-search-result-title {
|
||||||
color: #e2e2df;
|
font-size: 1.5em;
|
||||||
spacing: 12px; }
|
color: #e2e2df; }
|
||||||
|
|
||||||
.list-search-result-description {
|
.list-search-result-description {
|
||||||
color: rgba(202, 202, 196, 0.5); }
|
color: #cacac4; }
|
||||||
|
|
||||||
.list-search-provider-details {
|
|
||||||
width: 150px;
|
|
||||||
color: #e2e2df;
|
|
||||||
margin-top: 0.24em; }
|
|
||||||
|
|
||||||
.list-search-provider-content {
|
|
||||||
spacing: 20px; }
|
|
||||||
|
|
||||||
.search-provider-icon {
|
.search-provider-icon {
|
||||||
padding: 15px; }
|
padding: 15px; }
|
||||||
|
|
||||||
|
.search-provider-icon-more {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/more-results.svg"); }
|
||||||
|
|
||||||
/* DASHBOARD */
|
/* DASHBOARD */
|
||||||
#dash {
|
#dash {
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
@ -1210,12 +1052,6 @@ StScrollBar {
|
|||||||
.icon-grid .overview-icon {
|
.icon-grid .overview-icon {
|
||||||
icon-size: 96px; }
|
icon-size: 96px; }
|
||||||
|
|
||||||
.system-action-icon {
|
|
||||||
background-color: black;
|
|
||||||
color: white;
|
|
||||||
border-radius: 99px;
|
|
||||||
icon-size: 48px; }
|
|
||||||
|
|
||||||
.app-view-controls {
|
.app-view-controls {
|
||||||
padding-bottom: 32px; }
|
padding-bottom: 32px; }
|
||||||
|
|
||||||
@ -1238,7 +1074,6 @@ StScrollBar {
|
|||||||
.list-search-result:active,
|
.list-search-result:active,
|
||||||
.list-search-result:checked {
|
.list-search-result:checked {
|
||||||
background-color: rgba(23, 25, 26, 0.9); }
|
background-color: rgba(23, 25, 26, 0.9); }
|
||||||
|
|
||||||
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
|
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
|
||||||
.list-search-result:focus,
|
.list-search-result:focus,
|
||||||
.list-search-result:selected,
|
.list-search-result:selected,
|
||||||
@ -1246,8 +1081,7 @@ StScrollBar {
|
|||||||
background-color: rgba(238, 238, 236, 0.1);
|
background-color: rgba(238, 238, 236, 0.1);
|
||||||
transition-duration: 200ms; }
|
transition-duration: 200ms; }
|
||||||
|
|
||||||
.app-well-app:active .overview-icon,
|
.app-well-app:active .overview-icon, .app-well-app:checked .overview-icon,
|
||||||
.app-well-app:checked .overview-icon,
|
|
||||||
.app-well-app.app-folder:active .overview-icon,
|
.app-well-app.app-folder:active .overview-icon,
|
||||||
.app-well-app.app-folder:checked .overview-icon,
|
.app-well-app.app-folder:checked .overview-icon,
|
||||||
.show-apps:active .overview-icon,
|
.show-apps:active .overview-icon,
|
||||||
@ -1256,10 +1090,7 @@ StScrollBar {
|
|||||||
.grid-search-result:checked .overview-icon {
|
.grid-search-result:checked .overview-icon {
|
||||||
background-color: rgba(23, 25, 26, 0.9);
|
background-color: rgba(23, 25, 26, 0.9);
|
||||||
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
|
||||||
|
.app-well-app:hover .overview-icon, .app-well-app:focus .overview-icon, .app-well-app:selected .overview-icon,
|
||||||
.app-well-app:hover .overview-icon,
|
|
||||||
.app-well-app:focus .overview-icon,
|
|
||||||
.app-well-app:selected .overview-icon,
|
|
||||||
.app-well-app.app-folder:hover .overview-icon,
|
.app-well-app.app-folder:hover .overview-icon,
|
||||||
.app-well-app.app-folder:focus .overview-icon,
|
.app-well-app.app-folder:focus .overview-icon,
|
||||||
.app-well-app.app-folder:selected .overview-icon,
|
.app-well-app.app-folder:selected .overview-icon,
|
||||||
@ -1485,6 +1316,38 @@ StScrollBar {
|
|||||||
color: pink; }
|
color: pink; }
|
||||||
|
|
||||||
/* Eeeky things */
|
/* Eeeky things */
|
||||||
|
.legacy-tray {
|
||||||
|
background-color: #000;
|
||||||
|
border: 1px solid black;
|
||||||
|
border-bottom-width: 0; }
|
||||||
|
.legacy-tray:ltr {
|
||||||
|
border-radius: 0 6px 0 0;
|
||||||
|
border-left-width: 0; }
|
||||||
|
.legacy-tray:rtl {
|
||||||
|
border-radius: 6px 0 0 0;
|
||||||
|
border-right-width: 0; }
|
||||||
|
|
||||||
|
.legacy-tray-handle,
|
||||||
|
.legacy-tray-icon {
|
||||||
|
padding: 6px; }
|
||||||
|
.legacy-tray-handle StIcon,
|
||||||
|
.legacy-tray-icon StIcon {
|
||||||
|
icon-size: 24px; }
|
||||||
|
.legacy-tray-handle:hover, .legacy-tray-handle:focus,
|
||||||
|
.legacy-tray-icon:hover,
|
||||||
|
.legacy-tray-icon:focus {
|
||||||
|
background-color: rgba(255, 255, 255, 0.1); }
|
||||||
|
|
||||||
|
.legacy-tray-icon-box {
|
||||||
|
spacing: 12px; }
|
||||||
|
.legacy-tray-icon-box:ltr {
|
||||||
|
padding-left: 12px; }
|
||||||
|
.legacy-tray-icon-box:rtl {
|
||||||
|
padding-right: 12px; }
|
||||||
|
.legacy-tray-icon-box StButton {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px; }
|
||||||
|
|
||||||
.magnifier-zoom-region {
|
.magnifier-zoom-region {
|
||||||
border: 2px solid #215d9c; }
|
border: 2px solid #215d9c; }
|
||||||
.magnifier-zoom-region.full-screen {
|
.magnifier-zoom-region.full-screen {
|
||||||
@ -1653,12 +1516,10 @@ StScrollBar {
|
|||||||
|
|
||||||
.login-dialog-user-selection-box {
|
.login-dialog-user-selection-box {
|
||||||
padding: 100px 0px; }
|
padding: 100px 0px; }
|
||||||
|
.login-dialog-user-selection-box .login-dialog-not-listed-label {
|
||||||
.login-dialog-not-listed-label {
|
padding-left: 2px; }
|
||||||
padding-left: 2px; }
|
.login-dialog-not-listed-button:focus .login-dialog-user-selection-box .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-user-selection-box .login-dialog-not-listed-label {
|
||||||
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
|
color: #eeeeec; }
|
||||||
.login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
|
|
||||||
color: #eeeeec; }
|
|
||||||
|
|
||||||
.login-dialog-not-listed-label {
|
.login-dialog-not-listed-label {
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
@ -1673,7 +1534,7 @@ StScrollBar {
|
|||||||
spacing: 12px;
|
spacing: 12px;
|
||||||
padding: .2em;
|
padding: .2em;
|
||||||
width: 23em; }
|
width: 23em; }
|
||||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
|
.login-dialog-user-list:expanded .login-dialog-user-list-item:focus {
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
color: #ffffff; }
|
color: #ffffff; }
|
||||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
||||||
@ -1687,6 +1548,9 @@ StScrollBar {
|
|||||||
padding-right: 1em; }
|
padding-right: 1em; }
|
||||||
.login-dialog-user-list-item:rtl {
|
.login-dialog-user-list-item:rtl {
|
||||||
padding-left: 1em; }
|
padding-left: 1em; }
|
||||||
|
.login-dialog-user-list-item:hover {
|
||||||
|
background-color: #215d9c;
|
||||||
|
color: #ffffff; }
|
||||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||||
height: 2px;
|
height: 2px;
|
||||||
margin: 2px 0 0 0;
|
margin: 2px 0 0 0;
|
||||||
@ -1704,7 +1568,6 @@ StScrollBar {
|
|||||||
|
|
||||||
.user-widget-label:ltr {
|
.user-widget-label:ltr {
|
||||||
padding-left: 18px; }
|
padding-left: 18px; }
|
||||||
|
|
||||||
.user-widget-label:rtl {
|
.user-widget-label:rtl {
|
||||||
padding-right: 18px; }
|
padding-right: 18px; }
|
||||||
|
|
||||||
@ -1832,7 +1695,6 @@ StScrollBar {
|
|||||||
.lg-dialog StEntry {
|
.lg-dialog StEntry {
|
||||||
selection-background-color: #bbbbbb;
|
selection-background-color: #bbbbbb;
|
||||||
selected-color: #333333; }
|
selected-color: #333333; }
|
||||||
|
|
||||||
.lg-dialog .shell-link {
|
.lg-dialog .shell-link {
|
||||||
color: #999999; }
|
color: #999999; }
|
||||||
.lg-dialog .shell-link:hover {
|
.lg-dialog .shell-link:hover {
|
||||||
|
Submodule data/theme/gnome-shell-sass updated: 336c2d5ad6...034d0b775b
@ -118,7 +118,6 @@ StEntry {
|
|||||||
/* Scrollbars */
|
/* Scrollbars */
|
||||||
StScrollView.vfade {
|
StScrollView.vfade {
|
||||||
-st-vfade-offset: 68px; }
|
-st-vfade-offset: 68px; }
|
||||||
|
|
||||||
StScrollView.hfade {
|
StScrollView.hfade {
|
||||||
-st-hfade-offset: 68px; }
|
-st-hfade-offset: 68px; }
|
||||||
|
|
||||||
@ -153,18 +152,14 @@ StScrollBar {
|
|||||||
/* Check Boxes */
|
/* Check Boxes */
|
||||||
.check-box StBoxLayout {
|
.check-box StBoxLayout {
|
||||||
spacing: .8em; }
|
spacing: .8em; }
|
||||||
|
|
||||||
.check-box StBin {
|
.check-box StBin {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 22px;
|
height: 22px;
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
|
||||||
|
|
||||||
.check-box:focus StBin {
|
.check-box:focus StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
|
||||||
|
|
||||||
.check-box:checked StBin {
|
.check-box:checked StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
|
||||||
|
|
||||||
.check-box:focus:checked StBin {
|
.check-box:focus:checked StBin {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
|
||||||
|
|
||||||
@ -204,7 +199,7 @@ StScrollBar {
|
|||||||
border-radius: 9px;
|
border-radius: 9px;
|
||||||
color: #eeeeec;
|
color: #eeeeec;
|
||||||
background-color: rgba(23, 25, 26, 0.95);
|
background-color: rgba(23, 25, 26, 0.95);
|
||||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.5); }
|
||||||
.modal-dialog .modal-dialog-content-box {
|
.modal-dialog .modal-dialog-content-box {
|
||||||
padding: 24px; }
|
padding: 24px; }
|
||||||
.modal-dialog .run-dialog-entry {
|
.modal-dialog .run-dialog-entry {
|
||||||
@ -221,34 +216,15 @@ StScrollBar {
|
|||||||
color: #d6d6d1;
|
color: #d6d6d1;
|
||||||
padding-bottom: .4em; }
|
padding-bottom: .4em; }
|
||||||
|
|
||||||
.mount-dialog-subject,
|
.show-processes-dialog-subject,
|
||||||
|
.mount-question-dialog-subject,
|
||||||
.end-session-dialog-subject {
|
.end-session-dialog-subject {
|
||||||
font-size: 14pt; }
|
font-size: 14pt; }
|
||||||
|
|
||||||
/* Message Dialog */
|
|
||||||
.message-dialog-main-layout {
|
|
||||||
padding: 12px 20px 0;
|
|
||||||
spacing: 12px; }
|
|
||||||
|
|
||||||
.message-dialog-content {
|
|
||||||
max-width: 28em;
|
|
||||||
spacing: 20px; }
|
|
||||||
|
|
||||||
.message-dialog-icon {
|
|
||||||
min-width: 48px;
|
|
||||||
icon-size: 48px; }
|
|
||||||
|
|
||||||
.message-dialog-title {
|
|
||||||
font-weight: bold; }
|
|
||||||
|
|
||||||
.message-dialog-subtitle {
|
|
||||||
color: #8e8e80;
|
|
||||||
font-weight: bold; }
|
|
||||||
|
|
||||||
/* End Session Dialog */
|
/* End Session Dialog */
|
||||||
.end-session-dialog {
|
.end-session-dialog {
|
||||||
spacing: 42px;
|
spacing: 42px;
|
||||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||||
|
|
||||||
.end-session-dialog-list {
|
.end-session-dialog-list {
|
||||||
padding-top: 20px; }
|
padding-top: 20px; }
|
||||||
@ -313,62 +289,75 @@ StScrollBar {
|
|||||||
.shell-mount-operation-icon {
|
.shell-mount-operation-icon {
|
||||||
icon-size: 48px; }
|
icon-size: 48px; }
|
||||||
|
|
||||||
.mount-dialog {
|
.show-processes-dialog,
|
||||||
|
.mount-question-dialog {
|
||||||
spacing: 24px; }
|
spacing: 24px; }
|
||||||
.mount-dialog .message-dialog-title {
|
|
||||||
padding-top: 10px;
|
|
||||||
padding-left: 17px;
|
|
||||||
padding-bottom: 6px;
|
|
||||||
max-width: 34em; }
|
|
||||||
.mount-dialog .message-dialog-title:rtl {
|
|
||||||
padding-left: 0px;
|
|
||||||
padding-right: 17px; }
|
|
||||||
.mount-dialog .message-dialog-body {
|
|
||||||
padding-left: 17px;
|
|
||||||
width: 28em; }
|
|
||||||
.mount-dialog .message-dialog-body:rtl {
|
|
||||||
padding-left: 0px;
|
|
||||||
padding-right: 17px; }
|
|
||||||
|
|
||||||
.mount-dialog-app-list {
|
.show-processes-dialog-subject,
|
||||||
|
.mount-question-dialog-subject {
|
||||||
|
padding-top: 10px;
|
||||||
|
padding-left: 17px;
|
||||||
|
padding-bottom: 6px; }
|
||||||
|
|
||||||
|
.mount-question-dialog-subject {
|
||||||
|
max-width: 500px; }
|
||||||
|
|
||||||
|
.show-processes-dialog-subject:rtl,
|
||||||
|
.mount-question-dialog-subject:rtl {
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 17px; }
|
||||||
|
|
||||||
|
.show-processes-dialog-description,
|
||||||
|
.mount-question-dialog-description {
|
||||||
|
padding-left: 17px;
|
||||||
|
width: 28em; }
|
||||||
|
|
||||||
|
.show-processes-dialog-description:rtl,
|
||||||
|
.mount-question-dialog-description:rtl {
|
||||||
|
padding-right: 17px; }
|
||||||
|
|
||||||
|
.show-processes-dialog-app-list {
|
||||||
max-height: 200px;
|
max-height: 200px;
|
||||||
padding-top: 24px;
|
padding-top: 24px;
|
||||||
padding-left: 49px;
|
padding-left: 49px;
|
||||||
padding-right: 32px; }
|
padding-right: 32px; }
|
||||||
|
|
||||||
.mount-dialog-app-list:rtl {
|
.show-processes-dialog-app-list:rtl {
|
||||||
padding-right: 49px;
|
padding-right: 49px;
|
||||||
padding-left: 32px; }
|
padding-left: 32px; }
|
||||||
|
|
||||||
.mount-dialog-app-list-item {
|
.show-processes-dialog-app-list-item {
|
||||||
color: #d6d6d1; }
|
color: #d6d6d1; }
|
||||||
.mount-dialog-app-list-item:hover {
|
.show-processes-dialog-app-list-item:hover {
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
.mount-dialog-app-list-item:ltr {
|
.show-processes-dialog-app-list-item:ltr {
|
||||||
padding-right: 1em; }
|
padding-right: 1em; }
|
||||||
.mount-dialog-app-list-item:rtl {
|
.show-processes-dialog-app-list-item:rtl {
|
||||||
padding-left: 1em; }
|
padding-left: 1em; }
|
||||||
|
|
||||||
.mount-dialog-app-list-item-icon:ltr {
|
.show-processes-dialog-app-list-item-icon:ltr {
|
||||||
padding-right: 17px; }
|
padding-right: 17px; }
|
||||||
|
.show-processes-dialog-app-list-item-icon:rtl {
|
||||||
.mount-dialog-app-list-item-icon:rtl {
|
|
||||||
padding-left: 17px; }
|
padding-left: 17px; }
|
||||||
|
|
||||||
.mount-dialog-app-list-item-name {
|
.show-processes-dialog-app-list-item-name {
|
||||||
font-size: 10pt; }
|
font-size: 10pt; }
|
||||||
|
|
||||||
/* Password or Authentication Dialog */
|
/* Password or Authentication Dialog */
|
||||||
.prompt-dialog {
|
.prompt-dialog {
|
||||||
width: 34em;
|
width: 500px;
|
||||||
border: 3px solid rgba(238, 238, 236, 0.2); }
|
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||||
.prompt-dialog .message-dialog-main-layout {
|
|
||||||
spacing: 24px;
|
.prompt-dialog-main-layout {
|
||||||
padding: 10px; }
|
spacing: 24px;
|
||||||
.prompt-dialog .message-dialog-content {
|
padding: 10px; }
|
||||||
spacing: 16px; }
|
|
||||||
.prompt-dialog .message-dialog-title {
|
.prompt-dialog-message-layout {
|
||||||
color: #b2b2a9; }
|
spacing: 16px; }
|
||||||
|
|
||||||
|
.prompt-dialog-headline {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #b2b2a9; }
|
||||||
|
|
||||||
.prompt-dialog-description:rtl {
|
.prompt-dialog-description:rtl {
|
||||||
text-align: right; }
|
text-align: right; }
|
||||||
@ -410,54 +399,6 @@ StScrollBar {
|
|||||||
width: 48px;
|
width: 48px;
|
||||||
height: 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 rgba(238, 238, 236, 0.2);
|
|
||||||
border-radius: 12px; }
|
|
||||||
.audio-selection-device:active, .audio-selection-device:hover, .audio-selection-device:focus {
|
|
||||||
background-color: #215d9c; }
|
|
||||||
|
|
||||||
.audio-selection-device-box {
|
|
||||||
padding: 20px;
|
|
||||||
spacing: 20px; }
|
|
||||||
|
|
||||||
.audio-selection-device-icon {
|
|
||||||
icon-size: 64px; }
|
|
||||||
|
|
||||||
/* Access Dialog */
|
|
||||||
.access-dialog {
|
|
||||||
spacing: 30px; }
|
|
||||||
|
|
||||||
/* Geolocation Dialog */
|
|
||||||
.geolocation-dialog {
|
|
||||||
spacing: 30px; }
|
|
||||||
|
|
||||||
/* Extension Dialog */
|
|
||||||
.extension-dialog .message-dialog-main-layout {
|
|
||||||
spacing: 24px;
|
|
||||||
padding: 10px; }
|
|
||||||
|
|
||||||
.extension-dialog .message-dialog-title {
|
|
||||||
color: #b2b2a9; }
|
|
||||||
|
|
||||||
/* Inhibit-Shortcuts Dialog */
|
|
||||||
.inhibit-shortcuts-dialog {
|
|
||||||
spacing: 30px; }
|
|
||||||
|
|
||||||
/* Network Agent Dialog */
|
/* Network Agent Dialog */
|
||||||
.network-dialog-secret-table {
|
.network-dialog-secret-table {
|
||||||
spacing-rows: 15px;
|
spacing-rows: 15px;
|
||||||
@ -467,9 +408,9 @@ StScrollBar {
|
|||||||
spacing-rows: 15px;
|
spacing-rows: 15px;
|
||||||
spacing-columns: 1em; }
|
spacing-columns: 1em; }
|
||||||
|
|
||||||
/* Popovers/Menus */
|
/* Popvers/Menus */
|
||||||
.popup-menu {
|
.popup-menu {
|
||||||
min-width: 15em; }
|
min-width: 200px; }
|
||||||
.popup-menu .popup-sub-menu {
|
.popup-menu .popup-sub-menu {
|
||||||
background-color: #343a3a;
|
background-color: #343a3a;
|
||||||
box-shadow: inset 0 -1px 0px #282c2c; }
|
box-shadow: inset 0 -1px 0px #282c2c; }
|
||||||
@ -546,21 +487,6 @@ StScrollBar {
|
|||||||
border-radius: 0.3em;
|
border-radius: 0.3em;
|
||||||
background-color: rgba(11, 12, 13, 0.5);
|
background-color: rgba(11, 12, 13, 0.5);
|
||||||
color: #eeeeec; }
|
color: #eeeeec; }
|
||||||
.osd-window .level-bar {
|
|
||||||
background-color: #eeeeec;
|
|
||||||
border-radius: 0.3em; }
|
|
||||||
|
|
||||||
/* Pad OSD */
|
|
||||||
.pad-osd-window {
|
|
||||||
padding: 32px;
|
|
||||||
background-color: rgba(0, 0, 0, 0.8); }
|
|
||||||
.pad-osd-window .pad-osd-title-box {
|
|
||||||
spacing: 12px; }
|
|
||||||
.pad-osd-window .pad-osd-title-menu-box {
|
|
||||||
spacing: 6px; }
|
|
||||||
|
|
||||||
.combo-box-label {
|
|
||||||
width: 15em; }
|
|
||||||
|
|
||||||
/* App Switcher */
|
/* App Switcher */
|
||||||
.switcher-popup {
|
.switcher-popup {
|
||||||
@ -604,10 +530,6 @@ StScrollBar {
|
|||||||
width: 96px;
|
width: 96px;
|
||||||
height: 96px; }
|
height: 96px; }
|
||||||
|
|
||||||
/* Window Cycler */
|
|
||||||
.cycler-highlight {
|
|
||||||
border: 5px solid #215d9c; }
|
|
||||||
|
|
||||||
/* Workspace Switcher */
|
/* Workspace Switcher */
|
||||||
.workspace-switcher-group {
|
.workspace-switcher-group {
|
||||||
padding: 12px; }
|
padding: 12px; }
|
||||||
@ -657,9 +579,7 @@ StScrollBar {
|
|||||||
|
|
||||||
/* TOP BAR */
|
/* TOP BAR */
|
||||||
#panel {
|
#panel {
|
||||||
background-color: rgba(0, 0, 0, 0.35);
|
background-color: black;
|
||||||
/* transition from solid to transparent */
|
|
||||||
transition-duration: 500ms;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
height: 1.86em; }
|
height: 1.86em; }
|
||||||
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
|
#panel.unlock-screen, #panel.login-screen, #panel.lock-screen {
|
||||||
@ -668,7 +588,7 @@ StScrollBar {
|
|||||||
spacing: 4px; }
|
spacing: 4px; }
|
||||||
#panel .panel-corner {
|
#panel .panel-corner {
|
||||||
-panel-corner-radius: 6px;
|
-panel-corner-radius: 6px;
|
||||||
-panel-corner-background-color: rgba(0, 0, 0, 0.35);
|
-panel-corner-background-color: black;
|
||||||
-panel-corner-border-width: 2px;
|
-panel-corner-border-width: 2px;
|
||||||
-panel-corner-border-color: transparent; }
|
-panel-corner-border-color: transparent; }
|
||||||
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
|
||||||
@ -681,24 +601,14 @@ StScrollBar {
|
|||||||
-natural-hpadding: 12px;
|
-natural-hpadding: 12px;
|
||||||
-minimum-hpadding: 6px;
|
-minimum-hpadding: 6px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #eee;
|
color: #ccc;
|
||||||
text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9);
|
|
||||||
transition-duration: 100ms; }
|
transition-duration: 100ms; }
|
||||||
#panel .panel-button .app-menu-icon {
|
#panel .panel-button .app-menu-icon {
|
||||||
-st-icon-style: symbolic;
|
-st-icon-style: symbolic;
|
||||||
margin-left: 4px;
|
margin-left: 4px;
|
||||||
margin-right: 4px; }
|
margin-right: 4px; }
|
||||||
#panel .panel-button .system-status-icon,
|
|
||||||
#panel .panel-button .app-menu-icon > StIcon,
|
|
||||||
#panel .panel-button .popup-menu-arrow {
|
|
||||||
icon-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9); }
|
|
||||||
#panel .panel-button:hover {
|
#panel .panel-button:hover {
|
||||||
color: white;
|
color: white; }
|
||||||
text-shadow: 0px 1px 6px black; }
|
|
||||||
#panel .panel-button:hover .system-status-icon,
|
|
||||||
#panel .panel-button:hover .app-menu-icon > StIcon,
|
|
||||||
#panel .panel-button:hover .popup-menu-arrow {
|
|
||||||
icon-shadow: 0px 1px 6px black; }
|
|
||||||
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
#panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
|
||||||
background-color: rgba(0, 0, 0, 0.01);
|
background-color: rgba(0, 0, 0, 0.01);
|
||||||
box-shadow: inset 0 -2px 0px #256ab1;
|
box-shadow: inset 0 -2px 0px #256ab1;
|
||||||
@ -708,40 +618,15 @@ StScrollBar {
|
|||||||
#panel .panel-button .system-status-icon {
|
#panel .panel-button .system-status-icon {
|
||||||
icon-size: 1.09em;
|
icon-size: 1.09em;
|
||||||
padding: 0 5px; }
|
padding: 0 5px; }
|
||||||
.unlock-screen #panel .panel-button,
|
.unlock-screen #panel .panel-button, .login-screen #panel .panel-button, .lock-screen #panel .panel-button {
|
||||||
.login-screen #panel .panel-button,
|
|
||||||
.lock-screen #panel .panel-button {
|
|
||||||
color: white; }
|
color: white; }
|
||||||
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active,
|
.unlock-screen #panel .panel-button:focus, .unlock-screen #panel .panel-button:hover, .unlock-screen #panel .panel-button:active, .login-screen #panel .panel-button:focus, .login-screen #panel .panel-button:hover, .login-screen #panel .panel-button:active, .lock-screen #panel .panel-button:focus, .lock-screen #panel .panel-button:hover, .lock-screen #panel .panel-button:active {
|
||||||
.login-screen #panel .panel-button:focus,
|
|
||||||
.login-screen #panel .panel-button:hover,
|
|
||||||
.login-screen #panel .panel-button:active,
|
|
||||||
.lock-screen #panel .panel-button:focus,
|
|
||||||
.lock-screen #panel .panel-button:hover,
|
|
||||||
.lock-screen #panel .panel-button:active {
|
|
||||||
color: white; }
|
color: white; }
|
||||||
#panel .panel-status-indicators-box,
|
#panel .panel-status-indicators-box,
|
||||||
#panel .panel-status-menu-box {
|
#panel .panel-status-menu-box {
|
||||||
spacing: 2px; }
|
spacing: 2px; }
|
||||||
#panel .power-status.panel-status-indicators-box {
|
|
||||||
spacing: 0; }
|
|
||||||
#panel .screencast-indicator {
|
#panel .screencast-indicator {
|
||||||
color: #f57900; }
|
color: #f57900; }
|
||||||
#panel.solid {
|
|
||||||
background-color: black;
|
|
||||||
/* transition from transparent to solid */
|
|
||||||
transition-duration: 300ms; }
|
|
||||||
#panel.solid .panel-corner {
|
|
||||||
-panel-corner-background-color: black; }
|
|
||||||
#panel.solid .panel-button {
|
|
||||||
color: #ccc;
|
|
||||||
text-shadow: none; }
|
|
||||||
#panel.solid .panel-button:hover {
|
|
||||||
color: white; }
|
|
||||||
#panel.solid .system-status-icon,
|
|
||||||
#panel.solid .app-menu-icon > StIcon,
|
|
||||||
#panel.solid .popup-menu-arrow {
|
|
||||||
icon-shadow: none; }
|
|
||||||
|
|
||||||
#calendarArea {
|
#calendarArea {
|
||||||
padding: 0.75em 1.0em; }
|
padding: 0.75em 1.0em; }
|
||||||
@ -761,20 +646,9 @@ StScrollBar {
|
|||||||
.datemenu-displays-section {
|
.datemenu-displays-section {
|
||||||
padding-bottom: 3em; }
|
padding-bottom: 3em; }
|
||||||
|
|
||||||
.datemenu-displays-box {
|
|
||||||
spacing: 1em; }
|
|
||||||
|
|
||||||
.datemenu-calendar-column {
|
|
||||||
border: 0 solid #454c4c; }
|
|
||||||
.datemenu-calendar-column:ltr {
|
|
||||||
border-left-width: 1px; }
|
|
||||||
.datemenu-calendar-column:rtl {
|
|
||||||
border-right-width: 1px; }
|
|
||||||
|
|
||||||
.datemenu-today-button,
|
.datemenu-today-button,
|
||||||
.world-clocks-button,
|
.world-clocks-button,
|
||||||
.weather-button,
|
.message-list-section-title {
|
||||||
.events-section-title {
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: .4em; }
|
padding: .4em; }
|
||||||
|
|
||||||
@ -787,16 +661,12 @@ StScrollBar {
|
|||||||
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
.datemenu-today-button:hover, .datemenu-today-button:focus,
|
||||||
.world-clocks-button:hover,
|
.world-clocks-button:hover,
|
||||||
.world-clocks-button:focus,
|
.world-clocks-button:focus,
|
||||||
.weather-button:hover,
|
.message-list-section-title:hover,
|
||||||
.weather-button:focus,
|
.message-list-section-title:focus {
|
||||||
.events-section-title:hover,
|
|
||||||
.events-section-title:focus {
|
|
||||||
background-color: #454c4c; }
|
background-color: #454c4c; }
|
||||||
|
|
||||||
.datemenu-today-button:active,
|
.datemenu-today-button:active,
|
||||||
.world-clocks-button:active,
|
.world-clocks-button:active,
|
||||||
.weather-button:active,
|
.message-list-section-title:active {
|
||||||
.events-section-title:active {
|
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #215d9c; }
|
background-color: #215d9c; }
|
||||||
|
|
||||||
@ -804,17 +674,13 @@ StScrollBar {
|
|||||||
font-size: 1.5em; }
|
font-size: 1.5em; }
|
||||||
|
|
||||||
.world-clocks-header,
|
.world-clocks-header,
|
||||||
.weather-header,
|
.message-list-section-title {
|
||||||
.events-section-title {
|
|
||||||
color: #8e8e80;
|
color: #8e8e80;
|
||||||
font-weight: bold; }
|
font-weight: bold; }
|
||||||
|
|
||||||
.world-clocks-grid {
|
.world-clocks-grid {
|
||||||
spacing-rows: 0.4em; }
|
spacing-rows: 0.4em; }
|
||||||
|
|
||||||
.weather-box {
|
|
||||||
spacing: 0.4em; }
|
|
||||||
|
|
||||||
.calendar-month-label {
|
.calendar-month-label {
|
||||||
color: #e2e2df;
|
color: #e2e2df;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -850,7 +716,7 @@ StScrollBar {
|
|||||||
border-radius: 1.4em; }
|
border-radius: 1.4em; }
|
||||||
.calendar-day-base:hover, .calendar-day-base:focus {
|
.calendar-day-base:hover, .calendar-day-base:focus {
|
||||||
background-color: #454c4c; }
|
background-color: #454c4c; }
|
||||||
.calendar-day-base:active, .calendar-day-base:selected {
|
.calendar-day-base:active {
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
border-color: transparent; }
|
border-color: transparent; }
|
||||||
@ -884,90 +750,63 @@ StScrollBar {
|
|||||||
color: rgba(238, 238, 236, 0.15);
|
color: rgba(238, 238, 236, 0.15);
|
||||||
opacity: 0.5; }
|
opacity: 0.5; }
|
||||||
|
|
||||||
.calendar-week-number {
|
|
||||||
font-size: 70%;
|
|
||||||
font-weight: bold;
|
|
||||||
width: 2.3em;
|
|
||||||
height: 1.8em;
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 0.5em 0 0;
|
|
||||||
margin: 6px;
|
|
||||||
background-color: rgba(238, 238, 236, 0.3);
|
|
||||||
color: #393f3f; }
|
|
||||||
|
|
||||||
/* Message list */
|
/* Message list */
|
||||||
.message-list {
|
.message-list {
|
||||||
width: 31.5em; }
|
width: 420px; }
|
||||||
|
|
||||||
.message-list-clear-button.button {
|
|
||||||
background-color: transparent;
|
|
||||||
margin: 1.5em 1.5em 0; }
|
|
||||||
.message-list-clear-button.button:hover, .message-list-clear-button.button:focus {
|
|
||||||
background-color: #454c4c; }
|
|
||||||
|
|
||||||
.message-list-sections {
|
.message-list-sections {
|
||||||
spacing: 1em; }
|
spacing: 1.5em; }
|
||||||
|
|
||||||
.message-list-section,
|
.message-list-section,
|
||||||
.message-list-section-list {
|
.message-list-section-list {
|
||||||
|
spacing: 0.7em; }
|
||||||
|
|
||||||
|
.message-list-section-title-box {
|
||||||
spacing: 0.4em; }
|
spacing: 0.4em; }
|
||||||
|
|
||||||
|
.message-list-section-close > StIcon {
|
||||||
|
icon-size: 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #393f3f;
|
||||||
|
background-color: #59594f; }
|
||||||
|
|
||||||
|
/* FIXME: how do you do this in sass? */
|
||||||
|
.message-list-section-close:hover > StIcon,
|
||||||
|
.message-list-section-close:focus > StIcon {
|
||||||
|
background-color: #8e8e80; }
|
||||||
|
|
||||||
.message {
|
.message {
|
||||||
|
background-color: #454c4c;
|
||||||
border-radius: 3px; }
|
border-radius: 3px; }
|
||||||
.message:hover, .message:focus {
|
.message:hover, .message:focus {
|
||||||
background-color: #454c4c; }
|
background-color: #5d6767; }
|
||||||
|
|
||||||
.message-icon-bin {
|
.message-icon-bin {
|
||||||
padding: 0.68em 0.2em 0.68em 0.68em; }
|
padding: 8px 0px 8px 8px; }
|
||||||
.message-icon-bin:rtl {
|
.message-icon-bin:rtl {
|
||||||
padding: 0.68em 0.68em 0.68em 0.2em; }
|
padding: 8px 8px 8px 0px; }
|
||||||
|
|
||||||
.message-icon-bin > StIcon {
|
.message-icon-bin > StIcon {
|
||||||
color: #bebeb6;
|
icon-size: 32px; }
|
||||||
icon-size: 1.09em;
|
|
||||||
-st-icon-style: symbolic; }
|
.message-secondary-bin:ltr {
|
||||||
|
padding-left: 8px; }
|
||||||
|
.message-secondary-bin:rtl {
|
||||||
|
padding-right: 8px; }
|
||||||
|
|
||||||
.message-secondary-bin {
|
.message-secondary-bin {
|
||||||
padding: 0 0.82em; }
|
color: #8e8e80; }
|
||||||
|
|
||||||
.message-secondary-bin > .event-time {
|
|
||||||
color: #8e8e80;
|
|
||||||
font-size: 0.7em;
|
|
||||||
/* HACK: the label should be baseline-aligned with a 1em label,
|
|
||||||
fake this with some bottom padding */
|
|
||||||
padding-bottom: 0.13em; }
|
|
||||||
|
|
||||||
.message-secondary-bin > StIcon {
|
.message-secondary-bin > StIcon {
|
||||||
icon-size: 1.09em; }
|
icon-size: 16px; }
|
||||||
|
|
||||||
.message-title {
|
.message-title {
|
||||||
color: #e2e2df; }
|
font-weight: bold;
|
||||||
|
font-size: 1.1em; }
|
||||||
|
|
||||||
.message-content {
|
.message-content {
|
||||||
color: #bebeb6;
|
padding: 8px;
|
||||||
padding: 10px; }
|
font-size: .9em; }
|
||||||
|
|
||||||
.message-media-control {
|
|
||||||
padding: 12px;
|
|
||||||
color: #bebeb6; }
|
|
||||||
.message-media-control:last-child:ltr {
|
|
||||||
padding-right: 18px; }
|
|
||||||
.message-media-control:last-child:rtl {
|
|
||||||
padding-left: 18px; }
|
|
||||||
.message-media-control:hover {
|
|
||||||
color: #eeeeec; }
|
|
||||||
.message-media-control:insensitive {
|
|
||||||
color: #8e8e80; }
|
|
||||||
|
|
||||||
.media-message-cover-icon {
|
|
||||||
icon-size: 48px !important; }
|
|
||||||
.media-message-cover-icon.fallback {
|
|
||||||
color: #515a5a;
|
|
||||||
background-color: #393f3f;
|
|
||||||
border: 2px solid #393f3f;
|
|
||||||
border-radius: 2px;
|
|
||||||
icon-size: 16px;
|
|
||||||
padding: 8px; }
|
|
||||||
|
|
||||||
.system-switch-user-submenu-icon.user-icon {
|
.system-switch-user-submenu-icon.user-icon {
|
||||||
icon-size: 20px;
|
icon-size: 20px;
|
||||||
@ -984,7 +823,7 @@ StScrollBar {
|
|||||||
color: transparent; }
|
color: transparent; }
|
||||||
|
|
||||||
.aggregate-menu {
|
.aggregate-menu {
|
||||||
min-width: 21em; }
|
width: 280px; }
|
||||||
.aggregate-menu .popup-menu-icon {
|
.aggregate-menu .popup-menu-icon {
|
||||||
padding: 0 4px; }
|
padding: 0 4px; }
|
||||||
|
|
||||||
@ -1025,18 +864,18 @@ StScrollBar {
|
|||||||
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
|
||||||
background-size: 32px;
|
background-size: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
width: 32px;
|
width: 32px; }
|
||||||
|
|
||||||
|
.window-close {
|
||||||
-shell-close-overlap: 16px; }
|
-shell-close-overlap: 16px; }
|
||||||
.window-close:hover {
|
.window-close:rtl {
|
||||||
background-image: url("resource:///org/gnome/shell/theme/close-window-hover.svg"); }
|
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
|
||||||
.window-close:active {
|
|
||||||
background-image: url("resource:///org/gnome/shell/theme/close-window-active.svg"); }
|
|
||||||
|
|
||||||
/* NETWORK DIALOGS */
|
/* NETWORK DIALOGS */
|
||||||
.nm-dialog {
|
.nm-dialog {
|
||||||
max-height: 34em;
|
max-height: 500px;
|
||||||
min-height: 31em;
|
min-height: 450px;
|
||||||
min-width: 32em; }
|
min-width: 470px; }
|
||||||
|
|
||||||
.nm-dialog-content {
|
.nm-dialog-content {
|
||||||
spacing: 20px;
|
spacing: 20px;
|
||||||
@ -1094,11 +933,13 @@ StScrollBar {
|
|||||||
padding-bottom: 32px; }
|
padding-bottom: 32px; }
|
||||||
|
|
||||||
.window-picker {
|
.window-picker {
|
||||||
-horizontal-spacing: 16px;
|
-horizontal-spacing: 32px;
|
||||||
-vertical-spacing: 16px;
|
-vertical-spacing: 32px;
|
||||||
padding: 0 16px 16px; }
|
padding-left: 32px;
|
||||||
|
padding-right: 32px;
|
||||||
|
padding-bottom: 48px; }
|
||||||
.window-picker.external-monitor {
|
.window-picker.external-monitor {
|
||||||
padding: 16px; }
|
padding: 32px; }
|
||||||
|
|
||||||
.window-clone-border {
|
.window-clone-border {
|
||||||
border: 4px solid #215d9c;
|
border: 4px solid #215d9c;
|
||||||
@ -1107,22 +948,22 @@ StScrollBar {
|
|||||||
|
|
||||||
.window-caption {
|
.window-caption {
|
||||||
spacing: 25px;
|
spacing: 25px;
|
||||||
color: #ffffff;
|
color: #eeeeec;
|
||||||
background-color: #215d9c;
|
background-color: rgba(46, 52, 54, 0.7);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 4px 12px; }
|
padding: 4px 12px;
|
||||||
|
-shell-caption-spacing: 12px; }
|
||||||
|
.window-caption:hover {
|
||||||
|
background-color: #215d9c;
|
||||||
|
color: #ffffff; }
|
||||||
|
|
||||||
.search-entry {
|
.search-entry {
|
||||||
width: 320px;
|
width: 320px;
|
||||||
padding: 7px 9px;
|
padding: 7px 9px;
|
||||||
border-radius: 6px;
|
border-radius: 6px; }
|
||||||
border-color: #747467;
|
|
||||||
color: #eeeeec;
|
|
||||||
background-color: #2e3436; }
|
|
||||||
.search-entry:focus {
|
.search-entry:focus {
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
border-width: 2px;
|
border-width: 2px; }
|
||||||
border-color: #215d9c; }
|
|
||||||
.search-entry .search-entry-icon {
|
.search-entry .search-entry-icon {
|
||||||
icon-size: 1em;
|
icon-size: 1em;
|
||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
@ -1148,30 +989,31 @@ StScrollBar {
|
|||||||
spacing: 3px; }
|
spacing: 3px; }
|
||||||
|
|
||||||
.search-section-separator {
|
.search-section-separator {
|
||||||
height: 2px;
|
-gradient-height: 1px;
|
||||||
background-color: rgba(255, 255, 255, 0.2); }
|
-gradient-start: rgba(255, 255, 255, 0);
|
||||||
|
-gradient-end: rgba(255, 255, 255, 0.1);
|
||||||
|
-margin-horizontal: 1.5em;
|
||||||
|
height: 1px; }
|
||||||
|
|
||||||
.list-search-result-content {
|
.list-search-result-content {
|
||||||
spacing: 30px; }
|
spacing: 12px;
|
||||||
|
padding: 12px; }
|
||||||
|
|
||||||
.list-search-result-title {
|
.list-search-result-title {
|
||||||
color: #e2e2df;
|
font-size: 1.5em;
|
||||||
spacing: 12px; }
|
color: #e2e2df; }
|
||||||
|
|
||||||
.list-search-result-description {
|
.list-search-result-description {
|
||||||
color: rgba(202, 202, 196, 0.5); }
|
color: #cacac4; }
|
||||||
|
|
||||||
.list-search-provider-details {
|
|
||||||
width: 150px;
|
|
||||||
color: #e2e2df;
|
|
||||||
margin-top: 0.24em; }
|
|
||||||
|
|
||||||
.list-search-provider-content {
|
|
||||||
spacing: 20px; }
|
|
||||||
|
|
||||||
.search-provider-icon {
|
.search-provider-icon {
|
||||||
padding: 15px; }
|
padding: 15px; }
|
||||||
|
|
||||||
|
.search-provider-icon-more {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
background-image: url("resource:///org/gnome/shell/theme/more-results.svg"); }
|
||||||
|
|
||||||
/* DASHBOARD */
|
/* DASHBOARD */
|
||||||
#dash {
|
#dash {
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
@ -1210,12 +1052,6 @@ StScrollBar {
|
|||||||
.icon-grid .overview-icon {
|
.icon-grid .overview-icon {
|
||||||
icon-size: 96px; }
|
icon-size: 96px; }
|
||||||
|
|
||||||
.system-action-icon {
|
|
||||||
background-color: black;
|
|
||||||
color: white;
|
|
||||||
border-radius: 99px;
|
|
||||||
icon-size: 48px; }
|
|
||||||
|
|
||||||
.app-view-controls {
|
.app-view-controls {
|
||||||
padding-bottom: 32px; }
|
padding-bottom: 32px; }
|
||||||
|
|
||||||
@ -1238,7 +1074,6 @@ StScrollBar {
|
|||||||
.list-search-result:active,
|
.list-search-result:active,
|
||||||
.list-search-result:checked {
|
.list-search-result:checked {
|
||||||
background-color: rgba(23, 25, 26, 0.9); }
|
background-color: rgba(23, 25, 26, 0.9); }
|
||||||
|
|
||||||
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
|
.search-provider-icon:focus, .search-provider-icon:selected, .search-provider-icon:hover,
|
||||||
.list-search-result:focus,
|
.list-search-result:focus,
|
||||||
.list-search-result:selected,
|
.list-search-result:selected,
|
||||||
@ -1246,8 +1081,7 @@ StScrollBar {
|
|||||||
background-color: rgba(238, 238, 236, 0.1);
|
background-color: rgba(238, 238, 236, 0.1);
|
||||||
transition-duration: 200ms; }
|
transition-duration: 200ms; }
|
||||||
|
|
||||||
.app-well-app:active .overview-icon,
|
.app-well-app:active .overview-icon, .app-well-app:checked .overview-icon,
|
||||||
.app-well-app:checked .overview-icon,
|
|
||||||
.app-well-app.app-folder:active .overview-icon,
|
.app-well-app.app-folder:active .overview-icon,
|
||||||
.app-well-app.app-folder:checked .overview-icon,
|
.app-well-app.app-folder:checked .overview-icon,
|
||||||
.show-apps:active .overview-icon,
|
.show-apps:active .overview-icon,
|
||||||
@ -1256,10 +1090,7 @@ StScrollBar {
|
|||||||
.grid-search-result:checked .overview-icon {
|
.grid-search-result:checked .overview-icon {
|
||||||
background-color: rgba(23, 25, 26, 0.9);
|
background-color: rgba(23, 25, 26, 0.9);
|
||||||
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
|
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.7); }
|
||||||
|
.app-well-app:hover .overview-icon, .app-well-app:focus .overview-icon, .app-well-app:selected .overview-icon,
|
||||||
.app-well-app:hover .overview-icon,
|
|
||||||
.app-well-app:focus .overview-icon,
|
|
||||||
.app-well-app:selected .overview-icon,
|
|
||||||
.app-well-app.app-folder:hover .overview-icon,
|
.app-well-app.app-folder:hover .overview-icon,
|
||||||
.app-well-app.app-folder:focus .overview-icon,
|
.app-well-app.app-folder:focus .overview-icon,
|
||||||
.app-well-app.app-folder:selected .overview-icon,
|
.app-well-app.app-folder:selected .overview-icon,
|
||||||
@ -1485,6 +1316,38 @@ StScrollBar {
|
|||||||
color: pink; }
|
color: pink; }
|
||||||
|
|
||||||
/* Eeeky things */
|
/* Eeeky things */
|
||||||
|
.legacy-tray {
|
||||||
|
background-color: #393f3f;
|
||||||
|
border: 1px solid #1c1f1f;
|
||||||
|
border-bottom-width: 0; }
|
||||||
|
.legacy-tray:ltr {
|
||||||
|
border-radius: 0 6px 0 0;
|
||||||
|
border-left-width: 0; }
|
||||||
|
.legacy-tray:rtl {
|
||||||
|
border-radius: 6px 0 0 0;
|
||||||
|
border-right-width: 0; }
|
||||||
|
|
||||||
|
.legacy-tray-handle,
|
||||||
|
.legacy-tray-icon {
|
||||||
|
padding: 6px; }
|
||||||
|
.legacy-tray-handle StIcon,
|
||||||
|
.legacy-tray-icon StIcon {
|
||||||
|
icon-size: 24px; }
|
||||||
|
.legacy-tray-handle:hover, .legacy-tray-handle:focus,
|
||||||
|
.legacy-tray-icon:hover,
|
||||||
|
.legacy-tray-icon:focus {
|
||||||
|
background-color: rgba(238, 238, 236, 0.1); }
|
||||||
|
|
||||||
|
.legacy-tray-icon-box {
|
||||||
|
spacing: 12px; }
|
||||||
|
.legacy-tray-icon-box:ltr {
|
||||||
|
padding-left: 12px; }
|
||||||
|
.legacy-tray-icon-box:rtl {
|
||||||
|
padding-right: 12px; }
|
||||||
|
.legacy-tray-icon-box StButton {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px; }
|
||||||
|
|
||||||
.magnifier-zoom-region {
|
.magnifier-zoom-region {
|
||||||
border: 2px solid #215d9c; }
|
border: 2px solid #215d9c; }
|
||||||
.magnifier-zoom-region.full-screen {
|
.magnifier-zoom-region.full-screen {
|
||||||
@ -1653,12 +1516,10 @@ StScrollBar {
|
|||||||
|
|
||||||
.login-dialog-user-selection-box {
|
.login-dialog-user-selection-box {
|
||||||
padding: 100px 0px; }
|
padding: 100px 0px; }
|
||||||
|
.login-dialog-user-selection-box .login-dialog-not-listed-label {
|
||||||
.login-dialog-not-listed-label {
|
padding-left: 2px; }
|
||||||
padding-left: 2px; }
|
.login-dialog-not-listed-button:focus .login-dialog-user-selection-box .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-user-selection-box .login-dialog-not-listed-label {
|
||||||
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
|
color: #eeeeec; }
|
||||||
.login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
|
|
||||||
color: #eeeeec; }
|
|
||||||
|
|
||||||
.login-dialog-not-listed-label {
|
.login-dialog-not-listed-label {
|
||||||
font-size: 90%;
|
font-size: 90%;
|
||||||
@ -1673,7 +1534,7 @@ StScrollBar {
|
|||||||
spacing: 12px;
|
spacing: 12px;
|
||||||
padding: .2em;
|
padding: .2em;
|
||||||
width: 23em; }
|
width: 23em; }
|
||||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
|
.login-dialog-user-list:expanded .login-dialog-user-list-item:focus {
|
||||||
background-color: #215d9c;
|
background-color: #215d9c;
|
||||||
color: #ffffff; }
|
color: #ffffff; }
|
||||||
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
|
||||||
@ -1687,6 +1548,9 @@ StScrollBar {
|
|||||||
padding-right: 1em; }
|
padding-right: 1em; }
|
||||||
.login-dialog-user-list-item:rtl {
|
.login-dialog-user-list-item:rtl {
|
||||||
padding-left: 1em; }
|
padding-left: 1em; }
|
||||||
|
.login-dialog-user-list-item:hover {
|
||||||
|
background-color: #215d9c;
|
||||||
|
color: #ffffff; }
|
||||||
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
|
||||||
height: 2px;
|
height: 2px;
|
||||||
margin: 2px 0 0 0;
|
margin: 2px 0 0 0;
|
||||||
@ -1704,7 +1568,6 @@ StScrollBar {
|
|||||||
|
|
||||||
.user-widget-label:ltr {
|
.user-widget-label:ltr {
|
||||||
padding-left: 18px; }
|
padding-left: 18px; }
|
||||||
|
|
||||||
.user-widget-label:rtl {
|
.user-widget-label:rtl {
|
||||||
padding-right: 18px; }
|
padding-right: 18px; }
|
||||||
|
|
||||||
@ -1832,7 +1695,6 @@ StScrollBar {
|
|||||||
.lg-dialog StEntry {
|
.lg-dialog StEntry {
|
||||||
selection-background-color: #bbbbbb;
|
selection-background-color: #bbbbbb;
|
||||||
selected-color: #333333; }
|
selected-color: #333333; }
|
||||||
|
|
||||||
.lg-dialog .shell-link {
|
.lg-dialog .shell-link {
|
||||||
color: #999999; }
|
color: #999999; }
|
||||||
.lg-dialog .shell-link:hover {
|
.lg-dialog .shell-link:hover {
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
theme_sources = files([
|
|
||||||
'gnome-shell-high-contrast.scss',
|
|
||||||
'gnome-shell.scss',
|
|
||||||
'gnome-shell-sass/_colors.scss',
|
|
||||||
'gnome-shell-sass/_common.scss',
|
|
||||||
'gnome-shell-sass/_drawing.scss',
|
|
||||||
'gnome-shell-sass/_high-contrast-colors.scss'
|
|
||||||
])
|
|
||||||
|
|
||||||
theme_deps = []
|
|
||||||
|
|
||||||
if sassc.found()
|
|
||||||
parse_sass = files('parse-sass.sh')
|
|
||||||
|
|
||||||
theme_deps += custom_target('update-theme',
|
|
||||||
output: 'theme-update.stamp',
|
|
||||||
depend_files: theme_sources,
|
|
||||||
command: [parse_sass, '@OUTPUT@'],
|
|
||||||
build_by_default: true
|
|
||||||
)
|
|
||||||
endif
|
|
@ -1,40 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="16"
|
|
||||||
height="16"
|
|
||||||
viewBox="0 0 4.2333333 4.2333333"
|
|
||||||
version="1.1"
|
|
||||||
id="svg8">
|
|
||||||
<defs
|
|
||||||
id="defs2" />
|
|
||||||
<metadata
|
|
||||||
id="metadata5">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
id="layer1"
|
|
||||||
style="display:inline"
|
|
||||||
transform="translate(0,-292.76667)">
|
|
||||||
<path
|
|
||||||
style="fill:#bebebe;fill-opacity:1;stroke:none;stroke-width:0.17969394"
|
|
||||||
d="m 3.1749998,294.88333 a 1.0583333,1.0583333 0 0 1 -1.0583332,1.05833 1.0583333,1.0583333 0 0 1 -1.0583333,-1.05833 1.0583333,1.0583333 0 0 1 1.0583333,-1.05833 1.0583333,1.0583333 0 0 1 1.0583332,1.05833 z"
|
|
||||||
id="path4485" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.3 KiB |
114
data/theme/more-results.svg
Normal file
114
data/theme/more-results.svg
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
id="svg12430"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="more-results.svg">
|
||||||
|
<defs
|
||||||
|
id="defs12432" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#7a7a7a"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="1"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="90.509668"
|
||||||
|
inkscape:cx="6.5009792"
|
||||||
|
inkscape:cy="8.3589595"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="g14642-3-0"
|
||||||
|
showgrid="false"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
inkscape:window-width="1440"
|
||||||
|
inkscape:window-height="840"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="27"
|
||||||
|
inkscape:window-maximized="1">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid13002" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata12435">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-1036.3622)">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(-141.99984,638.37113)"
|
||||||
|
inkscape:label="zoom-in"
|
||||||
|
id="g14642-3-0">
|
||||||
|
<path
|
||||||
|
sodipodi:type="inkscape:offset"
|
||||||
|
inkscape:radius="0"
|
||||||
|
inkscape:original="M 145.1875 400 C 144.5248 400 144 400.54899 144 401.21875 L 144 410.78125 C 144 411.45101 144.5248 412 145.1875 412 L 154.8125 412 C 155.4752 412 156 411.45101 156 410.78125 L 156 401.21875 C 156 400.54899 155.4752 400 154.8125 400 L 145.1875 400 z M 149 403 L 151 403 L 151 405 L 153 405 L 153 407 L 151 407 L 151 409 L 149 409 L 149 407 L 147 407 L 147 405 L 149 405 L 149 403 z "
|
||||||
|
xlink:href="#rect11749-5-0-1-8"
|
||||||
|
style="color:#bebebe;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;opacity:0.8"
|
||||||
|
id="path13004"
|
||||||
|
inkscape:href="#rect11749-5-0-1-8"
|
||||||
|
d="M 145.1875,400 C 144.5248,400 144,400.54899 144,401.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 C 156,400.54899 155.4752,400 154.8125,400 L 145.1875,400 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 L 149,403 Z"
|
||||||
|
transform="translate(0,1)" />
|
||||||
|
<use
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
xlink:href="#path13004"
|
||||||
|
id="use11960"
|
||||||
|
transform="translate(1,-1)"
|
||||||
|
width="16"
|
||||||
|
height="16" />
|
||||||
|
<use
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
xlink:href="#use11960"
|
||||||
|
id="use11962"
|
||||||
|
transform="translate(-2,0)"
|
||||||
|
width="16"
|
||||||
|
height="16" />
|
||||||
|
<path
|
||||||
|
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||||
|
d="M 7 5 L 7 7 L 5 7 L 5 9 L 7 9 L 7 11 L 9 11 L 9 9 L 11 9 L 11 7 L 9 7 L 9 5 L 7 5 z "
|
||||||
|
transform="translate(141.99984,397.99107)"
|
||||||
|
id="rect3757" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="color:#bebebe;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||||
|
d="M 145.1875,400 C 144.5248,400 144,400.54899 144,401.21875 l 0,9.5625 c 0,0.66976 0.5248,1.21875 1.1875,1.21875 l 9.625,0 c 0.6627,0 1.1875,-0.54899 1.1875,-1.21875 l 0,-9.5625 C 156,400.54899 155.4752,400 154.8125,400 L 145.1875,400 z m 3.8125,3 2,0 0,2 2,0 0,2 -2,0 0,2 -2,0 0,-2 -2,0 0,-2 2,0 L 149,403 Z"
|
||||||
|
id="rect11749-5-0-1-8" />
|
||||||
|
<rect
|
||||||
|
style="fill:none;stroke:none"
|
||||||
|
id="rect3620-5-4"
|
||||||
|
width="15.981825"
|
||||||
|
height="16"
|
||||||
|
x="142"
|
||||||
|
y="398"
|
||||||
|
rx="0"
|
||||||
|
ry="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.4 KiB |
@ -1,30 +0,0 @@
|
|||||||
.Leader {
|
|
||||||
stroke-width: .5 !important;
|
|
||||||
stroke: #535353;
|
|
||||||
fill: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Button {
|
|
||||||
stroke-width: .25;
|
|
||||||
stroke: #ededed;
|
|
||||||
fill: #ededed;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Ring {
|
|
||||||
stroke-width: .5 !important;
|
|
||||||
stroke: #535353 !important;
|
|
||||||
fill: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.Label {
|
|
||||||
stroke: none !important;
|
|
||||||
stroke-width: .1 !important;
|
|
||||||
font-size: .1 !important;
|
|
||||||
fill: transparent !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.TouchStrip, .TouchRing {
|
|
||||||
stroke-width: .1 !important;
|
|
||||||
stroke: #ededed !important;
|
|
||||||
fill: #535353 !important;
|
|
||||||
}
|
|
@ -1,10 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/usr/bin/bash
|
||||||
|
|
||||||
srcdir=`dirname $0`
|
bundle exec sass --update --sourcemap=none .
|
||||||
stamp=${1}
|
|
||||||
for scss in $srcdir/*.scss
|
|
||||||
do
|
|
||||||
sassc -a $scss ${scss%%.scss}.css || exit 1
|
|
||||||
done
|
|
||||||
|
|
||||||
[ "$stamp" ] && touch $stamp
|
|
||||||
|
1
docs/Makefile.am
Normal file
1
docs/Makefile.am
Normal file
@ -0,0 +1 @@
|
|||||||
|
SUBDIRS = reference
|
1
docs/reference/Makefile.am
Normal file
1
docs/reference/Makefile.am
Normal file
@ -0,0 +1 @@
|
|||||||
|
SUBDIRS = shell st
|
@ -1,5 +0,0 @@
|
|||||||
version_conf = configuration_data()
|
|
||||||
version_conf.set('VERSION', meson.project_version())
|
|
||||||
|
|
||||||
subdir('shell')
|
|
||||||
subdir('st')
|
|
139
docs/reference/shell/Makefile.am
Normal file
139
docs/reference/shell/Makefile.am
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
# We require automake 1.6 at least.
|
||||||
|
AUTOMAKE_OPTIONS = 1.6
|
||||||
|
|
||||||
|
# This is a blank Makefile.am for using gtk-doc.
|
||||||
|
# Copy this to your project's API docs directory and modify the variables to
|
||||||
|
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||||
|
# of using the various options.
|
||||||
|
|
||||||
|
# The name of the module, e.g. 'glib'.
|
||||||
|
DOC_MODULE=shell
|
||||||
|
|
||||||
|
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||||
|
#DOC_MODULE_VERSION=2
|
||||||
|
|
||||||
|
|
||||||
|
# The top-level SGML file. You can change this if you want to.
|
||||||
|
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||||
|
|
||||||
|
# Directories containing the source code
|
||||||
|
# gtk-doc will search all .c and .h files beneath these paths
|
||||||
|
# for inline comments documenting functions and macros.
|
||||||
|
DOC_SOURCE_DIR=$(top_srcdir)/src
|
||||||
|
|
||||||
|
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||||
|
SCANGOBJ_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-scan.
|
||||||
|
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||||
|
SCAN_OPTIONS=--rebuild-types
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mkdb.
|
||||||
|
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||||
|
MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mktmpl
|
||||||
|
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||||
|
MKTMPL_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mkhtml
|
||||||
|
MKHTML_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||||
|
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||||
|
FIXXREF_OPTIONS=
|
||||||
|
|
||||||
|
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||||
|
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||||
|
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||||
|
HFILE_GLOB=$(top_srcdir)/src/*.h
|
||||||
|
CFILE_GLOB=$(top_srcdir)/src/*.c
|
||||||
|
|
||||||
|
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||||
|
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||||
|
EXTRA_HFILES=
|
||||||
|
|
||||||
|
# Header files or dirs to ignore when scanning. Use base file/dir names
|
||||||
|
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
||||||
|
IGNORE_HFILES= \
|
||||||
|
calendar-server \
|
||||||
|
gvc \
|
||||||
|
hotplug-sniffer \
|
||||||
|
st \
|
||||||
|
tray \
|
||||||
|
gactionmuxer.h \
|
||||||
|
gactionobservable.h \
|
||||||
|
gactionobserver.h \
|
||||||
|
shell-network-agent.h \
|
||||||
|
shell-recorder-src.h
|
||||||
|
|
||||||
|
if !BUILD_RECORDER
|
||||||
|
IGNORE_HFILES += shell-recorder.h
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Images to copy into HTML directory.
|
||||||
|
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||||
|
HTML_IMAGES=
|
||||||
|
|
||||||
|
doc-gen-org.gnome.Shell.SearchProvider.xml: $(top_srcdir)/data/org.gnome.ShellSearchProvider.xml
|
||||||
|
gdbus-codegen \
|
||||||
|
--interface-prefix org.gnome.ShellSearchProvider. \
|
||||||
|
--generate-docbook doc-gen \
|
||||||
|
$(top_srcdir)/data/org.gnome.ShellSearchProvider.xml
|
||||||
|
|
||||||
|
doc-gen-org.gnome.Shell.SearchProvider2.xml: $(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
|
||||||
|
gdbus-codegen \
|
||||||
|
--interface-prefix org.gnome.ShellSearchProvider2. \
|
||||||
|
--generate-docbook doc-gen \
|
||||||
|
$(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
|
||||||
|
|
||||||
|
doc-gen-org.gnome.Shell.Screenshot.xml: $(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
|
||||||
|
gdbus-codegen \
|
||||||
|
--interface-prefix org.gnome.Shell.Screenshot. \
|
||||||
|
--generate-docbook doc-gen \
|
||||||
|
$(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
|
||||||
|
|
||||||
|
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||||
|
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||||
|
content_files= \
|
||||||
|
doc-gen-org.gnome.Shell.SearchProvider.xml \
|
||||||
|
doc-gen-org.gnome.Shell.SearchProvider2.xml \
|
||||||
|
doc-gen-org.gnome.Shell.Screenshot.xml
|
||||||
|
|
||||||
|
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||||
|
# These files must be listed here *and* in content_files
|
||||||
|
# e.g. expand_content_files=running.sgml
|
||||||
|
expand_content_files=
|
||||||
|
|
||||||
|
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||||
|
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||||
|
# signals and properties.
|
||||||
|
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||||
|
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||||
|
GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS)
|
||||||
|
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell-base.la $(top_builddir)/src/libgnome-shell.la
|
||||||
|
|
||||||
|
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||||
|
include $(top_srcdir)/gtk-doc.make
|
||||||
|
|
||||||
|
# Other files to distribute
|
||||||
|
# e.g. EXTRA_DIST += version.xml.in
|
||||||
|
EXTRA_DIST +=
|
||||||
|
|
||||||
|
# Files not to distribute
|
||||||
|
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||||
|
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||||
|
DISTCLEANFILES = $(DOC_MODULES).types
|
||||||
|
|
||||||
|
# Comment this out if you want 'make check' to test you doc status
|
||||||
|
# and run some sanity checks
|
||||||
|
if ENABLE_GTK_DOC
|
||||||
|
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||||
|
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||||
|
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||||
|
#TESTS = $(GTKDOC_CHECK)
|
||||||
|
endif
|
||||||
|
|
||||||
|
-include $(top_srcdir)/git.mk
|
@ -1,57 +0,0 @@
|
|||||||
private_headers = [
|
|
||||||
'gactionmuxer.h',
|
|
||||||
'gactionobservable.h',
|
|
||||||
'gactionobserver.h',
|
|
||||||
'shell-network-agent.h',
|
|
||||||
'shell-recorder-src.h'
|
|
||||||
]
|
|
||||||
|
|
||||||
if not enable_recorder
|
|
||||||
private_headers += 'shell-recorder.h'
|
|
||||||
endif
|
|
||||||
|
|
||||||
exclude_directories = [
|
|
||||||
'calendar-server',
|
|
||||||
'hotplug-sniffer',
|
|
||||||
'st',
|
|
||||||
'tray'
|
|
||||||
]
|
|
||||||
|
|
||||||
ifaces = [
|
|
||||||
['org.gnome.Shell.Screenshot', 'org.gnome.Shell.Screenshot.xml'],
|
|
||||||
['org.gnome.ShellSearchProvider', 'org.gnome.Shell.SearchProvider.xml'],
|
|
||||||
['org.gnome.ShellSearchProvider2', 'org.gnome.Shell.SearchProvider2.xml']
|
|
||||||
]
|
|
||||||
foreach iface : ifaces
|
|
||||||
custom_target(iface[0] + ' docs',
|
|
||||||
input: '../../../data/@0@.xml'.format(iface[0]),
|
|
||||||
output: 'doc-gen-' + iface[1],
|
|
||||||
command: [
|
|
||||||
'gdbus-codegen',
|
|
||||||
'--interface-prefix=@0@.'.format(iface),
|
|
||||||
'--generate-docbook', 'doc-gen',
|
|
||||||
'--output-directory', '@OUTDIR@',
|
|
||||||
'@INPUT@'
|
|
||||||
],
|
|
||||||
build_by_default: true
|
|
||||||
)
|
|
||||||
endforeach
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
input: 'version.xml.in',
|
|
||||||
output: 'version.xml',
|
|
||||||
configuration: version_conf
|
|
||||||
)
|
|
||||||
|
|
||||||
gnome.gtkdoc('shell',
|
|
||||||
main_sgml: 'shell-docs.sgml',
|
|
||||||
src_dir: [
|
|
||||||
join_paths(meson.source_root(), 'src'),
|
|
||||||
join_paths(meson.build_root(), 'src')
|
|
||||||
],
|
|
||||||
scan_args: [
|
|
||||||
'--ignore-headers=' + ' '.join(private_headers + exclude_directories),
|
|
||||||
'--rebuild-types'
|
|
||||||
],
|
|
||||||
install: true
|
|
||||||
)
|
|
@ -3,13 +3,12 @@
|
|||||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||||
[
|
[
|
||||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||||
<!ENTITY version SYSTEM "version.xml">
|
|
||||||
]>
|
]>
|
||||||
<book id="index">
|
<book id="index">
|
||||||
<bookinfo>
|
<bookinfo>
|
||||||
<title>Shell Reference Manual</title>
|
<title>Shell Reference Manual</title>
|
||||||
<releaseinfo>
|
<releaseinfo>
|
||||||
for Shell &version;.
|
for Shell @VERSION@.
|
||||||
<!--The latest version of this documentation can be found on-line at
|
<!--The latest version of this documentation can be found on-line at
|
||||||
<ulink role="online-location" url="http://[SERVER]/shell/index.html">http://[SERVER]/shell/</ulink>.-->
|
<ulink role="online-location" url="http://[SERVER]/shell/index.html">http://[SERVER]/shell/</ulink>.-->
|
||||||
</releaseinfo>
|
</releaseinfo>
|
||||||
@ -51,16 +50,12 @@
|
|||||||
<xi:include href="xml/shell-util.xml"/>
|
<xi:include href="xml/shell-util.xml"/>
|
||||||
<xi:include href="xml/shell-mount-operation.xml"/>
|
<xi:include href="xml/shell-mount-operation.xml"/>
|
||||||
<xi:include href="xml/shell-polkit-authentication-agent.xml"/>
|
<xi:include href="xml/shell-polkit-authentication-agent.xml"/>
|
||||||
|
<xi:include href="xml/shell-tp-client.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
<!-- FIXME:
|
|
||||||
Not generated at the moment, find out whether to blame gtk-doc or meson
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<chapter id="object-tree">
|
<chapter id="object-tree">
|
||||||
<title>Object Hierarchy</title>
|
<title>Object Hierarchy</title>
|
||||||
<xi:include href="xml/tree_index.sgml"/>
|
<xi:include href="xml/tree_index.sgml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
-->
|
|
||||||
<index id="api-index-full">
|
<index id="api-index-full">
|
||||||
<title>API Index</title>
|
<title>API Index</title>
|
||||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
@ -1 +0,0 @@
|
|||||||
@VERSION@
|
|
104
docs/reference/st/Makefile.am
Normal file
104
docs/reference/st/Makefile.am
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
# We require automake 1.6 at least.
|
||||||
|
AUTOMAKE_OPTIONS = 1.6
|
||||||
|
|
||||||
|
# This is a blank Makefile.am for using gtk-doc.
|
||||||
|
# Copy this to your project's API docs directory and modify the variables to
|
||||||
|
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||||
|
# of using the various options.
|
||||||
|
|
||||||
|
# The name of the module, e.g. 'glib'.
|
||||||
|
DOC_MODULE=st
|
||||||
|
|
||||||
|
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||||
|
#DOC_MODULE_VERSION=2
|
||||||
|
|
||||||
|
|
||||||
|
# The top-level SGML file. You can change this if you want to.
|
||||||
|
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||||
|
|
||||||
|
# Directories containing the source code
|
||||||
|
# gtk-doc will search all .c and .h files beneath these paths
|
||||||
|
# for inline comments documenting functions and macros.
|
||||||
|
DOC_SOURCE_DIR=$(top_srcdir)/src/st
|
||||||
|
|
||||||
|
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||||
|
SCANGOBJ_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-scan.
|
||||||
|
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||||
|
SCAN_OPTIONS=--rebuild-types --rebuild-sections
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mkdb.
|
||||||
|
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||||
|
MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mktmpl
|
||||||
|
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||||
|
MKTMPL_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mkhtml
|
||||||
|
MKHTML_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||||
|
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||||
|
FIXXREF_OPTIONS=
|
||||||
|
|
||||||
|
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||||
|
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||||
|
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||||
|
HFILE_GLOB=$(top_srcdir)/src/st/*.h
|
||||||
|
CFILE_GLOB=$(top_srcdir)/src/st/*.c
|
||||||
|
|
||||||
|
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||||
|
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||||
|
EXTRA_HFILES=
|
||||||
|
|
||||||
|
# Header files or dirs to ignore when scanning. Use base file/dir names
|
||||||
|
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
||||||
|
IGNORE_HFILES=st-private.h st-theme-node-private.h
|
||||||
|
|
||||||
|
# Images to copy into HTML directory.
|
||||||
|
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||||
|
HTML_IMAGES=
|
||||||
|
|
||||||
|
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||||
|
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||||
|
content_files=
|
||||||
|
|
||||||
|
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||||
|
# These files must be listed here *and* in content_files
|
||||||
|
# e.g. expand_content_files=running.sgml
|
||||||
|
expand_content_files=
|
||||||
|
|
||||||
|
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||||
|
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||||
|
# signals and properties.
|
||||||
|
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||||
|
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||||
|
GTKDOC_CFLAGS=
|
||||||
|
GTKDOC_LIBS=$(top_builddir)/src/libst-1.0.la
|
||||||
|
|
||||||
|
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||||
|
include $(top_srcdir)/gtk-doc.make
|
||||||
|
|
||||||
|
# Other files to distribute
|
||||||
|
# e.g. EXTRA_DIST += version.xml.in
|
||||||
|
EXTRA_DIST +=
|
||||||
|
|
||||||
|
# Files not to distribute
|
||||||
|
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||||
|
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||||
|
DISTCLEANFILES = $(DOC_MODULE).types $(DOC_MODULE)-sections.txt
|
||||||
|
|
||||||
|
# Comment this out if you want 'make check' to test you doc status
|
||||||
|
# and run some sanity checks
|
||||||
|
if ENABLE_GTK_DOC
|
||||||
|
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||||
|
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||||
|
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||||
|
#TESTS = $(GTKDOC_CHECK)
|
||||||
|
endif
|
||||||
|
|
||||||
|
-include $(top_srcdir)/git.mk
|
@ -1,24 +0,0 @@
|
|||||||
private_headers = [
|
|
||||||
'st-private.h',
|
|
||||||
'st-theme-node-private.h'
|
|
||||||
]
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
input: 'version.xml.in',
|
|
||||||
output: 'version.xml',
|
|
||||||
configuration: version_conf
|
|
||||||
)
|
|
||||||
|
|
||||||
gnome.gtkdoc('st',
|
|
||||||
main_sgml: 'st-docs.sgml',
|
|
||||||
src_dir: [
|
|
||||||
join_paths(meson.source_root(), 'src', 'st'),
|
|
||||||
join_paths(meson.build_root(), 'src', 'st')
|
|
||||||
],
|
|
||||||
scan_args: [
|
|
||||||
'--ignore-headers=' + ' '.join(private_headers),
|
|
||||||
'--rebuild-sections',
|
|
||||||
'--rebuild-types'
|
|
||||||
],
|
|
||||||
install: true
|
|
||||||
)
|
|
@ -3,13 +3,12 @@
|
|||||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||||
[
|
[
|
||||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||||
<!ENTITY version SYSTEM "version.xml">
|
|
||||||
]>
|
]>
|
||||||
<book id="index">
|
<book id="index">
|
||||||
<bookinfo>
|
<bookinfo>
|
||||||
<title>St Reference Manual</title>
|
<title>St Reference Manual</title>
|
||||||
<releaseinfo>
|
<releaseinfo>
|
||||||
for St &version;.
|
for St @VERSION@.
|
||||||
<!--The latest version of this documentation can be found on-line at
|
<!--The latest version of this documentation can be found on-line at
|
||||||
<ulink role="online-location" url="http://[SERVER]/st/index.html">http://[SERVER]/st/</ulink>.-->
|
<ulink role="online-location" url="http://[SERVER]/st/index.html">http://[SERVER]/st/</ulink>.-->
|
||||||
</releaseinfo>
|
</releaseinfo>
|
||||||
@ -47,15 +46,10 @@
|
|||||||
<xi:include href="xml/st-texture-cache.xml"/>
|
<xi:include href="xml/st-texture-cache.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
</part>
|
</part>
|
||||||
<!-- FIXME:
|
|
||||||
Not generated at the moment, find out whether to blame gtk-doc or meson
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
<chapter id="object-tree">
|
<chapter id="object-tree">
|
||||||
<title>Object Hierarchy</title>
|
<title>Object Hierarchy</title>
|
||||||
<xi:include href="xml/tree_index.sgml"/>
|
<xi:include href="xml/tree_index.sgml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
-->
|
|
||||||
<index id="api-index-full">
|
<index id="api-index-full">
|
||||||
<title>API Index</title>
|
<title>API Index</title>
|
||||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
@ -1 +0,0 @@
|
|||||||
@VERSION@
|
|
38
js/Makefile.am
Normal file
38
js/Makefile.am
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
NULL =
|
||||||
|
BUILT_SOURCES =
|
||||||
|
|
||||||
|
misc/config.js: misc/config.js.in Makefile
|
||||||
|
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \
|
||||||
|
sed -e "s|[@]PACKAGE_NAME@|$(PACKAGE_NAME)|g" \
|
||||||
|
-e "s|[@]PACKAGE_VERSION@|$(PACKAGE_VERSION)|g" \
|
||||||
|
-e "s|[@]HAVE_BLUETOOTH@|$(HAVE_BLUETOOTH)|g" \
|
||||||
|
-e "s|[@]HAVE_NETWORKMANAGER@|$(HAVE_NETWORKMANAGER)|g" \
|
||||||
|
-e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|g" \
|
||||||
|
-e "s|[@]datadir@|$(datadir)|g" \
|
||||||
|
-e "s|[@]libexecdir@|$(libexecdir)|g" \
|
||||||
|
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
||||||
|
$< > $@
|
||||||
|
|
||||||
|
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
||||||
|
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||||
|
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
||||||
|
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||||
|
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
||||||
|
|
||||||
|
js_built_sources = js-resources.c js-resources.h
|
||||||
|
|
||||||
|
BUILT_SOURCES += $(js_built_sources)
|
||||||
|
|
||||||
|
all-local: $(js_built_sources)
|
||||||
|
|
||||||
|
js_resource_dist_files = $(filter-out misc/config.js, $(js_resource_files))
|
||||||
|
|
||||||
|
EXTRA_DIST = \
|
||||||
|
$(js_resource_dist_files) \
|
||||||
|
js-resources.gresource.xml \
|
||||||
|
misc/config.js.in \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
CLEANFILES = \
|
||||||
|
$(js_built_sources) \
|
||||||
|
$(NULL)
|
@ -5,7 +5,6 @@ const GLib = imports.gi.GLib;
|
|||||||
const GObject = imports.gi.GObject;
|
const GObject = imports.gi.GObject;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Gdk = imports.gi.Gdk;
|
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const Format = imports.format;
|
const Format = imports.format;
|
||||||
|
|
||||||
@ -24,6 +23,11 @@ const GnomeShellIface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
|
const customCss = '.prefs-button { \
|
||||||
|
padding: 8px; \
|
||||||
|
border-radius: 20px; \
|
||||||
|
}';
|
||||||
|
|
||||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||||
|
|
||||||
function stripPrefix(string, prefix) {
|
function stripPrefix(string, prefix) {
|
||||||
@ -32,7 +36,7 @@ function stripPrefix(string, prefix) {
|
|||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
var Application = new Lang.Class({
|
const Application = new Lang.Class({
|
||||||
Name: 'Application',
|
Name: 'Application',
|
||||||
_init: function() {
|
_init: function() {
|
||||||
GLib.set_prgname('gnome-shell-extension-prefs');
|
GLib.set_prgname('gnome-shell-extension-prefs');
|
||||||
@ -93,11 +97,9 @@ var Application = new Lang.Class({
|
|||||||
widget = this._buildErrorUI(extension, e);
|
widget = this._buildErrorUI(extension, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
let dialog = new Gtk.Window({ modal: !this._skipMainWindow,
|
let dialog = new Gtk.Dialog({ use_header_bar: true,
|
||||||
type_hint: Gdk.WindowTypeHint.DIALOG });
|
modal: true,
|
||||||
dialog.set_titlebar(new Gtk.HeaderBar({ show_close_button: true,
|
title: extension.metadata.name });
|
||||||
title: extension.metadata.name,
|
|
||||||
visible: true }));
|
|
||||||
|
|
||||||
if (this._skipMainWindow) {
|
if (this._skipMainWindow) {
|
||||||
this.application.add_window(dialog);
|
this.application.add_window(dialog);
|
||||||
@ -110,7 +112,7 @@ var Application = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
dialog.set_default_size(600, 400);
|
dialog.set_default_size(600, 400);
|
||||||
dialog.add(widget);
|
dialog.get_content_area().add(widget);
|
||||||
dialog.show();
|
dialog.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -146,21 +148,16 @@ var Application = new Lang.Class({
|
|||||||
this._window = new Gtk.ApplicationWindow({ application: app,
|
this._window = new Gtk.ApplicationWindow({ application: app,
|
||||||
window_position: Gtk.WindowPosition.CENTER });
|
window_position: Gtk.WindowPosition.CENTER });
|
||||||
|
|
||||||
this._window.set_default_size(800, 500);
|
this._window.set_size_request(800, 500);
|
||||||
|
|
||||||
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
|
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
|
||||||
title: _("Shell Extensions") });
|
title: _("GNOME Shell Extensions") });
|
||||||
this._window.set_titlebar(this._titlebar);
|
this._window.set_titlebar(this._titlebar);
|
||||||
|
|
||||||
let killSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER });
|
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||||
this._titlebar.pack_end(killSwitch);
|
shadow_type: Gtk.ShadowType.IN,
|
||||||
|
halign: Gtk.Align.CENTER,
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
margin: 18 });
|
||||||
this._settings.bind('disable-user-extensions', killSwitch, 'active',
|
|
||||||
Gio.SettingsBindFlags.DEFAULT |
|
|
||||||
Gio.SettingsBindFlags.INVERT_BOOLEAN);
|
|
||||||
|
|
||||||
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
|
|
||||||
this._window.add(scroll);
|
this._window.add(scroll);
|
||||||
|
|
||||||
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
|
||||||
@ -179,6 +176,21 @@ var Application = new Lang.Class({
|
|||||||
this._window.show_all();
|
this._window.show_all();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_addCustomStyle: function() {
|
||||||
|
let provider = new Gtk.CssProvider();
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.load_from_data(customCss, -1);
|
||||||
|
} catch(e) {
|
||||||
|
log('Failed to add application style');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let screen = this._window.window.get_screen();
|
||||||
|
let priority = Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION;
|
||||||
|
Gtk.StyleContext.add_provider_for_screen(screen, provider, priority);
|
||||||
|
},
|
||||||
|
|
||||||
_sortList: function(row1, row2) {
|
_sortList: function(row1, row2) {
|
||||||
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
||||||
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
||||||
@ -227,6 +239,7 @@ var Application = new Lang.Class({
|
|||||||
|
|
||||||
_onStartup: function(app) {
|
_onStartup: function(app) {
|
||||||
this._buildUI(app);
|
this._buildUI(app);
|
||||||
|
this._addCustomStyle();
|
||||||
this._scanExtensions();
|
this._scanExtensions();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -253,19 +266,7 @@ var Application = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var DescriptionLabel = new Lang.Class({
|
const ExtensionRow = new Lang.Class({
|
||||||
Name: 'DescriptionLabel',
|
|
||||||
Extends: Gtk.Label,
|
|
||||||
|
|
||||||
vfunc_get_preferred_height_for_width: function(width) {
|
|
||||||
// Hack: Request the maximum height allowed by the line limit
|
|
||||||
if (this.lines > 0)
|
|
||||||
return this.parent(0);
|
|
||||||
return this.parent(width);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var ExtensionRow = new Lang.Class({
|
|
||||||
Name: 'ExtensionRow',
|
Name: 'ExtensionRow',
|
||||||
Extends: Gtk.ListBoxRow,
|
Extends: Gtk.ListBoxRow,
|
||||||
|
|
||||||
@ -283,10 +284,6 @@ var ExtensionRow = new Lang.Class({
|
|||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._switch.sensitive = this._canEnable();
|
this._switch.sensitive = this._canEnable();
|
||||||
}));
|
}));
|
||||||
this._settings.connect('changed::disable-user-extensions',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._switch.sensitive = this._canEnable();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._buildUI();
|
this._buildUI();
|
||||||
},
|
},
|
||||||
@ -295,8 +292,7 @@ var ExtensionRow = new Lang.Class({
|
|||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
let extension = ExtensionUtils.extensions[this.uuid];
|
||||||
|
|
||||||
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
||||||
hexpand: true, margin_end: 24, spacing: 24,
|
hexpand: true, margin: 12, spacing: 6 });
|
||||||
margin: 12 });
|
|
||||||
this.add(hbox);
|
this.add(hbox);
|
||||||
|
|
||||||
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
||||||
@ -310,9 +306,9 @@ var ExtensionRow = new Lang.Class({
|
|||||||
vbox.add(label);
|
vbox.add(label);
|
||||||
|
|
||||||
let desc = extension.metadata.description.split('\n')[0];
|
let desc = extension.metadata.description.split('\n')[0];
|
||||||
label = new DescriptionLabel({ label: desc, wrap: true, lines: 2,
|
label = new Gtk.Label({ label: desc,
|
||||||
ellipsize: Pango.EllipsizeMode.END,
|
ellipsize: Pango.EllipsizeMode.END,
|
||||||
xalign: 0, yalign: 0 });
|
halign: Gtk.Align.START });
|
||||||
vbox.add(label);
|
vbox.add(label);
|
||||||
|
|
||||||
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
|
||||||
@ -320,7 +316,7 @@ var ExtensionRow = new Lang.Class({
|
|||||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||||
icon_size: Gtk.IconSize.BUTTON,
|
icon_size: Gtk.IconSize.BUTTON,
|
||||||
visible: true }));
|
visible: true }));
|
||||||
button.get_style_context().add_class('circular');
|
button.get_style_context().add_class('prefs-button');
|
||||||
hbox.add(button);
|
hbox.add(button);
|
||||||
|
|
||||||
this.prefsButton = button;
|
this.prefsButton = button;
|
||||||
@ -343,8 +339,7 @@ var ExtensionRow = new Lang.Class({
|
|||||||
let extension = ExtensionUtils.extensions[this.uuid];
|
let extension = ExtensionUtils.extensions[this.uuid];
|
||||||
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
||||||
|
|
||||||
return !this._settings.get_boolean('disable-user-extensions') &&
|
return !(checkVersion && ExtensionUtils.isOutOfDate(extension));
|
||||||
!(checkVersion && ExtensionUtils.isOutOfDate(extension));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_isEnabled: function() {
|
_isEnabled: function() {
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
@ -15,30 +14,30 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
var DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
const DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
|
||||||
var DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
||||||
var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
var MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5;
|
const MESSAGE_FADE_OUT_ANIMATION_TIME = 0.5;
|
||||||
|
|
||||||
var AuthPromptMode = {
|
const AuthPromptMode = {
|
||||||
UNLOCK_ONLY: 0,
|
UNLOCK_ONLY: 0,
|
||||||
UNLOCK_OR_LOG_IN: 1
|
UNLOCK_OR_LOG_IN: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
var AuthPromptStatus = {
|
const AuthPromptStatus = {
|
||||||
NOT_VERIFYING: 0,
|
NOT_VERIFYING: 0,
|
||||||
VERIFYING: 1,
|
VERIFYING: 1,
|
||||||
VERIFICATION_FAILED: 2,
|
VERIFICATION_FAILED: 2,
|
||||||
VERIFICATION_SUCCEEDED: 3
|
VERIFICATION_SUCCEEDED: 3
|
||||||
};
|
};
|
||||||
|
|
||||||
var BeginRequestType = {
|
const BeginRequestType = {
|
||||||
PROVIDE_USERNAME: 0,
|
PROVIDE_USERNAME: 0,
|
||||||
DONT_PROVIDE_USERNAME: 1
|
DONT_PROVIDE_USERNAME: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
var AuthPrompt = new Lang.Class({
|
const AuthPrompt = new Lang.Class({
|
||||||
Name: 'AuthPrompt',
|
Name: 'AuthPrompt',
|
||||||
|
|
||||||
_init: function(gdmClient, mode) {
|
_init: function(gdmClient, mode) {
|
||||||
@ -114,7 +113,6 @@ var AuthPrompt = new Lang.Class({
|
|||||||
this._message = new St.Label({ opacity: 0,
|
this._message = new St.Label({ opacity: 0,
|
||||||
styleClass: 'login-dialog-message' });
|
styleClass: 'login-dialog-message' });
|
||||||
this._message.clutter_text.line_wrap = true;
|
this._message.clutter_text.line_wrap = true;
|
||||||
this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START });
|
this.actor.add(this._message, { x_fill: false, x_align: St.Align.START, y_align: St.Align.START });
|
||||||
|
|
||||||
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
|
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
|
||||||
@ -188,11 +186,10 @@ var AuthPrompt = new Lang.Class({
|
|||||||
if (!this._userVerifier.hasPendingMessages)
|
if (!this._userVerifier.hasPendingMessages)
|
||||||
this._fadeOutMessage();
|
this._fadeOutMessage();
|
||||||
|
|
||||||
this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING);
|
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
||||||
}));
|
}));
|
||||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
||||||
if (this.nextButton.reactive)
|
this.emit('next');
|
||||||
this.emit('next');
|
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -263,7 +260,7 @@ var AuthPrompt = new Lang.Class({
|
|||||||
_onVerificationComplete: function() {
|
_onVerificationComplete: function() {
|
||||||
this.setActorInDefaultButtonWell(null);
|
this.setActorInDefaultButtonWell(null);
|
||||||
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
|
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
|
||||||
this.cancelButton.reactive = false;
|
this.cancelButton.reactive = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onReset: function() {
|
_onReset: function() {
|
||||||
@ -416,7 +413,7 @@ var AuthPrompt = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
updateSensitivity: function(sensitive) {
|
updateSensitivity: function(sensitive) {
|
||||||
this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING));
|
this._updateNextButtonSensitivity(sensitive && this._entry.text.length > 0);
|
||||||
this._entry.reactive = sensitive;
|
this._entry.reactive = sensitive;
|
||||||
this._entry.clutter_text.editable = sensitive;
|
this._entry.clutter_text.editable = sensitive;
|
||||||
},
|
},
|
||||||
|
@ -16,38 +16,10 @@
|
|||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* In order for transformation animations to look good, they need to be
|
|
||||||
* incremental and have some order to them (e.g., fade out hidden items,
|
|
||||||
* then shrink to close the void left over). Chaining animations in this way can
|
|
||||||
* be error-prone and wordy using just Tweener callbacks.
|
|
||||||
*
|
|
||||||
* The classes in this file help with this:
|
|
||||||
*
|
|
||||||
* - Task. encapsulates schedulable work to be run in a specific scope.
|
|
||||||
*
|
|
||||||
* - ConsecutiveBatch. runs a series of tasks in order and completes
|
|
||||||
* when the last in the series finishes.
|
|
||||||
*
|
|
||||||
* - ConcurrentBatch. runs a set of tasks at the same time and completes
|
|
||||||
* when the last to finish completes.
|
|
||||||
*
|
|
||||||
* - Hold. prevents a batch from completing the pending task until
|
|
||||||
* the hold is released.
|
|
||||||
*
|
|
||||||
* The tasks associated with a batch are specified in a list at batch
|
|
||||||
* construction time as either task objects or plain functions.
|
|
||||||
* Batches are task objects, themselves, so they can be nested.
|
|
||||||
*
|
|
||||||
* These classes aren't specific to GDM, but were found to be unintuitive and so
|
|
||||||
* are not used elsewhere. These APIs may ultimately get dropped entirely and
|
|
||||||
* replaced by something else.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
var Task = new Lang.Class({
|
const Task = new Lang.Class({
|
||||||
Name: 'Task',
|
Name: 'Task',
|
||||||
|
|
||||||
_init: function(scope, handler) {
|
_init: function(scope, handler) {
|
||||||
@ -68,7 +40,7 @@ var Task = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Task.prototype);
|
Signals.addSignalMethods(Task.prototype);
|
||||||
|
|
||||||
var Hold = new Lang.Class({
|
const Hold = new Lang.Class({
|
||||||
Name: 'Hold',
|
Name: 'Hold',
|
||||||
Extends: Task,
|
Extends: Task,
|
||||||
|
|
||||||
@ -110,7 +82,7 @@ var Hold = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Hold.prototype);
|
Signals.addSignalMethods(Hold.prototype);
|
||||||
|
|
||||||
var Batch = new Lang.Class({
|
const Batch = new Lang.Class({
|
||||||
Name: 'Batch',
|
Name: 'Batch',
|
||||||
Extends: Task,
|
Extends: Task,
|
||||||
|
|
||||||
@ -185,7 +157,7 @@ var Batch = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Batch.prototype);
|
Signals.addSignalMethods(Batch.prototype);
|
||||||
|
|
||||||
var ConcurrentBatch = new Lang.Class({
|
const ConcurrentBatch = new Lang.Class({
|
||||||
Name: 'ConcurrentBatch',
|
Name: 'ConcurrentBatch',
|
||||||
Extends: Batch,
|
Extends: Batch,
|
||||||
|
|
||||||
@ -204,7 +176,7 @@ var ConcurrentBatch = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(ConcurrentBatch.prototype);
|
Signals.addSignalMethods(ConcurrentBatch.prototype);
|
||||||
|
|
||||||
var ConsecutiveBatch = new Lang.Class({
|
const ConsecutiveBatch = new Lang.Class({
|
||||||
Name: 'ConsecutiveBatch',
|
Name: 'ConsecutiveBatch',
|
||||||
Extends: Batch,
|
Extends: Batch,
|
||||||
|
|
||||||
|
@ -23,12 +23,6 @@ function FprintManager() {
|
|||||||
g_object_path: '/net/reactivated/Fprint/Manager',
|
g_object_path: '/net/reactivated/Fprint/Manager',
|
||||||
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
|
||||||
|
|
||||||
try {
|
self.init(null);
|
||||||
self.init(null);
|
|
||||||
} catch(e) {
|
|
||||||
log('Failed to connect to Fprint service: ' + e.message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
|||||||
const _LOGO_ICON_HEIGHT = 48;
|
const _LOGO_ICON_HEIGHT = 48;
|
||||||
const _MAX_BOTTOM_MENU_ITEMS = 5;
|
const _MAX_BOTTOM_MENU_ITEMS = 5;
|
||||||
|
|
||||||
var UserListItem = new Lang.Class({
|
const UserListItem = new Lang.Class({
|
||||||
Name: 'UserListItem',
|
Name: 'UserListItem',
|
||||||
|
|
||||||
_init: function(user) {
|
_init: function(user) {
|
||||||
@ -70,16 +70,6 @@ var UserListItem = new Lang.Class({
|
|||||||
this.actor.connect('destroy',
|
this.actor.connect('destroy',
|
||||||
Lang.bind(this, this._onDestroy));
|
Lang.bind(this, this._onDestroy));
|
||||||
|
|
||||||
this.actor.connect('key-focus-in', () => {
|
|
||||||
this._setSelected(true);
|
|
||||||
});
|
|
||||||
this.actor.connect('key-focus-out', () => {
|
|
||||||
this._setSelected(false);
|
|
||||||
});
|
|
||||||
this.actor.connect('notify::hover', () => {
|
|
||||||
this._setSelected(this.actor.hover);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._userWidget = new UserWidget.UserWidget(this.user);
|
this._userWidget = new UserWidget.UserWidget(this.user);
|
||||||
layout.add(this._userWidget.actor);
|
layout.add(this._userWidget.actor);
|
||||||
|
|
||||||
@ -106,22 +96,13 @@ var UserListItem = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this.user.disconnect(this._userChangedId);
|
this._user.disconnect(this._userChangedId);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onClicked: function() {
|
_onClicked: function() {
|
||||||
this.emit('activate');
|
this.emit('activate');
|
||||||
},
|
},
|
||||||
|
|
||||||
_setSelected: function(selected) {
|
|
||||||
if (selected) {
|
|
||||||
this.actor.add_style_pseudo_class('selected');
|
|
||||||
this.actor.grab_key_focus();
|
|
||||||
} else {
|
|
||||||
this.actor.remove_style_pseudo_class('selected');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
showTimedLoginIndicator: function(time) {
|
showTimedLoginIndicator: function(time) {
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
|
|
||||||
@ -145,7 +126,7 @@ var UserListItem = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(UserListItem.prototype);
|
Signals.addSignalMethods(UserListItem.prototype);
|
||||||
|
|
||||||
var UserList = new Lang.Class({
|
const UserList = new Lang.Class({
|
||||||
Name: 'UserList',
|
Name: 'UserList',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -231,10 +212,6 @@ var UserList = new Lang.Class({
|
|||||||
return item;
|
return item;
|
||||||
},
|
},
|
||||||
|
|
||||||
containsUser: function(user) {
|
|
||||||
return this._items[user.get_user_name()] != null;
|
|
||||||
},
|
|
||||||
|
|
||||||
addUser: function(user) {
|
addUser: function(user) {
|
||||||
if (!user.is_loaded)
|
if (!user.is_loaded)
|
||||||
return;
|
return;
|
||||||
@ -288,15 +265,11 @@ var UserList = new Lang.Class({
|
|||||||
|
|
||||||
item.actor.destroy();
|
item.actor.destroy();
|
||||||
delete this._items[userName];
|
delete this._items[userName];
|
||||||
},
|
|
||||||
|
|
||||||
numItems: function() {
|
|
||||||
return Object.keys(this._items).length;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(UserList.prototype);
|
Signals.addSignalMethods(UserList.prototype);
|
||||||
|
|
||||||
var SessionMenuButton = new Lang.Class({
|
const SessionMenuButton = new Lang.Class({
|
||||||
Name: 'SessionMenuButton',
|
Name: 'SessionMenuButton',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -402,7 +375,7 @@ var SessionMenuButton = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(SessionMenuButton.prototype);
|
Signals.addSignalMethods(SessionMenuButton.prototype);
|
||||||
|
|
||||||
var LoginDialog = new Lang.Class({
|
const LoginDialog = new Lang.Class({
|
||||||
Name: 'LoginDialog',
|
Name: 'LoginDialog',
|
||||||
|
|
||||||
_init: function(parentActor) {
|
_init: function(parentActor) {
|
||||||
@ -730,10 +703,6 @@ var LoginDialog = new Lang.Class({
|
|||||||
_updateDisableUserList: function() {
|
_updateDisableUserList: function() {
|
||||||
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
||||||
|
|
||||||
// Disable user list when there are no users.
|
|
||||||
if (this._userListLoaded && this._userList.numItems() == 0)
|
|
||||||
disableUserList = true;
|
|
||||||
|
|
||||||
if (disableUserList != this._disableUserList) {
|
if (disableUserList != this._disableUserList) {
|
||||||
this._disableUserList = disableUserList;
|
this._disableUserList = disableUserList;
|
||||||
|
|
||||||
@ -802,12 +771,10 @@ var LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onPrompted: function() {
|
_onPrompted: function() {
|
||||||
if (this._shouldShowSessionMenuButton()) {
|
this._sessionMenuButton.updateSensitivity(true);
|
||||||
this._sessionMenuButton.updateSensitivity(true);
|
|
||||||
|
if (this._shouldShowSessionMenuButton())
|
||||||
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
|
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor);
|
||||||
} else {
|
|
||||||
this._sessionMenuButton.updateSensitivity(false);
|
|
||||||
}
|
|
||||||
this._showPrompt();
|
this._showPrompt();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -833,11 +800,6 @@ var LoginDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._user = null;
|
this._user = null;
|
||||||
|
|
||||||
if (this._nextSignalId) {
|
|
||||||
this._authPrompt.disconnect(this._nextSignalId);
|
|
||||||
this._nextSignalId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
|
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
|
||||||
if (!this._disableUserList)
|
if (!this._disableUserList)
|
||||||
this._showUserList();
|
this._showUserList();
|
||||||
@ -910,7 +872,6 @@ var LoginDialog = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
this._updateCancelButton();
|
this._updateCancelButton();
|
||||||
|
|
||||||
this._sessionMenuButton.updateSensitivity(false);
|
|
||||||
this._authPrompt.updateSensitivity(true);
|
this._authPrompt.updateSensitivity(true);
|
||||||
this._showPrompt();
|
this._showPrompt();
|
||||||
},
|
},
|
||||||
@ -963,7 +924,11 @@ var LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
onUpdateScope: this,
|
onUpdateScope: this,
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
let id = Mainloop.idle_add(Lang.bind(this, function() {
|
||||||
|
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
}));
|
||||||
|
GLib.Source.set_name_by_id(id, '[gnome-shell] this._greeter.call_start_session_when_ready_sync');
|
||||||
},
|
},
|
||||||
onCompleteScope: this });
|
onCompleteScope: this });
|
||||||
},
|
},
|
||||||
@ -1165,10 +1130,6 @@ var LoginDialog = new Lang.Class({
|
|||||||
this._userManager.disconnect(this._userRemovedId);
|
this._userManager.disconnect(this._userRemovedId);
|
||||||
this._userRemovedId = 0;
|
this._userRemovedId = 0;
|
||||||
}
|
}
|
||||||
if (this._userChangedId) {
|
|
||||||
this._userManager.disconnect(this._userChangedId);
|
|
||||||
this._userChangedId = 0;
|
|
||||||
}
|
|
||||||
this._textureCache.disconnect(this._updateLogoTextureId);
|
this._textureCache.disconnect(this._updateLogoTextureId);
|
||||||
Main.layoutManager.disconnect(this._startupCompleteId);
|
Main.layoutManager.disconnect(this._startupCompleteId);
|
||||||
if (this._settings) {
|
if (this._settings) {
|
||||||
@ -1205,27 +1166,14 @@ var LoginDialog = new Lang.Class({
|
|||||||
this._userList.addUser(users[i]);
|
this._userList.addUser(users[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._updateDisableUserList();
|
|
||||||
|
|
||||||
this._userAddedId = this._userManager.connect('user-added',
|
this._userAddedId = this._userManager.connect('user-added',
|
||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.addUser(user);
|
this._userList.addUser(user);
|
||||||
this._updateDisableUserList();
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._userRemovedId = this._userManager.connect('user-removed',
|
this._userRemovedId = this._userManager.connect('user-removed',
|
||||||
Lang.bind(this, function(userManager, user) {
|
Lang.bind(this, function(userManager, user) {
|
||||||
this._userList.removeUser(user);
|
this._userList.removeUser(user);
|
||||||
this._updateDisableUserList();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._userChangedId = this._userManager.connect('user-changed',
|
|
||||||
Lang.bind(this, function(userManager, user) {
|
|
||||||
if (this._userList.containsUser(user) && user.locked)
|
|
||||||
this._userList.removeUser(user);
|
|
||||||
else if (!this._userList.containsUser(user) && !user.locked)
|
|
||||||
this._userList.addUser(user);
|
|
||||||
this._updateDisableUserList();
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return GLib.SOURCE_REMOVE;
|
return GLib.SOURCE_REMOVE;
|
||||||
@ -1260,7 +1208,7 @@ var LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
addCharacter: function(unichar) {
|
addCharacter: function(unichar) {
|
||||||
// Don't allow type ahead at the login screen
|
this._authPrompt.addCharacter(unichar);
|
||||||
},
|
},
|
||||||
|
|
||||||
finish: function(onComplete) {
|
finish: function(onComplete) {
|
||||||
|
@ -27,7 +27,7 @@ function OVirtCredentials() {
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
var OVirtCredentialsManager = new Lang.Class({
|
const OVirtCredentialsManager = new Lang.Class({
|
||||||
Name: 'OVirtCredentialsManager',
|
Name: 'OVirtCredentialsManager',
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._token = null;
|
this._token = null;
|
||||||
|
@ -59,7 +59,7 @@ const RealmIface = '<node> \
|
|||||||
</node>';
|
</node>';
|
||||||
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
|
||||||
|
|
||||||
var Manager = new Lang.Class({
|
const Manager = new Lang.Class({
|
||||||
Name: 'Manager',
|
Name: 'Manager',
|
||||||
|
|
||||||
_init: function(parentActor) {
|
_init: function(parentActor) {
|
||||||
|
@ -17,28 +17,28 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
const SmartcardManager = imports.misc.smartcardManager;
|
const SmartcardManager = imports.misc.smartcardManager;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var PASSWORD_SERVICE_NAME = 'gdm-password';
|
const PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||||
var FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||||
var SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
const SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
|
||||||
var OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
const OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
|
||||||
var FADE_ANIMATION_TIME = 0.16;
|
const FADE_ANIMATION_TIME = 0.16;
|
||||||
var CLONE_FADE_ANIMATION_TIME = 0.25;
|
const CLONE_FADE_ANIMATION_TIME = 0.25;
|
||||||
|
|
||||||
var LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
||||||
var PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
const PASSWORD_AUTHENTICATION_KEY = 'enable-password-authentication';
|
||||||
var FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication';
|
const FINGERPRINT_AUTHENTICATION_KEY = 'enable-fingerprint-authentication';
|
||||||
var SMARTCARD_AUTHENTICATION_KEY = 'enable-smartcard-authentication';
|
const SMARTCARD_AUTHENTICATION_KEY = 'enable-smartcard-authentication';
|
||||||
var BANNER_MESSAGE_KEY = 'banner-message-enable';
|
const BANNER_MESSAGE_KEY = 'banner-message-enable';
|
||||||
var BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
const BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
||||||
var ALLOWED_FAILURES_KEY = 'allowed-failures';
|
const ALLOWED_FAILURES_KEY = 'allowed-failures';
|
||||||
|
|
||||||
var LOGO_KEY = 'logo';
|
const LOGO_KEY = 'logo';
|
||||||
var DISABLE_USER_LIST_KEY = 'disable-user-list';
|
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||||
|
|
||||||
// Give user 48ms to read each character of a PAM message
|
// Give user 48ms to read each character of a PAM message
|
||||||
var USER_READ_TIME = 48
|
const USER_READ_TIME = 48
|
||||||
|
|
||||||
var MessageType = {
|
const MessageType = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
ERROR: 1,
|
ERROR: 1,
|
||||||
INFO: 2,
|
INFO: 2,
|
||||||
@ -119,7 +119,7 @@ function cloneAndFadeOutActor(actor) {
|
|||||||
return hold;
|
return hold;
|
||||||
}
|
}
|
||||||
|
|
||||||
var ShellUserVerifier = new Lang.Class({
|
const ShellUserVerifier = new Lang.Class({
|
||||||
Name: 'ShellUserVerifier',
|
Name: 'ShellUserVerifier',
|
||||||
|
|
||||||
_init: function(client, params) {
|
_init: function(client, params) {
|
||||||
@ -128,22 +128,18 @@ var ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
this._client = client;
|
this._client = client;
|
||||||
|
|
||||||
this._defaultService = null;
|
|
||||||
this._preemptingService = null;
|
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||||
this._settings.connect('changed',
|
this._settings.connect('changed',
|
||||||
Lang.bind(this, this._updateDefaultService));
|
Lang.bind(this, this._updateDefaultService));
|
||||||
this._updateDefaultService();
|
this._updateDefaultService();
|
||||||
|
|
||||||
this._fprintManager = Fprint.FprintManager();
|
this._fprintManager = new Fprint.FprintManager();
|
||||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
||||||
|
|
||||||
// We check for smartcards right away, since an inserted smartcard
|
// We check for smartcards right away, since an inserted smartcard
|
||||||
// at startup should result in immediately initiating authentication.
|
// at startup should result in immediately initiating authentication.
|
||||||
// This is different than fingerprint readers, where we only check them
|
// This is different than fingeprint readers, where we only check them
|
||||||
// after a user has been picked.
|
// after a user has been picked.
|
||||||
this.smartcardDetected = false;
|
|
||||||
this._checkForSmartcard();
|
this._checkForSmartcard();
|
||||||
|
|
||||||
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
|
||||||
@ -297,8 +293,7 @@ var ShellUserVerifier = new Lang.Class({
|
|||||||
_checkForFingerprintReader: function() {
|
_checkForFingerprintReader: function() {
|
||||||
this._haveFingerprintReader = false;
|
this._haveFingerprintReader = false;
|
||||||
|
|
||||||
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY) ||
|
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY)) {
|
||||||
this._fprintManager == null) {
|
|
||||||
this._updateDefaultService();
|
this._updateDefaultService();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -544,8 +539,7 @@ var ShellUserVerifier = new Lang.Class({
|
|||||||
let signalId = this.connect('no-more-messages',
|
let signalId = this.connect('no-more-messages',
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this.disconnect(signalId);
|
this.disconnect(signalId);
|
||||||
if (this._cancellable && !this._cancellable.is_cancelled())
|
this._retry();
|
||||||
this._retry();
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -23,33 +23,26 @@
|
|||||||
<file>misc/modemManager.js</file>
|
<file>misc/modemManager.js</file>
|
||||||
<file>misc/objectManager.js</file>
|
<file>misc/objectManager.js</file>
|
||||||
<file>misc/params.js</file>
|
<file>misc/params.js</file>
|
||||||
<file>misc/permissionStore.js</file>
|
|
||||||
<file>misc/smartcardManager.js</file>
|
<file>misc/smartcardManager.js</file>
|
||||||
<file>misc/systemActions.js</file>
|
|
||||||
<file>misc/util.js</file>
|
<file>misc/util.js</file>
|
||||||
<file>misc/weather.js</file>
|
|
||||||
|
|
||||||
<file>perf/core.js</file>
|
<file>perf/core.js</file>
|
||||||
<file>perf/hwtest.js</file>
|
<file>perf/hwtest.js</file>
|
||||||
|
|
||||||
<file>portalHelper/main.js</file>
|
<file>portalHelper/main.js</file>
|
||||||
|
|
||||||
<file>ui/accessDialog.js</file>
|
|
||||||
<file>ui/altTab.js</file>
|
<file>ui/altTab.js</file>
|
||||||
<file>ui/animation.js</file>
|
<file>ui/animation.js</file>
|
||||||
<file>ui/appDisplay.js</file>
|
<file>ui/appDisplay.js</file>
|
||||||
<file>ui/appFavorites.js</file>
|
<file>ui/appFavorites.js</file>
|
||||||
<file>ui/audioDeviceSelection.js</file>
|
|
||||||
<file>ui/backgroundMenu.js</file>
|
<file>ui/backgroundMenu.js</file>
|
||||||
<file>ui/background.js</file>
|
<file>ui/background.js</file>
|
||||||
<file>ui/boxpointer.js</file>
|
<file>ui/boxpointer.js</file>
|
||||||
<file>ui/calendar.js</file>
|
<file>ui/calendar.js</file>
|
||||||
<file>ui/checkBox.js</file>
|
<file>ui/checkBox.js</file>
|
||||||
<file>ui/closeDialog.js</file>
|
|
||||||
<file>ui/ctrlAltTab.js</file>
|
<file>ui/ctrlAltTab.js</file>
|
||||||
<file>ui/dash.js</file>
|
<file>ui/dash.js</file>
|
||||||
<file>ui/dateMenu.js</file>
|
<file>ui/dateMenu.js</file>
|
||||||
<file>ui/dialog.js</file>
|
|
||||||
<file>ui/dnd.js</file>
|
<file>ui/dnd.js</file>
|
||||||
<file>ui/edgeDragAction.js</file>
|
<file>ui/edgeDragAction.js</file>
|
||||||
<file>ui/endSessionDialog.js</file>
|
<file>ui/endSessionDialog.js</file>
|
||||||
@ -60,24 +53,21 @@
|
|||||||
<file>ui/grabHelper.js</file>
|
<file>ui/grabHelper.js</file>
|
||||||
<file>ui/ibusCandidatePopup.js</file>
|
<file>ui/ibusCandidatePopup.js</file>
|
||||||
<file>ui/iconGrid.js</file>
|
<file>ui/iconGrid.js</file>
|
||||||
<file>ui/inhibitShortcutsDialog.js</file>
|
|
||||||
<file>ui/keyboard.js</file>
|
<file>ui/keyboard.js</file>
|
||||||
<file>ui/layout.js</file>
|
<file>ui/layout.js</file>
|
||||||
<file>ui/lightbox.js</file>
|
<file>ui/lightbox.js</file>
|
||||||
<file>ui/lookingGlass.js</file>
|
<file>ui/lookingGlass.js</file>
|
||||||
|
<file>ui/legacyTray.js</file>
|
||||||
<file>ui/magnifier.js</file>
|
<file>ui/magnifier.js</file>
|
||||||
<file>ui/magnifierDBus.js</file>
|
<file>ui/magnifierDBus.js</file>
|
||||||
<file>ui/main.js</file>
|
<file>ui/main.js</file>
|
||||||
<file>ui/messageTray.js</file>
|
<file>ui/messageTray.js</file>
|
||||||
<file>ui/messageList.js</file>
|
|
||||||
<file>ui/modalDialog.js</file>
|
<file>ui/modalDialog.js</file>
|
||||||
<file>ui/mpris.js</file>
|
|
||||||
<file>ui/notificationDaemon.js</file>
|
<file>ui/notificationDaemon.js</file>
|
||||||
<file>ui/osdWindow.js</file>
|
<file>ui/osdWindow.js</file>
|
||||||
<file>ui/osdMonitorLabeler.js</file>
|
<file>ui/osdMonitorLabeler.js</file>
|
||||||
<file>ui/overview.js</file>
|
<file>ui/overview.js</file>
|
||||||
<file>ui/overviewControls.js</file>
|
<file>ui/overviewControls.js</file>
|
||||||
<file>ui/padOsd.js</file>
|
|
||||||
<file>ui/panel.js</file>
|
<file>ui/panel.js</file>
|
||||||
<file>ui/panelMenu.js</file>
|
<file>ui/panelMenu.js</file>
|
||||||
<file>ui/pointerWatcher.js</file>
|
<file>ui/pointerWatcher.js</file>
|
||||||
@ -90,13 +80,13 @@
|
|||||||
<file>ui/screenshot.js</file>
|
<file>ui/screenshot.js</file>
|
||||||
<file>ui/scripting.js</file>
|
<file>ui/scripting.js</file>
|
||||||
<file>ui/search.js</file>
|
<file>ui/search.js</file>
|
||||||
|
<file>ui/separator.js</file>
|
||||||
<file>ui/sessionMode.js</file>
|
<file>ui/sessionMode.js</file>
|
||||||
<file>ui/shellDBus.js</file>
|
<file>ui/shellDBus.js</file>
|
||||||
<file>ui/shellEntry.js</file>
|
<file>ui/shellEntry.js</file>
|
||||||
<file>ui/shellMountOperation.js</file>
|
<file>ui/shellMountOperation.js</file>
|
||||||
<file>ui/slider.js</file>
|
<file>ui/slider.js</file>
|
||||||
<file>ui/switcherPopup.js</file>
|
<file>ui/switcherPopup.js</file>
|
||||||
<file>ui/switchMonitor.js</file>
|
|
||||||
<file>ui/tweener.js</file>
|
<file>ui/tweener.js</file>
|
||||||
<file>ui/unlockDialog.js</file>
|
<file>ui/unlockDialog.js</file>
|
||||||
<file>ui/userWidget.js</file>
|
<file>ui/userWidget.js</file>
|
||||||
@ -122,7 +112,6 @@
|
|||||||
<file>ui/status/brightness.js</file>
|
<file>ui/status/brightness.js</file>
|
||||||
<file>ui/status/location.js</file>
|
<file>ui/status/location.js</file>
|
||||||
<file>ui/status/keyboard.js</file>
|
<file>ui/status/keyboard.js</file>
|
||||||
<file>ui/status/nightLight.js</file>
|
|
||||||
<file>ui/status/network.js</file>
|
<file>ui/status/network.js</file>
|
||||||
<file>ui/status/power.js</file>
|
<file>ui/status/power.js</file>
|
||||||
<file>ui/status/rfkill.js</file>
|
<file>ui/status/rfkill.js</file>
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
subdir('misc')
|
|
||||||
|
|
||||||
js_resources = gnome.compile_resources(
|
|
||||||
'js-resources', 'js-resources.gresource.xml',
|
|
||||||
source_dir: ['.', meson.current_build_dir()],
|
|
||||||
c_name: 'shell_js_resources',
|
|
||||||
dependencies: [config_js]
|
|
||||||
)
|
|
@ -1,19 +1,17 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
/* The name of this package (not localized) */
|
/* The name of this package (not localized) */
|
||||||
var PACKAGE_NAME = '@PACKAGE_NAME@';
|
const PACKAGE_NAME = '@PACKAGE_NAME@';
|
||||||
/* The version of this package */
|
/* The version of this package */
|
||||||
var PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
const PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
||||||
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
||||||
var HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
||||||
/* 1 if networkmanager is available, 0 otherwise */
|
/* 1 if networkmanager is available, 0 otherwise */
|
||||||
var HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
|
const HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
|
||||||
/* gettext package */
|
/* gettext package */
|
||||||
var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
||||||
/* locale dir */
|
/* locale dir */
|
||||||
var LOCALEDIR = '@datadir@/locale';
|
const LOCALEDIR = '@datadir@/locale';
|
||||||
/* other standard directories */
|
/* other standard directories */
|
||||||
var LIBEXECDIR = '@libexecdir@';
|
const LIBEXECDIR = '@libexecdir@';
|
||||||
var SYSCONFDIR = '@sysconfdir@';
|
const SYSCONFDIR = '@sysconfdir@';
|
||||||
/* g-i package versions */
|
|
||||||
var LIBMUTTER_API_VERSION = '@LIBMUTTER_API_VERSION@'
|
|
||||||
|
@ -6,38 +6,29 @@
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
|
const ShellJS = imports.gi.ShellJS;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
|
|
||||||
var ExtensionType = {
|
const ExtensionType = {
|
||||||
SYSTEM: 1,
|
SYSTEM: 1,
|
||||||
PER_USER: 2
|
PER_USER: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
// Maps uuid -> metadata object
|
// Maps uuid -> metadata object
|
||||||
var extensions = {};
|
const extensions = {};
|
||||||
|
|
||||||
/**
|
|
||||||
* getCurrentExtension:
|
|
||||||
*
|
|
||||||
* Returns the current extension, or null if not called from an extension.
|
|
||||||
*/
|
|
||||||
function getCurrentExtension() {
|
function getCurrentExtension() {
|
||||||
let stack = (new Error()).stack.split('\n');
|
let stack = (new Error()).stack;
|
||||||
let extensionStackLine;
|
|
||||||
|
|
||||||
// Search for an occurrence of an extension stack frame
|
// Assuming we're importing this directly from an extension (and we shouldn't
|
||||||
// Start at 1 because 0 is the stack frame of this function
|
// ever not be), its UUID should be directly in the path here.
|
||||||
for (let i = 1; i < stack.length; i++) {
|
let extensionStackLine = stack.split('\n')[1];
|
||||||
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
|
|
||||||
extensionStackLine = stack[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!extensionStackLine)
|
if (!extensionStackLine)
|
||||||
return null;
|
throw new Error('Could not find current extension');
|
||||||
|
|
||||||
// The stack line is like:
|
// The stack line is like:
|
||||||
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
||||||
@ -47,7 +38,7 @@ function getCurrentExtension() {
|
|||||||
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
|
||||||
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
|
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
|
||||||
if (!match)
|
if (!match)
|
||||||
return null;
|
throw new Error('Could not find current extension');
|
||||||
|
|
||||||
let path = match[1];
|
let path = match[1];
|
||||||
let file = Gio.File.new_for_path(path);
|
let file = Gio.File.new_for_path(path);
|
||||||
@ -61,7 +52,7 @@ function getCurrentExtension() {
|
|||||||
file = file.get_parent();
|
file = file.get_parent();
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
throw new Error('Could not find current extension');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -149,16 +140,15 @@ function createExtensionObject(uuid, dir, type) {
|
|||||||
return extension;
|
return extension;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _extension = null;
|
||||||
|
|
||||||
function installImporter(extension) {
|
function installImporter(extension) {
|
||||||
let oldSearchPath = imports.searchPath.slice(); // make a copy
|
_extension = extension;
|
||||||
imports.searchPath = [extension.dir.get_parent().get_path()];
|
ShellJS.add_extension_importer('imports.misc.extensionUtils._extension', 'imports', extension.path);
|
||||||
// importing a "subdir" creates a new importer object that doesn't affect
|
_extension = null;
|
||||||
// the global one
|
|
||||||
extension.imports = imports[extension.uuid];
|
|
||||||
imports.searchPath = oldSearchPath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var ExtensionFinder = new Lang.Class({
|
const ExtensionFinder = new Lang.Class({
|
||||||
Name: 'ExtensionFinder',
|
Name: 'ExtensionFinder',
|
||||||
|
|
||||||
_loadExtension: function(extensionDir, info, perUserDir) {
|
_loadExtension: function(extensionDir, info, perUserDir) {
|
||||||
|
@ -16,7 +16,7 @@ const PresenceIface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
var PresenceStatus = {
|
const PresenceStatus = {
|
||||||
AVAILABLE: 0,
|
AVAILABLE: 0,
|
||||||
INVISIBLE: 1,
|
INVISIBLE: 1,
|
||||||
BUSY: 2,
|
BUSY: 2,
|
||||||
|
@ -5,9 +5,9 @@ const Signals = imports.signals;
|
|||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
var DEFAULT_LIMIT = 512;
|
const DEFAULT_LIMIT = 512;
|
||||||
|
|
||||||
var HistoryManager = new Lang.Class({
|
const HistoryManager = new Lang.Class({
|
||||||
Name: 'HistoryManager',
|
Name: 'HistoryManager',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -69,7 +69,7 @@ var HistoryManager = new Lang.Class({
|
|||||||
this._indexChanged();
|
this._indexChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._historyIndex ? this._history[this._historyIndex -1] : null;
|
return this._historyIndex[this._history.length];
|
||||||
},
|
},
|
||||||
|
|
||||||
addItem: function(input) {
|
addItem: function(input) {
|
||||||
|
@ -6,11 +6,10 @@ const Lang = imports.lang;
|
|||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
let IBusCandidatePopup;
|
|
||||||
try {
|
try {
|
||||||
var IBus = imports.gi.IBus;
|
var IBus = imports.gi.IBus;
|
||||||
_checkIBusVersion(1, 5, 2);
|
_checkIBusVersion(1, 5, 2);
|
||||||
IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
var IBus = null;
|
var IBus = null;
|
||||||
log(e);
|
log(e);
|
||||||
@ -36,7 +35,7 @@ function getIBusManager() {
|
|||||||
return _ibusManager;
|
return _ibusManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
var IBusManager = new Lang.Class({
|
const IBusManager = new Lang.Class({
|
||||||
Name: 'IBusManager',
|
Name: 'IBusManager',
|
||||||
|
|
||||||
// This is the longest we'll keep the keyboard frozen until an input
|
// This is the longest we'll keep the keyboard frozen until an input
|
||||||
@ -190,7 +189,7 @@ var IBusManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
getEngineDesc: function(id) {
|
getEngineDesc: function(id) {
|
||||||
if (!IBus || !this._ready || !this._engines.hasOwnProperty(id))
|
if (!IBus || !this._ready)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return this._engines[id];
|
return this._engines[id];
|
||||||
|
@ -7,9 +7,9 @@ const Meta = imports.gi.Meta;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
var DEFAULT_LOCALE = 'en_US';
|
const DEFAULT_LOCALE = 'en_US';
|
||||||
var DEFAULT_LAYOUT = 'us';
|
const DEFAULT_LAYOUT = 'us';
|
||||||
var DEFAULT_VARIANT = '';
|
const DEFAULT_VARIANT = '';
|
||||||
|
|
||||||
let _xkbInfo = null;
|
let _xkbInfo = null;
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ function holdKeyboard() {
|
|||||||
global.display.freeze_keyboard(global.get_current_time());
|
global.display.freeze_keyboard(global.get_current_time());
|
||||||
}
|
}
|
||||||
|
|
||||||
var KeyboardManager = new Lang.Class({
|
const KeyboardManager = new Lang.Class({
|
||||||
Name: 'KeyboardManager',
|
Name: 'KeyboardManager',
|
||||||
|
|
||||||
// The XKB protocol doesn't allow for more that 4 layouts in a
|
// The XKB protocol doesn't allow for more that 4 layouts in a
|
||||||
@ -128,8 +128,7 @@ var KeyboardManager = new Lang.Class({
|
|||||||
if (!found)
|
if (!found)
|
||||||
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
|
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
|
||||||
|
|
||||||
let _layout, _variant;
|
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
|
||||||
[found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
|
|
||||||
if (found)
|
if (found)
|
||||||
return { layout: _layout, variant: _variant };
|
return { layout: _layout, variant: _variant };
|
||||||
else
|
else
|
||||||
|
@ -40,9 +40,6 @@ const SystemdLoginSessionIface = '<node> \
|
|||||||
<signal name="Lock" /> \
|
<signal name="Lock" /> \
|
||||||
<signal name="Unlock" /> \
|
<signal name="Unlock" /> \
|
||||||
<property name="Active" type="b" access="read" /> \
|
<property name="Active" type="b" access="read" /> \
|
||||||
<method name="SetLockedHint"> \
|
|
||||||
<arg type="b" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
@ -102,7 +99,7 @@ function getLoginManager() {
|
|||||||
return _loginManager;
|
return _loginManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
var LoginManagerSystemd = new Lang.Class({
|
const LoginManagerSystemd = new Lang.Class({
|
||||||
Name: 'LoginManagerSystemd',
|
Name: 'LoginManagerSystemd',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -119,13 +116,7 @@ var LoginManagerSystemd = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let sessionId = GLib.getenv('XDG_SESSION_ID');
|
this._proxy.GetSessionRemote(GLib.getenv('XDG_SESSION_ID'), Lang.bind(this,
|
||||||
if (!sessionId) {
|
|
||||||
log('Unset XDG_SESSION_ID, getCurrentSessionProxy() called outside a user session.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._proxy.GetSessionRemote(sessionId, Lang.bind(this,
|
|
||||||
function(result, error) {
|
function(result, error) {
|
||||||
if (error) {
|
if (error) {
|
||||||
logError(error, 'Could not get a proxy for the current session');
|
logError(error, 'Could not get a proxy for the current session');
|
||||||
@ -140,13 +131,10 @@ var LoginManagerSystemd = new Lang.Class({
|
|||||||
|
|
||||||
canSuspend: function(asyncCallback) {
|
canSuspend: function(asyncCallback) {
|
||||||
this._proxy.CanSuspendRemote(function(result, error) {
|
this._proxy.CanSuspendRemote(function(result, error) {
|
||||||
if (error) {
|
if (error)
|
||||||
asyncCallback(false, false);
|
asyncCallback(false);
|
||||||
} else {
|
else
|
||||||
let needsAuth = result[0] == 'challenge';
|
asyncCallback(result[0] != 'no' && result[0] != 'na');
|
||||||
let canSuspend = needsAuth || result[0] == 'yes';
|
|
||||||
asyncCallback(canSuspend, needsAuth);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -189,7 +177,7 @@ var LoginManagerSystemd = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
||||||
|
|
||||||
var LoginManagerDummy = new Lang.Class({
|
const LoginManagerDummy = new Lang.Class({
|
||||||
Name: 'LoginManagerDummy',
|
Name: 'LoginManagerDummy',
|
||||||
|
|
||||||
getCurrentSessionProxy: function(callback) {
|
getCurrentSessionProxy: function(callback) {
|
||||||
@ -199,7 +187,7 @@ var LoginManagerDummy = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
canSuspend: function(asyncCallback) {
|
canSuspend: function(asyncCallback) {
|
||||||
asyncCallback(false, false);
|
asyncCallback(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
listSessions: function(asyncCallback) {
|
listSessions: function(asyncCallback) {
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
jsconf = configuration_data()
|
|
||||||
jsconf.set('PACKAGE_NAME', meson.project_name())
|
|
||||||
jsconf.set('PACKAGE_VERSION', meson.project_version())
|
|
||||||
jsconf.set('GETTEXT_PACKAGE', meson.project_name())
|
|
||||||
jsconf.set('LIBMUTTER_API_VERSION', mutter_api_version)
|
|
||||||
jsconf.set10('HAVE_BLUETOOTH', bt_dep.found())
|
|
||||||
jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager)
|
|
||||||
jsconf.set('datadir', datadir)
|
|
||||||
jsconf.set('libexecdir', libexecdir)
|
|
||||||
jsconf.set('sysconfdir', sysconfdir)
|
|
||||||
|
|
||||||
config_js = configure_file(
|
|
||||||
input: 'config.js.in',
|
|
||||||
output: 'config.js',
|
|
||||||
configuration: jsconf
|
|
||||||
)
|
|
@ -130,7 +130,7 @@ const ModemCdmaInterface = '<node> \
|
|||||||
|
|
||||||
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
|
||||||
|
|
||||||
var ModemGsm = new Lang.Class({
|
const ModemGsm = new Lang.Class({
|
||||||
Name: 'ModemGsm',
|
Name: 'ModemGsm',
|
||||||
|
|
||||||
_init: function(path) {
|
_init: function(path) {
|
||||||
@ -172,7 +172,7 @@ var ModemGsm = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(ModemGsm.prototype);
|
Signals.addSignalMethods(ModemGsm.prototype);
|
||||||
|
|
||||||
var ModemCdma = new Lang.Class({
|
const ModemCdma = new Lang.Class({
|
||||||
Name: 'ModemCdma',
|
Name: 'ModemCdma',
|
||||||
|
|
||||||
_init: function(path) {
|
_init: function(path) {
|
||||||
@ -244,7 +244,7 @@ const BroadbandModemCdmaInterface = '<node> \
|
|||||||
</node>';
|
</node>';
|
||||||
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
|
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
|
||||||
|
|
||||||
var BroadbandModem = new Lang.Class({
|
const BroadbandModem = new Lang.Class({
|
||||||
Name: 'BroadbandModem',
|
Name: 'BroadbandModem',
|
||||||
|
|
||||||
_init: function(path, capabilities) {
|
_init: function(path, capabilities) {
|
||||||
|
@ -26,7 +26,7 @@ const ObjectManagerIface = '<node> \
|
|||||||
|
|
||||||
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
|
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);
|
||||||
|
|
||||||
var ObjectManager = new Lang.Class({
|
const ObjectManager = new Lang.Class({
|
||||||
Name: 'ObjectManager',
|
Name: 'ObjectManager',
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
params = Params.parse(params, { connection: null,
|
params = Params.parse(params, { connection: null,
|
||||||
@ -46,7 +46,7 @@ var ObjectManager = new Lang.Class({
|
|||||||
g_interface_info: ObjectManagerInfo,
|
g_interface_info: ObjectManagerInfo,
|
||||||
g_name: this._serviceName,
|
g_name: this._serviceName,
|
||||||
g_object_path: this._managerPath,
|
g_object_path: this._managerPath,
|
||||||
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
g_flags: Gio.DBusProxyFlags.NONE });
|
||||||
|
|
||||||
this._interfaceInfos = {};
|
this._interfaceInfos = {};
|
||||||
this._objects = {};
|
this._objects = {};
|
||||||
@ -65,9 +65,6 @@ var ObjectManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_tryToCompleteLoad: function() {
|
_tryToCompleteLoad: function() {
|
||||||
if (this._numLoadInhibitors == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._numLoadInhibitors--;
|
this._numLoadInhibitors--;
|
||||||
if (this._numLoadInhibitors == 0) {
|
if (this._numLoadInhibitors == 0) {
|
||||||
if (this._onLoaded)
|
if (this._onLoaded)
|
||||||
@ -89,7 +86,7 @@ var ObjectManager = new Lang.Class({
|
|||||||
g_object_path: objectPath,
|
g_object_path: objectPath,
|
||||||
g_interface_name: interfaceName,
|
g_interface_name: interfaceName,
|
||||||
g_interface_info: info,
|
g_interface_info: info,
|
||||||
g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START });
|
g_flags: Gio.DBusProxyFlags.NONE });
|
||||||
|
|
||||||
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
proxy.init_async(GLib.PRIORITY_DEFAULT,
|
||||||
this._cancellable,
|
this._cancellable,
|
||||||
@ -184,18 +181,6 @@ var ObjectManager = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() {
|
|
||||||
if (this._managerProxy.g_name_owner)
|
|
||||||
this._onNameAppeared();
|
|
||||||
else
|
|
||||||
this._onNameVanished();
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (this._managerProxy.g_name_owner)
|
|
||||||
this._onNameAppeared();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onNameAppeared: function() {
|
|
||||||
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
|
this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) {
|
||||||
if (!result) {
|
if (!result) {
|
||||||
if (error) {
|
if (error) {
|
||||||
@ -208,11 +193,6 @@ var ObjectManager = new Lang.Class({
|
|||||||
|
|
||||||
let [objects] = result;
|
let [objects] = result;
|
||||||
|
|
||||||
if (!objects) {
|
|
||||||
this._tryToCompleteLoad();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let objectPaths = Object.keys(objects);
|
let objectPaths = Object.keys(objects);
|
||||||
for (let i = 0; i < objectPaths.length; i++) {
|
for (let i = 0; i < objectPaths.length; i++) {
|
||||||
let objectPath = objectPaths[i];
|
let objectPath = objectPaths[i];
|
||||||
@ -233,21 +213,6 @@ var ObjectManager = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_onNameVanished: function() {
|
|
||||||
let objectPaths = Object.keys(this._objects);
|
|
||||||
for (let i = 0; i < objectPaths.length; i++) {
|
|
||||||
let object = this._objects[objectPaths];
|
|
||||||
|
|
||||||
let interfaceNames = Object.keys(object);
|
|
||||||
for (let j = 0; i < interfaceNames.length; i++) {
|
|
||||||
let interfaceName = interfaceNames[i];
|
|
||||||
|
|
||||||
if (object[interfaceName])
|
|
||||||
this._removeInterface(objectPath, interfaceName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_registerInterfaces: function(interfaces) {
|
_registerInterfaces: function(interfaces) {
|
||||||
for (let i = 0; i < interfaces.length; i++) {
|
for (let i = 0; i < interfaces.length; i++) {
|
||||||
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
|
let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
|
|
||||||
const PermissionStoreIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.impl.portal.PermissionStore"> \
|
|
||||||
<method name="Lookup"> \
|
|
||||||
<arg name="table" type="s" direction="in"/> \
|
|
||||||
<arg name="id" type="s" direction="in"/> \
|
|
||||||
<arg name="permissions" type="a{sas}" direction="out"/> \
|
|
||||||
<arg name="data" type="v" direction="out"/> \
|
|
||||||
</method> \
|
|
||||||
<method name="Set"> \
|
|
||||||
<arg name="table" type="s" direction="in"/> \
|
|
||||||
<arg name="create" type="b" direction="in"/> \
|
|
||||||
<arg name="id" type="s" direction="in"/> \
|
|
||||||
<arg name="app_permissions" type="a{sas}" direction="in"/> \
|
|
||||||
<arg name="data" type="v" direction="in"/> \
|
|
||||||
</method> \
|
|
||||||
<signal name="Changed"> \
|
|
||||||
<arg name="table" type="s" direction="out"/> \
|
|
||||||
<arg name="id" type="s" direction="out"/> \
|
|
||||||
<arg name="deleted" type="b" direction="out"/> \
|
|
||||||
<arg name="data" type="v" direction="out"/> \
|
|
||||||
<arg name="permissions" type="a{sas}" direction="out"/> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const PermissionStoreProxy = Gio.DBusProxy.makeProxyWrapper(PermissionStoreIface);
|
|
||||||
|
|
||||||
function PermissionStore(initCallback, cancellable) {
|
|
||||||
return new PermissionStoreProxy(Gio.DBus.session,
|
|
||||||
'org.freedesktop.impl.portal.PermissionStore',
|
|
||||||
'/org/freedesktop/impl/portal/PermissionStore',
|
|
||||||
initCallback, cancellable);
|
|
||||||
};
|
|
@ -25,7 +25,7 @@ function getSmartcardManager() {
|
|||||||
return _smartcardManager;
|
return _smartcardManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
var SmartcardManager = new Lang.Class({
|
const SmartcardManager = new Lang.Class({
|
||||||
Name: 'SmartcardManager',
|
Name: 'SmartcardManager',
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
|
||||||
|
@ -1,440 +0,0 @@
|
|||||||
const AccountsService = imports.gi.AccountsService;
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gdm = imports.gi.Gdm;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
|
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
|
||||||
const LoginManager = imports.misc.loginManager;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
|
|
||||||
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
|
||||||
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
|
|
||||||
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
|
|
||||||
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
|
|
||||||
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
|
||||||
const DISABLE_RESTART_KEY = 'disable-restart-buttons';
|
|
||||||
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
|
||||||
|
|
||||||
const SENSOR_BUS_NAME = 'net.hadess.SensorProxy';
|
|
||||||
const SENSOR_OBJECT_PATH = '/net/hadess/SensorProxy';
|
|
||||||
|
|
||||||
const SensorProxyInterface = '<node> \
|
|
||||||
<interface name="net.hadess.SensorProxy"> \
|
|
||||||
<property name="HasAccelerometer" type="b" access="read"/> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const POWER_OFF_ACTION_ID = 'power-off';
|
|
||||||
const LOCK_SCREEN_ACTION_ID = 'lock-screen';
|
|
||||||
const LOGOUT_ACTION_ID = 'logout';
|
|
||||||
const SUSPEND_ACTION_ID = 'suspend';
|
|
||||||
const SWITCH_USER_ACTION_ID = 'switch-user';
|
|
||||||
const LOCK_ORIENTATION_ACTION_ID = 'lock-orientation';
|
|
||||||
|
|
||||||
const SensorProxy = Gio.DBusProxy.makeProxyWrapper(SensorProxyInterface);
|
|
||||||
|
|
||||||
let _singleton = null;
|
|
||||||
|
|
||||||
function getDefault() {
|
|
||||||
if (_singleton == null)
|
|
||||||
_singleton = new SystemActions();
|
|
||||||
|
|
||||||
return _singleton;
|
|
||||||
}
|
|
||||||
|
|
||||||
const SystemActions = new Lang.Class({
|
|
||||||
Name: 'SystemActions',
|
|
||||||
Extends: GObject.Object,
|
|
||||||
Properties: {
|
|
||||||
'can-power-off': GObject.ParamSpec.boolean('can-power-off',
|
|
||||||
'can-power-off',
|
|
||||||
'can-power-off',
|
|
||||||
GObject.ParamFlags.READABLE,
|
|
||||||
false),
|
|
||||||
'can-suspend': GObject.ParamSpec.boolean('can-suspend',
|
|
||||||
'can-suspend',
|
|
||||||
'can-suspend',
|
|
||||||
GObject.ParamFlags.READABLE,
|
|
||||||
false),
|
|
||||||
'can-lock-screen': GObject.ParamSpec.boolean('can-lock-screen',
|
|
||||||
'can-lock-screen',
|
|
||||||
'can-lock-screen',
|
|
||||||
GObject.ParamFlags.READABLE,
|
|
||||||
false),
|
|
||||||
'can-switch-user': GObject.ParamSpec.boolean('can-switch-user',
|
|
||||||
'can-switch-user',
|
|
||||||
'can-switch-user',
|
|
||||||
GObject.ParamFlags.READABLE,
|
|
||||||
false),
|
|
||||||
'can-logout': GObject.ParamSpec.boolean('can-logout',
|
|
||||||
'can-logout',
|
|
||||||
'can-logout',
|
|
||||||
GObject.ParamFlags.READABLE,
|
|
||||||
false),
|
|
||||||
'can-lock-orientation': GObject.ParamSpec.boolean('can-lock-orientation',
|
|
||||||
'can-lock-orientation',
|
|
||||||
'can-lock-orientation',
|
|
||||||
GObject.ParamFlags.READABLE,
|
|
||||||
false),
|
|
||||||
'orientation-lock-icon': GObject.ParamSpec.string('orientation-lock-icon',
|
|
||||||
'orientation-lock-icon',
|
|
||||||
'orientation-lock-icon',
|
|
||||||
GObject.ParamFlags.READWRITE,
|
|
||||||
null)
|
|
||||||
},
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this.parent();
|
|
||||||
|
|
||||||
this._canHavePowerOff = true;
|
|
||||||
this._canHaveSuspend = true;
|
|
||||||
|
|
||||||
this._actions = new Map();
|
|
||||||
this._actions.set(POWER_OFF_ACTION_ID,
|
|
||||||
{ // Translators: The name of the power-off action in search
|
|
||||||
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").split(';'),
|
|
||||||
available: false });
|
|
||||||
this._actions.set(LOCK_SCREEN_ACTION_ID,
|
|
||||||
{ // Translators: The name of the lock screen action in search
|
|
||||||
name: C_("search-result", "Lock screen"),
|
|
||||||
iconName: 'system-lock-screen-symbolic',
|
|
||||||
// Translators: A list of keywords that match the lock screen action, separated by semicolons
|
|
||||||
keywords: _("lock screen").split(';'),
|
|
||||||
available: false });
|
|
||||||
this._actions.set(LOGOUT_ACTION_ID,
|
|
||||||
{ // Translators: The name of the logout action in search
|
|
||||||
name: C_("search-result", "Log out"),
|
|
||||||
iconName: 'application-exit-symbolic',
|
|
||||||
// Translators: A list of keywords that match the logout action, separated by semicolons
|
|
||||||
keywords: _("logout;sign off").split(';'),
|
|
||||||
available: false });
|
|
||||||
this._actions.set(SUSPEND_ACTION_ID,
|
|
||||||
{ // Translators: The name of the suspend action in search
|
|
||||||
name: C_("search-result", "Suspend"),
|
|
||||||
iconName: 'media-playback-pause-symbolic',
|
|
||||||
// Translators: A list of keywords that match the suspend action, separated by semicolons
|
|
||||||
keywords: _("suspend;sleep").split(';'),
|
|
||||||
available: false });
|
|
||||||
this._actions.set(SWITCH_USER_ACTION_ID,
|
|
||||||
{ // Translators: The name of the switch user action in search
|
|
||||||
name: C_("search-result", "Switch user"),
|
|
||||||
iconName: 'system-switch-user-symbolic',
|
|
||||||
// Translators: A list of keywords that match the switch user action, separated by semicolons
|
|
||||||
keywords: _("switch user").split(';'),
|
|
||||||
available: false });
|
|
||||||
this._actions.set(LOCK_ORIENTATION_ACTION_ID,
|
|
||||||
{ // Translators: The name of the lock orientation action in search
|
|
||||||
name: C_("search-result", "Lock orientation"),
|
|
||||||
iconName: '',
|
|
||||||
// Translators: A list of keywords that match the lock orientation action, separated by semicolons
|
|
||||||
keywords: _("lock orientation").split(';'),
|
|
||||||
available: false });
|
|
||||||
|
|
||||||
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
|
||||||
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
|
||||||
this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' });
|
|
||||||
|
|
||||||
this._session = new GnomeSession.SessionManager();
|
|
||||||
this._loginManager = LoginManager.getLoginManager();
|
|
||||||
this._monitorManager = Meta.MonitorManager.get();
|
|
||||||
|
|
||||||
this._userManager = AccountsService.UserManager.get_default();
|
|
||||||
|
|
||||||
this._userManager.connect('notify::is-loaded',
|
|
||||||
() => { this._updateMultiUser(); });
|
|
||||||
this._userManager.connect('notify::has-multiple-users',
|
|
||||||
() => { this._updateMultiUser(); });
|
|
||||||
this._userManager.connect('user-added',
|
|
||||||
() => { this._updateMultiUser(); });
|
|
||||||
this._userManager.connect('user-removed',
|
|
||||||
() => { this._updateMultiUser(); });
|
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_USER_SWITCH_KEY,
|
|
||||||
() => { this._updateSwitchUser(); });
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
|
||||||
() => { this._updateLogout(); });
|
|
||||||
global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
|
|
||||||
() => { this._updateLogout(); });
|
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
|
||||||
() => { this._updateLockScreen(); });
|
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
|
||||||
() => { this._updateHaveShutdown(); });
|
|
||||||
|
|
||||||
this.forceUpdate();
|
|
||||||
|
|
||||||
this._orientationSettings.connect('changed::orientation-lock',
|
|
||||||
() => { this._updateOrientationLock();
|
|
||||||
this._updateOrientationLockIcon(); });
|
|
||||||
Main.layoutManager.connect('monitors-changed',
|
|
||||||
() => { this._updateOrientationLock(); });
|
|
||||||
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
|
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
|
||||||
() => { this._sensorProxyAppeared(); },
|
|
||||||
() => {
|
|
||||||
this._sensorProxy = null;
|
|
||||||
this._updateOrientationLock();
|
|
||||||
});
|
|
||||||
this._updateOrientationLock();
|
|
||||||
this._updateOrientationLockIcon();
|
|
||||||
|
|
||||||
Main.sessionMode.connect('updated', () => { this._sessionUpdated(); });
|
|
||||||
this._sessionUpdated();
|
|
||||||
},
|
|
||||||
|
|
||||||
get can_power_off() {
|
|
||||||
return this._actions.get(POWER_OFF_ACTION_ID).available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get can_suspend() {
|
|
||||||
return this._actions.get(SUSPEND_ACTION_ID).available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get can_lock_screen() {
|
|
||||||
return this._actions.get(LOCK_SCREEN_ACTION_ID).available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get can_switch_user() {
|
|
||||||
return this._actions.get(SWITCH_USER_ACTION_ID).available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get can_logout() {
|
|
||||||
return this._actions.get(LOGOUT_ACTION_ID).available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get can_lock_orientation() {
|
|
||||||
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get orientation_lock_icon() {
|
|
||||||
return this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName;
|
|
||||||
},
|
|
||||||
|
|
||||||
_sensorProxyAppeared: function() {
|
|
||||||
this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH,
|
|
||||||
(proxy, error) => {
|
|
||||||
if (error) {
|
|
||||||
log(error.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._sensorProxy.connect('g-properties-changed',
|
|
||||||
() => { this._updateOrientationLock(); });
|
|
||||||
this._updateOrientationLock();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateOrientationLock: function() {
|
|
||||||
let available = false;
|
|
||||||
if (this._sensorProxy)
|
|
||||||
available = this._sensorProxy.HasAccelerometer &&
|
|
||||||
this._monitorManager.get_is_builtin_display_on();
|
|
||||||
|
|
||||||
this._actions.get(LOCK_ORIENTATION_ACTION_ID).available = available;
|
|
||||||
|
|
||||||
this.notify('can-lock-orientation');
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateOrientationLockIcon: function() {
|
|
||||||
let locked = this._orientationSettings.get_boolean('orientation-lock');
|
|
||||||
let iconName = locked ? 'rotation-locked-symbolic'
|
|
||||||
: 'rotation-allowed-symbolic';
|
|
||||||
this._actions.get(LOCK_ORIENTATION_ACTION_ID).iconName = iconName;
|
|
||||||
|
|
||||||
this.notify('orientation-lock-icon');
|
|
||||||
},
|
|
||||||
|
|
||||||
_sessionUpdated: function() {
|
|
||||||
this._updateLockScreen();
|
|
||||||
this._updatePowerOff();
|
|
||||||
this._updateSuspend();
|
|
||||||
this._updateMultiUser();
|
|
||||||
},
|
|
||||||
|
|
||||||
forceUpdate: function() {
|
|
||||||
// Whether those actions are available or not depends on both lockdown
|
|
||||||
// settings and Polkit policy - we don't get change notifications for the
|
|
||||||
// latter, so their value may be outdated; force an update now
|
|
||||||
this._updateHaveShutdown();
|
|
||||||
this._updateHaveSuspend();
|
|
||||||
},
|
|
||||||
|
|
||||||
getMatchingActions: function(terms) {
|
|
||||||
// terms is a list of strings
|
|
||||||
terms = terms.map((term) => { return term.toLowerCase(); });
|
|
||||||
|
|
||||||
let results = [];
|
|
||||||
|
|
||||||
for (let [key, {available, keywords}] of this._actions)
|
|
||||||
if (available && terms.every(t => keywords.some(k => (k.indexOf(t) >= 0))))
|
|
||||||
results.push(key);
|
|
||||||
|
|
||||||
return results;
|
|
||||||
},
|
|
||||||
|
|
||||||
getName: function(id) {
|
|
||||||
return this._actions.get(id).name;
|
|
||||||
},
|
|
||||||
|
|
||||||
getIconName: function(id) {
|
|
||||||
return this._actions.get(id).iconName;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateAction: function(id) {
|
|
||||||
switch (id) {
|
|
||||||
case POWER_OFF_ACTION_ID:
|
|
||||||
this.activatePowerOff();
|
|
||||||
break;
|
|
||||||
case LOCK_SCREEN_ACTION_ID:
|
|
||||||
this.activateLockScreen();
|
|
||||||
break;
|
|
||||||
case LOGOUT_ACTION_ID:
|
|
||||||
this.activateLogout();
|
|
||||||
break;
|
|
||||||
case SUSPEND_ACTION_ID:
|
|
||||||
this.activateSuspend();
|
|
||||||
break;
|
|
||||||
case SWITCH_USER_ACTION_ID:
|
|
||||||
this.activateSwitchUser();
|
|
||||||
break;
|
|
||||||
case LOCK_ORIENTATION_ACTION_ID:
|
|
||||||
this.activateLockOrientation();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateLockScreen() {
|
|
||||||
let showLock = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
|
||||||
let allowLockScreen = !this._lockdownSettings.get_boolean(DISABLE_LOCK_SCREEN_KEY);
|
|
||||||
this._actions.get(LOCK_SCREEN_ACTION_ID).available = showLock && allowLockScreen && LoginManager.canLock();
|
|
||||||
this.notify('can-lock-screen');
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateHaveShutdown: function() {
|
|
||||||
this._session.CanShutdownRemote((result, error) => {
|
|
||||||
if (error)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._canHavePowerOff = result[0];
|
|
||||||
this._updatePowerOff();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_updatePowerOff: function() {
|
|
||||||
let disabled = Main.sessionMode.isLocked ||
|
|
||||||
(Main.sessionMode.isGreeter &&
|
|
||||||
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
|
|
||||||
this._actions.get(POWER_OFF_ACTION_ID).available = this._canHavePowerOff && !disabled;
|
|
||||||
this.notify('can-power-off');
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateHaveSuspend: function() {
|
|
||||||
this._loginManager.canSuspend(
|
|
||||||
(canSuspend, needsAuth) => {
|
|
||||||
this._canHaveSuspend = canSuspend;
|
|
||||||
this._suspendNeedsAuth = needsAuth;
|
|
||||||
this._updateSuspend();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateSuspend: function() {
|
|
||||||
let disabled = (Main.sessionMode.isLocked &&
|
|
||||||
this._suspendNeedsAuth) ||
|
|
||||||
(Main.sessionMode.isGreeter &&
|
|
||||||
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
|
|
||||||
this._actions.get(SUSPEND_ACTION_ID).available = this._canHaveSuspend && !disabled;
|
|
||||||
this.notify('can-suspend');
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateMultiUser: function() {
|
|
||||||
this._updateLogout();
|
|
||||||
this._updateSwitchUser();
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateSwitchUser: function() {
|
|
||||||
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
|
|
||||||
let multiUser = this._userManager.can_switch() && this._userManager.has_multiple_users;
|
|
||||||
let shouldShowInMode = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
|
||||||
|
|
||||||
let visible = allowSwitch && multiUser && shouldShowInMode;
|
|
||||||
this._actions.get(SWITCH_USER_ACTION_ID).available = visible;
|
|
||||||
this.notify('can-switch-user');
|
|
||||||
|
|
||||||
return visible;
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateLogout: function() {
|
|
||||||
let user = this._userManager.get_user(GLib.get_user_name());
|
|
||||||
|
|
||||||
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
|
|
||||||
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
|
|
||||||
let systemAccount = user.system_account;
|
|
||||||
let localAccount = user.local_account;
|
|
||||||
let multiUser = this._userManager.has_multiple_users;
|
|
||||||
let multiSession = Gdm.get_session_ids().length > 1;
|
|
||||||
let shouldShowInMode = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
|
||||||
|
|
||||||
let visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount) && shouldShowInMode;
|
|
||||||
this._actions.get(LOGOUT_ACTION_ID).available = visible;
|
|
||||||
this.notify('can-logout');
|
|
||||||
|
|
||||||
return visible;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateLockOrientation: function() {
|
|
||||||
if (!this._actions.get(LOCK_ORIENTATION_ACTION_ID).available)
|
|
||||||
throw new Error('The lock-orientation action is not available!');
|
|
||||||
|
|
||||||
let locked = this._orientationSettings.get_boolean('orientation-lock');
|
|
||||||
this._orientationSettings.set_boolean('orientation-lock', !locked);
|
|
||||||
},
|
|
||||||
|
|
||||||
activateLockScreen: function() {
|
|
||||||
if (!this._actions.get(LOCK_SCREEN_ACTION_ID).available)
|
|
||||||
throw new Error('The lock-screen action is not available!');
|
|
||||||
|
|
||||||
Main.screenShield.lock(true);
|
|
||||||
},
|
|
||||||
|
|
||||||
activateSwitchUser: function() {
|
|
||||||
if (!this._actions.get(SWITCH_USER_ACTION_ID).available)
|
|
||||||
throw new Error('The switch-user action is not available!');
|
|
||||||
|
|
||||||
if (Main.screenShield)
|
|
||||||
Main.screenShield.lock(false);
|
|
||||||
|
|
||||||
Clutter.threads_add_repaint_func_full(Clutter.RepaintFlags.POST_PAINT, function() {
|
|
||||||
Gdm.goto_login_session_sync(null);
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
activateLogout: function() {
|
|
||||||
if (!this._actions.get(LOGOUT_ACTION_ID).available)
|
|
||||||
throw new Error('The logout action is not available!');
|
|
||||||
|
|
||||||
Main.overview.hide();
|
|
||||||
this._session.LogoutRemote(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
activatePowerOff: function() {
|
|
||||||
if (!this._actions.get(POWER_OFF_ACTION_ID).available)
|
|
||||||
throw new Error('The power-off action is not available!');
|
|
||||||
|
|
||||||
this._session.ShutdownRemote(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
activateSuspend: function() {
|
|
||||||
if (!this._actions.get(SUSPEND_ACTION_ID).available)
|
|
||||||
throw new Error('The suspend action is not available!');
|
|
||||||
|
|
||||||
this._loginManager.suspend();
|
|
||||||
}
|
|
||||||
});
|
|
141
js/misc/util.js
141
js/misc/util.js
@ -1,12 +1,9 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Gettext = imports.gettext;
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
@ -14,7 +11,7 @@ const Main = imports.ui.main;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
var SCROLL_TIME = 0.1;
|
const SCROLL_TIME = 0.1;
|
||||||
|
|
||||||
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
|
||||||
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
const _balancedParens = '\\((?:[^\\s()<>]+|(?:\\(?:[^\\s()<>]+\\)))*\\)';
|
||||||
@ -164,41 +161,6 @@ function _handleSpawnError(command, err) {
|
|||||||
Main.notifyError(title, err.message);
|
Main.notifyError(title, err.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatTimeSpan(date) {
|
|
||||||
let now = GLib.DateTime.new_now_local();
|
|
||||||
|
|
||||||
let timespan = now.difference(date);
|
|
||||||
|
|
||||||
let minutesAgo = timespan / GLib.TIME_SPAN_MINUTE;
|
|
||||||
let hoursAgo = timespan / GLib.TIME_SPAN_HOUR;
|
|
||||||
let daysAgo = timespan / GLib.TIME_SPAN_DAY;
|
|
||||||
let weeksAgo = daysAgo / 7;
|
|
||||||
let monthsAgo = daysAgo / 30;
|
|
||||||
let yearsAgo = weeksAgo / 52;
|
|
||||||
|
|
||||||
if (minutesAgo < 5)
|
|
||||||
return _("Just now");
|
|
||||||
if (hoursAgo < 1)
|
|
||||||
return Gettext.ngettext("%d minute ago",
|
|
||||||
"%d minutes ago", minutesAgo).format(minutesAgo);
|
|
||||||
if (daysAgo < 1)
|
|
||||||
return Gettext.ngettext("%d hour ago",
|
|
||||||
"%d hours ago", hoursAgo).format(hoursAgo);
|
|
||||||
if (daysAgo < 2)
|
|
||||||
return _("Yesterday");
|
|
||||||
if (daysAgo < 15)
|
|
||||||
return Gettext.ngettext("%d day ago",
|
|
||||||
"%d days ago", daysAgo).format(daysAgo);
|
|
||||||
if (weeksAgo < 8)
|
|
||||||
return Gettext.ngettext("%d week ago",
|
|
||||||
"%d weeks ago", weeksAgo).format(weeksAgo);
|
|
||||||
if (yearsAgo < 1)
|
|
||||||
return Gettext.ngettext("%d month ago",
|
|
||||||
"%d months ago", monthsAgo).format(monthsAgo);
|
|
||||||
return Gettext.ngettext("%d year ago",
|
|
||||||
"%d years ago", yearsAgo).format(yearsAgo);
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatTime(time, params) {
|
function formatTime(time, params) {
|
||||||
let date;
|
let date;
|
||||||
// HACK: The built-in Date type sucks at timezones, which we need for the
|
// HACK: The built-in Date type sucks at timezones, which we need for the
|
||||||
@ -218,10 +180,11 @@ function formatTime(time, params) {
|
|||||||
if (_desktopSettings == null)
|
if (_desktopSettings == null)
|
||||||
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
_desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||||
let clockFormat = _desktopSettings.get_string('clock-format');
|
let clockFormat = _desktopSettings.get_string('clock-format');
|
||||||
|
let hasAmPm = date.format('%p') != '';
|
||||||
|
|
||||||
params = Params.parse(params, { timeOnly: false });
|
params = Params.parse(params, { timeOnly: false });
|
||||||
|
|
||||||
if (clockFormat == '24h') {
|
if (clockFormat == '24h' || !hasAmPm) {
|
||||||
// Show only the time if date is on today
|
// Show only the time if date is on today
|
||||||
if (daysAgo < 1 || params.timeOnly)
|
if (daysAgo < 1 || params.timeOnly)
|
||||||
/* Translators: Time in 24h format */
|
/* Translators: Time in 24h format */
|
||||||
@ -280,10 +243,7 @@ function formatTime(time, params) {
|
|||||||
// xgettext:no-c-format
|
// xgettext:no-c-format
|
||||||
format = N_("%B %d %Y, %l\u2236%M %p");
|
format = N_("%B %d %Y, %l\u2236%M %p");
|
||||||
}
|
}
|
||||||
|
return date.format(Shell.util_translate_time_string(format));
|
||||||
let formattedTime = date.format(Shell.util_translate_time_string(format));
|
|
||||||
// prepend LTR-mark to colon/ratio to force a text direction on times
|
|
||||||
return formattedTime.replace(/([:\u2236])/g, '\u200e$1');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function createTimeLabel(date, params) {
|
function createTimeLabel(date, params) {
|
||||||
@ -350,7 +310,7 @@ function insertSorted(array, val, cmp) {
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
var CloseButton = new Lang.Class({
|
const CloseButton = new Lang.Class({
|
||||||
Name: 'CloseButton',
|
Name: 'CloseButton',
|
||||||
Extends: St.Button,
|
Extends: St.Button,
|
||||||
|
|
||||||
@ -438,94 +398,3 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
|
|||||||
time: SCROLL_TIME,
|
time: SCROLL_TIME,
|
||||||
transition: 'easeOutQuad' });
|
transition: 'easeOutQuad' });
|
||||||
}
|
}
|
||||||
|
|
||||||
var AppSettingsMonitor = new Lang.Class({
|
|
||||||
Name: 'AppSettingsMonitor',
|
|
||||||
|
|
||||||
_init: function(appId, schemaId) {
|
|
||||||
this._appId = appId;
|
|
||||||
this._schemaId = schemaId;
|
|
||||||
|
|
||||||
this._app = null;
|
|
||||||
this._settings = null;
|
|
||||||
this._handlers = [];
|
|
||||||
|
|
||||||
this._schemaSource = Gio.SettingsSchemaSource.get_default();
|
|
||||||
|
|
||||||
this._appSystem = Shell.AppSystem.get_default();
|
|
||||||
this._appSystem.connect('installed-changed',
|
|
||||||
Lang.bind(this, this._onInstalledChanged));
|
|
||||||
this._onInstalledChanged();
|
|
||||||
},
|
|
||||||
|
|
||||||
get available() {
|
|
||||||
return this._app != null && this._settings != null;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateApp: function() {
|
|
||||||
if (this._app)
|
|
||||||
this._app.activate();
|
|
||||||
},
|
|
||||||
|
|
||||||
watchSetting: function(key, callback) {
|
|
||||||
let handler = { id: 0, key: key, callback: callback };
|
|
||||||
this._handlers.push(handler);
|
|
||||||
|
|
||||||
this._connectHandler(handler);
|
|
||||||
},
|
|
||||||
|
|
||||||
_connectHandler: function(handler) {
|
|
||||||
if (!this._settings || handler.id > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
handler.id = this._settings.connect('changed::' + handler.key,
|
|
||||||
handler.callback);
|
|
||||||
handler.callback(this._settings, handler.key);
|
|
||||||
},
|
|
||||||
|
|
||||||
_disconnectHandler: function(handler) {
|
|
||||||
if (this._settings && handler.id > 0)
|
|
||||||
this._settings.disconnect(handler.id);
|
|
||||||
handler.id = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onInstalledChanged: function() {
|
|
||||||
let hadApp = (this._app != null);
|
|
||||||
this._app = this._appSystem.lookup_app(this._appId);
|
|
||||||
let haveApp = (this._app != null);
|
|
||||||
|
|
||||||
if (hadApp == haveApp)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (haveApp)
|
|
||||||
this._checkSettings();
|
|
||||||
else
|
|
||||||
this._setSettings(null);
|
|
||||||
},
|
|
||||||
|
|
||||||
_setSettings: function(settings) {
|
|
||||||
this._handlers.forEach((handler) => { this._disconnectHandler(handler); });
|
|
||||||
|
|
||||||
let hadSettings = (this._settings != null);
|
|
||||||
this._settings = settings;
|
|
||||||
let haveSettings = (this._settings != null);
|
|
||||||
|
|
||||||
this._handlers.forEach((handler) => { this._connectHandler(handler); });
|
|
||||||
|
|
||||||
if (hadSettings != haveSettings)
|
|
||||||
this.emit('available-changed');
|
|
||||||
},
|
|
||||||
|
|
||||||
_checkSettings: function() {
|
|
||||||
let schema = this._schemaSource.lookup(this._schemaId, true);
|
|
||||||
if (schema) {
|
|
||||||
this._setSettings(new Gio.Settings({ settings_schema: schema }));
|
|
||||||
} else if (this._app) {
|
|
||||||
Mainloop.timeout_add_seconds(1, () => {
|
|
||||||
this._checkSettings();
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(AppSettingsMonitor.prototype);
|
|
||||||
|
@ -1,247 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Geoclue = imports.gi.Geoclue;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const GWeather = imports.gi.GWeather;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
|
|
||||||
const PermissionStore = imports.misc.permissionStore;
|
|
||||||
const Util = imports.misc.util;
|
|
||||||
|
|
||||||
// Minimum time between updates to show loading indication
|
|
||||||
var UPDATE_THRESHOLD = 10 * GLib.TIME_SPAN_MINUTE;
|
|
||||||
|
|
||||||
var WeatherClient = new Lang.Class({
|
|
||||||
Name: 'WeatherClient',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._loading = false;
|
|
||||||
this._locationValid = false;
|
|
||||||
this._lastUpdate = GLib.DateTime.new_from_unix_local(0);
|
|
||||||
|
|
||||||
this._autoLocationRequested = false;
|
|
||||||
this._mostRecentLocation = null;
|
|
||||||
|
|
||||||
this._gclueService = null;
|
|
||||||
this._gclueStarted = false;
|
|
||||||
this._gclueStarting = false;
|
|
||||||
this._gclueLocationChangedId = 0;
|
|
||||||
|
|
||||||
this._weatherAuthorized = false;
|
|
||||||
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
|
|
||||||
if (error) {
|
|
||||||
log('Failed to connect to permissionStore: ' + error.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._permStore.LookupRemote('gnome', 'geolocation', (res, error) => {
|
|
||||||
if (error)
|
|
||||||
log('Error looking up permission: ' + error.message);
|
|
||||||
|
|
||||||
let [perms, data] = error ? [{}, null] : res;
|
|
||||||
let params = ['gnome', 'geolocation', false, data, perms];
|
|
||||||
this._onPermStoreChanged(this._permStore, '', params);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this._permStore.connectSignal('Changed',
|
|
||||||
Lang.bind(this, this._onPermStoreChanged));
|
|
||||||
|
|
||||||
this._locationSettings = new Gio.Settings({ schema_id: 'org.gnome.system.location' });
|
|
||||||
this._locationSettings.connect('changed::enabled',
|
|
||||||
Lang.bind(this, this._updateAutoLocation));
|
|
||||||
|
|
||||||
this._world = GWeather.Location.get_world();
|
|
||||||
|
|
||||||
this._providers = GWeather.Provider.METAR |
|
|
||||||
GWeather.Provider.YR_NO |
|
|
||||||
GWeather.Provider.OWM;
|
|
||||||
|
|
||||||
this._weatherInfo = new GWeather.Info({ enabled_providers: 0 });
|
|
||||||
this._weatherInfo.connect_after('updated', () => {
|
|
||||||
this._lastUpdate = GLib.DateTime.new_now_local();
|
|
||||||
this.emit('changed');
|
|
||||||
});
|
|
||||||
|
|
||||||
this._weatherAppMon = new Util.AppSettingsMonitor('org.gnome.Weather.Application.desktop',
|
|
||||||
'org.gnome.Weather.Application');
|
|
||||||
this._weatherAppMon.connect('available-changed', () => { this.emit('changed'); });
|
|
||||||
this._weatherAppMon.watchSetting('automatic-location',
|
|
||||||
Lang.bind(this, this._onAutomaticLocationChanged));
|
|
||||||
this._weatherAppMon.watchSetting('locations',
|
|
||||||
Lang.bind(this, this._onLocationsChanged));
|
|
||||||
},
|
|
||||||
|
|
||||||
get available() {
|
|
||||||
return this._weatherAppMon.available;
|
|
||||||
},
|
|
||||||
|
|
||||||
get loading() {
|
|
||||||
return this._loading;
|
|
||||||
},
|
|
||||||
|
|
||||||
get hasLocation() {
|
|
||||||
return this._locationValid;
|
|
||||||
},
|
|
||||||
|
|
||||||
get info() {
|
|
||||||
return this._weatherInfo;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateApp: function() {
|
|
||||||
this._weatherAppMon.activateApp();
|
|
||||||
},
|
|
||||||
|
|
||||||
update: function() {
|
|
||||||
if (!this._locationValid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let now = GLib.DateTime.new_now_local();
|
|
||||||
// Update without loading indication if the current info is recent enough
|
|
||||||
if (this._weatherInfo.is_valid() &&
|
|
||||||
now.difference(this._lastUpdate) < UPDATE_THRESHOLD)
|
|
||||||
this._weatherInfo.update();
|
|
||||||
else
|
|
||||||
this._loadInfo();
|
|
||||||
},
|
|
||||||
|
|
||||||
get _useAutoLocation() {
|
|
||||||
return this._autoLocationRequested &&
|
|
||||||
this._locationSettings.get_boolean('enabled') &&
|
|
||||||
this._weatherAuthorized;
|
|
||||||
},
|
|
||||||
|
|
||||||
_loadInfo: function() {
|
|
||||||
let id = this._weatherInfo.connect('updated', () => {
|
|
||||||
this._weatherInfo.disconnect(id);
|
|
||||||
this._loading = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this._loading = true;
|
|
||||||
this.emit('changed');
|
|
||||||
|
|
||||||
this._weatherInfo.update();
|
|
||||||
},
|
|
||||||
|
|
||||||
_locationsEqual: function(loc1, loc2) {
|
|
||||||
if (loc1 == loc2)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (loc1 == null || loc2 == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return loc1.equal(loc2);
|
|
||||||
},
|
|
||||||
|
|
||||||
_setLocation: function(location) {
|
|
||||||
if (this._locationsEqual(this._weatherInfo.location, location))
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._weatherInfo.abort();
|
|
||||||
this._weatherInfo.set_location(location);
|
|
||||||
this._locationValid = (location != null);
|
|
||||||
|
|
||||||
this._weatherInfo.set_enabled_providers(location ? this._providers : 0);
|
|
||||||
|
|
||||||
if (location)
|
|
||||||
this._loadInfo();
|
|
||||||
else
|
|
||||||
this.emit('changed');
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateLocationMonitoring: function() {
|
|
||||||
if (this._useAutoLocation) {
|
|
||||||
if (this._gclueLocationChangedId != 0 || this._gclueService == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._gclueLocationChangedId =
|
|
||||||
this._gclueService.connect('notify::location',
|
|
||||||
Lang.bind(this, this._onGClueLocationChanged));
|
|
||||||
this._onGClueLocationChanged();
|
|
||||||
} else {
|
|
||||||
if (this._gclueLocationChangedId)
|
|
||||||
this._gclueService.disconnect(this._gclueLocationChangedId);
|
|
||||||
this._gclueLocationChangedId = 0;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_startGClueService: function() {
|
|
||||||
if (this._gclueStarting)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._gclueStarting = true;
|
|
||||||
|
|
||||||
Geoclue.Simple.new('org.gnome.Shell', Geoclue.AccuracyLevel.CITY, null,
|
|
||||||
(o, res) => {
|
|
||||||
try {
|
|
||||||
this._gclueService = Geoclue.Simple.new_finish(res);
|
|
||||||
} catch(e) {
|
|
||||||
log('Failed to connect to Geoclue2 service: ' + e.message);
|
|
||||||
this._setLocation(this._mostRecentLocation);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._gclueStarted = true;
|
|
||||||
this._gclueService.get_client().distance_threshold = 100;
|
|
||||||
this._updateLocationMonitoring();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_onGClueLocationChanged: function() {
|
|
||||||
let geoLocation = this._gclueService.location;
|
|
||||||
let location = GWeather.Location.new_detached(geoLocation.description,
|
|
||||||
null,
|
|
||||||
geoLocation.latitude,
|
|
||||||
geoLocation.longitude);
|
|
||||||
this._setLocation(location);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onAutomaticLocationChanged: function(settings, key) {
|
|
||||||
let useAutoLocation = settings.get_boolean(key);
|
|
||||||
if (this._autoLocationRequested == useAutoLocation)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._autoLocationRequested = useAutoLocation;
|
|
||||||
|
|
||||||
this._updateAutoLocation();
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateAutoLocation: function() {
|
|
||||||
this._updateLocationMonitoring();
|
|
||||||
|
|
||||||
if (this._useAutoLocation)
|
|
||||||
this._startGClueService();
|
|
||||||
else
|
|
||||||
this._setLocation(this._mostRecentLocation);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onLocationsChanged: function(settings, key) {
|
|
||||||
let serialized = settings.get_value(key).deep_unpack().shift();
|
|
||||||
let mostRecentLocation = null;
|
|
||||||
|
|
||||||
if (serialized)
|
|
||||||
mostRecentLocation = this._world.deserialize(serialized);
|
|
||||||
|
|
||||||
if (this._locationsEqual(this._mostRecentLocation, mostRecentLocation))
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._mostRecentLocation = mostRecentLocation;
|
|
||||||
|
|
||||||
if (!this._useAutoLocation || !this._gclueStarted)
|
|
||||||
this._setLocation(this._mostRecentLocation);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onPermStoreChanged: function(proxy, sender, params) {
|
|
||||||
let [table, id, deleted, data, perms] = params;
|
|
||||||
|
|
||||||
if (table != 'gnome' || id != 'geolocation')
|
|
||||||
return;
|
|
||||||
|
|
||||||
let permission = perms['org.gnome.Weather.Application'] || ['NONE'];
|
|
||||||
let [accuracy] = permission;
|
|
||||||
this._weatherAuthorized = accuracy != 'NONE';
|
|
||||||
|
|
||||||
this._updateAutoLocation();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(WeatherClient.prototype);
|
|
@ -19,15 +19,7 @@ const PortalHelperResult = {
|
|||||||
RECHECK: 2
|
RECHECK: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
const PortalHelperSecurityLevel = {
|
|
||||||
NOT_YET_DETERMINED: 0,
|
|
||||||
SECURE: 1,
|
|
||||||
INSECURE: 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const INACTIVITY_TIMEOUT = 30000; //ms
|
const INACTIVITY_TIMEOUT = 30000; //ms
|
||||||
const CONNECTIVITY_CHECK_HOST = 'nmcheck.gnome.org';
|
|
||||||
const CONNECTIVITY_CHECK_URI = 'http://' + CONNECTIVITY_CHECK_HOST;
|
|
||||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
||||||
|
|
||||||
const HelperDBusInterface = '<node> \
|
const HelperDBusInterface = '<node> \
|
||||||
@ -50,86 +42,15 @@ const HelperDBusInterface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
var PortalHeaderBar = new Lang.Class({
|
const PortalWindow = new Lang.Class({
|
||||||
Name: 'PortalHeaderBar',
|
|
||||||
Extends: Gtk.HeaderBar,
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this.parent({ show_close_button: true });
|
|
||||||
|
|
||||||
// See ephy-title-box.c in epiphany for the layout
|
|
||||||
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
|
|
||||||
spacing: 0 });
|
|
||||||
this.set_custom_title(vbox);
|
|
||||||
|
|
||||||
/* TRANSLATORS: this is the title of the wifi captive portal login window */
|
|
||||||
let titleLabel = new Gtk.Label({ label: _("Hotspot Login"),
|
|
||||||
wrap: false,
|
|
||||||
single_line_mode: true,
|
|
||||||
ellipsize: Pango.EllipsizeMode.END });
|
|
||||||
titleLabel.get_style_context().add_class('title');
|
|
||||||
vbox.add(titleLabel);
|
|
||||||
|
|
||||||
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
|
|
||||||
spacing: 4,
|
|
||||||
halign: Gtk.Align.CENTER,
|
|
||||||
valign: Gtk.Align.BASELINE });
|
|
||||||
hbox.get_style_context().add_class('subtitle');
|
|
||||||
vbox.add(hbox);
|
|
||||||
|
|
||||||
this._lockImage = new Gtk.Image({ icon_size: Gtk.IconSize.MENU,
|
|
||||||
valign: Gtk.Align.BASELINE });
|
|
||||||
hbox.add(this._lockImage);
|
|
||||||
|
|
||||||
this.subtitleLabel = new Gtk.Label({ wrap: false,
|
|
||||||
single_line_mode: true,
|
|
||||||
ellipsize: Pango.EllipsizeMode.END,
|
|
||||||
valign: Gtk.Align.BASELINE,
|
|
||||||
selectable: true});
|
|
||||||
this.subtitleLabel.get_style_context().add_class('subtitle');
|
|
||||||
hbox.add(this.subtitleLabel);
|
|
||||||
|
|
||||||
vbox.show_all();
|
|
||||||
},
|
|
||||||
|
|
||||||
setSubtitle: function(label) {
|
|
||||||
this.subtitleLabel.set_text(label);
|
|
||||||
},
|
|
||||||
|
|
||||||
setSecurityIcon: function(securityLevel) {
|
|
||||||
switch (securityLevel) {
|
|
||||||
case PortalHelperSecurityLevel.NOT_YET_DETERMINED:
|
|
||||||
this._lockImage.hide();
|
|
||||||
break;
|
|
||||||
case PortalHelperSecurityLevel.SECURE:
|
|
||||||
this._lockImage.show();
|
|
||||||
this._lockImage.set_from_icon_name("channel-secure-symbolic", Gtk.IconSize.MENU);
|
|
||||||
this._lockImage.set_tooltip_text(null);
|
|
||||||
break;
|
|
||||||
case PortalHelperSecurityLevel.INSECURE:
|
|
||||||
this._lockImage.show();
|
|
||||||
this._lockImage.set_from_icon_name("channel-insecure-symbolic", Gtk.IconSize.MENU);
|
|
||||||
this._lockImage.set_tooltip_text(_('Your connection to this hotspot login is not secure. Passwords or other information you enter on this page can be viewed by people nearby.'));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
var PortalWindow = new Lang.Class({
|
|
||||||
Name: 'PortalWindow',
|
Name: 'PortalWindow',
|
||||||
Extends: Gtk.ApplicationWindow,
|
Extends: Gtk.ApplicationWindow,
|
||||||
|
|
||||||
_init: function(application, url, timestamp, doneCallback) {
|
_init: function(application, url, timestamp, doneCallback) {
|
||||||
this.parent({ application: application });
|
this.parent({ application: application });
|
||||||
|
|
||||||
this.connect('delete-event', Lang.bind(this, this.destroyWindow));
|
|
||||||
this._headerBar = new PortalHeaderBar();
|
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED);
|
|
||||||
this.set_titlebar(this._headerBar);
|
|
||||||
this._headerBar.show();
|
|
||||||
|
|
||||||
if (!url) {
|
if (!url) {
|
||||||
url = CONNECTIVITY_CHECK_URI;
|
url = 'http://www.gnome.org';
|
||||||
this._originalUrlWasGnome = true;
|
this._originalUrlWasGnome = true;
|
||||||
} else {
|
} else {
|
||||||
this._originalUrlWasGnome = false;
|
this._originalUrlWasGnome = false;
|
||||||
@ -141,38 +62,28 @@ var PortalWindow = new Lang.Class({
|
|||||||
this._lastRecheck = 0;
|
this._lastRecheck = 0;
|
||||||
this._recheckAtExit = false;
|
this._recheckAtExit = false;
|
||||||
|
|
||||||
this._webContext = WebKit.WebContext.new_ephemeral();
|
this._webView = new WebKit.WebView();
|
||||||
this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER);
|
|
||||||
this._webContext.set_network_proxy_settings(WebKit.NetworkProxyMode.NO_PROXY, null);
|
|
||||||
|
|
||||||
this._webView = WebKit.WebView.new_with_context(this._webContext);
|
|
||||||
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
||||||
this._webView.connect('load-changed', Lang.bind(this, this._onLoadChanged));
|
|
||||||
this._webView.connect('insecure-content-detected', Lang.bind(this, this._onInsecureContentDetected));
|
|
||||||
this._webView.connect('load-failed-with-tls-errors', Lang.bind(this, this._onLoadFailedWithTlsErrors));
|
|
||||||
this._webView.load_uri(url);
|
this._webView.load_uri(url);
|
||||||
this._webView.connect('notify::uri', Lang.bind(this, this._syncUri));
|
this._webView.connect('notify::title', Lang.bind(this, this._syncTitle));
|
||||||
this._syncUri();
|
this._syncTitle();
|
||||||
|
|
||||||
this.add(this._webView);
|
this.add(this._webView);
|
||||||
this._webView.show();
|
this._webView.show();
|
||||||
this.set_size_request(600, 450);
|
|
||||||
this.maximize();
|
this.maximize();
|
||||||
this.present_with_time(timestamp);
|
this.present_with_time(timestamp);
|
||||||
|
|
||||||
this.application.set_accels_for_action('app.quit', ['<Primary>q', '<Primary>w']);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
destroyWindow: function() {
|
_syncTitle: function() {
|
||||||
this.destroy();
|
let title = this._webView.title;
|
||||||
},
|
|
||||||
|
|
||||||
_syncUri: function() {
|
if (title) {
|
||||||
let uri = this._webView.uri;
|
this.title = title;
|
||||||
if (uri)
|
} else {
|
||||||
this._headerBar.setSubtitle(GLib.uri_unescape_string(uri, null));
|
/* TRANSLATORS: this is the title of the wifi captive portal login
|
||||||
else
|
* window, until we know the title of the actual login page */
|
||||||
this._headerBar.setSubtitle('');
|
this.title = _("Web Authentication Redirect");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
@ -188,46 +99,8 @@ var PortalWindow = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onLoadChanged: function(view, loadEvent) {
|
|
||||||
if (loadEvent == WebKit.LoadEvent.STARTED) {
|
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.NOT_YET_DETERMINED);
|
|
||||||
} else if (loadEvent == WebKit.LoadEvent.COMMITTED) {
|
|
||||||
let tlsInfo = this._webView.get_tls_info();
|
|
||||||
let ret = tlsInfo[0];
|
|
||||||
let flags = tlsInfo[2];
|
|
||||||
if (ret && flags == 0)
|
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.SECURE);
|
|
||||||
else
|
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onInsecureContentDetected: function () {
|
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onLoadFailedWithTlsErrors: function (view, failingURI, certificate, errors) {
|
|
||||||
this._headerBar.setSecurityIcon(PortalHelperSecurityLevel.INSECURE);
|
|
||||||
let uri = new Soup.URI(failingURI);
|
|
||||||
this._webContext.allow_tls_certificate_for_host(certificate, uri.get_host());
|
|
||||||
this._webView.load_uri(failingURI);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDecidePolicy: function(view, decision, type) {
|
_onDecidePolicy: function(view, decision, type) {
|
||||||
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
||||||
let navigationAction = decision.get_navigation_action();
|
|
||||||
if (navigationAction.is_user_gesture()) {
|
|
||||||
// Even though the portal asks for a new window,
|
|
||||||
// perform the navigation in the current one. Some
|
|
||||||
// portals open a window as their last login step and
|
|
||||||
// ignoring that window causes them to not let the
|
|
||||||
// user go through. We don't risk popups taking over
|
|
||||||
// the page because we check that the navigation is
|
|
||||||
// user initiated.
|
|
||||||
this._webView.load_request(navigationAction.get_request());
|
|
||||||
}
|
|
||||||
|
|
||||||
decision.ignore();
|
decision.ignore();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -239,12 +112,12 @@ var PortalWindow = new Lang.Class({
|
|||||||
let uri = new Soup.URI(request.get_uri());
|
let uri = new Soup.URI(request.get_uri());
|
||||||
|
|
||||||
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
|
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
|
||||||
if (uri.get_host() == CONNECTIVITY_CHECK_HOST && this._everSeenRedirect) {
|
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
|
||||||
// Yay, we got to gnome!
|
// Yay, we got to gnome!
|
||||||
decision.ignore();
|
decision.ignore();
|
||||||
this._doneCallback(PortalHelperResult.COMPLETED);
|
this._doneCallback(PortalHelperResult.COMPLETED);
|
||||||
return true;
|
return true;
|
||||||
} else if (uri.get_host() != CONNECTIVITY_CHECK_HOST) {
|
} else if (uri.get_host() != 'www.gnome.org') {
|
||||||
this._everSeenRedirect = true;
|
this._everSeenRedirect = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -282,7 +155,7 @@ var PortalWindow = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var WebPortalHelper = new Lang.Class({
|
const WebPortalHelper = new Lang.Class({
|
||||||
Name: 'WebPortalHelper',
|
Name: 'WebPortalHelper',
|
||||||
Extends: Gtk.Application,
|
Extends: Gtk.Application,
|
||||||
|
|
||||||
@ -293,10 +166,6 @@ var WebPortalHelper = new Lang.Class({
|
|||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
||||||
this._queue = [];
|
this._queue = [];
|
||||||
|
|
||||||
let action = new Gio.SimpleAction({ name: 'quit' });
|
|
||||||
action.connect('activate', () => { this.active_window.destroyWindow(); });
|
|
||||||
this.add_action(action);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
vfunc_dbus_register: function(connection, path) {
|
vfunc_dbus_register: function(connection, path) {
|
||||||
@ -328,7 +197,7 @@ var WebPortalHelper = new Lang.Class({
|
|||||||
|
|
||||||
if (obj.connection == connection) {
|
if (obj.connection == connection) {
|
||||||
if (obj.window)
|
if (obj.window)
|
||||||
obj.window.destroyWindow();
|
obj.window.destroy();
|
||||||
this._queue.splice(i, 1);
|
this._queue.splice(i, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -357,7 +226,7 @@ var WebPortalHelper = new Lang.Class({
|
|||||||
if (top.window != null)
|
if (top.window != null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
top.window = new PortalWindow(this, top.url, top.timestamp, Lang.bind(this, function(result) {
|
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
|
||||||
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@ -370,11 +239,6 @@ function initEnvironment() {
|
|||||||
function main(argv) {
|
function main(argv) {
|
||||||
initEnvironment();
|
initEnvironment();
|
||||||
|
|
||||||
if (!WebKit.WebContext.new_ephemeral) {
|
|
||||||
log('WebKitGTK 2.16 is required for the portal-helper, see https://bugzilla.gnome.org/show_bug.cgi?id=780453');
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
||||||
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
||||||
|
|
||||||
|
@ -1,180 +0,0 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const CheckBox = imports.ui.checkBox;
|
|
||||||
const Dialog = imports.ui.dialog;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
|
||||||
|
|
||||||
const RequestIface = '<node> \
|
|
||||||
<interface name="org.freedesktop.impl.portal.Request"> \
|
|
||||||
<method name="Close"/> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const AccessIface = '<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>';
|
|
||||||
|
|
||||||
var DialogResponse = {
|
|
||||||
OK: 0,
|
|
||||||
CANCEL: 1,
|
|
||||||
CLOSED: 2
|
|
||||||
};
|
|
||||||
|
|
||||||
var AccessDialog = new Lang.Class({
|
|
||||||
Name: 'AccessDialog',
|
|
||||||
Extends: ModalDialog.ModalDialog,
|
|
||||||
|
|
||||||
_init: function(invocation, handle, title, subtitle, body, options) {
|
|
||||||
this.parent({ 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: function(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.actor.checked = selected == "true";
|
|
||||||
content.insertBeforeBody(check.actor);
|
|
||||||
|
|
||||||
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: function() {
|
|
||||||
this.parent();
|
|
||||||
|
|
||||||
let connection = this._invocation.get_connection();
|
|
||||||
this._requestExported = this._request.export(connection, this._handle);
|
|
||||||
},
|
|
||||||
|
|
||||||
CloseAsync: function(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: function(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.actor.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 = new Lang.Class({
|
|
||||||
Name: 'AccessDialogDBus',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
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: function(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;
|
|
||||||
}
|
|
||||||
});
|
|
234
js/ui/altTab.js
234
js/ui/altTab.js
@ -14,28 +14,29 @@ const Main = imports.ui.main;
|
|||||||
const SwitcherPopup = imports.ui.switcherPopup;
|
const SwitcherPopup = imports.ui.switcherPopup;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
|
const APP_ICON_HOVER_TIMEOUT = 200; // milliseconds
|
||||||
|
|
||||||
var THUMBNAIL_DEFAULT_SIZE = 256;
|
const THUMBNAIL_DEFAULT_SIZE = 256;
|
||||||
var THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
const THUMBNAIL_POPUP_TIME = 500; // milliseconds
|
||||||
var THUMBNAIL_FADE_TIME = 0.1; // seconds
|
const THUMBNAIL_FADE_TIME = 0.1; // seconds
|
||||||
|
|
||||||
var WINDOW_PREVIEW_SIZE = 128;
|
const WINDOW_PREVIEW_SIZE = 128;
|
||||||
var APP_ICON_SIZE = 96;
|
const APP_ICON_SIZE = 96;
|
||||||
var APP_ICON_SIZE_SMALL = 48;
|
const APP_ICON_SIZE_SMALL = 48;
|
||||||
|
|
||||||
const baseIconSizes = [96, 64, 48, 32, 22];
|
const baseIconSizes = [96, 64, 48, 32, 22];
|
||||||
|
|
||||||
var AppIconMode = {
|
const AppIconMode = {
|
||||||
THUMBNAIL_ONLY: 1,
|
THUMBNAIL_ONLY: 1,
|
||||||
APP_ICON_ONLY: 2,
|
APP_ICON_ONLY: 2,
|
||||||
BOTH: 3,
|
BOTH: 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
function _createWindowClone(window, size) {
|
function _createWindowClone(window, size) {
|
||||||
let [width, height] = window.get_size();
|
let windowTexture = window.get_texture();
|
||||||
|
let [width, height] = windowTexture.get_size();
|
||||||
let scale = Math.min(1.0, size / width, size / height);
|
let scale = Math.min(1.0, size / width, size / height);
|
||||||
return new Clutter.Clone({ source: window,
|
return new Clutter.Clone({ source: windowTexture,
|
||||||
width: width * scale,
|
width: width * scale,
|
||||||
height: height * scale,
|
height: height * scale,
|
||||||
x_align: Clutter.ActorAlign.CENTER,
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
@ -45,20 +46,7 @@ function _createWindowClone(window, size) {
|
|||||||
y_expand: true });
|
y_expand: true });
|
||||||
};
|
};
|
||||||
|
|
||||||
function getWindows(workspace) {
|
const AppSwitcherPopup = new Lang.Class({
|
||||||
// We ignore skip-taskbar windows in switchers, but if they are attached
|
|
||||||
// to their parent, their position in the MRU list may be more appropriate
|
|
||||||
// than the parent; so start with the complete list ...
|
|
||||||
let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL,
|
|
||||||
workspace);
|
|
||||||
// ... map windows to their parent where appropriate ...
|
|
||||||
return windows.map(w => {
|
|
||||||
return w.is_attached_dialog() ? w.get_transient_for() : w;
|
|
||||||
// ... and filter out skip-taskbar windows and duplicates
|
|
||||||
}).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i);
|
|
||||||
}
|
|
||||||
|
|
||||||
var AppSwitcherPopup = new Lang.Class({
|
|
||||||
Name: 'AppSwitcherPopup',
|
Name: 'AppSwitcherPopup',
|
||||||
Extends: SwitcherPopup.SwitcherPopup,
|
Extends: SwitcherPopup.SwitcherPopup,
|
||||||
|
|
||||||
@ -158,10 +146,7 @@ var AppSwitcherPopup = new Lang.Class({
|
|||||||
|
|
||||||
_keyPressHandler: function(keysym, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
||||||
if (!this._thumbnailsFocused)
|
this._select(this._selectedIndex, this._nextWindow());
|
||||||
this._select(this._selectedIndex, 0);
|
|
||||||
else
|
|
||||||
this._select(this._selectedIndex, this._nextWindow());
|
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
||||||
this._select(this._selectedIndex, this._previousWindow());
|
this._select(this._selectedIndex, this._previousWindow());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS) {
|
||||||
@ -369,150 +354,7 @@ var AppSwitcherPopup = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var CyclerHighlight = new Lang.Class({
|
const WindowSwitcherPopup = new Lang.Class({
|
||||||
Name: 'CyclerHighlight',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._window = null;
|
|
||||||
|
|
||||||
this.actor = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
|
||||||
|
|
||||||
this._clone = new Clutter.Clone();
|
|
||||||
this.actor.add_actor(this._clone);
|
|
||||||
|
|
||||||
this._highlight = new St.Widget({ style_class: 'cycler-highlight' });
|
|
||||||
this.actor.add_actor(this._highlight);
|
|
||||||
|
|
||||||
let coordinate = Clutter.BindCoordinate.ALL;
|
|
||||||
let constraint = new Clutter.BindConstraint({ coordinate: coordinate });
|
|
||||||
this._clone.bind_property('source', constraint, 'source', 0);
|
|
||||||
|
|
||||||
this.actor.add_constraint(constraint);
|
|
||||||
|
|
||||||
this.actor.connect('notify::allocation',
|
|
||||||
Lang.bind(this, this._onAllocationChanged));
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
},
|
|
||||||
|
|
||||||
set window(w) {
|
|
||||||
if (this._window == w)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._window = w;
|
|
||||||
|
|
||||||
if (this._clone.source)
|
|
||||||
this._clone.source.sync_visibility();
|
|
||||||
|
|
||||||
let windowActor = this._window ? this._window.get_compositor_private()
|
|
||||||
: null;
|
|
||||||
|
|
||||||
if (windowActor)
|
|
||||||
windowActor.hide();
|
|
||||||
|
|
||||||
this._clone.source = windowActor;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onAllocationChanged: function() {
|
|
||||||
if (!this._window) {
|
|
||||||
this._highlight.set_size(0, 0);
|
|
||||||
this._highlight.hide();
|
|
||||||
} else {
|
|
||||||
let [x, y] = this.actor.allocation.get_origin();
|
|
||||||
let rect = this._window.get_frame_rect();
|
|
||||||
this._highlight.set_size(rect.width, rect.height);
|
|
||||||
this._highlight.set_position(rect.x - x, rect.y - y);
|
|
||||||
this._highlight.show();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function() {
|
|
||||||
this.window = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var CyclerPopup = new Lang.Class({
|
|
||||||
Name: 'CyclerPopup',
|
|
||||||
Extends: SwitcherPopup.SwitcherPopup,
|
|
||||||
Abstract: true,
|
|
||||||
|
|
||||||
_init : function() {
|
|
||||||
this.parent();
|
|
||||||
|
|
||||||
this._items = this._getWindows();
|
|
||||||
|
|
||||||
if (this._items.length == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._highlight = new CyclerHighlight();
|
|
||||||
global.window_group.add_actor(this._highlight.actor);
|
|
||||||
|
|
||||||
// We don't show an actual popup, so just provide what SwitcherPopup
|
|
||||||
// expects instead of inheriting from SwitcherList
|
|
||||||
this._switcherList = { actor: new St.Widget(),
|
|
||||||
highlight: Lang.bind(this, this._highlightItem),
|
|
||||||
connect: function() {} };
|
|
||||||
},
|
|
||||||
|
|
||||||
_highlightItem: function(index, justOutline) {
|
|
||||||
this._highlight.window = this._items[index];
|
|
||||||
global.window_group.set_child_above_sibling(this._highlight.actor, null);
|
|
||||||
},
|
|
||||||
|
|
||||||
_finish: function() {
|
|
||||||
let window = this._items[this._selectedIndex];
|
|
||||||
let ws = window.get_workspace();
|
|
||||||
let activeWs = global.screen.get_active_workspace();
|
|
||||||
|
|
||||||
if (window.minimized) {
|
|
||||||
Main.wm.skipNextEffect(window.get_compositor_private());
|
|
||||||
window.unminimize();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (activeWs == ws) {
|
|
||||||
Main.activateWindow(window);
|
|
||||||
} else {
|
|
||||||
// If the selected window is on a different workspace, we don't
|
|
||||||
// want it to disappear, then slide in with the workspace; instead,
|
|
||||||
// always activate it on the active workspace ...
|
|
||||||
activeWs.activate_with_focus(window, global.get_current_time());
|
|
||||||
|
|
||||||
// ... then slide it over to the original workspace if necessary
|
|
||||||
Main.wm.actionMoveWindow(window, ws);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.parent();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function() {
|
|
||||||
this._highlight.actor.destroy();
|
|
||||||
|
|
||||||
this.parent();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var GroupCyclerPopup = new Lang.Class({
|
|
||||||
Name: 'GroupCyclerPopup',
|
|
||||||
Extends: CyclerPopup,
|
|
||||||
|
|
||||||
_getWindows: function() {
|
|
||||||
let app = Shell.WindowTracker.get_default().focus_app;
|
|
||||||
return app ? app.get_windows() : [];
|
|
||||||
},
|
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, action) {
|
|
||||||
if (action == Meta.KeyBindingAction.CYCLE_GROUP)
|
|
||||||
this._select(this._next());
|
|
||||||
else if (action == Meta.KeyBindingAction.CYCLE_GROUP_BACKWARD)
|
|
||||||
this._select(this._previous());
|
|
||||||
else
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var WindowSwitcherPopup = new Lang.Class({
|
|
||||||
Name: 'WindowSwitcherPopup',
|
Name: 'WindowSwitcherPopup',
|
||||||
Extends: SwitcherPopup.SwitcherPopup,
|
Extends: SwitcherPopup.SwitcherPopup,
|
||||||
|
|
||||||
@ -532,7 +374,7 @@ var WindowSwitcherPopup = new Lang.Class({
|
|||||||
|
|
||||||
_getWindowList: function() {
|
_getWindowList: function() {
|
||||||
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
||||||
return getWindows(workspace);
|
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
@ -559,33 +401,7 @@ var WindowSwitcherPopup = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var WindowCyclerPopup = new Lang.Class({
|
const AppIcon = new Lang.Class({
|
||||||
Name: 'WindowCyclerPopup',
|
|
||||||
Extends: CyclerPopup,
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
|
||||||
this.parent();
|
|
||||||
},
|
|
||||||
|
|
||||||
_getWindows: function() {
|
|
||||||
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
|
||||||
return getWindows(workspace);
|
|
||||||
},
|
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, action) {
|
|
||||||
if (action == Meta.KeyBindingAction.CYCLE_WINDOWS)
|
|
||||||
this._select(this._next());
|
|
||||||
else if (action == Meta.KeyBindingAction.CYCLE_WINDOWS_BACKWARD)
|
|
||||||
this._select(this._previous());
|
|
||||||
else
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AppIcon = new Lang.Class({
|
|
||||||
Name: 'AppIcon',
|
Name: 'AppIcon',
|
||||||
|
|
||||||
_init: function(app) {
|
_init: function(app) {
|
||||||
@ -606,7 +422,7 @@ var AppIcon = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AppSwitcher = new Lang.Class({
|
const AppSwitcher = new Lang.Class({
|
||||||
Name: 'AppSwitcher',
|
Name: 'AppSwitcher',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
@ -632,6 +448,8 @@ var AppSwitcher = new Lang.Class({
|
|||||||
});
|
});
|
||||||
if (appIcon.cachedWindows.length > 0)
|
if (appIcon.cachedWindows.length > 0)
|
||||||
this._addIcon(appIcon);
|
this._addIcon(appIcon);
|
||||||
|
else if (workspace == null)
|
||||||
|
throw new Error('%s appears to be running, but doesn\'t have any windows'.format(appIcon.app.get_name()));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._curApp = -1;
|
this._curApp = -1;
|
||||||
@ -780,7 +598,7 @@ var AppSwitcher = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ThumbnailList = new Lang.Class({
|
const ThumbnailList = new Lang.Class({
|
||||||
Name: 'ThumbnailList',
|
Name: 'ThumbnailList',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
@ -848,7 +666,7 @@ var ThumbnailList = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var WindowIcon = new Lang.Class({
|
const WindowIcon = new Lang.Class({
|
||||||
Name: 'WindowIcon',
|
Name: 'WindowIcon',
|
||||||
|
|
||||||
_init: function(window, mode) {
|
_init: function(window, mode) {
|
||||||
@ -869,17 +687,15 @@ var WindowIcon = new Lang.Class({
|
|||||||
|
|
||||||
this._icon.destroy_all_children();
|
this._icon.destroy_all_children();
|
||||||
|
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case AppIconMode.THUMBNAIL_ONLY:
|
case AppIconMode.THUMBNAIL_ONLY:
|
||||||
size = WINDOW_PREVIEW_SIZE;
|
size = WINDOW_PREVIEW_SIZE;
|
||||||
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
|
this._icon.add_actor(_createWindowClone(mutterWindow, WINDOW_PREVIEW_SIZE));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AppIconMode.BOTH:
|
case AppIconMode.BOTH:
|
||||||
size = WINDOW_PREVIEW_SIZE;
|
size = WINDOW_PREVIEW_SIZE;
|
||||||
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
|
this._icon.add_actor(_createWindowClone(mutterWindow, WINDOW_PREVIEW_SIZE));
|
||||||
|
|
||||||
if (this.app)
|
if (this.app)
|
||||||
this._icon.add_actor(this._createAppIcon(this.app,
|
this._icon.add_actor(this._createAppIcon(this.app,
|
||||||
@ -891,7 +707,7 @@ var WindowIcon = new Lang.Class({
|
|||||||
this._icon.add_actor(this._createAppIcon(this.app, size));
|
this._icon.add_actor(this._createAppIcon(this.app, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._icon.set_size(size * scaleFactor, size * scaleFactor);
|
this._icon.set_size(size, size);
|
||||||
},
|
},
|
||||||
|
|
||||||
_createAppIcon: function(app, size) {
|
_createAppIcon: function(app, size) {
|
||||||
@ -905,7 +721,7 @@ var WindowIcon = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var WindowList = new Lang.Class({
|
const WindowList = new Lang.Class({
|
||||||
Name: 'WindowList',
|
Name: 'WindowList',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
|
@ -7,9 +7,9 @@ const St = imports.gi.St;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
var ANIMATED_ICON_UPDATE_TIMEOUT = 16;
|
const ANIMATED_ICON_UPDATE_TIMEOUT = 14;
|
||||||
|
|
||||||
var Animation = new Lang.Class({
|
const Animation = new Lang.Class({
|
||||||
Name: 'Animation',
|
Name: 'Animation',
|
||||||
|
|
||||||
_init: function(file, width, height, speed) {
|
_init: function(file, width, height, speed) {
|
||||||
@ -33,7 +33,7 @@ var Animation = new Lang.Class({
|
|||||||
if (this._frame == 0)
|
if (this._frame == 0)
|
||||||
this._showFrame(0);
|
this._showFrame(0);
|
||||||
|
|
||||||
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_LOW, this._speed, Lang.bind(this, this._update));
|
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
|
||||||
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
|
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +67,7 @@ var Animation = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_animationsLoaded: function() {
|
_animationsLoaded: function() {
|
||||||
this._isLoaded = this._animations.get_n_children() > 0;
|
this._isLoaded = true;
|
||||||
|
|
||||||
if (this._isPlaying)
|
if (this._isPlaying)
|
||||||
this.play();
|
this.play();
|
||||||
@ -78,7 +78,7 @@ var Animation = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AnimatedIcon = new Lang.Class({
|
const AnimatedIcon = new Lang.Class({
|
||||||
Name: 'AnimatedIcon',
|
Name: 'AnimatedIcon',
|
||||||
Extends: Animation,
|
Extends: Animation,
|
||||||
|
|
||||||
|
@ -24,56 +24,41 @@ const OverviewControls = imports.ui.overviewControls;
|
|||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
const Search = imports.ui.search;
|
|
||||||
const System = imports.ui.status.system;
|
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
const SystemActions = imports.misc.systemActions;
|
|
||||||
|
|
||||||
var MAX_APPLICATION_WORK_MILLIS = 75;
|
const MAX_APPLICATION_WORK_MILLIS = 75;
|
||||||
var MENU_POPUP_TIMEOUT = 600;
|
const MENU_POPUP_TIMEOUT = 600;
|
||||||
var MAX_COLUMNS = 6;
|
const MAX_COLUMNS = 6;
|
||||||
var MIN_COLUMNS = 4;
|
const MIN_COLUMNS = 4;
|
||||||
var MIN_ROWS = 4;
|
const MIN_ROWS = 4;
|
||||||
|
|
||||||
var INACTIVE_GRID_OPACITY = 77;
|
const INACTIVE_GRID_OPACITY = 77;
|
||||||
// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME
|
// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME
|
||||||
// to not clash with other animations
|
// to not clash with other animations
|
||||||
var INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24;
|
const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24;
|
||||||
var FOLDER_SUBICON_FRACTION = .4;
|
const FOLDER_SUBICON_FRACTION = .4;
|
||||||
|
|
||||||
var MIN_FREQUENT_APPS_COUNT = 3;
|
const MIN_FREQUENT_APPS_COUNT = 3;
|
||||||
|
|
||||||
var INDICATORS_BASE_TIME = 0.25;
|
const INDICATORS_BASE_TIME = 0.25;
|
||||||
var INDICATORS_ANIMATION_DELAY = 0.125;
|
const INDICATORS_ANIMATION_DELAY = 0.125;
|
||||||
var INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
const INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
||||||
|
|
||||||
var VIEWS_SWITCH_TIME = 0.4;
|
|
||||||
var VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
|
||||||
|
|
||||||
// Follow iconGrid animations approach and divide by 2 to animate out to
|
// Follow iconGrid animations approach and divide by 2 to animate out to
|
||||||
// not annoy the user when the user wants to quit appDisplay.
|
// not annoy the user when the user wants to quit appDisplay.
|
||||||
// Also, make sure we don't exceed iconGrid animation total time or
|
// Also, make sure we don't exceed iconGrid animation total time or
|
||||||
// views switch time.
|
// views switch time.
|
||||||
var INDICATORS_BASE_TIME_OUT = 0.125;
|
const INDICATORS_BASE_TIME_OUT = 0.125;
|
||||||
var INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
|
const INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
|
||||||
var INDICATORS_ANIMATION_MAX_TIME_OUT =
|
const INDICATORS_ANIMATION_MAX_TIME_OUT =
|
||||||
Math.min (VIEWS_SWITCH_TIME,
|
Math.min (VIEWS_SWITCH_TIME,
|
||||||
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
|
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
|
||||||
|
|
||||||
var PAGE_SWITCH_TIME = 0.3;
|
const PAGE_SWITCH_TIME = 0.3;
|
||||||
|
|
||||||
const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl';
|
const VIEWS_SWITCH_TIME = 0.4;
|
||||||
const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl';
|
const VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
||||||
|
|
||||||
const SwitcherooProxyInterface = '<node> \
|
|
||||||
<interface name="net.hadess.SwitcherooControl"> \
|
|
||||||
<property name="HasDualGpu" type="b" access="read"/> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
const SwitcherooProxy = Gio.DBusProxy.makeProxyWrapper(SwitcherooProxyInterface);
|
|
||||||
let discreteGpuAvailable = false;
|
|
||||||
|
|
||||||
function _getCategories(info) {
|
function _getCategories(info) {
|
||||||
let categoriesStr = info.get_categories();
|
let categoriesStr = info.get_categories();
|
||||||
@ -111,7 +96,7 @@ function clamp(value, min, max) {
|
|||||||
return Math.max(min, Math.min(max, value));
|
return Math.max(min, Math.min(max, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
var BaseAppView = new Lang.Class({
|
const BaseAppView = new Lang.Class({
|
||||||
Name: 'BaseAppView',
|
Name: 'BaseAppView',
|
||||||
Abstract: true,
|
Abstract: true,
|
||||||
|
|
||||||
@ -213,6 +198,22 @@ var BaseAppView = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
animate: function(animationDirection, onComplete) {
|
animate: function(animationDirection, onComplete) {
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
||||||
|
let toAnimate = this._grid.actor.connect('notify::allocation', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._grid.actor.disconnect(toAnimate);
|
||||||
|
// We need to hide the grid temporary to not flash it
|
||||||
|
// for a frame
|
||||||
|
this._grid.actor.opacity = 0;
|
||||||
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._doSpringAnimation(animationDirection)
|
||||||
|
}));
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
this._doSpringAnimation(animationDirection);
|
||||||
|
}
|
||||||
|
|
||||||
if (onComplete) {
|
if (onComplete) {
|
||||||
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
|
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
@ -220,15 +221,6 @@ var BaseAppView = new Lang.Class({
|
|||||||
onComplete();
|
onComplete();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
|
||||||
let id = this._grid.actor.connect('paint', () => {
|
|
||||||
this._grid.actor.disconnect(id);
|
|
||||||
this._doSpringAnimation(animationDirection);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._doSpringAnimation(animationDirection);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
animateSwitch: function(animationDirection) {
|
animateSwitch: function(animationDirection) {
|
||||||
@ -252,7 +244,7 @@ var BaseAppView = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(BaseAppView.prototype);
|
Signals.addSignalMethods(BaseAppView.prototype);
|
||||||
|
|
||||||
var PageIndicatorsActor = new Lang.Class({
|
const PageIndicatorsActor = new Lang.Class({
|
||||||
Name:'PageIndicatorsActor',
|
Name:'PageIndicatorsActor',
|
||||||
Extends: St.BoxLayout,
|
Extends: St.BoxLayout,
|
||||||
|
|
||||||
@ -276,7 +268,7 @@ var PageIndicatorsActor = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var PageIndicators = new Lang.Class({
|
const PageIndicators = new Lang.Class({
|
||||||
Name:'PageIndicators',
|
Name:'PageIndicators',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -369,7 +361,7 @@ var PageIndicators = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(PageIndicators.prototype);
|
Signals.addSignalMethods(PageIndicators.prototype);
|
||||||
|
|
||||||
var AllView = new Lang.Class({
|
const AllView = new Lang.Class({
|
||||||
Name: 'AllView',
|
Name: 'AllView',
|
||||||
Extends: BaseAppView,
|
Extends: BaseAppView,
|
||||||
|
|
||||||
@ -443,10 +435,7 @@ var AllView = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
this._grid.connect('space-opened', Lang.bind(this,
|
this._grid.connect('space-opened', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
let fadeEffect = this._scrollView.get_effect('fade');
|
this._scrollView.get_effect('fade').enabled = false;
|
||||||
if (fadeEffect)
|
|
||||||
fadeEffect.enabled = false;
|
|
||||||
|
|
||||||
this.emit('space-ready');
|
this.emit('space-ready');
|
||||||
}));
|
}));
|
||||||
this._grid.connect('space-closed', Lang.bind(this,
|
this._grid.connect('space-closed', Lang.bind(this,
|
||||||
@ -657,11 +646,7 @@ var AllView = new Lang.Class({
|
|||||||
|
|
||||||
_closeSpaceForPopup: function() {
|
_closeSpaceForPopup: function() {
|
||||||
this._updateIconOpacities(false);
|
this._updateIconOpacities(false);
|
||||||
|
this._scrollView.get_effect('fade').enabled = true;
|
||||||
let fadeEffect = this._scrollView.get_effect('fade');
|
|
||||||
if (fadeEffect)
|
|
||||||
fadeEffect.enabled = true;
|
|
||||||
|
|
||||||
this._grid.closeExtraSpace();
|
this._grid.closeExtraSpace();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -795,7 +780,7 @@ var AllView = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AllView.prototype);
|
Signals.addSignalMethods(AllView.prototype);
|
||||||
|
|
||||||
var FrequentView = new Lang.Class({
|
const FrequentView = new Lang.Class({
|
||||||
Name: 'FrequentView',
|
Name: 'FrequentView',
|
||||||
Extends: BaseAppView,
|
Extends: BaseAppView,
|
||||||
|
|
||||||
@ -869,12 +854,12 @@ var FrequentView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var Views = {
|
const Views = {
|
||||||
FREQUENT: 0,
|
FREQUENT: 0,
|
||||||
ALL: 1
|
ALL: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
var ControlsBoxLayout = Lang.Class({
|
const ControlsBoxLayout = Lang.Class({
|
||||||
Name: 'ControlsBoxLayout',
|
Name: 'ControlsBoxLayout',
|
||||||
Extends: Clutter.BoxLayout,
|
Extends: Clutter.BoxLayout,
|
||||||
|
|
||||||
@ -899,11 +884,9 @@ var ControlsBoxLayout = Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ViewStackLayout = new Lang.Class({
|
const ViewStackLayout = new Lang.Class({
|
||||||
Name: 'ViewStackLayout',
|
Name: 'ViewStackLayout',
|
||||||
Extends: Clutter.BinLayout,
|
Extends: Clutter.BinLayout,
|
||||||
Signals: { 'allocated-size-changed': { param_types: [GObject.TYPE_INT,
|
|
||||||
GObject.TYPE_INT] } },
|
|
||||||
|
|
||||||
vfunc_allocate: function (actor, box, flags) {
|
vfunc_allocate: function (actor, box, flags) {
|
||||||
let availWidth = box.x2 - box.x1;
|
let availWidth = box.x2 - box.x1;
|
||||||
@ -914,8 +897,9 @@ var ViewStackLayout = new Lang.Class({
|
|||||||
this.parent(actor, box, flags);
|
this.parent(actor, box, flags);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Signals.addSignalMethods(ViewStackLayout.prototype);
|
||||||
|
|
||||||
var AppDisplay = new Lang.Class({
|
const AppDisplay = new Lang.Class({
|
||||||
Name: 'AppDisplay',
|
Name: 'AppDisplay',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -985,36 +969,10 @@ var AppDisplay = new Lang.Class({
|
|||||||
initialView = Views.ALL;
|
initialView = Views.ALL;
|
||||||
this._showView(initialView);
|
this._showView(initialView);
|
||||||
this._updateFrequentVisibility();
|
this._updateFrequentVisibility();
|
||||||
|
|
||||||
Gio.DBus.system.watch_name(SWITCHEROO_BUS_NAME,
|
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
|
||||||
Lang.bind(this, this._switcherooProxyAppeared),
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._switcherooProxy = null;
|
|
||||||
this._updateDiscreteGpuAvailable();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateDiscreteGpuAvailable: function() {
|
|
||||||
if (!this._switcherooProxy)
|
|
||||||
discreteGpuAvailable = false;
|
|
||||||
else
|
|
||||||
discreteGpuAvailable = this._switcherooProxy.HasDualGpu;
|
|
||||||
},
|
|
||||||
|
|
||||||
_switcherooProxyAppeared: function() {
|
|
||||||
this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, SWITCHEROO_OBJECT_PATH,
|
|
||||||
Lang.bind(this, function(proxy, error) {
|
|
||||||
if (error) {
|
|
||||||
log(error.message);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._updateDiscreteGpuAvailable();
|
|
||||||
}));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
animate: function(animationDirection, onComplete) {
|
animate: function(animationDirection, onComplete) {
|
||||||
let currentView = this._views.filter(v => v.control.has_style_pseudo_class('checked')).pop().view;
|
let currentView = this._views[global.settings.get_uint('app-picker-view')].view;
|
||||||
|
|
||||||
// Animate controls opacity using iconGrid animation time, since
|
// Animate controls opacity using iconGrid animation time, since
|
||||||
// it will be the time the AllView or FrequentView takes to show
|
// it will be the time the AllView or FrequentView takes to show
|
||||||
@ -1080,43 +1038,25 @@ var AppDisplay = new Lang.Class({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
var AppSearchProvider = new Lang.Class({
|
const AppSearchProvider = new Lang.Class({
|
||||||
Name: 'AppSearchProvider',
|
Name: 'AppSearchProvider',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._appSys = Shell.AppSystem.get_default();
|
this._appSys = Shell.AppSystem.get_default();
|
||||||
this.id = 'applications';
|
this.id = 'applications';
|
||||||
this.isRemoteProvider = false;
|
|
||||||
this.canLaunchSearch = false;
|
|
||||||
|
|
||||||
this._systemActions = new SystemActions.getDefault();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
getResultMetas: function(apps, callback) {
|
getResultMetas: function(apps, callback) {
|
||||||
let metas = [];
|
let metas = [];
|
||||||
for (let id of apps) {
|
for (let i = 0; i < apps.length; i++) {
|
||||||
if (id.endsWith('.desktop')) {
|
let app = this._appSys.lookup_app(apps[i]);
|
||||||
let app = this._appSys.lookup_app(id);
|
metas.push({ 'id': app.get_id(),
|
||||||
|
'name': app.get_name(),
|
||||||
metas.push({ 'id': app.get_id(),
|
'createIcon': function(size) {
|
||||||
'name': app.get_name(),
|
return app.create_icon_texture(size);
|
||||||
'createIcon': function(size) {
|
}
|
||||||
return app.create_icon_texture(size);
|
});
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
let name = this._systemActions.getName(id);
|
|
||||||
let iconName = this._systemActions.getIconName(id);
|
|
||||||
|
|
||||||
let createIcon = size => new St.Icon({ icon_name: iconName,
|
|
||||||
width: size,
|
|
||||||
height: size,
|
|
||||||
style_class: 'system-action-icon' });
|
|
||||||
|
|
||||||
metas.push({ id, name, createIcon });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
callback(metas);
|
callback(metas);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1138,9 +1078,6 @@ var AppSearchProvider = new Lang.Class({
|
|||||||
return usage.compare('', a, b);
|
return usage.compare('', a, b);
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
results = results.concat(this._systemActions.getMatchingActions(terms));
|
|
||||||
|
|
||||||
callback(results);
|
callback(results);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1149,14 +1086,12 @@ var AppSearchProvider = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
createResultObject: function (resultMeta) {
|
createResultObject: function (resultMeta) {
|
||||||
if (resultMeta.id.endsWith('.desktop'))
|
let app = this._appSys.lookup_app(resultMeta['id']);
|
||||||
return new AppIcon(this._appSys.lookup_app(resultMeta['id']));
|
return new AppIcon(app);
|
||||||
else
|
|
||||||
return new SystemActionIcon(this, resultMeta);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var FolderView = new Lang.Class({
|
const FolderView = new Lang.Class({
|
||||||
Name: 'FolderView',
|
Name: 'FolderView',
|
||||||
Extends: BaseAppView,
|
Extends: BaseAppView,
|
||||||
|
|
||||||
@ -1196,9 +1131,13 @@ var FolderView = new Lang.Class({
|
|||||||
let numItems = this._allItems.length;
|
let numItems = this._allItems.length;
|
||||||
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL;
|
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL;
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
let bin = new St.Bin({ width: subSize, height: subSize });
|
let bin;
|
||||||
if (i < numItems)
|
if (i < numItems) {
|
||||||
bin.child = this._allItems[i].app.create_icon_texture(subSize);
|
let texture = this._allItems[i].app.create_icon_texture(subSize);
|
||||||
|
bin = new St.Bin({ child: texture });
|
||||||
|
} else {
|
||||||
|
bin = new St.Bin({ width: subSize, height: subSize });
|
||||||
|
}
|
||||||
layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1);
|
layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,12 +1207,11 @@ var FolderView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var FolderIcon = new Lang.Class({
|
const FolderIcon = new Lang.Class({
|
||||||
Name: 'FolderIcon',
|
Name: 'FolderIcon',
|
||||||
|
|
||||||
_init: function(id, path, parentView) {
|
_init: function(id, path, parentView) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = '';
|
|
||||||
this._parentView = parentView;
|
this._parentView = parentView;
|
||||||
|
|
||||||
this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder',
|
this._folder = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders.folder',
|
||||||
@ -1446,7 +1384,7 @@ var FolderIcon = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(FolderIcon.prototype);
|
Signals.addSignalMethods(FolderIcon.prototype);
|
||||||
|
|
||||||
var AppFolderPopup = new Lang.Class({
|
const AppFolderPopup = new Lang.Class({
|
||||||
Name: 'AppFolderPopup',
|
Name: 'AppFolderPopup',
|
||||||
|
|
||||||
_init: function(source, side) {
|
_init: function(source, side) {
|
||||||
@ -1607,7 +1545,7 @@ var AppFolderPopup = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppFolderPopup.prototype);
|
Signals.addSignalMethods(AppFolderPopup.prototype);
|
||||||
|
|
||||||
var AppIcon = new Lang.Class({
|
const AppIcon = new Lang.Class({
|
||||||
Name: 'AppIcon',
|
Name: 'AppIcon',
|
||||||
|
|
||||||
_init : function(app, iconParams) {
|
_init : function(app, iconParams) {
|
||||||
@ -1853,7 +1791,7 @@ var AppIcon = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppIcon.prototype);
|
Signals.addSignalMethods(AppIcon.prototype);
|
||||||
|
|
||||||
var AppIconMenu = new Lang.Class({
|
const AppIconMenu = new Lang.Class({
|
||||||
Name: 'AppIconMenu',
|
Name: 'AppIconMenu',
|
||||||
Extends: PopupMenu.PopupMenu,
|
Extends: PopupMenu.PopupMenu,
|
||||||
|
|
||||||
@ -1876,7 +1814,7 @@ var AppIconMenu = new Lang.Class({
|
|||||||
if (!source.actor.mapped)
|
if (!source.actor.mapped)
|
||||||
this.close();
|
this.close();
|
||||||
}));
|
}));
|
||||||
source.actor.connect('destroy', Lang.bind(this, this.destroy));
|
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
|
||||||
|
|
||||||
Main.uiGroup.add_actor(this.actor);
|
Main.uiGroup.add_actor(this.actor);
|
||||||
},
|
},
|
||||||
@ -1923,19 +1861,6 @@ var AppIconMenu = new Lang.Class({
|
|||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (discreteGpuAvailable &&
|
|
||||||
this._source.app.state == Shell.AppState.STOPPED &&
|
|
||||||
actions.indexOf('activate-discrete-gpu') == -1) {
|
|
||||||
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
|
||||||
this._onDiscreteGpuMenuItem.connect('activate', Lang.bind(this, function() {
|
|
||||||
if (this._source.app.state == Shell.AppState.STOPPED)
|
|
||||||
this._source.animateLaunch();
|
|
||||||
|
|
||||||
this._source.app.launch(0, -1, true);
|
|
||||||
this.emit('activate-window', null);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < actions.length; i++) {
|
for (let i = 0; i < actions.length; i++) {
|
||||||
let action = actions[i];
|
let action = actions[i];
|
||||||
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
||||||
@ -2007,13 +1932,3 @@ var AppIconMenu = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(AppIconMenu.prototype);
|
Signals.addSignalMethods(AppIconMenu.prototype);
|
||||||
|
|
||||||
var SystemActionIcon = new Lang.Class({
|
|
||||||
Name: 'SystemActionIcon',
|
|
||||||
Extends: Search.GridSearchResult,
|
|
||||||
|
|
||||||
activate: function() {
|
|
||||||
SystemActions.getDefault().activateAction(this.metaInfo['id']);
|
|
||||||
Main.overview.hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
@ -6,34 +6,26 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
// In alphabetical order
|
|
||||||
const RENAMED_DESKTOP_IDS = {
|
const RENAMED_DESKTOP_IDS = {
|
||||||
'baobab.desktop': 'org.gnome.baobab.desktop',
|
'baobab.desktop': 'org.gnome.baobab.desktop',
|
||||||
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
||||||
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
||||||
'empathy.desktop': 'org.gnome.Empathy.desktop',
|
|
||||||
'epiphany.desktop': 'org.gnome.Epiphany.desktop',
|
|
||||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||||
'gcalctool.desktop': 'org.gnome.Calculator.desktop',
|
'gcalctool.desktop': 'gnome-calculator.desktop',
|
||||||
'geary.desktop': 'org.gnome.Geary.desktop',
|
|
||||||
'gedit.desktop': 'org.gnome.gedit.desktop',
|
'gedit.desktop': 'org.gnome.gedit.desktop',
|
||||||
'glchess.desktop': 'gnome-chess.desktop',
|
'glchess.desktop': 'gnome-chess.desktop',
|
||||||
'glines.desktop': 'five-or-more.desktop',
|
'glines.desktop': 'five-or-more.desktop',
|
||||||
'gnect.desktop': 'four-in-a-row.desktop',
|
'gnect.desktop': 'four-in-a-row.desktop',
|
||||||
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
'gnibbles.desktop': 'gnome-nibbles.desktop',
|
||||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
'gnobots2.desktop': 'gnome-robots.desktop',
|
||||||
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
||||||
'gnome-calculator.desktop': 'org.gnome.Calculator.desktop',
|
|
||||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||||
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
||||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||||
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
|
||||||
'gnome-music.desktop': 'org.gnome.Music.desktop',
|
|
||||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||||
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
|
||||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
||||||
'gnomine.desktop': 'gnome-mines.desktop',
|
'gnomine.desktop': 'gnome-mines.desktop',
|
||||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||||
@ -44,7 +36,7 @@ const RENAMED_DESKTOP_IDS = {
|
|||||||
'totem.desktop': 'org.gnome.Totem.desktop',
|
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||||
};
|
};
|
||||||
|
|
||||||
var AppFavorites = new Lang.Class({
|
const AppFavorites = new Lang.Class({
|
||||||
Name: 'AppFavorites',
|
Name: 'AppFavorites',
|
||||||
|
|
||||||
FAVORITE_APPS_KEY: 'favorite-apps',
|
FAVORITE_APPS_KEY: 'favorite-apps',
|
||||||
@ -62,14 +54,12 @@ var AppFavorites = new Lang.Class({
|
|||||||
|
|
||||||
reload: function() {
|
reload: function() {
|
||||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
|
|
||||||
// Map old desktop file names to the current ones
|
// Map old desktop file names to the current ones
|
||||||
let updated = false;
|
let updated = false;
|
||||||
ids = ids.map(function (id) {
|
ids = ids.map(function (id) {
|
||||||
let newId = RENAMED_DESKTOP_IDS[id];
|
let newId = RENAMED_DESKTOP_IDS[id];
|
||||||
if (newId !== undefined &&
|
if (newId !== undefined) {
|
||||||
appSys.lookup_app(newId) != null) {
|
|
||||||
updated = true;
|
updated = true;
|
||||||
return newId;
|
return newId;
|
||||||
}
|
}
|
||||||
@ -79,6 +69,7 @@ var AppFavorites = new Lang.Class({
|
|||||||
if (updated)
|
if (updated)
|
||||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||||
|
|
||||||
|
let appSys = Shell.AppSystem.get_default();
|
||||||
let apps = ids.map(function (id) {
|
let apps = ids.map(function (id) {
|
||||||
return appSys.lookup_app(id);
|
return appSys.lookup_app(id);
|
||||||
}).filter(function (app) {
|
}).filter(function (app) {
|
||||||
|
@ -1,216 +0,0 @@
|
|||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
|
||||||
|
|
||||||
var AudioDevice = {
|
|
||||||
HEADPHONES: 1 << 0,
|
|
||||||
HEADSET: 1 << 1,
|
|
||||||
MICROPHONE: 1 << 2
|
|
||||||
};
|
|
||||||
|
|
||||||
const AudioDeviceSelectionIface = '<node> \
|
|
||||||
<interface name="org.gnome.Shell.AudioDeviceSelection"> \
|
|
||||||
<method name="Open"> \
|
|
||||||
<arg name="devices" direction="in" type="as" /> \
|
|
||||||
</method> \
|
|
||||||
<method name="Close"> \
|
|
||||||
</method> \
|
|
||||||
<signal name="DeviceSelected"> \
|
|
||||||
<arg name="device" type="s" /> \
|
|
||||||
</signal> \
|
|
||||||
</interface> \
|
|
||||||
</node>';
|
|
||||||
|
|
||||||
var AudioDeviceSelectionDialog = new Lang.Class({
|
|
||||||
Name: 'AudioDeviceSelectionDialog',
|
|
||||||
Extends: ModalDialog.ModalDialog,
|
|
||||||
|
|
||||||
_init: function(devices) {
|
|
||||||
this.parent({ styleClass: 'audio-device-selection-dialog' });
|
|
||||||
|
|
||||||
this._deviceItems = {};
|
|
||||||
|
|
||||||
this._buildLayout();
|
|
||||||
|
|
||||||
if (devices & AudioDevice.HEADPHONES)
|
|
||||||
this._addDevice(AudioDevice.HEADPHONES);
|
|
||||||
if (devices & AudioDevice.HEADSET)
|
|
||||||
this._addDevice(AudioDevice.HEADSET);
|
|
||||||
if (devices & AudioDevice.MICROPHONE)
|
|
||||||
this._addDevice(AudioDevice.MICROPHONE);
|
|
||||||
|
|
||||||
if (this._selectionBox.get_n_children() < 2)
|
|
||||||
throw new Error('Too few devices for a selection');
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy: function() {
|
|
||||||
this.parent();
|
|
||||||
},
|
|
||||||
|
|
||||||
_buildLayout: function(devices) {
|
|
||||||
let title = new St.Label({ style_class: 'audio-selection-title',
|
|
||||||
text: _("Select Audio Device"),
|
|
||||||
x_align: Clutter.ActorAlign.CENTER });
|
|
||||||
|
|
||||||
this.contentLayout.style_class = 'audio-selection-content';
|
|
||||||
this.contentLayout.add(title);
|
|
||||||
|
|
||||||
this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' });
|
|
||||||
this.contentLayout.add(this._selectionBox, { expand: true });
|
|
||||||
|
|
||||||
this.addButton({ action: Lang.bind(this, this._openSettings),
|
|
||||||
label: _("Sound Settings") });
|
|
||||||
this.addButton({ action: Lang.bind(this, this.close),
|
|
||||||
label: _("Cancel"),
|
|
||||||
key: Clutter.Escape });
|
|
||||||
},
|
|
||||||
|
|
||||||
_getDeviceLabel: function(device) {
|
|
||||||
switch(device) {
|
|
||||||
case AudioDevice.HEADPHONES:
|
|
||||||
return _("Headphones");
|
|
||||||
case AudioDevice.HEADSET:
|
|
||||||
return _("Headset");
|
|
||||||
case AudioDevice.MICROPHONE:
|
|
||||||
return _("Microphone");
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_getDeviceIcon: function(device) {
|
|
||||||
switch(device) {
|
|
||||||
case AudioDevice.HEADPHONES:
|
|
||||||
return 'audio-headphones-symbolic';
|
|
||||||
case AudioDevice.HEADSET:
|
|
||||||
return 'audio-headset-symbolic';
|
|
||||||
case AudioDevice.MICROPHONE:
|
|
||||||
return 'audio-input-microphone-symbolic';
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_addDevice: function(device) {
|
|
||||||
let box = new St.BoxLayout({ style_class: 'audio-selection-device-box',
|
|
||||||
vertical: true });
|
|
||||||
box.connect('notify::height',
|
|
||||||
function() {
|
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
|
||||||
function() {
|
|
||||||
box.width = box.height;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let icon = new St.Icon({ style_class: 'audio-selection-device-icon',
|
|
||||||
icon_name: this._getDeviceIcon(device) });
|
|
||||||
box.add(icon);
|
|
||||||
|
|
||||||
let label = new St.Label({ style_class: 'audio-selection-device-label',
|
|
||||||
text: this._getDeviceLabel(device),
|
|
||||||
x_align: Clutter.ActorAlign.CENTER });
|
|
||||||
box.add(label);
|
|
||||||
|
|
||||||
let button = new St.Button({ style_class: 'audio-selection-device',
|
|
||||||
can_focus: true,
|
|
||||||
child: box });
|
|
||||||
this._selectionBox.add(button);
|
|
||||||
|
|
||||||
button.connect('clicked', Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this.emit('device-selected', device);
|
|
||||||
this.close();
|
|
||||||
Main.overview.hide();
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_openSettings: function() {
|
|
||||||
let desktopFile = 'gnome-sound-panel.desktop'
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
|
||||||
|
|
||||||
if (!app) {
|
|
||||||
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.close();
|
|
||||||
Main.overview.hide();
|
|
||||||
app.activate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var AudioDeviceSelectionDBus = new Lang.Class({
|
|
||||||
Name: 'AudioDeviceSelectionDBus',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._audioSelectionDialog = null;
|
|
||||||
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this);
|
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection');
|
|
||||||
|
|
||||||
Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDialogClosed: function() {
|
|
||||||
this._audioSelectionDialog = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDeviceSelected: function(dialog, device) {
|
|
||||||
let connection = this._dbusImpl.get_connection();
|
|
||||||
let info = this._dbusImpl.get_info();
|
|
||||||
let deviceName = Object.keys(AudioDevice).filter(
|
|
||||||
function(dev) {
|
|
||||||
return AudioDevice[dev] == device;
|
|
||||||
})[0].toLowerCase();
|
|
||||||
connection.emit_signal(this._audioSelectionDialog._sender,
|
|
||||||
this._dbusImpl.get_object_path(),
|
|
||||||
info ? info.name : null,
|
|
||||||
'DeviceSelected',
|
|
||||||
GLib.Variant.new('(s)', [deviceName]));
|
|
||||||
},
|
|
||||||
|
|
||||||
OpenAsync: function(params, invocation) {
|
|
||||||
if (this._audioSelectionDialog) {
|
|
||||||
invocation.return_value(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let [deviceNames] = params;
|
|
||||||
let devices = 0;
|
|
||||||
deviceNames.forEach(function(n) {
|
|
||||||
devices |= AudioDevice[n.toUpperCase()];
|
|
||||||
});
|
|
||||||
|
|
||||||
let dialog;
|
|
||||||
try {
|
|
||||||
dialog = new AudioDeviceSelectionDialog(devices);
|
|
||||||
} catch(e) {
|
|
||||||
invocation.return_value(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dialog._sender = invocation.get_sender();
|
|
||||||
|
|
||||||
dialog.connect('closed', Lang.bind(this, this._onDialogClosed));
|
|
||||||
dialog.connect('device-selected',
|
|
||||||
Lang.bind(this, this._onDeviceSelected));
|
|
||||||
dialog.open();
|
|
||||||
|
|
||||||
this._audioSelectionDialog = dialog;
|
|
||||||
invocation.return_value(null);
|
|
||||||
},
|
|
||||||
|
|
||||||
CloseAsync: function(params, invocation) {
|
|
||||||
if (this._audioSelectionDialog &&
|
|
||||||
this._audioSelectionDialog._sender == invocation.get_sender())
|
|
||||||
this._audioSelectionDialog.close();
|
|
||||||
|
|
||||||
invocation.return_value(null);
|
|
||||||
}
|
|
||||||
});
|
|
@ -102,12 +102,11 @@ const Lang = imports.lang;
|
|||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const LoginManager = imports.misc.loginManager;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||||
|
|
||||||
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
const BACKGROUND_SCHEMA = 'org.gnome.desktop.background';
|
||||||
const PRIMARY_COLOR_KEY = 'primary-color';
|
const PRIMARY_COLOR_KEY = 'primary-color';
|
||||||
@ -117,14 +116,14 @@ const BACKGROUND_STYLE_KEY = 'picture-options';
|
|||||||
const PICTURE_OPACITY_KEY = 'picture-opacity';
|
const PICTURE_OPACITY_KEY = 'picture-opacity';
|
||||||
const PICTURE_URI_KEY = 'picture-uri';
|
const PICTURE_URI_KEY = 'picture-uri';
|
||||||
|
|
||||||
var FADE_ANIMATION_TIME = 1.0;
|
const FADE_ANIMATION_TIME = 1.0;
|
||||||
|
|
||||||
// These parameters affect how often we redraw.
|
// These parameters affect how often we redraw.
|
||||||
// The first is how different (percent crossfaded) the slide show
|
// The first is how different (percent crossfaded) the slide show
|
||||||
// has to look before redrawing and the second is the minimum
|
// has to look before redrawing and the second is the minimum
|
||||||
// frequency (in seconds) we're willing to wake up
|
// frequency (in seconds) we're willing to wake up
|
||||||
var ANIMATION_OPACITY_STEP_INCREMENT = 4.0;
|
const ANIMATION_OPACITY_STEP_INCREMENT = 4.0;
|
||||||
var ANIMATION_MIN_WAKEUP_INTERVAL = 1.0;
|
const ANIMATION_MIN_WAKEUP_INTERVAL = 1.0;
|
||||||
|
|
||||||
let _backgroundCache = null;
|
let _backgroundCache = null;
|
||||||
|
|
||||||
@ -138,10 +137,11 @@ function _fileEqual0(file1, file2) {
|
|||||||
return file1.equal(file2);
|
return file1.equal(file2);
|
||||||
}
|
}
|
||||||
|
|
||||||
var BackgroundCache = new Lang.Class({
|
const BackgroundCache = new Lang.Class({
|
||||||
Name: 'BackgroundCache',
|
Name: 'BackgroundCache',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
this._pendingFileLoads = [];
|
||||||
this._fileMonitors = {};
|
this._fileMonitors = {};
|
||||||
this._backgroundSources = {};
|
this._backgroundSources = {};
|
||||||
this._animations = {};
|
this._animations = {};
|
||||||
@ -154,12 +154,8 @@ var BackgroundCache = new Lang.Class({
|
|||||||
|
|
||||||
let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null);
|
let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null);
|
||||||
monitor.connect('changed',
|
monitor.connect('changed',
|
||||||
Lang.bind(this, function(obj, file, otherFile, eventType) {
|
Lang.bind(this, function() {
|
||||||
// Ignore CHANGED and CREATED events, since in both cases
|
this.emit('file-changed', file);
|
||||||
// we'll get a CHANGES_DONE_HINT event when done.
|
|
||||||
if (eventType != Gio.FileMonitorEvent.CHANGED &&
|
|
||||||
eventType != Gio.FileMonitorEvent.CREATED)
|
|
||||||
this.emit('file-changed', file);
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._fileMonitors[key] = monitor;
|
this._fileMonitors[key] = monitor;
|
||||||
@ -170,8 +166,7 @@ var BackgroundCache = new Lang.Class({
|
|||||||
settingsSchema: null,
|
settingsSchema: null,
|
||||||
onLoaded: null });
|
onLoaded: null });
|
||||||
|
|
||||||
let animation = this._animations[params.settingsSchema];
|
if (this._animations[params.settingsSchema] && _fileEqual0(this._animationFile, params.file)) {
|
||||||
if (animation && _fileEqual0(animation.file, params.file)) {
|
|
||||||
if (params.onLoaded) {
|
if (params.onLoaded) {
|
||||||
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
||||||
params.onLoaded(this._animations[params.settingsSchema]);
|
params.onLoaded(this._animations[params.settingsSchema]);
|
||||||
@ -182,7 +177,7 @@ var BackgroundCache = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
animation = new Animation({ file: params.file });
|
let animation = new Animation({ file: params.file });
|
||||||
|
|
||||||
animation.load(Lang.bind(this, function() {
|
animation.load(Lang.bind(this, function() {
|
||||||
this._animations[params.settingsSchema] = animation;
|
this._animations[params.settingsSchema] = animation;
|
||||||
@ -230,7 +225,7 @@ function getBackgroundCache() {
|
|||||||
return _backgroundCache;
|
return _backgroundCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
var Background = new Lang.Class({
|
const Background = new Lang.Class({
|
||||||
Name: 'Background',
|
Name: 'Background',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -252,21 +247,6 @@ var Background = new Lang.Class({
|
|||||||
this._cancellable = new Gio.Cancellable();
|
this._cancellable = new Gio.Cancellable();
|
||||||
this.isLoaded = false;
|
this.isLoaded = false;
|
||||||
|
|
||||||
this._clock = new GnomeDesktop.WallClock();
|
|
||||||
this._timezoneChangedId = this._clock.connect('notify::timezone',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
if (this._animation)
|
|
||||||
this._loadAnimation(this._animation.file);
|
|
||||||
}));
|
|
||||||
|
|
||||||
let loginManager = LoginManager.getLoginManager();
|
|
||||||
this._prepareForSleepId = loginManager.connect('prepare-for-sleep',
|
|
||||||
(lm, aboutToSuspend) => {
|
|
||||||
if (aboutToSuspend)
|
|
||||||
return;
|
|
||||||
this._refreshAnimation();
|
|
||||||
});
|
|
||||||
|
|
||||||
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
|
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
|
||||||
this.emit('changed');
|
this.emit('changed');
|
||||||
}));
|
}));
|
||||||
@ -285,30 +265,16 @@ var Background = new Lang.Class({
|
|||||||
}
|
}
|
||||||
this._fileWatches = null;
|
this._fileWatches = null;
|
||||||
|
|
||||||
if (this._timezoneChangedId != 0)
|
|
||||||
this._clock.disconnect(this._timezoneChangedId);
|
|
||||||
this._timezoneChangedId = 0;
|
|
||||||
|
|
||||||
if (this._prepareForSleepId != 0)
|
|
||||||
LoginManager.getLoginManager().disconnect(this._prepareForSleepId);
|
|
||||||
this._prepareForSleepId = 0;
|
|
||||||
|
|
||||||
if (this._settingsChangedSignalId != 0)
|
if (this._settingsChangedSignalId != 0)
|
||||||
this._settings.disconnect(this._settingsChangedSignalId);
|
this._settings.disconnect(this._settingsChangedSignalId);
|
||||||
this._settingsChangedSignalId = 0;
|
this._settingsChangedSignalId = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
updateResolution: function() {
|
updateResolution: function() {
|
||||||
if (this._animation)
|
if (this._animation) {
|
||||||
this._refreshAnimation();
|
this._removeAnimationTimeout();
|
||||||
},
|
this._updateAnimation();
|
||||||
|
}
|
||||||
_refreshAnimation: function() {
|
|
||||||
if (!this._animation)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._removeAnimationTimeout();
|
|
||||||
this._updateAnimation();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_setLoaded: function() {
|
_setLoaded: function() {
|
||||||
@ -386,9 +352,11 @@ var Background = new Lang.Class({
|
|||||||
|
|
||||||
let cache = Meta.BackgroundImageCache.get_default();
|
let cache = Meta.BackgroundImageCache.get_default();
|
||||||
let numPendingImages = files.length;
|
let numPendingImages = files.length;
|
||||||
|
let images = [];
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
this._watchFile(files[i]);
|
this._watchFile(files[i]);
|
||||||
let image = cache.load(files[i]);
|
let image = cache.load(files[i]);
|
||||||
|
images.push(image);
|
||||||
if (image.is_loaded()) {
|
if (image.is_loaded()) {
|
||||||
numPendingImages--;
|
numPendingImages--;
|
||||||
if (numPendingImages == 0)
|
if (numPendingImages == 0)
|
||||||
@ -492,7 +460,7 @@ Signals.addSignalMethods(Background.prototype);
|
|||||||
|
|
||||||
let _systemBackground;
|
let _systemBackground;
|
||||||
|
|
||||||
var SystemBackground = new Lang.Class({
|
const SystemBackground = new Lang.Class({
|
||||||
Name: 'SystemBackground',
|
Name: 'SystemBackground',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -529,7 +497,7 @@ var SystemBackground = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(SystemBackground.prototype);
|
Signals.addSignalMethods(SystemBackground.prototype);
|
||||||
|
|
||||||
var BackgroundSource = new Lang.Class({
|
const BackgroundSource = new Lang.Class({
|
||||||
Name: 'BackgroundSource',
|
Name: 'BackgroundSource',
|
||||||
|
|
||||||
_init: function(layoutManager, settingsSchema) {
|
_init: function(layoutManager, settingsSchema) {
|
||||||
@ -617,7 +585,7 @@ var BackgroundSource = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var Animation = new Lang.Class({
|
const Animation = new Lang.Class({
|
||||||
Name: 'Animation',
|
Name: 'Animation',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -665,7 +633,7 @@ var Animation = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(Animation.prototype);
|
Signals.addSignalMethods(Animation.prototype);
|
||||||
|
|
||||||
var BackgroundManager = new Lang.Class({
|
const BackgroundManager = new Lang.Class({
|
||||||
Name: 'BackgroundManager',
|
Name: 'BackgroundManager',
|
||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
@ -717,7 +685,6 @@ var BackgroundManager = new Lang.Class({
|
|||||||
time: FADE_ANIMATION_TIME,
|
time: FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
oldBackgroundActor.background.run_dispose();
|
|
||||||
oldBackgroundActor.destroy();
|
oldBackgroundActor.destroy();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -9,7 +9,7 @@ const BoxPointer = imports.ui.boxpointer;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
var BackgroundMenu = new Lang.Class({
|
const BackgroundMenu = new Lang.Class({
|
||||||
Name: 'BackgroundMenu',
|
Name: 'BackgroundMenu',
|
||||||
Extends: PopupMenu.PopupMenu,
|
Extends: PopupMenu.PopupMenu,
|
||||||
|
|
||||||
|
@ -10,14 +10,14 @@ const St = imports.gi.St;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var PopupAnimation = {
|
const PopupAnimation = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
SLIDE: 1 << 0,
|
SLIDE: 1 << 0,
|
||||||
FADE: 1 << 1,
|
FADE: 1 << 1,
|
||||||
FULL: ~0,
|
FULL: ~0,
|
||||||
};
|
};
|
||||||
|
|
||||||
var POPUP_ANIMATION_TIME = 0.15;
|
const POPUP_ANIMATION_TIME = 0.15;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BoxPointer:
|
* BoxPointer:
|
||||||
@ -32,7 +32,7 @@ var POPUP_ANIMATION_TIME = 0.15;
|
|||||||
* totally inside the monitor if possible.
|
* totally inside the monitor if possible.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
var BoxPointer = new Lang.Class({
|
const BoxPointer = new Lang.Class({
|
||||||
Name: 'BoxPointer',
|
Name: 'BoxPointer',
|
||||||
|
|
||||||
_init: function(arrowSide, binProperties) {
|
_init: function(arrowSide, binProperties) {
|
||||||
@ -587,10 +587,7 @@ var BoxPointer = new Lang.Class({
|
|||||||
_calculateArrowSide: function(arrowSide) {
|
_calculateArrowSide: function(arrowSide) {
|
||||||
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
|
||||||
let [minWidth, minHeight, boxWidth, boxHeight] = this._container.get_preferred_size();
|
let [minWidth, minHeight, boxWidth, boxHeight] = this._container.get_preferred_size();
|
||||||
let monitorActor = this.sourceActor;
|
let monitor = Main.layoutManager.findMonitorForActor(this.actor);
|
||||||
if (!monitorActor)
|
|
||||||
monitorActor = this.actor;
|
|
||||||
let monitor = Main.layoutManager.findMonitorForActor(monitorActor);
|
|
||||||
|
|
||||||
switch (arrowSide) {
|
switch (arrowSide) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@ const St = imports.gi.St;
|
|||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
|
||||||
var CheckBox = new Lang.Class({
|
const CheckBox = new Lang.Class({
|
||||||
Name: 'CheckBox',
|
Name: 'CheckBox',
|
||||||
|
|
||||||
_init: function(label) {
|
_init: function(label) {
|
||||||
|
@ -1,138 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
|
|
||||||
const Dialog = imports.ui.dialog;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
|
|
||||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3
|
|
||||||
var DIALOG_TRANSITION_TIME = 0.15
|
|
||||||
|
|
||||||
var CloseDialog = new Lang.Class({
|
|
||||||
Name: 'CloseDialog',
|
|
||||||
Extends: GObject.Object,
|
|
||||||
Implements: [ Meta.CloseDialog ],
|
|
||||||
Properties: {
|
|
||||||
'window': GObject.ParamSpec.override('window', Meta.CloseDialog)
|
|
||||||
},
|
|
||||||
|
|
||||||
_init: function (window) {
|
|
||||||
this.parent();
|
|
||||||
this._window = window;
|
|
||||||
this._dialog = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
get window() {
|
|
||||||
return this._window;
|
|
||||||
},
|
|
||||||
|
|
||||||
set window(window) {
|
|
||||||
this._window = window;
|
|
||||||
},
|
|
||||||
|
|
||||||
_createDialogContent: function () {
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
|
||||||
let windowApp = tracker.get_window_app(this._window);
|
|
||||||
|
|
||||||
/* 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 });
|
|
||||||
},
|
|
||||||
|
|
||||||
_initDialog: function () {
|
|
||||||
if (this._dialog)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let windowActor = this._window.get_compositor_private();
|
|
||||||
this._dialog = new Dialog.Dialog(windowActor, 'close-dialog');
|
|
||||||
this._dialog.width = windowActor.width;
|
|
||||||
this._dialog.height = windowActor.height;
|
|
||||||
|
|
||||||
this._dialog.addContent(this._createDialogContent());
|
|
||||||
this._dialog.addButton({ label: _('Force Quit'),
|
|
||||||
action: Lang.bind(this, this._onClose),
|
|
||||||
default: true });
|
|
||||||
this._dialog.addButton({ label: _('Wait'),
|
|
||||||
action: Lang.bind(this, this._onWait),
|
|
||||||
key: Clutter.Escape });
|
|
||||||
|
|
||||||
global.focus_manager.add_group(this._dialog);
|
|
||||||
},
|
|
||||||
|
|
||||||
_addWindowEffect: function () {
|
|
||||||
// We set the effect on the surface actor, so the dialog itself
|
|
||||||
// (which is a child of the MetaWindowActor) does not get the
|
|
||||||
// effect applied itself.
|
|
||||||
let windowActor = this._window.get_compositor_private();
|
|
||||||
let surfaceActor = windowActor.get_first_child();
|
|
||||||
let effect = new Clutter.BrightnessContrastEffect();
|
|
||||||
effect.set_brightness(FROZEN_WINDOW_BRIGHTNESS);
|
|
||||||
surfaceActor.add_effect_with_name("gnome-shell-frozen-window", effect);
|
|
||||||
},
|
|
||||||
|
|
||||||
_removeWindowEffect: function () {
|
|
||||||
let windowActor = this._window.get_compositor_private();
|
|
||||||
let surfaceActor = windowActor.get_first_child();
|
|
||||||
surfaceActor.remove_effect_by_name("gnome-shell-frozen-window");
|
|
||||||
},
|
|
||||||
|
|
||||||
_onWait: function () {
|
|
||||||
this.response(Meta.CloseDialogResponse.WAIT);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onClose: function () {
|
|
||||||
this.response(Meta.CloseDialogResponse.FORCE_CLOSE);
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_show: function () {
|
|
||||||
if (this._dialog != null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._addWindowEffect();
|
|
||||||
this._initDialog();
|
|
||||||
|
|
||||||
this._dialog.scale_y = 0;
|
|
||||||
this._dialog.set_pivot_point(0.5, 0.5);
|
|
||||||
|
|
||||||
Tweener.addTween(this._dialog,
|
|
||||||
{ scale_y: 1,
|
|
||||||
transition: 'linear',
|
|
||||||
time: DIALOG_TRANSITION_TIME,
|
|
||||||
onComplete: Lang.bind(this, function () {
|
|
||||||
Main.layoutManager.trackChrome(this._dialog, { affectsInputRegion: true });
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_hide: function () {
|
|
||||||
if (this._dialog == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let dialog = this._dialog;
|
|
||||||
this._dialog = null;
|
|
||||||
this._removeWindowEffect();
|
|
||||||
|
|
||||||
Tweener.addTween(dialog,
|
|
||||||
{ scale_y: 0,
|
|
||||||
transition: 'linear',
|
|
||||||
time: DIALOG_TRANSITION_TIME,
|
|
||||||
onComplete: Lang.bind(this, function () {
|
|
||||||
dialog.destroy();
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_focus: function () {
|
|
||||||
if (this._dialog)
|
|
||||||
this._dialog.grab_key_focus();
|
|
||||||
}
|
|
||||||
});
|
|
@ -2,7 +2,7 @@
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
var ComponentManager = new Lang.Class({
|
const ComponentManager = new Lang.Class({
|
||||||
Name: 'ComponentManager',
|
Name: 'ComponentManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
|
@ -11,15 +11,15 @@ const GnomeSession = imports.misc.gnomeSession;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
var GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
|
||||||
|
|
||||||
// GSettings keys
|
// GSettings keys
|
||||||
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
||||||
const SETTING_ENABLE_AUTOMOUNT = 'automount';
|
const SETTING_ENABLE_AUTOMOUNT = 'automount';
|
||||||
|
|
||||||
var AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
|
const AUTORUN_EXPIRE_TIMEOUT_SECS = 10;
|
||||||
|
|
||||||
var AutomountManager = new Lang.Class({
|
const AutomountManager = new Lang.Class({
|
||||||
Name: 'AutomountManager',
|
Name: 'AutomountManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -242,4 +242,4 @@ var AutomountManager = new Lang.Class({
|
|||||||
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var Component = AutomountManager;
|
const Component = AutomountManager;
|
||||||
|
@ -7,6 +7,7 @@ const St = imports.gi.St;
|
|||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
|
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||||
|
|
||||||
// GSettings keys
|
// GSettings keys
|
||||||
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
|
||||||
@ -15,7 +16,7 @@ const SETTING_START_APP = 'autorun-x-content-start-app';
|
|||||||
const SETTING_IGNORE = 'autorun-x-content-ignore';
|
const SETTING_IGNORE = 'autorun-x-content-ignore';
|
||||||
const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder';
|
const SETTING_OPEN_FOLDER = 'autorun-x-content-open-folder';
|
||||||
|
|
||||||
var AutorunSetting = {
|
const AutorunSetting = {
|
||||||
RUN: 0,
|
RUN: 0,
|
||||||
IGNORE: 1,
|
IGNORE: 1,
|
||||||
FILES: 2,
|
FILES: 2,
|
||||||
@ -63,7 +64,7 @@ function startAppForMount(app, mount) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
retval = app.launch(files,
|
retval = app.launch(files,
|
||||||
global.create_app_launch_context(0, -1));
|
global.create_app_launch_context(0, -1))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log('Unable to launch the application ' + app.get_name()
|
log('Unable to launch the application ' + app.get_name()
|
||||||
+ ': ' + e.toString());
|
+ ': ' + e.toString());
|
||||||
@ -90,7 +91,7 @@ function HotplugSniffer() {
|
|||||||
'/org/gnome/Shell/HotplugSniffer');
|
'/org/gnome/Shell/HotplugSniffer');
|
||||||
}
|
}
|
||||||
|
|
||||||
var ContentTypeDiscoverer = new Lang.Class({
|
const ContentTypeDiscoverer = new Lang.Class({
|
||||||
Name: 'ContentTypeDiscoverer',
|
Name: 'ContentTypeDiscoverer',
|
||||||
|
|
||||||
_init: function(callback) {
|
_init: function(callback) {
|
||||||
@ -159,7 +160,7 @@ var ContentTypeDiscoverer = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AutorunManager = new Lang.Class({
|
const AutorunManager = new Lang.Class({
|
||||||
Name: 'AutorunManager',
|
Name: 'AutorunManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -196,7 +197,7 @@ var AutorunManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AutorunDispatcher = new Lang.Class({
|
const AutorunDispatcher = new Lang.Class({
|
||||||
Name: 'AutorunDispatcher',
|
Name: 'AutorunDispatcher',
|
||||||
|
|
||||||
_init: function(manager) {
|
_init: function(manager) {
|
||||||
@ -255,11 +256,7 @@ var AutorunDispatcher = new Lang.Class({
|
|||||||
if (!shouldAutorunMount(mount))
|
if (!shouldAutorunMount(mount))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let setting;
|
let setting = this._getAutorunSettingForType(contentTypes[0]);
|
||||||
if (contentTypes.length > 0)
|
|
||||||
setting = this._getAutorunSettingForType(contentTypes[0]);
|
|
||||||
else
|
|
||||||
setting = AutorunSetting.ASK;
|
|
||||||
|
|
||||||
// check at the settings for the first content type
|
// check at the settings for the first content type
|
||||||
// to see whether we should ask
|
// to see whether we should ask
|
||||||
@ -296,7 +293,7 @@ var AutorunDispatcher = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AutorunSource = new Lang.Class({
|
const AutorunSource = new Lang.Class({
|
||||||
Name: 'AutorunSource',
|
Name: 'AutorunSource',
|
||||||
Extends: MessageTray.Source,
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
@ -316,14 +313,10 @@ var AutorunSource = new Lang.Class({
|
|||||||
|
|
||||||
getIcon: function() {
|
getIcon: function() {
|
||||||
return this.mount.get_icon();
|
return this.mount.get_icon();
|
||||||
},
|
|
||||||
|
|
||||||
_createPolicy: function() {
|
|
||||||
return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var AutorunNotification = new Lang.Class({
|
const AutorunNotification = new Lang.Class({
|
||||||
Name: 'AutorunNotification',
|
Name: 'AutorunNotification',
|
||||||
Extends: MessageTray.Notification,
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
@ -332,6 +325,9 @@ var AutorunNotification = new Lang.Class({
|
|||||||
|
|
||||||
this._manager = manager;
|
this._manager = manager;
|
||||||
this._mount = source.mount;
|
this._mount = source.mount;
|
||||||
|
|
||||||
|
// set the notification to urgent, so that it expands out
|
||||||
|
this.setUrgency(MessageTray.Urgency.CRITICAL);
|
||||||
},
|
},
|
||||||
|
|
||||||
createBanner: function() {
|
createBanner: function() {
|
||||||
@ -382,4 +378,4 @@ var AutorunNotification = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var Component = AutorunManager;
|
const Component = AutorunManager;
|
||||||
|
@ -10,17 +10,16 @@ const GObject = imports.gi.GObject;
|
|||||||
const Gcr = imports.gi.Gcr;
|
const Gcr = imports.gi.Gcr;
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Dialog = imports.ui.dialog;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const CheckBox = imports.ui.checkBox;
|
const CheckBox = imports.ui.checkBox;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var WORK_SPINNER_ICON_SIZE = 16;
|
const WORK_SPINNER_ICON_SIZE = 16;
|
||||||
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
||||||
var WORK_SPINNER_ANIMATION_TIME = 0.3;
|
const WORK_SPINNER_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
var KeyringDialog = new Lang.Class({
|
const KeyringDialog = new Lang.Class({
|
||||||
Name: 'KeyringDialog',
|
Name: 'KeyringDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
@ -32,24 +31,38 @@ var KeyringDialog = new Lang.Class({
|
|||||||
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
|
this.prompt.connect('show-confirm', Lang.bind(this, this._onShowConfirm));
|
||||||
this.prompt.connect('prompt-close', Lang.bind(this, this._onHidePrompt));
|
this.prompt.connect('prompt-close', Lang.bind(this, this._onHidePrompt));
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
||||||
this._content = new Dialog.MessageDialogContent({ icon });
|
vertical: false });
|
||||||
this.contentLayout.add(this._content);
|
this.contentLayout.add(mainContentBox);
|
||||||
|
|
||||||
// FIXME: Why does this break now?
|
let icon = new St.Icon({ icon_name: 'dialog-password-symbolic' });
|
||||||
/*
|
mainContentBox.add(icon,
|
||||||
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
|
{ x_fill: true,
|
||||||
this.prompt.bind_property('description', this._content, 'body', GObject.BindingFlags.SYNC_CREATE);
|
y_fill: false,
|
||||||
*/
|
x_align: St.Align.END,
|
||||||
this.prompt.connect('notify::message', () => {
|
y_align: St.Align.START });
|
||||||
this._content.title = this.prompt.message;
|
|
||||||
});
|
|
||||||
this._content.title = this.prompt.message;
|
|
||||||
|
|
||||||
this.prompt.connect('notify::description', () => {
|
this._messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
||||||
this._content.body = this.prompt.description;
|
vertical: true });
|
||||||
});
|
mainContentBox.add(this._messageBox,
|
||||||
this._content.body = this.prompt.description;
|
{ y_align: St.Align.START, expand: true, x_fill: true, y_fill: true });
|
||||||
|
|
||||||
|
let subject = new St.Label({ style_class: 'prompt-dialog-headline headline' });
|
||||||
|
this.prompt.bind_property('message', subject, 'text', GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
|
||||||
|
this._messageBox.add(subject,
|
||||||
|
{ x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
|
let description = new St.Label({ style_class: 'prompt-dialog-description' });
|
||||||
|
description.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
description.clutter_text.line_wrap = true;
|
||||||
|
this.prompt.bind_property('description', description, 'text', GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
this._messageBox.add(description,
|
||||||
|
{ y_fill: true,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
this._workSpinner = null;
|
this._workSpinner = null;
|
||||||
this._controlTable = null;
|
this._controlTable = null;
|
||||||
@ -182,7 +195,7 @@ var KeyringDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._controlTable = table;
|
this._controlTable = table;
|
||||||
this._content.messageBox.add(table, { x_fill: true, y_fill: true });
|
this._messageBox.add(table, { x_fill: true, y_fill: true });
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateSensitivity: function(sensitive) {
|
_updateSensitivity: function(sensitive) {
|
||||||
@ -258,7 +271,7 @@ var KeyringDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var KeyringDummyDialog = new Lang.Class({
|
const KeyringDummyDialog = new Lang.Class({
|
||||||
Name: 'KeyringDummyDialog',
|
Name: 'KeyringDummyDialog',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -274,7 +287,7 @@ var KeyringDummyDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var KeyringPrompter = new Lang.Class({
|
const KeyringPrompter = new Lang.Class({
|
||||||
Name: 'KeyringPrompter',
|
Name: 'KeyringPrompter',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -311,4 +324,4 @@ var KeyringPrompter = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var Component = KeyringPrompter;
|
const Component = KeyringPrompter;
|
||||||
|
@ -12,7 +12,6 @@ const Shell = imports.gi.Shell;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const Dialog = imports.ui.dialog;
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
@ -21,7 +20,7 @@ const ShellEntry = imports.ui.shellEntry;
|
|||||||
|
|
||||||
const VPN_UI_GROUP = 'VPN Plugin UI';
|
const VPN_UI_GROUP = 'VPN Plugin UI';
|
||||||
|
|
||||||
var NetworkSecretDialog = new Lang.Class({
|
const NetworkSecretDialog = new Lang.Class({
|
||||||
Name: 'NetworkSecretDialog',
|
Name: 'NetworkSecretDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
@ -39,12 +38,41 @@ var NetworkSecretDialog = new Lang.Class({
|
|||||||
else
|
else
|
||||||
this._content = this._getContent();
|
this._content = this._getContent();
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
||||||
let contentParams = { icon,
|
vertical: false });
|
||||||
title: this._content.title,
|
this.contentLayout.add(mainContentBox,
|
||||||
body: this._content.message };
|
{ x_fill: true,
|
||||||
let contentBox = new Dialog.MessageDialogContent(contentParams);
|
y_fill: true });
|
||||||
this.contentLayout.add_actor(contentBox);
|
|
||||||
|
let icon = new St.Icon({ icon_name: 'dialog-password-symbolic' });
|
||||||
|
mainContentBox.add(icon,
|
||||||
|
{ x_fill: true,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
|
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
||||||
|
vertical: true });
|
||||||
|
mainContentBox.add(messageBox,
|
||||||
|
{ y_align: St.Align.START });
|
||||||
|
|
||||||
|
let subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline headline',
|
||||||
|
text: this._content.title });
|
||||||
|
messageBox.add(subjectLabel,
|
||||||
|
{ y_fill: false,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
|
if (this._content.message != null) {
|
||||||
|
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
|
||||||
|
text: this._content.message });
|
||||||
|
descriptionLabel.clutter_text.line_wrap = true;
|
||||||
|
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
|
||||||
|
messageBox.add(descriptionLabel,
|
||||||
|
{ y_fill: true,
|
||||||
|
y_align: St.Align.START,
|
||||||
|
expand: true });
|
||||||
|
}
|
||||||
|
|
||||||
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
|
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
|
||||||
@ -107,7 +135,7 @@ var NetworkSecretDialog = new Lang.Class({
|
|||||||
secret.entry.clutter_text.set_password_char('\u25cf');
|
secret.entry.clutter_text.set_password_char('\u25cf');
|
||||||
}
|
}
|
||||||
|
|
||||||
contentBox.messageBox.add(secretTable);
|
messageBox.add(secretTable);
|
||||||
|
|
||||||
this._okButton = { label: _("Connect"),
|
this._okButton = { label: _("Connect"),
|
||||||
action: Lang.bind(this, this._onOk),
|
action: Lang.bind(this, this._onOk),
|
||||||
@ -329,7 +357,7 @@ var NetworkSecretDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var VPNRequestHandler = new Lang.Class({
|
const VPNRequestHandler = new Lang.Class({
|
||||||
Name: 'VPNRequestHandler',
|
Name: 'VPNRequestHandler',
|
||||||
|
|
||||||
_init: function(agent, requestId, authHelper, serviceType, connection, hints, flags) {
|
_init: function(agent, requestId, authHelper, serviceType, connection, hints, flags) {
|
||||||
@ -575,7 +603,7 @@ var VPNRequestHandler = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var NetworkAgent = new Lang.Class({
|
const NetworkAgent = new Lang.Class({
|
||||||
Name: 'NetworkAgent',
|
Name: 'NetworkAgent',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -587,14 +615,6 @@ var NetworkAgent = new Lang.Class({
|
|||||||
this._vpnRequests = { };
|
this._vpnRequests = { };
|
||||||
this._notifications = { };
|
this._notifications = { };
|
||||||
|
|
||||||
this._pluginDir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
|
|
||||||
try {
|
|
||||||
let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
|
|
||||||
monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
|
|
||||||
} catch(e) {
|
|
||||||
log('Failed to create monitor for VPN plugin dir: ' + e.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._native.connect('new-request', Lang.bind(this, this._newRequest));
|
this._native.connect('new-request', Lang.bind(this, this._newRequest));
|
||||||
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
||||||
|
|
||||||
@ -745,8 +765,9 @@ var NetworkAgent = new Lang.Class({
|
|||||||
this._vpnCacheBuilt = true;
|
this._vpnCacheBuilt = true;
|
||||||
this._vpnBinaries = { };
|
this._vpnBinaries = { };
|
||||||
|
|
||||||
|
let dir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
|
||||||
try {
|
try {
|
||||||
let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
|
let fileEnum = dir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
|
||||||
let info;
|
let info;
|
||||||
|
|
||||||
while ((info = fileEnum.next_file(null))) {
|
while ((info = fileEnum.next_file(null))) {
|
||||||
@ -756,7 +777,7 @@ var NetworkAgent = new Lang.Class({
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
let keyfile = new GLib.KeyFile();
|
let keyfile = new GLib.KeyFile();
|
||||||
keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
|
keyfile.load_from_file(dir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
|
||||||
let service = keyfile.get_string('VPN Connection', 'service');
|
let service = keyfile.get_string('VPN Connection', 'service');
|
||||||
let binary = keyfile.get_string('GNOME', 'auth-dialog');
|
let binary = keyfile.get_string('GNOME', 'auth-dialog');
|
||||||
let externalUIMode = false;
|
let externalUIMode = false;
|
||||||
@ -775,21 +796,13 @@ var NetworkAgent = new Lang.Class({
|
|||||||
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
|
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) {
|
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE))
|
||||||
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
||||||
try {
|
else
|
||||||
let aliases = keyfile.get_string_list('VPN Connection', 'aliases');
|
|
||||||
|
|
||||||
for (let alias of aliases) {
|
|
||||||
this._vpnBinaries[alias] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
|
||||||
}
|
|
||||||
} catch(e) { } // ignore errors if key does not exist
|
|
||||||
} else {
|
|
||||||
throw new Error('VPN plugin at %s is not executable'.format(path));
|
throw new Error('VPN plugin at %s is not executable'.format(path));
|
||||||
}
|
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
log('Error \'%s\' while processing VPN keyfile \'%s\''.
|
log('Error \'%s\' while processing VPN keyfile \'%s\''.
|
||||||
format(e.message, this._pluginDir.get_child(name).get_path()));
|
format(e.message, dir.get_child(name).get_path()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -798,4 +811,4 @@ var NetworkAgent = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var Component = NetworkAgent;
|
const Component = NetworkAgent;
|
||||||
|
@ -15,35 +15,66 @@ const PolkitAgent = imports.gi.PolkitAgent;
|
|||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Components = imports.ui.components;
|
const Components = imports.ui.components;
|
||||||
const Dialog = imports.ui.dialog;
|
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var DIALOG_ICON_SIZE = 48;
|
const DIALOG_ICON_SIZE = 48;
|
||||||
|
|
||||||
var WORK_SPINNER_ICON_SIZE = 16;
|
const WORK_SPINNER_ICON_SIZE = 16;
|
||||||
var WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
||||||
var WORK_SPINNER_ANIMATION_TIME = 0.3;
|
const WORK_SPINNER_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
var AuthenticationDialog = new Lang.Class({
|
const AuthenticationDialog = new Lang.Class({
|
||||||
Name: 'AuthenticationDialog',
|
Name: 'AuthenticationDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
_init: function(actionId, body, cookie, userNames) {
|
_init: function(actionId, message, cookie, userNames) {
|
||||||
this.parent({ styleClass: 'prompt-dialog' });
|
this.parent({ styleClass: 'prompt-dialog' });
|
||||||
|
|
||||||
this.actionId = actionId;
|
this.actionId = actionId;
|
||||||
this.message = body;
|
this.message = message;
|
||||||
this.userNames = userNames;
|
this.userNames = userNames;
|
||||||
this._wasDismissed = false;
|
this._wasDismissed = false;
|
||||||
|
|
||||||
let icon = new Gio.ThemedIcon({ name: 'dialog-password-symbolic' });
|
let mainContentBox = new St.BoxLayout({ style_class: 'prompt-dialog-main-layout',
|
||||||
let title = _("Authentication Required");
|
vertical: false });
|
||||||
|
this.contentLayout.add(mainContentBox,
|
||||||
|
{ x_fill: true,
|
||||||
|
y_fill: true });
|
||||||
|
|
||||||
let content = new Dialog.MessageDialogContent({ icon, title, body });
|
let icon = new St.Icon({ icon_name: 'dialog-password-symbolic' });
|
||||||
this.contentLayout.add_actor(content);
|
mainContentBox.add(icon,
|
||||||
|
{ x_fill: true,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
|
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
||||||
|
vertical: true });
|
||||||
|
mainContentBox.add(messageBox,
|
||||||
|
{ expand: true, y_align: St.Align.START });
|
||||||
|
|
||||||
|
this._subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline headline',
|
||||||
|
text: _("Authentication Required") });
|
||||||
|
|
||||||
|
messageBox.add(this._subjectLabel,
|
||||||
|
{ x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
|
this._descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
|
||||||
|
text: message });
|
||||||
|
this._descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
this._descriptionLabel.clutter_text.line_wrap = true;
|
||||||
|
|
||||||
|
messageBox.add(this._descriptionLabel,
|
||||||
|
{ x_fill: false,
|
||||||
|
y_fill: true,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_align: St.Align.START });
|
||||||
|
|
||||||
if (userNames.length > 1) {
|
if (userNames.length > 1) {
|
||||||
log('polkitAuthenticationAgent: Received ' + userNames.length +
|
log('polkitAuthenticationAgent: Received ' + userNames.length +
|
||||||
@ -74,12 +105,12 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
if (userIsRoot) {
|
if (userIsRoot) {
|
||||||
let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-root-label',
|
let userLabel = new St.Label(({ style_class: 'polkit-dialog-user-root-label',
|
||||||
text: userRealName }));
|
text: userRealName }));
|
||||||
content.messageBox.add(userLabel, { x_fill: false,
|
messageBox.add(userLabel, { x_fill: false,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
} else {
|
} else {
|
||||||
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
content.messageBox.add(userBox);
|
messageBox.add(userBox);
|
||||||
this._userAvatar = new UserWidget.Avatar(this._user,
|
this._userAvatar = new UserWidget.Avatar(this._user,
|
||||||
{ iconSize: DIALOG_ICON_SIZE,
|
{ iconSize: DIALOG_ICON_SIZE,
|
||||||
styleClass: 'polkit-dialog-user-icon' });
|
styleClass: 'polkit-dialog-user-icon' });
|
||||||
@ -101,7 +132,7 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
this._onUserChanged();
|
this._onUserChanged();
|
||||||
|
|
||||||
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
|
||||||
content.messageBox.add(this._passwordBox);
|
messageBox.add(this._passwordBox);
|
||||||
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
|
this._passwordLabel = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
|
||||||
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
this._passwordBox.add(this._passwordLabel, { y_fill: false, y_align: St.Align.MIDDLE });
|
||||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||||
@ -124,13 +155,13 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
||||||
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._errorMessageLabel.clutter_text.line_wrap = true;
|
this._errorMessageLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add(this._errorMessageLabel, { x_fill: false, x_align: St.Align.START });
|
messageBox.add(this._errorMessageLabel, { x_fill: false, x_align: St.Align.START });
|
||||||
this._errorMessageLabel.hide();
|
this._errorMessageLabel.hide();
|
||||||
|
|
||||||
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
|
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
|
||||||
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._infoMessageLabel.clutter_text.line_wrap = true;
|
this._infoMessageLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add(this._infoMessageLabel);
|
messageBox.add(this._infoMessageLabel);
|
||||||
this._infoMessageLabel.hide();
|
this._infoMessageLabel.hide();
|
||||||
|
|
||||||
/* text is intentionally non-blank otherwise the height is not the same as for
|
/* text is intentionally non-blank otherwise the height is not the same as for
|
||||||
@ -142,7 +173,7 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
this._nullMessageLabel.add_style_class_name('hidden');
|
this._nullMessageLabel.add_style_class_name('hidden');
|
||||||
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
this._nullMessageLabel.clutter_text.line_wrap = true;
|
this._nullMessageLabel.clutter_text.line_wrap = true;
|
||||||
content.messageBox.add(this._nullMessageLabel);
|
messageBox.add(this._nullMessageLabel);
|
||||||
this._nullMessageLabel.show();
|
this._nullMessageLabel.show();
|
||||||
|
|
||||||
this._cancelButton = this.addButton({ label: _("Cancel"),
|
this._cancelButton = this.addButton({ label: _("Cancel"),
|
||||||
@ -267,7 +298,7 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
* requested authentication was not gained; this can happen
|
* requested authentication was not gained; this can happen
|
||||||
* because of an authentication error (like invalid password),
|
* because of an authentication error (like invalid password),
|
||||||
* for instance. */
|
* for instance. */
|
||||||
this._errorMessageLabel.set_text(_("Sorry, that didn’t work. Please try again."));
|
this._errorMessageLabel.set_text(_("Sorry, that didn\'t work. Please try again."));
|
||||||
this._errorMessageLabel.show();
|
this._errorMessageLabel.show();
|
||||||
this._infoMessageLabel.hide();
|
this._infoMessageLabel.hide();
|
||||||
this._nullMessageLabel.hide();
|
this._nullMessageLabel.hide();
|
||||||
@ -339,7 +370,7 @@ var AuthenticationDialog = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
Signals.addSignalMethods(AuthenticationDialog.prototype);
|
||||||
|
|
||||||
var AuthenticationAgent = new Lang.Class({
|
const AuthenticationAgent = new Lang.Class({
|
||||||
Name: 'AuthenticationAgent',
|
Name: 'AuthenticationAgent',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -400,4 +431,4 @@ var AuthenticationAgent = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var Component = AuthenticationAgent;
|
const Component = AuthenticationAgent;
|
||||||
|
@ -6,48 +6,40 @@ const GLib = imports.gi.GLib;
|
|||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
const Tpl = imports.gi.TelepathyLogger;
|
||||||
|
const Tp = imports.gi.TelepathyGLib;
|
||||||
|
|
||||||
var Tpl = null;
|
const Calendar = imports.ui.calendar;
|
||||||
var Tp = null;
|
|
||||||
try {
|
|
||||||
Tpl = imports.gi.TelepathyLogger;
|
|
||||||
Tp = imports.gi.TelepathyGLib;
|
|
||||||
} catch(e) {
|
|
||||||
log('Telepathy is not available, chat integration will be disabled.');
|
|
||||||
}
|
|
||||||
|
|
||||||
const History = imports.misc.history;
|
const History = imports.misc.history;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const MessageList = imports.ui.messageList;
|
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
|
||||||
const HAVE_TP = (Tp != null && Tpl != null);
|
|
||||||
|
|
||||||
// See Notification.appendMessage
|
// See Notification.appendMessage
|
||||||
var SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes
|
const SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes
|
||||||
var SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
||||||
var SCROLLBACK_RECENT_LENGTH = 20;
|
const SCROLLBACK_RECENT_LENGTH = 20;
|
||||||
var SCROLLBACK_IDLE_LENGTH = 5;
|
const SCROLLBACK_IDLE_LENGTH = 5;
|
||||||
|
|
||||||
// See Source._displayPendingMessages
|
// See Source._displayPendingMessages
|
||||||
var SCROLLBACK_HISTORY_LINES = 10;
|
const SCROLLBACK_HISTORY_LINES = 10;
|
||||||
|
|
||||||
// See Notification._onEntryChanged
|
// See Notification._onEntryChanged
|
||||||
var COMPOSING_STOP_TIMEOUT = 5;
|
const COMPOSING_STOP_TIMEOUT = 5;
|
||||||
|
|
||||||
var CHAT_EXPAND_LINES = 12;
|
const CHAT_EXPAND_LINES = 12;
|
||||||
|
|
||||||
var NotificationDirection = {
|
const NotificationDirection = {
|
||||||
SENT: 'chat-sent',
|
SENT: 'chat-sent',
|
||||||
RECEIVED: 'chat-received'
|
RECEIVED: 'chat-received'
|
||||||
};
|
};
|
||||||
|
|
||||||
var N_ = function(s) { return s; };
|
const N_ = function(s) { return s; };
|
||||||
|
|
||||||
function makeMessageFromTpMessage(tpMessage, direction) {
|
function makeMessageFromTpMessage(tpMessage, direction) {
|
||||||
let [text, flags] = tpMessage.to_text();
|
let [text, flags] = tpMessage.to_text();
|
||||||
@ -79,43 +71,8 @@ function makeMessageFromTplEvent(event) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
var TelepathyComponent = new Lang.Class({
|
const TelepathyClient = new Lang.Class({
|
||||||
Name: 'TelepathyComponent',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._client = null;
|
|
||||||
|
|
||||||
if (!HAVE_TP)
|
|
||||||
return; // Telepathy isn't available
|
|
||||||
|
|
||||||
this._client = new TelepathyClient();
|
|
||||||
},
|
|
||||||
|
|
||||||
enable: function() {
|
|
||||||
if (!this._client)
|
|
||||||
return;
|
|
||||||
|
|
||||||
try {
|
|
||||||
this._client.register();
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this._client.account_manager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
|
|
||||||
this._client.account_manager.prepare_async(null, null);
|
|
||||||
},
|
|
||||||
|
|
||||||
disable: function() {
|
|
||||||
if (!this._client)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._client.unregister();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|
||||||
Name: 'TelepathyClient',
|
Name: 'TelepathyClient',
|
||||||
Extends: Tp.BaseClient,
|
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
// channel path -> ChatSource
|
// channel path -> ChatSource
|
||||||
@ -140,28 +97,39 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
// channel matching its filters is detected.
|
// channel matching its filters is detected.
|
||||||
// The second argument, recover, means _observeChannels will be run
|
// The second argument, recover, means _observeChannels will be run
|
||||||
// for any existing channel as well.
|
// for any existing channel as well.
|
||||||
this.parent({ name: 'GnomeShell',
|
this._tpClient = new Shell.TpClient({ name: 'GnomeShell',
|
||||||
account_manager: this._accountManager,
|
account_manager: this._accountManager,
|
||||||
uniquify_name: true });
|
uniquify_name: true });
|
||||||
|
this._tpClient.set_observe_channels_func(
|
||||||
// We only care about single-user text-based chats
|
Lang.bind(this, this._observeChannels));
|
||||||
let filter = {};
|
this._tpClient.set_approve_channels_func(
|
||||||
filter[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
|
Lang.bind(this, this._approveChannels));
|
||||||
filter[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE] = Tp.HandleType.CONTACT;
|
this._tpClient.set_handle_channels_func(
|
||||||
|
Lang.bind(this, this._handleChannels));
|
||||||
this.set_observer_recover(true);
|
|
||||||
this.add_observer_filter(filter);
|
|
||||||
this.add_approver_filter(filter);
|
|
||||||
this.add_handler_filter(filter);
|
|
||||||
|
|
||||||
// Allow other clients (such as Empathy) to pre-empt our channels if
|
// Allow other clients (such as Empathy) to pre-empt our channels if
|
||||||
// needed
|
// needed
|
||||||
this.set_delegated_channels_callback(
|
this._tpClient.set_delegated_channels_callback(
|
||||||
Lang.bind(this, this._delegatedChannelsCb));
|
Lang.bind(this, this._delegatedChannelsCb));
|
||||||
},
|
},
|
||||||
|
|
||||||
vfunc_observe_channels: function(account, conn, channels,
|
enable: function() {
|
||||||
dispatchOp, requests, context) {
|
try {
|
||||||
|
this._tpClient.register();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error('Couldn\'t register Telepathy client. Error: \n' + e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._accountManager.is_prepared(Tp.AccountManager.get_feature_quark_core()))
|
||||||
|
this._accountManager.prepare_async(null, null);
|
||||||
|
},
|
||||||
|
|
||||||
|
disable: function() {
|
||||||
|
this._tpClient.unregister();
|
||||||
|
},
|
||||||
|
|
||||||
|
_observeChannels: function(observer, account, conn, channels,
|
||||||
|
dispatchOp, requests, context) {
|
||||||
let len = channels.length;
|
let len = channels.length;
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
let channel = channels[i];
|
let channel = channels[i];
|
||||||
@ -185,7 +153,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
if (this._chatSources[channel.get_object_path()])
|
if (this._chatSources[channel.get_object_path()])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let source = new ChatSource(account, conn, channel, contact, this);
|
let source = new ChatSource(account, conn, channel, contact, this._tpClient);
|
||||||
|
|
||||||
this._chatSources[channel.get_object_path()] = source;
|
this._chatSources[channel.get_object_path()] = source;
|
||||||
source.connect('destroy', Lang.bind(this,
|
source.connect('destroy', Lang.bind(this,
|
||||||
@ -194,8 +162,8 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
vfunc_handle_channels: function(account, conn, channels, requests,
|
_handleChannels: function(handler, account, conn, channels,
|
||||||
user_action_time, context) {
|
requests, user_action_time, context) {
|
||||||
this._handlingChannels(account, conn, channels, true);
|
this._handlingChannels(account, conn, channels, true);
|
||||||
context.accept();
|
context.accept();
|
||||||
},
|
},
|
||||||
@ -225,7 +193,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
// Telepathy spec states that handlers must foreground channels
|
// Telepathy spec states that handlers must foreground channels
|
||||||
// in HandleChannels calls which are already being handled.
|
// in HandleChannels calls which are already being handled.
|
||||||
|
|
||||||
if (notify && this.is_handling_channel(channel)) {
|
if (notify && this._tpClient.is_handling_channel(channel)) {
|
||||||
// We are already handling the channel, display the source
|
// We are already handling the channel, display the source
|
||||||
let source = this._chatSources[channel.get_object_path()];
|
let source = this._chatSources[channel.get_object_path()];
|
||||||
if (source)
|
if (source)
|
||||||
@ -234,8 +202,8 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
vfunc_add_dispatch_operation: function(account, conn, channels,
|
_approveChannels: function(approver, account, conn, channels,
|
||||||
dispatchOp, context) {
|
dispatchOp, context) {
|
||||||
let channel = channels[0];
|
let channel = channels[0];
|
||||||
let chanType = channel.get_channel_type();
|
let chanType = channel.get_channel_type();
|
||||||
|
|
||||||
@ -262,7 +230,7 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Approve private text channels right away as we are going to handle it
|
// Approve private text channels right away as we are going to handle it
|
||||||
dispatchOp.claim_with_async(this, Lang.bind(this, function(dispatchOp, result) {
|
dispatchOp.claim_with_async(this._tpClient, Lang.bind(this, function(dispatchOp, result) {
|
||||||
try {
|
try {
|
||||||
dispatchOp.claim_with_finish(result);
|
dispatchOp.claim_with_finish(result);
|
||||||
this._handlingChannels(account, conn, [channel], false);
|
this._handlingChannels(account, conn, [channel], false);
|
||||||
@ -278,9 +246,9 @@ var TelepathyClient = HAVE_TP ? new Lang.Class({
|
|||||||
// Nothing to do as we don't make a distinction between observed and
|
// Nothing to do as we don't make a distinction between observed and
|
||||||
// handled channels.
|
// handled channels.
|
||||||
},
|
},
|
||||||
}) : null;
|
});
|
||||||
|
|
||||||
var ChatSource = new Lang.Class({
|
const ChatSource = new Lang.Class({
|
||||||
Name: 'ChatSource',
|
Name: 'ChatSource',
|
||||||
Extends: MessageTray.Source,
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
@ -501,17 +469,11 @@ var ChatSource = new Lang.Class({
|
|||||||
|
|
||||||
destroy: function(reason) {
|
destroy: function(reason) {
|
||||||
if (this._client.is_handling_channel(this._channel)) {
|
if (this._client.is_handling_channel(this._channel)) {
|
||||||
this._ackMessages();
|
|
||||||
// The chat box has been destroyed so it can't
|
// The chat box has been destroyed so it can't
|
||||||
// handle the channel any more.
|
// handle the channel any more.
|
||||||
this._channel.close_async(function(channel, result) {
|
this._channel.close_async(function(channel, result) {
|
||||||
channel.close_finish(result);
|
channel.close_finish(result);
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
// Don't indicate any unread messages when the notification
|
|
||||||
// that represents them has been destroyed.
|
|
||||||
this._pendingMessages = [];
|
|
||||||
this.countUpdated();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keep source alive while the channel is open
|
// Keep source alive while the channel is open
|
||||||
@ -647,7 +609,7 @@ var ChatSource = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ChatNotification = new Lang.Class({
|
const ChatNotification = new Lang.Class({
|
||||||
Name: 'ChatNotification',
|
Name: 'ChatNotification',
|
||||||
Extends: MessageTray.Notification,
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
@ -692,9 +654,7 @@ var ChatNotification = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (message.direction == NotificationDirection.RECEIVED)
|
if (message.direction == NotificationDirection.RECEIVED)
|
||||||
this.update(this.source.title, messageBody,
|
this.update(this.source.title, messageBody, { bannerMarkup: true });
|
||||||
{ datetime: GLib.DateTime.new_from_unix_local (message.timestamp),
|
|
||||||
bannerMarkup: true });
|
|
||||||
|
|
||||||
let group = (message.direction == NotificationDirection.RECEIVED ?
|
let group = (message.direction == NotificationDirection.RECEIVED ?
|
||||||
'received' : 'sent');
|
'received' : 'sent');
|
||||||
@ -806,7 +766,7 @@ var ChatNotification = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ChatLineBox = new Lang.Class({
|
const ChatLineBox = new Lang.Class({
|
||||||
Name: 'ChatLineBox',
|
Name: 'ChatLineBox',
|
||||||
Extends: St.BoxLayout,
|
Extends: St.BoxLayout,
|
||||||
|
|
||||||
@ -816,7 +776,7 @@ var ChatLineBox = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ChatNotificationBanner = new Lang.Class({
|
const ChatNotificationBanner = new Lang.Class({
|
||||||
Name: 'ChatNotificationBanner',
|
Name: 'ChatNotificationBanner',
|
||||||
Extends: MessageTray.NotificationBanner,
|
Extends: MessageTray.NotificationBanner,
|
||||||
|
|
||||||
@ -906,7 +866,7 @@ var ChatNotificationBanner = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_addMessage: function(message) {
|
_addMessage: function(message) {
|
||||||
let highlighter = new MessageList.URLHighlighter(message.body, true, true);
|
let highlighter = new Calendar.URLHighlighter(message.body, true, true);
|
||||||
let body = highlighter.actor;
|
let body = highlighter.actor;
|
||||||
|
|
||||||
let styles = message.styles;
|
let styles = message.styles;
|
||||||
@ -996,4 +956,4 @@ var ChatNotificationBanner = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var Component = TelepathyComponent;
|
const Component = TelepathyClient;
|
||||||
|
@ -12,16 +12,16 @@ const SwitcherPopup = imports.ui.switcherPopup;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
var POPUP_APPICON_SIZE = 96;
|
const POPUP_APPICON_SIZE = 96;
|
||||||
var POPUP_FADE_TIME = 0.1; // seconds
|
const POPUP_FADE_TIME = 0.1; // seconds
|
||||||
|
|
||||||
var SortGroup = {
|
const SortGroup = {
|
||||||
TOP: 0,
|
TOP: 0,
|
||||||
MIDDLE: 1,
|
MIDDLE: 1,
|
||||||
BOTTOM: 2
|
BOTTOM: 2
|
||||||
};
|
};
|
||||||
|
|
||||||
var CtrlAltTabManager = new Lang.Class({
|
const CtrlAltTabManager = new Lang.Class({
|
||||||
Name: 'CtrlAltTabManager',
|
Name: 'CtrlAltTabManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
@ -136,7 +136,7 @@ var CtrlAltTabManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var CtrlAltTabPopup = new Lang.Class({
|
const CtrlAltTabPopup = new Lang.Class({
|
||||||
Name: 'CtrlAltTabPopup',
|
Name: 'CtrlAltTabPopup',
|
||||||
Extends: SwitcherPopup.SwitcherPopup,
|
Extends: SwitcherPopup.SwitcherPopup,
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ var CtrlAltTabPopup = new Lang.Class({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
var CtrlAltTabSwitcher = new Lang.Class({
|
const CtrlAltTabSwitcher = new Lang.Class({
|
||||||
Name: 'CtrlAltTabSwitcher',
|
Name: 'CtrlAltTabSwitcher',
|
||||||
Extends: SwitcherPopup.SwitcherList,
|
Extends: SwitcherPopup.SwitcherList,
|
||||||
|
|
||||||
|
@ -18,10 +18,10 @@ const Main = imports.ui.main;
|
|||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
|
|
||||||
var DASH_ANIMATION_TIME = 0.2;
|
const DASH_ANIMATION_TIME = 0.2;
|
||||||
var DASH_ITEM_LABEL_SHOW_TIME = 0.15;
|
const DASH_ITEM_LABEL_SHOW_TIME = 0.15;
|
||||||
var DASH_ITEM_LABEL_HIDE_TIME = 0.1;
|
const DASH_ITEM_LABEL_HIDE_TIME = 0.1;
|
||||||
var DASH_ITEM_HOVER_TIMEOUT = 300;
|
const DASH_ITEM_HOVER_TIMEOUT = 300;
|
||||||
|
|
||||||
function getAppFromSource(source) {
|
function getAppFromSource(source) {
|
||||||
if (source instanceof AppDisplay.AppIcon) {
|
if (source instanceof AppDisplay.AppIcon) {
|
||||||
@ -33,7 +33,7 @@ function getAppFromSource(source) {
|
|||||||
|
|
||||||
// A container like StBin, but taking the child's scale into account
|
// A container like StBin, but taking the child's scale into account
|
||||||
// when requesting a size
|
// when requesting a size
|
||||||
var DashItemContainer = new Lang.Class({
|
const DashItemContainer = new Lang.Class({
|
||||||
Name: 'DashItemContainer',
|
Name: 'DashItemContainer',
|
||||||
Extends: St.Widget,
|
Extends: St.Widget,
|
||||||
|
|
||||||
@ -235,7 +235,7 @@ var DashItemContainer = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var ShowAppsIcon = new Lang.Class({
|
const ShowAppsIcon = new Lang.Class({
|
||||||
Name: 'ShowAppsIcon',
|
Name: 'ShowAppsIcon',
|
||||||
Extends: DashItemContainer,
|
Extends: DashItemContainer,
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ var ShowAppsIcon = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_createIcon: function(size) {
|
_createIcon: function(size) {
|
||||||
this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic',
|
this._iconActor = new St.Icon({ icon_name: 'view-grid-symbolic',
|
||||||
icon_size: size,
|
icon_size: size,
|
||||||
style_class: 'show-apps-icon',
|
style_class: 'show-apps-icon',
|
||||||
track_hover: true });
|
track_hover: true });
|
||||||
@ -315,7 +315,7 @@ var ShowAppsIcon = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var DragPlaceholderItem = new Lang.Class({
|
const DragPlaceholderItem = new Lang.Class({
|
||||||
Name: 'DragPlaceholderItem',
|
Name: 'DragPlaceholderItem',
|
||||||
Extends: DashItemContainer,
|
Extends: DashItemContainer,
|
||||||
|
|
||||||
@ -325,7 +325,7 @@ var DragPlaceholderItem = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var EmptyDropTargetItem = new Lang.Class({
|
const EmptyDropTargetItem = new Lang.Class({
|
||||||
Name: 'EmptyDropTargetItem',
|
Name: 'EmptyDropTargetItem',
|
||||||
Extends: DashItemContainer,
|
Extends: DashItemContainer,
|
||||||
|
|
||||||
@ -335,7 +335,7 @@ var EmptyDropTargetItem = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var DashActor = new Lang.Class({
|
const DashActor = new Lang.Class({
|
||||||
Name: 'DashActor',
|
Name: 'DashActor',
|
||||||
Extends: St.Widget,
|
Extends: St.Widget,
|
||||||
|
|
||||||
@ -387,7 +387,7 @@ var DashActor = new Lang.Class({
|
|||||||
|
|
||||||
const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ];
|
const baseIconSizes = [ 16, 22, 24, 32, 48, 64 ];
|
||||||
|
|
||||||
var Dash = new Lang.Class({
|
const Dash = new Lang.Class({
|
||||||
Name: 'Dash',
|
Name: 'Dash',
|
||||||
|
|
||||||
_init : function() {
|
_init : function() {
|
||||||
@ -644,14 +644,15 @@ var Dash = new Lang.Class({
|
|||||||
let firstIcon = firstButton._delegate.icon;
|
let firstIcon = firstButton._delegate.icon;
|
||||||
|
|
||||||
let minHeight, natHeight;
|
let minHeight, natHeight;
|
||||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
|
||||||
|
|
||||||
// Enforce the current icon size during the size request
|
// Enforce the current icon size during the size request
|
||||||
firstIcon.icon.ensure_style();
|
firstIcon.setIconSize(this.iconSize);
|
||||||
let [currentWidth, currentHeight] = firstIcon.icon.get_size();
|
|
||||||
firstIcon.icon.set_size(this.iconSize * scaleFactor, this.iconSize * scaleFactor);
|
|
||||||
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
|
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
|
||||||
firstIcon.icon.set_size(currentWidth, currentHeight);
|
|
||||||
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
|
let iconSizes = baseIconSizes.map(function(s) {
|
||||||
|
return s * scaleFactor;
|
||||||
|
});
|
||||||
|
|
||||||
// Subtract icon padding and box spacing from the available height
|
// Subtract icon padding and box spacing from the available height
|
||||||
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
|
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
|
||||||
@ -659,10 +660,6 @@ var Dash = new Lang.Class({
|
|||||||
|
|
||||||
let availSize = availHeight / iconChildren.length;
|
let availSize = availHeight / iconChildren.length;
|
||||||
|
|
||||||
let iconSizes = baseIconSizes.map(function(s) {
|
|
||||||
return s * scaleFactor;
|
|
||||||
});
|
|
||||||
|
|
||||||
let newIconSize = baseIconSizes[0];
|
let newIconSize = baseIconSizes[0];
|
||||||
for (let i = 0; i < iconSizes.length; i++) {
|
for (let i = 0; i < iconSizes.length; i++) {
|
||||||
if (iconSizes[i] < availSize)
|
if (iconSizes[i] < availSize)
|
||||||
@ -756,44 +753,42 @@ var Dash = new Lang.Class({
|
|||||||
let newIndex = 0;
|
let newIndex = 0;
|
||||||
let oldIndex = 0;
|
let oldIndex = 0;
|
||||||
while (newIndex < newApps.length || oldIndex < oldApps.length) {
|
while (newIndex < newApps.length || oldIndex < oldApps.length) {
|
||||||
let oldApp = oldApps.length > oldIndex ? oldApps[oldIndex] : null;
|
|
||||||
let newApp = newApps.length > newIndex ? newApps[newIndex] : null;
|
|
||||||
|
|
||||||
// No change at oldIndex/newIndex
|
// No change at oldIndex/newIndex
|
||||||
if (oldApp == newApp) {
|
if (oldApps[oldIndex] == newApps[newIndex]) {
|
||||||
oldIndex++;
|
oldIndex++;
|
||||||
newIndex++;
|
newIndex++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// App removed at oldIndex
|
// App removed at oldIndex
|
||||||
if (oldApp && newApps.indexOf(oldApp) == -1) {
|
if (oldApps[oldIndex] &&
|
||||||
|
newApps.indexOf(oldApps[oldIndex]) == -1) {
|
||||||
removedActors.push(children[oldIndex]);
|
removedActors.push(children[oldIndex]);
|
||||||
oldIndex++;
|
oldIndex++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// App added at newIndex
|
// App added at newIndex
|
||||||
if (newApp && oldApps.indexOf(newApp) == -1) {
|
if (newApps[newIndex] &&
|
||||||
addedItems.push({ app: newApp,
|
oldApps.indexOf(newApps[newIndex]) == -1) {
|
||||||
item: this._createAppItem(newApp),
|
addedItems.push({ app: newApps[newIndex],
|
||||||
|
item: this._createAppItem(newApps[newIndex]),
|
||||||
pos: newIndex });
|
pos: newIndex });
|
||||||
newIndex++;
|
newIndex++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// App moved
|
// App moved
|
||||||
let nextApp = newApps.length > newIndex + 1 ? newApps[newIndex + 1]
|
let insertHere = newApps[newIndex + 1] &&
|
||||||
: null;
|
newApps[newIndex + 1] == oldApps[oldIndex];
|
||||||
let insertHere = nextApp && nextApp == oldApp;
|
|
||||||
let alreadyRemoved = removedActors.reduce(function(result, actor) {
|
let alreadyRemoved = removedActors.reduce(function(result, actor) {
|
||||||
let removedApp = actor.child._delegate.app;
|
let removedApp = actor.child._delegate.app;
|
||||||
return result || removedApp == newApp;
|
return result || removedApp == newApps[newIndex];
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
if (insertHere || alreadyRemoved) {
|
if (insertHere || alreadyRemoved) {
|
||||||
let newItem = this._createAppItem(newApp);
|
let newItem = this._createAppItem(newApps[newIndex]);
|
||||||
addedItems.push({ app: newApp,
|
addedItems.push({ app: newApps[newIndex],
|
||||||
item: newItem,
|
item: newItem,
|
||||||
pos: newIndex + removedActors.length });
|
pos: newIndex + removedActors.length });
|
||||||
newIndex++;
|
newIndex++;
|
||||||
|
@ -8,7 +8,6 @@ const Gtk = imports.gi.Gtk;
|
|||||||
const GWeather = imports.gi.GWeather;
|
const GWeather = imports.gi.GWeather;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Cairo = imports.cairo;
|
const Cairo = imports.cairo;
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
@ -21,8 +20,6 @@ const Main = imports.ui.main;
|
|||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Calendar = imports.ui.calendar;
|
const Calendar = imports.ui.calendar;
|
||||||
const Weather = imports.misc.weather;
|
|
||||||
const System = imports.system;
|
|
||||||
|
|
||||||
function _isToday(date) {
|
function _isToday(date) {
|
||||||
let now = new Date();
|
let now = new Date();
|
||||||
@ -31,7 +28,7 @@ function _isToday(date) {
|
|||||||
now.getDate() == date.getDate();
|
now.getDate() == date.getDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
var TodayButton = new Lang.Class({
|
const TodayButton = new Lang.Class({
|
||||||
Name: 'TodayButton',
|
Name: 'TodayButton',
|
||||||
|
|
||||||
_init: function(calendar) {
|
_init: function(calendar) {
|
||||||
@ -39,7 +36,7 @@ var TodayButton = new Lang.Class({
|
|||||||
// on the current date can be confusing. So don't make the button reactive
|
// on the current date can be confusing. So don't make the button reactive
|
||||||
// until the selected date changes.
|
// until the selected date changes.
|
||||||
this.actor = new St.Button({ style_class: 'datemenu-today-button',
|
this.actor = new St.Button({ style_class: 'datemenu-today-button',
|
||||||
x_expand: true, x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
reactive: false
|
reactive: false
|
||||||
});
|
});
|
||||||
@ -80,17 +77,19 @@ var TodayButton = new Lang.Class({
|
|||||||
* below the time in the shell; it should combine the weekday and the
|
* below the time in the shell; it should combine the weekday and the
|
||||||
* date, e.g. "Tuesday February 17 2015".
|
* date, e.g. "Tuesday February 17 2015".
|
||||||
*/
|
*/
|
||||||
dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
|
let dateFormat = Shell.util_translate_time_string (N_("%A %B %e %Y"));
|
||||||
this.actor.accessible_name = date.toLocaleFormat(dateFormat);
|
this.actor.accessible_name = date.toLocaleFormat(dateFormat);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var WorldClocksSection = new Lang.Class({
|
const WorldClocksSection = new Lang.Class({
|
||||||
Name: 'WorldClocksSection',
|
Name: 'WorldClocksSection',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._clock = new GnomeDesktop.WallClock();
|
this._clock = new GnomeDesktop.WallClock();
|
||||||
|
this._settings = null;
|
||||||
this._clockNotifyId = 0;
|
this._clockNotifyId = 0;
|
||||||
|
this._changedId = 0;
|
||||||
|
|
||||||
this._locations = [];
|
this._locations = [];
|
||||||
|
|
||||||
@ -99,7 +98,8 @@ var WorldClocksSection = new Lang.Class({
|
|||||||
can_focus: true });
|
can_focus: true });
|
||||||
this.actor.connect('clicked', Lang.bind(this,
|
this.actor.connect('clicked', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
this._clockAppMon.activateApp();
|
let app = this._getClockApp();
|
||||||
|
app.activate();
|
||||||
|
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
Main.panel.closeCalendar();
|
Main.panel.closeCalendar();
|
||||||
@ -112,25 +112,40 @@ var WorldClocksSection = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.child = this._grid;
|
this.actor.child = this._grid;
|
||||||
|
|
||||||
this._clockAppMon = new Util.AppSettingsMonitor('org.gnome.clocks.desktop',
|
Shell.AppSystem.get_default().connect('installed-changed',
|
||||||
'org.gnome.clocks');
|
Lang.bind(this, this._sync));
|
||||||
this._clockAppMon.connect('available-changed',
|
|
||||||
Lang.bind(this, this._sync));
|
|
||||||
this._clockAppMon.watchSetting('world-clocks',
|
|
||||||
Lang.bind(this, this._clocksChanged));
|
|
||||||
this._sync();
|
this._sync();
|
||||||
},
|
},
|
||||||
|
|
||||||
_sync: function() {
|
_getClockApp: function() {
|
||||||
this.actor.visible = this._clockAppMon.available;
|
return Shell.AppSystem.get_default().lookup_app('org.gnome.clocks.desktop');
|
||||||
},
|
},
|
||||||
|
|
||||||
_clocksChanged: function(settings) {
|
_sync: function() {
|
||||||
|
this.actor.visible = (this._getClockApp() != null);
|
||||||
|
|
||||||
|
if (this.actor.visible) {
|
||||||
|
if (!this._settings) {
|
||||||
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.clocks' });
|
||||||
|
this._changedId =
|
||||||
|
this._settings.connect('changed::world-clocks',
|
||||||
|
Lang.bind(this, this._clocksChanged));
|
||||||
|
this._clocksChanged();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this._settings)
|
||||||
|
this._settings.disconnect(this._changedId);
|
||||||
|
this._settings = null;
|
||||||
|
this._changedId = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_clocksChanged: function() {
|
||||||
this._grid.destroy_all_children();
|
this._grid.destroy_all_children();
|
||||||
this._locations = [];
|
this._locations = [];
|
||||||
|
|
||||||
let world = GWeather.Location.get_world();
|
let world = GWeather.Location.get_world();
|
||||||
let clocks = settings.get_value('world-clocks').deep_unpack();
|
let clocks = this._settings.get_value('world-clocks').deep_unpack();
|
||||||
for (let i = 0; i < clocks.length; i++) {
|
for (let i = 0; i < clocks.length; i++) {
|
||||||
let l = world.deserialize(clocks[i].location);
|
let l = world.deserialize(clocks[i].location);
|
||||||
this._locations.push({ location: l });
|
this._locations.push({ location: l });
|
||||||
@ -195,155 +210,12 @@ var WorldClocksSection = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var WeatherSection = new Lang.Class({
|
const MessagesIndicator = new Lang.Class({
|
||||||
Name: 'WeatherSection',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._weatherClient = new Weather.WeatherClient();
|
|
||||||
|
|
||||||
this.actor = new St.Button({ style_class: 'weather-button',
|
|
||||||
x_fill: true,
|
|
||||||
can_focus: true });
|
|
||||||
this.actor.connect('clicked', () => {
|
|
||||||
this._weatherClient.activateApp();
|
|
||||||
|
|
||||||
Main.overview.hide();
|
|
||||||
Main.panel.closeCalendar();
|
|
||||||
});
|
|
||||||
this.actor.connect('notify::mapped', () => {
|
|
||||||
if (this.actor.mapped)
|
|
||||||
this._weatherClient.update();
|
|
||||||
});
|
|
||||||
|
|
||||||
let box = new St.BoxLayout({ style_class: 'weather-box',
|
|
||||||
vertical: true });
|
|
||||||
|
|
||||||
this.actor.child = box;
|
|
||||||
|
|
||||||
box.add_child(new St.Label({ style_class: 'weather-header',
|
|
||||||
x_align: Clutter.ActorAlign.START,
|
|
||||||
text: _("Weather") }));
|
|
||||||
|
|
||||||
this._conditionsLabel = new St.Label({ style_class: 'weather-conditions',
|
|
||||||
x_align: Clutter.ActorAlign.START });
|
|
||||||
this._conditionsLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
this._conditionsLabel.clutter_text.line_wrap = true;
|
|
||||||
box.add_child(this._conditionsLabel);
|
|
||||||
|
|
||||||
this._weatherClient.connect('changed', Lang.bind(this, this._sync));
|
|
||||||
this._sync();
|
|
||||||
},
|
|
||||||
|
|
||||||
_getSummary: function(info, capitalize=false) {
|
|
||||||
let options = capitalize ? GWeather.FormatOptions.SENTENCE_CAPITALIZATION
|
|
||||||
: GWeather.FormatOptions.NO_CAPITALIZATION;
|
|
||||||
|
|
||||||
let [ok, phenomenon, qualifier] = info.get_value_conditions();
|
|
||||||
if (ok)
|
|
||||||
return new GWeather.Conditions({ significant: true,
|
|
||||||
phenomenon,
|
|
||||||
qualifier }).to_string_full(options);
|
|
||||||
|
|
||||||
let [, sky] = info.get_value_sky();
|
|
||||||
return GWeather.Sky.to_string_full(sky, options);
|
|
||||||
},
|
|
||||||
|
|
||||||
_sameSummary: function(info1, info2) {
|
|
||||||
let [ok1, phenom1, qualifier1] = info1.get_value_conditions();
|
|
||||||
let [ok2, phenom2, qualifier2] = info2.get_value_conditions();
|
|
||||||
if (ok1 || ok2)
|
|
||||||
return ok1 == ok2 && phenom1 == phenom2 && qualifier1 == qualifier2;
|
|
||||||
|
|
||||||
let [, sky1] = info1.get_value_sky();
|
|
||||||
let [, sky2] = info2.get_value_sky();
|
|
||||||
return sky1 == sky2;
|
|
||||||
},
|
|
||||||
|
|
||||||
_getSummaryText: function() {
|
|
||||||
let info = this._weatherClient.info;
|
|
||||||
let forecasts = info.get_forecast_list();
|
|
||||||
if (forecasts.length == 0) // No forecasts, just current conditions
|
|
||||||
return '%s.'.format(this._getSummary(info, true));
|
|
||||||
|
|
||||||
let current = info;
|
|
||||||
let infos = [info];
|
|
||||||
for (let i = 0; i < forecasts.length; i++) {
|
|
||||||
let [ok, timestamp] = forecasts[i].get_value_update();
|
|
||||||
if (!_isToday(new Date(timestamp * 1000)))
|
|
||||||
continue; // Ignore forecasts from other days
|
|
||||||
|
|
||||||
if (this._sameSummary(current, forecasts[i]))
|
|
||||||
continue; // Ignore consecutive runs of equal summaries
|
|
||||||
|
|
||||||
current = forecasts[i];
|
|
||||||
if (infos.push(current) == 3)
|
|
||||||
break; // Use a maximum of three summaries
|
|
||||||
}
|
|
||||||
|
|
||||||
let fmt;
|
|
||||||
switch(infos.length) {
|
|
||||||
/* Translators: %s is a weather condition like "Clear sky"; see
|
|
||||||
libgweather for the possible condition strings. If at all
|
|
||||||
possible, the sentence should match the grammatical case etc. of
|
|
||||||
the inserted conditions. */
|
|
||||||
case 1: fmt = _("%s all day."); break;
|
|
||||||
|
|
||||||
/* Translators: %s is a weather condition like "Clear sky"; see
|
|
||||||
libgweather for the possible condition strings. If at all
|
|
||||||
possible, the sentence should match the grammatical case etc. of
|
|
||||||
the inserted conditions. */
|
|
||||||
case 2: fmt = _("%s, then %s later."); break;
|
|
||||||
|
|
||||||
/* Translators: %s is a weather condition like "Clear sky"; see
|
|
||||||
libgweather for the possible condition strings. If at all
|
|
||||||
possible, the sentence should match the grammatical case etc. of
|
|
||||||
the inserted conditions. */
|
|
||||||
case 3: fmt = _("%s, then %s, followed by %s later."); break;
|
|
||||||
}
|
|
||||||
let summaries = infos.map((info, i) => {
|
|
||||||
let capitalize = i == 0 && fmt.startsWith('%s');
|
|
||||||
return this._getSummary(info, capitalize);
|
|
||||||
});
|
|
||||||
return String.prototype.format.apply(fmt, summaries);
|
|
||||||
},
|
|
||||||
|
|
||||||
_getLabelText: function() {
|
|
||||||
if (!this._weatherClient.hasLocation)
|
|
||||||
return _("Select a location…");
|
|
||||||
|
|
||||||
if (this._weatherClient.loading)
|
|
||||||
return _("Loading…");
|
|
||||||
|
|
||||||
let info = this._weatherClient.info;
|
|
||||||
if (info.is_valid())
|
|
||||||
return this._getSummaryText() + ' ' +
|
|
||||||
/* Translators: %s is a temperature with unit, e.g. "23℃" */
|
|
||||||
_("Feels like %s.").format(info.get_apparent());
|
|
||||||
|
|
||||||
if (info.network_error())
|
|
||||||
return _("Go online for weather information");
|
|
||||||
|
|
||||||
return _("Weather information is currently unavailable");
|
|
||||||
},
|
|
||||||
|
|
||||||
_sync: function() {
|
|
||||||
this.actor.visible = this._weatherClient.available;
|
|
||||||
|
|
||||||
if (!this.actor.visible)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._conditionsLabel.text = this._getLabelText();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var MessagesIndicator = new Lang.Class({
|
|
||||||
Name: 'MessagesIndicator',
|
Name: 'MessagesIndicator',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.actor = new St.Icon({ icon_name: 'message-indicator-symbolic',
|
this.actor = new St.Label({ text: '⚫', visible: false, y_expand: true,
|
||||||
icon_size: 16,
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
visible: false, y_expand: true,
|
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
|
||||||
|
|
||||||
this._sources = [];
|
this._sources = [];
|
||||||
|
|
||||||
@ -378,13 +250,14 @@ var MessagesIndicator = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var IndicatorPad = new Lang.Class({
|
const IndicatorPad = new Lang.Class({
|
||||||
Name: 'IndicatorPad',
|
Name: 'IndicatorPad',
|
||||||
Extends: St.Widget,
|
Extends: St.Widget,
|
||||||
|
|
||||||
_init: function(actor) {
|
_init: function(actor) {
|
||||||
this._source = actor;
|
this._source = actor;
|
||||||
this._source.connect('notify::visible', () => { this.queue_relayout(); });
|
this._source.connect('notify::visible',
|
||||||
|
Lang.bind(this, this.queue_relayout));
|
||||||
this.parent();
|
this.parent();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -401,7 +274,7 @@ var IndicatorPad = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var FreezableBinLayout = new Lang.Class({
|
const FreezableBinLayout = new Lang.Class({
|
||||||
Name: 'FreezableBinLayout',
|
Name: 'FreezableBinLayout',
|
||||||
Extends: Clutter.BinLayout,
|
Extends: Clutter.BinLayout,
|
||||||
|
|
||||||
@ -424,42 +297,18 @@ var FreezableBinLayout = new Lang.Class({
|
|||||||
|
|
||||||
vfunc_get_preferred_width: function(container, forHeight) {
|
vfunc_get_preferred_width: function(container, forHeight) {
|
||||||
if (!this._frozen || this._savedWidth.some(isNaN))
|
if (!this._frozen || this._savedWidth.some(isNaN))
|
||||||
return this.parent(container, forHeight);
|
this._savedWidth = this.parent(container, forHeight);
|
||||||
return this._savedWidth;
|
return this._savedWidth;
|
||||||
},
|
},
|
||||||
|
|
||||||
vfunc_get_preferred_height: function(container, forWidth) {
|
vfunc_get_preferred_height: function(container, forWidth) {
|
||||||
if (!this._frozen || this._savedHeight.some(isNaN))
|
if (!this._frozen || this._savedHeight.some(isNaN))
|
||||||
return this.parent(container, forWidth);
|
this._savedHeight = this.parent(container, forWidth);
|
||||||
return this._savedHeight;
|
return this._savedHeight;
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_allocate: function(container, allocation, flags) {
|
|
||||||
this.parent(container, allocation, flags);
|
|
||||||
|
|
||||||
let [width, height] = allocation.get_size();
|
|
||||||
this._savedWidth = [width, width];
|
|
||||||
this._savedHeight = [height, height];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var CalendarColumnLayout = new Lang.Class({
|
const DateMenuButton = new Lang.Class({
|
||||||
Name: 'CalendarColumnLayout',
|
|
||||||
Extends: Clutter.BoxLayout,
|
|
||||||
|
|
||||||
_init: function(actor) {
|
|
||||||
this.parent({ orientation: Clutter.Orientation.VERTICAL });
|
|
||||||
this._calActor = actor;
|
|
||||||
},
|
|
||||||
|
|
||||||
vfunc_get_preferred_width: function(container, forHeight) {
|
|
||||||
if (!this._calActor || this._calActor.get_parent() != container)
|
|
||||||
return this.parent(container, forHeight);
|
|
||||||
return this._calActor.get_preferred_width(forHeight);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var DateMenuButton = new Lang.Class({
|
|
||||||
Name: 'DateMenuButton',
|
Name: 'DateMenuButton',
|
||||||
Extends: PanelMenu.Button,
|
Extends: PanelMenu.Button,
|
||||||
|
|
||||||
@ -488,8 +337,6 @@ var DateMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
let layout = new FreezableBinLayout();
|
let layout = new FreezableBinLayout();
|
||||||
let bin = new St.Widget({ layout_manager: layout });
|
let bin = new St.Widget({ layout_manager: layout });
|
||||||
// For some minimal compatibility with PopupMenuItem
|
|
||||||
bin._delegate = this;
|
|
||||||
this.menu.box.add_child(bin);
|
this.menu.box.add_child(bin);
|
||||||
|
|
||||||
hbox = new St.BoxLayout({ name: 'calendarArea' });
|
hbox = new St.BoxLayout({ name: 'calendarArea' });
|
||||||
@ -513,20 +360,18 @@ var DateMenuButton = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
// Fill up the first column
|
// Fill up the first column
|
||||||
this._messageList = new Calendar.CalendarMessageList();
|
this._messageList = new Calendar.MessageList();
|
||||||
hbox.add(this._messageList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
|
hbox.add(this._messageList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
|
||||||
|
|
||||||
// Fill up the second column
|
// Fill up the second column
|
||||||
let boxLayout = new CalendarColumnLayout(this._calendar.actor);
|
vbox = new St.BoxLayout({ style_class: 'datemenu-calendar-column',
|
||||||
vbox = new St.Widget({ style_class: 'datemenu-calendar-column',
|
vertical: true });
|
||||||
layout_manager: boxLayout });
|
|
||||||
boxLayout.hookup_style(vbox);
|
|
||||||
hbox.add(vbox);
|
hbox.add(vbox);
|
||||||
|
|
||||||
this._date = new TodayButton(this._calendar);
|
this._date = new TodayButton(this._calendar);
|
||||||
vbox.add_actor(this._date.actor);
|
vbox.add_actor(this._date.actor);
|
||||||
|
|
||||||
vbox.add_actor(this._calendar.actor);
|
vbox.add(this._calendar.actor);
|
||||||
|
|
||||||
this._displaysSection = new St.ScrollView({ style_class: 'datemenu-displays-section vfade',
|
this._displaysSection = new St.ScrollView({ style_class: 'datemenu-displays-section vfade',
|
||||||
x_expand: true, x_fill: true,
|
x_expand: true, x_fill: true,
|
||||||
@ -541,14 +386,11 @@ var DateMenuButton = new Lang.Class({
|
|||||||
this._clocksItem = new WorldClocksSection();
|
this._clocksItem = new WorldClocksSection();
|
||||||
displaysBox.add(this._clocksItem.actor, { x_fill: true });
|
displaysBox.add(this._clocksItem.actor, { x_fill: true });
|
||||||
|
|
||||||
this._weatherItem = new WeatherSection();
|
|
||||||
displaysBox.add(this._weatherItem.actor, { x_fill: true });
|
|
||||||
|
|
||||||
// Done with hbox for calendar and event list
|
// Done with hbox for calendar and event list
|
||||||
|
|
||||||
this._clock = new GnomeDesktop.WallClock();
|
this._clock = new GnomeDesktop.WallClock();
|
||||||
this._clock.bind_property('clock', this._clockDisplay, 'text', GObject.BindingFlags.SYNC_CREATE);
|
this._clock.bind_property('clock', this._clockDisplay, 'text', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this._clock.connect('notify::timezone', Lang.bind(this, this._updateTimeZone));
|
|
||||||
|
|
||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
@ -568,15 +410,6 @@ var DateMenuButton = new Lang.Class({
|
|||||||
this._eventSource = eventSource;
|
this._eventSource = eventSource;
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateTimeZone: function() {
|
|
||||||
// SpiderMonkey caches the time zone so we must explicitly clear it
|
|
||||||
// before we can update the calendar, see
|
|
||||||
// https://bugzilla.gnome.org/show_bug.cgi?id=678507
|
|
||||||
System.clearDateCaches();
|
|
||||||
|
|
||||||
this._calendar.updateTimeZone();
|
|
||||||
},
|
|
||||||
|
|
||||||
_sessionUpdated: function() {
|
_sessionUpdated: function() {
|
||||||
let eventSource;
|
let eventSource;
|
||||||
let showEvents = Main.sessionMode.showCalendarEvents;
|
let showEvents = Main.sessionMode.showCalendarEvents;
|
||||||
|
236
js/ui/dialog.js
236
js/ui/dialog.js
@ -1,236 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const GObject = imports.gi.GObject;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
|
|
||||||
var Dialog = new Lang.Class({
|
|
||||||
Name: 'Dialog',
|
|
||||||
Extends: St.Widget,
|
|
||||||
|
|
||||||
_init: function (parentActor, styleClass) {
|
|
||||||
this.parent({ layout_manager: new Clutter.BinLayout() });
|
|
||||||
this.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
|
|
||||||
this._initialKeyFocus = null;
|
|
||||||
this._pressedKey = null;
|
|
||||||
this._buttonKeys = {};
|
|
||||||
this._createDialog();
|
|
||||||
this.add_child(this._dialog);
|
|
||||||
|
|
||||||
if (styleClass != null)
|
|
||||||
this._dialog.add_style_class_name(styleClass);
|
|
||||||
|
|
||||||
this._parentActor = parentActor;
|
|
||||||
this._eventId = this._parentActor.connect('event', Lang.bind(this, this._modalEventHandler));
|
|
||||||
this._parentActor.add_child(this);
|
|
||||||
},
|
|
||||||
|
|
||||||
_createDialog: function () {
|
|
||||||
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
|
|
||||||
// size requests.
|
|
||||||
this._dialog.request_mode = Clutter.RequestMode.HEIGHT_FOR_WIDTH;
|
|
||||||
|
|
||||||
this.contentLayout = new St.BoxLayout({ vertical: true,
|
|
||||||
style_class: "modal-dialog-content-box" });
|
|
||||||
this._dialog.add(this.contentLayout,
|
|
||||||
{ expand: true,
|
|
||||||
x_fill: true,
|
|
||||||
y_fill: true,
|
|
||||||
x_align: St.Align.MIDDLE,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
|
|
||||||
this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout({ homogeneous:true }) });
|
|
||||||
this._dialog.add(this.buttonLayout,
|
|
||||||
{ x_align: St.Align.MIDDLE,
|
|
||||||
y_align: St.Align.START });
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function () {
|
|
||||||
if (this._eventId != 0)
|
|
||||||
this._parentActor.disconnect(this._eventId);
|
|
||||||
this._eventId = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
_modalEventHandler: function (actor, event) {
|
|
||||||
if (event.type() == Clutter.EventType.KEY_PRESS) {
|
|
||||||
this._pressedKey = event.get_key_symbol();
|
|
||||||
} else if (event.type() == Clutter.EventType.KEY_RELEASE) {
|
|
||||||
let pressedKey = this._pressedKey;
|
|
||||||
this._pressedKey = null;
|
|
||||||
|
|
||||||
let symbol = event.get_key_symbol();
|
|
||||||
if (symbol != pressedKey)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
let buttonInfo = this._buttonKeys[symbol];
|
|
||||||
if (!buttonInfo)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
let { button, action } = buttonInfo;
|
|
||||||
|
|
||||||
if (action && button.reactive) {
|
|
||||||
action();
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
},
|
|
||||||
|
|
||||||
get initialKeyFocus() {
|
|
||||||
return this._initialKeyFocus || this;
|
|
||||||
},
|
|
||||||
|
|
||||||
addContent: function (actor) {
|
|
||||||
this.contentLayout.add (actor, { expand: true });
|
|
||||||
},
|
|
||||||
|
|
||||||
addButton: function (buttonInfo) {
|
|
||||||
let { label, action, key } = buttonInfo;
|
|
||||||
let isDefault = buttonInfo['default'];
|
|
||||||
let keys;
|
|
||||||
|
|
||||||
if (key)
|
|
||||||
keys = [key];
|
|
||||||
else if (isDefault)
|
|
||||||
keys = [Clutter.KEY_Return, Clutter.KEY_KP_Enter, Clutter.KEY_ISO_Enter];
|
|
||||||
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: label });
|
|
||||||
button.connect('clicked', action);
|
|
||||||
|
|
||||||
buttonInfo['button'] = button;
|
|
||||||
|
|
||||||
if (isDefault)
|
|
||||||
button.add_style_pseudo_class('default');
|
|
||||||
|
|
||||||
if (this._initialKeyFocus == null || isDefault)
|
|
||||||
this._initialKeyFocus = button;
|
|
||||||
|
|
||||||
for (let i in keys)
|
|
||||||
this._buttonKeys[keys[i]] = buttonInfo;
|
|
||||||
|
|
||||||
this.buttonLayout.add_actor(button);
|
|
||||||
|
|
||||||
return button;
|
|
||||||
},
|
|
||||||
|
|
||||||
clearButtons: function () {
|
|
||||||
this.buttonLayout.destroy_all_children();
|
|
||||||
this._buttonKeys = {};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
var MessageDialogContent = new Lang.Class({
|
|
||||||
Name: 'MessageDialogContent',
|
|
||||||
Extends: St.BoxLayout,
|
|
||||||
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)
|
|
||||||
},
|
|
||||||
|
|
||||||
_init: function(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();
|
|
||||||
|
|
||||||
['icon', 'title', 'subtitle', 'body'].forEach(prop => {
|
|
||||||
this[`_${prop}`].add_style_class_name(`message-dialog-${prop}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
let textProps = { ellipsize_mode: Pango.EllipsizeMode.NONE,
|
|
||||||
line_wrap: true };
|
|
||||||
Object.assign(this._subtitle.clutter_text, textProps);
|
|
||||||
Object.assign(this._body.clutter_text, textProps);
|
|
||||||
|
|
||||||
if (!params.hasOwnProperty('style_class'))
|
|
||||||
params.style_class = 'message-dialog-main-layout';
|
|
||||||
|
|
||||||
this.parent(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;
|
|
||||||
},
|
|
||||||
|
|
||||||
get title() {
|
|
||||||
return this._title.text;
|
|
||||||
},
|
|
||||||
|
|
||||||
get subtitle() {
|
|
||||||
return this._subtitle.text;
|
|
||||||
},
|
|
||||||
|
|
||||||
get body() {
|
|
||||||
return this._body.text;
|
|
||||||
},
|
|
||||||
|
|
||||||
set icon(icon) {
|
|
||||||
Object.assign(this._icon, { gicon: icon, visible: icon != null });
|
|
||||||
this.notify('icon');
|
|
||||||
},
|
|
||||||
|
|
||||||
set title(title) {
|
|
||||||
this._setLabel(this._title, 'title', title);
|
|
||||||
},
|
|
||||||
|
|
||||||
set subtitle(subtitle) {
|
|
||||||
this._setLabel(this._subtitle, 'subtitle', subtitle);
|
|
||||||
},
|
|
||||||
|
|
||||||
set body(body) {
|
|
||||||
this._setLabel(this._body, 'body', body);
|
|
||||||
},
|
|
||||||
|
|
||||||
_setLabel(label, prop, value) {
|
|
||||||
Object.assign(label, { text: value || '', visible: value != null });
|
|
||||||
this.notify(prop);
|
|
||||||
},
|
|
||||||
|
|
||||||
insertBeforeBody: function(actor) {
|
|
||||||
this.messageBox.insert_child_below(actor, this._body);
|
|
||||||
}
|
|
||||||
});
|
|
160
js/ui/dnd.js
160
js/ui/dnd.js
@ -14,34 +14,34 @@ const Main = imports.ui.main;
|
|||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
// Time to scale down to maxDragActorSize
|
// Time to scale down to maxDragActorSize
|
||||||
var SCALE_ANIMATION_TIME = 0.25;
|
const SCALE_ANIMATION_TIME = 0.25;
|
||||||
// Time to animate to original position on cancel
|
// Time to animate to original position on cancel
|
||||||
var SNAP_BACK_ANIMATION_TIME = 0.25;
|
const SNAP_BACK_ANIMATION_TIME = 0.25;
|
||||||
// Time to animate to original position on success
|
// Time to animate to original position on success
|
||||||
var REVERT_ANIMATION_TIME = 0.75;
|
const REVERT_ANIMATION_TIME = 0.75;
|
||||||
|
|
||||||
var DragMotionResult = {
|
const DragMotionResult = {
|
||||||
NO_DROP: 0,
|
NO_DROP: 0,
|
||||||
COPY_DROP: 1,
|
COPY_DROP: 1,
|
||||||
MOVE_DROP: 2,
|
MOVE_DROP: 2,
|
||||||
CONTINUE: 3
|
CONTINUE: 3
|
||||||
};
|
};
|
||||||
|
|
||||||
var DRAG_CURSOR_MAP = {
|
const DRAG_CURSOR_MAP = {
|
||||||
0: Meta.Cursor.DND_UNSUPPORTED_TARGET,
|
0: Meta.Cursor.DND_UNSUPPORTED_TARGET,
|
||||||
1: Meta.Cursor.DND_COPY,
|
1: Meta.Cursor.DND_COPY,
|
||||||
2: Meta.Cursor.DND_MOVE
|
2: Meta.Cursor.DND_MOVE
|
||||||
};
|
};
|
||||||
|
|
||||||
var DragDropResult = {
|
const DragDropResult = {
|
||||||
FAILURE: 0,
|
FAILURE: 0,
|
||||||
SUCCESS: 1,
|
SUCCESS: 1,
|
||||||
CONTINUE: 2
|
CONTINUE: 2
|
||||||
};
|
};
|
||||||
var dragMonitors = [];
|
|
||||||
|
|
||||||
let eventHandlerActor = null;
|
let eventHandlerActor = null;
|
||||||
let currentDraggable = null;
|
let currentDraggable = null;
|
||||||
|
let dragMonitors = [];
|
||||||
|
|
||||||
function _getEventHandlerActor() {
|
function _getEventHandlerActor() {
|
||||||
if (!eventHandlerActor) {
|
if (!eventHandlerActor) {
|
||||||
@ -69,7 +69,7 @@ function removeDragMonitor(monitor) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var _Draggable = new Lang.Class({
|
const _Draggable = new Lang.Class({
|
||||||
Name: 'Draggable',
|
Name: 'Draggable',
|
||||||
|
|
||||||
_init : function(actor, params) {
|
_init : function(actor, params) {
|
||||||
@ -79,12 +79,9 @@ var _Draggable = new Lang.Class({
|
|||||||
dragActorOpacity: undefined });
|
dragActorOpacity: undefined });
|
||||||
|
|
||||||
this.actor = actor;
|
this.actor = actor;
|
||||||
if (!params.manualMode) {
|
if (!params.manualMode)
|
||||||
this.actor.connect('button-press-event',
|
this.actor.connect('button-press-event',
|
||||||
Lang.bind(this, this._onButtonPress));
|
Lang.bind(this, this._onButtonPress));
|
||||||
this.actor.connect('touch-event',
|
|
||||||
Lang.bind(this, this._onTouchEvent));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, function() {
|
this.actor.connect('destroy', Lang.bind(this, function() {
|
||||||
this._actorDestroyed = true;
|
this._actorDestroyed = true;
|
||||||
@ -94,7 +91,6 @@ var _Draggable = new Lang.Class({
|
|||||||
this.disconnectAll();
|
this.disconnectAll();
|
||||||
}));
|
}));
|
||||||
this._onEventId = null;
|
this._onEventId = null;
|
||||||
this._touchSequence = null;
|
|
||||||
|
|
||||||
this._restoreOnSuccess = params.restoreOnSuccess;
|
this._restoreOnSuccess = params.restoreOnSuccess;
|
||||||
this._dragActorMaxSize = params.dragActorMaxSize;
|
this._dragActorMaxSize = params.dragActorMaxSize;
|
||||||
@ -125,50 +121,8 @@ var _Draggable = new Lang.Class({
|
|||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onTouchEvent: function (actor, event) {
|
|
||||||
if (event.type() != Clutter.EventType.TOUCH_BEGIN ||
|
|
||||||
!global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
if (Tweener.getTweenCount(actor))
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
this._touchSequence = event.get_event_sequence();
|
|
||||||
|
|
||||||
this._buttonDown = true;
|
|
||||||
this._grabActor();
|
|
||||||
|
|
||||||
let [stageX, stageY] = event.get_coords();
|
|
||||||
this._dragStartX = stageX;
|
|
||||||
this._dragStartY = stageY;
|
|
||||||
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
},
|
|
||||||
|
|
||||||
_grabDevice: function(actor) {
|
|
||||||
let manager = Clutter.DeviceManager.get_default();
|
|
||||||
let pointer = manager.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
|
|
||||||
|
|
||||||
if (pointer && this._touchSequence)
|
|
||||||
pointer.sequence_grab(this._touchSequence, actor);
|
|
||||||
else if (pointer)
|
|
||||||
pointer.grab (actor);
|
|
||||||
|
|
||||||
this._grabbedDevice = pointer;
|
|
||||||
},
|
|
||||||
|
|
||||||
_ungrabDevice: function() {
|
|
||||||
if (this._touchSequence)
|
|
||||||
this._grabbedDevice.sequence_ungrab (this._touchSequence);
|
|
||||||
else
|
|
||||||
this._grabbedDevice.ungrab();
|
|
||||||
|
|
||||||
this._touchSequence = null;
|
|
||||||
this._grabbedDevice = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_grabActor: function() {
|
_grabActor: function() {
|
||||||
this._grabDevice(this.actor);
|
Clutter.grab_pointer(this.actor);
|
||||||
this._onEventId = this.actor.connect('event',
|
this._onEventId = this.actor.connect('event',
|
||||||
Lang.bind(this, this._onEvent));
|
Lang.bind(this, this._onEvent));
|
||||||
},
|
},
|
||||||
@ -177,7 +131,7 @@ var _Draggable = new Lang.Class({
|
|||||||
if (!this._onEventId)
|
if (!this._onEventId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._ungrabDevice();
|
Clutter.ungrab_pointer();
|
||||||
this.actor.disconnect(this._onEventId);
|
this.actor.disconnect(this._onEventId);
|
||||||
this._onEventId = null;
|
this._onEventId = null;
|
||||||
},
|
},
|
||||||
@ -186,13 +140,13 @@ var _Draggable = new Lang.Class({
|
|||||||
if (!this._eventsGrabbed) {
|
if (!this._eventsGrabbed) {
|
||||||
this._eventsGrabbed = Main.pushModal(_getEventHandlerActor());
|
this._eventsGrabbed = Main.pushModal(_getEventHandlerActor());
|
||||||
if (this._eventsGrabbed)
|
if (this._eventsGrabbed)
|
||||||
this._grabDevice(_getEventHandlerActor());
|
Clutter.grab_pointer(_getEventHandlerActor());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_ungrabEvents: function() {
|
_ungrabEvents: function() {
|
||||||
if (this._eventsGrabbed) {
|
if (this._eventsGrabbed) {
|
||||||
this._ungrabDevice();
|
Clutter.ungrab_pointer();
|
||||||
Main.popModal(_getEventHandlerActor());
|
Main.popModal(_getEventHandlerActor());
|
||||||
this._eventsGrabbed = false;
|
this._eventsGrabbed = false;
|
||||||
}
|
}
|
||||||
@ -203,9 +157,7 @@ var _Draggable = new Lang.Class({
|
|||||||
// didn't start the drag, to drop the draggable in case the drag was in progress, and
|
// didn't start the drag, to drop the draggable in case the drag was in progress, and
|
||||||
// to complete the drag and ensure that whatever happens to be under the pointer does
|
// to complete the drag and ensure that whatever happens to be under the pointer does
|
||||||
// not get triggered if the drag was cancelled with Esc.
|
// not get triggered if the drag was cancelled with Esc.
|
||||||
if (event.type() == Clutter.EventType.BUTTON_RELEASE ||
|
if (event.type() == Clutter.EventType.BUTTON_RELEASE) {
|
||||||
(event.type() == Clutter.EventType.TOUCH_END &&
|
|
||||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) {
|
|
||||||
this._buttonDown = false;
|
this._buttonDown = false;
|
||||||
if (this._dragInProgress) {
|
if (this._dragInProgress) {
|
||||||
return this._dragActorDropped(event);
|
return this._dragActorDropped(event);
|
||||||
@ -220,9 +172,7 @@ var _Draggable = new Lang.Class({
|
|||||||
}
|
}
|
||||||
// We intercept MOTION event to figure out if the drag has started and to draw
|
// We intercept MOTION event to figure out if the drag has started and to draw
|
||||||
// this._dragActor under the pointer when dragging is in progress
|
// this._dragActor under the pointer when dragging is in progress
|
||||||
} else if (event.type() == Clutter.EventType.MOTION ||
|
} else if (event.type() == Clutter.EventType.MOTION) {
|
||||||
(event.type() == Clutter.EventType.TOUCH_UPDATE &&
|
|
||||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) {
|
|
||||||
if (this._dragInProgress) {
|
if (this._dragInProgress) {
|
||||||
return this._updateDragPosition(event);
|
return this._updateDragPosition(event);
|
||||||
} else if (this._dragActor == null) {
|
} else if (this._dragActor == null) {
|
||||||
@ -264,7 +214,7 @@ var _Draggable = new Lang.Class({
|
|||||||
* This function is useful to call if you've specified manualMode
|
* This function is useful to call if you've specified manualMode
|
||||||
* for the draggable.
|
* for the draggable.
|
||||||
*/
|
*/
|
||||||
startDrag: function (stageX, stageY, time, sequence) {
|
startDrag: function (stageX, stageY, time) {
|
||||||
currentDraggable = this;
|
currentDraggable = this;
|
||||||
this._dragInProgress = true;
|
this._dragInProgress = true;
|
||||||
|
|
||||||
@ -278,8 +228,6 @@ var _Draggable = new Lang.Class({
|
|||||||
this.emit('drag-begin', time);
|
this.emit('drag-begin', time);
|
||||||
if (this._onEventId)
|
if (this._onEventId)
|
||||||
this._ungrabActor();
|
this._ungrabActor();
|
||||||
|
|
||||||
this._touchSequence = sequence;
|
|
||||||
this._grabEvents();
|
this._grabEvents();
|
||||||
global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
|
global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
|
||||||
|
|
||||||
@ -390,8 +338,8 @@ var _Draggable = new Lang.Class({
|
|||||||
let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold;
|
let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold;
|
||||||
if ((Math.abs(stageX - this._dragStartX) > threshold ||
|
if ((Math.abs(stageX - this._dragStartX) > threshold ||
|
||||||
Math.abs(stageY - this._dragStartY) > threshold)) {
|
Math.abs(stageY - this._dragStartY) > threshold)) {
|
||||||
this.startDrag(stageX, stageY, event.get_time(), this._touchSequence);
|
this.startDrag(stageX, stageY, event.get_time());
|
||||||
this._updateDragPosition(event);
|
this._updateDragPosition(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -531,7 +479,7 @@ var _Draggable = new Lang.Class({
|
|||||||
// Snap the clone back to its source
|
// Snap the clone back to its source
|
||||||
[x, y] = this._dragActorSource.get_transformed_position();
|
[x, y] = this._dragActorSource.get_transformed_position();
|
||||||
let [sourceScaledWidth, sourceScaledHeight] = this._dragActorSource.get_transformed_size();
|
let [sourceScaledWidth, sourceScaledHeight] = this._dragActorSource.get_transformed_size();
|
||||||
scale = sourceScaledWidth ? this._dragActor.width / sourceScaledWidth : 0;
|
scale = this._dragActor.width / sourceScaledWidth;
|
||||||
} else if (this._dragOrigParent) {
|
} else if (this._dragOrigParent) {
|
||||||
// Snap the actor back to its original position within
|
// Snap the actor back to its original position within
|
||||||
// its parent, adjusting for the fact that the parent
|
// its parent, adjusting for the fact that the parent
|
||||||
@ -572,13 +520,20 @@ var _Draggable = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._animateDragEnd(eventTime,
|
this._animationInProgress = true;
|
||||||
{ x: snapBackX,
|
// No target, so snap back
|
||||||
y: snapBackY,
|
Tweener.addTween(this._dragActor,
|
||||||
scale_x: snapBackScale,
|
{ x: snapBackX,
|
||||||
scale_y: snapBackScale,
|
y: snapBackY,
|
||||||
time: SNAP_BACK_ANIMATION_TIME,
|
scale_x: snapBackScale,
|
||||||
});
|
scale_y: snapBackScale,
|
||||||
|
opacity: this._dragOrigOpacity,
|
||||||
|
time: SNAP_BACK_ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
onComplete: this._onAnimationComplete,
|
||||||
|
onCompleteScope: this,
|
||||||
|
onCompleteParams: [this._dragActor, eventTime]
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_restoreDragActor: function(eventTime) {
|
_restoreDragActor: function(eventTime) {
|
||||||
@ -590,44 +545,18 @@ var _Draggable = new Lang.Class({
|
|||||||
this._dragActor.set_scale(restoreScale, restoreScale);
|
this._dragActor.set_scale(restoreScale, restoreScale);
|
||||||
this._dragActor.opacity = 0;
|
this._dragActor.opacity = 0;
|
||||||
|
|
||||||
this._animateDragEnd(eventTime,
|
|
||||||
{ time: REVERT_ANIMATION_TIME });
|
|
||||||
},
|
|
||||||
|
|
||||||
_animateDragEnd: function (eventTime, params) {
|
|
||||||
this._animationInProgress = true;
|
this._animationInProgress = true;
|
||||||
|
Tweener.addTween(this._dragActor,
|
||||||
// finish animation if the actor gets destroyed
|
{ opacity: this._dragOrigOpacity,
|
||||||
// during it
|
time: REVERT_ANIMATION_TIME,
|
||||||
this._dragActorDestroyId =
|
transition: 'easeOutQuad',
|
||||||
this._dragActor.connect('destroy',
|
onComplete: this._onAnimationComplete,
|
||||||
Lang.bind(this, this._finishAnimation));
|
onCompleteScope: this,
|
||||||
|
onCompleteParams: [this._dragActor, eventTime]
|
||||||
params['opacity'] = this._dragOrigOpacity;
|
});
|
||||||
params['transition'] = 'easeOutQuad';
|
|
||||||
params['onComplete'] = this._onAnimationComplete;
|
|
||||||
params['onCompleteScope'] = this;
|
|
||||||
params['onCompleteParams'] = [this._dragActor, eventTime];
|
|
||||||
|
|
||||||
// start the animation
|
|
||||||
Tweener.addTween(this._dragActor, params)
|
|
||||||
},
|
|
||||||
|
|
||||||
_finishAnimation : function () {
|
|
||||||
if (!this._animationInProgress)
|
|
||||||
return
|
|
||||||
|
|
||||||
this._animationInProgress = false;
|
|
||||||
if (!this._buttonDown)
|
|
||||||
this._dragComplete();
|
|
||||||
|
|
||||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onAnimationComplete : function (dragActor, eventTime) {
|
_onAnimationComplete : function (dragActor, eventTime) {
|
||||||
dragActor.disconnect(this._dragActorDestroyId);
|
|
||||||
this._dragActorDestroyId = 0;
|
|
||||||
|
|
||||||
if (this._dragOrigParent) {
|
if (this._dragOrigParent) {
|
||||||
Main.uiGroup.remove_child(this._dragActor);
|
Main.uiGroup.remove_child(this._dragActor);
|
||||||
this._dragOrigParent.add_actor(this._dragActor);
|
this._dragOrigParent.add_actor(this._dragActor);
|
||||||
@ -636,9 +565,12 @@ var _Draggable = new Lang.Class({
|
|||||||
} else {
|
} else {
|
||||||
dragActor.destroy();
|
dragActor.destroy();
|
||||||
}
|
}
|
||||||
|
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||||
this.emit('drag-end', eventTime, false);
|
this.emit('drag-end', eventTime, false);
|
||||||
this._finishAnimation();
|
|
||||||
|
this._animationInProgress = false;
|
||||||
|
if (!this._buttonDown)
|
||||||
|
this._dragComplete();
|
||||||
},
|
},
|
||||||
|
|
||||||
_dragComplete: function() {
|
_dragComplete: function() {
|
||||||
|
@ -8,13 +8,12 @@ const St = imports.gi.St;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
var EDGE_THRESHOLD = 20;
|
const EDGE_THRESHOLD = 20;
|
||||||
var DRAG_DISTANCE = 80;
|
const DRAG_DISTANCE = 80;
|
||||||
|
|
||||||
var EdgeDragAction = new Lang.Class({
|
const EdgeDragAction = new Lang.Class({
|
||||||
Name: 'EdgeDragAction',
|
Name: 'EdgeDragAction',
|
||||||
Extends: Clutter.GestureAction,
|
Extends: Clutter.GestureAction,
|
||||||
Signals: { 'activated': {} },
|
|
||||||
|
|
||||||
_init : function(side, allowedModes) {
|
_init : function(side, allowedModes) {
|
||||||
this.parent();
|
this.parent();
|
||||||
@ -82,3 +81,4 @@ var EdgeDragAction = new Lang.Class({
|
|||||||
this.emit('activated');
|
this.emit('activated');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Signals.addSignalMethods(EdgeDragAction.prototype);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
/*
|
/*
|
||||||
* Copyright 2010-2016 Red Hat, Inc
|
* Copyright 2010 Red Hat, Inc
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -41,7 +41,7 @@ let _endSessionDialog = null;
|
|||||||
const _ITEM_ICON_SIZE = 48;
|
const _ITEM_ICON_SIZE = 48;
|
||||||
const _DIALOG_ICON_SIZE = 48;
|
const _DIALOG_ICON_SIZE = 48;
|
||||||
|
|
||||||
var GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
|
const GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
|
||||||
|
|
||||||
const EndSessionDialogIface = '<node> \
|
const EndSessionDialogIface = '<node> \
|
||||||
<interface name="org.gnome.SessionManager.EndSessionDialog"> \
|
<interface name="org.gnome.SessionManager.EndSessionDialog"> \
|
||||||
@ -114,7 +114,7 @@ const restartDialogContent = {
|
|||||||
showOtherSessions: true,
|
showOtherSessions: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
const restartUpdateDialogContent = {
|
const restartInstallDialogContent = {
|
||||||
|
|
||||||
subject: C_("title", "Restart & Install Updates"),
|
subject: C_("title", "Restart & Install Updates"),
|
||||||
description: function(seconds) {
|
description: function(seconds) {
|
||||||
@ -132,41 +132,21 @@ const restartUpdateDialogContent = {
|
|||||||
showOtherSessions: true,
|
showOtherSessions: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
const restartUpgradeDialogContent = {
|
|
||||||
|
|
||||||
subject: C_("title", "Restart & Install Upgrade"),
|
|
||||||
upgradeDescription: function(distroName, distroVersion) {
|
|
||||||
/* Translators: This is the text displayed for system upgrades in the
|
|
||||||
shut down dialog. First %s gets replaced with the distro name and
|
|
||||||
second %s with the distro version to upgrade to */
|
|
||||||
return _("%s %s will be installed after restart. Upgrade installation can take a long time: ensure that you have backed up and that the computer is plugged in.").format(distroName, distroVersion);
|
|
||||||
},
|
|
||||||
disableTimer: true,
|
|
||||||
showBatteryWarning: false,
|
|
||||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
|
||||||
label: C_("button", "Restart & Install") }],
|
|
||||||
iconName: 'view-refresh-symbolic',
|
|
||||||
iconStyleClass: 'end-session-dialog-shutdown-icon',
|
|
||||||
showOtherSessions: true,
|
|
||||||
};
|
|
||||||
|
|
||||||
const DialogType = {
|
const DialogType = {
|
||||||
LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
|
LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
|
||||||
SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
|
SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
|
||||||
RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
|
RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
|
||||||
UPDATE_RESTART: 3,
|
UPDATE_RESTART: 3
|
||||||
UPGRADE_RESTART: 4
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const DialogContent = {
|
const DialogContent = {
|
||||||
0 /* DialogType.LOGOUT */: logoutDialogContent,
|
0 /* DialogType.LOGOUT */: logoutDialogContent,
|
||||||
1 /* DialogType.SHUTDOWN */: shutdownDialogContent,
|
1 /* DialogType.SHUTDOWN */: shutdownDialogContent,
|
||||||
2 /* DialogType.RESTART */: restartDialogContent,
|
2 /* DialogType.RESTART */: restartDialogContent,
|
||||||
3 /* DialogType.UPDATE_RESTART */: restartUpdateDialogContent,
|
3 /* DialogType.UPDATE_RESTART */: restartInstallDialogContent
|
||||||
4 /* DialogType.UPGRADE_RESTART */: restartUpgradeDialogContent
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var MAX_USERS_IN_SESSION_DIALOG = 5;
|
const MAX_USERS_IN_SESSION_DIALOG = 5;
|
||||||
|
|
||||||
const LogindSessionIface = '<node> \
|
const LogindSessionIface = '<node> \
|
||||||
<interface name="org.freedesktop.login1.Session"> \
|
<interface name="org.freedesktop.login1.Session"> \
|
||||||
@ -183,10 +163,7 @@ const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
|
|||||||
const PkOfflineIface = '<node> \
|
const PkOfflineIface = '<node> \
|
||||||
<interface name="org.freedesktop.PackageKit.Offline"> \
|
<interface name="org.freedesktop.PackageKit.Offline"> \
|
||||||
<property name="UpdatePrepared" type="b" access="read"/> \
|
<property name="UpdatePrepared" type="b" access="read"/> \
|
||||||
<property name="UpdateTriggered" type="b" access="read"/> \
|
<property name="TriggerAction" type="s" access="read"/> \
|
||||||
<property name="UpgradePrepared" type="b" access="read"/> \
|
|
||||||
<property name="UpgradeTriggered" type="b" access="read"/> \
|
|
||||||
<property name="PreparedUpgrade" type="a{sv}" access="read"/> \
|
|
||||||
<method name="Trigger"> \
|
<method name="Trigger"> \
|
||||||
<arg type="s" name="action" direction="in"/> \
|
<arg type="s" name="action" direction="in"/> \
|
||||||
</method> \
|
</method> \
|
||||||
@ -275,7 +252,7 @@ function init() {
|
|||||||
_endSessionDialog = new EndSessionDialog();
|
_endSessionDialog = new EndSessionDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
var EndSessionDialog = new Lang.Class({
|
const EndSessionDialog = new Lang.Class({
|
||||||
Name: 'EndSessionDialog',
|
Name: 'EndSessionDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
@ -438,25 +415,18 @@ var EndSessionDialog = new Lang.Class({
|
|||||||
|
|
||||||
if (dialogContent.descriptionWithUser)
|
if (dialogContent.descriptionWithUser)
|
||||||
description = dialogContent.descriptionWithUser(realName, displayTime);
|
description = dialogContent.descriptionWithUser(realName, displayTime);
|
||||||
|
else
|
||||||
|
description = dialogContent.description(displayTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use a different description when we are installing a system upgrade
|
|
||||||
if (dialogContent.upgradeDescription) {
|
|
||||||
let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
|
|
||||||
let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
|
|
||||||
|
|
||||||
if (name != null && version != null)
|
|
||||||
description = dialogContent.upgradeDescription(name, version);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fall back to regular description
|
|
||||||
if (!description)
|
if (!description)
|
||||||
description = dialogContent.description(displayTime);
|
description = dialogContent.description(displayTime);
|
||||||
|
|
||||||
_setLabelText(this._descriptionLabel, description);
|
_setLabelText(this._descriptionLabel, description);
|
||||||
_setLabelText(this._subjectLabel, subject);
|
_setLabelText(this._subjectLabel, subject);
|
||||||
|
|
||||||
|
let dialogContent = DialogContent[this._type];
|
||||||
if (dialogContent.iconName) {
|
if (dialogContent.iconName) {
|
||||||
this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
|
this._iconBin.child = new St.Icon({ icon_name: dialogContent.iconName,
|
||||||
icon_size: _DIALOG_ICON_SIZE,
|
icon_size: _DIALOG_ICON_SIZE,
|
||||||
@ -728,12 +698,9 @@ var EndSessionDialog = new Lang.Class({
|
|||||||
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
|
||||||
this._type = type;
|
this._type = type;
|
||||||
|
|
||||||
if (this._type == DialogType.RESTART) {
|
if (this._type == DialogType.RESTART &&
|
||||||
if (this._pkOfflineProxy.UpdateTriggered)
|
this._pkOfflineProxy.TriggerAction == 'reboot')
|
||||||
this._type = DialogType.UPDATE_RESTART;
|
this._type = DialogType.UPDATE_RESTART;
|
||||||
else if (this._pkOfflineProxy.UpgradeTriggered)
|
|
||||||
this._type = DialogType.UPGRADE_RESTART;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._applications = [];
|
this._applications = [];
|
||||||
this._applicationList.destroy_all_children();
|
this._applicationList.destroy_all_children();
|
||||||
@ -760,19 +727,19 @@ var EndSessionDialog = new Lang.Class({
|
|||||||
if (dialogContent.showOtherSessions)
|
if (dialogContent.showOtherSessions)
|
||||||
this._loadSessions();
|
this._loadSessions();
|
||||||
|
|
||||||
let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
|
let updateAlreadyTriggered = this._pkOfflineProxy.TriggerAction == 'power-off' || this._pkOfflineProxy.TriggerAction == 'reboot';
|
||||||
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
|
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
|
||||||
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
|
||||||
|
|
||||||
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
|
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
|
||||||
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
|
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
|
||||||
this._checkBox.actor.checked = (updatePrepared && updateTriggered);
|
this._checkBox.actor.checked = (updatePrepared && updateAlreadyTriggered);
|
||||||
|
|
||||||
// We show the warning either together with the checkbox, or when
|
// We show the warning either together with the checkbox, or when
|
||||||
// updates have already been triggered, but the user doesn't have
|
// updates have already been triggered, but the user doesn't have
|
||||||
// enough permissions to cancel them.
|
// enough permissions to cancel them.
|
||||||
this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
|
this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
|
||||||
(this._checkBox.actor.visible || updatePrepared && updateTriggered && !updatesAllowed));
|
(this._checkBox.actor.visible || updatePrepared && updateAlreadyTriggered && !updatesAllowed));
|
||||||
|
|
||||||
this._updateButtons();
|
this._updateButtons();
|
||||||
|
|
||||||
@ -782,9 +749,7 @@ var EndSessionDialog = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dialogContent.disableTimer)
|
this._startTimer();
|
||||||
this._startTimer();
|
|
||||||
|
|
||||||
this._sync();
|
this._sync();
|
||||||
|
|
||||||
let signalId = this.connect('opened',
|
let signalId = this.connect('opened',
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user