Compare commits

...

218 Commits

Author SHA1 Message Date
Cédric Valmary
1e047af492 Updated Occitan translation 2015-05-11 07:44:34 +00:00
Cédric Valmary
0546819e8f Added Occitan translation 2015-05-02 15:38:39 +00:00
Sveinn í Felli
62a6519db6 Added Icelandic translation 2015-04-27 15:32:22 +00:00
Florian Müllner
a63821a57f system: Fix visibility of suspend button
It depends on the availability of suspend, not shutdown ...
2015-02-04 12:24:44 +01:00
Ryan Lortie
b7d2191059 network: properly remove connections from list
Due to a typo we were always removing the first (index 0) connection
from the global list of connections instead of the correct one.

This resulted in some connections remaining in the shell's connection
list long after they were removed.  In particular, this resulted in
multiple copies of a bluetooth connection appearing after suspend/resume
(when the device was readded and the cached connection list was
rescanned).

https://bugzilla.gnome.org/show_bug.cgi?id=740227
(cherry picked from commit 3d4408dce8)
2014-11-21 14:15:17 -06:00
Giovanni Campagna
68f5674e62 notificationdaemon: fix gtk protocol for newer glib
The new protocol uses a "priority" string instead of the "urgent"
boolean.
2014-11-07 18:14:38 +00:00
Florian Müllner
ffa8ff730e networkAgent: Support NM versions without :capabilities
Commit 36f051044c bumped the requirement for NetworkManager,
which is problematic on a stable branch; optionally fall back to
the previous code.

https://bugzilla.gnome.org/show_bug.cgi?id=738485
2014-10-31 12:36:33 +00:00
Daniel Mustieles
80f9d1ff5d Updated Spanish translation 2014-10-06 13:01:02 +02:00
Christian Kirbach
547005b3a2 Updated German translation 2014-10-01 20:28:13 +00:00
Dan Williams
36f051044c networkAgent: pass VPN hints to auth dialogs
Indicate to NetworkManager that the Shell's agent supports VPN
hints, and pass those hints to VPN auth dialogs that also indicate
that they support hints.

VPN plugins can request new secrets, for example if the previous
ones are incorrect (eg, user mis-typed the password) or some other
reason (next token code required to re-sync a hardware token).
The specific secret that the VPN wants, and a VPN-specific message,
are passed in hints from the plugin, to NetworkManager, to the
agent (GNOME Shell) and then to the auth dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=737592
(cherry picked from commit 926de53c0c)
2014-09-30 11:25:58 -05:00
Dušan Kazik
0d75416d80 Updated Slovak translation 2014-09-09 13:02:55 +00:00
Jasper St. Pierre
c96f95ab90 shell-recorder: Don't use XI2 in the recorder to query the pointer
Just use the normal MetaCursorTracker, which works under Wayland.
2014-08-15 16:26:01 -04:00
Giovanni Campagna
5ccbd3a821 ScreenShield: remove obsolete comment and hack
We don't need to wait to until the stage window is mapped to take
the modal grab, because that code now runs in a startup-prepared
signal handler, which in turn runs some time after the mainloop
has started and well after the stage window is mapped.

https://bugzilla.gnome.org/show_bug.cgi?id=711682
2014-07-31 16:56:28 +02:00
Adel Gadllah
c9bd1d79cc st-scroll-view-fade: Refuse to work without GLSL
Disable the effect when GLSL is not available otherwise we will
crash later.

https://bugzilla.gnome.org/show_bug.cgi?id=733623
2014-07-24 16:54:10 +02:00
Adel Gadllah
07e6219704 lightbox: Do not assume GLSL is available
Some hardware does not support it causing crashes in cogl during paint.

https://bugzilla.gnome.org/show_bug.cgi?id=733623
2014-07-24 16:54:00 +02:00
Bastien Nocera
8625d5b0cc system: Fix orientation lock never appearing
Typos meant that the orientation service was never detected as running
and that the orientation lock menu item didn't appear.

https://bugzilla.gnome.org/show_bug.cgi?id=733498
2014-07-21 16:06:43 +02:00
Alejandro Piñeiro
e021ca2135 a11y: initialize atspi on demand
Only call atspi.init if needed. This is also more
coherent with the listener registration, that is
only done when needed.

https://bugzilla.gnome.org/show_bug.cgi?id=730118
2014-06-20 11:24:14 +02:00
Debarshi Ray
ba6a2cae9c screenshot: Scale and unscale the area for HiDpi displays
https://bugzilla.gnome.org/show_bug.cgi?id=731738
2014-06-16 20:28:17 +02:00
Florian Müllner
5852c17f76 screenshot: Also validate parameters to FlashArea()
Apply the same parameter validation to FlashArea() we already use
for ScreenshotArea().

https://bugzilla.gnome.org/show_bug.cgi?id=731220
2014-06-04 18:15:05 +02:00
Kjartan Maraas
4fe0353991 Updated Norwegian bokmål translation. 2014-06-03 19:00:01 +02:00
Florian Müllner
3c4a898a91 build: Remove GMenu include
The actual GMenu dependency was removed a while ago, so stop adding
it to the GIR includes.
2014-06-02 17:57:18 +02:00
Milo Casagrande
0006feec67 Updated Italian translation 2014-05-31 12:54:55 +00:00
Florian Müllner
dd2ace2e37 viewSelector: Don't re-navigate into the active page
Starting keynav into the active page is handled from a key-press
handler on the stage, however we should not "start" keynav when
we are already navigating elsewhere - the latter can happen when
keynav fails (for instance because the focus is trapped inside an
open app folder or at the end of the dash), and the event bubbles
up to the stage. So make sure to only handle the event to actually
start keynav, to not interfere with the normal navigation handling.

Thanks to Carlos Soriano <carlos.soriano89@gmail.com> for the
debugging footwork.

https://bugzilla.gnome.org/show_bug.cgi?id=726760
2014-05-27 21:20:01 +02:00
Rui Matos
0327bd0a9d switcherPopup: Add a return value to _keyPressHandler
This allows us to handle keybindings that use Escape instead of just
dismissing the popup unconditionally when we see an Escape press.

https://bugzilla.gnome.org/show_bug.cgi?id=730739
2014-05-26 17:24:38 +02:00
Florian Müllner
42619cdd3b Bump version to 3.12.2
Update NEWS.
2014-05-14 10:39:36 +02:00
Jasper St. Pierre
76ea1f4dca search: Make sure to destroy old provider displays when we unregister
When we unregistered providers, like when we refreshed the list of
active remote providers, we would forget to destroy the old provider
display after the fact. This left an empty "skeleton" provider display
still in the search results that would never be filled in. Make sure
to destroy it properly.

https://bugzilla.gnome.org/show_bug.cgi?id=728597
2014-05-10 08:58:39 -05:00
Carles Ferrando
e4e3252ffc [l10n] Updated Catalan (Valencian) translation 2014-05-09 00:03:24 +02:00
Florian Müllner
e9ae77186d system: Keep key focus when switching between alternatives
When switching between alternatives in AltSwitcher, the currently
visible child is replaced with the alternative. If the original
child has the key focus when it is removed from the stage, the
focus is lost. Detect this case and manually move the focus to
the new child.

https://bugzilla.gnome.org/show_bug.cgi?id=727259
2014-05-06 14:29:28 +02:00
Giovanni Campagna
a0c146bbfd Fix Italian translation
- "Aereo" is the thing that flies, "Aero" is the Windows 7 theme.
- "Abilita", not "Abilitato", for the Enable action.
2014-05-04 15:23:25 +02:00
Ihar Hrachyshka
6d679148b6 Updated Belarusian translation. 2014-05-03 14:46:52 +02:00
Giovanni Campagna
07198c5890 rfkill: make the Airplane mode menu insensitive in the lock screen
Like we do for the bluetooth and wifi menus

https://bugzilla.gnome.org/show_bug.cgi?id=729224
2014-04-30 22:00:00 +02:00
Florian Müllner
4720bc3412 workspaceThumbnails: Fix removal of multiple workspaces
When workspaces have been removed, we need to remove the corresponding
thumbnails as well; the number of thumbnails that need removing is
the difference between the old number of workspaces and the new one.
Currently we assume that the old number of workspaces corresponds to
the number of existing thumbnails, but that may actually be wrong:
A thumbnail will still be animated out after its workspace has been
removed. As a result, we end up removing too many thumbnails when a
workspace is removed while a thumbnail of a previously removed workspace
is still animating out. Fix this by basing the old number of workspaces
only on thumbnails that have not been removed previously.

https://bugzilla.gnome.org/show_bug.cgi?id=728820
2014-04-26 17:51:42 +02:00
Bastien Nocera
7113821964 osdWindow: Fix setting a zero-level in osdWindow
Commit 7101cc3170 caused a small
regression insomuch that it checks for a valid "level" but simply using
"if (level)" which will be false if level is undefined and if
level == 0.

Check for not undefined instead.

https://bugzilla.gnome.org/show_bug.cgi?id=727384
2014-04-25 15:19:32 +02:00
Adel Gadllah
c2ae98209d networkAgent: Handle empty vpn 'keyfiles'
Passing back no data is valid in case both secrets (group and user passwords)
are stored.

Just confirm the request in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=728681
2014-04-23 13:10:37 +02:00
Daniel Korostil
21f0e422c0 Updated Ukrainian translation 2014-04-22 23:08:29 +03:00
Giovanni Campagna
eb0f2b8b34 rfkill: fix turning off airplane mode from the menu
The menu does not have a proxy anymore, it needs to go through
the manager.

https://bugzilla.gnome.org/show_bug.cgi?id=728512
2014-04-21 19:14:08 +02:00
Wouter Bolsterlee
65e781a973 Updated Dutch translation 2014-04-18 20:16:28 +02:00
Florian Müllner
4590903159 Bump version to 3.12.1
Update NEWS.
2014-04-15 23:37:57 +02:00
Florian Müllner
8b6fcbea50 layout: Don't always extend struts to the screen edge
NetWM struts are defined in terms of screen edges (rather than monitor
edges), which works poorly with vertical monitor layouts (as it renders
entire monitors unusable). Don't extend struts in those cases.

https://bugzilla.gnome.org/show_bug.cgi?id=663690
2014-04-15 23:36:33 +02:00
Florian Müllner
c6067ffa1d extension-prefs: Force linking with libgnome-shell-js
Use the same hack we use for the main executable to fool the linker
when using --as-needed.

https://bugzilla.gnome.org/show_bug.cgi?id=727948
2014-04-15 23:36:33 +02:00
Rui Matos
7b4254da4e Revert "global: Run maybe_gc at leisure again"
It's causing segfaults so let's back it out for 3.12.1

This reverts commit 2f576e3076.
2014-04-15 14:14:47 +02:00
Adel Gadllah
2f576e3076 global: Run maybe_gc at leisure again
The deadlocks are now fixed this should keep memory usage low,
avoid memory fragmentation and prevent the gc from running at
inconvient times.
2014-04-14 23:11:30 +02:00
Мирослав Николић
60d7c3ad86 Updated Serbian translation 2014-04-14 19:33:40 +02:00
Ikuya Awashiro
43fdc15ac0 l10n: Update Japanese translation 2014-04-15 00:36:18 +09:00
Ask H. Larsen
f082a58071 Updated Danish translation 2014-04-13 21:58:56 +02:00
Balázs Úr
ae5dfb5740 Updated Hungarian translation 2014-04-13 15:42:58 +02:00
Rūdolfs Mazurs
e8fdba4f66 Updated Latvian translation 2014-04-12 12:36:23 +03:00
Rui Matos
1030cdfe8a layout: Change setDummyCursorPosition to also set the size
If we are being used to follow a text entry cursor we also need to set
the size so that the popup menu avoids covering it.

https://bugzilla.gnome.org/show_bug.cgi?id=727579
2014-04-11 16:51:31 +02:00
Khoem Sokhem
ca2d626b59 Added Khmer translation 2014-04-10 23:35:19 +02:00
Dirgita
2b4eaf6b3f Updated Indonesian translation 2014-04-10 23:35:11 +02:00
Victor Ibragimov
6ce6e77d2a Tajik translation updated 2014-04-09 11:38:37 +05:00
Zeeshan Ali (Khattak)
0117fcb0e7 location: Don't hide location menu
If geoclue reports that we can't aquire location, we hide the menu. This
will typically happen when user is offline (and doesn't have a 3G
modem). This is likely not what we want since this like a temporary
situation and user would want the ability to toggle geolocation still
even if its currently not possible any applications to query the
location.

https://bugzilla.gnome.org/show_bug.cgi?id=727398
2014-04-08 14:11:28 +01:00
Tiago S
79bebe849d Updated Portuguese translation 2014-04-07 21:34:08 +00:00
Milo Casagrande
25eadc5559 Updated Italian translation 2014-04-06 12:17:24 +00:00
Piotr Drąg
a5784484e0 doap: update URLs 2014-04-04 19:32:09 +02:00
Luca Ferretti
a701b006c5 Updated Italian translation 2014-04-03 07:08:23 +00:00
Carlos Soriano
2d68bbf94e theme: Fix bad antialising on panel menu buttons
https://bugzilla.gnome.org/show_bug.cgi?id=727336
2014-04-01 19:47:28 +02:00
Alejandro Piñeiro
df305314c1 a11y: setting accessible role and label for windows at the overview
https://bugzilla.gnome.org/show_bug.cgi?id=726670
2014-04-01 13:56:53 +02:00
Pau Iranzo
d03239c009 [l10n] Update Catalan translation 2014-03-31 23:53:35 +02:00
Fran Diéguez
71ccad4399 Updated Galician translations 2014-03-31 23:35:41 +02:00
Matej Urbančič
c916d43688 Updated Slovenian translation 2014-03-31 20:51:33 +02:00
Alexandre Franke
3e6d0bc252 Updated French translation 2014-03-31 16:26:37 +00:00
Stas Solovey
79d0a848a4 Updated Russian translation 2014-03-31 15:48:54 +00:00
Aurimas Černius
a6af33d450 Updated Lithuanian translation 2014-03-30 23:02:54 +03:00
Marcus Lundblad
c6664adcce Updated Swedish translation 2014-03-30 19:05:44 +00:00
Inaki Larranaga Murgoitio
4e8a9470d1 Updated Basque language 2014-03-30 12:56:28 +02:00
Sphinx Jiang
1b88df9439 update zh_CN translation 2014-03-30 16:57:39 +08:00
Benjamin Steinwender
ec42278654 Updated German translation 2014-03-29 08:36:27 +01:00
Changwoo Ryu
f435f249d0 Updated Korean translation 2014-03-29 16:13:54 +09:00
Cosimo Cecchi
9c88fec4fc texture-cache: use scale factor for load_uri_async()
https://bugzilla.gnome.org/show_bug.cgi?id=726907
2014-03-28 10:53:01 -07:00
Cosimo Cecchi
9ecf466ce1 texture-cache: use scale factor to load background and borders
https://bugzilla.gnome.org/show_bug.cgi?id=726907
2014-03-28 10:53:01 -07:00
Cosimo Cecchi
a22fdea0e3 border-image: add support for scale factor
In a later commit we'll add support for rendering borders and
backgrounds with scale factor.

https://bugzilla.gnome.org/show_bug.cgi?id=726907
2014-03-28 10:53:01 -07:00
Cosimo Cecchi
90e52d7266 texture-cache: always call gdk_pixbuf_loader_set_size
Just use the regular image size if we don't want to scale it. This is a
refactor in preparation for the next commit.

https://bugzilla.gnome.org/show_bug.cgi?id=726907
2014-03-28 10:53:01 -07:00
Cosimo Cecchi
74d9b6c2bf texture-cache: use scale factor to load sliced image
We need to use a GdkPixbufLoader instead of the straightforward
gdk_pixbuf_new_from_file(), since we want to load the image already
scaled if possible - e.g. if it's an SVG file.

https://bugzilla.gnome.org/show_bug.cgi?id=726907
2014-03-28 10:53:01 -07:00
Daniel Mustieles
b1e9873de5 Updated Spanish translation 2014-03-28 13:44:52 +01:00
Andika Triwidada
6fdc52a64a Updated Indonesian translation 2014-03-28 11:58:53 +00:00
maria thukididu
b7d6792de9 Updated Greek translation 2014-03-28 09:34:14 +02:00
Marek Černocký
c78dc55e65 Updated Czech translation 2014-03-27 22:17:34 +01:00
Antonio Fernandes C. Neto
af74bded14 Updated Brazilian Portuguese translation 2014-03-27 20:53:59 +00:00
Yosef Or Boczko
e3c9a9c3e4 Updated Hebrew translation 2014-03-27 20:25:06 +02:00
Piotr Drąg
c68eecaf1c Updated Polish translation 2014-03-27 19:23:43 +01:00
Zeeshan Ali (Khattak)
b0bdf7f6c3 location: Improved language
* 'Turn On' -> 'Enable'
* 'Turn Off' -> 'Disable'
* 'Off' -> 'Disabled'
* 'On' ->  'In Use' or 'Enabled' depending on whether or not service is
  in use.

https://bugzilla.gnome.org/show_bug.cgi?id=726498
2014-03-27 17:42:11 +00:00
Rui Matos
d0f69a72dc appDisplay: Ensure the currently focused icon is viewable
We either scroll or paginate to the correct place when an icon gets
key focus.

https://bugzilla.gnome.org/show_bug.cgi?id=726759
2014-03-26 11:42:34 +01:00
Rui Matos
8d8c75d32d iconGrid: Add a key-focus-in signal
This fires whenever a grid's child emits its own key-focus-in signal.

https://bugzilla.gnome.org/show_bug.cgi?id=726759
2014-03-26 11:42:33 +01:00
Rui Matos
e339e2658d search: Ensure that the default result is visible in the scroll view
The default result is set to selected when key focus enters the search
entry. We must also scroll the view if needed.

https://bugzilla.gnome.org/show_bug.cgi?id=726759
2014-03-26 11:42:32 +01:00
Khaled Hosny
bc4a75a732 Update Arabic translation 2014-03-26 01:41:24 +02:00
Simon McVittie
e09e1bc3f5 Specifically ask for Telepathy 0.x
Telepathy 1.0 will not be compatible, and will probably require
source changes. telepathy-glib 0.12 and telepathy-logger 0.2 are
the 0.x ABIs (they were the first stable-branches to have g-i).

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=721704
Reviewed-by: Giovanni Campagna
2014-03-25 17:19:28 +00:00
Florian Müllner
87c50eb495 Bump version to 3.12.0
Update NEWS.
2014-03-25 16:24:42 +01:00
Jasper St. Pierre
be291ee4f9 loginScreen: reset greeter when coming back to login screen
When a user logs in to a wayland session, we keep the login screen
running on the X server with the login screen running in a deactivated mode.

This commit makes sure it get reactivated when the user comes back to
the VT (from user switching, logout or just ctrl-alt-f1).

https://bugzilla.gnome.org/show_bug.cgi?id=726989
2014-03-25 10:41:12 -04:00
Dušan Kazik
e634b49859 Updated slovak translation 2014-03-24 23:40:30 +01:00
Jiro Matsuzawa
4dddaefa41 Updated Japanese translation 2014-03-23 23:22:30 +00:00
Kenneth Nielsen
cda60455f0 Update Danish translation 2014-03-23 23:52:56 +01:00
Kenneth Nielsen
a42b8870b0 Update Danish translation 2014-03-23 23:36:42 +01:00
Kenneth Nielsen
daa66a6de6 Updated Danish translation 2014-03-23 23:29:51 +01:00
Ask H. Larsen
6c6aed84bc Updated Danish translation 2014-03-23 23:09:56 +01:00
Мирослав Николић
c59314acc1 Updated Serbian translation 2014-03-23 11:12:07 +01:00
Frédéric Péters
dd3cc78be5 French translation change for "Location" 2014-03-22 15:35:49 +01:00
Chao-Hsiung Liao
54b0b6eec5 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2014-03-22 20:04:22 +08:00
Matej Urbančič
41654b22b3 Updated Slovenian translation 2014-03-22 10:03:14 +01:00
Matej Urbančič
07cc60d65a Updated Slovenian translation 2014-03-21 21:44:00 +01:00
Praveen Illa
a7f9dc5114 Updated Telugu translation 2014-03-21 22:04:33 +05:30
Abderrahim Kitouni
b5ae23d544 Updated Arabic translation 2014-03-21 11:07:50 +01:00
Abderrahim Kitouni
75347cb4f7 Updated Arabic translation 2014-03-21 10:53:17 +01:00
Inaki Larranaga Murgoitio
03a44b6ec2 Updated Basque language 2014-03-20 22:56:30 +01:00
Yuri Myasoedov
17d2349c49 Updated Russian translation 2014-03-20 23:00:58 +04:00
Daniel Martinez
4e98c44052 Update Aragonese translation 2014-03-20 19:39:33 +01:00
Florian Müllner
0bef281d66 Bump version to 3.11.92
Update NEWS.
2014-03-19 22:07:59 +01:00
Ask H. Larsen
54af25ec24 Updated Danish translation 2014-03-19 22:04:16 +01:00
Gábor Kelemen
86ab02f400 Updated Hungarian translation 2014-03-19 09:47:15 +00:00
Kjartan Maraas
ae01cd143f Updated Norwegian bokmål translation. 2014-03-18 22:52:17 +01:00
Rui Matos
2974b29f15 layout: Create a group for modal dialogs
This way we can ensure that they're always stacked under the OSK.

https://bugzilla.gnome.org/show_bug.cgi?id=719451
2014-03-18 17:03:39 +01:00
Rui Matos
1b78dd662b modalDialog: Remove unused parentActor param
No ModalDialog users set this so let's hardcode it.

https://bugzilla.gnome.org/show_bug.cgi?id=719451
2014-03-18 17:03:38 +01:00
Giovanni Campagna
c22264a0ca BluetoothMenu: fix visibility
In addition to BluetoothAirplaneMode, we need to check also
BluetoothHasAirplaneMode, which is indicative of bluetooth rfkill
devices (and by extension bluetooth adapters).
This prevents showing the menu if there is no adapter present.

https://bugzilla.gnome.org/show_bug.cgi?id=725057
2014-03-17 16:45:30 +01:00
Victor Ibragimov
48c3e3f534 Tajik translation updated 2014-03-17 12:26:07 +05:00
maria thukididu
6ccc134ba6 Updated Greek translation 2014-03-16 22:22:29 +02:00
Ville-Pekka Vainio
9aa36d7851 Finnish translation update by Jiri Grönroos 2014-03-16 20:35:48 +02:00
Yaron Shahrabani
3278f77739 Updated Hebrew translation. 2014-03-16 16:15:10 +02:00
Daniel Korostil
5d24f48e3b Updated Ukrainian translation 2014-03-16 15:57:12 +02:00
Jasper St. Pierre
573c1c86cc focus-manager: Make C ANSI-compliant 2014-03-15 15:44:40 -04:00
Frédéric Peters
374c5967ba Updated French translation 2014-03-15 15:58:04 +00:00
Florian Müllner
66b71a36ce app-system: Filter out stale apps from cache
Since rebasing our AppSystem on GLib's facilities, we only ever
append to the id-to-app cache. So if an application is uninstalled,
shell_app_system_lookup_app() will still happily return it if it
was cached previously. For instance if a favorite app is uninstalled,
it keeps lurking in the dash until a restart.
To fix, filter out removed apps from the cache when handling
GAppInfoMonitor::installed-changed.

https://bugzilla.gnome.org/show_bug.cgi?id=726414
2014-03-15 15:56:30 +01:00
Florian Müllner
e70fd5a57a location: Make insensitive when locked
Most system menu entries are disabled on the lock/login screen,
there is no good reason for the location entry to be an exception.

https://bugzilla.gnome.org/show_bug.cgi?id=726319
2014-03-15 14:19:02 +01:00
Florian Müllner
4589ce4d78 bluetooth: Make insensitive when locked
Most system menu entries are disabled on the lock/login screen;
there is no good reason why users should be allowed to turn bluetooth
on/off (but not e.g. Wifi), so disable the entry as well.

https://bugzilla.gnome.org/show_bug.cgi?id=726319
2014-03-15 14:19:01 +01:00
Florian Müllner
d6197b0904 background: Destroy redundant backgrounds right after loading
When reacting to background settings changes, we may end up queuing
more than one load. The redundant backgrounds are expected to be
destroyed when the previous background has faded out; however since
commit 933f38390b, the tweened actor is the same for all
consecutive load operations and we end up with a single onComplete
handler, ergo a single destroyed actor.
As new backgrounds are always added to the bottom, we are not only
piling up additional background actors, but break changing backgrounds
more than once, as the correct background ends up being covered by
previously added redundant actors.
Fix this by destroying redundant actors right after loading rather
than waiting for the fade animation to complete.

https://bugzilla.gnome.org/show_bug.cgi?id=726120
2014-03-15 00:43:15 +01:00
Florian Müllner
30fb2b0d99 appDisplay: Improve icons of folders with few apps
Folders use a 2x2 grid of the first 4 app icons as icon - if a folder
contains less apps, we currently skip the corresponding grid positions.
As a result, the overall size request may be smaller than the one for
other icons, making the folder icon look out of place.
Fix this by always using a full grid as folder icon, using dummy actors
as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=726322
2014-03-15 00:23:50 +01:00
Giovanni Campagna
5cdefc324d ScreenShield: wake up the screen when resuming from suspend
At some point ScreenShield had code to do this, I don't know when
it was lost, but it makes sense and avoids having to move the mouse
just to see the shield.

https://bugzilla.gnome.org/show_bug.cgi?id=726378
2014-03-14 23:27:20 +01:00
Florian Müllner
b222d0fe44 appDisplay: Add some spacing in folder icons
With the switch to a table layout in commit f959cafb36, setting
alignments to place the individual icons at the outer edge of the grid
stopped working. Remove that code and add some explicit spacing instead.

https://bugzilla.gnome.org/show_bug.cgi?id=726323
2014-03-14 17:21:57 +01:00
Rui Matos
fe4fddf0d5 gnome-shell-wayland.desktop: Add --display-server
This is now required by mutter to run as a native wayland compositor.
2014-03-14 16:53:59 +01:00
Jasper St. Pierre
c675c93733 messageTray: Set the state to SHOWN when the notification is updated
If the notification is updated while SHOWING, we'll overwrite the
tween updating it to the new 'y' position, but forget to update the
state to SHOWN at the end of our transition. Make sure to always set
the state to SHOWN at the end.

https://bugzilla.gnome.org/show_bug.cgi?id=704844
2014-03-14 11:13:17 -04:00
Daniel Drake
29485ff24b layout: really queue region update before redraw
This code may have worked when written in 2009, but later gjs commit
b5e467d89aea43a8e32a1138d232c8a32e6b0785 removed the priority
parameter from idle_add.

Now, when running a constantly-updating client (es2gears) on an
embedded platform, _updateRegions() does not get called and I see
unresponsive window decorations.

Update the code to use meta_later_add() like other parts of the
shell, which is actually slightly better in this case anyway.
Solves the unresponsiveness problem.

https://bugzilla.gnome.org/show_bug.cgi?id=585500
2014-03-14 06:16:42 -06:00
Ray Strode
f6ed3d9f88 authPrompt: Don't ever ask for a username if smartcard service is in foreground
The smartcard service is put in the foreground in two cases:

1) If password service is disabled by admin configuratoin
2) if a smartcard is inserted

In either case we don't want to ask the user to pick a user from the
userlist.  We currently only avoid asking in case 2.

This commit fixes case 1.

https://bugzilla.gnome.org/show_bug.cgi?id=726263
2014-03-13 15:08:00 -04:00
Benjamin Steinwender
39a36cb510 Updated German translation 2014-03-13 20:01:15 +01:00
Ray Strode
ff5550c82b util: fix "login card" smartcard detection on unlock screen
We only want to react to the card the user logged in with, at
the unlock screen.  We check "at the unlock screen" by checking
the "reauthenticating" state variable.  That variable is the
wrong one, though. It gets set too late, and in some cases, gets
set at the login screen, too.  We should be checking this._reauthOnly
instead.

This commit fixes that.

https://bugzilla.gnome.org/show_bug.cgi?id=726262
2014-03-13 14:01:02 -04:00
Ray Strode
7d5ce1a159 screenShield: fix lifting when inserting smartcard
If a user inserts the smartcard they logged in with into the system,
it's supposed to lift the shield and prompt for pin.  That doesn't
happen because the parameter list of the smartcard-inserted signal
handler is wrong.

This commit fixes that.

https://bugzilla.gnome.org/show_bug.cgi?id=726262
2014-03-13 14:01:01 -04:00
Adel Gadllah
c492415386 hidpi: Make sure gdk and clutter scaling stays disabled when the scale factor changes
Not doing that could led to messy situations when the user changes the scale factor
at runtime.

https://bugzilla.gnome.org/show_bug.cgi?id=726238
2014-03-13 14:16:11 +01:00
Adel Gadllah
5616bbd45b hidpi: Listen for gtk-xft-dpi instead of monitors-changed
Currently we update the scale factor on startup and when we get a
monitors-changed signal, which is not the only cases where the setting changes. We cannot listen for gdk-window-scaling-factor changes because it is not
exported to gdk.

So use gtk-xft-dpi which also indicates a scale factor change.

When someone changes gtk-xft-dpi directly without changing the scale factor
we will just re-read the gdk-window-scaling-factor so no harm is done.

https://bugzilla.gnome.org/show_bug.cgi?id=726238
2014-03-13 14:16:11 +01:00
Giovanni Campagna
e117aa5297 Calendar: force-rebuild the calendar when the events change
Don't overoptimize and skip the rebuild when the month is the same,
as the calendar depends on the events too.

https://bugzilla.gnome.org/show_bug.cgi?id=726119
2014-03-13 14:12:38 +01:00
Tiagosdot
17ac1382df Updated Portuguese translation 2014-03-12 22:47:49 +00:00
Giovanni Campagna
057a026ea4 MessageTray: don't destroy notifications when the user presses ESC
Doing so is inconsistent with the behavior in the summary, and
is quite annoying when dealing with chats (because there is no way
to unfocus a chat notification with the keyboard only)

https://bugzilla.gnome.org/show_bug.cgi?id=724178
2014-03-12 19:33:35 +01:00
Giovanni Campagna
6ce6e86318 TelepathyClient: destroy an existing account notification when the user goes offline
We already filter new notifications caused by the explicit
user action, but we don't do so for changes to existing
notifications.

https://bugzilla.gnome.org/show_bug.cgi?id=723976
2014-03-12 19:26:42 +01:00
Giovanni Campagna
492558a2d2 search: survive the provider reporting the wrong number of metas
If a provider crashes during GetResultMetas, or returns the wrong
number of metas, report it as failing but don't cause a JS exception.

https://bugzilla.gnome.org/show_bug.cgi?id=725020
2014-03-12 19:26:41 +01:00
Giovanni Campagna
b78e00f372 search: destroy result actors before forgetting about them
We can't let live (ie, never destroyed) actors undergo GC, because
they will emit :destroy signals during finalization and assert/crash
libmozjs. Properly destroy all actors before letting the GC
free them.

https://bugzilla.gnome.org/show_bug.cgi?id=724798
2014-03-12 19:26:41 +01:00
Giovanni Campagna
c2cc504837 NetworkMenu: destroy the wifi dialog when the associate device disappears
When the device is removed by NetworkManager, we can't use it
to connect, so the dialog is useless and should be destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=723935
2014-03-12 19:26:41 +01:00
Giovanni Campagna
ac76940530 StTextureCache: don't crash if we fail to allocate a framebuffer
It's possible that FBO creation fails due to hw limits or the
driver not exposing the EXT_framebuffer_object extension.
In that case, just give up on creating square icons.

https://bugzilla.gnome.org/show_bug.cgi?id=724977
2014-03-12 19:26:41 +01:00
Ray Strode
55d1c7e2ab background: fix cancellable issue
If we have the following sequence:

    cache.getImageContent({ filename: "foo", cancellable: cancellable1 });
    cache.getImageContent({ filename: "foo", cancellable: cancellable2 });
    cancellable1.cancel();

Then the second load will complete with "null" as its content, even though
it was never cancelled, and we'll see a blank image. Meanwhile, since the
second load simply appends to the list of callers for the second load,
cancellable2 does absolutely nothing: cancelling it won't stop the load,
and it will still receive onFinished handling.

To prevent this from happening, give the actual load operation its own
Gio.Cancellable, which is "ref-counted" -- only cancel it when all the other
possible callers cancel.

Based on work from Jasper St. Pierre <jstpierre@macheye.net>

https://bugzilla.gnome.org/show_bug.cgi?id=722149
2014-03-12 12:15:43 -04:00
Ray Strode
fdf264ff64 background: get rid of nested loop when finishing file loading
At the moment when a file is loaded, we iterate through the list of
pending file loads and ignore any unrelated to the file, then iterate
all the callers of the related file loads and finish them.

In fact, there can only ever be one pending file load related to the
file, and we already know it, so we can avoid the ugly nested loops.

https://bugzilla.gnome.org/show_bug.cgi?id=722149
2014-03-12 12:15:42 -04:00
Ray Strode
e917b7ce0f background: refactor file loading
This commit moves the code around a bit such that the
caller gets allocated up front and then a file load is either
found or created to attach the caller to.

Functionally, the code is the same, it's just now factored in a way
that will make it easier to fix a bug with cancellation later.

https://bugzilla.gnome.org/show_bug.cgi?id=722149
2014-03-12 12:12:47 -04:00
Ray Strode
ec6facb9e7 background: always copy background content when loading into cache
Copying is actually a lightweight operation, so trying to avoid it just adds
code complexity for little gain.

Based on work from Jasper St. Pierre <jstpierre@macheye.net>

https://bugzilla.gnome.org/show_bug.cgi?id=722149
2014-03-12 12:12:47 -04:00
Marek Černocký
60f3c09f90 Updated Czech translation 2014-03-12 15:53:48 +01:00
Stas Solovey
afdfd6cebc Updated Russian translation 2014-03-11 22:30:13 +04:00
Giovanni Campagna
edd66c40d9 ScreenShield: send a signal to GSD to wake up the screen
Instead of poking through IDLETIME, which confuses the state tracking
and can prevent automatic suspend, send a special signal to GSD
when the screen is to be waken up for a notification.

Someday we'll bring over all the state tracking and avoid this
ping-pong between gnome-shell and gnome-settings-daemon, but
that day's not today.

https://bugzilla.gnome.org/show_bug.cgi?id=712706
2014-03-11 18:10:05 +01:00
Giovanni Campagna
fc4bc5277a Lightbox: complete radial effect for modal dialogs
Rework the radial effect to use similar code to MetaBackground,
and adjust parameters to make it more noticeable.

https://bugzilla.gnome.org/show_bug.cgi?id=725830
2014-03-11 17:14:07 +01:00
Jasper St. Pierre
821768a414 network: Don't show network-offline-symbolic in the top bar
This is against the designs.

https://bugzilla.gnome.org/show_bug.cgi?id=725340

https://bugzilla.gnome.org/show_bug.cgi?id=721459
2014-03-11 10:01:07 -04:00
Giovanni Campagna
522f3bf171 NMConnectionSection: don't remove connections that were never added
NMApplet will call removeConnection() unconditionally on all sections,
including those that had nothing to do with the connection in the first
place.

Fixes:

Gjs-WARNING **: JS ERROR: TypeError: this._connectionItems.get(...) is undefined
NMConnectionSection<.removeConnection@resource:///org/gnome/shell/ui/status/network.js:323
wrapper@resource:///org/gnome/gjs/modules/lang.js:169
NMApplet<._connectionRemoved@resource:///org/gnome/shell/ui/status/network.js:1885
wrapper@resource:///org/gnome/gjs/modules/lang.js:169

https://bugzilla.gnome.org/show_bug.cgi?id=725958
2014-03-10 17:49:43 +01:00
Cheng-Chia Tseng
fb7400ab85 Updated Chinese (Taiwan) translation 2014-03-09 04:26:03 +00:00
Aurimas Černius
210128f22b Updated Lithuanian translation 2014-03-08 21:49:25 +02:00
Wylmer Wang
78ae233823 Updated Chinese (China) translation 2014-03-08 14:04:28 +00:00
Rūdolfs Mazurs
8f25da7cea Updated Latvian translation 2014-03-08 11:48:25 +02:00
A S Alam
7f52fdb435 update Punjabi Translation for gnome-shell: Alam 2014-03-07 19:31:38 -06:00
Florian Müllner
0ba05b29b9 loginDialog: Defer loading user list until needed
Loading the user list can be expensive, for instance when there is
a large number of users and/or their avatars have to be fetched over
the network. In case the user list is disabled anyway, there is no
point in doing that work just to hide it, so stop doing that.

https://bugzilla.gnome.org/show_bug.cgi?id=725905
2014-03-08 00:29:11 +01:00
Florian Müllner
ef8123e3a2 loginDialog: Add missing return value
_loadUserList() may be used as idle handler, so we should explicitly
return a boolean.

https://bugzilla.gnome.org/show_bug.cgi?id=725905
2014-03-08 00:29:10 +01:00
Volker Sobek
257e1f3096 calendar: Grab key focus when user changes day
When the user changes the active day by mouse click or keyboard focus
plus key press on a day in the grid, always move the keyboard focus to
the newly activated day.

This basically restores functionality that was introduced in commit
31478e9fb4 but got lost again in the re-factoring in commit
cc4659f5c6.

https://bugzilla.gnome.org/show_bug.cgi?id=725606
2014-03-07 19:18:32 +01:00
Andika Triwidada
6441ae77d9 Updated Indonesian translation 2014-03-07 06:48:50 +00:00
Baurzhan Muftakhidinov
3f0938072f Updated Kazakh translation 2014-03-07 02:35:31 +00:00
Marek Černocký
2fe06a28aa Updated Czech translation 2014-03-06 18:18:06 +01:00
Giovanni Campagna
38750ba798 LookingGlass: add GObject and Gio to the ns available inline
Having to go through import.gi is awfully inconvenient when one
is using the looking glass as a quick gjs console, and we're
already importing all sorts of stuff there.

https://bugzilla.gnome.org/show_bug.cgi?id=725832
2014-03-06 16:57:41 +01:00
Fran Diéguez
b4c01f8905 Updated Galician translations 2014-03-06 12:27:41 +01:00
Fabio Tomat
104d70c88e Updated Friulian translation 2014-03-06 11:11:35 +01:00
Rafael Ferreira
133a350f2f Updated Brazilian Portuguese translation 2014-03-06 08:38:30 +00:00
Fabio Tomat
496ab55357 Updated Friulian translation 2014-03-06 04:59:38 +01:00
Fabio Tomat
a391758e31 Updated Friulian translation 2014-03-06 04:23:40 +01:00
Fabio Tomat
eaf8ad4949 Updated Friulian translation 2014-03-06 03:59:10 +01:00
Fabio Tomat
2f583bdcf3 Updated Friulian translation 2014-03-06 03:45:24 +01:00
Florian Müllner
db19012a41 Bump version to 3.11.91
Update NEWS.
2014-03-06 00:23:41 +01:00
Volker Sobek
62be46884e calendar: Don't forget to rebuild the calendar
Don't forget to rebuild the calendar when changing the setting
'org.gnome.shell.calendar show-weekdate'. This wasn't happening anymore
and changing the setting resulted in a calendar without the days
grid.

https://bugzilla.gnome.org/show_bug.cgi?id=725533
2014-03-05 20:14:56 +01:00
Yosef Or Boczko
3f2e6a48a9 Updated Hebrew translation 2014-03-05 18:58:56 +02:00
Daniel Mustieles
ff124e5f74 Updated Spanish translation 2014-03-05 16:58:35 +01:00
Vit Stanislav
c07421c195 Calendar: make current date label clickable
Once you start navigating between months, you can't return to the
current day.  However, the current day is always displayed above the
calendar grid.  Fix this by making the current date clickable; when
clicked, the calendar grid jumps back to that day.

https://bugzilla.gnome.org/show_bug.cgi?id=641366
2014-03-05 16:40:56 +01:00
Daniel Mustieles
de8348d3b9 Updated Spanish translation 2014-03-05 16:39:11 +01:00
Changwoo Ryu
184df8a853 Updated Korean translation 2014-03-05 19:55:27 +09:00
Kjartan Maraas
12768a147c Updated Norwegian bokmål translation 2014-03-05 06:47:35 +01:00
Piotr Drąg
94161cea37 Updated Polish translation 2014-03-04 18:18:35 +01:00
Yosef Or Boczko
52a4ef7cf7 Updated Hebrew translation 2014-03-04 18:30:55 +02:00
Giovanni Campagna
3432f71500 NetworkMenu: use Connected instead of profile name for wired and wwan
The profile name is most often not useful (because it's an
autogenerated string like "Wired Connection 1"), and even when it
is, it's already available in the submenu.

https://bugzilla.gnome.org/show_bug.cgi?id=725586
2014-03-04 16:08:02 +01:00
Fran Diéguez
8282aa6c24 Updated Galician translations 2014-03-03 17:34:02 +01:00
Dan Williams
59f9eaa1c9 NetworkAgent: fix initial secrets requests after 17726abb
While the named commit was correct for VPN connections, it didn't
work correctly for the initial secrets requests like when connecting
to a new access point.  In that case, secrets *should* be requested
when none are found, but only if interaction is enabled.  The
bits of 17726abb which removed checking secrets against the hints
*were* correct, but 17726abb removed too much.

Also, to ensure passwords don't get inadvertently cleared when
simply reading them from the keyring, don't save passwords
unless something might have changed.

https://bugzilla.gnome.org/show_bug.cgi?id=724779
2014-03-03 15:17:43 +01:00
Aurimas Černius
4433b735c4 Updated Lithuanian translation 2014-03-02 19:57:10 +02:00
Piotr Drąg
9cd30fa6b5 Updated Polish translation 2014-03-02 17:24:18 +01:00
Piotr Drąg
2c7bbfb500 Fix a typo 2014-03-02 17:21:34 +01:00
Ville-Pekka Vainio
51a1d23bf9 Finnish translation update by Jiri Grönroos 2014-03-01 20:15:45 +02:00
Khaled Hosny
c02e6e82bc Update Arabic translation 2014-02-28 23:09:15 +02:00
Adel Gadllah
e37a3fa7e6 perf: Restore shell after runs
Currently running the perf tool results into no wm running
afterwards making it hard for the user to get the results from a terminal
and generally does not make it easy for users to run it to gather numbers.

So restore the shell after the test has completed.

https://bugzilla.gnome.org/show_bug.cgi?id=724870
2014-02-28 21:40:31 +01:00
Adel Gadllah
e23c2ffecc plugin: Don't query for swap_events support directly
There is no need for the duplication, clutter already exports
this information.

https://bugzilla.gnome.org/show_bug.cgi?id=724870
2014-02-28 21:40:31 +01:00
Daniel Mustieles
744f11d045 Updated Spanish translation 2014-02-28 14:13:08 +01:00
Jasper St. Pierre
b7eb1f3e8b Don't use get_core_device
clutter_device_manager_get_core_device calls XIGetClientPointer, which
requires a round-trip to the server. Since we do this on StWidget
creation, this means a full round-trip for every created StWidget.
Replace this with get_device with the ID of the VCP/VCK, since mutter
doesn't support MPX, and we know this is what the device is.
2014-02-27 14:55:29 -05:00
Victor Ibragimov
3f28091e52 Tajik translation updated 2014-02-27 12:13:18 +05:00
Adel Gadllah
b4ee86955d messageTray: Make sure that the source actor is square
Commit b7e1539699 removed the size to support hidpi but that caused the
actor to no longer be square. Fix that by going back to setting a size
but apply the scale factor before doing so.
2014-02-26 18:15:38 +01:00
Zeeshan Ali (Khattak)
8b866efe92 location: Adapt to new Geoclue agent interface
To be able to correctly setup dbus policy, I had to change the expected
agent D-Bus API a bit: Now object path is fixed and not different for
each user.

https://bugzilla.gnome.org/show_bug.cgi?id=725082
2014-02-25 12:45:32 +00:00
Daniel Mustieles
fb61ab8df7 Updated Spanish translation 2014-02-24 17:28:11 +01:00
Fran Diéguez
990956ece7 Updated Galician translations 2014-02-24 15:22:12 +01:00
Yosef Or Boczko
414b592d53 Updated Hebrew translation 2014-02-24 15:25:37 +02:00
Jasper St. Pierre
751154d9da shell-util: Fix warning in shell_util_cursor_tracker_to_clutter
If the sprite is NULL, like if a Wayland app wanted to hide the cursor,
then we need to hide the ClutterTexture on our side, as ClutterTexture
has no easy way to tell it to paint nothing.
2014-02-23 10:54:32 -05:00
Jasper St. Pierre
29addc499c shell-global: Only set the scale factor if get_setting succeeded
If gdk_screen_get_setting fails, like if it's running without XSettings,
then the GValue will have a value of 0. A lot of code tries to divide by
the scale factor. This produces NaN, and combined with the fact that NaN
is "leaky", we very quickly end up spinning out of control.
2014-02-23 10:54:32 -05:00
Yosef Or Boczko
caa98de581 Updated Hebrew translation 2014-02-23 14:16:30 +02:00
eternalhui
1fd1ec4312 Updated Chinese (China) translation 2014-02-23 09:57:11 +00:00
Florian Müllner
f4607626e4 workspaceThumbnails: Really fix DND creating new workspaces
The same problem spotted in commit 89a2dc71fc is present in
some more places, fix those as well.

https://bugzilla.gnome.org/show_bug.cgi?id=724686
2014-02-23 00:29:29 +01:00
Jasper St. Pierre
b494c15e4b shell-js: Kill some compile warnings
jsapi.h has some bad warnings with gcc. gjs-module.h already includes
jsapi.h and uses a complicated set of GCC pragmas to mask them out, so
just kill our include.
2014-02-22 17:42:03 -05:00
Ihar Hrachyshka
3c0defa125 Updated Belarusian translation. 2014-02-22 11:27:32 +01:00
Marek Černocký
f2df4d95de Updated Czech translation 2014-02-22 08:51:14 +01:00
Baurzhan Muftakhidinov
fabcf20e06 Updated Kazakh translation 2014-02-21 17:25:04 +00:00
Daniel Mustieles
b9510b9ab7 Updated Spanish translation 2014-02-21 13:10:31 +01:00
Rafael Ferreira
52a2ebad04 Updated Brazilian Portuguese translation 2014-02-21 12:02:52 +00:00
Florian Müllner
89a2dc71fc workspaceThumbnails: Fix creating new workspace via DND
Commit 61a58ff3c9 replaced the (removed in commit 254afc50223a7)
MetaWindowActor.get_workspace() method by MetaWindow.get_workspace(),
but did not take into account that the return values differ - the
former returns the workspace index, the latter the workspace object.

https://bugzilla.gnome.org/show_bug.cgi?id=724686
2014-02-21 11:48:55 +01:00
Andika Triwidada
adb0de43d8 Updated Indonesian translation 2014-02-21 06:46:22 +00:00
Dimitris Spingos
e2a811a720 Updated Greek translation 2014-02-20 23:20:56 +02:00
Aurimas Černius
5bcafc5c17 Updated Lithuanian translation 2014-02-20 22:42:10 +02:00
Florian Müllner
2d24536caf shellDBus: Fix LaunchExtensionPreferences()
Commit 5dedc5d8ba removed "unused" functionality which was
still used by that method. Launch it via GAppInfo instead, which
still supports passing URIs.

https://bugzilla.gnome.org/show_bug.cgi?id=724813
2014-02-20 20:27:02 +01:00
Victor Ibragimov
b088c4086b Tajik translation updated 2014-02-20 17:00:40 +05:00
116 changed files with 29441 additions and 17898 deletions

111
NEWS
View File

@@ -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
View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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;

View File

@@ -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" />

View File

@@ -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;

View File

@@ -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() {

View File

@@ -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();

View File

@@ -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>';

View File

@@ -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() {

View File

@@ -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);
},

View File

@@ -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));
}

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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');
}));

View File

@@ -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) {

View File

@@ -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));
}
}));
},

View File

@@ -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) {

View File

@@ -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() {

View File

@@ -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;

View File

@@ -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;
},

View File

@@ -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);
}));

View File

@@ -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',

View File

@@ -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;
}

View File

@@ -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();
}
},

View File

@@ -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; ' +

View File

@@ -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;
}),
});
}
},

View File

@@ -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 });

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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'
});

View File

@@ -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;
}

View File

@@ -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);
}
});

View File

@@ -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) {

View File

@@ -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');

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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;
}
});

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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();
},

View File

@@ -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;
},

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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();

View File

@@ -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

642
po/an.po

File diff suppressed because it is too large Load Diff

646
po/ar.po

File diff suppressed because it is too large Load Diff

902
po/be.po

File diff suppressed because it is too large Load Diff

982
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

586
po/cs.po

File diff suppressed because it is too large Load Diff

1257
po/da.po

File diff suppressed because it is too large Load Diff

632
po/de.po

File diff suppressed because it is too large Load Diff

736
po/el.po

File diff suppressed because it is too large Load Diff

667
po/es.po

File diff suppressed because it is too large Load Diff

1013
po/eu.po

File diff suppressed because it is too large Load Diff

923
po/fi.po

File diff suppressed because it is too large Load Diff

1231
po/fr.po

File diff suppressed because it is too large Load Diff

2010
po/fur.po

File diff suppressed because it is too large Load Diff

841
po/gl.po

File diff suppressed because it is too large Load Diff

674
po/he.po

File diff suppressed because it is too large Load Diff

1073
po/hu.po

File diff suppressed because it is too large Load Diff

638
po/id.po

File diff suppressed because it is too large Load Diff

1724
po/is.po Normal file

File diff suppressed because it is too large Load Diff

906
po/it.po

File diff suppressed because it is too large Load Diff

1192
po/ja.po

File diff suppressed because it is too large Load Diff

586
po/kk.po

File diff suppressed because it is too large Load Diff

1759
po/km.po Normal file

File diff suppressed because it is too large Load Diff

1486
po/ko.po

File diff suppressed because it is too large Load Diff

632
po/lt.po

File diff suppressed because it is too large Load Diff

1090
po/lv.po

File diff suppressed because it is too large Load Diff

396
po/nb.po

File diff suppressed because it is too large Load Diff

915
po/nl.po

File diff suppressed because it is too large Load Diff

2487
po/oc.po Normal file

File diff suppressed because it is too large Load Diff

1065
po/pa.po

File diff suppressed because it is too large Load Diff

913
po/pl.po

File diff suppressed because it is too large Load Diff

1086
po/pt.po

File diff suppressed because it is too large Load Diff

View File

@@ -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 &amp; Install"
msgstr "Reiniciar &amp; instalar"
#: ../js/ui/endSessionDialog.js:275
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Instalar &amp; 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"

750
po/ru.po

File diff suppressed because it is too large Load Diff

942
po/sk.po

File diff suppressed because it is too large Load Diff

659
po/sl.po

File diff suppressed because it is too large Load Diff

992
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3065
po/sv.po

File diff suppressed because it is too large Load Diff

2041
po/te.po

File diff suppressed because it is too large Load Diff

600
po/tg.po

File diff suppressed because it is too large Load Diff

611
po/uk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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)

View File

@@ -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",

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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