Compare commits

...

48 Commits

Author SHA1 Message Date
Jakub Steiner
b58d702a2d theme: update system grey background
Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/2174
2020-02-04 15:28:56 +01:00
Dušan Kazik
404ae0a897 Update Slovak translation 2020-02-04 10:02:46 +00:00
Florian Müllner
9e00e8a0fb extensionPrefs: Schedule updates check on activate
While gnome-shell will now check for extension updates, the checks
are performed infrequently. Opening the Extensions app implies that
the user's current focus is on extensions, so it is an appropriate
time to schedule another updates check.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:33:14 +01:00
Florian Müllner
529829a561 extensionSystem: Periodically check for extension updates
Now that we can download, apply and display extension updates, it is time
to actually check for updates. Schedule an update check right on startup,
then every 24 hours.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:33:14 +01:00
Florian Müllner
ed84541050 extensionSystem: Show notification when updates are available
Now that the extensions app has the ability to handle updates, we
can use it as source of updates notifications.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:33:14 +01:00
Florian Müllner
075f4a5efc extensionPrefs: Support extension updates
Now that we have support for extension updates in the shell, we
need some place to display the updates to the user.

As we are establishing the Extensions app as the primary way for
managing extensions, it's a natural place for that functionality.

Show which extensions have updates available, and offer a log out
button (so gnome-shell can apply the updates when logging back in).

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:33:12 +01:00
Florian Müllner
f1bd94a367 extensionPrefs: Split user and system extensions
Until now, it didn't matter whether an extension was installed in the
user's home or system-wide. However with support for uninstallation,
there is now a significant different, as that action is only available
for user extensions.

Account for that by separating extensions by type, so that users don't
have to second-guess which extensions can be fully-managed and which
appear as part of the system.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:13:44 +01:00
Florian Müllner
db69ad876a extensionPrefs: Support uninstalling user extensions
This is functionality currently provided by GNOME Software, and
which the new Extensions app should (and easily can) provide.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:11:21 +01:00
Florian Müllner
c6f297e4e5 extensionPrefs: Include more extension details in expander
The newly added expander gives us a place where we can display
more details without cluttering the interface.

Take advantage of that by including the extension website, version
and author.

(Author is in the mockups, but will not actually be shown until
the extensions website is changed to include it in its metadata;
however best to have UI and string in place for the freezes)

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:11:21 +01:00
Florian Müllner
1067642300 extensionPrefs: Move description into a expander
The description can be useful information, but also increases the
visual complexity of the extensions list. Move it into a hidden
details area that can be expanded, which unclutters the interface
while keeping the information readily available.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:11:21 +01:00
Florian Müllner
059524b007 extensionPrefs: Use actions for row controls
Actions are another mean to separate state and interactions from
the UI. Start using them for the existing controls before adding
more in follow-up commits.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:11:21 +01:00
Florian Müllner
1d72f28a1c extensionPrefs: Use template for rows
Rows are already complex enough to justify a template, and we are
about to add more.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:11:21 +01:00
Florian Müllner
5b92e3a9a8 extensionPrefs: Use a single line for description
The current fixed two-line label requires a custom widget, which
make moving to a widget template harder.

As the description will soon move elsewhere anyway, just go back
to a single line with a standard label for now.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:11:21 +01:00
Florian Müllner
8795668c41 extensionPrefs: Rename to Extensions
... and make the application user-visible.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
872c84a1c3 extensionPrefs: Add standard app elements
In order to turn the extensions-prefs tool into a proper GNOME app, it
should follow basic app patterns, so add a primary menu and about dialog.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
b47879d0a7 extensionPrefs: Add info popover to headerbar
Extensions can have a major impact on stability and performance. Now that
the tool will become the main way for users to manage their extensions, it
is an appropriate place to warn the user of that risk.

Add a small info popover to the headerbar to display that warning, together
with the previously removed hint of where to go for finding new extensions.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
679fc20765 extensionPrefs: Add application icon
We are about to make the tool a user-visible application, so we
need an icon. Add one (plus its symbolic variant).

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
db85e7084c extensionPrefs: Scroll with key focus
Currently when the extensions list is scrolled, it is possible to
keynav out of view, as the scrolling doesn't follow the key focus.

Hook up the adjustment to fix that.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
1afd2c6ad2 extensionPrefs: Don't fill view
Extension rows contain both name/description and controls to
open preferences and enable/disable the extension. Those
elements become disassociated when the row expands too much
horizontally, so instead of filling the entire view, switch
to the embedded list style[0].

[0] https://developer.gnome.org/hig/stable/lists.html.en

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
a74a9f6443 extensionPrefs: Use template for ExtensionsWindow
As the window will become more complex, it makes sense to let GtkBuilder
construct the UI and focus on the actual implementation.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
f49e20bbae extensionPrefs: Split out window class
Currently the main window is a plain Gtk.ApplicationWindow that is
built and managed from within the application.

As the application becomes more complex, it makes sense to decouple
the two and handle the window from a separate ExtensionsWindow class.

Not least this is a prerequisite of using a widget template for the
window.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
9916989272 extensionPrefs: Simplify empty placeholder
GNOME Software will remove its extension support, so we should stop
referencing it in addition to extensions.gnome.org.

In fact, the placeholder is not the best place to hint at where new
extensions can be found, as the user will never see it in case the
distribution includes pre-installed extensions.

So remove the hint altogether, we will add it back in a more prominent
place later.

With the whole placeholder now being much lighter, we can stop dimming
the remaining elements.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1968
2020-02-03 19:03:19 +01:00
Florian Müllner
1054f7533a theme: Tweak app folder style
- match dash border/radius
 - hide scrollbar
 - increase title padding

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/973
2020-02-03 14:24:23 +00:00
Goran Vidović
5f457f6ed2 Update Croatian translation 2020-02-03 14:03:08 +00:00
Daniel Mustieles
9df2edc87e Updated Spanish translation 2020-02-03 12:15:54 +01:00
Dušan Kazik
28eb94402e Update Slovak translation 2020-02-02 20:34:09 +00:00
Aurimas Černius
d2bf869c16 Updated Lithuanian translation 2020-02-02 22:10:30 +02:00
Anders Jonsson
05ea1bdac2 Update Swedish translation 2020-02-02 14:55:45 +00:00
Dušan Kazik
454e85f0a9 Update Slovak translation 2020-02-01 23:06:01 +00:00
Jonas Dreßler
45c5f21f6c dialogs: Hide caps lock warning if password entry is hidden
If all password entries in dialogs are hidden, there is either an entry
that has visible characters or no entry at all. That means we don't have
to show the caps lock warning at all, so hide it.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
59bd2dd1e3 windowManager: Use shorter string for dialog headline
Since the headlines of the dialogs now use a much larger font, the
strings need to be shorter so they won't be ellipsized.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
3c47923953 networkAgent: Use shorter title strings
Since the headlines of the dialogs now use a much larger font, the
strings need to be shorter so they won't be ellipsized. So use a shorter
strings for those titles and also adjust the title-strings of the
notifications sent by the NetworkAgent to be consistent.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
dbaf5687dd networkAgent: Implement new dialog design
Use a completely vertical layout instead of the ClutterGridLayout based
layout to implement the new design for dialogs in the shell:

- Center-align all the elements of the dialog
- Remove the work-spinner
- Show the entry-labels as hint text of the entry

See https://gitlab.gnome.org/GNOME/gnome-shell/issues/1343

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
20895c7791 windowManager: Cleanup dialog a bit
This doesn't have to be a prompt-dialog, so remove the css class, also
the MessageDialogContent doesn't need the x and y_expand properties, so
remove those, too.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
ddeb2fa05d shellMountOperation: Use wiggle effect to inform about wrong password
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
7a1f4f9af3 shellMountOperation: Implement new dialog design
Update the layout of the ShellMountPasswordDialog dialog according to
the new dialog design:

- Center-align all the elements of the dialog
- Align the work-spinner to the right (or left with RTL layouts) of the
password entry
- Show the entry-labels as hint text of the entry

See https://gitlab.gnome.org/GNOME/gnome-shell/issues/1343

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:33 +01:00
Jonas Dreßler
dc578a9e79 keyring: Use wiggle effect to inform about new warning message
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:08:30 +01:00
Jonas Dreßler
040c1638ea keyring: Implement new dialog design
Replace the ClutterGridLayout of the keyring dialog with a vertical
StBoxLayout based layout according to the new dialog design:

- Center-align all the elements of the dialog
- Remove the work-spinner because requests usually finish fast enough
- Show the entry-labels as hint text of the entry

See https://gitlab.gnome.org/GNOME/gnome-shell/issues/1343

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:06:31 +01:00
Jonas Dreßler
ded8412a2a polkitAgent: Use wiggle effect to inform about wrong password or problem
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:06:31 +01:00
Jonas Dreßler
2f3738fae0 polkitAgent: Implement new design for polkit dialog
Implement the new design for the polkit according to the mockups in
https://gitlab.gnome.org/GNOME/gnome-shell/issues/1343:

- Center-align all the parts of the dialog
- Use a larger user avatar
- Remove the work-spinner because requests usually finish fast enough
- Show the entry-labels as hint text of the entry

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:06:31 +01:00
Jonas Dreßler
a59da75830 theme/dialogs: Clean up css a bit
Remove some unused classes and "deduplicate" selectors.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:06:31 +01:00
Jonas Dreßler
2b184a10d6 util: Move wiggle parameters to a common place
Since the wiggle effect will be used by the redesigned prompt-dialogs
and we always want to use the same parameters, move those as defaults
for the wiggle function to the util.js file.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/942
2020-02-01 08:06:31 +01:00
Florian Müllner
fc36837606 st/theme-node: Support "auto" in lengths
This allows resetting a fixed size to the default in a more specific
selector.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/971
2020-02-01 00:22:24 +01:00
Florian Müllner
4871845d01 portalHelper: Require GTK 3.0
When multiple versions of a typelib are available, GI will pick the
highest one unless an explicit version is requested. So as GTK 4.0
is becoming a thing, it's time to do that.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/970
2020-01-31 17:39:18 +01:00
Florian Müllner
53ac00eabb js: Initialize some properties
Otherwise those can result in the (harmless) "reference to undefined
property" warnings.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/970
2020-01-31 17:39:18 +01:00
Jor Teron
75905ebd3c Update Karbi translation 2020-01-31 10:50:28 +00:00
Jor Teron
12f033ee0f Update Karbi translation
(cherry picked from commit a8bb7c0a2a)
2020-01-31 10:34:46 +00:00
Georges Basile Stavracas Neto
964106513e shellEntry: Use seat to retrieve keymap
The backend does not handle the keymap anymore; this is now
handled by ClutterSeat.

Use ClutterSeat to retrieve the default keymap.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/968
2020-01-30 15:57:12 -03:00
39 changed files with 4193 additions and 2964 deletions

View File

@@ -18,7 +18,6 @@
<file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
<file>no-events.svg</file>
<file>no-notifications.svg</file>
<file>noise-texture.png</file>
<file>pad-osd.css</file>
<file alias="icons/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
<file alias="icons/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128px" height="128px" viewBox="0 0 128 128" version="1.1">
<g id="surface43907">
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(10.196079%,37.254903%,70.588237%);fill-opacity:1;" d="M 58.847656 15.683594 L 49.074219 30.632812 C 46.921875 33.84375 42.480469 36.65625 39.378906 35.300781 C 34.488281 33.164062 35.859375 28.144531 31.28125 25.292969 C 28.070312 23.292969 16.839844 20.449219 14.804688 27.644531 C 13.761719 31.339844 14.480469 37.410156 17.398438 41.019531 C 20.164062 44.441406 26.8125 43.355469 28.898438 47.230469 C 30.34375 49.925781 29.738281 51.628906 28.347656 54.351562 C 26.796875 57.375 22.839844 61.359375 19.265625 64.585938 C 17.480469 66.199219 13.273438 65.710938 12.03125 66.730469 C 11.753906 66.949219 12.511719 70.285156 12.511719 70.285156 C 12.511719 70.285156 19.90625 82.707031 25.539062 87.285156 C 27.773438 89.101562 30.089844 91.808594 32.742188 90.695312 C 36.035156 89.316406 35.304688 82.289062 37.644531 79.597656 C 41.976562 74.605469 50.292969 73.761719 55.582031 78.144531 C 61.277344 82.867188 60.882812 89.472656 57.941406 94.683594 C 55.175781 99.578125 49.472656 98.453125 47.484375 102.28125 C 46.730469 103.730469 47.578125 105.664062 48.765625 106.785156 C 54.628906 112.335938 71.210938 118.988281 71.210938 118.988281 L 81.605469 102.429688 C 83.757812 99.222656 86.707031 97.742188 90.011719 98.46875 C 94.605469 99.472656 95.160156 105.945312 98.914062 108.785156 C 103.195312 112.019531 110.546875 111.765625 114.351562 105.753906 C 117.128906 101.371094 116.761719 97.449219 113.765625 91.414062 C 111.808594 87.476562 103.253906 89.382812 101.171875 85.507812 C 99.722656 82.8125 99.992188 80.214844 101.859375 77.796875 C 106.332031 72 117.003906 62.699219 117.003906 62.699219 C 117.003906 62.699219 117.144531 60.824219 116.246094 59.363281 C 115.15625 57.589844 107.472656 49.273438 104.65625 46.984375 C 102.421875 45.167969 99.6875 41.921875 97.03125 43.035156 C 93.742188 44.414062 94.417969 51.058594 92.082031 53.753906 C 86.5 60.179688 78.4375 59.101562 73.914062 54.648438 C 68.644531 49.453125 68.511719 44.488281 71.453125 39.277344 C 74.222656 34.382812 79.921875 35.3125 81.910156 31.484375 C 82.664062 30.035156 81.484375 27.070312 80.597656 25.390625 C 79.277344 22.890625 65.976562 18.902344 58.847656 15.683594 Z M 58.847656 15.683594 "/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(20.784314%,51.764709%,89.411765%);fill-opacity:1;" d="M 58.089844 12.347656 L 48.316406 27.300781 C 46.164062 30.507812 41.726562 33.320312 38.625 31.964844 C 33.734375 29.828125 35.101562 24.808594 30.523438 21.960938 C 27.3125 19.957031 19.445312 19.160156 15.683594 25.625 C 13.730469 28.976562 13.722656 34.074219 16.644531 37.6875 C 19.410156 41.105469 26.058594 40.023438 28.140625 43.898438 C 29.589844 46.589844 28.984375 48.292969 27.589844 51.015625 C 24.492188 57.066406 11.753906 66.949219 11.753906 66.949219 C 11.753906 66.949219 19.148438 79.371094 24.785156 83.949219 C 27.019531 85.765625 29.332031 88.472656 31.988281 87.363281 C 35.277344 85.984375 34.550781 78.957031 36.886719 76.261719 C 41.21875 71.273438 49.535156 70.425781 54.824219 74.8125 C 60.519531 79.53125 60.125 86.140625 57.183594 91.347656 C 54.417969 96.242188 48.714844 95.117188 46.726562 98.949219 C 45.976562 100.398438 46.824219 102.328125 48.011719 103.449219 C 53.871094 109 70.457031 115.652344 70.457031 115.652344 L 80.847656 99.097656 C 83 95.886719 85.953125 94.40625 89.257812 95.132812 C 93.847656 96.140625 94.402344 102.609375 98.160156 105.449219 C 102.4375 108.683594 109.789062 108.433594 113.597656 102.421875 C 116.375 98.035156 116.152344 94.195312 112.175781 89.128906 C 109.460938 85.667969 102.496094 86.046875 100.414062 82.171875 C 98.96875 79.480469 99.234375 76.878906 101.101562 74.460938 C 105.578125 68.667969 116.246094 59.363281 116.246094 59.363281 C 116.246094 59.363281 109.535156 48.226562 103.898438 43.648438 C 101.664062 41.835938 98.929688 38.585938 96.277344 39.699219 C 92.988281 41.078125 93.660156 47.726562 91.324219 50.417969 C 85.746094 56.84375 77.679688 55.769531 73.15625 51.3125 C 67.886719 46.121094 67.757812 41.152344 70.699219 35.945312 C 73.464844 31.046875 79.164062 31.980469 81.152344 28.148438 C 81.90625 26.699219 80.066406 24.476562 78.878906 23.355469 C 73.015625 17.804688 58.089844 12.347656 58.089844 12.347656 Z M 58.089844 12.347656 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M6.5 1C5.669 1 5 1.669 5 2.5V4H2c-.554 0-1 .446-1 1v3h1.5C3.331 8 4 8.669 4 9.5S3.331 11 2.5 11H1v3c0 .554.446 1 1 1h3v-1.5c0-.831.669-1.5 1.5-1.5s1.5.669 1.5 1.5V15h3c.554 0 1-.446 1-1v-3h1.5c.831 0 1.5-.669 1.5-1.5S14.331 8 13.5 8H12V5c0-.554-.446-1-1-1H8V2.5C8 1.669 7.331 1 6.5 1z" style="isolation:auto;mix-blend-mode:normal;marker:none" color="#000" overflow="visible" fill="#474747"/></svg>

After

Width:  |  Height:  |  Size: 469 B

1
data/icons/meson.build Normal file
View File

@@ -0,0 +1 @@
install_subdir('hicolor', install_dir: icondir)

View File

@@ -1,6 +1,6 @@
desktop_files = [
'org.gnome.Shell.desktop',
'gnome-shell-extension-prefs.desktop'
'org.gnome.Extensions.desktop',
]
service_files = []
@@ -43,6 +43,7 @@ endforeach
subdir('dbus-interfaces')
subdir('icons')
subdir('theme')
data_resources = [

View File

@@ -1,8 +1,8 @@
[Desktop Entry]
Type=Application
Name=Shell Extensions
Name=Extensions
Icon=org.gnome.Extensions
Comment=Configure GNOME Shell Extensions
Exec=@bindir@/gnome-shell-extension-prefs %u
Categories=GNOME;GTK;
OnlyShowIn=GNOME;
NoDisplay=true

View File

@@ -87,12 +87,13 @@ $app_grid_fg_color: #fff;
// expanded folder
.app-folder-dialog {
border-radius: 8px;
spacing: 24px;
border-radius: $modal_radius * 1.5;
border: 1px solid $osd_outer_borders_color;
spacing: 12px;
background-color: transparentize(darken($osd_bg_color,10%), 0.05);
& .folder-name-container {
padding: 12px 18px;
padding: 24px 36px 0;
spacing: 12px;
& .folder-name-label,
@@ -117,6 +118,10 @@ $app_grid_fg_color: #fff;
& > StIcon { icon-size: 16px }
}
}
& StButton#vhandle,
& StButton#vhandle:hover,
& StButton#vhandle:active { background-color: transparent; }
}
.app-folder-dialog-container {
padding: 12px;

View File

@@ -84,76 +84,58 @@
/* Password or Authentication Dialog */
.prompt-dialog {
//this is the width of the entire modal popup
width: 34em;
width: 28em;
.message-dialog-content { spacing: $base_spacing * 4; }
.message-dialog-title { color: lighten($fg_color,15%); }
.modal-dialog-content-box {
margin-bottom: 24px;
}
}
.prompt-dialog-description:rtl {
text-align: right;
.prompt-dialog-password-grid {
spacing-rows: 8px;
spacing-columns: 4px;
.prompt-dialog-password-entry {
width: auto;
// 4px (spacing) + 16px (spinner-width)
&:ltr { margin-left: 20px; }
&:rtl { margin-right: 20px; }
}
}
.prompt-dialog-password-box {
spacing: 1em;
padding-bottom: 1em;
.prompt-dialog-password-layout {
spacing: 8px;
}
.prompt-dialog-password-entry {
width: 20em;
}
.prompt-dialog-error-label,
.prompt-dialog-info-label,
.prompt-dialog-null-label {
text-align: center;
@include fontsize($base_font_size - 1);
}
.prompt-dialog-error-label {
@include fontsize($base_font_size - 1);
color: $warning_color;
padding-bottom: 8px;
}
.prompt-dialog-info-label {
@include fontsize($base_font_size - 1);
padding-bottom: 8px;
}
.prompt-dialog-null-label {
@include fontsize($base_font_size - 1);
padding-bottom: 8px;
}
.prompt-dialog-pim-box {
spacing: 1em;
}
.prompt-dialog-grid {
spacing-rows: 15px;
spacing-columns: 1em;
}
.prompt-dialog-keyfiles-box {
spacing: 1em;
}
.prompt-dialog-button.button {
padding: 8px;
}
/* Polkit Dialog */
.polkit-dialog-user-layout {
padding-left: 10px;
spacing: 10px;
&:rtl {
padding-left: 0px;
padding-right: 10px;
text-align: center;
spacing: 8px;
margin-bottom: 6px;
.polkit-dialog-user-icon {
border-radius: 99px;
background-size: contain;
}
}
.polkit-dialog-user-root-label {
color: $warning_color;
}
.polkit-dialog-user-icon {
border-radius: 99px;
background-size: contain;
width: 48px;
height: 48px;
.polkit-dialog-user-root-label { color: $warning_color; }
}
/* Audio selection dialog */
@@ -185,15 +167,3 @@
.access-dialog {
spacing: 30px;
}
/* Network Agent Dialog */
.network-dialog-secret-table {
spacing-rows: 15px;
spacing-columns: 1em;
}
.keyring-dialog-control-table {
spacing-rows: 15px;
spacing-columns: 1em;
}

View File

@@ -60,8 +60,8 @@
// Caps-lock warning
.caps-lock-warning-label {
text-align: center;
padding-bottom: 8px;
padding-left: 6.2em;
@include fontsize($base_font_size - 1);
color: $warning_color;
}

View File

@@ -70,8 +70,7 @@ $_screenshield_shadow: 0px 0px 6px rgba(0, 0, 0, 0.726);
}
#lockDialogGroup {
background: lighten(#2e3436, 8%) url(resource:///org/gnome/shell/theme/noise-texture.png);
background-repeat: repeat;
background-color: lighten(#2e3436, 8%);
}
#screenShieldNotifications {
@@ -80,4 +79,4 @@ $_screenshield_shadow: 0px 0px 6px rgba(0, 0, 0, 0.726);
&:hover, &:focus { background-color: transparentize($bg_color,0.5); }
&:active { background-color: transparentize($selected_bg_color,0.5); }
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -0,0 +1,11 @@
.details-button image {
transition: 250ms;
}
.details-button.expanded:dir(ltr) image {
-gtk-icon-transform: rotate(0.25turn);
}
.details-button.expanded:dir(rtl) image {
-gtk-icon-transform: rotate(-0.25turn);
}
image.warning { color: @warning_color; }

View File

@@ -3,15 +3,16 @@ imports.gi.versions.Gdk = '3.0';
imports.gi.versions.Gtk = '3.0';
const Gettext = imports.gettext;
const { Gdk, GLib, Gio, GObject, Gtk, Pango } = imports.gi;
const { Gdk, GLib, Gio, GObject, Gtk } = imports.gi;
const Format = imports.format;
const _ = Gettext.gettext;
const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils;
const { loadInterfaceXML } = imports.misc.fileUtils;
const { ExtensionState } = ExtensionUtils;
const { ExtensionState, ExtensionType } = ExtensionUtils;
const GnomeShellIface = loadInterfaceXML('org.gnome.Shell.Extensions');
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
@@ -27,26 +28,144 @@ class Application extends Gtk.Application {
_init() {
GLib.set_prgname('gnome-shell-extension-prefs');
super._init({
application_id: 'org.gnome.shell.ExtensionPrefs',
application_id: 'org.gnome.Extensions',
flags: Gio.ApplicationFlags.HANDLES_COMMAND_LINE,
});
this._startupUuid = null;
this._loaded = false;
this._skipMainWindow = false;
this._shellProxy = null;
}
get shellProxy() {
return this._shellProxy;
}
_showPrefs(uuid) {
let row = this._extensionSelector.get_children().find(c => {
return c.uuid === uuid && c.hasPrefs;
vfunc_activate() {
this._shellProxy.CheckForUpdatesRemote();
this._window.present();
}
vfunc_startup() {
super.vfunc_startup();
let provider = new Gtk.CssProvider();
let uri = 'resource:///org/gnome/shell/css/application.css';
try {
provider.load_from_file(Gio.File.new_for_uri(uri));
} catch (e) {
logError(e, 'Failed to add application style');
}
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),
provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
this._window = new ExtensionsWindow({ application: this });
}
vfunc_command_line(commandLine) {
let args = commandLine.get_arguments();
if (args.length) {
let uuid = args[0];
// Strip off "extension:///" prefix which fakes a URI, if it exists
uuid = stripPrefix(uuid, 'extension:///');
this._window.openPrefs(uuid);
} else {
this.activate();
}
return 0;
}
});
var ExtensionsWindow = GObject.registerClass({
GTypeName: 'ExtensionsWindow',
Template: 'resource:///org/gnome/shell/ui/extensions-window.ui',
InternalChildren: [
'userList',
'systemList',
'killSwitch',
'mainBox',
'mainStack',
'scrolledWindow',
'updatesBar',
'updatesLabel',
],
}, class ExtensionsWindow extends Gtk.ApplicationWindow {
_init(params) {
super._init(params);
this._startupUuid = null;
this._loaded = false;
this._prefsDialog = null;
this._updatesCheckId = 0;
this._mainBox.set_focus_vadjustment(this._scrolledWindow.vadjustment);
let action;
action = new Gio.SimpleAction({ name: 'show-about' });
action.connect('activate', this._showAbout.bind(this));
this.add_action(action);
action = new Gio.SimpleAction({ name: 'logout' });
action.connect('activate', this._logout.bind(this));
this.add_action(action);
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this._settings.bind('disable-user-extensions',
this._killSwitch, 'active',
Gio.SettingsBindFlags.DEFAULT | Gio.SettingsBindFlags.INVERT_BOOLEAN);
this._userList.set_sort_func(this._sortList.bind(this));
this._userList.set_header_func(this._updateHeader.bind(this));
this._systemList.set_sort_func(this._sortList.bind(this));
this._systemList.set_header_func(this._updateHeader.bind(this));
this._shellProxy.connectSignal('ExtensionStateChanged',
this._onExtensionStateChanged.bind(this));
this._scanExtensions();
}
get _shellProxy() {
return this.application.shellProxy;
}
uninstall(uuid) {
let row = this._findExtensionRow(uuid);
let dialog = new Gtk.MessageDialog({
transient_for: this,
modal: true,
text: _('Remove “%s”?').format(row.name),
secondary_text: _('If you remove the extension, you need to return to download it if you want to enable it again'),
});
if (!row)
dialog.add_button(_('Cancel'), Gtk.ResponseType.CANCEL);
dialog.add_button(_('Remove'), Gtk.ResponseType.ACCEPT)
.get_style_context().add_class('destructive-action');
dialog.connect('response', (dlg, response) => {
if (response === Gtk.ResponseType.ACCEPT)
this._shellProxy.UninstallExtensionRemote(uuid);
dialog.destroy();
});
dialog.present();
}
openPrefs(uuid) {
if (!this._loaded)
this._startupUuid = uuid;
else if (!this._showPrefs(uuid))
this.present();
}
_showPrefs(uuid) {
if (this._prefsDialog)
return false;
let row = this._findExtensionRow(uuid);
if (!row || !row.hasPrefs)
return false;
let widget;
@@ -57,33 +176,73 @@ class Application extends Gtk.Application {
widget = this._buildErrorUI(row, e);
}
let dialog = new Gtk.Window({
modal: !this._skipMainWindow,
this._prefsDialog = new Gtk.Window({
application: this.application,
default_width: 600,
default_height: 400,
modal: this.visible,
type_hint: Gdk.WindowTypeHint.DIALOG,
window_position: Gtk.WindowPosition.CENTER,
});
dialog.set_titlebar(new Gtk.HeaderBar({
this._prefsDialog.set_titlebar(new Gtk.HeaderBar({
show_close_button: true,
title: row.name,
visible: true,
}));
if (this._skipMainWindow) {
this.add_window(dialog);
if (this._window)
this._window.destroy();
this._window = dialog;
this._window.window_position = Gtk.WindowPosition.CENTER;
} else {
dialog.transient_for = this._window;
}
if (this.visible)
this._prefsDialog.transient_for = this;
dialog.set_default_size(600, 400);
dialog.add(widget);
dialog.show();
this._prefsDialog.connect('destroy', () => {
this._prefsDialog = null;
if (!this.visible)
this.destroy();
});
this._prefsDialog.add(widget);
this._prefsDialog.show();
return true;
}
_showAbout() {
let aboutDialog = new Gtk.AboutDialog({
authors: [
'Florian Müllner <fmuellner@gnome.org>',
'Jasper St. Pierre <jstpierre@mecheye.net>',
'Didier Roche <didrocks@ubuntu.com>',
],
translator_credits: _('translator-credits'),
program_name: _('Extensions'),
comments: _('Manage your GNOME Extensions'),
license_type: Gtk.License.GPL_2_0,
logo_icon_name: 'org.gnome.Extensions',
version: Config.PACKAGE_VERSION,
transient_for: this,
modal: true,
});
aboutDialog.present();
}
_logout() {
this.application.get_dbus_connection().call(
'org.gnome.SessionManager',
'/org/gnome/SessionManager',
'org.gnome.SessionManager',
'Logout',
new GLib.Variant('(u)', [0]),
null,
Gio.DBusCallFlags.NONE,
-1,
null,
(o, res) => {
o.call_finish(res);
});
}
_buildErrorUI(row, exc) {
let scroll = new Gtk.ScrolledWindow({
hscrollbar_policy: Gtk.PolicyType.NEVER,
@@ -178,7 +337,7 @@ class Application extends Gtk.Application {
label: _("Homepage"),
tooltip_text: _("Visit extension homepage"),
no_show_all: true,
visible: row.url != null,
visible: row.url !== '',
});
toolbar.add(urlButton);
@@ -199,47 +358,6 @@ class Application extends Gtk.Application {
return scroll;
}
_buildUI() {
this._window = new Gtk.ApplicationWindow({ application: this,
window_position: Gtk.WindowPosition.CENTER });
this._window.set_default_size(800, 500);
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
title: _("Shell Extensions") });
this._window.set_titlebar(this._titlebar);
let killSwitch = new Gtk.Switch({ valign: Gtk.Align.CENTER });
this._titlebar.pack_end(killSwitch);
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this._settings.bind('disable-user-extensions', killSwitch, 'active',
Gio.SettingsBindFlags.DEFAULT |
Gio.SettingsBindFlags.INVERT_BOOLEAN);
this._mainStack = new Gtk.Stack({
transition_type: Gtk.StackTransitionType.CROSSFADE,
});
this._window.add(this._mainStack);
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER });
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
this._extensionSelector.set_sort_func(this._sortList.bind(this));
this._extensionSelector.set_header_func(this._updateHeader.bind(this));
scroll.add(this._extensionSelector);
this._mainStack.add_named(scroll, 'listing');
this._mainStack.add_named(new EmptyPlaceholder(), 'placeholder');
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
this._shellProxy.connectSignal('ExtensionStateChanged',
this._onExtensionStateChanged.bind(this));
this._window.show_all();
}
_sortList(row1, row2) {
return row1.name.localeCompare(row2.name);
}
@@ -253,13 +371,26 @@ class Application extends Gtk.Application {
}
_findExtensionRow(uuid) {
return this._extensionSelector.get_children().find(c => c.uuid === uuid);
return [
...this._userList.get_children(),
...this._systemList.get_children(),
].find(c => c.uuid === uuid);
}
_onExtensionStateChanged(proxy, senderName, [uuid, newState]) {
let extension = ExtensionUtils.deserializeExtension(newState);
let row = this._findExtensionRow(uuid);
this._queueUpdatesCheck();
// the extension's type changed; remove the corresponding row
// and reset the variable to null so that we create a new row
// below and add it to the appropriate list
if (row && row.type !== extension.type) {
row.destroy();
row = null;
}
if (row) {
if (extension.state === ExtensionState.UNINSTALLED)
row.destroy();
@@ -273,7 +404,6 @@ class Application extends Gtk.Application {
if (e) {
if (e instanceof Gio.DBusError) {
log(`Failed to connect to shell proxy: ${e}`);
this._mainStack.add_named(new NoShellPlaceholder(), 'noshell');
this._mainStack.visible_child_name = 'noshell';
} else {
throw e;
@@ -291,58 +421,53 @@ class Application extends Gtk.Application {
_addExtensionRow(extension) {
let row = new ExtensionRow(extension);
row.prefsButton.connect('clicked', () => {
this._showPrefs(row.uuid);
});
row.show_all();
this._extensionSelector.add(row);
if (row.type === ExtensionType.PER_USER)
this._userList.add(row);
else
this._systemList.add(row);
}
_queueUpdatesCheck() {
if (this._updatesCheckId)
return;
this._updatesCheckId = GLib.timeout_add_seconds(
GLib.PRIORITY_DEFAULT, 1, () => {
this._checkUpdates();
this._updatesCheckId = 0;
return GLib.SOURCE_REMOVE;
});
}
_checkUpdates() {
let nUpdates = this._userList.get_children().filter(c => c.hasUpdate).length;
this._updatesLabel.label = Gettext.ngettext(
'%d extension will be updated on next login.',
'%d extensions will be updated on next login.e',
nUpdates).format(nUpdates);
this._updatesBar.visible = nUpdates > 0;
}
_extensionsLoaded() {
if (this._extensionSelector.get_children().length > 0)
this._mainStack.visible_child_name = 'listing';
this._userList.visible = this._userList.get_children().length > 0;
this._systemList.visible = this._systemList.get_children().length > 0;
if (this._userList.visible || this._systemList.visible)
this._mainStack.visible_child_name = 'main';
else
this._mainStack.visible_child_name = 'placeholder';
this._checkUpdates();
if (this._startupUuid)
this._showPrefs(this._startupUuid);
this._startupUuid = null;
this._skipMainWindow = false;
this._loaded = true;
}
vfunc_activate() {
this._window.present();
}
vfunc_startup() {
super.vfunc_startup();
this._buildUI();
this._scanExtensions();
}
vfunc_command_line(commandLine) {
this.activate();
let args = commandLine.get_arguments();
if (args.length) {
let uuid = args[0];
this._skipMainWindow = true;
// Strip off "extension:///" prefix which fakes a URI, if it exists
uuid = stripPrefix(uuid, "extension:///");
if (!this._loaded)
this._startupUuid = uuid;
else if (!this._showPrefs(uuid))
this._skipMainWindow = false;
}
return 0;
}
});
var Expander = GObject.registerClass({
@@ -444,113 +569,19 @@ var Expander = GObject.registerClass({
}
});
var EmptyPlaceholder = GObject.registerClass(
class EmptyPlaceholder extends Gtk.Box {
_init() {
super._init({
orientation: Gtk.Orientation.VERTICAL,
spacing: 6,
margin: 32,
});
let image = new Gtk.Image({
icon_name: 'application-x-addon-symbolic',
pixel_size: 96,
visible: true,
vexpand: true,
valign: Gtk.Align.END,
});
image.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
this.add(image);
let label = new Gtk.Label({
label: `<b><span size="x-large">${_("No Extensions Installed")}</span></b>`,
use_markup: true,
visible: true,
});
label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
this.add(label);
let appInfo = Gio.DesktopAppInfo.new('org.gnome.Software.desktop');
let desc = new Gtk.Label({
label: _("Extensions can be installed through Software or <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."),
use_markup: true,
wrap: true,
justify: Gtk.Justification.CENTER,
visible: true,
max_width_chars: 50,
hexpand: true,
vexpand: appInfo == null,
halign: Gtk.Align.CENTER,
valign: Gtk.Align.START,
});
this.add(desc);
if (appInfo) {
let button = new Gtk.Button({
label: _("Browse in Software"),
image: new Gtk.Image({
icon_name: "org.gnome.Software-symbolic",
}),
always_show_image: true,
margin_top: 12,
visible: true,
halign: Gtk.Align.CENTER,
valign: Gtk.Align.START,
vexpand: true,
});
this.add(button);
button.connect('clicked', w => {
let context = w.get_display().get_app_launch_context();
appInfo.launch([], context);
});
}
}
});
var NoShellPlaceholder = GObject.registerClass(
class NoShellPlaceholder extends Gtk.Box {
_init() {
super._init({
orientation: Gtk.Orientation.VERTICAL,
spacing: 12,
margin: 100,
margin_bottom: 60,
});
let label = new Gtk.Label({
label: '<span size="x-large">%s</span>'.format(
_("Somethings gone wrong")),
use_markup: true,
});
label.get_style_context().add_class(Gtk.STYLE_CLASS_DIM_LABEL);
this.add(label);
label = new Gtk.Label({
label: _("Were very sorry, but it was not possible to get the list of installed extensions. Make sure you are logged into GNOME and try again."),
justify: Gtk.Justification.CENTER,
wrap: true,
});
this.add(label);
this.show_all();
}
});
var DescriptionLabel = GObject.registerClass(
class DescriptionLabel extends Gtk.Label {
vfunc_get_preferred_height_for_width(width) {
// Hack: Request the maximum height allowed by the line limit
if (this.lines > 0)
return super.vfunc_get_preferred_height_for_width(0);
return super.vfunc_get_preferred_height_for_width(width);
}
});
var ExtensionRow = GObject.registerClass(
class ExtensionRow extends Gtk.ListBoxRow {
var ExtensionRow = GObject.registerClass({
GTypeName: 'ExtensionRow',
Template: 'resource:///org/gnome/shell/ui/extension-row.ui',
InternalChildren: [
'nameLabel',
'descriptionLabel',
'versionLabel',
'authorLabel',
'updatesIcon',
'revealButton',
'revealer',
],
}, class ExtensionRow extends Gtk.ListBoxRow {
_init(extension) {
super._init();
@@ -558,9 +589,67 @@ class ExtensionRow extends Gtk.ListBoxRow {
this._extension = extension;
this._prefsModule = null;
this.connect('destroy', this._onDestroy.bind(this));
this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('row', this._actionGroup);
this._buildUI();
let action;
action = new Gio.SimpleAction({
name: 'show-prefs',
enabled: this.hasPrefs,
});
action.connect('activate', () => this.get_toplevel().openPrefs(this.uuid));
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({
name: 'show-url',
enabled: this.url !== '',
});
action.connect('activate', () => {
Gio.AppInfo.launch_default_for_uri(
this.url, this.get_display().get_app_launch_context());
});
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({
name: 'uninstall',
enabled: this.type === ExtensionType.PER_USER,
});
action.connect('activate', () => this.get_toplevel().uninstall(this.uuid));
this._actionGroup.add_action(action);
action = new Gio.SimpleAction({
name: 'enabled',
state: new GLib.Variant('b', false),
});
action.connect('activate', () => {
let state = action.get_state();
action.change_state(new GLib.Variant('b', !state.get_boolean()));
});
action.connect('change-state', (a, state) => {
if (state.get_boolean())
this._app.shellProxy.EnableExtensionRemote(this.uuid);
else
this._app.shellProxy.DisableExtensionRemote(this.uuid);
});
this._actionGroup.add_action(action);
let name = GLib.markup_escape_text(this.name, -1);
this._nameLabel.label = name;
let desc = this._extension.metadata.description.split('\n')[0];
this._descriptionLabel.label = desc;
this._revealButton.connect('clicked', () => {
this._revealer.reveal_child = !this._revealer.reveal_child;
});
this._revealer.connect('notify::reveal-child', () => {
if (this._revealer.reveal_child)
this._revealButton.get_style_context().add_class('expanded');
else
this._revealButton.get_style_context().remove_class('expanded');
});
this.connect('destroy', this._onDestroy.bind(this));
this._extensionStateChangedId = this._app.shellProxy.connectSignal(
'ExtensionStateChanged', (p, sender, [uuid, newState]) => {
@@ -568,14 +657,9 @@ class ExtensionRow extends Gtk.ListBoxRow {
return;
this._extension = ExtensionUtils.deserializeExtension(newState);
let state = this._extension.state == ExtensionState.ENABLED;
this._switch.block_signal_handler(this._notifyActiveId);
this._switch.state = state;
this._switch.unblock_signal_handler(this._notifyActiveId);
this._switch.sensitive = this._canToggle();
this._updateState();
});
this._updateState();
}
get uuid() {
@@ -590,8 +674,40 @@ class ExtensionRow extends Gtk.ListBoxRow {
return this._extension.hasPrefs;
}
get hasUpdate() {
return this._extension.hasUpdate || false;
}
get type() {
return this._extension.type;
}
get creator() {
return this._extension.metadata.creator || '';
}
get url() {
return this._extension.metadata.url;
return this._extension.metadata.url || '';
}
get version() {
return this._extension.metadata.version || '';
}
_updateState() {
let state = this._extension.state === ExtensionState.ENABLED;
let action = this._actionGroup.lookup('enabled');
action.set_state(new GLib.Variant('b', state));
action.enabled = this._canToggle();
this._updatesIcon.visible = this.hasUpdate;
this._versionLabel.label = `${this.version}`;
this._versionLabel.visible = this.version !== '';
this._authorLabel.label = `${this.creator}`;
this._authorLabel.visible = this.creator !== '';
}
_onDestroy() {
@@ -603,54 +719,6 @@ class ExtensionRow extends Gtk.ListBoxRow {
this._extensionStateChangedId = 0;
}
_buildUI() {
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
hexpand: true, margin_end: 24, spacing: 24,
margin: 12 });
this.add(hbox);
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
spacing: 6, hexpand: true });
hbox.add(vbox);
let name = GLib.markup_escape_text(this.name, -1);
let label = new Gtk.Label({ label: '<b>' + name + '</b>',
use_markup: true,
halign: Gtk.Align.START });
vbox.add(label);
let desc = this._extension.metadata.description.split('\n')[0];
label = new DescriptionLabel({ label: desc, wrap: true, lines: 2,
ellipsize: Pango.EllipsizeMode.END,
xalign: 0, yalign: 0 });
vbox.add(label);
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
visible: this.hasPrefs,
no_show_all: true });
button.set_image(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
icon_size: Gtk.IconSize.BUTTON,
visible: true }));
button.get_style_context().add_class('circular');
hbox.add(button);
this.prefsButton = button;
this._switch = new Gtk.Switch({
valign: Gtk.Align.CENTER,
sensitive: this._canToggle(),
state: this._extension.state === ExtensionState.ENABLED,
});
this._notifyActiveId = this._switch.connect('notify::active', () => {
if (this._switch.active)
this._app.shellProxy.EnableExtensionRemote(this.uuid);
else
this._app.shellProxy.DisableExtensionRemote(this.uuid);
});
this._switch.connect('state-set', () => true);
hbox.add(this._switch);
}
_canToggle() {
return this._extension.canChange;
}

View File

@@ -0,0 +1,218 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<template class="ExtensionRow" parent="GtkListBoxRow">
<property name="visible">True</property>
<property name="activatable">False</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="margin">12</property>
<property name="column_spacing">12</property>
<child>
<object class="GtkLabel" id="nameLabel">
<property name="visible">True</property>
</object>
</child>
<child>
<object class="GtkImage" id="updatesIcon">
<property name="no_show_all">True</property>
<property name="icon_name">software-update-available-symbolic</property>
<style>
<class name="warning"/>>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="hexpand">True</property>
</object>
</child>
<child>
<object class="GtkButton" id="prefsButton">
<property name="no_show_all">True</property>
<property name="visible"
bind-source="prefsButton"
bind-property="sensitive"
bind-flags="sync-create"/>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="valign">center</property>
<property name="action-name">row.show-prefs</property>
<style>
<class name="circular"/>>
<class name="image-button"/>>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">emblem-system-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSwitch">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="valign">center</property>
<property name="action-name">row.enabled</property>
</object>
</child>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
</object>
</child>
<child>
<object class="GtkButton" id="revealButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="valign">center</property>
<style>
<class name="details-button"/>
<class name="image-button"/>
<class name="flat"/>
</style>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">pan-end-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkRevealer" id="revealer">
<property name="visible">True</property>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="margin_top">12</property>
<property name="row_spacing">6</property>
<property name="column_spacing">12</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Description</property>
<property name="xalign">0</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel" id="descriptionLabel">
<property name="visible">True</property>
<property name="ellipsize">end</property>
<property name="max_width_chars">60</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible"
bind-source="versionLabel"
bind-property="visible"
bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Version</property>
<property name="xalign">0</property>
<style>
<class name="dim-label"/>
</style>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="versionLabel">
<property name="no_show_all">True</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible"
bind-source="authorLabel"
bind-property="visible"
bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Author</property>
<property name="xalign">0</property>
<style>
<class name="dim-label"/>
</style>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="authorLabel">
<property name="no_show_all">True</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="label" translatable="yes">Website</property>
<property name="action_name">row.show-url</property>
<property name="valign">end</property>
<property name="margin-top">12</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkButton" id="removeButton">
<property name="visible"
bind-source="removeButton"
bind-property="sensitive"
bind-flags="sync-create"/>
<property name="no_show_all">True</property>
<property name="label" translatable="yes">Remove…</property>
<property name="action_name">row.uninstall</property>
<property name="hexpand">True</property>
<property name="halign">end</property>
<property name="valign">end</property>
<style>
<class name="destructive-action"/>
</style>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">7</property>
</packing>
</child>
</object>
</child>
</template>
</interface>

View File

@@ -0,0 +1,305 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<menu id="primary-menu">
<section>
<item>
<attribute name="label" translatable="yes">Help</attribute>
<attribute name="action">win.show-help</attribute>
</item>
<item>
<attribute name="label" translatable="yes">About Extensions</attribute>
<attribute name="action">win.show-about</attribute>
</item>
</section>
</menu>
<object class="GtkPopover" id="infoPopover">
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="margin">12</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">To find and add extensions, visit &lt;a href="https://extensions.gnome.org"&gt;extensions.gnome.org&lt;/a&gt;.</property>
<property name="use_markup">True</property>
<property name="xalign">0</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Warning</property>
<property name="xalign">0</property>
<property name="margin_top">6</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Extensions can cause system issues, including performance problems. If you encounter problems with your system, it is recommended to disable all extensions.</property>
<property name="wrap">True</property>
<property name="max_width_chars">40</property>
<property name="xalign">0</property>
</object>
</child>
</object>
</child>
</object>
<template class="ExtensionsWindow" parent="GtkApplicationWindow">
<property name="default_width">800</property>
<property name="default_height">500</property>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="title" translatable="yes">Extensions</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkMenuButton">
<property name="visible">True</property>
<property name="popover">infoPopover</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">dialog-information-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuButton" id="menuButton">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="menu_model">primary-menu</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="icon_name">open-menu-symbolic</property>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="killSwitch">
<property name="visible">True</property>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkStack" id="mainStack">
<property name="visible">True</property>
<property name="transition_type">crossfade</property>
<property name="vexpand">True</property>
<child>
<object class="GtkScrolledWindow" id="scrolledWindow">
<property name="visible">True</property>
<property name="hscrollbar_policy">never</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<child>
<object class="GtkBox" id="mainBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="halign">center</property>
<property name="margin">36</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel">
<property name="visible"
bind-source="userList"
bind-property="visible"
bind-flags="sync-create"/>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Manually Installed</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkListBox" id="userList">
<property name="visible">True</property>
<property name="selection_mode">none</property>
<property name="margin_bottom">24</property>
<style>
<class name="frame"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible"
bind-source="systemList"
bind-property="visible"
bind-flags="sync-create"/>
<property name="halign">start</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Built-In</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkListBox" id="systemList">
<property name="visible">True</property>
<property name="selection_mode">none</property>
<style>
<class name="frame"/>
</style>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="name">main</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="margin">32</property>
<property name="spacing">6</property>
<property name="valign">center</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="pixel_size">96</property>
<property name="icon_name">org.gnome.Extensions-symbolic</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">No Installed Extensions</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="1.44"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="name">placeholder</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="margin_left">100</property>
<property name="margin_right">100</property>
<property name="margin_top">100</property>
<property name="margin_bottom">60</property>
<property name="orientation">vertical</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Somethings gone wrong</property>
<attributes>
<attribute name="scale" value="1.44"/>
</attributes>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="label" translatable="yes">Were very sorry, but it was not possible to get the list of installed extensions. Make sure you are logged into GNOME and try again.</property>
<property name="justify">center</property>
<property name="wrap">True</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
</object>
<packing>
<property name="name">noshell</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkActionBar" id="updatesBar">
<property name="no_show_all">True</property>
<child>
<object class="GtkImage">
<property name="visible">True</property>
<property name="pixel-size">24</property>
<property name="margin">6</property>
<property name="icon_name">software-update-available-symbolic</property>
<style>
<class name="warning"/>>
</style>
</object>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="halign">start</property>
<property name="label">Extension Updates Ready</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
<child>
<object class="GtkLabel" id="updatesLabel">
<property name="visible">True</property>
<property name="halign">start</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkButton">
<property name="label" translatable="yes">Logout…</property>
<property name="visible">True</property>
<property name="valign">center</property>
<property name="action-name">win.logout</property>
<property name="receives_default">True</property>
<style>
<class name="suggested-action"/>
</style>
</object>
<packing>
<property name="pack_type">end</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</template>
</interface>

View File

@@ -17,10 +17,6 @@ var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 300;
var MESSAGE_FADE_OUT_ANIMATION_TIME = 500;
const WIGGLE_OFFSET = 6;
const WIGGLE_DURATION = 65;
const N_WIGGLES = 3;
var AuthPromptMode = {
UNLOCK_ONLY: 0,
UNLOCK_OR_LOG_IN: 1,
@@ -282,11 +278,7 @@ var AuthPrompt = GObject.registerClass({
this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
Util.wiggle(this._entry, {
offset: WIGGLE_OFFSET,
duration: WIGGLE_DURATION,
wiggleCount: N_WIGGLES,
});
Util.wiggle(this._entry);
}
_onVerificationComplete() {

View File

@@ -11,6 +11,10 @@ const Params = imports.misc.params;
var SCROLL_TIME = 100;
const WIGGLE_OFFSET = 6;
const WIGGLE_DURATION = 65;
const N_WIGGLES = 3;
// http://daringfireball.net/2010/07/improved_regex_for_matching_urls
const _balancedParens = '\\([^\\s()<>]+\\)';
const _leadingJunk = '[\\s`(\\[{\'\\"<\u00AB\u201C\u2018]';
@@ -442,9 +446,9 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
function wiggle(actor, params) {
params = Params.parse(params, {
offset: 0,
duration: 0,
wiggleCount: 0,
offset: WIGGLE_OFFSET,
duration: WIGGLE_DURATION,
wiggleCount: N_WIGGLES,
});
actor.translation_x = 0;

View File

@@ -1,4 +1,6 @@
/* exported main */
imports.gi.versions.Gtk = '3.0';
const Format = imports.format;
const Gettext = imports.gettext;
const { Gio, GLib, GObject, Gtk, Pango, Soup, WebKit2: WebKit } = imports.gi;

View File

@@ -7,5 +7,10 @@
<file>misc/extensionUtils.js</file>
<file>misc/fileUtils.js</file>
<file>misc/params.js</file>
<file alias="css/application.css">extensionPrefs/css/application.css</file>
<file alias="ui/extension-row.ui">extensionPrefs/ui/extension-row.ui</file>
<file alias="ui/extensions-window.ui">extensionPrefs/ui/extensions-window.ui</file>
</gresource>
</gresources>

View File

@@ -504,12 +504,10 @@ var SystemBackground = GObject.registerClass({
Signals: { 'loaded': {} },
}, class SystemBackground extends Meta.BackgroundActor {
_init() {
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png');
if (_systemBackground == null) {
_systemBackground = new Meta.Background({ meta_display: global.display });
_systemBackground.set_color(DEFAULT_BACKGROUND_COLOR);
_systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER);
}
super._init({

View File

@@ -3,13 +3,11 @@
const { Clutter, Gcr, Gio, GObject, Pango, Shell, St } = imports.gi;
const Animation = imports.ui.animation;
const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
const CheckBox = imports.ui.checkBox;
var WORK_SPINNER_ICON_SIZE = 16;
const Util = imports.misc.util;
var KeyringDialog = GObject.registerClass(
class KeyringDialog extends ModalDialog.ModalDialog {
@@ -21,141 +19,97 @@ class KeyringDialog extends ModalDialog.ModalDialog {
this.prompt.connect('show-confirm', this._onShowConfirm.bind(this));
this.prompt.connect('prompt-close', this._onHidePrompt.bind(this));
this._content = new Dialog.MessageDialogContent();
this.contentLayout.add(this._content);
let content = new Dialog.MessageDialogContent();
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('description', this._content, 'description', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('message',
content, 'title', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('description',
content, 'description', GObject.BindingFlags.SYNC_CREATE);
this._workSpinner = null;
this._controlTable = null;
let passwordBox = new St.BoxLayout({
style_class: 'prompt-dialog-password-layout',
vertical: true,
});
this._cancelButton = this.addButton({ label: '',
action: this._onCancelButton.bind(this),
key: Clutter.KEY_Escape });
this._continueButton = this.addButton({ label: '',
action: this._onContinueButton.bind(this),
default: true });
this._passwordEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
can_focus: true,
x_align: Clutter.ActorAlign.CENTER,
});
ShellEntry.addContextMenu(this._passwordEntry);
this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this));
this.prompt.bind_property('password-visible',
this._passwordEntry, 'visible', GObject.BindingFlags.SYNC_CREATE);
passwordBox.add_child(this._passwordEntry);
this._confirmEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
can_focus: true,
x_align: Clutter.ActorAlign.CENTER,
});
ShellEntry.addContextMenu(this._confirmEntry);
this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this));
this.prompt.bind_property('confirm-visible',
this._confirmEntry, 'visible', GObject.BindingFlags.SYNC_CREATE);
passwordBox.add_child(this._confirmEntry);
this.prompt.set_password_actor(this._passwordEntry.clutter_text);
this.prompt.set_confirm_actor(this._confirmEntry.clutter_text);
let warningBox = new St.BoxLayout({ vertical: true });
let capsLockWarning = new ShellEntry.CapsLockWarning();
let syncCapsLockWarningVisibility = () => {
capsLockWarning.visible =
this.prompt.password_visible || this.prompt.confirm_visible;
};
this.prompt.connect('notify::password-visible', syncCapsLockWarningVisibility);
this.prompt.connect('notify::confirm-visible', syncCapsLockWarningVisibility);
warningBox.add_child(capsLockWarning);
let warning = new St.Label({ style_class: 'prompt-dialog-error-label' });
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
warning.clutter_text.line_wrap = true;
this.prompt.bind_property('warning',
warning, 'text', GObject.BindingFlags.SYNC_CREATE);
this.prompt.connect('notify::warning-visible', () => {
warning.opacity = this.prompt.warning_visible ? 255 : 0;
});
this.prompt.connect('notify::warning', () => {
if (this._passwordEntry && warning !== '')
Util.wiggle(this._passwordEntry);
});
warningBox.add_child(warning);
passwordBox.add_child(warningBox);
content.add_child(passwordBox);
this._choice = new CheckBox.CheckBox();
this.prompt.bind_property('choice-label', this._choice.getLabelActor(),
'text', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('choice-chosen', this._choice,
'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
this.prompt.bind_property('choice-visible', this._choice,
'visible', GObject.BindingFlags.SYNC_CREATE);
content.add_child(this._choice);
this.contentLayout.add_child(content);
this._cancelButton = this.addButton({
label: '',
action: this._onCancelButton.bind(this),
key: Clutter.KEY_Escape,
});
this._continueButton = this.addButton({
label: '',
action: this._onContinueButton.bind(this),
default: true,
});
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
}
_setWorking(working) {
if (!this._workSpinner)
return;
if (working)
this._workSpinner.play();
else
this._workSpinner.stop();
}
_buildControlTable() {
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let table = new St.Widget({
style_class: 'keyring-dialog-control-table',
layout_manager: layout,
x_expand: true,
y_expand: true,
});
layout.hookup_style(table);
let rtl = table.get_text_direction() == Clutter.TextDirection.RTL;
let row = 0;
if (this.prompt.password_visible) {
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER });
label.set_text(_("Password:"));
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._passwordEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
x_expand: true,
});
ShellEntry.addContextMenu(this._passwordEntry);
this._passwordEntry.clutter_text.connect('activate', this._onPasswordActivate.bind(this));
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
animate: true,
});
if (rtl) {
layout.attach(this._workSpinner, 0, row, 1, 1);
layout.attach(this._passwordEntry, 1, row, 1, 1);
layout.attach(label, 2, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._passwordEntry, 1, row, 1, 1);
layout.attach(this._workSpinner, 2, row, 1, 1);
}
row++;
} else {
this._workSpinner = null;
this._passwordEntry = null;
}
if (this.prompt.confirm_visible) {
var label = new St.Label({ style_class: 'prompt-dialog-password-label',
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER });
label.set_text(_("Type again:"));
this._confirmEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
x_expand: true,
});
ShellEntry.addContextMenu(this._confirmEntry);
this._confirmEntry.clutter_text.connect('activate', this._onConfirmActivate.bind(this));
if (rtl) {
layout.attach(this._confirmEntry, 0, row, 1, 1);
layout.attach(label, 1, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._confirmEntry, 1, row, 1, 1);
}
row++;
} else {
this._confirmEntry = null;
}
this.prompt.set_password_actor(this._passwordEntry ? this._passwordEntry.clutter_text : null);
this.prompt.set_confirm_actor(this._confirmEntry ? this._confirmEntry.clutter_text : null);
if (this._passwordEntry || this._confirmEntry) {
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
layout.attach(this._capsLockWarningLabel, 1, row, 1, 1);
row++;
}
if (this.prompt.choice_visible) {
let choice = new CheckBox.CheckBox();
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('choice-chosen', choice, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
layout.attach(choice, rtl ? 0 : 1, row, 1, 1);
row++;
}
let warning = new St.Label({ style_class: 'prompt-dialog-error-label',
x_align: Clutter.ActorAlign.START });
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
warning.clutter_text.line_wrap = true;
layout.attach(warning, rtl ? 0 : 1, row, 1, 1);
this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE);
if (this._controlTable) {
this._controlTable.destroy_all_children();
this._controlTable.destroy();
}
this._controlTable = table;
this._content.add_child(table);
}
_updateSensitivity(sensitive) {
if (this._passwordEntry) {
this._passwordEntry.reactive = sensitive;
@@ -169,7 +123,6 @@ class KeyringDialog extends ModalDialog.ModalDialog {
this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive;
this._setWorking(!sensitive);
}
_ensureOpen() {
@@ -191,16 +144,16 @@ class KeyringDialog extends ModalDialog.ModalDialog {
}
_onShowPassword() {
this._buildControlTable();
this._ensureOpen();
this._updateSensitivity(true);
this._passwordEntry.text = '';
this._passwordEntry.grab_key_focus();
}
_onShowConfirm() {
this._buildControlTable();
this._ensureOpen();
this._updateSensitivity(true);
this._confirmEntry.text = '';
this._continueButton.grab_key_focus();
}

View File

@@ -33,38 +33,26 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
title: this._content.title,
description: this._content.message,
});
this.contentLayout.add_actor(contentBox);
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
layout_manager: layout });
layout.hookup_style(secretTable);
let rtl = secretTable.get_text_direction() == Clutter.TextDirection.RTL;
let initialFocusSet = false;
let pos = 0;
for (let i = 0; i < this._content.secrets.length; i++) {
let secret = this._content.secrets[i];
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
text: secret.label,
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER });
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
let reactive = secret.key != null;
let entryParams = {
style_class: 'prompt-dialog-password-entry',
hint_text: secret.label,
text: secret.value,
can_focus: reactive,
reactive,
x_expand: true,
x_align: Clutter.ActorAlign.CENTER,
};
if (secret.password)
secret.entry = new St.PasswordEntry(entryParams);
else
secret.entry = new St.Entry(entryParams);
ShellEntry.addContextMenu(secret.entry);
contentBox.add_child(secret.entry);
if (secret.validate)
secret.valid = secret.validate(secret);
@@ -89,36 +77,26 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
} else {
secret.valid = true;
}
if (rtl) {
layout.attach(secret.entry, 0, pos, 1, 1);
layout.attach(label, 1, pos, 1, 1);
} else {
layout.attach(label, 0, pos, 1, 1);
layout.attach(secret.entry, 1, pos, 1, 1);
}
pos++;
}
if (this._content.secrets.some(s => s.password)) {
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
if (rtl)
layout.attach(this._capsLockWarningLabel, 0, pos, 1, 1);
else
layout.attach(this._capsLockWarningLabel, 1, pos, 1, 1);
let capsLockWarning = new ShellEntry.CapsLockWarning();
contentBox.add_child(capsLockWarning);
}
contentBox.add_child(secretTable);
if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) {
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
text: _("Alternatively you can connect by pushing the “WPS” button on your router.") });
let descriptionLabel = new St.Label({
text: _('Alternatively you can connect by pushing the “WPS” button on your router.'),
style_class: 'message-dialog-description',
});
descriptionLabel.clutter_text.line_wrap = true;
descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
contentBox.add_child(descriptionLabel);
}
this.contentLayout.add_child(contentBox);
this._okButton = {
label: _("Connect"),
action: this._onOk.bind(this),
@@ -325,7 +303,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
case '802-11-wireless':
wirelessSetting = this._connection.get_setting_wireless();
ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
content.title = _("Authentication required by wireless network");
content.title = _('Authentication required');
content.message = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
this._getWirelessSecrets(content.secrets, wirelessSetting);
break;
@@ -353,7 +331,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
// fall through
case 'cdma':
case 'bluetooth':
content.title = _("Mobile broadband network password");
content.title = _('Authentication required');
content.message = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
this._getMobileSecrets(content.secrets, connectionType);
break;
@@ -700,7 +678,7 @@ var NetworkAgent = class {
case '802-11-wireless': {
let wirelessSetting = connection.get_setting_wireless();
let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
title = _("Authentication required by wireless network");
title = _('Authentication required');
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
break;
}
@@ -721,7 +699,7 @@ var NetworkAgent = class {
// fall through
case 'cdma':
case 'bluetooth':
title = _("Mobile broadband network password");
title = _('Authentication required');
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
break;
case 'vpn':

View File

@@ -4,21 +4,19 @@
const { AccountsService, Clutter, GLib,
GObject, Pango, PolkitAgent, Polkit, Shell, St } = imports.gi;
const Animation = imports.ui.animation;
const Dialog = imports.ui.dialog;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
const UserWidget = imports.ui.userWidget;
const Util = imports.misc.util;
const DialogMode = {
AUTH: 0,
CONFIRM: 1,
};
var DIALOG_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16;
const DIALOG_ICON_SIZE = 64;
const DELAYED_RESET_TIMEOUT = 200;
@@ -40,8 +38,10 @@ var AuthenticationDialog = GObject.registerClass({
let title = _("Authentication Required");
let content = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_actor(content);
let headerContent = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_child(headerContent);
let bodyContent = new Dialog.MessageDialogContent();
if (userNames.length > 1) {
log(`polkitAuthenticationAgent: Received ${userNames.length} ` +
@@ -59,22 +59,21 @@ var AuthenticationDialog = GObject.registerClass({
let userBox = new St.BoxLayout({
style_class: 'polkit-dialog-user-layout',
vertical: false,
vertical: true,
});
content.add_child(userBox);
bodyContent.add_child(userBox);
this._userAvatar = new UserWidget.Avatar(this._user, {
iconSize: DIALOG_ICON_SIZE,
styleClass: 'polkit-dialog-user-icon',
});
this._userAvatar.x_align = Clutter.ActorAlign.CENTER;
userBox.add_child(this._userAvatar);
this._userLabel = new St.Label({
style_class: userName === 'root'
? 'polkit-dialog-user-root-label'
: 'polkit-dialog-user-label',
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
});
if (userName === 'root')
@@ -82,58 +81,60 @@ var AuthenticationDialog = GObject.registerClass({
userBox.add_child(this._userLabel);
this._passwordBox = new St.BoxLayout({ vertical: false, style_class: 'prompt-dialog-password-box' });
content.add_child(this._passwordBox);
this._passwordLabel = new St.Label({
style_class: 'prompt-dialog-password-label',
y_align: Clutter.ActorAlign.CENTER,
let passwordBox = new St.BoxLayout({
style_class: 'prompt-dialog-password-layout',
vertical: true,
});
this._passwordBox.add_child(this._passwordLabel);
this._passwordEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
text: "",
can_focus: true,
x_expand: true,
visible: false,
x_align: Clutter.ActorAlign.CENTER,
});
ShellEntry.addContextMenu(this._passwordEntry);
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._passwordEntry.bind_property('reactive',
this._passwordEntry.clutter_text, 'editable',
GObject.BindingFlags.SYNC_CREATE);
this._passwordBox.add_child(this._passwordEntry);
passwordBox.add_child(this._passwordEntry);
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
animate: true,
});
this._passwordBox.add(this._workSpinner);
let warningBox = new St.BoxLayout({ vertical: true });
this._passwordBox.hide();
let capsLockWarning = new ShellEntry.CapsLockWarning();
content.add_child(capsLockWarning);
this._passwordEntry.bind_property('visible',
capsLockWarning, 'visible',
GObject.BindingFlags.SYNC_CREATE);
warningBox.add_child(capsLockWarning);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
this._errorMessageLabel = new St.Label({
style_class: 'prompt-dialog-error-label',
visible: false,
});
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._errorMessageLabel.clutter_text.line_wrap = true;
content.add_child(this._errorMessageLabel);
this._errorMessageLabel.hide();
warningBox.add_child(this._errorMessageLabel);
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
this._infoMessageLabel = new St.Label({
style_class: 'prompt-dialog-info-label',
visible: false,
});
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._infoMessageLabel.clutter_text.line_wrap = true;
content.add_child(this._infoMessageLabel);
this._infoMessageLabel.hide();
warningBox.add_child(this._infoMessageLabel);
/* text is intentionally non-blank otherwise the height is not the same as for
* infoMessage and errorMessageLabel - but it is still invisible because
* gnome-shell.css sets the color to be transparent
*/
this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
text: 'abc' });
this._nullMessageLabel.add_style_class_name('hidden');
this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label' });
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._nullMessageLabel.clutter_text.line_wrap = true;
content.add_child(this._nullMessageLabel);
this._nullMessageLabel.show();
warningBox.add_child(this._nullMessageLabel);
passwordBox.add_child(warningBox);
bodyContent.add_child(passwordBox);
this._cancelButton = this.addButton({ label: _("Cancel"),
action: this.cancel.bind(this),
@@ -149,6 +150,8 @@ var AuthenticationDialog = GObject.registerClass({
this._okButton.reactive = text.get_text().length > 0;
});
this.contentLayout.add_child(bodyContent);
this._doneEmitted = false;
this._mode = -1;
@@ -163,13 +166,6 @@ var AuthenticationDialog = GObject.registerClass({
this._onUserChanged();
}
_setWorking(working) {
if (working)
this._workSpinner.play();
else
this._workSpinner.stop();
}
_initiateSession() {
this._destroySession(DELAYED_RESET_TIMEOUT);
@@ -218,7 +214,6 @@ var AuthenticationDialog = GObject.registerClass({
this._passwordEntry.reactive = false;
this._okButton.reactive = false;
this._setWorking(true);
this._session.response(response);
// When the user responds, dismiss already shown info and
@@ -260,6 +255,8 @@ var AuthenticationDialog = GObject.registerClass({
this._errorMessageLabel.show();
this._infoMessageLabel.hide();
this._nullMessageLabel.hide();
Util.wiggle(this._passwordEntry);
}
/* Try and authenticate again */
@@ -273,19 +270,20 @@ var AuthenticationDialog = GObject.registerClass({
this._sessionRequestTimeoutId = 0;
}
// Cheap localization trick
if (request == 'Password:' || request == 'Password: ')
this._passwordLabel.set_text(_("Password:"));
// Hack: The request string comes directly from PAM, if it's "Password:"
// we replace it with our own, if it's something else we replace the
// last colon and any trailing spaces with a "…".
if (request === 'Password:' || request === 'Password: ')
this._passwordEntry.hint_text = _('Enter Password…');
else
this._passwordLabel.set_text(request);
this._passwordEntry.hint_text = request.replace(/: *$/, '…');
this._passwordEntry.password_visible = echoOn;
this._passwordBox.show();
this._passwordEntry.show();
this._passwordEntry.set_text('');
this._passwordEntry.reactive = true;
this._okButton.reactive = false;
this._setWorking(false);
this._ensureOpen();
this._passwordEntry.grab_key_focus();
@@ -332,7 +330,7 @@ var AuthenticationDialog = GObject.registerClass({
if (this.state != ModalDialog.State.OPENED)
return;
this._passwordBox.hide();
this._passwordEntry.hide();
this._cancelButton.grab_key_focus();
this._okButton.reactive = false;
};

View File

@@ -1,12 +1,14 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported init connect disconnect */
const { GLib, Gio, St } = imports.gi;
const { GLib, Gio, GObject, Shell, St } = imports.gi;
const Signals = imports.signals;
const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils;
const FileUtils = imports.misc.fileUtils;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const { ExtensionState, ExtensionType } = ExtensionUtils;
@@ -15,10 +17,13 @@ const DISABLED_EXTENSIONS_KEY = 'disabled-extensions';
const DISABLE_USER_EXTENSIONS_KEY = 'disable-user-extensions';
const EXTENSION_DISABLE_VERSION_CHECK_KEY = 'disable-extension-version-validation';
const UPDATE_CHECK_TIMEOUT = 24 * 60 * 60; // 1 day in seconds
var ExtensionManager = class {
constructor() {
this._initialized = false;
this._enabled = false;
this._updateNotified = false;
this._extensions = new Map();
this._enabledExtensions = [];
@@ -47,6 +52,12 @@ var ExtensionManager = class {
this._installExtensionUpdates();
this._sessionUpdated();
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, UPDATE_CHECK_TIMEOUT, () => {
ExtensionDownloader.checkForUpdates();
return GLib.SOURCE_CONTINUE;
});
ExtensionDownloader.checkForUpdates();
}
lookup(uuid) {
@@ -206,6 +217,18 @@ var ExtensionManager = class {
extension.hasUpdate = true;
this.emit('extension-state-changed', extension);
if (!this._updateNotified) {
this._updateNotified = true;
let source = new ExtensionUpdateSource();
Main.messageTray.add(source);
let notification = new MessageTray.Notification(source,
_('Extension Updates Available'),
_('Extension updates are ready to be installed.'));
source.showNotification(notification);
}
}
logExtensionError(uuid, error) {
@@ -557,3 +580,27 @@ var ExtensionManager = class {
}
};
Signals.addSignalMethods(ExtensionManager.prototype);
const ExtensionUpdateSource = GObject.registerClass(
class ExtensionUpdateSource extends MessageTray.Source {
_init() {
let appSys = Shell.AppSystem.get_default();
this._app = appSys.lookup_app('org.gnome.Extensions.desktop');
super._init(this._app.get_name());
}
getIcon() {
return this._app.app_info.get_icon();
}
_createPolicy() {
return new MessageTray.NotificationApplicationPolicy(this._app.id);
}
open() {
this._app.activate();
Main.overview.hide();
Main.panel.closeCalendar();
}
});

View File

@@ -137,6 +137,7 @@ class OverviewActor extends St.BoxLayout {
var Overview = class {
constructor() {
this._initCalled = false;
this._visible = false;
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._sessionUpdated();

View File

@@ -302,7 +302,7 @@ var GnomeShellExtensions = class {
LaunchExtensionPrefs(uuid) {
let appSys = Shell.AppSystem.get_default();
let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');
let app = appSys.lookup_app('org.gnome.Extensions.desktop');
let info = app.get_app_info();
let timestamp = global.display.get_current_time_roundtrip();
info.launch_uris([`extension:///${uuid}`],

View File

@@ -164,7 +164,9 @@ class CapsLockWarning extends St.Label {
this.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.clutter_text.line_wrap = true;
this._keymap = Clutter.get_default_backend().get_keymap();
let seat = Clutter.get_default_backend().get_default_seat();
this._keymap = seat.get_keymap();
this._stateChangedId = 0;
this.connect('notify::mapped', () => {
if (this.is_mapped()) {

View File

@@ -13,6 +13,7 @@ const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry;
const { loadInterfaceXML } = imports.misc.fileUtils;
const Util = imports.misc.util;
var LIST_ITEM_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16;
@@ -269,21 +270,18 @@ var ShellMountPasswordDialog = GObject.registerClass({
let disksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.DiskUtility.desktop');
let content = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_actor(content);
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let grid = new St.Widget({ style_class: 'prompt-dialog-grid',
layout_manager: layout });
layout.hookup_style(grid);
let rtl = grid.get_text_direction() === Clutter.TextDirection.RTL;
let passwordGridLayout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let passwordGrid = new St.Widget({
style_class: 'prompt-dialog-password-grid',
layout_manager: passwordGridLayout,
});
passwordGridLayout.hookup_style(passwordGrid);
let rtl = passwordGrid.get_text_direction() === Clutter.TextDirection.RTL;
let curGridRow = 0;
if (flags & Gio.AskPasswordFlags.TCRYPT) {
this._keyfilesLabel = new St.Label({
style_class: 'prompt-dialog-keyfiles-label',
visible: false,
y_align: Clutter.ActorAlign.CENTER,
});
this._hiddenVolume = new CheckBox.CheckBox(_("Hidden Volume"));
content.add_child(this._hiddenVolume);
@@ -294,6 +292,7 @@ var ShellMountPasswordDialog = GObject.registerClass({
this._keyfilesCheckbox.connect("clicked", this._onKeyfilesCheckboxClicked.bind(this));
content.add_child(this._keyfilesCheckbox);
this._keyfilesLabel = new St.Label({ visible: false });
this._keyfilesLabel.clutter_text.set_markup(
/* Translators: %s is the Disks application */
_("To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead.").format(disksApp.get_name())
@@ -302,71 +301,65 @@ var ShellMountPasswordDialog = GObject.registerClass({
this._keyfilesLabel.clutter_text.line_wrap = true;
content.add_child(this._keyfilesLabel);
this._pimLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
text: _("PIM Number"),
y_align: Clutter.ActorAlign.CENTER });
this._pimEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
hint_text: _('Enter PIM Number…'),
can_focus: true,
x_expand: true,
});
this._pimEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
ShellEntry.addContextMenu(this._pimEntry);
if (rtl) {
layout.attach(this._pimEntry, 0, 0, 1, 1);
layout.attach(this._pimLabel, 1, 0, 1, 1);
} else {
layout.attach(this._pimLabel, 0, 0, 1, 1);
layout.attach(this._pimEntry, 1, 0, 1, 1);
}
this._pimErrorMessageLabel = new St.Label({ style_class: 'prompt-dialog-password-entry',
text: _("The PIM must be a number or empty."),
visible: false });
layout.attach(this._pimErrorMessageLabel, 0, 2, 2, 1);
if (rtl)
passwordGridLayout.attach(this._pimEntry, 1, curGridRow, 1, 1);
else
passwordGridLayout.attach(this._pimEntry, 0, curGridRow, 1, 1);
curGridRow += 1;
} else {
this._hiddenVolume = null;
this._systemVolume = null;
this._pimEntry = null;
this._pimErrorMessageLabel = null;
}
this._passwordLabel = new St.Label({ style_class: 'prompt-dialog-password-label',
text: _("Password"),
y_align: Clutter.ActorAlign.CENTER });
this._passwordEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
hint_text: _('Enter Password…'),
can_focus: true,
x_expand: true,
});
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
ShellEntry.addContextMenu(this._passwordEntry);
this.setInitialKeyFocus(this._passwordEntry);
ShellEntry.addContextMenu(this._passwordEntry);
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
animate: true,
});
this._passwordEntry.secondary_icon = this._workSpinner;
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
if (rtl) {
layout.attach(this._passwordEntry, 0, 1, 1, 1);
layout.attach(this._passwordLabel, 1, 1, 1, 1);
layout.attach(this._capsLockWarningLabel, 0, 2, 1, 1);
passwordGridLayout.attach(this._workSpinner, 0, curGridRow, 1, 1);
passwordGridLayout.attach(this._passwordEntry, 1, curGridRow, 1, 1);
} else {
layout.attach(this._passwordLabel, 0, 1, 1, 1);
layout.attach(this._passwordEntry, 1, 1, 1, 1);
layout.attach(this._capsLockWarningLabel, 1, 2, 1, 1);
passwordGridLayout.attach(this._passwordEntry, 0, curGridRow, 1, 1);
passwordGridLayout.attach(this._workSpinner, 1, curGridRow, 1, 1);
}
curGridRow += 1;
content.add_child(grid);
let warningBox = new St.BoxLayout({ vertical: true });
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didnt work. Please try again.") });
let capsLockWarning = new ShellEntry.CapsLockWarning();
warningBox.add_child(capsLockWarning);
this._errorMessageLabel = new St.Label({
style_class: 'prompt-dialog-error-label',
opacity: 0,
});
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._errorMessageLabel.clutter_text.line_wrap = true;
this._errorMessageLabel.hide();
content.add_child(this._errorMessageLabel);
warningBox.add_child(this._errorMessageLabel);
passwordGridLayout.attach(warningBox, 0, curGridRow, 2, 1);
content.add_child(passwordGrid);
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
@@ -377,6 +370,8 @@ var ShellMountPasswordDialog = GObject.registerClass({
this._rememberChoice = null;
}
this.contentLayout.add_child(content);
this._defaultButtons = [{
label: _("Cancel"),
action: this._onCancelButton.bind(this),
@@ -402,9 +397,12 @@ var ShellMountPasswordDialog = GObject.registerClass({
}
reaskPassword() {
this._passwordEntry.set_text('');
this._errorMessageLabel.show();
this._workSpinner.stop();
this._passwordEntry.set_text('');
this._errorMessageLabel.text = _('Sorry, that didnt work. Please try again.');
this._errorMessageLabel.opacity = 255;
Util.wiggle(this._passwordEntry);
}
_onCancelButton() {
@@ -417,14 +415,17 @@ var ShellMountPasswordDialog = GObject.registerClass({
_onEntryActivate() {
let pim = 0;
if (this._pimEntry !== null)
if (this._pimEntry !== null) {
pim = this._pimEntry.get_text();
if (isNaN(pim)) {
this._pimEntry.set_text('');
this._pimErrorMessageLabel.show();
return;
} else if (this._pimErrorMessageLabel !== null) {
this._pimErrorMessageLabel.hide();
if (isNaN(pim)) {
this._pimEntry.set_text('');
this._errorMessageLabel.text = _('The PIM must be a number or empty.');
this._errorMessageLabel.opacity = 255;
return;
}
this._errorMessageLabel.opacity = 0;
}
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,

View File

@@ -45,21 +45,17 @@ const WINDOW_DIMMER_EFFECT_NAME = "gnome-shell-window-dimmer";
var DisplayChangeDialog = GObject.registerClass(
class DisplayChangeDialog extends ModalDialog.ModalDialog {
_init(wm) {
super._init({ styleClass: 'prompt-dialog' });
super._init();
this._wm = wm;
this._countDown = Meta.MonitorManager.get_display_configuration_timeout();
let title = _("Do you want to keep these display settings?");
// Translators: This string should be shorter than 30 characters
let title = _('Keep these display settings?');
let description = this._formatCountDown();
this._content = new Dialog.MessageDialogContent({
title, description,
x_expand: true,
y_expand: true,
});
this._content = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_child(this._content);
/* Translators: this and the following message should be limited in length,

View File

@@ -55,6 +55,7 @@ pkglibdir = join_paths(libdir, meson.project_name())
autostartdir = join_paths(sysconfdir, 'xdg', 'autostart')
convertdir = join_paths(datadir, 'GConf', 'gsettings')
desktopdir = join_paths(datadir, 'applications')
icondir = join_paths(datadir, 'icons')
ifacedir = join_paths(datadir, 'dbus-1', 'interfaces')
localedir = join_paths(datadir, 'locale')
portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals')

View File

@@ -8,6 +8,12 @@ datadir = os.path.join(prefix, 'share')
# Packaging tools define DESTDIR and this isn't needed for them
if 'DESTDIR' not in os.environ:
print('Updating icon cache...')
icon_cache_dir = os.path.join(datadir, 'icons', 'hicolor')
if not os.path.exists(icon_cache_dir):
os.makedirs(icon_cache_dir)
subprocess.call(['gtk-update-icon-cache', '-qtf', icon_cache_dir])
print('Updating desktop database...')
desktop_database_dir = os.path.join(datadir, 'applications')
if not os.path.exists(desktop_database_dir):

View File

@@ -1,11 +1,12 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
data/50-gnome-shell-system.xml
data/gnome-shell-extension-prefs.desktop.in.in
data/org.gnome.Extensions.desktop.in.in
data/org.gnome.Shell.desktop.in.in
data/org.gnome.shell.gschema.xml.in
data/org.gnome.Shell.PortalHelper.desktop.in.in
js/extensionPrefs/main.js
js/extensionPrefs/ui/extensions-window.ui
js/gdm/authPrompt.js
js/gdm/loginDialog.js
js/gdm/util.js

216
po/es.po
View File

@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-01-28 15:54+0000\n"
"PO-Revision-Date: 2020-01-29 10:33+0100\n"
"POT-Creation-Date: 2020-02-01 07:15+0000\n"
"PO-Revision-Date: 2020-02-03 12:01+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es_ES\n"
@@ -463,24 +463,24 @@ msgstr ""
"No es posible obtener la lista de extensiones instaladas. asegúrese de que "
"ha iniciado sesión en GNOME e inténtelo de nuevo."
#: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:129 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:190
#: js/ui/shellMountOperation.js:381 js/ui/shellMountOperation.js:391
#: js/gdm/authPrompt.js:170 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:107 js/ui/components/polkitAgent.js:139
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:166
#: js/ui/shellMountOperation.js:376 js/ui/shellMountOperation.js:386
#: js/ui/status/network.js:910
msgid "Cancel"
msgstr "Cancelar"
#: js/gdm/authPrompt.js:188 js/gdm/authPrompt.js:241 js/gdm/authPrompt.js:476
#: js/gdm/authPrompt.js:184 js/gdm/authPrompt.js:237 js/gdm/authPrompt.js:468
msgid "Next"
msgstr "Siguiente"
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:385
#: js/gdm/authPrompt.js:233 js/ui/shellMountOperation.js:380
#: js/ui/unlockDialog.js:44
msgid "Unlock"
msgstr "Desbloquear"
#: js/gdm/authPrompt.js:239
#: js/gdm/authPrompt.js:235
msgctxt "button"
msgid "Sign In"
msgstr "Iniciar sesión"
@@ -503,8 +503,8 @@ msgstr "(ej., usuario o %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:234
#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:275
msgid "Username: "
msgstr "Nombre de usuario:"
@@ -582,81 +582,78 @@ msgstr "cambiar;usuario"
#. Translators: A list of keywords that match the lock orientation action, separated by semicolons
#: js/misc/systemActions.js:131
#| msgid "lock orientation;screen;rotation"
msgid "lock orientation;unlock orientation;screen;rotation"
msgstr "bloquear orientación;desbloquear orientación;pantalla;rotación"
#: js/misc/systemActions.js:251
#| msgid "Lock Screen Rotation"
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Desbloquear la rotación de la pantalla"
#: js/misc/systemActions.js:252
#| msgid "Lock Screen Rotation"
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Bloquear la rotación de la pantalla"
#: js/misc/util.js:116
#: js/misc/util.js:120
msgid "Command not found"
msgstr "Comando no encontrado"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: js/misc/util.js:152
#: js/misc/util.js:156
msgid "Could not parse command:"
msgstr "No se pudo analizar el comando:"
#: js/misc/util.js:160
#: js/misc/util.js:164
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Falló la ejecución de «%s»:"
#: js/misc/util.js:177
#: js/misc/util.js:181
msgid "Just now"
msgstr "Ahora mismo"
#: js/misc/util.js:179
#: js/misc/util.js:183
#, javascript-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Hace %d minuto"
msgstr[1] "Hace %d minutos"
#: js/misc/util.js:183
#: js/misc/util.js:187
#, javascript-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas"
#: js/misc/util.js:187
#: js/misc/util.js:191
msgid "Yesterday"
msgstr "Ayer"
#: js/misc/util.js:189
#: js/misc/util.js:193
#, javascript-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Hace %d día"
msgstr[1] "Hace %d días"
#: js/misc/util.js:193
#: js/misc/util.js:197
#, javascript-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "Hace %d semana"
msgstr[1] "Hace %d semanas"
#: js/misc/util.js:197
#: js/misc/util.js:201
#, javascript-format
msgid "%d month ago"
msgid_plural "%d months ago"
msgstr[0] "Hace %d mes"
msgstr[1] "Hace %d meses"
#: js/misc/util.js:200
#: js/misc/util.js:204
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
@@ -664,20 +661,20 @@ msgstr[0] "Hace %d año"
msgstr[1] "Hace %d años"
#. Translators: Time in 24h format
#: js/misc/util.js:233
#: js/misc/util.js:237
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/misc/util.js:239
#: js/misc/util.js:243
#, no-c-format
msgid "Yesterday, %H%M"
msgstr "Ayer, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30"
#: js/misc/util.js:245
#: js/misc/util.js:249
#, no-c-format
msgid "%A, %H%M"
msgstr "%A, %H%M"
@@ -685,7 +682,7 @@ msgstr "%A, %H%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30"
#: js/misc/util.js:251
#: js/misc/util.js:255
#, no-c-format
msgid "%B %-d, %H%M"
msgstr "%d de %B, %H%M"
@@ -693,7 +690,7 @@ msgstr "%d de %B, %H%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30"
#: js/misc/util.js:257
#: js/misc/util.js:261
#, no-c-format
msgid "%B %-d %Y, %H%M"
msgstr "%d de %B de %Y, %H%M"
@@ -701,20 +698,20 @@ msgstr "%d de %B de %Y, %H%M"
#. Show only the time if date is on today
#. eslint-disable-line no-lonely-if
#. Translators: Time in 12h format
#: js/misc/util.js:262
#: js/misc/util.js:266
msgid "%l%M %p"
msgstr "%l%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm"
#: js/misc/util.js:268
#: js/misc/util.js:272
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Ayer a las %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/misc/util.js:274
#: js/misc/util.js:278
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@@ -722,7 +719,7 @@ msgstr "%A, %l%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm"
#: js/misc/util.js:280
#: js/misc/util.js:284
#, no-c-format
msgid "%B %-d, %l%M %p"
msgstr "%d de %B, %l%M %p"
@@ -730,17 +727,17 @@ msgstr "%d de %B, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"
#: js/misc/util.js:286
#: js/misc/util.js:290
#, no-c-format
msgid "%B %-d %Y, %l%M %p"
msgstr "%d de %B de %Y, %l%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:40
#: js/portalHelper/main.js:42
msgid "Hotspot Login"
msgstr "Inicio de sesión en el punto de acceso"
#: js/portalHelper/main.js:86
#: js/portalHelper/main.js:88
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@@ -1013,54 +1010,47 @@ msgstr "La versión de udisks instalada no soporta la configuración PIM"
msgid "Open with %s"
msgstr "Abrir con %s"
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278
msgid "Password:"
msgstr "Contraseña:"
#: js/ui/components/keyring.js:104
msgid "Type again:"
msgstr "Escriba de nuevo:"
#: js/ui/components/networkAgent.js:115
#: js/ui/components/networkAgent.js:89
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr ""
"Alternativamente puede conectarse pulsando el botón «WPS» de su router."
#: js/ui/components/networkAgent.js:123 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:913
msgid "Connect"
msgstr "Conectar"
#. Cisco LEAP
#: js/ui/components/networkAgent.js:224 js/ui/components/networkAgent.js:236
#: js/ui/components/networkAgent.js:260 js/ui/components/networkAgent.js:281
#: js/ui/components/networkAgent.js:301 js/ui/components/networkAgent.js:311
#: js/ui/components/networkAgent.js:202 js/ui/components/networkAgent.js:214
#: js/ui/components/networkAgent.js:238 js/ui/components/networkAgent.js:259
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:289
msgid "Password: "
msgstr "Contraseña: "
#. static WEP
#: js/ui/components/networkAgent.js:229
#: js/ui/components/networkAgent.js:207
msgid "Key: "
msgstr "Clave:"
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287
#: js/ui/components/networkAgent.js:242 js/ui/components/networkAgent.js:265
msgid "Private key password: "
msgstr "Contraseña de la clave privada:"
#: js/ui/components/networkAgent.js:285
#: js/ui/components/networkAgent.js:263
msgid "Identity: "
msgstr "Identidad:"
#: js/ui/components/networkAgent.js:299
#: js/ui/components/networkAgent.js:277
msgid "Service: "
msgstr "Servicio:"
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703
msgid "Authentication required by wireless network"
msgstr "La red inalámbrica requiere autenticación"
#: js/ui/components/networkAgent.js:306 js/ui/components/networkAgent.js:334
#: js/ui/components/networkAgent.js:681 js/ui/components/networkAgent.js:702
msgid "Authentication required"
msgstr "Autenticación requerida"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
#: js/ui/components/networkAgent.js:307 js/ui/components/networkAgent.js:682
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -1069,58 +1059,54 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»."
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada"
#: js/ui/components/networkAgent.js:335
#: js/ui/components/networkAgent.js:313
msgid "Network name: "
msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
msgid "DSL authentication"
msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:695
msgid "PIN code required"
msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
#: js/ui/components/networkAgent.js:326 js/ui/components/networkAgent.js:696
msgid "PIN code is needed for the mobile broadband device"
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
#: js/ui/components/networkAgent.js:349
#: js/ui/components/networkAgent.js:327
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724
msgid "Mobile broadband network password"
msgstr "Contraseña de la red de banda ancha móvil"
#: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:709
#: js/ui/components/networkAgent.js:713 js/ui/components/networkAgent.js:725
#: js/ui/components/networkAgent.js:729
#: js/ui/components/networkAgent.js:335 js/ui/components/networkAgent.js:687
#: js/ui/components/networkAgent.js:691 js/ui/components/networkAgent.js:703
#: js/ui/components/networkAgent.js:707
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Se requiere una contraseña para conectarse a «%s»."
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688
#: js/ui/components/networkAgent.js:670 js/ui/status/network.js:1688
msgid "Network Manager"
msgstr "Gestor de la red"
#: js/ui/components/networkAgent.js:728
#: js/ui/components/networkAgent.js:706
msgid "VPN password"
msgstr "Contraseña de la VPN"
#: js/ui/components/polkitAgent.js:41
#: js/ui/components/polkitAgent.js:39
msgid "Authentication Required"
msgstr "Se necesita autenticación"
#: js/ui/components/polkitAgent.js:81
#: js/ui/components/polkitAgent.js:80
msgid "Administrator"
msgstr "Administrador"
#: js/ui/components/polkitAgent.js:141
#: js/ui/components/polkitAgent.js:142
msgid "Authenticate"
msgstr "Autenticar"
@@ -1128,10 +1114,15 @@ msgstr "Autenticar"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:365
#: js/ui/components/polkitAgent.js:254 js/ui/shellMountOperation.js:402
msgid "Sorry, that didnt work. Please try again."
msgstr "Eso no ha funcionado. Inténtelo de nuevo."
#: js/ui/components/polkitAgent.js:277 js/ui/shellMountOperation.js:326
#| msgid "Remember Password"
msgid "Enter Password…"
msgstr "Introduzca la contraseña…"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
@@ -1347,15 +1338,15 @@ msgstr "%s (remoto)"
msgid "%s (console)"
msgstr "%s (consola)"
#: js/ui/extensionDownloader.js:194
#: js/ui/extensionDownloader.js:170
msgid "Install"
msgstr "Instalar"
#: js/ui/extensionDownloader.js:200
#: js/ui/extensionDownloader.js:176
msgid "Install Extension"
msgstr "Instalar extensión"
#: js/ui/extensionDownloader.js:201
#: js/ui/extensionDownloader.js:177
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
@@ -1712,20 +1703,20 @@ msgstr "Ocultar texto"
msgid "Caps lock is on."
msgstr "Bloq. Mayús. está activo"
#: js/ui/shellMountOperation.js:287
#: js/ui/shellMountOperation.js:285
msgid "Hidden Volume"
msgstr "Ocultar volumen"
#: js/ui/shellMountOperation.js:290
#: js/ui/shellMountOperation.js:288
msgid "Windows System Volume"
msgstr "Volumen de sistema Windows"
#: js/ui/shellMountOperation.js:293
#: js/ui/shellMountOperation.js:291
msgid "Uses Keyfiles"
msgstr "Usa archivos de claves"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:299
#: js/ui/shellMountOperation.js:298
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
@@ -1734,35 +1725,32 @@ msgstr ""
"%s</i> en su lugar."
#: js/ui/shellMountOperation.js:306
msgid "PIM Number"
msgstr "Número PIM"
#| msgid "PIM Number"
msgid "Enter PIM Number…"
msgstr "Introduzca el número PIM…"
#: js/ui/shellMountOperation.js:325
msgid "The PIM must be a number or empty."
msgstr "El PIM debe ser un número o estar vacío."
#: js/ui/shellMountOperation.js:336
msgid "Password"
msgstr "Contraseña"
#: js/ui/shellMountOperation.js:372
#: js/ui/shellMountOperation.js:365
msgid "Remember Password"
msgstr "Recordar contraseña"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:396
#: js/ui/shellMountOperation.js:391
#, javascript-format
msgid "Open %s"
msgstr "Abrir %s"
#: js/ui/shellMountOperation.js:423
msgid "The PIM must be a number or empty."
msgstr "El PIM debe ser un número o estar vacío."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:468
#: js/ui/shellMountOperation.js:469
#, javascript-format
msgid "Unable to start %s"
msgstr "No se puede iniciar %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:470
#: js/ui/shellMountOperation.js:471
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "No se pudo encontrar la aplicación %s"
@@ -2290,22 +2278,24 @@ msgstr "Buscar"
msgid "“%s” is ready"
msgstr "«%s» está preparado"
#: js/ui/windowManager.js:54
msgid "Do you want to keep these display settings?"
#. Translators: This string should be shorter than 30 characters
#: js/ui/windowManager.js:55
#| msgid "Do you want to keep these display settings?"
msgid "Keep these display settings?"
msgstr "¿Quiere mantener esta configuración de la pantalla?"
#. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:68
#: js/ui/windowManager.js:64
msgid "Revert Settings"
msgstr "Revertir configuración"
#: js/ui/windowManager.js:71
#: js/ui/windowManager.js:67
msgid "Keep Changes"
msgstr "Mantener cambios"
#: js/ui/windowManager.js:89
#: js/ui/windowManager.js:85
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -2314,7 +2304,7 @@ msgstr[1] "La configuración se revertirá en %d segundos"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546
#: js/ui/windowManager.js:542
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@@ -2773,6 +2763,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sonidos del sistema"
#~ msgid "Password:"
#~ msgstr "Contraseña:"
#~ msgid "Type again:"
#~ msgstr "Escriba de nuevo:"
#~ msgid "Authentication required by wireless network"
#~ msgstr "La red inalámbrica requiere autenticación"
#~ msgid "Mobile broadband network password"
#~ msgstr "Contraseña de la red de banda ancha móvil"
#~ msgid "Password"
#~ msgstr "Contraseña"
#~ msgctxt "search-result"
#~ msgid "Lock Orientation"
#~ msgstr "Bloquear la orientación"
@@ -2885,9 +2890,6 @@ msgstr "Sonidos del sistema"
#~ msgstr[0] "%d dispositivo conectado"
#~ msgstr[1] "%d dispositivos conectados"
#~ msgid "Authentication required"
#~ msgstr "Autenticación requerida"
#~ msgid "UPS"
#~ msgstr "SAI"

459
po/hr.po

File diff suppressed because it is too large Load Diff

1512
po/lt.po

File diff suppressed because it is too large Load Diff

1190
po/mjw.po

File diff suppressed because it is too large Load Diff

375
po/sk.po
View File

@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2020-01-28 15:54+0000\n"
"PO-Revision-Date: 2020-01-29 14:12+0100\n"
"POT-Creation-Date: 2020-02-03 20:34+0000\n"
"PO-Revision-Date: 2020-02-04 10:59+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
@@ -51,12 +51,17 @@ msgstr "Zobraziť všetky aplikácie"
msgid "Open the application menu"
msgstr "Otvoriť ponuku aplikácií"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:209
msgid "Shell Extensions"
msgstr "Rozšírenia pre Shell"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Rozšírenia"
#: data/gnome-shell-extension-prefs.desktop.in.in:5
#: data/org.gnome.Extensions.desktop.in.in:5
#| msgid "Shell Extensions"
msgid "org.gnome.Extensions"
msgstr "org.gnome.Extensions"
#: data/org.gnome.Extensions.desktop.in.in:6
msgid "Configure GNOME Shell Extensions"
msgstr "Nastavenie rozšírení pre Shell prostredia GNOME"
@@ -377,7 +382,7 @@ msgstr "Zobrazené umiestnenia v svetových časoch"
#: data/org.gnome.shell.gschema.xml.in:245
msgid "Automatic location"
msgstr "Automatická poloha"
msgstr "Automatické umiestnenie"
#: data/org.gnome.shell.gschema.xml.in:246
msgid "Whether to fetch the current location or not"
@@ -389,7 +394,7 @@ msgstr "Umiestnenie"
#: data/org.gnome.shell.gschema.xml.in:254
msgid "The location for which to show a forecast"
msgstr "Poloha pre zobrazenie predpovede"
msgstr "Umiestnenie, pre ktoré zobraz predpoveď"
#: data/org.gnome.shell.gschema.xml.in:266
msgid "Attach modal dialog to the parent window"
@@ -428,11 +433,44 @@ msgstr ""
msgid "Network Login"
msgstr "Sieťové prihlásenie"
#: js/extensionPrefs/main.js:102 js/extensionPrefs/main.js:525
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "Odstrániť rozšírenie „%s“?"
#: js/extensionPrefs/main.js:141
msgid ""
"If you remove the extension, you need to return to download it if you want "
"to enable it again"
msgstr ""
"Ak odstránite rozšírenie, budete ho musieť pre jeho opätovné povolenie znovu "
"prevziať."
#: js/extensionPrefs/main.js:144 js/gdm/authPrompt.js:170
#: js/ui/audioDeviceSelection.js:57 js/ui/components/networkAgent.js:107
#: js/ui/components/polkitAgent.js:139 js/ui/endSessionDialog.js:374
#: js/ui/extensionDownloader.js:166 js/ui/shellMountOperation.js:376
#: js/ui/shellMountOperation.js:386 js/ui/status/network.js:910
msgid "Cancel"
msgstr "Zrušiť"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Odstrániť"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr "Dušan Kazik <prescott66@gmail.com>"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "Spravuje vaše rozšírenia prostredia GNOME"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
msgid "Somethings gone wrong"
msgstr "Niečo sa pokazilo"
#: js/extensionPrefs/main.js:109
#: js/extensionPrefs/main.js:268
msgid ""
"Were very sorry, but theres been a problem: the settings for this "
"extension cant be displayed. We recommend that you report the issue to the "
@@ -441,39 +479,78 @@ msgstr ""
"Ospravedlňujeme sa, ale vyskytol sa problém: Nastavenia tohoto rozšírenia sa "
"nedajú zobraziť. Odporúčame vám nahlásiť problém autorom rozšírenia."
#: js/extensionPrefs/main.js:116
#: js/extensionPrefs/main.js:275
msgid "Technical Details"
msgstr "Technické podrobnosti"
#: js/extensionPrefs/main.js:151
#: js/extensionPrefs/main.js:310
msgid "Copy Error"
msgstr "Skopírovať chybu"
#: js/extensionPrefs/main.js:178
#: js/extensionPrefs/main.js:337
msgid "Homepage"
msgstr "Domovská stránka"
#: js/extensionPrefs/main.js:179
#: js/extensionPrefs/main.js:338
msgid "Visit extension homepage"
msgstr "Navštíviť domovskú stránku rozšírenia"
#: js/extensionPrefs/main.js:467
msgid "No Extensions Installed"
#: js/extensionPrefs/main.js:449
#, javascript-format
msgid "%d extension will be updated on next login."
msgid_plural "%d extensions will be updated on next login.e"
msgstr[0] "%d rozšírení bude aktualizovaných po najbližšom prihlásení."
msgstr[1] "%d rozšírenie bude aktualizované po najbližšom prihlásení."
msgstr[2] "%d rozšírenia budú aktualizované po najbližšom prihlásení."
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Pomocník"
# summary
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "O aplikácii Rozšírenia"
#: js/extensionPrefs/ui/extensions-window.ui:27
#| msgid ""
#| "Extensions can be installed through Software or <a href=\"https://"
#| "extensions.gnome.org\">extensions.gnome.org</a>."
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Ak chcete nájsť a pridať rozšírenia, navštívte adresu <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Upozornenie"
#: js/extensionPrefs/ui/extensions-window.ui:46
msgid ""
"Extensions can cause system issues, including performance problems. If you "
"encounter problems with your system, it is recommended to disable all "
"extensions."
msgstr ""
"Rozšírenia môžu spôsobiť problémy so systémom, vrátane problémov s výkonom. "
"Ak sa stretnete s problémami s vaším systémom, odporúča sa zakázať všetky "
"rozšírenia."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Ručne nainštalované"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "Vstavané"
# dialog title
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
msgstr "Žiadne nainštalované rozšírenia"
#: js/extensionPrefs/main.js:477
msgid ""
"Extensions can be installed through Software or <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
msgstr ""
"Rozšírenia môžu byť nainštalované prostredníctvom aplikácie Softvér alebo "
"lokality <a href=\"https://extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/main.js:492
msgid "Browse in Software"
msgstr "Prehliadať v aplikácii Softvér"
#: js/extensionPrefs/main.js:532
#: js/extensionPrefs/ui/extensions-window.ui:234
msgid ""
"Were very sorry, but it was not possible to get the list of installed "
"extensions. Make sure you are logged into GNOME and try again."
@@ -482,24 +559,20 @@ msgstr ""
"rozšírení. Uistite sa, že ste prihlásený do prostredia GNOME a skúste to "
"znovu."
#: js/gdm/authPrompt.js:174 js/ui/audioDeviceSelection.js:57
#: js/ui/components/networkAgent.js:129 js/ui/components/polkitAgent.js:138
#: js/ui/endSessionDialog.js:374 js/ui/extensionDownloader.js:190
#: js/ui/shellMountOperation.js:381 js/ui/shellMountOperation.js:391
#: js/ui/status/network.js:910
msgid "Cancel"
msgstr "Zrušiť"
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Logout…"
msgstr "Odhlásiť sa…"
#: js/gdm/authPrompt.js:188 js/gdm/authPrompt.js:241 js/gdm/authPrompt.js:476
#: js/gdm/authPrompt.js:184 js/gdm/authPrompt.js:237 js/gdm/authPrompt.js:468
msgid "Next"
msgstr "Ďalej"
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:385
#: js/gdm/authPrompt.js:233 js/ui/shellMountOperation.js:380
#: js/ui/unlockDialog.js:44
msgid "Unlock"
msgstr "Odomknúť"
#: js/gdm/authPrompt.js:239
#: js/gdm/authPrompt.js:235
msgctxt "button"
msgid "Sign In"
msgstr "Prihlásiť sa"
@@ -524,8 +597,8 @@ msgstr "(napr., používateľ alebo %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:234
#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:275
msgid "Username: "
msgstr "Používateľské meno: "
@@ -619,26 +692,26 @@ msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Uzamknúť otočenie obrazovky"
#: js/misc/util.js:116
#: js/misc/util.js:120
msgid "Command not found"
msgstr "Príkaz nebol nájdený"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: js/misc/util.js:152
#: js/misc/util.js:156
msgid "Could not parse command:"
msgstr "Nepodarilo sa analyzovať príkaz:"
#: js/misc/util.js:160
#: js/misc/util.js:164
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Spustenie „%s“ zlyhalo:"
#: js/misc/util.js:177
#: js/misc/util.js:181
msgid "Just now"
msgstr "Práve teraz"
#: js/misc/util.js:179
#: js/misc/util.js:183
#, javascript-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@@ -646,7 +719,7 @@ msgstr[0] "Pred %d minútou"
msgstr[1] "Pred %d minútami"
msgstr[2] "Pred %d minútami"
#: js/misc/util.js:183
#: js/misc/util.js:187
#, javascript-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@@ -654,11 +727,11 @@ msgstr[0] "Pred %d hodinou"
msgstr[1] "Pred %d hodinami"
msgstr[2] "Pred %d hodinami"
#: js/misc/util.js:187
#: js/misc/util.js:191
msgid "Yesterday"
msgstr "Včera"
#: js/misc/util.js:189
#: js/misc/util.js:193
#, javascript-format
msgid "%d day ago"
msgid_plural "%d days ago"
@@ -666,7 +739,7 @@ msgstr[0] "Pred %d dňom"
msgstr[1] "Pred %d dňami"
msgstr[2] "Pred %d dňami"
#: js/misc/util.js:193
#: js/misc/util.js:197
#, javascript-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@@ -674,7 +747,7 @@ msgstr[0] "Pred %d týždňom"
msgstr[1] "Pred %d týždňami"
msgstr[2] "Pred %d týždňami"
#: js/misc/util.js:197
#: js/misc/util.js:201
#, javascript-format
msgid "%d month ago"
msgid_plural "%d months ago"
@@ -682,7 +755,7 @@ msgstr[0] "Pred %d mesiacom"
msgstr[1] "Pred %d mesiacmi"
msgstr[2] "Pred %d mesiacmi"
#: js/misc/util.js:200
#: js/misc/util.js:204
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
@@ -691,20 +764,20 @@ msgstr[1] "Pred %d rokmi"
msgstr[2] "Pred %d rokmi"
#. Translators: Time in 24h format
#: js/misc/util.js:233
#: js/misc/util.js:237
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/misc/util.js:239
#: js/misc/util.js:243
#, no-c-format
msgid "Yesterday, %H%M"
msgstr "Včera o %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30"
#: js/misc/util.js:245
#: js/misc/util.js:249
#, no-c-format
msgid "%A, %H%M"
msgstr "%A, %H:%M"
@@ -712,7 +785,7 @@ msgstr "%A, %H:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30"
#: js/misc/util.js:251
#: js/misc/util.js:255
#, no-c-format
msgid "%B %-d, %H%M"
msgstr "%d. %B, %H:%M"
@@ -720,7 +793,7 @@ msgstr "%d. %B, %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30"
#: js/misc/util.js:257
#: js/misc/util.js:261
#, no-c-format
msgid "%B %-d %Y, %H%M"
msgstr "%d. %B %Y, %H:%M"
@@ -728,13 +801,13 @@ msgstr "%d. %B %Y, %H:%M"
#. Show only the time if date is on today
#. eslint-disable-line no-lonely-if
#. Translators: Time in 12h format
#: js/misc/util.js:262
#: js/misc/util.js:266
msgid "%l%M %p"
msgstr "%l:%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm"
#: js/misc/util.js:268
#: js/misc/util.js:272
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Včera, %l:%M %p"
@@ -744,7 +817,7 @@ msgstr "Včera, %l:%M %p"
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm"
#: js/misc/util.js:274
#: js/misc/util.js:278
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l:%M %p"
@@ -752,7 +825,7 @@ msgstr "%A, %l:%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm"
#: js/misc/util.js:280
#: js/misc/util.js:284
#, no-c-format
msgid "%B %-d, %l%M %p"
msgstr "%d. %B, %l:%M %p"
@@ -760,17 +833,17 @@ msgstr "%d. %B, %l:%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"
#: js/misc/util.js:286
#: js/misc/util.js:290
#, no-c-format
msgid "%B %-d %Y, %l%M %p"
msgstr "%d. %B %Y, %l:%M %p"
#. TRANSLATORS: this is the title of the wifi captive portal login window
#: js/portalHelper/main.js:40
#: js/portalHelper/main.js:42
msgid "Hotspot Login"
msgstr "Prihlásenie do aktívneho bodu"
#: js/portalHelper/main.js:86
#: js/portalHelper/main.js:88
msgid ""
"Your connection to this hotspot login is not secure. Passwords or other "
"information you enter on this page can be viewed by people nearby."
@@ -1048,54 +1121,47 @@ msgstr "Nainštalovaná verzia programu udisks nepodporuje nastavenie PIM"
msgid "Open with %s"
msgstr "Otvoriť pomocou aplikácie %s"
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278
msgid "Password:"
msgstr "Heslo:"
#: js/ui/components/keyring.js:104
msgid "Type again:"
msgstr "Zadajte znovu:"
#: js/ui/components/networkAgent.js:115
#: js/ui/components/networkAgent.js:89
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr ""
"Pripojiť sa môžete taktiež stlačením tlačidla „WPS“ na vašom smerovači."
#: js/ui/components/networkAgent.js:123 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/status/network.js:314 js/ui/status/network.js:913
msgid "Connect"
msgstr "Pripojiť"
#. Cisco LEAP
#: js/ui/components/networkAgent.js:224 js/ui/components/networkAgent.js:236
#: js/ui/components/networkAgent.js:260 js/ui/components/networkAgent.js:281
#: js/ui/components/networkAgent.js:301 js/ui/components/networkAgent.js:311
#: js/ui/components/networkAgent.js:202 js/ui/components/networkAgent.js:214
#: js/ui/components/networkAgent.js:238 js/ui/components/networkAgent.js:259
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:289
msgid "Password: "
msgstr "Heslo: "
#. static WEP
#: js/ui/components/networkAgent.js:229
#: js/ui/components/networkAgent.js:207
msgid "Key: "
msgstr "Kľúč: "
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287
#: js/ui/components/networkAgent.js:242 js/ui/components/networkAgent.js:265
msgid "Private key password: "
msgstr "Heslo k súkromnému kľúču: "
#: js/ui/components/networkAgent.js:285
#: js/ui/components/networkAgent.js:263
msgid "Identity: "
msgstr "Identita: "
#: js/ui/components/networkAgent.js:299
#: js/ui/components/networkAgent.js:277
msgid "Service: "
msgstr "Služba: "
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703
msgid "Authentication required by wireless network"
msgstr "Bezdrôtová sieť vyžaduje overenie totožnosti"
#: js/ui/components/networkAgent.js:306 js/ui/components/networkAgent.js:334
#: js/ui/components/networkAgent.js:681 js/ui/components/networkAgent.js:702
msgid "Authentication required"
msgstr "Požaduje sa overenie totožnosti"
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
#: js/ui/components/networkAgent.js:307 js/ui/components/networkAgent.js:682
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -1104,59 +1170,55 @@ msgstr ""
"Na prístup do bezdrôtovej siete „%s“ sú vyžadované heslá alebo šifrovacie "
"kľúče."
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
msgid "Wired 802.1X authentication"
msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
#: js/ui/components/networkAgent.js:335
#: js/ui/components/networkAgent.js:313
msgid "Network name: "
msgstr "Názov siete: "
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
msgid "DSL authentication"
msgstr "Overenie totožnosti k DSL"
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:695
msgid "PIN code required"
msgstr "Požaduje sa kód PIN"
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
#: js/ui/components/networkAgent.js:326 js/ui/components/networkAgent.js:696
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pre zariadenie mobilnej širokopásmovej siete je potrebný kód PIN"
#: js/ui/components/networkAgent.js:349
#: js/ui/components/networkAgent.js:327
msgid "PIN: "
msgstr "PIN: "
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724
msgid "Mobile broadband network password"
msgstr "Heslo k mobilnej širokopásmovej sieti"
#: js/ui/components/networkAgent.js:357 js/ui/components/networkAgent.js:709
#: js/ui/components/networkAgent.js:713 js/ui/components/networkAgent.js:725
#: js/ui/components/networkAgent.js:729
#: js/ui/components/networkAgent.js:335 js/ui/components/networkAgent.js:687
#: js/ui/components/networkAgent.js:691 js/ui/components/networkAgent.js:703
#: js/ui/components/networkAgent.js:707
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Na pripojenie k „%s“ sa požaduje heslo."
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688
#: js/ui/components/networkAgent.js:670 js/ui/status/network.js:1688
msgid "Network Manager"
msgstr "Správca siete"
#: js/ui/components/networkAgent.js:728
#: js/ui/components/networkAgent.js:706
msgid "VPN password"
msgstr "Heslo siete VPN"
#: js/ui/components/polkitAgent.js:41
#: js/ui/components/polkitAgent.js:39
msgid "Authentication Required"
msgstr "Požaduje sa overenie totožnosti"
# PŠ: ináč toto je riadna hlúposť, keďže sa pýta heslo používateľa "root"
#: js/ui/components/polkitAgent.js:81
#: js/ui/components/polkitAgent.js:80
msgid "Administrator"
msgstr "Správca"
#: js/ui/components/polkitAgent.js:141
#: js/ui/components/polkitAgent.js:142
msgid "Authenticate"
msgstr "Overiť totožnosť"
@@ -1164,10 +1226,14 @@ msgstr "Overiť totožnosť"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:365
#: js/ui/components/polkitAgent.js:254 js/ui/shellMountOperation.js:402
msgid "Sorry, that didnt work. Please try again."
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
#: js/ui/components/polkitAgent.js:277 js/ui/shellMountOperation.js:326
msgid "Enter Password…"
msgstr "Zadajte heslo…"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
@@ -1389,20 +1455,28 @@ msgstr "%s (vzdialená relácia)"
msgid "%s (console)"
msgstr "%s (konzola)"
#: js/ui/extensionDownloader.js:194
#: js/ui/extensionDownloader.js:170
msgid "Install"
msgstr "Inštalovať"
# dialog title
#: js/ui/extensionDownloader.js:200
#: js/ui/extensionDownloader.js:176
msgid "Install Extension"
msgstr "Inštalácia rozšírenia"
#: js/ui/extensionDownloader.js:201
#: js/ui/extensionDownloader.js:177
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Prevziať a nainštalovať rozšírenie „%s“ z extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
msgid "Extension Updates Available"
msgstr "Sú dostupné aktualizácie rozšírení"
#: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed."
msgstr "Aktualizácie rozšírení sú pripravené na inštaláciu."
# dialog title
#: js/ui/inhibitShortcutsDialog.js:79
msgid "Allow inhibiting shortcuts"
@@ -1768,56 +1842,52 @@ msgstr "Skryť text"
msgid "Caps lock is on."
msgstr "Je zapnutá funkcia Caps Lock."
#: js/ui/shellMountOperation.js:287
#: js/ui/shellMountOperation.js:285
msgid "Hidden Volume"
msgstr "Skrytý zväzok"
#: js/ui/shellMountOperation.js:290
#: js/ui/shellMountOperation.js:288
msgid "Windows System Volume"
msgstr "Zväzok so systémom Windows"
#: js/ui/shellMountOperation.js:293
#: js/ui/shellMountOperation.js:291
msgid "Uses Keyfiles"
msgstr "Využíva kľúčové súbory"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:299
#: js/ui/shellMountOperation.js:298
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
msgstr "Na odomknutie zväzku s kľúčovými súbormi použite nástroj <i>%s</i>."
#: js/ui/shellMountOperation.js:306
msgid "PIM Number"
msgstr "Číslo PIM"
msgid "Enter PIM Number"
msgstr "Zadajte číslo PIM"
#: js/ui/shellMountOperation.js:325
msgid "The PIM must be a number or empty."
msgstr "PIM musí byť číslo alebo prázdne."
#: js/ui/shellMountOperation.js:336
msgid "Password"
msgstr "Heslo"
#: js/ui/shellMountOperation.js:372
#: js/ui/shellMountOperation.js:365
msgid "Remember Password"
msgstr "Zapamätať heslo"
# DK: doplnil som slovo "programu", aby to znelo prirodzenejsie. priklad:po pripojeni USB kluca bolo zobrazene "Otvoriť pomocou Súbory"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:396
#: js/ui/shellMountOperation.js:391
#, javascript-format
msgid "Open %s"
msgstr "Otvoriť %s"
#: js/ui/shellMountOperation.js:423
msgid "The PIM must be a number or empty."
msgstr "PIM musí byť číslo alebo prázdne."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:468
#: js/ui/shellMountOperation.js:469
#, javascript-format
msgid "Unable to start %s"
msgstr "Nepodarilo sa spustiť %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:470
#: js/ui/shellMountOperation.js:471
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Nepodarilo sa nájsť aplikáciu %s"
@@ -1931,7 +2001,7 @@ msgstr "Zobraziť rozloženie klávesnice"
#: js/ui/status/location.js:65 js/ui/status/location.js:174
msgid "Location Enabled"
msgstr "Poloha povolená"
msgstr "Umiestnenie je povolené"
#: js/ui/status/location.js:66 js/ui/status/location.js:175
msgid "Disable"
@@ -1943,11 +2013,11 @@ msgstr "Nastavenia súkromia"
#: js/ui/status/location.js:173
msgid "Location In Use"
msgstr "Poloha sa používa"
msgstr "Používa sa umiestnenie"
#: js/ui/status/location.js:177
msgid "Location Disabled"
msgstr "Poloha zakázaná"
msgstr "Umiestnenie je zakázané"
#: js/ui/status/location.js:178
msgid "Enable"
@@ -2180,11 +2250,11 @@ msgstr "Aktivácia pripojenia k sieti zlyhala"
#: js/ui/status/nightLight.js:63
msgid "Night Light Disabled"
msgstr "Nočné svetlo zakázané"
msgstr "Nočné osvetlenie zakázané"
#: js/ui/status/nightLight.js:64
msgid "Night Light On"
msgstr "Nočné svetlo zapnuté"
msgstr "Nočné osvetlenie zapnuté"
#: js/ui/status/nightLight.js:66
msgid "Resume"
@@ -2216,13 +2286,13 @@ msgstr "Odhaduje sa…"
#: js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr "%d:%02d Zostáva (%d%%)"
msgstr "%d:%02d zostáva (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
msgstr "%d:%02d Do plného nabitia (%d%%)"
msgstr "%d:%02d do plného nabitia (%d%%)"
#: js/ui/status/power.js:139 js/ui/status/power.js:141
#, javascript-format
@@ -2358,22 +2428,23 @@ msgstr "Hľadať"
msgid "“%s” is ready"
msgstr "Aplikácia „%s“ je pripravená"
#: js/ui/windowManager.js:54
msgid "Do you want to keep these display settings?"
msgstr "Chcete ponechať tieto nastavenia displeja?"
#. Translators: This string should be shorter than 30 characters
#: js/ui/windowManager.js:55
msgid "Keep these display settings?"
msgstr "Ponechať nastavenia displeja?"
#. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:68
#: js/ui/windowManager.js:64
msgid "Revert Settings"
msgstr "Vrátiť nastavenia"
#: js/ui/windowManager.js:71
#: js/ui/windowManager.js:67
msgid "Keep Changes"
msgstr "Uchovať zmeny"
#: js/ui/windowManager.js:89
#: js/ui/windowManager.js:85
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -2383,7 +2454,7 @@ msgstr[2] "Zmeny nastavení budú vrátené za %d sekúnd"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#: js/ui/windowManager.js:546
#: js/ui/windowManager.js:542
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@@ -2853,6 +2924,24 @@ msgstr[2] "%u vstupov"
msgid "System Sounds"
msgstr "Systémové zvuky"
#~ msgid "Browse in Software"
#~ msgstr "Prehliadať v aplikácii Softvér"
#~ msgid "Password:"
#~ msgstr "Heslo:"
#~ msgid "Type again:"
#~ msgstr "Zadajte znovu:"
#~ msgid "Authentication required by wireless network"
#~ msgstr "Bezdrôtová sieť vyžaduje overenie totožnosti"
#~ msgid "Mobile broadband network password"
#~ msgstr "Heslo k mobilnej širokopásmovej sieti"
#~ msgid "Password"
#~ msgstr "Heslo"
# action button
#~ msgctxt "search-result"
#~ msgid "Lock Orientation"
@@ -2970,9 +3059,6 @@ msgstr "Systémové zvuky"
#~ msgstr[1] "%d pripojené zariadenia"
#~ msgstr[2] "%d pripojených zariadení"
#~ msgid "Authentication required"
#~ msgstr "Požaduje sa overenie totožnosti"
#~ msgid "UPS"
#~ msgstr "Záložný zdroj UPS"
@@ -3171,9 +3257,6 @@ msgstr "Systémové zvuky"
#~ msgid "Open"
#~ msgstr "Otvoriť"
#~ msgid "Remove"
#~ msgstr "Odstrániť"
#~ msgid "Clear Messages"
#~ msgstr "Vymazať správy"

1521
po/sv.po

File diff suppressed because it is too large Load Diff

View File

@@ -1707,7 +1707,13 @@ do_size_property (StThemeNode *node,
CRDeclaration *decl,
int *node_value)
{
get_length_from_term_int (node, decl->value, FALSE, node_value);
CRTerm *term = decl->value;
if (term->type == TERM_IDENT &&
strcmp (term->content.str->stryng->str, "auto") == 0)
*node_value = -1;
else
get_length_from_term_int (node, term, FALSE, node_value);
}
void