Compare commits
218 Commits
3.11.90
...
gnome-3-12
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e047af492 | ||
|
|
0546819e8f | ||
|
|
62a6519db6 | ||
|
|
a63821a57f | ||
|
|
b7d2191059 | ||
|
|
68f5674e62 | ||
|
|
ffa8ff730e | ||
|
|
80f9d1ff5d | ||
|
|
547005b3a2 | ||
|
|
36f051044c | ||
|
|
0d75416d80 | ||
|
|
c96f95ab90 | ||
|
|
5ccbd3a821 | ||
|
|
c9bd1d79cc | ||
|
|
07e6219704 | ||
|
|
8625d5b0cc | ||
|
|
e021ca2135 | ||
|
|
ba6a2cae9c | ||
|
|
5852c17f76 | ||
|
|
4fe0353991 | ||
|
|
3c4a898a91 | ||
|
|
0006feec67 | ||
|
|
dd2ace2e37 | ||
|
|
0327bd0a9d | ||
|
|
42619cdd3b | ||
|
|
76ea1f4dca | ||
|
|
e4e3252ffc | ||
|
|
e9ae77186d | ||
|
|
a0c146bbfd | ||
|
|
6d679148b6 | ||
|
|
07198c5890 | ||
|
|
4720bc3412 | ||
|
|
7113821964 | ||
|
|
c2ae98209d | ||
|
|
21f0e422c0 | ||
|
|
eb0f2b8b34 | ||
|
|
65e781a973 | ||
|
|
4590903159 | ||
|
|
8b6fcbea50 | ||
|
|
c6067ffa1d | ||
|
|
7b4254da4e | ||
|
|
2f576e3076 | ||
|
|
60d7c3ad86 | ||
|
|
43fdc15ac0 | ||
|
|
f082a58071 | ||
|
|
ae5dfb5740 | ||
|
|
e8fdba4f66 | ||
|
|
1030cdfe8a | ||
|
|
ca2d626b59 | ||
|
|
2b4eaf6b3f | ||
|
|
6ce6e77d2a | ||
|
|
0117fcb0e7 | ||
|
|
79bebe849d | ||
|
|
25eadc5559 | ||
|
|
a5784484e0 | ||
|
|
a701b006c5 | ||
|
|
2d68bbf94e | ||
|
|
df305314c1 | ||
|
|
d03239c009 | ||
|
|
71ccad4399 | ||
|
|
c916d43688 | ||
|
|
3e6d0bc252 | ||
|
|
79d0a848a4 | ||
|
|
a6af33d450 | ||
|
|
c6664adcce | ||
|
|
4e8a9470d1 | ||
|
|
1b88df9439 | ||
|
|
ec42278654 | ||
|
|
f435f249d0 | ||
|
|
9c88fec4fc | ||
|
|
9ecf466ce1 | ||
|
|
a22fdea0e3 | ||
|
|
90e52d7266 | ||
|
|
74d9b6c2bf | ||
|
|
b1e9873de5 | ||
|
|
6fdc52a64a | ||
|
|
b7d6792de9 | ||
|
|
c78dc55e65 | ||
|
|
af74bded14 | ||
|
|
e3c9a9c3e4 | ||
|
|
c68eecaf1c | ||
|
|
b0bdf7f6c3 | ||
|
|
d0f69a72dc | ||
|
|
8d8c75d32d | ||
|
|
e339e2658d | ||
|
|
bc4a75a732 | ||
|
|
e09e1bc3f5 | ||
|
|
87c50eb495 | ||
|
|
be291ee4f9 | ||
|
|
e634b49859 | ||
|
|
4dddaefa41 | ||
|
|
cda60455f0 | ||
|
|
a42b8870b0 | ||
|
|
daa66a6de6 | ||
|
|
6c6aed84bc | ||
|
|
c59314acc1 | ||
|
|
dd3cc78be5 | ||
|
|
54b0b6eec5 | ||
|
|
41654b22b3 | ||
|
|
07cc60d65a | ||
|
|
a7f9dc5114 | ||
|
|
b5ae23d544 | ||
|
|
75347cb4f7 | ||
|
|
03a44b6ec2 | ||
|
|
17d2349c49 | ||
|
|
4e98c44052 | ||
|
|
0bef281d66 | ||
|
|
54af25ec24 | ||
|
|
86ab02f400 | ||
|
|
ae01cd143f | ||
|
|
2974b29f15 | ||
|
|
1b78dd662b | ||
|
|
c22264a0ca | ||
|
|
48c3e3f534 | ||
|
|
6ccc134ba6 | ||
|
|
9aa36d7851 | ||
|
|
3278f77739 | ||
|
|
5d24f48e3b | ||
|
|
573c1c86cc | ||
|
|
374c5967ba | ||
|
|
66b71a36ce | ||
|
|
e70fd5a57a | ||
|
|
4589ce4d78 | ||
|
|
d6197b0904 | ||
|
|
30fb2b0d99 | ||
|
|
5cdefc324d | ||
|
|
b222d0fe44 | ||
|
|
fe4fddf0d5 | ||
|
|
c675c93733 | ||
|
|
29485ff24b | ||
|
|
f6ed3d9f88 | ||
|
|
39a36cb510 | ||
|
|
ff5550c82b | ||
|
|
7d5ce1a159 | ||
|
|
c492415386 | ||
|
|
5616bbd45b | ||
|
|
e117aa5297 | ||
|
|
17ac1382df | ||
|
|
057a026ea4 | ||
|
|
6ce6e86318 | ||
|
|
492558a2d2 | ||
|
|
b78e00f372 | ||
|
|
c2cc504837 | ||
|
|
ac76940530 | ||
|
|
55d1c7e2ab | ||
|
|
fdf264ff64 | ||
|
|
e917b7ce0f | ||
|
|
ec6facb9e7 | ||
|
|
60f3c09f90 | ||
|
|
afdfd6cebc | ||
|
|
edd66c40d9 | ||
|
|
fc4bc5277a | ||
|
|
821768a414 | ||
|
|
522f3bf171 | ||
|
|
fb7400ab85 | ||
|
|
210128f22b | ||
|
|
78ae233823 | ||
|
|
8f25da7cea | ||
|
|
7f52fdb435 | ||
|
|
0ba05b29b9 | ||
|
|
ef8123e3a2 | ||
|
|
257e1f3096 | ||
|
|
6441ae77d9 | ||
|
|
3f0938072f | ||
|
|
2fe06a28aa | ||
|
|
38750ba798 | ||
|
|
b4c01f8905 | ||
|
|
104d70c88e | ||
|
|
133a350f2f | ||
|
|
496ab55357 | ||
|
|
a391758e31 | ||
|
|
eaf8ad4949 | ||
|
|
2f583bdcf3 | ||
|
|
db19012a41 | ||
|
|
62be46884e | ||
|
|
3f2e6a48a9 | ||
|
|
ff124e5f74 | ||
|
|
c07421c195 | ||
|
|
de8348d3b9 | ||
|
|
184df8a853 | ||
|
|
12768a147c | ||
|
|
94161cea37 | ||
|
|
52a4ef7cf7 | ||
|
|
3432f71500 | ||
|
|
8282aa6c24 | ||
|
|
59f9eaa1c9 | ||
|
|
4433b735c4 | ||
|
|
9cd30fa6b5 | ||
|
|
2c7bbfb500 | ||
|
|
51a1d23bf9 | ||
|
|
c02e6e82bc | ||
|
|
e37a3fa7e6 | ||
|
|
e23c2ffecc | ||
|
|
744f11d045 | ||
|
|
b7eb1f3e8b | ||
|
|
3f28091e52 | ||
|
|
b4ee86955d | ||
|
|
8b866efe92 | ||
|
|
fb61ab8df7 | ||
|
|
990956ece7 | ||
|
|
414b592d53 | ||
|
|
751154d9da | ||
|
|
29addc499c | ||
|
|
caa98de581 | ||
|
|
1fd1ec4312 | ||
|
|
f4607626e4 | ||
|
|
b494c15e4b | ||
|
|
3c0defa125 | ||
|
|
f2df4d95de | ||
|
|
fabcf20e06 | ||
|
|
b9510b9ab7 | ||
|
|
52a2ebad04 | ||
|
|
89a2dc71fc | ||
|
|
adb0de43d8 | ||
|
|
e2a811a720 | ||
|
|
5bcafc5c17 | ||
|
|
2d24536caf | ||
|
|
b088c4086b |
111
NEWS
111
NEWS
@@ -1,3 +1,114 @@
|
||||
3.12.2
|
||||
======
|
||||
* Fix turning off airplane mode [Giovanni; #728512]
|
||||
* Handle empty VPN keyfiles [Adel; #728681]
|
||||
* Fix setting zero-level in osdWindow [Bastien; #727384]
|
||||
* Fix removal of multiple workspace thumbnails at once [Florian; #728820]
|
||||
* Make airplane mode menu insensitive in lock screen [Giovanni; #729224]
|
||||
* Fix keynav for alternatives in AltSwitcher [Florian; #727259]
|
||||
* Fix zombie search providers showing up [Jasper; #728597]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Florian Müllner, Bastien Nocera,
|
||||
Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Wouter Bolsterlee [nl], Daniel Korostil [uk], Ihar Hrachyshka [be],
|
||||
Giovanni Campagna [it], Carles Ferrando [ca@valencia]
|
||||
|
||||
3.12.1
|
||||
======
|
||||
* Ensure the currently focused app icon is viewable [Rui; #726759]
|
||||
* Improve language in location menu [Zeeshan; #726498]
|
||||
* Improve HiDpi support [Cosimo; #726907]
|
||||
* Set accessible role for window previews [Alejandro; #726670]
|
||||
* Fix bad antialiasing on panel menu buttons [Carlos; #727336]
|
||||
* Don't hide location menu [Zeeshan; #727398]
|
||||
* Fix IM candidate window obscuring current text [Rui; #727579]
|
||||
* Fix extension-prefs tool when linked with --as-needed [Florian; #727948]
|
||||
* Don't always extend struts to the screen edge [Florian; #663690]
|
||||
|
||||
Contributors:
|
||||
Zeeshan Ali (Khattak), Cosimo Cecchi, Piotr Drąg, Rui Matos, Simon McVittie,
|
||||
Florian Müllner, Alejandro Piñeiro, Carlos Soriano
|
||||
|
||||
Translations:
|
||||
Khaled Hosny [ar], Piotr Drąg [pl], Yosef Or Boczko [he],
|
||||
Antonio Fernandes C. Neto [pt_BR], Marek Černocký [cs], maria thukididu [el],
|
||||
Andika Triwidada [id], Daniel Mustieles [es], Changwoo Ryu [ko],
|
||||
Benjamin Steinwender [de], Sphinx Jiang [zh_CN],
|
||||
Inaki Larranaga Murgoitio [eu], Marcus Lundblad [sv], Aurimas Černius [lt],
|
||||
Stas Solovey [ru], Alexandre Franke [fr], Matej Urbančič [sl],
|
||||
Fran Diéguez [gl], Pau Iranzo [ca], Luca Ferretti [it], Milo Casagrande [it],
|
||||
Tiago S [pt], Victor Ibragimov [tg], Dirgita [id], Khoem Sokhem [km],
|
||||
Rūdolfs Mazurs [lv], Balázs Úr [hu], Ask H. Larsen [da], Ikuya Awashiro [ja],
|
||||
Мирослав Николић [sr, sr@latin]
|
||||
|
||||
3.12.0
|
||||
======
|
||||
* gdm: Reset greeter when coming back to login screen [Jasper; #726989]
|
||||
|
||||
Contributors:
|
||||
Jasper St. Pierre
|
||||
|
||||
Translations:
|
||||
Daniel Martinez [an], Yuri Myasoedov [ru], Inaki Larranaga Murgoitio [eu],
|
||||
Abderrahim Kitouni [ar], Praveen Illa [te], Matej Urbančič [sl],
|
||||
Chao-Hsiung Liao [zh_HK, zh_TW], Frédéric Péters [fr],
|
||||
Мирослав Николић [sr, sr@latin], Ask H. Larsen [da], Kenneth Nielsen [da],
|
||||
Jiro Matsuzawa [ja], Dušan Kazik [sk]
|
||||
|
||||
3.11.92
|
||||
=======
|
||||
* calendar: Grab key focus after changing day [Volker; #725606]
|
||||
* gdm: Don't load user list if disabled [Florian; #725905]
|
||||
* Don't show network-offline in the top bar [Jasper; #725340]
|
||||
* Improve radial shade effect of modal dialogs [Giovanni; #725830]
|
||||
* Fix broken suspend-on-idle functionality [Giovanni; #712706]
|
||||
* Close wifi selection dialog when device disappears [Giovanni; #723935]
|
||||
* Don't close chats when pressing Escape [Giovanni; #724178]
|
||||
* Improve smartcard support in login/lock screen [Ray; #726262, #726263]
|
||||
* Wake up screen when resuming from suspend [Giovanni; #726378]
|
||||
* Make bluetooth and location items insensitive when locked [Florian; #726319]
|
||||
* Don't show bluetooth icon when there is no adapter [Giovanni; #725057]
|
||||
* Make sure to keep the OSK on top of modal dialogs [Rui; #719451]
|
||||
* Misc. bug fixes and cleanups [Giovanni, Ray, Adel, Daniel, Jasper, Florian;
|
||||
#725832, #725958, #722149, #724977, #724798, #725020, #723976, #726119,
|
||||
#726238, #585500, #704844, #726323, #726322, #726120, #726414]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Daniel Drake, Adel Gadllah, Rui Matos, Florian Müllner,
|
||||
Volker Sobek, Jasper St. Pierre, Ray Strode
|
||||
|
||||
Translations:
|
||||
Fabio Tomat [fur], Rafael Ferreira [pt_BR], Fran Diéguez [gl],
|
||||
Marek Černocký [cs], Baurzhan Muftakhidinov [kk], Andika Triwidada [id],
|
||||
A S Alam [pa], Rūdolfs Mazurs [lv], Wylmer Wang [zh_CN],
|
||||
Aurimas Černius [lt], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru],
|
||||
Tiagosdot [pt], Benjamin Steinwender [de], Frédéric Peters [fr],
|
||||
Daniel Korostil [uk], Yaron Shahrabani [he], Ville-Pekka Vainio [fi],
|
||||
maria thukididu [el], Victor Ibragimov [tg], Kjartan Maraas [nb],
|
||||
Gábor Kelemen [hu], Ask H. Larsen [da]
|
||||
|
||||
3.11.91
|
||||
=======
|
||||
* Don't use network profile name in menu [Giovanni; #725586]
|
||||
* calendar: Make date label clickable to return to current date [Vit; #641366]
|
||||
* Misc. bug fixes [Florian, Zeeshan, Adel, Jasper, Dan, Volker; #724813,
|
||||
#724686, #725082, #724870, #724779, #725533]
|
||||
|
||||
Contributors:
|
||||
Zeeshan Ali (Khattak), Giovanni Campagna, Piotr Drąg, Adel Gadllah,
|
||||
Florian Müllner, Volker Sobek, Vit Stanislav, Jasper St. Pierre, Dan Williams
|
||||
|
||||
Translations:
|
||||
Victor Ibragimov [tg], Aurimas Černius [lt], Dimitris Spingos [el],
|
||||
Andika Triwidada [id], Rafael Ferreira [pt_BR], Daniel Mustieles [es],
|
||||
Baurzhan Muftakhidinov [kk], Marek Černocký [cs], Ihar Hrachyshka [be],
|
||||
eternalhui [zh_CN], Yosef Or Boczko [he], Fran Diéguez [gl],
|
||||
Khaled Hosny [ar], Ville-Pekka Vainio [fi], Piotr Drąg [pl],
|
||||
Kjartan Maraas [nb], Changwoo Ryu [ko]
|
||||
|
||||
3.11.90
|
||||
=======
|
||||
* Stop showing two bluetooth entries [Giovanni; #709353]
|
||||
|
||||
2
README
2
README
@@ -8,7 +8,7 @@ For more information about GNOME Shell, including instructions on how
|
||||
to build GNOME Shell from source and how to get involved with the project,
|
||||
see:
|
||||
|
||||
http://live.gnome.org/GnomeShell
|
||||
https://wiki.gnome.org/Projects/GnomeShell
|
||||
|
||||
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
|
||||
product.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.11.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[3.12.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
|
||||
CLUTTER_MIN_VERSION=1.15.90
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||
GJS_MIN_VERSION=1.39.0
|
||||
MUTTER_MIN_VERSION=3.11.90
|
||||
MUTTER_MIN_VERSION=3.12.1
|
||||
GTK_MIN_VERSION=3.7.9
|
||||
GIO_MIN_VERSION=2.37.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
Type=Application
|
||||
_Name=GNOME Shell (wayland compositor)
|
||||
_Comment=Window management and application launching
|
||||
Exec=@bindir@/mutter-launch -- gnome-shell-wayland --wayland
|
||||
Exec=@bindir@/mutter-launch -- gnome-shell-wayland --wayland --display-server
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-shell
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
allowed to see. Valid options are 'off' (disable location tracking),
|
||||
'country', 'city', 'neighborhood', 'street', and 'exact' (typically
|
||||
requires GPS receiver). Please keep in mind that this only controls
|
||||
what Geoclue will allow applications to see and they can find user's
|
||||
what GeoClue will allow applications to see and they can find user's
|
||||
location on their own using network resources (albeit with street-level
|
||||
accuracy at best).
|
||||
</_description>
|
||||
|
||||
@@ -670,7 +670,7 @@ StScrollBar StButton#vhandle:active {
|
||||
color: #e6e6e6;
|
||||
border-radius: 32px; /* wish we could do 50% */
|
||||
padding: 13px;
|
||||
border: 1px solid #5f5f5f; /* using rgba() is flaky unfortunately */
|
||||
border: 2px solid #5f5f5f; /* using rgba() is flaky unfortunately */
|
||||
}
|
||||
|
||||
.system-menu-action:hover,
|
||||
@@ -678,7 +678,7 @@ StScrollBar StButton#vhandle:active {
|
||||
color: white;
|
||||
background-color: #4c4c4c;
|
||||
border: none;
|
||||
padding: 14px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.system-menu-action:active {
|
||||
@@ -979,6 +979,8 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.app-folder-icon {
|
||||
padding: 5px;
|
||||
spacing-rows: 5px;
|
||||
spacing-columns: 5px;
|
||||
}
|
||||
|
||||
.dash-item-container > StButton {
|
||||
@@ -1304,12 +1306,18 @@ StScrollBar StButton#vhandle:active {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
color: #eeeeec;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.datemenu-date-label:hover,
|
||||
.datemenu-date-label:focus {
|
||||
background-color: #999999;
|
||||
}
|
||||
|
||||
.datemenu-date-label:active {
|
||||
background-color: #aaaaaa;
|
||||
}
|
||||
|
||||
.calendar-day-base {
|
||||
font-size: 9pt;
|
||||
text-align: center;
|
||||
|
||||
@@ -17,17 +17,15 @@ packages. If you are interested in building GNOME Shell from source,
|
||||
we would recommend building from version control using the build
|
||||
script described at:
|
||||
|
||||
http://live.gnome.org/GnomeShell
|
||||
https://wiki.gnome.org/Projects/GnomeShell
|
||||
|
||||
Not only will that give you the very latest version of this rapidly
|
||||
changing project, it will be much easier than get GNOME Shell and
|
||||
its dependencies to build from tarballs.</description>
|
||||
<!--
|
||||
<homepage rdf:resource="http://live.gnome.org/GnomeShell" />
|
||||
-->
|
||||
<homepage rdf:resource="https://wiki.gnome.org/Projects/GnomeShell" />
|
||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
||||
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
|
||||
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
|
||||
<bug-database rdf:resource="https://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
|
||||
|
||||
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
||||
|
||||
|
||||
@@ -450,8 +450,7 @@ const AuthPrompt = new Lang.Class({
|
||||
// respond to the request with the username
|
||||
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
|
||||
} else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
|
||||
(this.smartcardDetected &&
|
||||
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) {
|
||||
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) {
|
||||
// We don't need to know the username if the user preempted the login screen
|
||||
// with a smartcard or with preauthenticated oVirt credentials
|
||||
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
|
||||
|
||||
@@ -36,6 +36,7 @@ const BoxPointer = imports.ui.boxpointer;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const GdmUtil = imports.gdm.util;
|
||||
const Layout = imports.ui.layout;
|
||||
const LoginManager = imports.misc.loginManager;
|
||||
const Main = imports.ui.main;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Realmd = imports.gdm.realmd;
|
||||
@@ -469,6 +470,19 @@ const LoginDialog = new Lang.Class({
|
||||
this._sessionMenuButton.actor.show();
|
||||
this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor);
|
||||
|
||||
this._disableUserList = undefined;
|
||||
this._userListLoaded = false;
|
||||
|
||||
LoginManager.getLoginManager().getCurrentSessionProxy(Lang.bind(this, this._gotGreeterSessionProxy));
|
||||
|
||||
// If the user list is enabled, it should take key focus; make sure the
|
||||
// screen shield is initialized first to prevent it from stealing the
|
||||
// focus later
|
||||
Main.layoutManager.connect('startup-complete',
|
||||
Lang.bind(this, this._updateDisableUserList));
|
||||
},
|
||||
|
||||
_ensureUserListLoaded: function() {
|
||||
if (!this._userManager.is_loaded)
|
||||
this._userManagerLoadedId = this._userManager.connect('notify::is-loaded',
|
||||
Lang.bind(this, function() {
|
||||
@@ -480,8 +494,7 @@ const LoginDialog = new Lang.Class({
|
||||
}));
|
||||
else
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList));
|
||||
|
||||
},
|
||||
},
|
||||
|
||||
_updateDisableUserList: function() {
|
||||
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
||||
@@ -524,9 +537,12 @@ const LoginDialog = new Lang.Class({
|
||||
return;
|
||||
|
||||
this._logoBin.destroy_all_children();
|
||||
if (this._logoFileUri)
|
||||
if (this._logoFileUri) {
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._logoBin.add_child(this._textureCache.load_uri_async(this._logoFileUri,
|
||||
-1, _LOGO_ICON_HEIGHT));
|
||||
-1, _LOGO_ICON_HEIGHT,
|
||||
scaleFactor));
|
||||
}
|
||||
},
|
||||
|
||||
_updateLogo: function() {
|
||||
@@ -625,6 +641,36 @@ const LoginDialog = new Lang.Class({
|
||||
this._showPrompt();
|
||||
},
|
||||
|
||||
_loginScreenSessionActivated: function() {
|
||||
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_SUCCEEDED)
|
||||
return;
|
||||
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: _FADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onUpdate: function() {
|
||||
let children = Main.layoutManager.uiGroup.get_children();
|
||||
|
||||
for (let i = 0; i < children.length; i++) {
|
||||
if (children[i] != Main.layoutManager.screenShieldGroup)
|
||||
children[i].opacity = this.actor.opacity;
|
||||
}
|
||||
},
|
||||
onUpdateScope: this,
|
||||
onComplete: function() {
|
||||
this._authPrompt.reset();
|
||||
},
|
||||
onCompleteScope: this });
|
||||
},
|
||||
|
||||
_gotGreeterSessionProxy: function(proxy) {
|
||||
proxy.connect('g-properties-changed', Lang.bind(this, function() {
|
||||
if (proxy.Active)
|
||||
this._loginScreenSessionActivated();
|
||||
}));
|
||||
},
|
||||
|
||||
_startSession: function(serviceName) {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
@@ -801,6 +847,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showUserList: function() {
|
||||
this._ensureUserListLoaded();
|
||||
this._authPrompt.hide();
|
||||
this._sessionMenuButton.close();
|
||||
this._setUserListExpanded(true);
|
||||
@@ -844,14 +891,17 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_loadUserList: function() {
|
||||
if (this._userListLoaded)
|
||||
return GLib.SOURCE_REMOVE;
|
||||
|
||||
this._userListLoaded = true;
|
||||
|
||||
let users = this._userManager.list_users();
|
||||
|
||||
for (let i = 0; i < users.length; i++) {
|
||||
this._userList.addUser(users[i]);
|
||||
}
|
||||
|
||||
this._updateDisableUserList();
|
||||
|
||||
this._userManager.connect('user-added',
|
||||
Lang.bind(this, function(userManager, user) {
|
||||
this._userList.addUser(user);
|
||||
@@ -861,6 +911,8 @@ const LoginDialog = new Lang.Class({
|
||||
Lang.bind(this, function(userManager, user) {
|
||||
this._userList.removeUser(user);
|
||||
}));
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
},
|
||||
|
||||
open: function() {
|
||||
|
||||
@@ -298,7 +298,7 @@ const ShellUserVerifier = new Lang.Class({
|
||||
|
||||
if (!this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
|
||||
smartcardDetected = false;
|
||||
else if (this.reauthenticating)
|
||||
else if (this._reauthOnly)
|
||||
smartcardDetected = this._smartcardManager.hasInsertedLoginToken();
|
||||
else
|
||||
smartcardDetected = this._smartcardManager.hasInsertedTokens();
|
||||
|
||||
@@ -39,6 +39,7 @@ const SystemdLoginSessionIface = '<node> \
|
||||
<interface name="org.freedesktop.login1.Session"> \
|
||||
<signal name="Lock" /> \
|
||||
<signal name="Unlock" /> \
|
||||
<property name="Active" type="b" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
|
||||
@@ -167,6 +167,8 @@ const AppSwitcherPopup = new Lang.Class({
|
||||
this._select(this._selectedIndex, this._nextWindow());
|
||||
else if (keysym == Clutter.Up)
|
||||
this._select(this._selectedIndex, null, true);
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
} else {
|
||||
if (keysym == Clutter.Left)
|
||||
this._select(this._previous());
|
||||
@@ -174,7 +176,11 @@ const AppSwitcherPopup = new Lang.Class({
|
||||
this._select(this._next());
|
||||
else if (keysym == Clutter.Down)
|
||||
this._select(this._selectedIndex, 0);
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_scrollHandler: function(direction) {
|
||||
@@ -403,7 +409,11 @@ const WindowSwitcherPopup = new Lang.Class({
|
||||
this._select(this._previous());
|
||||
else if (keysym == Clutter.Right)
|
||||
this._select(this._next());
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_finish: function() {
|
||||
|
||||
@@ -21,7 +21,9 @@ const Animation = new Lang.Class({
|
||||
this._isPlaying = false;
|
||||
this._timeoutId = 0;
|
||||
this._frame = 0;
|
||||
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height, scaleFactor,
|
||||
Lang.bind(this, this._animationsLoaded));
|
||||
this.actor.set_child(this._animations);
|
||||
},
|
||||
|
||||
@@ -99,6 +99,9 @@ const BaseAppView = new Lang.Class({
|
||||
else
|
||||
this._grid = new IconGrid.IconGrid(gridParams);
|
||||
|
||||
this._grid.connect('key-focus-in', Lang.bind(this, function(grid, actor) {
|
||||
this._keyFocusIn(actor);
|
||||
}));
|
||||
// Standard hack for ClutterBinLayout
|
||||
this._grid.actor.x_expand = true;
|
||||
|
||||
@@ -106,6 +109,10 @@ const BaseAppView = new Lang.Class({
|
||||
this._allItems = [];
|
||||
},
|
||||
|
||||
_keyFocusIn: function(actor) {
|
||||
// Nothing by default
|
||||
},
|
||||
|
||||
removeAll: function() {
|
||||
this._grid.destroyAll();
|
||||
this._items = {};
|
||||
@@ -558,7 +565,7 @@ const AllView = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_ensureIconVisible: function(icon) {
|
||||
_keyFocusIn: function(icon) {
|
||||
let itemPage = this._grid.getItemPage(icon);
|
||||
this.goToPage(itemPage);
|
||||
},
|
||||
@@ -929,19 +936,26 @@ const FolderView = new Lang.Class({
|
||||
this.actor.add_action(action);
|
||||
},
|
||||
|
||||
_keyFocusIn: function(actor) {
|
||||
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
||||
},
|
||||
|
||||
createFolderIcon: function(size) {
|
||||
let layout = new Clutter.TableLayout();
|
||||
let icon = new St.Widget({ layout_manager: layout,
|
||||
style_class: 'app-folder-icon' });
|
||||
layout.hookup_style(icon);
|
||||
let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
|
||||
|
||||
let aligns = [ Clutter.ActorAlign.START, Clutter.ActorAlign.END ];
|
||||
for (let i = 0; i < Math.min(this._allItems.length, 4); i++) {
|
||||
let texture = this._allItems[i].app.create_icon_texture(subSize);
|
||||
let bin = new St.Bin({ child: texture,
|
||||
x_expand: true, y_expand: true });
|
||||
bin.set_x_align(aligns[i % 2]);
|
||||
bin.set_y_align(aligns[Math.floor(i / 2)]);
|
||||
let numItems = this._allItems.length;
|
||||
for (let i = 0; i < 4; i++) {
|
||||
let bin;
|
||||
if (i < numItems) {
|
||||
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.pack(bin, i % 2, Math.floor(i / 2));
|
||||
}
|
||||
|
||||
|
||||
@@ -132,6 +132,25 @@ const BackgroundCache = new Lang.Class({
|
||||
this._removeContent(this._images, content);
|
||||
},
|
||||
|
||||
_attachCallerToFileLoad: function(caller, fileLoad) {
|
||||
fileLoad.callers.push(caller);
|
||||
|
||||
if (!caller.cancellable)
|
||||
return;
|
||||
|
||||
caller.cancellable.connect(Lang.bind(this, function() {
|
||||
let idx = fileLoad.callers.indexOf(caller);
|
||||
fileLoad.callers.splice(idx, 1);
|
||||
|
||||
if (fileLoad.callers.length == 0) {
|
||||
fileLoad.cancellable.cancel();
|
||||
|
||||
let idx = this._pendingFileLoads.indexOf(fileLoad);
|
||||
this._pendingFileLoads.splice(idx, 1);
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
_loadImageContent: function(params) {
|
||||
params = Params.parse(params, { monitorIndex: 0,
|
||||
style: null,
|
||||
@@ -140,27 +159,28 @@ const BackgroundCache = new Lang.Class({
|
||||
cancellable: null,
|
||||
onFinished: null });
|
||||
|
||||
let caller = { monitorIndex: params.monitorIndex,
|
||||
effects: params.effects,
|
||||
cancellable: params.cancellable,
|
||||
onFinished: params.onFinished };
|
||||
|
||||
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||
if (this._pendingFileLoads[i].filename == params.filename &&
|
||||
this._pendingFileLoads[i].style == params.style) {
|
||||
this._pendingFileLoads[i].callers.push({ shouldCopy: true,
|
||||
monitorIndex: params.monitorIndex,
|
||||
effects: params.effects,
|
||||
onFinished: params.onFinished });
|
||||
let fileLoad = this._pendingFileLoads[i];
|
||||
|
||||
if (fileLoad.filename == params.filename &&
|
||||
fileLoad.style == params.style) {
|
||||
this._attachCallerToFileLoad(caller, fileLoad);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this._pendingFileLoads.push({ filename: params.filename,
|
||||
style: params.style,
|
||||
callers: [{ shouldCopy: false,
|
||||
monitorIndex: params.monitorIndex,
|
||||
effects: params.effects,
|
||||
onFinished: params.onFinished }] });
|
||||
let fileLoad = { filename: params.filename,
|
||||
style: params.style,
|
||||
cancellable: new Gio.Cancellable(),
|
||||
callers: [] };
|
||||
this._attachCallerToFileLoad(caller, fileLoad);
|
||||
|
||||
let content = new Meta.Background({ meta_screen: global.screen,
|
||||
monitor: params.monitorIndex,
|
||||
effects: params.effects });
|
||||
let content = new Meta.Background({ meta_screen: global.screen });
|
||||
|
||||
content.load_file_async(params.filename,
|
||||
params.style,
|
||||
@@ -171,35 +191,26 @@ const BackgroundCache = new Lang.Class({
|
||||
content.load_file_finish(result);
|
||||
|
||||
this._monitorFile(params.filename);
|
||||
this._images.push(content);
|
||||
} catch(e) {
|
||||
content = null;
|
||||
}
|
||||
|
||||
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||
let pendingLoad = this._pendingFileLoads[i];
|
||||
if (pendingLoad.filename != params.filename ||
|
||||
pendingLoad.style != params.style)
|
||||
continue;
|
||||
for (let i = 0; i < fileLoad.callers.length; i++) {
|
||||
let caller = fileLoad.callers[i];
|
||||
if (caller.onFinished) {
|
||||
let newContent;
|
||||
|
||||
for (let j = 0; j < pendingLoad.callers.length; j++) {
|
||||
if (pendingLoad.callers[j].onFinished) {
|
||||
let newContent;
|
||||
|
||||
if (content && pendingLoad.callers[j].shouldCopy) {
|
||||
newContent = content.copy(pendingLoad.callers[j].monitorIndex,
|
||||
pendingLoad.callers[j].effects);
|
||||
this._images.push(newContent);
|
||||
} else {
|
||||
newContent = content;
|
||||
}
|
||||
|
||||
pendingLoad.callers[j].onFinished(newContent);
|
||||
if (content) {
|
||||
newContent = content.copy(caller.monitorIndex, caller.effects);
|
||||
this._images.push(newContent);
|
||||
}
|
||||
}
|
||||
|
||||
this._pendingFileLoads.splice(i, 1);
|
||||
caller.onFinished(newContent);
|
||||
}
|
||||
}
|
||||
|
||||
let idx = this._pendingFileLoads.indexOf(fileLoad);
|
||||
this._pendingFileLoads.splice(idx, 1);
|
||||
}));
|
||||
},
|
||||
|
||||
@@ -743,17 +754,18 @@ const BackgroundManager = new Lang.Class({
|
||||
Lang.bind(this, function() {
|
||||
newBackground.disconnect(newBackground.loadedSignalId);
|
||||
newBackground.loadedSignalId = 0;
|
||||
|
||||
if (this._newBackground != newBackground) {
|
||||
/* Not interesting, we queued another load */
|
||||
newBackground.actor.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
Tweener.addTween(this.background.actor,
|
||||
{ opacity: 0,
|
||||
time: FADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
if (this._newBackground != newBackground) {
|
||||
/* Not interesting, we queued another load */
|
||||
newBackground.actor.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
this.background.actor.destroy();
|
||||
this.background = newBackground;
|
||||
this._newBackground = null;
|
||||
|
||||
@@ -35,7 +35,7 @@ function addBackgroundMenu(actor, layoutManager) {
|
||||
|
||||
function openMenu() {
|
||||
let [x, y] = global.get_pointer();
|
||||
Main.layoutManager.setDummyCursorPosition(x, y);
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
||||
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
|
||||
}
|
||||
|
||||
|
||||
@@ -403,6 +403,8 @@ const Calendar = new Lang.Class({
|
||||
// Start off with the current date
|
||||
this._selectedDate = new Date();
|
||||
|
||||
this._shouldDateGrabFocus = false;
|
||||
|
||||
this.actor = new St.Table({ homogeneous: false,
|
||||
style_class: 'calendar',
|
||||
reactive: true });
|
||||
@@ -418,8 +420,10 @@ const Calendar = new Lang.Class({
|
||||
setEventSource: function(eventSource) {
|
||||
this._eventSource = eventSource;
|
||||
this._eventSource.connect('changed', Lang.bind(this, function() {
|
||||
this._rebuildCalendar();
|
||||
this._update();
|
||||
}));
|
||||
this._rebuildCalendar();
|
||||
this._update();
|
||||
},
|
||||
|
||||
@@ -548,6 +552,7 @@ const Calendar = new Lang.Class({
|
||||
_onSettingsChange: function() {
|
||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||
this._buildHeader();
|
||||
this._rebuildCalendar();
|
||||
this._update();
|
||||
},
|
||||
|
||||
@@ -607,7 +612,9 @@ const Calendar = new Lang.Class({
|
||||
|
||||
button._date = new Date(iter);
|
||||
button.connect('clicked', Lang.bind(this, function() {
|
||||
this._shouldDateGrabFocus = true;
|
||||
this.setDate(button._date);
|
||||
this._shouldDateGrabFocus = false;
|
||||
}));
|
||||
|
||||
let hasEvents = this._eventSource.hasEvents(iter);
|
||||
@@ -673,8 +680,11 @@ const Calendar = new Lang.Class({
|
||||
this._rebuildCalendar();
|
||||
|
||||
this._buttons.forEach(Lang.bind(this, function(button) {
|
||||
if (_sameDay(button._date, this._selectedDate))
|
||||
if (_sameDay(button._date, this._selectedDate)) {
|
||||
button.add_style_pseudo_class('active');
|
||||
if (this._shouldDateGrabFocus)
|
||||
button.grab_key_focus();
|
||||
}
|
||||
else
|
||||
button.remove_style_pseudo_class('active');
|
||||
}));
|
||||
|
||||
@@ -373,6 +373,12 @@ const VPNRequestHandler = new Lang.Class({
|
||||
argv.push('-i');
|
||||
if (flags & NMClient.SecretAgentGetSecretsFlags.REQUEST_NEW)
|
||||
argv.push('-r');
|
||||
if (authHelper.supportsHints) {
|
||||
for (let i = 0; i < hints.length; i++) {
|
||||
argv.push('-t');
|
||||
argv.push(hints[i]);
|
||||
}
|
||||
}
|
||||
|
||||
this._newStylePlugin = authHelper.externalUIMode;
|
||||
|
||||
@@ -510,10 +516,12 @@ const VPNRequestHandler = new Lang.Class({
|
||||
|
||||
_showNewStyleDialog: function() {
|
||||
let keyfile = new GLib.KeyFile();
|
||||
let data;
|
||||
let contentOverride;
|
||||
|
||||
try {
|
||||
let data = this._dataStdout.peek_buffer();
|
||||
data = this._dataStdout.peek_buffer();
|
||||
|
||||
keyfile.load_from_data(data.toString(), data.length,
|
||||
GLib.KeyFileFlags.NONE);
|
||||
|
||||
@@ -546,13 +554,16 @@ const VPNRequestHandler = new Lang.Class({
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
logError(e, 'error while reading VPN plugin output keyfile');
|
||||
// No output is a valid case it means "both secrets are stored"
|
||||
if (data.length > 0) {
|
||||
logError(e, 'error while reading VPN plugin output keyfile');
|
||||
|
||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||
return;
|
||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (contentOverride.secrets.length) {
|
||||
if (contentOverride && contentOverride.secrets.length) {
|
||||
// Only show the dialog if we actually have something to ask
|
||||
this._shellDialog = new NetworkSecretDialog(this._agent, this._requestId, this._connection, 'vpn', [], contentOverride);
|
||||
this._shellDialog.open(global.get_current_time());
|
||||
@@ -586,7 +597,15 @@ const NetworkAgent = new Lang.Class({
|
||||
Name: 'NetworkAgent',
|
||||
|
||||
_init: function() {
|
||||
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent' });
|
||||
try {
|
||||
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent',
|
||||
capabilities: NMClient.SecretAgentCapabilities.VPN_HINTS
|
||||
});
|
||||
} catch(e) {
|
||||
// Support older versions without NetworkAgent:capabilities
|
||||
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent'
|
||||
});
|
||||
}
|
||||
|
||||
this._dialogs = { };
|
||||
this._vpnRequests = { };
|
||||
@@ -686,16 +705,23 @@ const NetworkAgent = new Lang.Class({
|
||||
let service = keyfile.get_string('VPN Connection', 'service');
|
||||
let binary = keyfile.get_string('GNOME', 'auth-dialog');
|
||||
let externalUIMode = false;
|
||||
let hints = false;
|
||||
|
||||
try {
|
||||
externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode');
|
||||
} catch(e) { } // ignore errors if key does not exist
|
||||
|
||||
try {
|
||||
hints = keyfile.get_boolean('GNOME', 'supports-hints');
|
||||
} catch(e) { } // ignore errors if key does not exist
|
||||
|
||||
let path = binary;
|
||||
if (!GLib.path_is_absolute(path)) {
|
||||
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
|
||||
}
|
||||
|
||||
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE))
|
||||
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode };
|
||||
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
|
||||
else
|
||||
throw new Error('VPN plugin at %s is not executable'.format(path));
|
||||
} catch(e) {
|
||||
|
||||
@@ -1270,7 +1270,8 @@ const SubscriptionRequestNotification = new Lang.Class({
|
||||
|
||||
if (file) {
|
||||
let uri = file.get_uri();
|
||||
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size, scaleFactor);
|
||||
}
|
||||
else {
|
||||
iconBox.child = new St.Icon({ icon_name: 'avatar-default',
|
||||
@@ -1421,7 +1422,12 @@ const AccountNotification = new Lang.Class({
|
||||
if (status == Tp.ConnectionStatus.CONNECTED) {
|
||||
this.destroy();
|
||||
} else if (status == Tp.ConnectionStatus.DISCONNECTED) {
|
||||
this.update(this.title, this._getMessage(account.connection_error));
|
||||
let connectionError = account.connection_error;
|
||||
|
||||
if (connectionError == Tp.error_get_dbus_name(Tp.Error.CANCELLED))
|
||||
this.destroy();
|
||||
else
|
||||
this.update(this.title, this._getMessage(connectionError));
|
||||
}
|
||||
}));
|
||||
},
|
||||
|
||||
@@ -165,6 +165,10 @@ const CtrlAltTabPopup = new Lang.Class({
|
||||
this._select(this._previous());
|
||||
else if (keysym == Clutter.Right)
|
||||
this._select(this._next());
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_finish : function(time) {
|
||||
|
||||
@@ -63,9 +63,14 @@ const DateMenuButton = new Lang.Class({
|
||||
hbox.add(vbox);
|
||||
|
||||
// Date
|
||||
this._date = new St.Label({ style_class: 'datemenu-date-label',
|
||||
can_focus: true });
|
||||
vbox.add(this._date);
|
||||
this._date = new St.Button({ style_class: 'datemenu-date-label',
|
||||
can_focus: true,
|
||||
});
|
||||
this._date.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
this._calendar.setDate(new Date(), false);
|
||||
}));
|
||||
vbox.add(this._date, { x_fill: false });
|
||||
|
||||
this._eventList = new Calendar.EventsList();
|
||||
this._calendar = new Calendar.Calendar();
|
||||
@@ -186,7 +191,7 @@ const DateMenuButton = new Lang.Class({
|
||||
*/
|
||||
let dateFormat = _("%A %B %e, %Y");
|
||||
let displayDate = new Date();
|
||||
this._date.set_text(displayDate.toLocaleFormat(dateFormat));
|
||||
this._date.set_label(displayDate.toLocaleFormat(dateFormat));
|
||||
},
|
||||
|
||||
_getCalendarApp: function() {
|
||||
|
||||
@@ -5,6 +5,8 @@ imports.gi.versions.Gio = '2.0';
|
||||
imports.gi.versions.Gdk = '3.0';
|
||||
imports.gi.versions.GdkPixbuf = '2.0';
|
||||
imports.gi.versions.Gtk = '3.0';
|
||||
imports.gi.versions.TelepathyGLib = '0.12';
|
||||
imports.gi.versions.TelepathyLogger = '0.2';
|
||||
|
||||
const Clutter = imports.gi.Clutter;;
|
||||
const Gettext = imports.gettext;
|
||||
|
||||
@@ -32,11 +32,9 @@ const FocusCaretTracker = new Lang.Class({
|
||||
Name: 'FocusCaretTracker',
|
||||
|
||||
_init: function() {
|
||||
Atspi.init();
|
||||
Atspi.set_timeout(250, 250);
|
||||
|
||||
this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged));
|
||||
|
||||
this._atspiInited = false;
|
||||
this._focusListenerRegistered = false;
|
||||
this._caretListenerRegistered = false;
|
||||
},
|
||||
@@ -48,12 +46,20 @@ const FocusCaretTracker = new Lang.Class({
|
||||
this.emit('caret-moved', event);
|
||||
},
|
||||
|
||||
_initAtspi: function() {
|
||||
if (!this._atspiInited) {
|
||||
Atspi.init();
|
||||
Atspi.set_timeout(250, 250);
|
||||
this._atspiInited = true;
|
||||
}
|
||||
},
|
||||
|
||||
registerFocusListener: function() {
|
||||
if (this._focusListenerRegistered)
|
||||
return;
|
||||
|
||||
// Ignore the return value, we get an exception if they fail
|
||||
// And they should never fail
|
||||
this._initAtspi();
|
||||
|
||||
this._atspiListener.register(STATECHANGED + ':focused');
|
||||
this._atspiListener.register(STATECHANGED + ':selected');
|
||||
this._focusListenerRegistered = true;
|
||||
@@ -63,6 +69,8 @@ const FocusCaretTracker = new Lang.Class({
|
||||
if (this._caretListenerRegistered)
|
||||
return;
|
||||
|
||||
this._initAtspi();
|
||||
|
||||
this._atspiListener.register(CARETMOVED);
|
||||
this._caretListenerRegistered = true;
|
||||
},
|
||||
|
||||
@@ -155,7 +155,7 @@ const CandidatePopup = new Lang.Class({
|
||||
|
||||
panelService.connect('set-cursor-location',
|
||||
Lang.bind(this, function(ps, x, y, w, h) {
|
||||
Main.layoutManager.setDummyCursorPosition(x, y);
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
}));
|
||||
|
||||
@@ -214,6 +214,20 @@ const IconGrid = new Lang.Class({
|
||||
this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
||||
this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
||||
this._grid.connect('allocate', Lang.bind(this, this._allocate));
|
||||
this._grid.connect('actor-added', Lang.bind(this, this._childAdded));
|
||||
this._grid.connect('actor-removed', Lang.bind(this, this._childRemoved));
|
||||
},
|
||||
|
||||
_keyFocusIn: function(actor) {
|
||||
this.emit('key-focus-in', actor);
|
||||
},
|
||||
|
||||
_childAdded: function(grid, child) {
|
||||
child._iconGridKeyFocusInId = child.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||
},
|
||||
|
||||
_childRemoved: function(grid, child) {
|
||||
child.disconnect(child._iconGridKeyFocusInId);
|
||||
},
|
||||
|
||||
_getPreferredWidth: function (grid, forHeight, alloc) {
|
||||
@@ -527,6 +541,7 @@ const IconGrid = new Lang.Class({
|
||||
}
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(IconGrid.prototype);
|
||||
|
||||
const PaginatedIconGrid = new Lang.Class({
|
||||
Name: 'PaginatedIconGrid',
|
||||
|
||||
@@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
@@ -213,6 +212,10 @@ const LayoutManager = new Lang.Class({
|
||||
this.addChrome(this.trayBox);
|
||||
this._setupTrayPressure();
|
||||
|
||||
this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup',
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this.uiGroup.add_actor(this.modalDialogGroup);
|
||||
|
||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||
reactive: true,
|
||||
track_hover: true });
|
||||
@@ -220,7 +223,7 @@ const LayoutManager = new Lang.Class({
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position set in setDummyCursorPosition.
|
||||
// position and size set in setDummyCursorGeometry.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0 });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
|
||||
@@ -725,7 +728,7 @@ const LayoutManager = new Lang.Class({
|
||||
this._updateRegions();
|
||||
},
|
||||
|
||||
// setDummyCursorPosition:
|
||||
// setDummyCursorGeometry:
|
||||
//
|
||||
// The cursor dummy is a standard widget commonly used for popup
|
||||
// menus and box pointers to track, as the box pointer API only
|
||||
@@ -734,9 +737,10 @@ const LayoutManager = new Lang.Class({
|
||||
// is what you should use. Given that the menu should not track
|
||||
// the actual mouse pointer as it moves, you need to call this
|
||||
// function before you show the menu to ensure it is at the right
|
||||
// position.
|
||||
setDummyCursorPosition: function(x, y) {
|
||||
// position and has the right size.
|
||||
setDummyCursorGeometry: function(x, y, w, h) {
|
||||
this.dummyCursor.set_position(Math.round(x), Math.round(y));
|
||||
this.dummyCursor.set_size(Math.round(w), Math.round(h));
|
||||
},
|
||||
|
||||
// addChrome:
|
||||
@@ -907,8 +911,8 @@ const LayoutManager = new Lang.Class({
|
||||
return;
|
||||
|
||||
if (!this._updateRegionIdle)
|
||||
this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
|
||||
Meta.PRIORITY_BEFORE_REDRAW);
|
||||
this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||
Lang.bind(this, this._updateRegions));
|
||||
},
|
||||
|
||||
_getWindowActorsForWorkspace: function(workspace) {
|
||||
@@ -939,7 +943,7 @@ const LayoutManager = new Lang.Class({
|
||||
let rects = [], struts = [], i;
|
||||
|
||||
if (this._updateRegionIdle) {
|
||||
Mainloop.source_remove(this._updateRegionIdle);
|
||||
Meta.later_remove(this._updateRegionIdle);
|
||||
delete this._updateRegionIdle;
|
||||
}
|
||||
|
||||
@@ -1013,19 +1017,39 @@ const LayoutManager = new Lang.Class({
|
||||
continue;
|
||||
|
||||
// Ensure that the strut rects goes all the way to the screen edge,
|
||||
// as this really what mutter expects.
|
||||
// as this really what mutter expects. However skip this step
|
||||
// in cases where this would render an entire monitor unusable.
|
||||
switch (side) {
|
||||
case Meta.Side.TOP:
|
||||
y1 = 0;
|
||||
let hasMonitorsAbove = this.monitors.some(Lang.bind(this,
|
||||
function(mon) {
|
||||
return this._isAboveOrBelowPrimary(mon) &&
|
||||
mon.y < primary.y;
|
||||
}));
|
||||
if (!hasMonitorsAbove)
|
||||
y1 = 0;
|
||||
break;
|
||||
case Meta.Side.BOTTOM:
|
||||
y2 = global.screen_height;
|
||||
if (this.primaryIndex == this.bottomIndex)
|
||||
y2 = global.screen_height;
|
||||
break;
|
||||
case Meta.Side.LEFT:
|
||||
x1 = 0;
|
||||
let hasMonitorsLeft = this.monitors.some(Lang.bind(this,
|
||||
function(mon) {
|
||||
return !this._isAboveOrBelowPrimary(mon) &&
|
||||
mon.x < primary.x;
|
||||
}));
|
||||
if (!hasMonitorsLeft)
|
||||
x1 = 0;
|
||||
break;
|
||||
case Meta.Side.RIGHT:
|
||||
x2 = global.screen_width;
|
||||
let hasMonitorsRight = this.monitors.some(Lang.bind(this,
|
||||
function(mon) {
|
||||
return !this._isAboveOrBelowPrimary(mon) &&
|
||||
mon.x > primary.x;
|
||||
}));
|
||||
if (!hasMonitorsRight)
|
||||
x2 = global.screen_width;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,30 +11,60 @@ const Params = imports.misc.params;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
const DEFAULT_FADE_FACTOR = 0.4;
|
||||
const VIGNETTE_BRIGHTNESS = 0.8;
|
||||
const VIGNETTE_SHARPNESS = 0.7;
|
||||
|
||||
const GLSL_DIM_EFFECT_DECLARATIONS = '\
|
||||
float compute_dim_factor (const vec2 coords) {\
|
||||
vec2 dist = coords - vec2(0.5, 0.5); \
|
||||
float elipse_radius = 0.5; \
|
||||
/* interpolate darkening value, based on distance from screen center */ \
|
||||
float val = min(length(dist), elipse_radius); \
|
||||
return mix(0.3, 1.0, val / elipse_radius) * 0.4; \
|
||||
}';
|
||||
const GLSL_DIM_EFFECT_CODE = '\
|
||||
float a = compute_dim_factor (cogl_tex_coord0_in.xy);\
|
||||
cogl_color_out = vec4(0, 0, 0, cogl_color_in.a * a);'
|
||||
;
|
||||
const VIGNETTE_DECLARATIONS = '\
|
||||
uniform float brightness;\n\
|
||||
uniform float vignette_sharpness;\n';
|
||||
|
||||
const VIGNETTE_CODE = '\
|
||||
cogl_color_out.a = cogl_color_in.a;\n\
|
||||
cogl_color_out.rgb = vec3(0.0, 0.0, 0.0);\n\
|
||||
vec2 position = cogl_tex_coord_in[0].xy - 0.5;\n\
|
||||
float t = length(2.0 * position);\n\
|
||||
t = clamp(t, 0.0, 1.0);\n\
|
||||
float pixel_brightness = mix(1.0, 1.0 - vignette_sharpness, t);\n\
|
||||
cogl_color_out.a = cogl_color_out.a * (1 - pixel_brightness * brightness);';
|
||||
|
||||
const RadialShaderQuad = new Lang.Class({
|
||||
Name: 'RadialShaderQuad',
|
||||
Extends: Shell.GLSLQuad,
|
||||
|
||||
_init: function(params) {
|
||||
this.parent(params);
|
||||
|
||||
this._brightnessLocation = this.get_uniform_location('brightness');
|
||||
this._sharpnessLocation = this.get_uniform_location('vignette_sharpness');
|
||||
|
||||
this.brightness = 1.0;
|
||||
this.vignetteSharpness = 0.0;
|
||||
},
|
||||
|
||||
vfunc_build_pipeline: function() {
|
||||
this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT,
|
||||
GLSL_DIM_EFFECT_DECLARATIONS,
|
||||
GLSL_DIM_EFFECT_CODE,
|
||||
true);
|
||||
VIGNETTE_DECLARATIONS, VIGNETTE_CODE, true);
|
||||
},
|
||||
|
||||
get brightness() {
|
||||
return this._brightness;
|
||||
},
|
||||
|
||||
set brightness(v) {
|
||||
this._brightness = v;
|
||||
this.set_uniform_float(this._brightnessLocation,
|
||||
1, [this._brightness]);
|
||||
},
|
||||
|
||||
get vignetteSharpness() {
|
||||
return this._sharpness;
|
||||
},
|
||||
|
||||
set vignetteSharpness(v) {
|
||||
this._sharpness = v;
|
||||
this.set_uniform_float(this._sharpnessLocation,
|
||||
1, [this._sharpness]);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -75,13 +105,15 @@ const Lightbox = new Lang.Class({
|
||||
this._container = container;
|
||||
this._children = container.get_children();
|
||||
this._fadeFactor = params.fadeFactor;
|
||||
if (params.radialEffect)
|
||||
this._radialEffect = Clutter.feature_available(Clutter.FeatureFlags.SHADERS_GLSL) && params.radialEffect;
|
||||
if (this._radialEffect)
|
||||
this.actor = new RadialShaderQuad({ x: 0,
|
||||
y: 0,
|
||||
reactive: params.inhibitEvents });
|
||||
else
|
||||
this.actor = new St.Bin({ x: 0,
|
||||
y: 0,
|
||||
opacity: 0,
|
||||
style_class: 'lightbox',
|
||||
reactive: params.inhibitEvents });
|
||||
|
||||
@@ -133,9 +165,18 @@ const Lightbox = new Lang.Class({
|
||||
fadeInTime = fadeInTime || 0;
|
||||
|
||||
Tweener.removeTweens(this.actor);
|
||||
if (fadeInTime != 0) {
|
||||
this.shown = false;
|
||||
this.actor.opacity = 0;
|
||||
if (this._radialEffect) {
|
||||
Tweener.addTween(this.actor,
|
||||
{ brightness: VIGNETTE_BRIGHTNESS,
|
||||
vignetteSharpness: VIGNETTE_SHARPNESS,
|
||||
time: fadeInTime,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.shown = true;
|
||||
this.emit('shown');
|
||||
})
|
||||
});
|
||||
} else {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255 * this._fadeFactor,
|
||||
time: fadeInTime,
|
||||
@@ -145,11 +186,8 @@ const Lightbox = new Lang.Class({
|
||||
this.emit('shown');
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.actor.opacity = 255 * this._fadeFactor;
|
||||
this.shown = true;
|
||||
this.emit('shown');
|
||||
}
|
||||
|
||||
this.actor.show();
|
||||
},
|
||||
|
||||
@@ -158,7 +196,18 @@ const Lightbox = new Lang.Class({
|
||||
|
||||
this.shown = false;
|
||||
Tweener.removeTweens(this.actor);
|
||||
if (fadeOutTime != 0) {
|
||||
if (this._radialEffect) {
|
||||
Tweener.addTween(this.actor,
|
||||
{ brightness: 1.0,
|
||||
vignetteSharpness: 0.0,
|
||||
opacity: 0,
|
||||
time: fadeOutTime,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.actor.hide();
|
||||
})
|
||||
});
|
||||
} else {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: fadeOutTime,
|
||||
@@ -167,8 +216,6 @@ const Lightbox = new Lang.Class({
|
||||
this.actor.hide();
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.actor.hide();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@ const CHEVRON = '>>> ';
|
||||
/* Imports...feel free to add here as needed */
|
||||
var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
|
||||
'const GLib = imports.gi.GLib; ' +
|
||||
'const GObject = imports.gi.GObject; ' +
|
||||
'const Gio = imports.gi.Gio; ' +
|
||||
'const Gtk = imports.gi.Gtk; ' +
|
||||
'const Mainloop = imports.mainloop; ' +
|
||||
'const Meta = imports.gi.Meta; ' +
|
||||
|
||||
@@ -1162,8 +1162,10 @@ const SourceActor = new Lang.Class({
|
||||
}));
|
||||
this._actorDestroyed = false;
|
||||
|
||||
let scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
this._iconBin = new St.Bin({ x_fill: true,
|
||||
y_fill: true });
|
||||
height: size * scale_factor,
|
||||
width: size * scale_factor });
|
||||
|
||||
this.actor.add_actor(this._iconBin);
|
||||
|
||||
@@ -2025,13 +2027,18 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
_onNotificationKeyRelease: function(actor, event) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
|
||||
this._closeNotification();
|
||||
this._expireNotification();
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_expireNotification: function() {
|
||||
this._notificationExpired = true;
|
||||
this._updateState();
|
||||
},
|
||||
|
||||
_closeNotification: function() {
|
||||
if (this._notificationState == State.SHOWN) {
|
||||
this._closeButton.hide();
|
||||
@@ -2396,7 +2403,7 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationTimeoutId == 0 &&
|
||||
this._notification.urgency != Urgency.CRITICAL &&
|
||||
!this._notification.focused &&
|
||||
!this._pointerInNotification);
|
||||
!this._pointerInNotification) || this._notificationExpired;
|
||||
let mustClose = (this._notificationRemoved || !hasNotifications || expired || this._traySummoned);
|
||||
|
||||
if (mustClose) {
|
||||
@@ -2457,6 +2464,10 @@ const MessageTray = new Lang.Class({
|
||||
this._hideDesktopClone();
|
||||
|
||||
this._updatingState = false;
|
||||
|
||||
// Clean transient variables that are used to communicate actions
|
||||
// to updateState()
|
||||
this._notificationExpired = false;
|
||||
},
|
||||
|
||||
_tween: function(actor, statevar, value, params) {
|
||||
@@ -2779,7 +2790,12 @@ const MessageTray = new Lang.Class({
|
||||
{ y: expandedY,
|
||||
opacity: 255,
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
transition: 'easeOutQuad',
|
||||
// HACK: Drive the state machine here better,
|
||||
// instead of overwriting tweens
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this._notificationState = State.SHOWN;
|
||||
}),
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
@@ -41,7 +41,6 @@ const ModalDialog = new Lang.Class({
|
||||
_init: function(params) {
|
||||
params = Params.parse(params, { shellReactive: false,
|
||||
styleClass: null,
|
||||
parentActor: Main.uiGroup,
|
||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||
shouldFadeIn: true,
|
||||
destroyOnClose: true });
|
||||
@@ -57,7 +56,7 @@ const ModalDialog = new Lang.Class({
|
||||
x: 0,
|
||||
y: 0,
|
||||
accessible_role: Atk.Role.DIALOG });
|
||||
params.parentActor.add_actor(this._group);
|
||||
Main.layoutManager.modalDialogGroup.add_actor(this._group);
|
||||
|
||||
let constraint = new Clutter.BindConstraint({ source: global.stage,
|
||||
coordinate: Clutter.BindCoordinate.ALL });
|
||||
|
||||
@@ -691,6 +691,12 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const PRIORITY_URGENCY_MAP = {
|
||||
low: MessageTray.Urgency.LOW,
|
||||
normal: MessageTray.Urgency.NORMAL,
|
||||
high: MessageTray.Urgency.HIGH,
|
||||
urgent: MessageTray.Urgency.CRITICAL
|
||||
};
|
||||
|
||||
const GtkNotificationDaemonNotification = new Lang.Class({
|
||||
Name: 'GtkNotificationDaemonNotification',
|
||||
@@ -704,12 +710,20 @@ const GtkNotificationDaemonNotification = new Lang.Class({
|
||||
"body": body,
|
||||
"icon": gicon,
|
||||
"urgent": urgent,
|
||||
"priority": priority,
|
||||
"buttons": buttons,
|
||||
"default-action": defaultAction,
|
||||
"default-action-target": defaultActionTarget } = notification;
|
||||
|
||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
||||
: MessageTray.Urgency.NORMAL);
|
||||
if (priority) {
|
||||
let urgency = PRIORITY_URGENCY_MAP[priority.unpack()];
|
||||
this.setUrgency(urgency != undefined ? urgency : MessageTray.Urgency.NORMAL);
|
||||
} else if (urgent) {
|
||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
||||
: MessageTray.Urgency.NORMAL);
|
||||
} else {
|
||||
this.setUrgency(MessageTray.Urgency.NORMAL);
|
||||
}
|
||||
|
||||
if (buttons) {
|
||||
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
||||
|
||||
@@ -125,7 +125,7 @@ const OsdWindow = new Lang.Class({
|
||||
|
||||
setLevel: function(level) {
|
||||
this._level.actor.visible = (level != undefined);
|
||||
if (level) {
|
||||
if (level != undefined) {
|
||||
if (this.actor.visible)
|
||||
Tweener.addTween(this._level,
|
||||
{ level: level,
|
||||
|
||||
@@ -14,6 +14,7 @@ const Gdk = imports.gi.Gdk;
|
||||
const Background = imports.ui.background;
|
||||
const DND = imports.ui.dnd;
|
||||
const LayoutManager = imports.ui.layout;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const OverviewControls = imports.ui.overviewControls;
|
||||
@@ -196,11 +197,7 @@ const Overview = new Lang.Class({
|
||||
|
||||
Tweener.addTween(background,
|
||||
{ brightness: 1.0,
|
||||
time: SHADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
Tweener.addTween(background,
|
||||
{ vignetteSharpness: 0.0,
|
||||
vignetteSharpness: 0.0,
|
||||
time: SHADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
@@ -213,12 +210,8 @@ const Overview = new Lang.Class({
|
||||
let background = backgrounds[i]._delegate;
|
||||
|
||||
Tweener.addTween(background,
|
||||
{ brightness: 0.8,
|
||||
time: SHADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
Tweener.addTween(background,
|
||||
{ vignetteSharpness: 0.7,
|
||||
{ brightness: Lightbox.VIGNETTE_BRIGHTNESS,
|
||||
vignetteSharpness: Lightbox.VIGNETTE_SHARPNESS,
|
||||
time: SHADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
@@ -301,7 +301,7 @@ const NotificationsBox = new Lang.Class({
|
||||
});
|
||||
|
||||
this._updateVisibility();
|
||||
Shell.util_wake_up_screen();
|
||||
this.emit('wake-up-screen');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -327,7 +327,7 @@ const NotificationsBox = new Lang.Class({
|
||||
|
||||
this._updateVisibility();
|
||||
if (obj.sourceBox.visible)
|
||||
Shell.util_wake_up_screen();
|
||||
this.emit('wake-up-screen');
|
||||
},
|
||||
|
||||
_visibleChanged: function(source, obj) {
|
||||
@@ -342,7 +342,7 @@ const NotificationsBox = new Lang.Class({
|
||||
|
||||
this._updateVisibility();
|
||||
if (obj.sourceBox.visible)
|
||||
Shell.util_wake_up_screen();
|
||||
this.emit('wake-up-screen');
|
||||
},
|
||||
|
||||
_detailedChanged: function(source, obj) {
|
||||
@@ -380,6 +380,7 @@ const NotificationsBox = new Lang.Class({
|
||||
this._sources.delete(source);
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(NotificationsBox.prototype);
|
||||
|
||||
const Arrow = new Lang.Class({
|
||||
Name: 'Arrow',
|
||||
@@ -536,7 +537,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._smartcardManager = SmartcardManager.getSmartcardManager();
|
||||
this._smartcardManager.connect('smartcard-inserted',
|
||||
Lang.bind(this, function(token) {
|
||||
Lang.bind(this, function(manager, token) {
|
||||
if (this._isLocked && token.UsedToLogin)
|
||||
this._liftShield(true, 0);
|
||||
}));
|
||||
@@ -728,7 +729,7 @@ const ScreenShield = new Lang.Class({
|
||||
} else {
|
||||
this._inhibitSuspend();
|
||||
|
||||
this._onUserBecameActive();
|
||||
this._wakeUpScreen();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -900,17 +901,11 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
showDialog: function() {
|
||||
// Ensure that the stage window is mapped, before taking a grab
|
||||
// otherwise X errors out
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
||||
if (!this._becomeModal()) {
|
||||
// In the login screen, this is a hard error. Fail-whale
|
||||
log('Could not acquire modal grab for the login screen. Aborting login process.');
|
||||
Meta.quit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
|
||||
return false;
|
||||
}));
|
||||
if (!this._becomeModal()) {
|
||||
// In the login screen, this is a hard error. Fail-whale
|
||||
log('Could not acquire modal grab for the login screen. Aborting login process.');
|
||||
Meta.quit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
|
||||
this.actor.show();
|
||||
this._isGreeter = Main.sessionMode.isGreeter;
|
||||
@@ -1151,6 +1146,7 @@ const ScreenShield = new Lang.Class({
|
||||
this._lockScreenContents.add_actor(this._lockScreenContentsBox);
|
||||
|
||||
this._notificationsBox = new NotificationsBox();
|
||||
this._wakeUpScreenId = this._notificationsBox.connect('wake-up-screen', Lang.bind(this, this._wakeUpScreen));
|
||||
this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true,
|
||||
y_fill: true,
|
||||
expand: true });
|
||||
@@ -1158,11 +1154,17 @@ const ScreenShield = new Lang.Class({
|
||||
this._hasLockScreen = true;
|
||||
},
|
||||
|
||||
_wakeUpScreen: function() {
|
||||
this._onUserBecameActive();
|
||||
this.emit('wake-up-screen');
|
||||
},
|
||||
|
||||
_clearLockScreen: function() {
|
||||
this._clock.destroy();
|
||||
this._clock = null;
|
||||
|
||||
if (this._notificationsBox) {
|
||||
this._notificationsBox.disconnect(this._wakeUpScreenId);
|
||||
this._notificationsBox.destroy();
|
||||
this._notificationsBox = null;
|
||||
}
|
||||
|
||||
@@ -67,6 +67,13 @@ const ScreenshotService = new Lang.Class({
|
||||
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||
},
|
||||
|
||||
_checkArea: function(x, y, width, height) {
|
||||
return x >= 0 && y >= 0 &&
|
||||
width > 0 && height > 0 &&
|
||||
x + width <= global.screen_width &&
|
||||
y + height <= global.screen_height;
|
||||
},
|
||||
|
||||
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
|
||||
if (flash && result) {
|
||||
let flashspot = new Flashspot(area);
|
||||
@@ -77,13 +84,31 @@ const ScreenshotService = new Lang.Class({
|
||||
invocation.return_value(retval);
|
||||
},
|
||||
|
||||
_scaleArea: function(x, y, width, height) {
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
x *= scaleFactor;
|
||||
y *= scaleFactor;
|
||||
width *= scaleFactor;
|
||||
height *= scaleFactor;
|
||||
return [x, y, width, height];
|
||||
},
|
||||
|
||||
_unscaleArea: function(x, y, width, height) {
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
x /= scaleFactor;
|
||||
y /= scaleFactor;
|
||||
width /= scaleFactor;
|
||||
height /= scaleFactor;
|
||||
return [x, y, width, height];
|
||||
},
|
||||
|
||||
ScreenshotAreaAsync : function (params, invocation) {
|
||||
let [x, y, width, height, flash, filename, callback] = params;
|
||||
if (x < 0 || y < 0 ||
|
||||
width <= 0 || height <= 0 ||
|
||||
x + width > global.screen_width || y + height > global.screen_height) {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||
"Invalid params");
|
||||
[x, y, width, height] = this._scaleArea(x, y, width, height);
|
||||
if (!this._checkArea(x, y, width, height)) {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum,
|
||||
Gio.IOErrorEnum.CANCELLED,
|
||||
"Invalid params");
|
||||
return;
|
||||
}
|
||||
let screenshot = new Shell.Screenshot();
|
||||
@@ -114,9 +139,9 @@ const ScreenshotService = new Lang.Class({
|
||||
selectArea.connect('finished', Lang.bind(this,
|
||||
function(selectArea, areaRectangle) {
|
||||
if (areaRectangle) {
|
||||
let retval = GLib.Variant.new('(iiii)',
|
||||
[areaRectangle.x, areaRectangle.y,
|
||||
areaRectangle.width, areaRectangle.height]);
|
||||
let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y,
|
||||
areaRectangle.width, areaRectangle.height);
|
||||
let retval = GLib.Variant.new('(iiii)', retRectangle);
|
||||
invocation.return_value(retval);
|
||||
} else {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||
@@ -125,9 +150,18 @@ const ScreenshotService = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
FlashArea: function(x, y, width, height) {
|
||||
FlashAreaAsync: function(params, invocation) {
|
||||
let [x, y, width, height] = params;
|
||||
[x, y, width, height] = this._scaleArea(x, y, width, height);
|
||||
if (!this._checkArea(x, y, width, height)) {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum,
|
||||
Gio.IOErrorEnum.CANCELLED,
|
||||
"Invalid params");
|
||||
return;
|
||||
}
|
||||
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
|
||||
flashspot.fire();
|
||||
invocation.return_value(null);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -68,6 +68,9 @@ const SearchSystem = new Lang.Class({
|
||||
_unregisterProvider: function (provider) {
|
||||
let index = this._providers.indexOf(provider);
|
||||
this._providers.splice(index, 1);
|
||||
|
||||
if (provider.display)
|
||||
provider.display.destroy();
|
||||
},
|
||||
|
||||
getProviders: function() {
|
||||
@@ -315,6 +318,8 @@ const SearchResultsBase = new Lang.Class({
|
||||
},
|
||||
|
||||
clear: function() {
|
||||
for (let resultId in this._resultDisplays)
|
||||
this._resultDisplays[resultId].actor.destroy();
|
||||
this._resultDisplays = {};
|
||||
this._clearResultDisplay();
|
||||
this.actor.hide();
|
||||
@@ -338,12 +343,22 @@ const SearchResultsBase = new Lang.Class({
|
||||
}));
|
||||
|
||||
if (metasNeeded.length === 0) {
|
||||
callback();
|
||||
callback(true);
|
||||
} else {
|
||||
this._cancellable.cancel();
|
||||
this._cancellable.reset();
|
||||
|
||||
this.provider.getResultMetas(metasNeeded, Lang.bind(this, function(metas) {
|
||||
if (metas.length == 0) {
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
if (metas.length != metasNeeded.length) {
|
||||
log('Wrong number of result metas returned by search provider');
|
||||
callback(false);
|
||||
return;
|
||||
}
|
||||
|
||||
metasNeeded.forEach(Lang.bind(this, function(resultId, i) {
|
||||
let meta = metas[i];
|
||||
let display = this._createResultDisplay(meta);
|
||||
@@ -351,7 +366,7 @@ const SearchResultsBase = new Lang.Class({
|
||||
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||
this._resultDisplays[resultId] = display;
|
||||
}));
|
||||
callback();
|
||||
callback(true);
|
||||
}), this._cancellable);
|
||||
}
|
||||
},
|
||||
@@ -368,8 +383,10 @@ const SearchResultsBase = new Lang.Class({
|
||||
let results = this.provider.filterResults(providerResults, maxResults);
|
||||
let hasMoreResults = results.length < providerResults.length;
|
||||
|
||||
this._ensureResultActors(results, Lang.bind(this, function() {
|
||||
this._ensureResultActors(results, Lang.bind(this, function(successful) {
|
||||
this._clearResultDisplay();
|
||||
if (!successful)
|
||||
return;
|
||||
|
||||
// To avoid CSS transitions causing flickering when
|
||||
// the first search result stays the same, we hide the
|
||||
@@ -615,8 +632,11 @@ const SearchResults = new Lang.Class({
|
||||
if (newDefaultResult != this._defaultResult) {
|
||||
if (this._defaultResult)
|
||||
this._defaultResult.setSelected(false);
|
||||
if (newDefaultResult)
|
||||
if (newDefaultResult) {
|
||||
newDefaultResult.setSelected(this._highlightDefault);
|
||||
if (this._highlightDefault)
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, newDefaultResult.actor);
|
||||
}
|
||||
|
||||
this._defaultResult = newDefaultResult;
|
||||
}
|
||||
@@ -653,8 +673,11 @@ const SearchResults = new Lang.Class({
|
||||
|
||||
highlightDefault: function(highlight) {
|
||||
this._highlightDefault = highlight;
|
||||
if (this._defaultResult)
|
||||
if (this._defaultResult) {
|
||||
this._defaultResult.setSelected(highlight);
|
||||
if (highlight)
|
||||
Util.ensureActorVisibleInScrollView(this._scrollView, this._defaultResult.actor);
|
||||
}
|
||||
},
|
||||
|
||||
navigateFocus: function(direction) {
|
||||
|
||||
@@ -69,6 +69,7 @@ const ScreenSaverIface = '<node> \
|
||||
<signal name="ActiveChanged"> \
|
||||
<arg name="new_value" type="b" /> \
|
||||
</signal> \
|
||||
<signal name="WakeUpScreen" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
@@ -371,8 +372,10 @@ const GnomeShellExtensions = new Lang.Class({
|
||||
LaunchExtensionPrefs: function(uuid) {
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');
|
||||
app.launch(global.display.get_current_time_roundtrip(),
|
||||
['extension:///' + uuid], -1, null);
|
||||
let info = app.get_app_info();
|
||||
let timestamp = global.display.get_current_time_roundtrip();
|
||||
info.launch_uris(['extension:///' + uuid],
|
||||
global.create_app_launch_context(timestamp, -1));
|
||||
},
|
||||
|
||||
ReloadExtension: function(uuid) {
|
||||
@@ -405,6 +408,9 @@ const ScreenSaverDBus = new Lang.Class({
|
||||
screenShield.connect('active-changed', Lang.bind(this, function(shield) {
|
||||
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
|
||||
}));
|
||||
screenShield.connect('wake-up-screen', Lang.bind(this, function(shield) {
|
||||
this._dbusImpl.emit_signal('WakeUpScreen', null);
|
||||
}));
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
|
||||
|
||||
@@ -17,6 +17,7 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill';
|
||||
const RfkillManagerInterface = '<node> \
|
||||
<interface name="org.gnome.SettingsDaemon.Rfkill"> \
|
||||
<property name="BluetoothAirplaneMode" type="b" access="readwrite" /> \
|
||||
<property name="BluetoothHasAirplaneMode" type="b" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
@@ -58,6 +59,7 @@ const Indicator = new Lang.Class({
|
||||
this._model.connect('row-changed', Lang.bind(this, this._sync));
|
||||
this._model.connect('row-deleted', Lang.bind(this, this._sync));
|
||||
this._model.connect('row-inserted', Lang.bind(this, this._sync));
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sync));
|
||||
this._sync();
|
||||
},
|
||||
|
||||
@@ -92,9 +94,11 @@ const Indicator = new Lang.Class({
|
||||
|
||||
_sync: function() {
|
||||
let nDevices = this._getNConnectedDevices();
|
||||
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
|
||||
this.menu.setSensitive(sensitive);
|
||||
this._indicator.visible = nDevices > 0;
|
||||
this._item.actor.visible = !this._proxy.BluetoothAirplaneMode;
|
||||
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
|
||||
if (nDevices > 0)
|
||||
this._item.status.text = ngettext("%d Connected Device", "%d Connected Devices", nDevices).format(nDevices);
|
||||
|
||||
@@ -292,6 +292,10 @@ const InputSourcePopup = new Lang.Class({
|
||||
this._select(this._previous());
|
||||
else if (keysym == Clutter.Right)
|
||||
this._select(this._next());
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_finish : function() {
|
||||
|
||||
@@ -4,9 +4,10 @@ const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Shell = imports.gi.Shell;
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const LOCATION_SCHEMA = 'org.gnome.shell.location';
|
||||
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
|
||||
@@ -52,14 +53,11 @@ const Indicator = new Lang.Class({
|
||||
this._item = new PopupMenu.PopupSubMenuMenuItem(_("Location"), true);
|
||||
this._item.icon.icon_name = 'find-location-symbolic';
|
||||
|
||||
var credentials = new Gio.Credentials();
|
||||
var uid = credentials.get_unix_user();
|
||||
this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this);
|
||||
this._agent.export(Gio.DBus.system,
|
||||
'/org/freedesktop/GeoClue2/Agent/' + uid);
|
||||
this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent');
|
||||
|
||||
this._item.status.text = _("On");
|
||||
this._onOffAction = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, this._onOnOffAction));
|
||||
this._item.status.text = _("Enabled");
|
||||
this._onOffAction = this._item.menu.addAction(_("Disable"), Lang.bind(this, this._onOnOffAction));
|
||||
|
||||
this.menu.addMenuItem(this._item);
|
||||
|
||||
@@ -68,6 +66,8 @@ const Indicator = new Lang.Class({
|
||||
0,
|
||||
Lang.bind(this, this._connectToGeoclue),
|
||||
Lang.bind(this, this._onGeoclueVanished));
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._onSessionUpdated));
|
||||
this._onSessionUpdated();
|
||||
this._onMaxAccuracyLevelChanged();
|
||||
this._connectToGeoclue();
|
||||
},
|
||||
@@ -97,6 +97,7 @@ const Indicator = new Lang.Class({
|
||||
}
|
||||
|
||||
this._indicator.visible = this._proxy.InUse;
|
||||
this._updateMenuLabels();
|
||||
},
|
||||
|
||||
_connectToGeoclue: function() {
|
||||
@@ -122,7 +123,7 @@ const Indicator = new Lang.Class({
|
||||
this._propertiesChangedId = this._proxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._onGeocluePropsChanged));
|
||||
|
||||
this._updateMenu();
|
||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
||||
this._syncIndicator();
|
||||
|
||||
this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
|
||||
@@ -153,14 +154,23 @@ const Indicator = new Lang.Class({
|
||||
this._settings.set_enum(MAX_ACCURACY_LEVEL, 0);
|
||||
},
|
||||
|
||||
_onMaxAccuracyLevelChanged: function() {
|
||||
_onSessionUpdated: function() {
|
||||
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
this.menu.setSensitive(sensitive);
|
||||
},
|
||||
|
||||
_updateMenuLabels: function() {
|
||||
if (this._getMaxAccuracyLevel() == 0) {
|
||||
this._item.status.text = _("Off");
|
||||
this._onOffAction.label.text = _("Turn On");
|
||||
this._item.status.text = _("Disabled");
|
||||
this._onOffAction.label.text = _("Enable");
|
||||
} else {
|
||||
this._item.status.text = _("On");
|
||||
this._onOffAction.label.text = _("Turn Off");
|
||||
this._item.status.text = this._indicator.visible ? _("In Use") : _("Enabled");
|
||||
this._onOffAction.label.text = _("Disable");
|
||||
}
|
||||
},
|
||||
|
||||
_onMaxAccuracyLevelChanged: function() {
|
||||
this._updateMenuLabels();
|
||||
|
||||
// Gotta ensure geoclue is up and we are registered as agent to it
|
||||
// before we emit the notify for this property change.
|
||||
@@ -177,17 +187,12 @@ const Indicator = new Lang.Class({
|
||||
this._agent.emit_property_changed('MaxAccuracyLevel', variant);
|
||||
},
|
||||
|
||||
_updateMenu: function() {
|
||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
||||
this.menu.actor.visible = (this._availableAccuracyLevel != 0);
|
||||
},
|
||||
|
||||
_onGeocluePropsChanged: function(proxy, properties) {
|
||||
let unpacked = properties.deep_unpack();
|
||||
if ("InUse" in unpacked)
|
||||
this._syncIndicator();
|
||||
if ("AvailableAccuracyLevel" in unpacked)
|
||||
this._updateMenu();
|
||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -236,16 +236,6 @@ const NMConnectionSection = new Lang.Class({
|
||||
return this.getIndicatorIcon();
|
||||
},
|
||||
|
||||
_getStatus: function() {
|
||||
let values = this._connectionItems.values();
|
||||
for (let item of values) {
|
||||
if (item.isActive())
|
||||
return item.getName();
|
||||
}
|
||||
|
||||
return _("Off");
|
||||
},
|
||||
|
||||
getConnectLabel: function() {
|
||||
return _("Connect");
|
||||
},
|
||||
@@ -303,8 +293,13 @@ const NMConnectionSection = new Lang.Class({
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
this._connectionItems.get(connection.get_uuid()).destroy();
|
||||
this._connectionItems.delete(connection.get_uuid());
|
||||
let uuid = connection.get_uuid();
|
||||
let item = this._connectionItems.get(uuid);
|
||||
if (item == undefined)
|
||||
return;
|
||||
|
||||
item.destroy();
|
||||
this._connectionItems.delete(uuid);
|
||||
|
||||
let pos = this._connections.indexOf(connection);
|
||||
this._connections.splice(pos, 1);
|
||||
@@ -424,7 +419,7 @@ const NMConnectionDevice = new Lang.Class({
|
||||
case NetworkManager.DeviceState.DISCONNECTED:
|
||||
return _("Off");
|
||||
case NetworkManager.DeviceState.ACTIVATED:
|
||||
return this.parent();
|
||||
return _("Connected");
|
||||
case NetworkManager.DeviceState.UNMANAGED:
|
||||
/* Translators: this is for network devices that are physically present but are not
|
||||
under NetworkManager's control (and thus cannot be used in the menu) */
|
||||
@@ -1175,6 +1170,10 @@ const NMDeviceWireless = new Lang.Class({
|
||||
this._client.disconnect(this._wirelessHwEnabledChangedId);
|
||||
this._wirelessHwEnabledChangedId = 0;
|
||||
}
|
||||
if (this._dialog) {
|
||||
this._dialog.destroy();
|
||||
this._dialog = null;
|
||||
}
|
||||
|
||||
this.item.destroy();
|
||||
},
|
||||
@@ -1455,6 +1454,16 @@ const NMVPNSection = new Lang.Class({
|
||||
return _("VPN");
|
||||
},
|
||||
|
||||
_getStatus: function() {
|
||||
let values = this._connectionItems.values();
|
||||
for (let item of values) {
|
||||
if (item.isActive())
|
||||
return item.getName();
|
||||
}
|
||||
|
||||
return _("Off");
|
||||
},
|
||||
|
||||
_getMenuIcon: function() {
|
||||
return this.getIndicatorIcon() || 'network-vpn-symbolic';
|
||||
},
|
||||
@@ -1807,7 +1816,7 @@ const NMApplet = new Lang.Class({
|
||||
_connectionRemoved: function(connection) {
|
||||
let pos = this._connections.indexOf(connection);
|
||||
if (pos != -1)
|
||||
this._connections.splice(connection, 1);
|
||||
this._connections.splice(pos, 1);
|
||||
|
||||
let section = connection._section;
|
||||
|
||||
@@ -1857,8 +1866,7 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
_updateIcon: function() {
|
||||
if (!this._client.networking_enabled || !this._mainConnection) {
|
||||
this._primaryIndicator.icon_name = 'network-offline-symbolic';
|
||||
this._primaryIndicator.visible = true;
|
||||
this._primaryIndicator.visible = false;
|
||||
} else {
|
||||
let dev = this._mainConnection._primaryDevice;
|
||||
this._primaryIndicator.visible = (dev != null);
|
||||
|
||||
@@ -4,6 +4,7 @@ const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
@@ -83,10 +84,18 @@ const Indicator = new Lang.Class({
|
||||
this._item.icon.icon_name = 'airplane-mode-symbolic';
|
||||
this._item.status.text = _("On");
|
||||
this._offItem = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, function() {
|
||||
this._proxy.AirplaneMode = false;
|
||||
this._manager.airplaneMode = false;
|
||||
}));
|
||||
this._item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
|
||||
this.menu.addMenuItem(this._item);
|
||||
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||
this._sessionUpdated();
|
||||
},
|
||||
|
||||
_sessionUpdated: function() {
|
||||
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
this.menu.setSensitive(sensitive);
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
|
||||
@@ -56,7 +56,10 @@ const AltSwitcher = new Lang.Class({
|
||||
}
|
||||
|
||||
if (this.actor.get_child() != childToShow) {
|
||||
let hasFocus = this.actor.contains(global.stage.get_key_focus());
|
||||
this.actor.set_child(childToShow);
|
||||
if (hasFocus)
|
||||
childToShow.grab_key_focus();
|
||||
|
||||
// The actors might respond to hover, so
|
||||
// sync the pointer to make sure they update.
|
||||
@@ -148,11 +151,11 @@ const Indicator = new Lang.Class({
|
||||
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
Lang.bind(this, function() {
|
||||
this._orentationExists = true;
|
||||
this._orientationExists = true;
|
||||
this._updateOrientationLock();
|
||||
}),
|
||||
Lang.bind(this, function() {
|
||||
this._orentationExists = false;
|
||||
this._orientationExists = false;
|
||||
this._updateOrientationLock();
|
||||
}));
|
||||
this._updateOrientationLock();
|
||||
@@ -282,7 +285,7 @@ const Indicator = new Lang.Class({
|
||||
let disabled = Main.sessionMode.isLocked ||
|
||||
(Main.sessionMode.isGreeter &&
|
||||
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
|
||||
this._suspendAction.visible = this._haveShutdown && !disabled;
|
||||
this._suspendAction.visible = this._haveSuspend && !disabled;
|
||||
this._updateActionsVisibility();
|
||||
},
|
||||
|
||||
|
||||
@@ -189,10 +189,11 @@ const SwitcherPopup = new Lang.Class({
|
||||
|
||||
this._disableHover();
|
||||
|
||||
if (this._keyPressHandler(keysym, backwards, action) != Clutter.EVENT_PROPAGATE)
|
||||
return Clutter.EVENT_STOP;
|
||||
|
||||
if (keysym == Clutter.Escape)
|
||||
this.destroy();
|
||||
else
|
||||
this._keyPressHandler(keysym, backwards, action);
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
@@ -282,7 +282,7 @@ const ViewSelector = new Lang.Class({
|
||||
return Clutter.EVENT_STOP;
|
||||
} else if (this._shouldTriggerSearch(symbol)) {
|
||||
this.startSearch(event);
|
||||
} else if (!this._searchActive) {
|
||||
} else if (!this._searchActive && !global.stage.key_focus) {
|
||||
if (symbol == Clutter.Tab || symbol == Clutter.Down) {
|
||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
return true;
|
||||
|
||||
@@ -8,6 +8,8 @@ const Meta = imports.gi.Meta;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
const Signals = imports.signals;
|
||||
|
||||
const DND = imports.ui.dnd;
|
||||
@@ -121,6 +123,7 @@ const WindowClone = new Lang.Class({
|
||||
// the hierarchy that is sized to only the visible portion.
|
||||
this.actor = new St.Widget({ reactive: true,
|
||||
can_focus: true,
|
||||
accessible_role: Atk.Role.PUSH_BUTTON,
|
||||
layout_manager: new WindowCloneLayout() });
|
||||
|
||||
this.actor.add_child(this._windowClone);
|
||||
@@ -424,6 +427,7 @@ const WindowOverlay = new Lang.Class({
|
||||
text: metaWindow.title });
|
||||
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||
title._spacing = 0;
|
||||
windowClone.actor.label_actor = title;
|
||||
|
||||
this._updateCaptionId = metaWindow.connect('notify::title',
|
||||
Lang.bind(this, function(w) {
|
||||
|
||||
@@ -812,9 +812,9 @@ const ThumbnailsBox = new Lang.Class({
|
||||
return false;
|
||||
|
||||
if (isWindow)
|
||||
return window.get_workspace() >= newWorkspaceIndex && winActor != source;
|
||||
return window.get_workspace().index() >= newWorkspaceIndex && winActor != source;
|
||||
else
|
||||
return window.get_workspace() >= newWorkspaceIndex;
|
||||
return window.get_workspace().index() >= newWorkspaceIndex;
|
||||
});
|
||||
|
||||
this._spliceIndex = newWorkspaceIndex;
|
||||
@@ -822,7 +822,7 @@ const ThumbnailsBox = new Lang.Class({
|
||||
// ... move them down one.
|
||||
windows.forEach(function(winActor) {
|
||||
let window = winActor.meta_window;
|
||||
window.change_workspace_by_index(window.get_workspace() + 1, true);
|
||||
window.change_workspace_by_index(window.get_workspace().index() + 1, true);
|
||||
});
|
||||
|
||||
if (isWindow)
|
||||
@@ -902,7 +902,10 @@ const ThumbnailsBox = new Lang.Class({
|
||||
},
|
||||
|
||||
_workspacesChanged: function() {
|
||||
let oldNumWorkspaces = this._thumbnails.length;
|
||||
let validThumbnails = this._thumbnails.filter(function(t) {
|
||||
return t.state <= ThumbnailState.NORMAL;
|
||||
});
|
||||
let oldNumWorkspaces = validThumbnails.length;
|
||||
let newNumWorkspaces = global.screen.n_workspaces;
|
||||
let active = global.screen.get_active_workspace_index();
|
||||
|
||||
|
||||
@@ -30,9 +30,11 @@ hi
|
||||
hu
|
||||
ia
|
||||
id
|
||||
is
|
||||
it
|
||||
ja
|
||||
kk
|
||||
km
|
||||
kn
|
||||
ko
|
||||
ku
|
||||
@@ -46,6 +48,7 @@ ms
|
||||
nb
|
||||
nl
|
||||
nn
|
||||
oc
|
||||
or
|
||||
pa
|
||||
pl
|
||||
|
||||
1062
po/ca@valencia.po
1062
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
344
po/pt_BR.po
344
po/pt_BR.po
@@ -20,16 +20,16 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2014-02-19 16:08+0000\n"
|
||||
"PO-Revision-Date: 2014-02-19 15:01-0300\n"
|
||||
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
|
||||
"POT-Creation-Date: 2014-03-27 18:23+0000\n"
|
||||
"PO-Revision-Date: 2014-03-27 15:29-0300\n"
|
||||
"Last-Translator: Antonio Fernandes C. Neto <fernandesn@gnome.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n>1);\n"
|
||||
"X-Generator: Poedit 1.6.3\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Poedit 1.6.4\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:1
|
||||
@@ -246,17 +246,18 @@ msgid ""
|
||||
"Configures the maximum level of location accuracy applications are allowed "
|
||||
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
||||
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
|
||||
"receiver). Please keep in mind that this only controls what Geoclue will "
|
||||
"receiver). Please keep in mind that this only controls what GeoClue will "
|
||||
"allow applications to see and they can find user's location on their own "
|
||||
"using network resources (albeit with street-level accuracy at best)."
|
||||
msgstr ""
|
||||
"Configura-se o nível máximo de precisão de local onde os aplicativos com "
|
||||
"permissão podem ver. Opções válidas são 'off' (desabilita o rastreamento de "
|
||||
"local), 'country', 'city', 'neighborhood', 'street', e 'exact' (geralmente "
|
||||
"necessita de receptor de GPS). Por gentileza, tenha em mente que estes são "
|
||||
"os únicos controles que o Geoclue permitirá aos aplicativos observarem e "
|
||||
"eles podem localizar o local do usuário por si só, usando recursos de rede "
|
||||
"(apesar de na melhor hipótese usarem precisão à nível de rua)."
|
||||
"Configura o nível máximo de precisão de local a que os aplicativos com "
|
||||
"permissão podem ver. Opções válidas são \"off\" (desabilita o rastreamento "
|
||||
"de local), \"country\", \"city\", \"neighborhood\", \"street\" e \"exact"
|
||||
"\" (geralmente necessita de receptor de GPS). Por gentileza, tenha em mente "
|
||||
"que estes são os únicos controles que o GeoClue permitirá aos aplicativos "
|
||||
"observarem e eles podem localizar o local do usuário por si só, usando "
|
||||
"recursos de rede (apesar de na melhor hipótese usarem precisão à nível de "
|
||||
"rua)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "The application icon mode."
|
||||
@@ -327,9 +328,9 @@ msgstr ""
|
||||
"Selecione uma extensão para configurar usando a caixa de seleção abaixo."
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
|
||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:357
|
||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:883
|
||||
#: ../js/ui/status/network.js:878
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
@@ -347,25 +348,25 @@ msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Entrar"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:270
|
||||
#: ../js/gdm/loginDialog.js:271
|
||||
msgid "Choose Session"
|
||||
msgstr "Escolher sessão"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:430
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "Não está listado?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:598
|
||||
#: ../js/gdm/loginDialog.js:611
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(ex.: usuário ou %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:603 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/gdm/loginDialog.js:616 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
msgid "Username: "
|
||||
msgstr "Nome de usuário: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:868
|
||||
#: ../js/gdm/loginDialog.js:917
|
||||
msgid "Login Window"
|
||||
msgstr "Janela de sessão"
|
||||
|
||||
@@ -390,27 +391,27 @@ msgstr "Não foi possível analisar comando:"
|
||||
msgid "Execution of “%s” failed:"
|
||||
msgstr "A execução de \"%s\" falhou:"
|
||||
|
||||
#: ../js/ui/appDisplay.js:629
|
||||
#: ../js/ui/appDisplay.js:636
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
||||
|
||||
#: ../js/ui/appDisplay.js:740
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
msgid "Frequent"
|
||||
msgstr "Frequente"
|
||||
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
#: ../js/ui/appDisplay.js:754
|
||||
msgid "All"
|
||||
msgstr "Todos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1552
|
||||
#: ../js/ui/appDisplay.js:1566
|
||||
msgid "New Window"
|
||||
msgstr "Nova janela"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1574 ../js/ui/dash.js:285
|
||||
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Remover dos favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1580
|
||||
#: ../js/ui/appDisplay.js:1594
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Adicionar aos favoritos"
|
||||
|
||||
@@ -553,44 +554,44 @@ msgstr "Sab"
|
||||
msgid "calendar:MY"
|
||||
msgstr "calendar:MY"
|
||||
|
||||
#: ../js/ui/calendar.js:446
|
||||
#: ../js/ui/calendar.js:450
|
||||
msgid "Previous month"
|
||||
msgstr "Mês anterior"
|
||||
|
||||
#: ../js/ui/calendar.js:456
|
||||
#: ../js/ui/calendar.js:460
|
||||
msgid "Next month"
|
||||
msgstr "Próximo mês"
|
||||
|
||||
#. Translators: Text to show if there are no events */
|
||||
#: ../js/ui/calendar.js:762
|
||||
#: ../js/ui/calendar.js:772
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Nada agendado"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||
#: ../js/ui/calendar.js:780
|
||||
#: ../js/ui/calendar.js:790
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d de %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
||||
#: ../js/ui/calendar.js:783
|
||||
#: ../js/ui/calendar.js:793
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d de %B de %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:794
|
||||
#: ../js/ui/calendar.js:804
|
||||
msgid "Today"
|
||||
msgstr "Hoje"
|
||||
|
||||
#: ../js/ui/calendar.js:798
|
||||
#: ../js/ui/calendar.js:808
|
||||
msgid "Tomorrow"
|
||||
msgstr "Amanhã"
|
||||
|
||||
#: ../js/ui/calendar.js:809
|
||||
#: ../js/ui/calendar.js:819
|
||||
msgid "This week"
|
||||
msgstr "Esta semana"
|
||||
|
||||
#: ../js/ui/calendar.js:817
|
||||
#: ../js/ui/calendar.js:827
|
||||
msgid "Next week"
|
||||
msgstr "Próxima semana"
|
||||
|
||||
@@ -623,8 +624,8 @@ msgstr "Senha:"
|
||||
msgid "Type again:"
|
||||
msgstr "Digite novamente:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
|
||||
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
|
||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
||||
msgid "Connect"
|
||||
msgstr "Conectar"
|
||||
|
||||
@@ -744,23 +745,18 @@ msgstr "Sem áudio"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:955
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%H∶%M"
|
||||
msgid "%H∶%M"
|
||||
msgstr "%H∶%M"
|
||||
|
||||
#. Translators: this is the word "Yesterday" followed by a
|
||||
#. time string in 24h format. i.e. "Yesterday, 14:30" */
|
||||
#: ../js/ui/components/telepathyClient.js:962
|
||||
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
|
||||
msgid "Yesterday, %H∶%M"
|
||||
msgstr "Ontem, %H∶%M"
|
||||
|
||||
#. Translators: this is the week day name followed by a time
|
||||
#. string in 24h format. i.e. "Monday, 14:30" */
|
||||
#: ../js/ui/components/telepathyClient.js:969
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%H∶%M"
|
||||
msgid "%A, %H∶%M"
|
||||
msgstr "%A, %H∶%M"
|
||||
|
||||
@@ -768,8 +764,6 @@ msgstr "%A, %H∶%M"
|
||||
#. followed by a time string in 24h format.
|
||||
#. i.e. "May 25, 14:30" */
|
||||
#: ../js/ui/components/telepathyClient.js:976
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%H∶%M"
|
||||
msgid "%B %d, %H∶%M"
|
||||
msgstr "%d de %B, %H∶%M"
|
||||
|
||||
@@ -782,8 +776,6 @@ msgstr "%d de %B de %Y, %H∶%M"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:991
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%l∶%M %p"
|
||||
msgid "%l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
|
||||
@@ -796,8 +788,6 @@ msgstr "Ontem, %l∶%M %p"
|
||||
#. Translators: this is the week day name followed by a time
|
||||
#. string in 12h format. i.e. "Monday, 2:30 pm" */
|
||||
#: ../js/ui/components/telepathyClient.js:1005
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%l∶%M %p"
|
||||
msgid "%A, %l∶%M %p"
|
||||
msgstr "%A, %l∶%M %p"
|
||||
|
||||
@@ -805,8 +795,6 @@ msgstr "%A, %l∶%M %p"
|
||||
#. followed by a time string in 12h format.
|
||||
#. i.e. "May 25, 2:30 pm" */
|
||||
#: ../js/ui/components/telepathyClient.js:1012
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%l∶%M %p"
|
||||
msgid "%B %d, %l∶%M %p"
|
||||
msgstr "%d de %B, %l∶%M %p"
|
||||
|
||||
@@ -1000,7 +988,7 @@ msgstr "Não foi possível conectar-se a %s"
|
||||
msgid "View account"
|
||||
msgstr "Visualizar conta"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1434
|
||||
#: ../js/ui/components/telepathyClient.js:1439
|
||||
msgid "Unknown reason"
|
||||
msgstr "Razão desconhecida"
|
||||
|
||||
@@ -1016,96 +1004,106 @@ msgstr "Mostrar aplicativos"
|
||||
msgid "Dash"
|
||||
msgstr "Dash"
|
||||
|
||||
#: ../js/ui/dateMenu.js:86
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
msgid "Open Calendar"
|
||||
msgstr "Abrir agenda"
|
||||
|
||||
#: ../js/ui/dateMenu.js:90
|
||||
#: ../js/ui/dateMenu.js:95
|
||||
msgid "Open Clocks"
|
||||
msgstr "Abrir relógios"
|
||||
|
||||
# O "&" foi inserido como "e" para versão 3.8.0 no gnome-control-center
|
||||
#: ../js/ui/dateMenu.js:97
|
||||
#: ../js/ui/dateMenu.js:102
|
||||
msgid "Date & Time Settings"
|
||||
msgstr "Configurações de data & hora"
|
||||
|
||||
#. Translators: This is the date format to use when the calendar popup is
|
||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||
#. */
|
||||
#: ../js/ui/dateMenu.js:187
|
||||
#: ../js/ui/dateMenu.js:192
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e de %B de %Y"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:62
|
||||
#: ../js/ui/endSessionDialog.js:66
|
||||
#, javascript-format
|
||||
msgctxt "title"
|
||||
msgid "Log Out %s"
|
||||
msgstr "Encerrar sessão de %s"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:63
|
||||
#: ../js/ui/endSessionDialog.js:67
|
||||
msgctxt "title"
|
||||
msgid "Log Out"
|
||||
msgstr "Encerrar sessão"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:65
|
||||
#: ../js/ui/endSessionDialog.js:69
|
||||
#, javascript-format
|
||||
msgid "%s will be logged out automatically in %d second."
|
||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||
msgstr[0] "%s encerrará a sessão automaticamente em %d segundo."
|
||||
msgstr[1] "%s encerrará a sessão automaticamente em %d segundos."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:70
|
||||
#: ../js/ui/endSessionDialog.js:74
|
||||
#, javascript-format
|
||||
msgid "You will be logged out automatically in %d second."
|
||||
msgid_plural "You will be logged out automatically in %d seconds."
|
||||
msgstr[0] "Sua sessão será encerrada automaticamente em %d segundo."
|
||||
msgstr[1] "Sua sessão será encerrada automaticamente em %d segundos."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:75
|
||||
#: ../js/ui/endSessionDialog.js:80
|
||||
msgctxt "button"
|
||||
msgid "Log Out"
|
||||
msgstr "Encerrar sessão"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:81
|
||||
#: ../js/ui/endSessionDialog.js:86
|
||||
msgctxt "title"
|
||||
msgid "Power Off"
|
||||
msgstr "Desligar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:83
|
||||
#: ../js/ui/endSessionDialog.js:87
|
||||
msgctxt "title"
|
||||
msgid "Install Updates & Power Off"
|
||||
msgstr "Instalar atualizações & desligar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:89
|
||||
#, javascript-format
|
||||
msgid "The system will power off automatically in %d second."
|
||||
msgid_plural "The system will power off automatically in %d seconds."
|
||||
msgstr[0] "O sistema será desligado automaticamente em %d segundo."
|
||||
msgstr[1] "O sistema será desligado automaticamente em %d segundos."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:88 ../js/ui/endSessionDialog.js:104
|
||||
#: ../js/ui/endSessionDialog.js:93
|
||||
msgctxt "checkbox"
|
||||
msgid "Install pending software updates"
|
||||
msgstr "Instalar atualizações de software pendentes"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
|
||||
msgctxt "button"
|
||||
msgid "Restart"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:90
|
||||
#: ../js/ui/endSessionDialog.js:98
|
||||
msgctxt "button"
|
||||
msgid "Power Off"
|
||||
msgstr "Desligar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:97
|
||||
#: ../js/ui/endSessionDialog.js:105
|
||||
msgctxt "title"
|
||||
msgid "Restart"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:99
|
||||
#: ../js/ui/endSessionDialog.js:107
|
||||
#, javascript-format
|
||||
msgid "The system will restart automatically in %d second."
|
||||
msgid_plural "The system will restart automatically in %d seconds."
|
||||
msgstr[0] "O sistema irá reiniciar automaticamente em %d segundo."
|
||||
msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:112
|
||||
#: ../js/ui/endSessionDialog.js:121
|
||||
msgctxt "title"
|
||||
msgid "Restart & Install Updates"
|
||||
msgstr "Reiniciar & Instalar atualizações"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:114
|
||||
#: ../js/ui/endSessionDialog.js:123
|
||||
#, javascript-format
|
||||
msgid "The system will automatically restart and install updates in %d second."
|
||||
msgid_plural ""
|
||||
@@ -1117,27 +1115,43 @@ msgstr[1] ""
|
||||
"O sistema irá reiniciar e instalar atualizações automaticamente em %d "
|
||||
"segundos."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:119
|
||||
#: ../js/ui/endSessionDialog.js:129
|
||||
msgctxt "button"
|
||||
msgid "Restart & Install"
|
||||
msgstr "Reiniciar & Instalar"
|
||||
msgid "Restart & Install"
|
||||
msgstr "Reiniciar & instalar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:275
|
||||
#: ../js/ui/endSessionDialog.js:130
|
||||
msgctxt "button"
|
||||
msgid "Install & Power Off"
|
||||
msgstr "Instalar & desligar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:131
|
||||
msgctxt "checkbox"
|
||||
msgid "Power off after updates are installed"
|
||||
msgstr "Desligar após atualizações serem instaladas"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:315
|
||||
msgid "Running on battery power: please plug in before installing updates."
|
||||
msgstr ""
|
||||
"Funcionando na bateria: por favor, conecte na tomada antes de instalar "
|
||||
"atualizações."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:332
|
||||
msgid "Some applications are busy or have unsaved work."
|
||||
msgstr "Alguns aplicativos estão ocupados ou possuem trabalhos não salvos."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:282
|
||||
#: ../js/ui/endSessionDialog.js:339
|
||||
msgid "Other users are logged in."
|
||||
msgstr "Outros usuários estão com sessão aberta."
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login */
|
||||
#: ../js/ui/endSessionDialog.js:486
|
||||
#: ../js/ui/endSessionDialog.js:618
|
||||
#, javascript-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (remoto)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console */
|
||||
#: ../js/ui/endSessionDialog.js:489
|
||||
#: ../js/ui/endSessionDialog.js:621
|
||||
#, javascript-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (console)"
|
||||
@@ -1155,25 +1169,26 @@ msgstr "Baixar e instalar \"%s\" de extensions.gnome.org?"
|
||||
msgid "Keyboard"
|
||||
msgstr "Teclado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:641
|
||||
#: ../js/ui/lookingGlass.js:643
|
||||
msgid "No extensions installed"
|
||||
msgstr "Nenhuma extensão instalada"
|
||||
|
||||
#. Translators: argument is an extension UUID. */
|
||||
#: ../js/ui/lookingGlass.js:695
|
||||
#: ../js/ui/lookingGlass.js:697
|
||||
#, javascript-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s não emitiu erros."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:701
|
||||
#: ../js/ui/lookingGlass.js:703
|
||||
msgid "Hide Errors"
|
||||
msgstr "Ocultar erros"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
|
||||
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767
|
||||
msgid "Show Errors"
|
||||
msgstr "Exibir erros"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:714
|
||||
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
|
||||
#: ../js/ui/status/location.js:167
|
||||
msgid "Enabled"
|
||||
msgstr "Habilitado"
|
||||
|
||||
@@ -1181,64 +1196,64 @@ msgstr "Habilitado"
|
||||
#. because it's disabled by rfkill (airplane mode) */
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
|
||||
#: ../src/gvc/gvc-mixer-control.c:1830
|
||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Desabilitado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:719
|
||||
#: ../js/ui/lookingGlass.js:721
|
||||
msgid "Error"
|
||||
msgstr "Erro"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:721
|
||||
#: ../js/ui/lookingGlass.js:723
|
||||
msgid "Out of date"
|
||||
msgstr "Expirado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:723
|
||||
#: ../js/ui/lookingGlass.js:725
|
||||
msgid "Downloading"
|
||||
msgstr "Baixando"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:747
|
||||
#: ../js/ui/lookingGlass.js:749
|
||||
msgid "View Source"
|
||||
msgstr "Ver fonte"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:756
|
||||
#: ../js/ui/lookingGlass.js:758
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: ../js/ui/messageTray.js:1324
|
||||
#: ../js/ui/messageTray.js:1326
|
||||
msgid "Open"
|
||||
msgstr "Abrir"
|
||||
|
||||
#: ../js/ui/messageTray.js:1331
|
||||
#: ../js/ui/messageTray.js:1333
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: ../js/ui/messageTray.js:1628
|
||||
#: ../js/ui/messageTray.js:1630
|
||||
msgid "Notifications"
|
||||
msgstr "Notificações"
|
||||
|
||||
#: ../js/ui/messageTray.js:1635
|
||||
#: ../js/ui/messageTray.js:1637
|
||||
msgid "Clear Messages"
|
||||
msgstr "Sem mensagens"
|
||||
|
||||
#: ../js/ui/messageTray.js:1654
|
||||
#: ../js/ui/messageTray.js:1656
|
||||
msgid "Notification Settings"
|
||||
msgstr "Configurações de notificação"
|
||||
|
||||
#: ../js/ui/messageTray.js:1707
|
||||
#: ../js/ui/messageTray.js:1709
|
||||
msgid "Tray Menu"
|
||||
msgstr "Menu de notificação"
|
||||
|
||||
#: ../js/ui/messageTray.js:1924
|
||||
#: ../js/ui/messageTray.js:1926
|
||||
msgid "No Messages"
|
||||
msgstr "Sem mensagens"
|
||||
|
||||
#: ../js/ui/messageTray.js:1962
|
||||
#: ../js/ui/messageTray.js:1964
|
||||
msgid "Message Tray"
|
||||
msgstr "Área de notificação"
|
||||
|
||||
#: ../js/ui/messageTray.js:2946
|
||||
#: ../js/ui/messageTray.js:2962
|
||||
msgid "System Information"
|
||||
msgstr "Informações do sistema"
|
||||
|
||||
@@ -1254,11 +1269,11 @@ msgid_plural "%d new messages"
|
||||
msgstr[0] "%d nova mensagem"
|
||||
msgstr[1] "%d novas mensagens"
|
||||
|
||||
#: ../js/ui/overview.js:83
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "Desfazer"
|
||||
|
||||
#: ../js/ui/overview.js:123
|
||||
#: ../js/ui/overview.js:124
|
||||
msgid "Overview"
|
||||
msgstr "Panorama"
|
||||
|
||||
@@ -1266,7 +1281,7 @@ msgstr "Panorama"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters. */
|
||||
#: ../js/ui/overview.js:257
|
||||
#: ../js/ui/overview.js:250
|
||||
msgid "Type to search…"
|
||||
msgstr "Digite para pesquisar…"
|
||||
|
||||
@@ -1309,27 +1324,27 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d nova notificação"
|
||||
msgstr[1] "%d novas notificações"
|
||||
|
||||
#: ../js/ui/screenShield.js:473 ../js/ui/status/system.js:342
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342
|
||||
msgid "Lock"
|
||||
msgstr "Bloquear"
|
||||
|
||||
#: ../js/ui/screenShield.js:707
|
||||
#: ../js/ui/screenShield.js:708
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "GNOME precisa bloquear a tela"
|
||||
|
||||
#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1301
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309
|
||||
msgid "Unable to lock"
|
||||
msgstr "Não foi possível bloquear"
|
||||
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1302
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "O bloqueio foi impedido por um aplicativo"
|
||||
|
||||
#: ../js/ui/search.js:589
|
||||
#: ../js/ui/search.js:603
|
||||
msgid "Searching…"
|
||||
msgstr "Pesquisando…"
|
||||
|
||||
#: ../js/ui/search.js:632
|
||||
#: ../js/ui/search.js:649
|
||||
msgid "No results."
|
||||
msgstr "Nenhum resultado."
|
||||
|
||||
@@ -1401,30 +1416,29 @@ msgstr "Alto contraste"
|
||||
msgid "Large Text"
|
||||
msgstr "Texto grande"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:48
|
||||
#: ../js/ui/status/bluetooth.js:49
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
|
||||
#: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
|
||||
#: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
|
||||
#: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85
|
||||
#: ../js/ui/status/rfkill.js:105
|
||||
msgid "Turn Off"
|
||||
msgstr "Desligar"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:53
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Configurações de Bluetooth"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:100
|
||||
#: ../js/ui/status/bluetooth.js:104
|
||||
#, javascript-format
|
||||
msgid "%d Connected Device"
|
||||
msgid_plural "%d Connected Devices"
|
||||
msgstr[0] "%d dispositivo conectado"
|
||||
msgstr[1] "%d dispositivos conectados"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
|
||||
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
|
||||
msgid "Not Connected"
|
||||
msgstr "Não conectado"
|
||||
|
||||
@@ -1436,159 +1450,167 @@ msgstr "Brilho"
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Exibir disposição de teclado"
|
||||
|
||||
#: ../js/ui/status/location.js:52
|
||||
#: ../js/ui/status/location.js:53
|
||||
msgid "Location"
|
||||
msgstr "Localização"
|
||||
|
||||
#: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
msgid "On"
|
||||
msgstr "On"
|
||||
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
|
||||
msgid "Disable"
|
||||
msgstr "Desabilitar"
|
||||
|
||||
# Referente ao estado "desligado" da rede.
|
||||
#: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
|
||||
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
|
||||
msgid "Off"
|
||||
msgstr "Desligado"
|
||||
#: ../js/ui/status/location.js:165
|
||||
msgid "Enable"
|
||||
msgstr "Habilitar"
|
||||
|
||||
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:1235
|
||||
msgid "Turn On"
|
||||
msgstr "Ligar"
|
||||
#: ../js/ui/status/location.js:167
|
||||
msgid "In Use"
|
||||
msgstr "Em uso"
|
||||
|
||||
#: ../js/ui/status/network.js:74
|
||||
msgid "<unknown>"
|
||||
msgstr "<desconhecido>"
|
||||
|
||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
||||
#: ../js/ui/status/network.js:1464
|
||||
msgid "Off"
|
||||
msgstr "Off"
|
||||
|
||||
#: ../js/ui/status/network.js:422
|
||||
msgid "Connected"
|
||||
msgstr "Conectado"
|
||||
|
||||
#. Translators: this is for network devices that are physically present but are not
|
||||
#. under NetworkManager's control (and thus cannot be used in the menu) */
|
||||
#: ../js/ui/status/network.js:431
|
||||
#: ../js/ui/status/network.js:426
|
||||
msgid "unmanaged"
|
||||
msgstr "não gerenciado"
|
||||
|
||||
#: ../js/ui/status/network.js:433
|
||||
#: ../js/ui/status/network.js:428
|
||||
msgid "disconnecting..."
|
||||
msgstr "desconectando..."
|
||||
|
||||
#: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
|
||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362
|
||||
msgid "connecting..."
|
||||
msgstr "conectando..."
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password */
|
||||
#: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
|
||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1365
|
||||
msgid "authentication required"
|
||||
msgstr "autenticação necessária"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing */
|
||||
#: ../js/ui/status/network.js:450
|
||||
#: ../js/ui/status/network.js:445
|
||||
msgid "firmware missing"
|
||||
msgstr "firmware faltando"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage */
|
||||
#: ../js/ui/status/network.js:454
|
||||
#: ../js/ui/status/network.js:449
|
||||
msgid "unavailable"
|
||||
msgstr "indisponível"
|
||||
|
||||
#: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
|
||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367
|
||||
msgid "connection failed"
|
||||
msgstr "conexão falhou"
|
||||
|
||||
#: ../js/ui/status/network.js:472
|
||||
#: ../js/ui/status/network.js:467
|
||||
msgid "Wired Settings"
|
||||
msgstr "Configurações da rede cabeada"
|
||||
|
||||
#: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
|
||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
||||
msgid "Mobile Broadband Settings"
|
||||
msgstr "Configurações de banda larga móvel"
|
||||
|
||||
#: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
|
||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
|
||||
msgid "Hardware Disabled"
|
||||
msgstr "Hardware desabilitado"
|
||||
|
||||
#: ../js/ui/status/network.js:600
|
||||
#: ../js/ui/status/network.js:595
|
||||
msgid "Use as Internet connection"
|
||||
msgstr "Usar como conexão de Internet"
|
||||
|
||||
#: ../js/ui/status/network.js:781
|
||||
#: ../js/ui/status/network.js:776
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "Modo avião ligado"
|
||||
|
||||
#: ../js/ui/status/network.js:782
|
||||
#: ../js/ui/status/network.js:777
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado."
|
||||
|
||||
#: ../js/ui/status/network.js:783
|
||||
#: ../js/ui/status/network.js:778
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "Desligar modo avião"
|
||||
|
||||
#: ../js/ui/status/network.js:792
|
||||
#: ../js/ui/status/network.js:787
|
||||
msgid "Wi-Fi is Off"
|
||||
msgstr "Wi-Fi desligado"
|
||||
|
||||
#: ../js/ui/status/network.js:793
|
||||
#: ../js/ui/status/network.js:788
|
||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||
msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede."
|
||||
|
||||
#: ../js/ui/status/network.js:794
|
||||
#: ../js/ui/status/network.js:789
|
||||
msgid "Turn On Wi-Fi"
|
||||
msgstr "Ligar Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:819
|
||||
#: ../js/ui/status/network.js:814
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Redes Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:821
|
||||
#: ../js/ui/status/network.js:816
|
||||
msgid "Select a network"
|
||||
msgstr "Selecione uma rede"
|
||||
|
||||
#: ../js/ui/status/network.js:850
|
||||
#: ../js/ui/status/network.js:845
|
||||
msgid "No Networks"
|
||||
msgstr "Nenhuma rede"
|
||||
|
||||
#: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Usar alternador de hardware para desligar"
|
||||
|
||||
#: ../js/ui/status/network.js:1141
|
||||
#: ../js/ui/status/network.js:1136
|
||||
msgid "Select Network"
|
||||
msgstr "Selecione a rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1147
|
||||
#: ../js/ui/status/network.js:1142
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Configurações de Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1252
|
||||
#: ../js/ui/status/network.js:1234
|
||||
msgid "Turn On"
|
||||
msgstr "Ligar"
|
||||
|
||||
#: ../js/ui/status/network.js:1251
|
||||
msgid "Hotspot Active"
|
||||
msgstr "Ponto de acesso ativo"
|
||||
|
||||
#: ../js/ui/status/network.js:1255
|
||||
#| msgid "Connect"
|
||||
#: ../js/ui/status/network.js:1254
|
||||
msgid "Connecting"
|
||||
msgstr "Conectando"
|
||||
|
||||
#: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88
|
||||
msgid "Network Settings"
|
||||
msgstr "Configurações de rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1436
|
||||
#| msgid "Settings"
|
||||
#: ../js/ui/status/network.js:1435
|
||||
msgid "VPN Settings"
|
||||
msgstr "Configurações de VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1455
|
||||
#: ../js/ui/status/network.js:1454
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1598
|
||||
#: ../js/ui/status/network.js:1607
|
||||
msgid "Network Manager"
|
||||
msgstr "Gerenciador de rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1637
|
||||
#: ../js/ui/status/network.js:1646
|
||||
msgid "Connection failed"
|
||||
msgstr "Falha de conexão"
|
||||
|
||||
#: ../js/ui/status/network.js:1638
|
||||
#: ../js/ui/status/network.js:1647
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Falha ao ativar a conexão da rede"
|
||||
|
||||
@@ -1628,6 +1650,10 @@ msgstr "Bateria"
|
||||
msgid "Airplane Mode"
|
||||
msgstr "Modo avião"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
msgid "On"
|
||||
msgstr "On"
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
msgid "Switch User"
|
||||
msgstr "Alternar usuário"
|
||||
|
||||
992
po/sr@latin.po
992
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
692
po/zh_CN.po
692
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
646
po/zh_HK.po
646
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
653
po/zh_TW.po
653
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -349,7 +349,7 @@ INTROSPECTION_GIRS += ShellMenu-0.1.gir
|
||||
CLEANFILES += ShellMenu-0.1.gir
|
||||
|
||||
Shell-0.1.gir: gnome-shell St-1.0.gir ShellMenu-0.1.gir
|
||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 Soup-2.4 GMenu-3.0
|
||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 Soup-2.4
|
||||
if HAVE_NETWORKMANAGER
|
||||
Shell_0_1_gir_INCLUDES += NetworkManager-1.0 NMClient-1.0
|
||||
endif
|
||||
|
||||
@@ -50,3 +50,18 @@ main (int argc, char *argv[])
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* HACK:
|
||||
Add a dummy function that calls into libgnome-shell-js.so to ensure it's
|
||||
linked to /usr/bin/gnome-shell-extension-prefs even when linking with
|
||||
--as-needed. This function is never actually called.
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=670477
|
||||
*/
|
||||
void _shell_link_to_shell_js (void);
|
||||
|
||||
void
|
||||
_shell_link_to_shell_js (void)
|
||||
{
|
||||
shell_js_add_extension_importer (NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -99,6 +99,15 @@ def run_shell(perf_output=None):
|
||||
shell.wait()
|
||||
return shell.returncode == 0
|
||||
|
||||
def restore_shell():
|
||||
pid = os.fork()
|
||||
if (pid == 0):
|
||||
if "MUTTER_WM_CLASS_FILTER" in os.environ:
|
||||
del os.environ["MUTTER_WM_CLASS_FILTER"]
|
||||
os.execlp("gnome-shell", "gnome-shell", "--replace")
|
||||
else:
|
||||
sys.exit(0)
|
||||
|
||||
def upload_performance_report(report_text):
|
||||
try:
|
||||
config_home = os.environ['XDG_CONFIG_HOME']
|
||||
@@ -320,6 +329,6 @@ if args:
|
||||
|
||||
normal_exit = run_performance_test()
|
||||
if normal_exit:
|
||||
sys.exit(0)
|
||||
restore_shell()
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
||||
@@ -154,45 +154,6 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
|
||||
{
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
|
||||
{
|
||||
MetaPlugin *plugin = META_PLUGIN (shell_plugin);
|
||||
CoglDisplay *cogl_display =
|
||||
cogl_context_get_display (shell_plugin->cogl_context);
|
||||
CoglRenderer *renderer = cogl_display_get_renderer (cogl_display);
|
||||
const char * (* query_extensions_string) (Display *dpy, int screen);
|
||||
Bool (* query_extension) (Display *dpy, int *error, int *event);
|
||||
MetaScreen *screen;
|
||||
MetaDisplay *display;
|
||||
Display *xdisplay;
|
||||
const char *glx_extensions;
|
||||
|
||||
/* We will only get swap events if Cogl is using GLX */
|
||||
if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX)
|
||||
return FALSE;
|
||||
|
||||
screen = meta_plugin_get_screen (plugin);
|
||||
display = meta_screen_get_display (screen);
|
||||
|
||||
xdisplay = meta_display_get_xdisplay (display);
|
||||
|
||||
query_extensions_string =
|
||||
(void *) cogl_get_proc_address ("glXQueryExtensionsString");
|
||||
query_extension =
|
||||
(void *) cogl_get_proc_address ("glXQueryExtension");
|
||||
|
||||
query_extension (xdisplay,
|
||||
&shell_plugin->glx_error_base,
|
||||
&shell_plugin->glx_event_base);
|
||||
|
||||
glx_extensions =
|
||||
query_extensions_string (xdisplay,
|
||||
meta_screen_get_screen_number (screen));
|
||||
|
||||
return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gnome_shell_plugin_start (MetaPlugin *plugin)
|
||||
{
|
||||
@@ -205,8 +166,7 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
|
||||
backend = clutter_get_default_backend ();
|
||||
shell_plugin->cogl_context = clutter_backend_get_cogl_context (backend);
|
||||
|
||||
shell_plugin->have_swap_event =
|
||||
gnome_shell_plugin_has_swap_event (shell_plugin);
|
||||
shell_plugin->have_swap_event = clutter_feature_available (CLUTTER_FEATURE_SWAP_EVENTS);
|
||||
|
||||
shell_perf_log_define_event (shell_perf_log_get_default (),
|
||||
"glx.swapComplete",
|
||||
|
||||
@@ -96,6 +96,32 @@ scan_startup_wm_class_to_id (ShellAppSystem *self)
|
||||
g_list_free_full (apps, g_object_unref);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
app_is_stale (ShellApp *app)
|
||||
{
|
||||
GDesktopAppInfo *info;
|
||||
gboolean is_stale;
|
||||
|
||||
if (shell_app_is_window_backed (app))
|
||||
return FALSE;
|
||||
|
||||
info = g_desktop_app_info_new (shell_app_get_id (app));
|
||||
is_stale = (info == NULL);
|
||||
|
||||
if (info)
|
||||
g_object_unref (info);
|
||||
|
||||
return is_stale;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
stale_app_remove_func (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
return app_is_stale (value);
|
||||
}
|
||||
|
||||
static void
|
||||
installed_changed (GAppInfoMonitor *monitor,
|
||||
gpointer user_data)
|
||||
@@ -104,6 +130,8 @@ installed_changed (GAppInfoMonitor *monitor,
|
||||
|
||||
scan_startup_wm_class_to_id (self);
|
||||
|
||||
g_hash_table_foreach_remove (self->priv->id_to_app, stale_app_remove_func, NULL);
|
||||
|
||||
g_signal_emit (self, signals[INSTALLED_CHANGED], 0, NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -748,7 +748,9 @@ global_stage_after_paint (gpointer data)
|
||||
|
||||
|
||||
static void
|
||||
update_scale_factor (GdkScreen *screen, gpointer data)
|
||||
update_scale_factor (GtkSettings *settings,
|
||||
GParamSpec *pspec,
|
||||
gpointer data)
|
||||
{
|
||||
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||
ClutterStage *stage = CLUTTER_STAGE (global->stage);
|
||||
@@ -756,8 +758,12 @@ update_scale_factor (GdkScreen *screen, gpointer data)
|
||||
GValue value = G_VALUE_INIT;
|
||||
|
||||
g_value_init (&value, G_TYPE_INT);
|
||||
gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value);
|
||||
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
|
||||
if (gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value))
|
||||
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
|
||||
|
||||
/* Make sure clutter and gdk scaling stays disabled */
|
||||
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
|
||||
gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);
|
||||
}
|
||||
|
||||
/* This is an IBus workaround. The flow of events with IBus is that every time
|
||||
@@ -819,8 +825,8 @@ gnome_shell_gdk_event_handler (GdkEvent *event_gdk,
|
||||
if (event_gdk->key.window == global->ibus_window)
|
||||
{
|
||||
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
|
||||
ClutterInputDevice *keyboard = clutter_device_manager_get_core_device (device_manager,
|
||||
CLUTTER_KEYBOARD_DEVICE);
|
||||
ClutterInputDevice *keyboard = clutter_device_manager_get_device (device_manager,
|
||||
META_VIRTUAL_CORE_KEYBOARD_ID);
|
||||
|
||||
ClutterEvent *event_clutter = clutter_event_new ((event_gdk->type == GDK_KEY_PRESS) ?
|
||||
CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
|
||||
@@ -938,19 +944,18 @@ _shell_global_set_plugin (ShellGlobal *global,
|
||||
g_signal_connect (global->meta_display, "notify::focus-window",
|
||||
G_CALLBACK (focus_window_changed), global);
|
||||
|
||||
/*
|
||||
* We connect to GdkScreen's monitors-changed here to avoid
|
||||
* a race condition. GdkScreen's monitors-changed signal is
|
||||
* emitted *after* the xsetting has been updated.
|
||||
/* gdk-window-scaling-factor is not exported to gtk-settings
|
||||
* because it is handled inside gdk, so we use gtk-xft-dpi instead
|
||||
* which also changes when the scale factor changes.
|
||||
*/
|
||||
g_signal_connect (global->gdk_screen, "monitors-changed",
|
||||
g_signal_connect (gtk_settings_get_default (), "notify::gtk-xft-dpi",
|
||||
G_CALLBACK (update_scale_factor), global);
|
||||
|
||||
gdk_event_handler_set (gnome_shell_gdk_event_handler, global, NULL);
|
||||
|
||||
global->focus_manager = st_focus_manager_get_for_stage (global->stage);
|
||||
|
||||
update_scale_factor (global->gdk_screen, global);
|
||||
update_scale_factor (gtk_settings_get_default (), NULL, global);
|
||||
}
|
||||
|
||||
GjsContext *
|
||||
@@ -1280,8 +1285,8 @@ shell_global_sync_pointer (ShellGlobal *global)
|
||||
event.y = y;
|
||||
event.modifier_state = mods;
|
||||
event.axes = NULL;
|
||||
event.device = clutter_device_manager_get_core_device (clutter_device_manager_get_default (),
|
||||
CLUTTER_POINTER_DEVICE);
|
||||
event.device = clutter_device_manager_get_device (clutter_device_manager_get_default (),
|
||||
META_VIRTUAL_CORE_POINTER_ID);
|
||||
|
||||
/* Leaving event.source NULL will force clutter to look it up, which
|
||||
* will generate enter/leave events as a side effect, if they are
|
||||
|
||||
@@ -24,7 +24,6 @@ G_DEFINE_TYPE (ShellGLSLQuad, shell_glsl_quad, CLUTTER_TYPE_ACTOR);
|
||||
struct _ShellGLSLQuadPrivate
|
||||
{
|
||||
CoglPipeline *pipeline;
|
||||
CoglTexture2D *texture;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -40,9 +39,10 @@ shell_glsl_quad_paint (ClutterActor *actor)
|
||||
paint_opacity = clutter_actor_get_paint_opacity (actor);
|
||||
clutter_actor_get_allocation_box (actor, &box);
|
||||
|
||||
/* semi-transparent black */
|
||||
cogl_pipeline_set_color4ub (priv->pipeline,
|
||||
0, 0, 0,
|
||||
paint_opacity,
|
||||
paint_opacity,
|
||||
paint_opacity,
|
||||
paint_opacity);
|
||||
cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (),
|
||||
priv->pipeline,
|
||||
@@ -105,7 +105,6 @@ shell_glsl_quad_dispose (GObject *gobject)
|
||||
priv = self->priv;
|
||||
|
||||
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||
|
||||
G_OBJECT_CLASS (shell_glsl_quad_parent_class)->dispose (gobject);
|
||||
}
|
||||
@@ -123,7 +122,6 @@ shell_glsl_quad_constructed (GObject *object)
|
||||
ShellGLSLQuadClass *klass;
|
||||
CoglContext *ctx =
|
||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||
static const uint8_t tex_data[] = { 0, 0, 0, 0 };
|
||||
|
||||
G_OBJECT_CLASS (shell_glsl_quad_parent_class)->constructed (object);
|
||||
|
||||
@@ -144,11 +142,7 @@ shell_glsl_quad_constructed (GObject *object)
|
||||
|
||||
self->priv->pipeline = cogl_pipeline_copy (klass->base_pipeline);
|
||||
|
||||
self->priv->texture = cogl_texture_2d_new_from_data (ctx, 1, 1,
|
||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||
0, tex_data, NULL);
|
||||
cogl_pipeline_set_layer_texture (self->priv->pipeline, 0,
|
||||
COGL_TEXTURE (self->priv->texture));
|
||||
cogl_pipeline_set_layer_null_texture (self->priv->pipeline, 0, COGL_TEXTURE_TYPE_2D);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -164,3 +158,38 @@ shell_glsl_quad_class_init (ShellGLSLQuadClass *klass)
|
||||
|
||||
g_type_class_add_private (klass, sizeof (ShellGLSLQuadPrivate));
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_glsl_quad_get_uniform_location:
|
||||
* @quad: a #ShellGLSLQuad
|
||||
* @name: the uniform name
|
||||
*
|
||||
* Returns: the location of the uniform named @name, that can be
|
||||
* passed to shell_glsl_quad_set_uniform_float().
|
||||
*/
|
||||
int
|
||||
shell_glsl_quad_get_uniform_location (ShellGLSLQuad *quad,
|
||||
const char *name)
|
||||
{
|
||||
return cogl_pipeline_get_uniform_location (quad->priv->pipeline, name);
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_glsl_quad_set_uniform_float:
|
||||
* @quad: a #ShellGLSLQuad
|
||||
* @uniform: the uniform location (as returned by shell_glsl_quad_get_uniform_location())
|
||||
* @n_components: the number of components in the uniform (eg. 3 for a vec3)
|
||||
* @total_count: the total number of floats in @value
|
||||
* @value: (array length=total_count): the array of floats to set @uniform
|
||||
*/
|
||||
void
|
||||
shell_glsl_quad_set_uniform_float (ShellGLSLQuad *quad,
|
||||
int uniform,
|
||||
int n_components,
|
||||
int total_count,
|
||||
const float *value)
|
||||
{
|
||||
cogl_pipeline_set_uniform_float (quad->priv->pipeline, uniform,
|
||||
n_components, total_count / n_components,
|
||||
value);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user