Compare commits

..

1 Commits

Author SHA1 Message Date
Carlos Garnacho
cdd513aef4 shellEntry: Look up keymap from the ClutterSeat
The get_keymap() method no longer exists on the ClutterBackend, but was
moved to the ClutterSeat.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/969
2020-01-31 11:18:54 +01:00
75 changed files with 7909 additions and 10315 deletions

42
NEWS
View File

@@ -1,45 +1,3 @@
3.35.90
=======
* Update default favorite apps [Michael; !907]
* Add Shell.Blur effect [Georges; !864, !924]
* Overhaul scroll/swipe gestures [Alexander; !821, !825, !826]
* Fix VPN connections when delaying request [Florian; #2008]
* Overhaul theme [Sam, Jakub, nana-4; !904, !931, !957]
* Improve visual appearance of Weather integration [Florian; #1143]
* Implement new system dialog designs [Jonas; #1343]
* Animate position changes of app icons [Georges; !882]
* Add St.Viewport [Georges; !929]
* Make app folders behave as dialogs [Georges; !896]
* Add do-not-disturb functionality to calendar popup [Florian; #239]
* Show hint actor in focused entries [Jonas; !944]
* Switch screen-recorder back to VP8 [Björn; #256]
* Allow to run perf-tool as wayland compositor [Olivier; !941]
* Handle extension updates [Florian; !945]
* Animate showing and hiding caps-lock warning [Jonas; !952]
* Support "auto" lengths in CSS [Florian; !971]
* Turn extension-prefs into the offical Extensions app [Florian; #1968]
* Sandbox the portal helper [Michael; !983]
* Misc. bug fixes and cleanups [Florian, Björn, Jakub, Alexander, Daniel V.,
Jonas, nana-4, Carlos, Sebastian, Daniel G., Georges, Piotr; !918, !917,
!919, !920, #763, #791659, !927, #2091, !930, !926, !888, !934, !168, #2133,
#682, #2142, #2131, !943, #2132, #1958, #2146, !951, #1779, #2130, !964,
!965, !948, #2151, #1746, !967, !760, !968, !970, !973, #2169, #2176, !978,
!980, !979, #2177, !981, #2180, !974]
Contributors:
Michael Catanzaro, Björn Daase, Jonas Dreßler, Piotr Drąg, Olivier Fourdan,
Carlos Garnacho, Sam Hewitt, Sebastian Keller, Andre Klapper,
Alexander Mikhaylenko, Daniel García Moreno, Florian Müllner,
Georges Basile Stavracas Neto, Jakub Steiner, Daniel van Vugt, nana-4
Translators:
Asier Sarasua Garmendia [eu], Daniel Mustieles [es], Andrej Shadura [sk],
Carmen Bianca BAKKER [eo], Sucipto [id], Dušan Kazik [sk], Goran Vidović [hr],
sicklylife [ja], Kukuh Syafaat [id], Yi-Jyun Pan [zh_TW],
Rafael Fontenelle [pt_BR], Jordi Mas [ca], Jiri Grönroos [fi],
Fabio Tomat [fur], Umarzuki Bin Mochlis Moktar [ms], Daniel Korostil [uk],
Jor Teron [mjw], Anders Jonsson [sv], Aurimas Černius [lt]
3.35.3
======
* Add discrete GPU support for NVidia drivers [Bastien; #1810]

View File

@@ -1,9 +1,8 @@
[Desktop Entry]
Type=Application
Name=Extensions
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=org.gnome.Extensions
Name=Shell Extensions
Comment=Configure GNOME Shell Extensions
Exec=@bindir@/gnome-shell-extension-prefs %u
Categories=GNOME;GTK;
OnlyShowIn=GNOME;
NoDisplay=true

View File

@@ -18,6 +18,7 @@
<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

@@ -1,7 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -1 +0,0 @@
<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>

Before

Width:  |  Height:  |  Size: 469 B

View File

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

View File

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

View File

@@ -91,9 +91,13 @@ stage {
// icon tiles
%icon_tile {
background-color: transparent; // no background
color: $osd_fg_color;
border-radius: $base_border_radius + 4px;
padding: $base_padding;
border: 2px solid transparent;
border-width: 2px;
border-style: solid;
border-color: transparent;
transition-duration: 100ms;
text-align: center;
}
@@ -151,17 +155,14 @@ stage {
// notification styling
@mixin notification_bubble($flat: false) {
%notification_bubble {
border-width: 1px;
border-style: solid;
border-radius: $base_border_radius + 2px;
border-radius:$base_border_radius + 2px;
padding: 0;
margin: $base_margin;
@if $flat {
@include button(undecorated);
} @else {
@include button(normal);
}
@include button(normal);
&:focus {
@include button(focus);

View File

@@ -137,7 +137,7 @@
// normal button
@if $t==normal {
color: $tc;
background-color: lighten($c, 3%);
background-color: lighten($c, 3%) !important;
border-color: draw_border_color($c);
@include draw_shadows($button_shadow);
// box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
@@ -157,7 +157,7 @@
// hover button
@else if $t==hover {
color: $tc;
background-color: lighten($c, if($variant == 'light', 8%, 5%));
background-color: lighten($c, if($variant == 'light', 8%, 5%)) !important;
border-color: if($variant == 'light', draw_border_color(lighten($c, 7%)), draw_border_color($c));
@include draw_shadows($button_shadow);
text-shadow: 0 1px $text_shadow_color;
@@ -167,7 +167,7 @@
// active button
@else if $t==active {
color: $tc;
background-color: darken($c,3%);
background-color: darken($c,3%) !important;
border-color: draw_border_color(if($variant == 'light', $c, darken($c,7%)));
text-shadow: none;
icon-shadow: none;
@@ -178,7 +178,7 @@
@else if $t==insensitive {
color: $insensitive_fg_color;
border-color: $insensitive_borders_color;
background-color: $insensitive_bg_color;
background-color: $insensitive_bg_color !important;
box-shadow: none;
text-shadow: none;
icon-shadow: none;
@@ -194,38 +194,3 @@
icon-shadow: none;
}
}
// overview icons
@mixin overview-icon($color) {
.overview-icon {
@extend %icon_tile;
color: $color;
}
&:hover,
&:selected {
.overview-icon {
background-color: transparentize($color, .9);
}
}
&:focus {
.overview-icon {
background-color: transparentize($color, .7);
// border-color: $selected_bg_color;
}
}
&:drop {
.overview-icon {
background-color: transparentize($selected_bg_color, .15);
}
}
&:active,
&:checked {
.overview-icon {
background-color: transparentize(darken($osd_bg_color, 10%), .5);
}
}
}

View File

@@ -11,6 +11,7 @@ $app_icon_padding: 24px;
.overview-icon {
icon-size: $app_icon_size;
StIcon { margin-bottom: $base_margin; } // margin on icon so label isn't close
}
}
@@ -32,14 +33,47 @@ $app_grid_fg_color: #fff;
// Icon tiles in the app grid
.app-well-app,
%app-well-app {
@include overview-icon($app_grid_fg_color);
.app-folder {
.overview-icon.overview-icon-with-label {
padding: 10px 8px 5px 8px;
.overview-icon {
@extend %icon_tile;
color: $app_grid_fg_color !important;
}
> StBoxLayout {
spacing: $base_spacing;
&:selected {
.overview-icon {
background-color: transparentize($osd_bg_color,0.7);
color: $app_grid_fg_color;
}
}
&:hover,
&:focus,
&:selected {
.overview-icon {
background-color: transparentize($osd_fg_color,0.9);
color: $osd_fg_color;
}
}
&:focus {
.overview-icon {
background-color: transparentize($osd_fg_color,0.7 );
// border-color: $selected_bg_color;
color: $app_grid_fg_color;
}
}
&:drop {
.overview-icon {
background-color: transparentize($selected_bg_color,.15);
}
}
&:active,
&:checked {
.overview-icon {
background-color: transparentize(darken($osd_bg_color,10%), 0.5);
}
}
}
@@ -47,18 +81,18 @@ $app_grid_fg_color: #fff;
/* App Folders */
.app-folder {
.overview-icon {
@extend %icon_tile;
}
}
// expanded folder
.app-folder-dialog {
border-radius: $modal_radius * 1.5;
border: 1px solid $osd_outer_borders_color;
spacing: 12px;
border-radius: 8px;
spacing: 24px;
background-color: transparentize(darken($osd_bg_color,10%), 0.05);
& .folder-name-container {
padding: 24px 36px 0;
padding: 12px 18px;
spacing: 12px;
& .folder-name-label,
@@ -83,10 +117,6 @@ $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;
@@ -143,6 +173,11 @@ $app_grid_fg_color: #fff;
padding: 0px 88px 10px 88px;
}
.app-well-app > .overview-icon.overview-icon-with-label {
padding: 10px 8px 5px 8px;
spacing: $base_spacing;
}
// Label when no frequent apps
.no-frequent-applications-label { @extend %status_text; }
@@ -162,35 +197,41 @@ $app_grid_fg_color: #fff;
}
// buttons
.app-view-control {
padding: 4px 32px;
margin: 0 4px;
.app-view-control {
padding: $base_padding $base_padding*5;
margin: 0;
background-color: transparentize($osd_bg_color, 0.5);
border-width: 1px;
color: darken($osd_fg_color, 25%);
&, &:hover, &:checked {
@include button(undecorated);
&:hover {
background-color: transparentize($osd_bg_color, 0.5) !important;
box-shadow:none !important;
color: darken($osd_fg_color, 25%);
}
&:hover {
color: $osd_fg_color;
box-shadow: inset 0 -2px darken($osd_fg_color, 25%);
}
&:active {
box-shadow: inset 0 -2px $osd_fg_color;
box-shadow: none;
background-color: $selected_bg_color !important;
&:hover {
background-color: lighten($selected_bg_color, 11%) !important;
}
}
&:checked {
color: $osd_fg_color;
box-shadow: inset 0 -2px $selected_bg_color;
background-color: $selected_bg_color !important;
color: $selected_fg_color;
box-shadow: none;
&:active { background-color: darken($selected_bg_color, 4%) !important; }
&:hover { background-color: lighten($selected_bg_color, 7%) !important; }
}
&:first-child {
border-right-width: 0;
border-radius: 0;
border-right-width: 0 !important;
border-radius: $base_border_radius 0 0 $base_border_radius;
}
&:last-child {
border-radius: 0;
border-radius: 0 $base_border_radius $base_border_radius 0;
}
}

View File

@@ -5,54 +5,83 @@
// overall menu
#calendarArea {
padding:0;
margin:0;
}
// Calendar menu side column
.datemenu-calendar-column {
spacing: $base_spacing;
spacing: 0;
border: 0 solid $bubble_borders_color;
padding: 0 $base_padding * 2;
padding: $base_padding * 2;
padding-bottom: 3em; // account for the notifications clear button
padding-top:0;
&:ltr {margin-right: $base_margin * 2; border-left-width: 1px; }
&:rtl {margin-left: $base_margin * 2; border-right-width: 1px; }
// today button (the date)
.datemenu-today-button {
padding: $base_padding * 1.5;
margin: $base_margin;
border: 1px solid transparent;
border-radius: $base_border_radius + 2px;
&:hover { @include button(hover);}
&:focus { @include button(focus);}
&:active {
@include button(active);
}
// weekday label
.day-label {
@include fontsize($base_font_size+1);
font-weight: bold;
}
// date label
.date-label {
@include fontsize($base_font_size+7);
font-weight: 1000;
}
}
// calendar
.calendar {
@extend %notification_bubble;
margin:$base_margin !important;
margin-bottom: $base_padding + $base_margin !important;
padding:$base_padding !important;
// more below for sub-elements
}
.datemenu-displays-section {
margin:0;
}
.datemenu-displays-box {
spacing: $base_spacing;
margin:0;
// world clocks and weather
.world-clocks-button,
.weather-button {
@extend %notification_bubble;
padding:$base_padding !important;
}
}
}
.events-section-title {
@include notification_bubble($flat: true);
color: desaturate(darken($fg_color,40%), 10%);
font-weight: bold;
border-radius: 4px;
padding: .4em;
}
/* today button (the date) */
.datemenu-today-button {
@include notification_bubble($flat: true);
padding: $base_padding * 1.5;
// weekday label
.day-label {
@include fontsize($base_font_size+1);
font-weight: bold;
}
// date label
.date-label {
@include fontsize($base_font_size+7);
font-weight: 1000;
}
}
/* Calendar */
.calendar {
@include notification_bubble;
padding: $base_padding;
// month
.calendar-month-label {
@@ -103,7 +132,6 @@
@include fontsize($base_font_size - 4);
}
}
.calendar-day { //border collapse hack - see calendar.js
border-width: 0;
}
@@ -112,12 +140,8 @@
border-top-width: 1px;
}
.calendar-day-left {
border-left-width: 1px;
}
.calendar-day-left { border-left-width: 1px; }
.calendar-work-day {}
.calendar-nonwork-day {
color: $insensitive_fg_color;
}
@@ -137,14 +161,13 @@
&:active,&:selected {
background-color: $selected_bg_color;
color: $selected_fg_color;
&:hover,&:focus {
background-color:lighten($selected_bg_color, 3%);
color: $selected_fg_color;
}
}
}
}
.calendar-day-with-events {
color: lighten($fg_color,10%);
font-weight: bold;
@@ -153,6 +176,7 @@
.calendar-other-month-day {
color: transparentize($fg_color ,0.5);
opacity: 0.5;
}
.calendar-week-number {
@@ -168,16 +192,51 @@
}
}
/* World clocks */
.world-clocks-button {
@include notification_bubble;
padding: $base_padding * 2;
.world-clocks-grid {
/* Weather */
.weather-box {
spacing: $base_spacing;
padding:$base_padding;
.weather-header {
color: desaturate(darken($fg_color,40%), 10%);
font-weight: bold;
&.location {
font-weight: normal;
@include fontsize($base_font_size - 1);
}
}
.weather-grid {
margin-top: $base_margin;
spacing-rows: $base_spacing;
spacing-columns: $base_spacing * 2;
}
.weather-forecast-time {
color: darken($fg_color,30%);
font-feature-settings: "tnum";
@include fontsize($base_font_size - 2);
font-weight: normal;
padding-top: 0.2em;
padding-bottom: 0.4em;
}
.weather-forecast-icon {
icon-size: $base_icon_size * 2;
}
.weather-forecast-temp {
font-weight: bold;
}
}
/* World clocks */
.world-clocks-grid {
padding:$base_padding;
spacing-rows: $base_spacing;
spacing-columns: $base_spacing * 2;
// title
.world-clocks-header {
color: desaturate(darken($fg_color,40%), 10%);
@@ -207,49 +266,3 @@
@include fontsize($base_font_size - 1);
}
}
/* Weather */
.weather-button {
@include notification_bubble;
padding: $base_padding * 2;
.weather-box {
spacing: $base_spacing + $base_margin;
}
.weather-header-box {
spacing: $base_spacing;
}
.weather-header {
color: desaturate(darken($fg_color,40%), 10%);
font-weight: bold;
&.location {
font-weight: normal;
@include fontsize($base_font_size - 1);
}
}
.weather-grid {
spacing-rows: $base_spacing;
spacing-columns: $base_spacing * 2;
}
.weather-forecast-time {
color: darken($fg_color,30%);
font-feature-settings: "tnum";
@include fontsize($base_font_size - 2);
font-weight: normal;
padding-top: 0.2em;
padding-bottom: 0.4em;
}
.weather-forecast-icon {
icon-size: $base_icon_size * 2;
}
.weather-forecast-temp {
font-weight: bold;
}
}

View File

@@ -9,11 +9,12 @@ $dash_border_radius: $modal_radius * 1.5;
@include fontsize($base_font_size - 2);
padding: ($dash_spacing / 2) 0;
//fixme: can't have non uniform borders :(
border-radius: 0 $dash_border_radius $dash_border_radius 0;
border-left-width: 0;
&:rtl {
border-left-width: 0 !important;
&:rtl {
border-radius: $dash_border_radius 0 0 $dash_border_radius;
border-right-width: 0;
border-right-width: 0 !important;
}
.placeholder {
@@ -48,13 +49,36 @@ $dash_border_radius: $modal_radius * 1.5;
// Show apps button
.show-apps {
@include overview-icon($osd_fg_color);
color: $osd_fg_color;
& .overview-icon {
@extend %icon_tile;
color: $osd_fg_color;
}
&:hover,
&:focus,
&:checked {
&:selected {
.overview-icon {
background-color: transparentize($osd_fg_color,0.9);
color: $osd_fg_color;
}
}
&:drop .overview-icon {
background-color: transparentize($selected_bg_color,.15);
}
&:active, &:checked {
.overview-icon {
background-color: darken($osd_bg_color,10%);
}
}
&:checked, &:focus {
.show-apps-icon {
color: $fg_color;
transition-duration: 100ms;
}
}
}

View File

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

@@ -10,7 +10,7 @@ $default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten
// draw keys using button function
#keyboard {
background-color: transparentize(if($variant=='light', darken($bg_color, 5%), darken($bg_color, 8%)), 0.1);
box-shadow: inset 0 1px 0 0 $osd_outer_borders_color;
box-shadow: inset 0 1px 0 0 $osd_outer_borders_color !important;
.page-indicator {
padding: $base_padding;
@@ -121,4 +121,4 @@ $default_key_bg_color: if($variant=='light', darken($osd_bg_color, 11%), lighten
@include fontsize($base_font_size + 3);
spacing: 12px;
min-height: 20pt;
}
}

View File

@@ -11,7 +11,7 @@
.message-list-sections {
spacing: $base_spacing;
margin: 0 $base_margin * 4; // to account for scrollbar
margin: $base_margin * 4; // to account for scrollbar
}
.message-list-section,
@@ -19,61 +19,40 @@
spacing: $base_spacing;
}
.message-list-section-list {
&:ltr {padding:0;}
&:rtl {padding:0;}
}
// do-not-disturb + clear button
.message-list-controls {
margin: ($base_margin * 2) ($base_margin * 4) 0;
// NOTE: remove the padding if notification_bubble could remove margin for drop shadow
padding: $base_margin;
margin: $base_margin $base_margin*2;
spacing: $base_spacing;
}
// message bubbles
.message {
@include notification_bubble;
@extend %notification_bubble;
// icon container
.message-icon-bin {
padding: ($base_padding * 3) 0 ($base_padding * 3) ($base_padding * 2);
&:rtl {
padding: ($base_padding * 3) ($base_padding * 2) ($base_padding * 3) 0;
}
// icon size and color
> StIcon {
icon-size: $base_icon_size*2; // 32px
-st-icon-style: symbolic;
}
// fallback
> .fallback-app-icon {
width: $base_icon_size;
height: $base_icon_size;
}
// title
.message-title {
color: $fg_color;
font-weight: bold;
margin-bottom:4px;
}
// content
.message-content {
padding: $base_padding + $base_margin * 2;
spacing: 4px;
}
// title
.message-title {
font-weight: bold;
}
// secondary container in title box
.message-secondary-bin {
padding: 0 $base_margin * 2;
// notification time stamp
> .event-time {
color: transparentize($fg_color, 0.5);
@include fontsize($base_font_size - 2);
text-align: right;
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
padding-bottom: 0.13em;
color: darken($fg_color, 10%);
padding: $base_padding 0;
margin:$base_margin * 2;
&:ltr {
margin-left: $base_margin;
padding-right:$base_padding;
}
&:rtl {
margin-right: $base_margin;
padding-left:$base_padding;
}
}
@@ -84,10 +63,48 @@
&:active { color: if($variant=='light', lighten($fg_color, 40%), darken($fg_color, 20%)); }
}
// body
.message-body {
color: darken($fg_color, 10%);
// icon container
.message-icon-bin {
padding: $base_padding;
margin:$base_padding 0;
&:rtl {
// padding: $base_padding;
}
// icon size and color
> StIcon {
color: $fg_color;
icon-size: $base_icon_size*2; // 32px
-st-icon-style: symbolic;
padding:0;
margin:$base_padding;
}
// fallback
> .fallback-app-icon {
width: $base_icon_size;
height: $base_icon_size;
}
}
// secondary container in title box
.message-secondary-bin {
padding: 0;
// notification time stamp
> .event-time {
color: transparentize($fg_color, 0.5);
@include fontsize($base_font_size - 2);
text-align: right;
margin: 0 $base_margin * 2;
/* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
padding-bottom: $base_padding;
}
}
}
/* Media Controls */
@@ -108,9 +125,9 @@
&:insensitive { color: darken($fg_color,40%); }
// fix border-radius for last button
&:last-child:ltr { border-radius: 0 $base_border_radius+2 $base_border_radius+2 0; }
&:last-child:rtl { border-radius: $base_border_radius+2 0 0 $base_border_radius+2; }
// fix border-radius for last button on hover
&:last-child:ltr { &:hover {border-radius: 0 $base_border_radius+2 $base_border_radius+2 0;} }
&:last-child:rtl { &:hover {border-radius: $base_border_radius+2 0 0 $base_border_radius+2;} }
}
// album-art
@@ -125,5 +142,6 @@
border: 1px solid transparent;
border-radius: $base_border_radius;
icon-size: $base_icon_size * 2 !important;
padding: $base_padding * 2;
}
}

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

@@ -7,8 +7,39 @@ $notification_banner_width: 34em;
.notification-banner {
min-height: $notification_banner_height;
width: $notification_banner_width;
@include fontsize($base_font_size);
margin: $base_margin;
border-radius: $modal_radius;
.message-title { color: $fg_color }
.message-content { color: $fg_color; }
&:hover { background: $bg_color; }
&, &:focus, &:active {
background-color: $bg_color;
.message-title { color: $fg_color }
.message-content { color: $fg_color; }
}
// icon
.message-icon-bin > StIcon {
icon-size: $base_icon_size * 2;
color: $fg_color;
}
.notification-icon {
padding: 5px;
}
.notification-content {
padding: 5px;
spacing: 5px;
}
.secondary-icon { icon-size: $base_icon_size; }
.notification-actions {
padding-top: 0;
spacing: 0;
}
@@ -32,6 +63,8 @@ $notification_banner_width: 34em;
border-radius: 0.9em; // should be 0.8 but whatever; wish I could do 50%;
}
.secondary-icon { icon-size: $base_icon_size; }
// chat bubbles
.chat-body { spacing: 5px; }
.chat-response { margin: 5px; }
@@ -54,4 +87,4 @@ $notification_banner_width: 34em;
font-weight: bold;
color: lighten($fg_color,18%);
&:rtl { padding-left: 0; padding-right: 4px; }
}
}

View File

@@ -15,7 +15,8 @@ $panel_height: 1.86em;
// transparent panel on lock & login screens
&.unlock-screen,
&.login-screen {
&.login-screen,
&.lock-screen {
background-color: transparent;
.panel-corner {
@@ -76,7 +77,8 @@ $panel_height: 1.86em;
// lock & login screen styles
.unlock-screen &,
.login-screen & {
.login-screen &,
.lock-screen & {
color: lighten($fg_color, 10%);
&:focus, &:hover, &:active { color: lighten($fg_color, 10%); }
}

View File

@@ -87,6 +87,7 @@ $popover_arrow_height: 12px;
height: 1px; //not really the whole box
margin: 6px 64px;
background-color: lighten($borders_color, 2%);
border: none !important;
}
// desktop background menu
@@ -117,4 +118,4 @@ $popover_arrow_height: 12px;
margin-right: $base_icon_size;
}
}
}
}

View File

@@ -1,53 +1,68 @@
/* Screen Shield */
.unlock-dialog-clock {
color: white;
font-weight: 300;
text-align: center;
padding-bottom: 2.5em;
$_screenshield_shadow: 0px 0px 6px rgba(0, 0, 0, 0.726);
.screen-shield-arrows {
padding-bottom: 3em;
}
.unlock-dialog-clock-time {
font-size: 64pt;
padding-bottom: 24px;
.screen-shield-arrows Gjs_Arrow {
color: white;
width: 80px;
height: 48px;
-arrow-thickness: 12px;
-arrow-shadow: $_screenshield_shadow;
}
.screen-shield-clock {
color: white;
text-shadow: $_screenshield_shadow;
font-weight: bold;
text-align: center;
padding-bottom: 1.5em;
}
.screen-shield-clock-time {
font-size: 72pt;
text-shadow: $_screenshield_shadow;
font-feature-settings: "tnum";
}
.unlock-dialog-clock-date {
font-size: 16pt;
.screen-shield-clock-date {
font-size: 28pt;
font-weight: normal;
}
.unlock-dialog-notifications-container {
margin: 12px 0;
.screen-shield-notifications-container {
spacing: 6px;
width: 23em;
width: 30em;
background-color: transparent;
max-height: 500px;
.summary-notification-stack-scrollview {
padding-top: 0;
padding-bottom: 0;
}
.notification,
.unlock-dialog-notification-source {
.screen-shield-notification-source {
padding: 12px 6px;
border: 1px solid $osd_outer_borders_color;
background-color: transparentize($osd_bg_color,0.5);
color: $osd_fg_color;
border-radius: 4px;
&.critical { background-color: transparentize($osd_bg_color,0.1) }
}
.notification { margin-right: 15px; } //compensate for space allocated to the scrollbar
}
.unlock-dialog-notification-label {
.screen-shield-notification-label {
font-weight: bold;
padding: 0px 0px 0px 12px;
}
.unlock-dialog-notification-count-text {
weight: bold;
padding: 0px 12px;
}
.screen-shield-notification-count-text { padding: 0px 0px 0px 12px; }
#panel.lock-screen { background-color: transparentize($osd_bg_color, 0.5); }
.screen-shield-background { //just the shadow, really
background: black;
@@ -55,13 +70,14 @@
}
#lockDialogGroup {
background-color: lighten(#2e3436, 8%);
background: lighten(#2e3436, 8%) url(resource:///org/gnome/shell/theme/noise-texture.png);
background-repeat: repeat;
}
#unlockDialogNotifications {
#screenShieldNotifications {
StButton#vhandle, StButton#hhandle {
background-color: transparentize($bg_color,0.7);
&:hover, &:focus { background-color: transparentize($bg_color,0.5); }
&:active { background-color: transparentize($selected_bg_color,0.5); }
}
}
}

View File

@@ -3,16 +3,19 @@
// search overview container
#searchResultsContent {
max-width: 1024px;
spacing: $base_margin * 2;
}
// search results sections "the boxes"
.search-section {
// This should be equal to #searchResultsContent spacing
spacing: $base_margin * 2;
padding:0 !important;
margin:0 !important;
background-color:transparent;
box-shadow:none;
border:none;
// separator
.search-section-separator {
// margin-top: $base_padding * 2;
// height: 1px;
// background-color: $osd_outer_borders_color;
height: 0;
@@ -29,24 +32,8 @@
text-shadow: 0 1px if($variant == 'light', rgba(255,255,255,0.2), rgba(0,0,0,0.2));
color: $osd_fg_color;
padding: $base_padding * 3;
// This is the space between the provider icon and the results container
spacing: $base_margin * 2;
}
%search-section-content-item {
@extend %icon_tile;
&:focus,
&:hover,
&:selected {
background-color: transparentize($osd_fg_color, .9);
transition-duration: 200ms;
}
&:active,
&:checked {
background-color: transparentize(darken($osd_bg_color, 10%), .1);
}
margin: $base_margin 0;
spacing: 0;
}
// "no results" text
@@ -56,12 +43,54 @@
// Search results with icons
.grid-search-result {
@extend %app-well-app;
> .overview-icon {
@extend %icon_tile;
color: $osd_fg_color;
}
> .overview-icon.overview-icon-with-label {
padding: 10px 8px 5px 8px;
spacing: $base_spacing;
}
&:hover,
&:focus,
&:selected {
.overview-icon {
background-color: transparentize($osd_bg_color,0.8);
color: $osd_fg_color;
}
}
&:drop .overview-icon {
background-color: transparentize($selected_bg_color,.15);
}
&:active .overview-icon,
&:checked .overview-icon {
background-color: transparentize(darken($osd_bg_color,10%), 0.5);
}
}
// search result provider
.search-provider-icon {
@extend %search-section-content-item;
@extend %icon_tile;
padding: $base_padding;
spacing: 0;
margin-right: $base_margin * 2;
&:focus,
&:selected,
&:hover {
background-color: transparentize($osd_fg_color,.9);
transition-duration: 200ms;
}
&:active,
&:checked {
background-color: transparentize(darken($osd_bg_color,10%),.1);
}
// content
.list-search-provider-content {
@@ -84,16 +113,34 @@
// search result listitem
.list-search-result {
@extend %search-section-content-item;
@extend %icon_tile;
spacing: 0;
padding: $base_padding;
color: $osd_fg_color;
border-radius: $base_border_radius + 2px !important;
&:focus,
&:selected,
&:hover {
background-color: transparentize($osd_fg_color,.9);
transition-duration: 200ms;
}
&:active,
&:checked {
background-color: transparentize(darken($osd_bg_color,10%),.1);
}
// content
.list-search-result-content {
spacing: $base_padding;
spacing: 0;
}
// list item title (with leading icon)
// list item title
.list-search-result-title {
color: $osd_fg_color;
spacing: $base_spacing * 2;
padding-right: $base_padding;
// font-weight: bold;
}

View File

@@ -45,11 +45,14 @@
padding: $base_padding;
border-radius: $modal_radius 0 0 $modal_radius;
border-right-width: 0;
border-right-width: 0 !important;
//fixme: can't have non uniform borders :(
border-top-left-radius:0 !important;
border-bottom-left-radius:0 !important;
&:rtl {
&:rtl {
border-radius: 0 $modal_radius $modal_radius 0;
border-left-width: 0;
border-left-width: 0 !important;
}
// drag and drop indicator
@@ -66,4 +69,4 @@
border-radius: 3px;
padding: 0px;
// background-color: transparentize($selected_bg_color, 0.9);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@@ -1,11 +0,0 @@
.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,16 +3,15 @@ imports.gi.versions.Gdk = '3.0';
imports.gi.versions.Gtk = '3.0';
const Gettext = imports.gettext;
const { Gdk, GLib, Gio, GObject, Gtk } = imports.gi;
const { Gdk, GLib, Gio, GObject, Gtk, Pango } = 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, ExtensionType } = ExtensionUtils;
const { ExtensionState } = ExtensionUtils;
const GnomeShellIface = loadInterfaceXML('org.gnome.Shell.Extensions');
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
@@ -28,144 +27,26 @@ class Application extends Gtk.Application {
_init() {
GLib.set_prgname('gnome-shell-extension-prefs');
super._init({
application_id: 'org.gnome.Extensions',
application_id: 'org.gnome.shell.ExtensionPrefs',
flags: Gio.ApplicationFlags.HANDLES_COMMAND_LINE,
});
this._startupUuid = null;
this._loaded = false;
this._skipMainWindow = false;
this._shellProxy = null;
}
get shellProxy() {
return this._shellProxy;
}
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'),
});
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._extensionSelector.get_children().find(c => {
return c.uuid === uuid && c.hasPrefs;
});
let row = this._findExtensionRow(uuid);
if (!row || !row.hasPrefs)
if (!row)
return false;
let widget;
@@ -176,73 +57,33 @@ var ExtensionsWindow = GObject.registerClass({
widget = this._buildErrorUI(row, e);
}
this._prefsDialog = new Gtk.Window({
application: this.application,
default_width: 600,
default_height: 400,
modal: this.visible,
let dialog = new Gtk.Window({
modal: !this._skipMainWindow,
type_hint: Gdk.WindowTypeHint.DIALOG,
window_position: Gtk.WindowPosition.CENTER,
});
this._prefsDialog.set_titlebar(new Gtk.HeaderBar({
dialog.set_titlebar(new Gtk.HeaderBar({
show_close_button: true,
title: row.name,
visible: true,
}));
if (this.visible)
this._prefsDialog.transient_for = this;
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;
}
this._prefsDialog.connect('destroy', () => {
this._prefsDialog = null;
if (!this.visible)
this.destroy();
});
this._prefsDialog.add(widget);
this._prefsDialog.show();
dialog.set_default_size(600, 400);
dialog.add(widget);
dialog.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,
@@ -337,7 +178,7 @@ var ExtensionsWindow = GObject.registerClass({
label: _("Homepage"),
tooltip_text: _("Visit extension homepage"),
no_show_all: true,
visible: row.url !== '',
visible: row.url != null,
});
toolbar.add(urlButton);
@@ -358,6 +199,47 @@ var ExtensionsWindow = GObject.registerClass({
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);
}
@@ -371,26 +253,13 @@ var ExtensionsWindow = GObject.registerClass({
}
_findExtensionRow(uuid) {
return [
...this._userList.get_children(),
...this._systemList.get_children(),
].find(c => c.uuid === uuid);
return this._extensionSelector.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();
@@ -404,6 +273,7 @@ var ExtensionsWindow = GObject.registerClass({
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;
@@ -421,53 +291,58 @@ var ExtensionsWindow = GObject.registerClass({
_addExtensionRow(extension) {
let row = new ExtensionRow(extension);
row.prefsButton.connect('clicked', () => {
this._showPrefs(row.uuid);
});
row.show_all();
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.',
nUpdates).format(nUpdates);
this._updatesBar.visible = nUpdates > 0;
this._extensionSelector.add(row);
}
_extensionsLoaded() {
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';
if (this._extensionSelector.get_children().length > 0)
this._mainStack.visible_child_name = 'listing';
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({
@@ -569,19 +444,113 @@ var Expander = GObject.registerClass({
}
});
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 {
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 {
_init(extension) {
super._init();
@@ -589,77 +558,24 @@ var ExtensionRow = GObject.registerClass({
this._extension = extension;
this._prefsModule = null;
this._actionGroup = new Gio.SimpleActionGroup();
this.insert_action_group('row', this._actionGroup);
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._buildUI();
this._extensionStateChangedId = this._app.shellProxy.connectSignal(
'ExtensionStateChanged', (p, sender, [uuid, newState]) => {
if (this.uuid !== uuid)
return;
this._extension = ExtensionUtils.deserializeExtension(newState);
this._updateState();
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();
}
get uuid() {
@@ -674,40 +590,8 @@ var ExtensionRow = GObject.registerClass({
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 || '';
}
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 !== '';
return this._extension.metadata.url;
}
_onDestroy() {
@@ -719,6 +603,54 @@ var ExtensionRow = GObject.registerClass({
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

@@ -1,218 +0,0 @@
<?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

@@ -1,305 +0,0 @@
<?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">Log Out…</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,6 +17,10 @@ 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,
@@ -278,7 +282,11 @@ var AuthPrompt = GObject.registerClass({
this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
Util.wiggle(this._entry);
Util.wiggle(this._entry, {
offset: WIGGLE_OFFSET,
duration: WIGGLE_DURATION,
wiggleCount: N_WIGGLES,
});
}
_onVerificationComplete() {

View File

@@ -409,10 +409,7 @@ var SessionMenuButton = GObject.registerClass({
});
var LoginDialog = GObject.registerClass({
Signals: {
'failed': {},
'wake-up-screen': {},
},
Signals: { 'failed': {} },
}, class LoginDialog extends St.Widget {
_init(parentActor) {
super._init({ style_class: 'login-dialog', visible: false });
@@ -1228,18 +1225,13 @@ var LoginDialog = GObject.registerClass({
return GLib.SOURCE_REMOVE;
}
activate() {
this._userList.grab_key_focus();
this.show();
}
open() {
Main.ctrlAltTabManager.addGroup(this,
_("Login Window"),
'dialog-password-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
this.activate();
this._userList.grab_key_focus();
this.show();
this.opacity = 0;
Main.pushModal(this, { actionMode: Shell.ActionMode.LOGIN_SCREEN });

View File

@@ -11,10 +11,6 @@ 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]';
@@ -446,9 +442,9 @@ function ensureActorVisibleInScrollView(scrollView, actor) {
function wiggle(actor, params) {
params = Params.parse(params, {
offset: WIGGLE_OFFSET,
duration: WIGGLE_DURATION,
wiggleCount: N_WIGGLES,
offset: 0,
duration: 0,
wiggleCount: 0,
});
actor.translation_x = 0;

View File

@@ -1,6 +1,4 @@
/* 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;
@@ -118,10 +116,6 @@ class PortalWindow extends Gtk.ApplicationWindow {
this._webContext = WebKit.WebContext.new_ephemeral();
this._webContext.set_cache_model(WebKit.CacheModel.DOCUMENT_VIEWER);
this._webContext.set_network_proxy_settings(WebKit.NetworkProxyMode.NO_PROXY, null);
if (this._webContext.set_sandbox_enabled) {
// We have WebKitGTK 2.26 or newer.
this._webContext.set_sandbox_enabled(true);
}
this._webView = WebKit.WebView.new_with_context(this._webContext);
this._webView.connect('decide-policy', this._onDecidePolicy.bind(this));

View File

@@ -7,10 +7,5 @@
<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

@@ -530,10 +530,8 @@ var AllView = GObject.registerClass({
// Overridden from BaseAppView
animate(animationDirection, onComplete) {
this._scrollView.reactive = false;
this._swipeTracker.enabled = false;
let completionFunc = () => {
this._scrollView.reactive = true;
this._swipeTracker.enabled = this.mapped;
if (onComplete)
onComplete();
};
@@ -1525,10 +1523,10 @@ var FolderIcon = GObject.registerClass({
}
vfunc_unmap() {
super.vfunc_unmap();
if (this._dialog)
this._dialog.popdown();
super.vfunc_unmap();
}
open() {

View File

@@ -504,9 +504,12 @@ 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({
@@ -515,11 +518,22 @@ var SystemBackground = GObject.registerClass({
background: _systemBackground,
});
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.emit('loaded');
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(id, '[gnome-shell] SystemBackground.loaded');
let cache = Meta.BackgroundImageCache.get_default();
let image = cache.load(file);
if (image.is_loaded()) {
image = null;
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
this.emit('loaded');
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(id, '[gnome-shell] SystemBackground.loaded');
} else {
let id = image.connect('loaded', () => {
this.emit('loaded');
image.disconnect(id);
image = null;
});
}
}
});

View File

@@ -3,11 +3,13 @@
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;
const Util = imports.misc.util;
var WORK_SPINNER_ICON_SIZE = 16;
var KeyringDialog = GObject.registerClass(
class KeyringDialog extends ModalDialog.ModalDialog {
@@ -19,97 +21,141 @@ class KeyringDialog extends ModalDialog.ModalDialog {
this.prompt.connect('show-confirm', this._onShowConfirm.bind(this));
this.prompt.connect('prompt-close', this._onHidePrompt.bind(this));
let content = new Dialog.MessageDialogContent();
this._content = new Dialog.MessageDialogContent();
this.contentLayout.add(this._content);
this.prompt.bind_property('message',
content, 'title', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('description',
content, 'description', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('message', this._content, 'title', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('description', this._content, 'description', GObject.BindingFlags.SYNC_CREATE);
let passwordBox = new St.BoxLayout({
style_class: 'prompt-dialog-password-layout',
vertical: true,
});
this._workSpinner = null;
this._controlTable = null;
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._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;
@@ -123,6 +169,7 @@ class KeyringDialog extends ModalDialog.ModalDialog {
this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive;
this._setWorking(!sensitive);
}
_ensureOpen() {
@@ -144,16 +191,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,26 +33,38 @@ 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_align: Clutter.ActorAlign.CENTER,
x_expand: true,
};
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);
@@ -77,26 +89,36 @@ 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)) {
let capsLockWarning = new ShellEntry.CapsLockWarning();
contentBox.add_child(capsLockWarning);
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
if (rtl)
layout.attach(this._capsLockWarningLabel, 0, pos, 1, 1);
else
layout.attach(this._capsLockWarningLabel, 1, pos, 1, 1);
}
contentBox.add_child(secretTable);
if (flags & NM.SecretAgentGetSecretsFlags.WPS_PBC_ACTIVE) {
let descriptionLabel = new St.Label({
text: _('Alternatively you can connect by pushing the “WPS” button on your router.'),
style_class: 'message-dialog-description',
});
let descriptionLabel = new St.Label({ style_class: 'prompt-dialog-description',
text: _("Alternatively you can connect by pushing the “WPS” button on your router.") });
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),
@@ -303,7 +325,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');
content.title = _("Authentication required by wireless network");
content.message = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
this._getWirelessSecrets(content.secrets, wirelessSetting);
break;
@@ -331,7 +353,7 @@ class NetworkSecretDialog extends ModalDialog.ModalDialog {
// fall through
case 'cdma':
case 'bluetooth':
content.title = _('Authentication required');
content.title = _("Mobile broadband network password");
content.message = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
this._getMobileSecrets(content.secrets, connectionType);
break;
@@ -678,7 +700,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');
title = _("Authentication required by wireless network");
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
break;
}
@@ -699,7 +721,7 @@ var NetworkAgent = class {
// fall through
case 'cdma':
case 'bluetooth':
title = _('Authentication required');
title = _("Mobile broadband network password");
body = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
break;
case 'vpn':

View File

@@ -4,19 +4,21 @@
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,
};
const DIALOG_ICON_SIZE = 64;
var DIALOG_ICON_SIZE = 48;
var WORK_SPINNER_ICON_SIZE = 16;
const DELAYED_RESET_TIMEOUT = 200;
@@ -38,10 +40,8 @@ var AuthenticationDialog = GObject.registerClass({
let title = _("Authentication Required");
let headerContent = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_child(headerContent);
let bodyContent = new Dialog.MessageDialogContent();
let content = new Dialog.MessageDialogContent({ title, description });
this.contentLayout.add_actor(content);
if (userNames.length > 1) {
log(`polkitAuthenticationAgent: Received ${userNames.length} ` +
@@ -59,21 +59,22 @@ var AuthenticationDialog = GObject.registerClass({
let userBox = new St.BoxLayout({
style_class: 'polkit-dialog-user-layout',
vertical: true,
vertical: false,
});
bodyContent.add_child(userBox);
content.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')
@@ -81,60 +82,58 @@ var AuthenticationDialog = GObject.registerClass({
userBox.add_child(this._userLabel);
let passwordBox = new St.BoxLayout({
style_class: 'prompt-dialog-password-layout',
vertical: true,
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,
});
this._passwordBox.add_child(this._passwordLabel);
this._passwordEntry = new St.PasswordEntry({
style_class: 'prompt-dialog-password-entry',
text: "",
can_focus: true,
visible: false,
x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
});
ShellEntry.addContextMenu(this._passwordEntry);
this._passwordEntry.clutter_text.connect('activate', this._onEntryActivate.bind(this));
this._passwordEntry.bind_property('reactive',
this._passwordEntry.clutter_text, 'editable',
GObject.BindingFlags.SYNC_CREATE);
passwordBox.add_child(this._passwordEntry);
this._passwordBox.add_child(this._passwordEntry);
let warningBox = new St.BoxLayout({ vertical: true });
let capsLockWarning = new ShellEntry.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',
visible: false,
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
animate: true,
});
this._passwordBox.add(this._workSpinner);
this._passwordBox.hide();
let capsLockWarning = new ShellEntry.CapsLockWarning();
content.add_child(capsLockWarning);
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label' });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._errorMessageLabel.clutter_text.line_wrap = true;
warningBox.add_child(this._errorMessageLabel);
content.add_child(this._errorMessageLabel);
this._errorMessageLabel.hide();
this._infoMessageLabel = new St.Label({
style_class: 'prompt-dialog-info-label',
visible: false,
});
this._infoMessageLabel = new St.Label({ style_class: 'prompt-dialog-info-label' });
this._infoMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._infoMessageLabel.clutter_text.line_wrap = true;
warningBox.add_child(this._infoMessageLabel);
content.add_child(this._infoMessageLabel);
this._infoMessageLabel.hide();
/* 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' });
this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
text: 'abc' });
this._nullMessageLabel.add_style_class_name('hidden');
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._nullMessageLabel.clutter_text.line_wrap = true;
warningBox.add_child(this._nullMessageLabel);
passwordBox.add_child(warningBox);
bodyContent.add_child(passwordBox);
content.add_child(this._nullMessageLabel);
this._nullMessageLabel.show();
this._cancelButton = this.addButton({ label: _("Cancel"),
action: this.cancel.bind(this),
@@ -150,8 +149,6 @@ var AuthenticationDialog = GObject.registerClass({
this._okButton.reactive = text.get_text().length > 0;
});
this.contentLayout.add_child(bodyContent);
this._doneEmitted = false;
this._mode = -1;
@@ -166,6 +163,13 @@ var AuthenticationDialog = GObject.registerClass({
this._onUserChanged();
}
_setWorking(working) {
if (working)
this._workSpinner.play();
else
this._workSpinner.stop();
}
_initiateSession() {
this._destroySession(DELAYED_RESET_TIMEOUT);
@@ -214,6 +218,7 @@ 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
@@ -255,8 +260,6 @@ var AuthenticationDialog = GObject.registerClass({
this._errorMessageLabel.show();
this._infoMessageLabel.hide();
this._nullMessageLabel.hide();
Util.wiggle(this._passwordEntry);
}
/* Try and authenticate again */
@@ -270,20 +273,19 @@ var AuthenticationDialog = GObject.registerClass({
this._sessionRequestTimeoutId = 0;
}
// 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…');
// Cheap localization trick
if (request == 'Password:' || request == 'Password: ')
this._passwordLabel.set_text(_("Password:"));
else
this._passwordEntry.hint_text = request.replace(/: *$/, '…');
this._passwordLabel.set_text(request);
this._passwordEntry.password_visible = echoOn;
this._passwordEntry.show();
this._passwordBox.show();
this._passwordEntry.set_text('');
this._passwordEntry.reactive = true;
this._okButton.reactive = false;
this._setWorking(false);
this._ensureOpen();
this._passwordEntry.grab_key_focus();
@@ -330,7 +332,7 @@ var AuthenticationDialog = GObject.registerClass({
if (this.state != ModalDialog.State.OPENED)
return;
this._passwordEntry.hide();
this._passwordBox.hide();
this._cancelButton.grab_key_focus();
this._okButton.reactive = false;
};

View File

@@ -411,18 +411,14 @@ var _Draggable = class _Draggable {
this._snapBackY = this._dragStartY + this._dragOffsetY;
this._snapBackScale = this._dragActor.scale_x;
let origDragOffsetX = this._dragOffsetX;
let origDragOffsetY = this._dragOffsetY;
let [transX, transY] = this._dragActor.get_translation();
this._dragOffsetX -= transX;
this._dragOffsetY -= transY;
if (this._dragActorMaxSize != undefined) {
let [scaledWidth, scaledHeight] = this._dragActor.get_transformed_size();
let currentSize = Math.max(scaledWidth, scaledHeight);
if (currentSize > this._dragActorMaxSize) {
let scale = this._dragActorMaxSize / currentSize;
let origScale = this._dragActor.scale_x;
let origDragOffsetX = this._dragOffsetX;
let origDragOffsetY = this._dragOffsetY;
// The position of the actor changes as we scale
// around the drag position, but we can't just tween
@@ -439,8 +435,8 @@ var _Draggable = class _Draggable {
this._dragActor.get_transition('scale-x').connect('new-frame', () => {
let currentScale = this._dragActor.scale_x / origScale;
this._dragOffsetX = currentScale * origDragOffsetX - transX;
this._dragOffsetY = currentScale * origDragOffsetY - transY;
this._dragOffsetX = currentScale * origDragOffsetX;
this._dragOffsetY = currentScale * origDragOffsetY;
this._dragActor.set_position(
this._dragX + this._dragOffsetX,
this._dragY + this._dragOffsetY);

View File

@@ -1,14 +1,12 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported init connect disconnect */
const { GLib, Gio, GObject, Shell, St } = imports.gi;
const { GLib, Gio, 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;
@@ -17,13 +15,10 @@ 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 = [];
@@ -52,12 +47,6 @@ 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) {
@@ -217,18 +206,6 @@ 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) {
@@ -580,27 +557,3 @@ 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

@@ -195,7 +195,7 @@ function zoomOutActorAtPos(actor, x, y) {
}
function animateIconPosition(icon, box, flags, nChangedIcons) {
if (!icon.has_allocation() || icon.allocation.equal(box) || icon.opacity === 0) {
if (!icon.has_allocation() || icon.allocation.equal(box)) {
icon.allocate(box, flags);
return false;
}

View File

@@ -1102,9 +1102,6 @@ var KeyboardManager = class KeyBoardManager {
this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA });
this._a11yApplicationsSettings.connect('changed', this._syncEnabled.bind(this));
this._seat = Clutter.get_default_backend().get_default_seat();
this._seat.connect('notify::touch-mode', this._syncEnabled.bind(this));
this._lastDevice = null;
Meta.get_backend().connect('last-device-changed', (backend, device) => {
if (device.get_device_name().indexOf('XTEST') < 0) {
@@ -1125,9 +1122,7 @@ var KeyboardManager = class KeyBoardManager {
_syncEnabled() {
let enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD);
let autoEnabled = this._seat.get_touch_mode() && this._lastDeviceIsTouchscreen();
let enabled = enableKeyboard || autoEnabled;
let enabled = enableKeyboard || this._lastDeviceIsTouchscreen();
if (!enabled && !this._keyboard)
return;

View File

@@ -430,10 +430,8 @@ var Magnifier = class Magnifier {
* lines making up the crosshairs.
*/
setCrosshairsLength(length) {
if (this._crossHairs) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._crossHairs.setLength(length / scaleFactor);
}
if (this._crossHairs)
this._crossHairs.setLength(length);
}
/**
@@ -747,7 +745,8 @@ var ZoomRegion = class ZoomRegion {
this._xCaret = 0;
this._yCaret = 0;
this._pointerIdleMonitor = Meta.IdleMonitor.get_core();
let seat = Clutter.get_default_backend().get_default_seat();
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(seat.get_pointer());
this._scrollContentsTimerId = 0;
}
@@ -799,14 +798,9 @@ var ZoomRegion = class ZoomRegion {
return;
}
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let [xFocus, yFocus] = [(extents.x + (extents.width / 2)) * scaleFactor,
(extents.y + (extents.height / 2)) * scaleFactor];
if (this._xFocus !== xFocus || this._yFocus !== yFocus) {
[this._xFocus, this._yFocus] = [xFocus, yFocus];
this._centerFromFocusPosition();
}
[this._xFocus, this._yFocus] = [extents.x + (extents.width / 2),
extents.y + (extents.height / 2)];
this._centerFromFocusPosition();
}
_updateCaret(caller, event) {
@@ -821,13 +815,8 @@ var ZoomRegion = class ZoomRegion {
return;
}
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
let [xCaret, yCaret] = [extents.x * scaleFactor, extents.y * scaleFactor];
if (this._xCaret !== xCaret || this._yCaret !== yCaret) {
[this._xCaret, this._yCaret] = [xCaret, yCaret];
this._centerFromCaretPosition();
}
[this._xCaret, this._yCaret] = [extents.x, extents.y];
this._centerFromCaretPosition();
}
/**
@@ -875,8 +864,7 @@ var ZoomRegion = class ZoomRegion {
setMagFactor(xMagFactor, yMagFactor) {
this._changeROI({ xMagFactor,
yMagFactor,
redoCursorTracking: this._followingCursor,
animate: true });
redoCursorTracking: this._followingCursor });
}
/**
@@ -1134,13 +1122,6 @@ var ZoomRegion = class ZoomRegion {
return this._screenPosition;
}
_clearScrollContentsTimer() {
if (this._scrollContentsTimerId !== 0) {
GLib.source_remove(this._scrollContentsTimerId);
this._scrollContentsTimerId = 0;
}
}
/**
* scrollToMousePos:
* Set the region of interest based on the position of the system pointer.
@@ -1154,31 +1135,30 @@ var ZoomRegion = class ZoomRegion {
else
this._updateMousePosition();
this._clearScrollContentsTimer();
this._scrollContentsTimerId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, POINTER_REST_TIME, () => {
this._followingCursor = false;
if (this._xDelayed !== null && this._yDelayed !== null) {
this._scrollContentsToDelayed(this._xDelayed, this._yDelayed);
this._xDelayed = null;
this._yDelayed = null;
}
return GLib.SOURCE_REMOVE;
});
// Determine whether the system mouse pointer is over this zoom region.
return this._isMouseOverRegion();
}
_scrollContentsToDelayed(x, y) {
if (this._followingCursor) {
this._xDelayed = x;
this._yDelayed = y;
} else {
this.scrollContentsTo(x, y);
_clearScrollContentsTimer() {
if (this._scrollContentsTimerId != 0) {
GLib.source_remove(this._scrollContentsTimerId);
this._scrollContentsTimerId = 0;
}
}
_scrollContentsToDelayed(x, y) {
if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) {
this.scrollContentsTo(x, y);
return;
}
this._clearScrollContentsTimer();
this._scrollContentsTimerId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, POINTER_REST_TIME, () => {
this._scrollContentsToDelayed(x, y);
return GLib.SOURCE_REMOVE;
});
}
/**
* scrollContentsTo:
* Shift the contents of the magnified view such it is centered on the given
@@ -1187,16 +1167,11 @@ var ZoomRegion = class ZoomRegion {
* @param {number} y: The y-coord of the point to center on.
*/
scrollContentsTo(x, y) {
if (x < 0 || x > global.screen_width ||
y < 0 || y > global.screen_height)
return;
this._clearScrollContentsTimer();
this._followingCursor = false;
this._changeROI({ xCenter: x,
yCenter: y,
animate: true });
yCenter: y });
}
/**
@@ -1348,7 +1323,7 @@ var ZoomRegion = class ZoomRegion {
this._crossHairsActor = null;
// Contrast and brightness effects.
this._magShaderEffects = new MagShaderEffects(mainGroup);
this._magShaderEffects = new MagShaderEffects(this._uiGroupClone);
this._magShaderEffects.setColorSaturation(this._colorSaturation);
this._magShaderEffects.setInvertLightness(this._invertLightness);
this._magShaderEffects.setBrightness(this._brightness);
@@ -1405,8 +1380,7 @@ var ZoomRegion = class ZoomRegion {
yMagFactor: this._yMagFactor,
xCenter: this._xCenter,
yCenter: this._yCenter,
redoCursorTracking: false,
animate: false });
redoCursorTracking: false });
if (params.xMagFactor <= 0)
params.xMagFactor = this._xMagFactor;
@@ -1445,7 +1419,8 @@ var ZoomRegion = class ZoomRegion {
height: this._viewPortHeight }, true);
}
this._updateCloneGeometry(params.animate);
this._updateCloneGeometry();
this._updateMousePosition();
}
_isMouseOverRegion() {
@@ -1583,64 +1558,38 @@ var ZoomRegion = class ZoomRegion {
this._magView.set_position(this._viewPortX, this._viewPortY);
}
_updateCloneGeometry(animate = false) {
_updateCloneGeometry() {
if (!this.isActive())
return;
this._uiGroupClone.set_scale(this._xMagFactor, this._yMagFactor);
this._mouseActor.set_scale(this._xMagFactor, this._yMagFactor);
let [x, y] = this._screenToViewPort(0, 0);
this._uiGroupClone.ease({
x: Math.round(x),
y: Math.round(y),
scale_x: this._xMagFactor,
scale_y: this._yMagFactor,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: animate ? 100 : 0,
});
this._uiGroupClone.set_position(Math.round(x), Math.round(y));
let [mouseX, mouseY] = this._getMousePosition();
this._mouseActor.ease({
x: mouseX,
y: mouseY,
scale_x: this._xMagFactor,
scale_y: this._yMagFactor,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: animate ? 100 : 0,
});
if (this._crossHairsActor) {
let [crossX, crossY] = this._getCrossHairsPosition();
this._crossHairsActor.ease({
x: crossX,
y: crossY,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: animate ? 100 : 0,
});
}
this._updateMousePosition();
}
_updateMousePosition() {
let [xMagMouse, yMagMouse] = this._getMousePosition();
if (!this.isActive())
return;
let [xMagMouse, yMagMouse] = this._screenToViewPort(this._magnifier.xMouse,
this._magnifier.yMouse);
xMagMouse = Math.round(xMagMouse);
yMagMouse = Math.round(yMagMouse);
this._mouseActor.set_position(xMagMouse, yMagMouse);
if (this._crossHairsActor) {
let [crossX, crossY] = this._getCrossHairsPosition();
this._crossHairsActor.set_position(crossX, crossY);
let [groupWidth, groupHeight] = this._crossHairsActor.get_size();
this._crossHairsActor.set_position(xMagMouse - groupWidth / 2,
yMagMouse - groupHeight / 2);
}
}
_getMousePosition() {
let [xMagMouse, yMagMouse] = this._screenToViewPort(
this._magnifier.xMouse, this._magnifier.yMouse);
return [Math.round(xMagMouse), Math.round(yMagMouse)];
}
_getCrossHairsPosition() {
let [xMagMouse, yMagMouse] = this._getMousePosition();
let [groupWidth, groupHeight] = this._crossHairsActor.get_size();
return [xMagMouse - groupWidth / 2, yMagMouse - groupHeight / 2];
}
_monitorsChanged() {
this._background.set_size(global.screen_width, global.screen_height);
this._updateScreenPosition();
@@ -1859,10 +1808,12 @@ class Crosshairs extends Clutter.Actor {
let clipWidth = this._clipSize[0];
let clipHeight = this._clipSize[1];
let left = groupWidth / 2 - clipWidth / 2 - leftLength - thickness / 2;
let right = groupWidth / 2 + clipWidth / 2 + thickness / 2;
let top = groupHeight / 2 - clipHeight / 2 - topLength - thickness / 2;
let bottom = groupHeight / 2 + clipHeight / 2 + thickness / 2;
// Note that clip, if present, is not centred on the cross hair
// intersection, but biased towards the top left.
let left = groupWidth / 2 - clipWidth * 0.25 - leftLength;
let right = groupWidth / 2 + clipWidth * 0.75;
let top = groupHeight / 2 - clipHeight * 0.25 - topLength - thickness / 2;
let bottom = groupHeight / 2 + clipHeight * 0.75 + thickness / 2;
this._horizLeftHair.set_position(left, (groupHeight - thickness) / 2);
this._horizRightHair.set_position(right, (groupHeight - thickness) / 2);
this._vertTopHair.set_position((groupWidth - thickness) / 2, top);

View File

@@ -137,7 +137,6 @@ 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

@@ -1,10 +1,13 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const { AccountsService, Clutter, Gio,
GLib, Graphene, Meta, Shell, St } = imports.gi;
const { AccountsService, Clutter, Gio, GLib,
GnomeDesktop, GObject, Graphene, Meta, Shell, St } = imports.gi;
const Cairo = imports.cairo;
const Signals = imports.signals;
const Background = imports.ui.background;
const GnomeSession = imports.misc.gnomeSession;
const Layout = imports.ui.layout;
const OVirt = imports.gdm.oVirt;
const LoginManager = imports.misc.loginManager;
const Lightbox = imports.ui.lightbox;
@@ -24,6 +27,17 @@ const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const DISABLE_LOCK_KEY = 'disable-lock-screen';
const LOCKED_STATE_STR = 'screenShield.locked';
// fraction of screen height the arrow must reach before completing
// the slide up automatically
var ARROW_DRAG_THRESHOLD = 0.1;
// Parameters for the arrow animation
var N_ARROWS = 3;
var ARROW_ANIMATION_TIME = 600;
var ARROW_ANIMATION_PEAK_OPACITY = 0.4;
var ARROW_IDLE_TIME = 30000; // ms
var SUMMARY_ICON_SIZE = 48;
// ScreenShield animation time
// - STANDARD_FADE_TIME is used when the session goes idle
@@ -34,6 +48,384 @@ var STANDARD_FADE_TIME = 10000;
var MANUAL_FADE_TIME = 300;
var CURTAIN_SLIDE_TIME = 300;
var Clock = GObject.registerClass(
class ScreenShieldClock extends St.BoxLayout {
_init() {
super._init({ style_class: 'screen-shield-clock', vertical: true });
this._time = new St.Label({
style_class: 'screen-shield-clock-time',
x_align: Clutter.ActorAlign.CENTER,
});
this._date = new St.Label({
style_class: 'screen-shield-clock-date',
x_align: Clutter.ActorAlign.CENTER,
});
this.add_child(this._time);
this.add_child(this._date);
this._wallClock = new GnomeDesktop.WallClock({ time_only: true });
this._wallClock.connect('notify::clock', this._updateClock.bind(this));
this._updateClock();
this.connect('destroy', this._onDestroy.bind(this));
}
_updateClock() {
this._time.text = this._wallClock.clock;
let date = new Date();
/* Translators: This is a time format for a date in
long format */
let dateFormat = Shell.util_translate_time_string(N_("%A, %B %d"));
this._date.text = date.toLocaleFormat(dateFormat);
}
_onDestroy() {
this._wallClock.run_dispose();
}
});
var NotificationsBox = GObject.registerClass({
Signals: { 'wake-up-screen': {} },
}, class NotificationsBox extends St.BoxLayout {
_init() {
super._init({
vertical: true,
name: 'screenShieldNotifications',
style_class: 'screen-shield-notifications-container',
});
this._scrollView = new St.ScrollView({ hscrollbar_policy: St.PolicyType.NEVER });
this._notificationBox = new St.BoxLayout({ vertical: true,
style_class: 'screen-shield-notifications-container' });
this._scrollView.add_actor(this._notificationBox);
this.add_child(this._scrollView);
this._sources = new Map();
Main.messageTray.getSources().forEach(source => {
this._sourceAdded(Main.messageTray, source, true);
});
this._updateVisibility();
this._sourceAddedId = Main.messageTray.connect('source-added', this._sourceAdded.bind(this));
this.connect('destroy', this._onDestroy.bind(this));
}
_onDestroy() {
if (this._sourceAddedId) {
Main.messageTray.disconnect(this._sourceAddedId);
this._sourceAddedId = 0;
}
let items = this._sources.entries();
for (let [source, obj] of items)
this._removeSource(source, obj);
}
_updateVisibility() {
this._notificationBox.visible =
this._notificationBox.get_children().some(a => a.visible);
this.visible = this._notificationBox.visible;
}
_makeNotificationCountText(count, isChat) {
if (isChat)
return ngettext("%d new message", "%d new messages", count).format(count);
else
return ngettext("%d new notification", "%d new notifications", count).format(count);
}
_makeNotificationSource(source, box) {
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
box.add_child(sourceActor);
let textBox = new St.BoxLayout({ vertical: true });
box.add_child(textBox);
let title = new St.Label({ text: source.title,
style_class: 'screen-shield-notification-label' });
textBox.add(title);
let count = source.unseenCount;
let countLabel = new St.Label({ text: this._makeNotificationCountText(count, source.isChat),
style_class: 'screen-shield-notification-count-text' });
textBox.add(countLabel);
box.visible = count != 0;
return [title, countLabel];
}
_makeNotificationDetailedSource(source, box) {
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
let sourceBin = new St.Bin({ child: sourceActor });
box.add(sourceBin);
let textBox = new St.BoxLayout({ vertical: true });
box.add_child(textBox);
let title = new St.Label({ text: source.title,
style_class: 'screen-shield-notification-label' });
textBox.add(title);
let visible = false;
for (let i = 0; i < source.notifications.length; i++) {
let n = source.notifications[i];
if (n.acknowledged)
continue;
let body = '';
if (n.bannerBodyText) {
body = n.bannerBodyMarkup
? n.bannerBodyText
: GLib.markup_escape_text(n.bannerBodyText, -1);
}
let label = new St.Label({ style_class: 'screen-shield-notification-count-text' });
label.clutter_text.set_markup(`<b>${n.title}</b> ${body}`);
textBox.add(label);
visible = true;
}
box.visible = visible;
return [title, null];
}
_shouldShowDetails(source) {
return source.policy.detailsInLockScreen ||
source.narrowestPrivacyScope == MessageTray.PrivacyScope.SYSTEM;
}
_showSource(source, obj, box) {
if (obj.detailed)
[obj.titleLabel, obj.countLabel] = this._makeNotificationDetailedSource(source, box);
else
[obj.titleLabel, obj.countLabel] = this._makeNotificationSource(source, box);
box.visible = obj.visible && (source.unseenCount > 0);
}
_sourceAdded(tray, source, initial) {
let obj = {
visible: source.policy.showInLockScreen,
detailed: this._shouldShowDetails(source),
sourceDestroyId: 0,
sourceCountChangedId: 0,
sourceTitleChangedId: 0,
sourceUpdatedId: 0,
sourceBox: null,
titleLabel: null,
countLabel: null,
};
obj.sourceBox = new St.BoxLayout({ style_class: 'screen-shield-notification-source',
x_expand: true });
this._showSource(source, obj, obj.sourceBox);
this._notificationBox.add_child(obj.sourceBox);
obj.sourceCountChangedId = source.connect('notify::count', () => {
this._countChanged(source, obj);
});
obj.sourceTitleChangedId = source.connect('notify::title', () => {
this._titleChanged(source, obj);
});
obj.policyChangedId = source.policy.connect('notify', (policy, pspec) => {
if (pspec.name == 'show-in-lock-screen')
this._visibleChanged(source, obj);
else
this._detailedChanged(source, obj);
});
obj.sourceDestroyId = source.connect('destroy', () => {
this._onSourceDestroy(source, obj);
});
this._sources.set(source, obj);
if (!initial) {
// block scrollbars while animating, if they're not needed now
let boxHeight = this._notificationBox.height;
if (this._scrollView.height >= boxHeight)
this._scrollView.vscrollbar_policy = St.PolicyType.NEVER;
let widget = obj.sourceBox;
let [, natHeight] = widget.get_preferred_height(-1);
widget.height = 0;
widget.ease({
height: natHeight,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: 250,
onComplete: () => {
this._scrollView.vscrollbar_policy = St.PolicyType.AUTOMATIC;
widget.set_height(-1);
},
});
this._updateVisibility();
if (obj.sourceBox.visible)
this.emit('wake-up-screen');
}
}
_titleChanged(source, obj) {
obj.titleLabel.text = source.title;
}
_countChanged(source, obj) {
// A change in the number of notifications may change whether we show
// details.
let newDetailed = this._shouldShowDetails(source);
let oldDetailed = obj.detailed;
obj.detailed = newDetailed;
if (obj.detailed || oldDetailed != newDetailed) {
// A new notification was pushed, or a previous notification was destroyed.
// Give up, and build the list again.
obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox);
} else {
let count = source.unseenCount;
obj.countLabel.text = this._makeNotificationCountText(count, source.isChat);
}
obj.sourceBox.visible = obj.visible && (source.unseenCount > 0);
this._updateVisibility();
if (obj.sourceBox.visible)
this.emit('wake-up-screen');
}
_visibleChanged(source, obj) {
if (obj.visible == source.policy.showInLockScreen)
return;
obj.visible = source.policy.showInLockScreen;
obj.sourceBox.visible = obj.visible && source.unseenCount > 0;
this._updateVisibility();
if (obj.sourceBox.visible)
this.emit('wake-up-screen');
}
_detailedChanged(source, obj) {
let newDetailed = this._shouldShowDetails(source);
if (obj.detailed == newDetailed)
return;
obj.detailed = newDetailed;
obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox);
}
_onSourceDestroy(source, obj) {
this._removeSource(source, obj);
this._updateVisibility();
}
_removeSource(source, obj) {
obj.sourceBox.destroy();
obj.sourceBox = obj.titleLabel = obj.countLabel = null;
source.disconnect(obj.sourceDestroyId);
source.disconnect(obj.sourceCountChangedId);
source.disconnect(obj.sourceTitleChangedId);
source.policy.disconnect(obj.policyChangedId);
this._sources.delete(source);
}
});
var Arrow = GObject.registerClass(
class ScreenShieldArrow extends St.Bin {
_init(params) {
super._init(params);
this._drawingArea = new St.DrawingArea({
x_expand: true,
y_expand: true,
});
this._drawingArea.connect('repaint', this._drawArrow.bind(this));
this.child = this._drawingArea;
this._shadowHelper = null;
this._shadowWidth = this._shadowHeight = 0;
}
_drawArrow(arrow) {
let cr = arrow.get_context();
let [w, h] = arrow.get_surface_size();
let node = this.get_theme_node();
let thickness = node.get_length('-arrow-thickness');
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
cr.setLineCap(Cairo.LineCap.ROUND);
cr.setLineWidth(thickness);
cr.moveTo(thickness / 2, h - thickness / 2);
cr.lineTo(w / 2, thickness);
cr.lineTo(w - thickness / 2, h - thickness / 2);
cr.stroke();
cr.$dispose();
}
vfunc_get_paint_volume(volume) {
if (!super.vfunc_get_paint_volume(volume))
return false;
if (!this._shadow)
return true;
let shadowBox = new Clutter.ActorBox();
this._shadow.get_box(this._drawingArea.get_allocation_box(), shadowBox);
volume.set_width(Math.max(shadowBox.x2 - shadowBox.x1, volume.get_width()));
volume.set_height(Math.max(shadowBox.y2 - shadowBox.y1, volume.get_height()));
return true;
}
vfunc_style_changed() {
let node = this.get_theme_node();
this._shadow = node.get_shadow('-arrow-shadow');
if (this._shadow)
this._shadowHelper = St.ShadowHelper.new(this._shadow);
else
this._shadowHelper = null;
super.vfunc_style_changed();
}
vfunc_paint(paintContext) {
if (this._shadowHelper) {
this._shadowHelper.update(this._drawingArea);
let allocation = this._drawingArea.get_allocation_box();
let paintOpacity = this._drawingArea.get_paint_opacity();
let framebuffer = paintContext.get_framebuffer();
this._shadowHelper.paint(framebuffer, allocation, paintOpacity);
}
this._drawingArea.paint(paintContext);
}
});
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
/**
* If you are setting org.gnome.desktop.session.idle-delay directly in dconf,
* rather than through System Settings, you also need to set
@@ -55,18 +447,59 @@ var ScreenShield = class {
name: 'lockScreenGroup',
visible: false,
});
this._lockScreenGroup.connect('key-press-event',
this._onLockScreenKeyPress.bind(this));
this._lockScreenGroup.connect('scroll-event',
this._onLockScreenScroll.bind(this));
Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 'changes-prevent-symbolic');
this._lockDialogGroup = new St.Widget({
x_expand: true,
y_expand: true,
reactive: true,
can_focus: true,
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
name: 'lockDialogGroup',
});
this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(),
name: 'lockScreenContents' });
this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true }));
this._lockScreenGroup.add_actor(this._lockScreenContents);
this._backgroundGroup = new Clutter.Actor();
this._lockScreenGroup.add_actor(this._backgroundGroup);
this._lockScreenGroup.set_child_below_sibling(this._backgroundGroup, null);
this._bgManagers = [];
this._updateBackgrounds();
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
this._arrowAnimationId = 0;
this._arrowWatchId = 0;
this._arrowActiveWatchId = 0;
this._arrowContainer = new St.BoxLayout({ style_class: 'screen-shield-arrows',
vertical: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.END,
// HACK: without these, ClutterBinLayout
// ignores alignment properties on the actor
x_expand: true,
y_expand: true });
for (let i = 0; i < N_ARROWS; i++) {
let arrow = new Arrow({ opacity: 0 });
this._arrowContainer.add_actor(arrow);
}
this._lockScreenContents.add_actor(this._arrowContainer);
this._dragAction = new Clutter.GestureAction();
this._dragAction.connect('gesture-begin', this._onDragBegin.bind(this));
this._dragAction.connect('gesture-progress', this._onDragMotion.bind(this));
this._dragAction.connect('gesture-end', this._onDragEnd.bind(this));
this._lockScreenGroup.add_action(this._dragAction);
this._lockDialogGroup = new St.Widget({ x_expand: true,
y_expand: true,
reactive: true,
pivot_point: new Graphene.Point({ x: 0.5, y: 0.5 }),
name: 'lockDialogGroup' });
this.actor.add_actor(this._lockScreenGroup);
this.actor.add_actor(this._lockDialogGroup);
this.actor.add_actor(this._lockScreenGroup);
this._presence = new GnomeSession.Presence((proxy, error) => {
if (error) {
@@ -86,14 +519,14 @@ var ScreenShield = class {
this._smartcardManager.connect('smartcard-inserted',
(manager, token) => {
if (this._isLocked && token.UsedToLogin)
this._activateDialog();
this._liftShield(true, 0);
});
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
this._oVirtCredentialsManager.connect('user-authenticated',
() => {
if (this._isLocked)
this._activateDialog();
this._liftShield(true, 0);
});
this._loginManager = LoginManager.getLoginManager();
@@ -118,6 +551,7 @@ var ScreenShield = class {
this._lockSettings.connect(`changed::${DISABLE_LOCK_KEY}`, this._syncInhibitor.bind(this));
this._isModal = false;
this._hasLockScreen = false;
this._isGreeter = false;
this._isActive = false;
this._isLocked = false;
@@ -157,10 +591,39 @@ var ScreenShield = class {
this._syncInhibitor();
}
_activateDialog() {
_createBackground(monitorIndex) {
let monitor = Main.layoutManager.monitors[monitorIndex];
let widget = new St.Widget({ style_class: 'screen-shield-background',
x: monitor.x,
y: monitor.y,
width: monitor.width,
height: monitor.height });
let bgManager = new Background.BackgroundManager({ container: widget,
monitorIndex,
controlPosition: false,
settingsSchema: SCREENSAVER_SCHEMA });
this._bgManagers.push(bgManager);
this._backgroundGroup.add_child(widget);
}
_updateBackgrounds() {
for (let i = 0; i < this._bgManagers.length; i++)
this._bgManagers[i].destroy();
this._bgManagers = [];
this._backgroundGroup.destroy_all_children();
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i);
}
_liftShield(onPrimary, velocity) {
if (this._isLocked) {
this._ensureUnlockDialog(true /* allowCancel */);
this._dialog.activate();
if (this._ensureUnlockDialog(onPrimary, true /* allowCancel */))
this._hideLockScreen(true /* animate */, velocity);
} else {
this.deactivate(true /* animate */);
}
@@ -175,7 +638,9 @@ var ScreenShield = class {
// LoginDialog.cancel() will grab the key focus
// on its own, so ensure it stays on lock screen
// instead
this._dialog.grab_key_focus();
this._lockScreenGroup.grab_key_focus();
} else {
this._dialog = null;
}
}
@@ -194,6 +659,55 @@ var ScreenShield = class {
return this._isModal;
}
_onLockScreenKeyPress(actor, event) {
let symbol = event.get_key_symbol();
let unichar = event.get_key_unicode();
// Do nothing if the lock screen is not fully shown.
// This avoids reusing the previous (and stale) unlock
// dialog if esc is pressed while the curtain is going
// down after cancel.
if (this._lockScreenState != MessageTray.State.SHOWN)
return Clutter.EVENT_PROPAGATE;
let isEnter = symbol == Clutter.KEY_Return ||
symbol == Clutter.KEY_KP_Enter ||
symbol == Clutter.KEY_ISO_Enter;
let isEscape = symbol == Clutter.KEY_Escape;
let isLiftChar = GLib.unichar_isprint(unichar) &&
(this._isLocked || !GLib.unichar_isgraph(unichar));
if (!isEnter && !isEscape && !isLiftChar)
return Clutter.EVENT_PROPAGATE;
if (this._isLocked &&
this._ensureUnlockDialog(true, true) &&
GLib.unichar_isgraph(unichar))
this._dialog.addCharacter(unichar);
this._liftShield(true, 0);
return Clutter.EVENT_STOP;
}
_onLockScreenScroll(actor, event) {
if (this._lockScreenState != MessageTray.State.SHOWN)
return Clutter.EVENT_PROPAGATE;
let delta = 0;
if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
delta = Math.abs(event.get_scroll_delta()[0]);
else
delta = 5;
this._lockScreenScrollCounter += delta;
// 7 standard scrolls to lift up
if (this._lockScreenScrollCounter > 35)
this._liftShield(true, 0);
return Clutter.EVENT_STOP;
}
_syncInhibitor() {
let lockEnabled = this._settings.get_boolean(LOCK_ENABLED_KEY);
let lockLocked = this._lockSettings.get_boolean(DISABLE_LOCK_KEY);
@@ -222,6 +736,78 @@ var ScreenShield = class {
}
}
_animateArrows() {
let arrows = this._arrowContainer.get_children();
let unitaryDelay = ARROW_ANIMATION_TIME / (arrows.length + 1);
let maxOpacity = 255 * ARROW_ANIMATION_PEAK_OPACITY;
for (let i = 0; i < arrows.length; i++) {
arrows[i].opacity = 0;
arrows[i].ease({
opacity: maxOpacity,
delay: unitaryDelay * (N_ARROWS - (i + 1)),
duration: ARROW_ANIMATION_TIME / 2,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
arrows[i].ease({
opacity: 0,
duration: ARROW_ANIMATION_TIME / 2,
mode: Clutter.AnimationMode.EASE_IN_QUAD,
});
},
});
}
return GLib.SOURCE_CONTINUE;
}
_onDragBegin() {
this._lockScreenGroup.remove_all_transitions();
this._lockScreenState = MessageTray.State.HIDING;
if (this._isLocked)
this._ensureUnlockDialog(false, false);
return true;
}
_onDragMotion() {
let [, origY] = this._dragAction.get_press_coords(0);
let [, currentY] = this._dragAction.get_motion_coords(0);
let newY = currentY - origY;
newY = clamp(newY, -global.stage.height, 0);
this._lockScreenGroup.translation_y = newY;
return true;
}
_onDragEnd(_action, _actor, _eventX, _eventY, _modifiers) {
if (this._lockScreenState != MessageTray.State.HIDING)
return;
if (this._lockScreenGroup.translation_y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
// Complete motion automatically
let [velocity_, velocityX_, velocityY] = this._dragAction.get_velocity(0);
this._liftShield(true, -velocityY);
} else {
// restore the lock screen to its original place
// try to use the same speed as the normal animation
let h = global.stage.height;
let duration = MANUAL_FADE_TIME * -this._lockScreenGroup.translation_y / h;
this._lockScreenGroup.remove_all_transitions();
this._lockScreenGroup.ease({
translation_y: 0,
duration,
mode: Clutter.AnimationMode.EASE_IN_QUAD,
onComplete: () => {
this._lockScreenState = MessageTray.State.SHOWN;
},
});
this._maybeCancelDialog();
}
}
_onStatusChanged(status) {
if (status != GnomeSession.PresenceStatus.IDLE)
return;
@@ -327,10 +913,14 @@ var ScreenShield = class {
this.actor.show();
this._isGreeter = Main.sessionMode.isGreeter;
this._isLocked = true;
this._ensureUnlockDialog(true);
if (this._ensureUnlockDialog(true, true))
this._hideLockScreen(false, 0);
}
_hideLockScreenComplete() {
if (Main.sessionMode.currentMode == 'lock-screen')
Main.sessionMode.popMode('lock-screen');
this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide();
@@ -340,13 +930,13 @@ var ScreenShield = class {
}
}
_hideLockScreen(animate) {
_hideLockScreen(animate, velocity) {
if (this._lockScreenState == MessageTray.State.HIDDEN)
return;
this._lockScreenState = MessageTray.State.HIDING;
this._lockDialogGroup.remove_all_transitions();
this._lockScreenGroup.remove_all_transitions();
if (animate) {
// Tween the lock screen out of screen
@@ -354,14 +944,16 @@ var ScreenShield = class {
// use the same speed regardless of original position
// if velocity is specified, it's in pixels per milliseconds
let h = global.stage.height;
let delta = h + this._lockDialogGroup.translation_y;
let velocity = global.stage.height / CURTAIN_SLIDE_TIME;
let delta = h + this._lockScreenGroup.translation_y;
let minVelocity = global.stage.height / CURTAIN_SLIDE_TIME;
velocity = Math.max(minVelocity, velocity);
let duration = delta / velocity;
this._lockDialogGroup.ease({
this._lockScreenGroup.ease({
translation_y: -h,
duration,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
mode: Clutter.AnimationMode.EASE_IN_QUAD,
onComplete: () => this._hideLockScreenComplete(),
});
} else {
@@ -371,7 +963,7 @@ var ScreenShield = class {
this._cursorTracker.set_pointer_visible(true);
}
_ensureUnlockDialog(allowCancel) {
_ensureUnlockDialog(onPrimary, allowCancel) {
if (!this._dialog) {
let constructor = Main.sessionMode.unlockDialog;
if (!constructor) {
@@ -383,7 +975,7 @@ var ScreenShield = class {
this._dialog = new constructor(this._lockDialogGroup);
let time = global.get_current_time();
if (!this._dialog.open(time)) {
if (!this._dialog.open(time, onPrimary)) {
// This is kind of an impossible error: we're already modal
// by the time we reach this...
log('Could not open login dialog: failed to acquire grab');
@@ -392,12 +984,9 @@ var ScreenShield = class {
}
this._dialog.connect('failed', this._onUnlockFailed.bind(this));
this._wakeUpScreenId = this._dialog.connect(
'wake-up-screen', this._wakeUpScreen.bind(this));
}
this._dialog.allowCancel = allowCancel;
this._dialog.grab_key_focus();
return true;
}
@@ -414,17 +1003,21 @@ var ScreenShield = class {
if (this._lockScreenState != MessageTray.State.HIDDEN)
return;
this._ensureLockScreen();
this._lockDialogGroup.scale_x = 1;
this._lockDialogGroup.scale_y = 1;
this._lockScreenGroup.show();
this._lockScreenState = MessageTray.State.SHOWING;
let fadeToBlack = params.fadeToBlack;
if (params.animateLockScreen) {
this._lockDialogGroup.translation_y = -global.screen_height;
this._lockDialogGroup.remove_all_transitions();
this._lockDialogGroup.ease({
this._lockScreenGroup.translation_y = -global.screen_height;
this._lockScreenGroup.remove_all_transitions();
this._lockScreenGroup.ease({
translation_y: 0,
duration: Overview.ANIMATION_TIME,
duration: MANUAL_FADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
this._lockScreenShown({ fadeToBlack, animateFade: true });
@@ -435,10 +1028,69 @@ var ScreenShield = class {
this._lockScreenShown({ fadeToBlack, animateFade: false });
}
this._dialog.grab_key_focus();
this._lockScreenGroup.grab_key_focus();
if (Main.sessionMode.currentMode != 'lock-screen')
Main.sessionMode.pushMode('lock-screen');
}
_startArrowAnimation() {
this._arrowActiveWatchId = 0;
if (!this._arrowAnimationId) {
this._arrowAnimationId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 6000, this._animateArrows.bind(this));
GLib.Source.set_name_by_id(this._arrowAnimationId, '[gnome-shell] this._animateArrows');
this._animateArrows();
}
if (!this._arrowWatchId) {
this._arrowWatchId = this.idleMonitor.add_idle_watch(ARROW_IDLE_TIME,
this._pauseArrowAnimation.bind(this));
}
}
_pauseArrowAnimation() {
if (this._arrowAnimationId) {
GLib.source_remove(this._arrowAnimationId);
this._arrowAnimationId = 0;
}
if (!this._arrowActiveWatchId)
this._arrowActiveWatchId = this.idleMonitor.add_user_active_watch(this._startArrowAnimation.bind(this));
}
_stopArrowAnimation() {
if (this._arrowAnimationId) {
GLib.source_remove(this._arrowAnimationId);
this._arrowAnimationId = 0;
}
if (this._arrowActiveWatchId) {
this.idleMonitor.remove_watch(this._arrowActiveWatchId);
this._arrowActiveWatchId = 0;
}
if (this._arrowWatchId) {
this.idleMonitor.remove_watch(this._arrowWatchId);
this._arrowWatchId = 0;
}
}
_checkArrowAnimation() {
let idleTime = this.idleMonitor.get_idletime();
if (idleTime < ARROW_IDLE_TIME)
this._startArrowAnimation();
else
this._pauseArrowAnimation();
}
_lockScreenShown(params) {
if (this._dialog && !this._isGreeter) {
this._dialog.destroy();
this._dialog = null;
}
this._checkArrowAnimation();
let motionId = global.stage.connect('captured-event', (stage, event) => {
if (event.type() == Clutter.EventType.MOTION) {
this._cursorTracker.set_pointer_visible(true);
@@ -450,6 +1102,7 @@ var ScreenShield = class {
this._cursorTracker.set_pointer_visible(false);
this._lockScreenState = MessageTray.State.SHOWN;
this._lockScreenScrollCounter = 0;
if (params.fadeToBlack && params.animateFade) {
// Take a beat
@@ -472,11 +1125,52 @@ var ScreenShield = class {
this.emit('lock-screen-shown');
}
// Some of the actors in the lock screen are heavy in
// resources, so we only create them when needed
_ensureLockScreen() {
if (this._hasLockScreen)
return;
this._lockScreenContentsBox = new St.BoxLayout({ x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_expand: true,
vertical: true,
style_class: 'screen-shield-contents-box' });
this._clock = new Clock();
this._lockScreenContentsBox.add_child(this._clock);
this._lockScreenContents.add_actor(this._lockScreenContentsBox);
this._notificationsBox = new NotificationsBox();
this._wakeUpScreenId = this._notificationsBox.connect('wake-up-screen', this._wakeUpScreen.bind(this));
this._lockScreenContentsBox.add_child(this._notificationsBox);
this._hasLockScreen = true;
}
_wakeUpScreen() {
this._onUserBecameActive();
this.emit('wake-up-screen');
}
_clearLockScreen() {
this._clock.destroy();
this._clock = null;
if (this._notificationsBox) {
this._notificationsBox.disconnect(this._wakeUpScreenId);
this._notificationsBox.destroy();
this._notificationsBox = null;
}
this._stopArrowAnimation();
this._lockScreenContentsBox.destroy();
this._hasLockScreen = false;
}
get locked() {
return this._isLocked;
}
@@ -497,8 +1191,13 @@ var ScreenShield = class {
}
_continueDeactivate(animate) {
this._hideLockScreen(animate);
this._hideLockScreen(animate, 0);
if (this._hasLockScreen)
this._clearLockScreen();
if (Main.sessionMode.currentMode == 'lock-screen')
Main.sessionMode.popMode('lock-screen');
if (Main.sessionMode.currentMode == 'unlock-dialog')
Main.sessionMode.popMode('unlock-dialog');
@@ -524,8 +1223,9 @@ var ScreenShield = class {
}
this._lockDialogGroup.ease({
translation_y: -global.screen_height,
duration: Overview.ANIMATION_TIME,
scale_x: 0,
scale_y: 0,
duration: animate ? Overview.ANIMATION_TIME : 0,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => this._completeDeactivate(),
});
@@ -562,11 +1262,10 @@ var ScreenShield = class {
if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time();
this._ensureUnlockDialog(true);
this.actor.show();
if (Main.sessionMode.currentMode !== 'unlock-dialog') {
if (Main.sessionMode.currentMode != 'unlock-dialog' &&
Main.sessionMode.currentMode != 'lock-screen') {
this._isGreeter = Main.sessionMode.isGreeter;
if (!this._isGreeter)
Main.sessionMode.pushMode('unlock-dialog');

View File

@@ -53,6 +53,19 @@ const _modes = {
panelStyle: 'login-screen',
},
'lock-screen': {
isLocked: true,
isGreeter: undefined,
unlockDialog: undefined,
components: ['polkitAgent', 'telepathyClient'],
panel: {
left: [],
center: [],
right: ['aggregateMenu'],
},
panelStyle: 'lock-screen',
},
'unlock-dialog': {
isLocked: true,
unlockDialog: undefined,

View File

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

View File

@@ -166,7 +166,6 @@ class CapsLockWarning extends St.Label {
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,7 +13,6 @@ 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;
@@ -270,18 +269,21 @@ 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 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;
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;
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);
@@ -292,7 +294,6 @@ 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())
@@ -301,65 +302,71 @@ 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)
passwordGridLayout.attach(this._pimEntry, 1, curGridRow, 1, 1);
else
passwordGridLayout.attach(this._pimEntry, 0, curGridRow, 1, 1);
curGridRow += 1;
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);
} 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));
this.setInitialKeyFocus(this._passwordEntry);
ShellEntry.addContextMenu(this._passwordEntry);
this.setInitialKeyFocus(this._passwordEntry);
this._workSpinner = new Animation.Spinner(WORK_SPINNER_ICON_SIZE, {
animate: true,
});
this._passwordEntry.secondary_icon = this._workSpinner;
this._capsLockWarningLabel = new ShellEntry.CapsLockWarning();
if (rtl) {
passwordGridLayout.attach(this._workSpinner, 0, curGridRow, 1, 1);
passwordGridLayout.attach(this._passwordEntry, 1, curGridRow, 1, 1);
layout.attach(this._passwordEntry, 0, 1, 1, 1);
layout.attach(this._passwordLabel, 1, 1, 1, 1);
layout.attach(this._capsLockWarningLabel, 0, 2, 1, 1);
} else {
passwordGridLayout.attach(this._passwordEntry, 0, curGridRow, 1, 1);
passwordGridLayout.attach(this._workSpinner, 1, curGridRow, 1, 1);
layout.attach(this._passwordLabel, 0, 1, 1, 1);
layout.attach(this._passwordEntry, 1, 1, 1, 1);
layout.attach(this._capsLockWarningLabel, 1, 2, 1, 1);
}
curGridRow += 1;
let warningBox = new St.BoxLayout({ vertical: true });
content.add_child(grid);
let capsLockWarning = new ShellEntry.CapsLockWarning();
warningBox.add_child(capsLockWarning);
this._errorMessageLabel = new St.Label({
style_class: 'prompt-dialog-error-label',
opacity: 0,
});
this._errorMessageLabel = new St.Label({ style_class: 'prompt-dialog-error-label',
text: _("Sorry, that didnt work. Please try again.") });
this._errorMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._errorMessageLabel.clutter_text.line_wrap = true;
warningBox.add_child(this._errorMessageLabel);
passwordGridLayout.attach(warningBox, 0, curGridRow, 2, 1);
content.add_child(passwordGrid);
this._errorMessageLabel.hide();
content.add_child(this._errorMessageLabel);
if (flags & Gio.AskPasswordFlags.SAVING_SUPPORTED) {
this._rememberChoice = new CheckBox.CheckBox(_("Remember Password"));
@@ -370,8 +377,6 @@ var ShellMountPasswordDialog = GObject.registerClass({
this._rememberChoice = null;
}
this.contentLayout.add_child(content);
this._defaultButtons = [{
label: _("Cancel"),
action: this._onCancelButton.bind(this),
@@ -397,12 +402,9 @@ var ShellMountPasswordDialog = GObject.registerClass({
}
reaskPassword() {
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);
this._errorMessageLabel.show();
this._workSpinner.stop();
}
_onCancelButton() {
@@ -415,17 +417,14 @@ 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._errorMessageLabel.text = _('The PIM must be a number or empty.');
this._errorMessageLabel.opacity = 255;
return;
}
this._errorMessageLabel.opacity = 0;
if (isNaN(pim)) {
this._pimEntry.set_text('');
this._pimErrorMessageLabel.show();
return;
} else if (this._pimErrorMessageLabel !== null) {
this._pimErrorMessageLabel.hide();
}
global.settings.set_boolean(REMEMBER_MOUNT_PASSWORD_KEY,

View File

@@ -20,13 +20,9 @@ class Indicator extends PanelMenu.SystemIndicator {
this._createSubMenu();
this._loginScreenItem.connect('notify::visible',
() => this._updateSessionSubMenu());
() => this._updateMultiUser());
this._logoutItem.connect('notify::visible',
() => this._updateSessionSubMenu());
this._suspendItem.connect('notify::visible',
() => this._updateSessionSubMenu());
this._powerOffItem.connect('notify::visible',
() => this._updateSessionSubMenu());
() => this._updateMultiUser());
// Whether shutdown is available or not depends on both lockdown
// settings (disable-log-out) and Polkit policy - the latter doesn't
// notify, so we update the menu item each time the menu opens or
@@ -37,7 +33,7 @@ class Indicator extends PanelMenu.SystemIndicator {
this._systemActions.forceUpdate();
});
this._updateSessionSubMenu();
this._updateMultiUser();
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));
this._sessionUpdated();
@@ -47,12 +43,11 @@ class Indicator extends PanelMenu.SystemIndicator {
this._settingsItem.visible = Main.sessionMode.allowSettings;
}
_updateSessionSubMenu() {
this._sessionSubMenu.visible =
this._loginScreenItem.visible ||
this._logoutItem.visible ||
this._suspendItem.visible ||
this._powerOffItem.visible;
_updateMultiUser() {
let hasSwitchUser = this._loginScreenItem.visible;
let hasLogout = this._logoutItem.visible;
this._sessionSubMenu.visible = hasSwitchUser || hasLogout;
}
_createSubMenu() {

View File

@@ -270,8 +270,6 @@ const ScrollGesture = GObject.registerClass({
return;
this._enabled = enabled;
this._began = false;
this.notify('enabled');
}

View File

@@ -1,539 +1,41 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported UnlockDialog */
const { AccountsService, Atk, Clutter, Gdm, Gio,
GnomeDesktop, GLib, GObject, Meta, Shell, St } = imports.gi;
const { AccountsService, Atk, Clutter,
Gdm, Gio, GLib, GObject, Meta, Shell, St } = imports.gi;
const Background = imports.ui.background;
const Layout = imports.ui.layout;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const AuthPrompt = imports.gdm.authPrompt;
// The timeout before going back automatically to the lock screen (in seconds)
const IDLE_TIMEOUT = 2 * 60;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const CROSSFADE_TIME = 300;
const BLUR_BRIGHTNESS = 0.55;
const BLUR_RADIUS = 200;
const SUMMARY_ICON_SIZE = 32;
var NotificationsBox = GObject.registerClass({
Signals: { 'wake-up-screen': {} },
}, class NotificationsBox extends St.BoxLayout {
_init() {
super._init({
vertical: true,
name: 'unlockDialogNotifications',
style_class: 'unlock-dialog-notifications-container',
});
this._scrollView = new St.ScrollView({ hscrollbar_policy: St.PolicyType.NEVER });
this._notificationBox = new St.BoxLayout({
vertical: true,
style_class: 'unlock-dialog-notifications-container',
});
this._scrollView.add_actor(this._notificationBox);
this.add_child(this._scrollView);
this._sources = new Map();
Main.messageTray.getSources().forEach(source => {
this._sourceAdded(Main.messageTray, source, true);
});
this._updateVisibility();
this._sourceAddedId = Main.messageTray.connect('source-added', this._sourceAdded.bind(this));
this.connect('destroy', this._onDestroy.bind(this));
}
_onDestroy() {
if (this._sourceAddedId) {
Main.messageTray.disconnect(this._sourceAddedId);
this._sourceAddedId = 0;
}
let items = this._sources.entries();
for (let [source, obj] of items)
this._removeSource(source, obj);
}
_updateVisibility() {
this._notificationBox.visible =
this._notificationBox.get_children().some(a => a.visible);
this.visible = this._notificationBox.visible;
}
_makeNotificationSource(source, box) {
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
box.add_child(sourceActor);
let textBox = new St.BoxLayout({
x_expand: true,
y_expand: true,
y_align: Clutter.ActorAlign.CENTER,
});
box.add_child(textBox);
let title = new St.Label({
text: source.title,
style_class: 'unlock-dialog-notification-label',
x_expand: true,
x_align: Clutter.ActorAlign.START,
});
textBox.add(title);
let count = source.unseenCount;
let countLabel = new St.Label({
text: `${count}`,
style_class: 'unlock-dialog-notification-count-text',
});
textBox.add(countLabel);
box.visible = count !== 0;
return [title, countLabel];
}
_makeNotificationDetailedSource(source, box) {
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
let sourceBin = new St.Bin({ child: sourceActor });
box.add(sourceBin);
let textBox = new St.BoxLayout({ vertical: true });
box.add_child(textBox);
let title = new St.Label({
text: source.title,
style_class: 'unlock-dialog-notification-label',
});
textBox.add(title);
let visible = false;
for (let i = 0; i < source.notifications.length; i++) {
let n = source.notifications[i];
if (n.acknowledged)
continue;
let body = '';
if (n.bannerBodyText) {
body = n.bannerBodyMarkup
? n.bannerBodyText
: GLib.markup_escape_text(n.bannerBodyText, -1);
}
let label = new St.Label({ style_class: 'unlock-dialog-notification-count-text' });
label.clutter_text.set_markup(`<b>${n.title}</b> ${body}`);
textBox.add(label);
visible = true;
}
box.visible = visible;
return [title, null];
}
_shouldShowDetails(source) {
return source.policy.detailsInLockScreen ||
source.narrowestPrivacyScope === MessageTray.PrivacyScope.SYSTEM;
}
_updateSourceBoxStyle(source, obj, box) {
let hasCriticalNotification =
source.notifications.some(n => n.urgency === MessageTray.Urgency.CRITICAL);
if (hasCriticalNotification !== obj.hasCriticalNotification) {
obj.hasCriticalNotification = hasCriticalNotification;
if (hasCriticalNotification)
box.add_style_class_name('critical');
else
box.remove_style_class_name('critical');
}
}
_showSource(source, obj, box) {
if (obj.detailed)
[obj.titleLabel, obj.countLabel] = this._makeNotificationDetailedSource(source, box);
else
[obj.titleLabel, obj.countLabel] = this._makeNotificationSource(source, box);
box.visible = obj.visible && (source.unseenCount > 0);
this._updateSourceBoxStyle(source, obj, box);
}
_sourceAdded(tray, source, initial) {
let obj = {
visible: source.policy.showInLockScreen,
detailed: this._shouldShowDetails(source),
sourceDestroyId: 0,
sourceCountChangedId: 0,
sourceTitleChangedId: 0,
sourceUpdatedId: 0,
sourceBox: null,
titleLabel: null,
countLabel: null,
hasCriticalNotification: false,
};
obj.sourceBox = new St.BoxLayout({
style_class: 'unlock-dialog-notification-source',
x_expand: true,
});
this._showSource(source, obj, obj.sourceBox);
this._notificationBox.add_child(obj.sourceBox);
obj.sourceCountChangedId = source.connect('notify::count', () => {
this._countChanged(source, obj);
});
obj.sourceTitleChangedId = source.connect('notify::title', () => {
this._titleChanged(source, obj);
});
obj.policyChangedId = source.policy.connect('notify', (policy, pspec) => {
if (pspec.name === 'show-in-lock-screen')
this._visibleChanged(source, obj);
else
this._detailedChanged(source, obj);
});
obj.sourceDestroyId = source.connect('destroy', () => {
this._onSourceDestroy(source, obj);
});
this._sources.set(source, obj);
if (!initial) {
// block scrollbars while animating, if they're not needed now
let boxHeight = this._notificationBox.height;
if (this._scrollView.height >= boxHeight)
this._scrollView.vscrollbar_policy = St.PolicyType.NEVER;
let widget = obj.sourceBox;
let [, natHeight] = widget.get_preferred_height(-1);
widget.height = 0;
widget.ease({
height: natHeight,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
duration: 250,
onComplete: () => {
this._scrollView.vscrollbar_policy = St.PolicyType.AUTOMATIC;
widget.set_height(-1);
},
});
this._updateVisibility();
if (obj.sourceBox.visible)
this.emit('wake-up-screen');
}
}
_titleChanged(source, obj) {
obj.titleLabel.text = source.title;
}
_countChanged(source, obj) {
// A change in the number of notifications may change whether we show
// details.
let newDetailed = this._shouldShowDetails(source);
let oldDetailed = obj.detailed;
obj.detailed = newDetailed;
if (obj.detailed || oldDetailed !== newDetailed) {
// A new notification was pushed, or a previous notification was destroyed.
// Give up, and build the list again.
obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox);
} else {
let count = source.unseenCount;
obj.countLabel.text = `${count}`;
}
obj.sourceBox.visible = obj.visible && (source.unseenCount > 0);
this._updateVisibility();
if (obj.sourceBox.visible)
this.emit('wake-up-screen');
}
_visibleChanged(source, obj) {
if (obj.visible === source.policy.showInLockScreen)
return;
obj.visible = source.policy.showInLockScreen;
obj.sourceBox.visible = obj.visible && source.unseenCount > 0;
this._updateVisibility();
if (obj.sourceBox.visible)
this.emit('wake-up-screen');
}
_detailedChanged(source, obj) {
let newDetailed = this._shouldShowDetails(source);
if (obj.detailed === newDetailed)
return;
obj.detailed = newDetailed;
obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox);
}
_onSourceDestroy(source, obj) {
this._removeSource(source, obj);
this._updateVisibility();
}
_removeSource(source, obj) {
obj.sourceBox.destroy();
obj.sourceBox = obj.titleLabel = obj.countLabel = null;
source.disconnect(obj.sourceDestroyId);
source.disconnect(obj.sourceCountChangedId);
source.disconnect(obj.sourceTitleChangedId);
source.policy.disconnect(obj.policyChangedId);
this._sources.delete(source);
}
});
var Clock = GObject.registerClass(
class UnlockDialogClock extends St.BoxLayout {
_init() {
super._init({ style_class: 'unlock-dialog-clock', vertical: true });
this._time = new St.Label({
style_class: 'unlock-dialog-clock-time',
x_align: Clutter.ActorAlign.CENTER,
});
this._date = new St.Label({
style_class: 'unlock-dialog-clock-date',
x_align: Clutter.ActorAlign.CENTER,
});
this.add_child(this._time);
this.add_child(this._date);
this._wallClock = new GnomeDesktop.WallClock({ time_only: true });
this._wallClock.connect('notify::clock', this._updateClock.bind(this));
this._updateClock();
this.connect('destroy', this._onDestroy.bind(this));
}
_updateClock() {
this._time.text = this._wallClock.clock;
let date = new Date();
/* Translators: This is a time format for a date in
long format */
let dateFormat = Shell.util_translate_time_string(N_('%A %B %-d'));
this._date.text = date.toLocaleFormat(dateFormat);
}
_onDestroy() {
this._wallClock.run_dispose();
}
});
var UnlockDialogLayout = GObject.registerClass(
class UnlockDialogLayout extends Clutter.LayoutManager {
_init(stack, notifications) {
super._init();
this._stack = stack;
this._notifications = notifications;
}
vfunc_get_preferred_width(container, forHeight) {
return this._stack.get_preferred_width(forHeight);
}
vfunc_get_preferred_height(container, forWidth) {
return this._stack.get_preferred_height(forWidth);
}
vfunc_allocate(container, box, flags) {
let [width, height] = box.get_size();
let tenthOfHeight = height / 10.0;
let thirdOfHeight = height / 3.0;
let [, , stackWidth, stackHeight] =
this._stack.get_preferred_size();
let [, , notificationsWidth, notificationsHeight] =
this._notifications.get_preferred_size();
let columnWidth = Math.max(stackWidth, notificationsWidth);
let columnX1 = Math.floor((width - columnWidth) / 2.0);
let actorBox = new Clutter.ActorBox();
// Notifications
let maxNotificationsHeight = Math.min(
notificationsHeight,
height - tenthOfHeight - stackHeight);
actorBox.x1 = columnX1;
actorBox.y1 = height - maxNotificationsHeight;
actorBox.x2 = columnX1 + columnWidth;
actorBox.y2 = actorBox.y1 + maxNotificationsHeight;
this._notifications.allocate(actorBox, flags);
// Authentication Box
let stackY = Math.min(
thirdOfHeight,
height - stackHeight - maxNotificationsHeight);
actorBox.x1 = columnX1;
actorBox.y1 = stackY;
actorBox.x2 = columnX1 + columnWidth;
actorBox.y2 = stackY + stackHeight;
this._stack.allocate(actorBox, flags);
}
});
var UnlockDialog = GObject.registerClass({
Signals: {
'failed': {},
'wake-up-screen': {},
},
Signals: { 'failed': {} },
}, class UnlockDialog extends St.Widget {
_init(parentActor) {
super._init({
accessible_role: Atk.Role.WINDOW,
style_class: 'login-dialog',
layout_manager: new Clutter.BoxLayout(),
visible: false,
can_focus: true,
reactive: true,
});
this.add_constraint(new Layout.MonitorConstraint({ primary: true }));
parentActor.add_child(this);
this._activePage = null;
let tapAction = new Clutter.TapAction();
tapAction.connect('tap', this._showPrompt.bind(this));
this.add_action(tapAction);
// Background
this._backgroundGroup = new Clutter.Actor();
this.add_child(this._backgroundGroup);
this._bgManagers = [];
this._updateBackgrounds();
this._monitorsChangedId =
Main.layoutManager.connect('monitors-changed', this._updateBackgrounds.bind(this));
this._userManager = AccountsService.UserManager.get_default();
this._userName = GLib.get_user_name();
this._user = this._userManager.get_user(this._userName);
// Authentication & Clock stack
let stack = new Shell.Stack();
this._promptBox = new St.BoxLayout({ vertical: true });
stack.add_child(this._promptBox);
this._clock = new Clock();
stack.add_child(this._clock);
this._showClock();
this.allowCancel = false;
Main.ctrlAltTabManager.addGroup(this, _('Unlock Window'), 'dialog-password-symbolic');
// Notifications
this._notificationsBox = new NotificationsBox();
this._notificationsBox.connect('wake-up-screen', () => this.emit('wake-up-screen'));
// Main Box
let mainBox = new Clutter.Actor();
mainBox.add_constraint(new Layout.MonitorConstraint({ primary: true }));
mainBox.add_child(stack);
mainBox.add_child(this._notificationsBox);
mainBox.layout_manager = new UnlockDialogLayout(
stack,
this._notificationsBox);
this.add_child(mainBox);
this._idleMonitor = Meta.IdleMonitor.get_core();
this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, this._escape.bind(this));
this.connect('destroy', this._onDestroy.bind(this));
}
vfunc_key_press_event(keyEvent) {
if (this._activePage === this._promptBox ||
(this._promptBox && this._promptBox.visible))
return Clutter.EVENT_PROPAGATE;
let unichar = keyEvent.unicode_value;
this._showPrompt();
if (GLib.unichar_isgraph(unichar))
this.addCharacter(unichar);
return Clutter.EVENT_PROPAGATE;
}
_createBackground(monitorIndex) {
let monitor = Main.layoutManager.monitors[monitorIndex];
let widget = new St.Widget({
style_class: 'screen-shield-background',
x: monitor.x,
y: monitor.y,
width: monitor.width,
height: monitor.height,
});
let bgManager = new Background.BackgroundManager({
container: widget,
monitorIndex,
controlPosition: false,
settingsSchema: SCREENSAVER_SCHEMA,
});
this._bgManagers.push(bgManager);
this._backgroundGroup.add_child(widget);
widget.add_effect(new Shell.BlurEffect({
brightness: BLUR_BRIGHTNESS,
blur_radius: BLUR_RADIUS,
}));
}
_updateBackgrounds() {
for (let i = 0; i < this._bgManagers.length; i++)
this._bgManagers[i].destroy();
this._bgManagers = [];
this._backgroundGroup.destroy_all_children();
for (let i = 0; i < Main.layoutManager.monitors.length; i++)
this._createBackground(i);
}
_ensureAuthPrompt() {
if (this._authPrompt)
return;
this._promptBox = new St.BoxLayout({ vertical: true,
x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_expand: true });
this.add_child(this._promptBox);
this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
this._authPrompt.connect('failed', this._fail.bind(this));
@@ -543,18 +45,16 @@ var UnlockDialog = GObject.registerClass({
this._promptBox.add_child(this._authPrompt);
this.allowCancel = false;
let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' });
if (screenSaverSettings.get_boolean('user-switch-enabled')) {
let otherUserLabel = new St.Label({
text: _('Log in as another user'),
style_class: 'login-dialog-not-listed-label',
});
this._otherUserButton = new St.Button({
style_class: 'login-dialog-not-listed-button',
can_focus: true,
child: otherUserLabel,
reactive: true,
});
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' });
this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button',
can_focus: true,
child: otherUserLabel,
reactive: true });
this._otherUserButton.connect('clicked', this._otherUserClicked.bind(this));
this._promptBox.add_child(this._otherUserButton);
} else {
@@ -563,24 +63,13 @@ var UnlockDialog = GObject.registerClass({
this._authPrompt.reset();
this._updateSensitivity(true);
}
_maybeDestroyAuthPrompt() {
let focus = global.stage.key_focus;
if (focus === null ||
(this._authPrompt && this._authPrompt.contains(focus)) ||
(this._otherUserButton && focus === this._otherUserButton))
this.grab_key_focus();
Main.ctrlAltTabManager.addGroup(this, _("Unlock Window"), 'dialog-password-symbolic');
if (this._authPrompt) {
this._authPrompt.destroy();
this._authPrompt = null;
}
this._idleMonitor = Meta.IdleMonitor.get_core();
this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, this._escape.bind(this));
if (this._otherUserButton) {
this._otherUserButton.destroy();
this._otherUserButton = null;
}
this.connect('destroy', this._onDestroy.bind(this));
}
_updateSensitivity(sensitive) {
@@ -592,55 +81,7 @@ var UnlockDialog = GObject.registerClass({
}
}
_showClock() {
if (this._activePage === this._clock)
return;
this._activePage = this._clock;
this._clock.show();
this._promptBox.ease({
opacity: 0,
duration: CROSSFADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => {
this._promptBox.hide();
this._maybeDestroyAuthPrompt();
},
});
this._clock.ease({
opacity: 255,
duration: CROSSFADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
_showPrompt() {
this._ensureAuthPrompt();
if (this._activePage === this._promptBox)
return;
this._activePage = this._promptBox;
this._promptBox.show();
this._clock.ease({
opacity: 0,
duration: CROSSFADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
onComplete: () => this._clock.hide(),
});
this._promptBox.ease({
opacity: 255,
duration: CROSSFADE_TIME,
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
});
}
_fail() {
this._showClock();
this.emit('failed');
}
@@ -674,25 +115,19 @@ var UnlockDialog = GObject.registerClass({
this._idleMonitor.remove_watch(this._idleWatchId);
this._idleWatchId = 0;
}
if (this._monitorsChangedId) {
Main.layoutManager.disconnect(this._monitorsChangedId);
delete this._monitorsChangedId;
}
}
cancel() {
if (this._authPrompt)
this._authPrompt.cancel();
this._authPrompt.cancel();
this.destroy();
}
addCharacter(unichar) {
this._showPrompt();
this._authPrompt.addCharacter(unichar);
}
finish(onComplete) {
this._ensureAuthPrompt();
this._authPrompt.finish(onComplete);
}
@@ -714,10 +149,6 @@ var UnlockDialog = GObject.registerClass({
return true;
}
activate() {
this._showPrompt();
}
popModal(timestamp) {
if (this._isModal) {
Main.popModal(this, timestamp);

View File

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

View File

@@ -155,7 +155,8 @@ var WindowClone = GObject.registerClass({
this._updateAttachedDialogs();
this._computeBoundingBox();
this.set_translation(this._boundingBox.x, this._boundingBox.y, 0);
this.x = this._boundingBox.x;
this.y = this._boundingBox.y;
this._computeWindowCenter();
@@ -1363,8 +1364,8 @@ class Workspace extends St.Widget {
if (!clone.positioned) {
// This window appeared after the overview was already up
// Grow the clone from the center of the slot
clone.translation_x = x + cloneWidth / 2;
clone.translation_y = y + cloneHeight / 2;
clone.x = x + cloneWidth / 2;
clone.y = y + cloneHeight / 2;
clone.scale_x = 0;
clone.scale_y = 0;
clone.positioned = true;
@@ -1379,8 +1380,8 @@ class Workspace extends St.Widget {
clone.opacity = 0;
clone.scale_x = 0;
clone.scale_y = 0;
clone.translation_x = x;
clone.translation_y = y;
clone.x = x;
clone.y = y;
}
clone.ease({
@@ -1394,7 +1395,7 @@ class Workspace extends St.Widget {
} else {
// cancel any active tweens (otherwise they might override our changes)
clone.remove_all_transitions();
clone.set_translation(x, y, 0);
clone.set_position(x, y);
clone.set_scale(scale, scale);
clone.set_opacity(255);
clone.overlay.relayout(false);
@@ -1424,8 +1425,7 @@ class Workspace extends St.Widget {
_animateClone(clone, overlay, x, y, scale) {
clone.ease({
translation_x: x,
translation_y: y,
x, y,
scale_x: scale,
scale_y: scale,
duration: Overview.ANIMATION_TIME,
@@ -1570,7 +1570,7 @@ class Workspace extends St.Widget {
clone.slot = [x, y, clone.width * scale, clone.height * scale];
clone.positioned = true;
clone.set_translation(x, y, 0);
clone.set_position(x, y);
clone.set_scale(scale, scale);
clone.overlay.relayout(false);
}
@@ -1725,8 +1725,8 @@ class Workspace extends St.Widget {
let [origX, origY] = clone.getOriginalPosition();
clone.scale_x = 1;
clone.scale_y = 1;
clone.translation_x = origX;
clone.translation_y = origY;
clone.x = origX;
clone.y = origY;
clone.ease({
opacity,
duration,
@@ -1776,8 +1776,8 @@ class Workspace extends St.Widget {
if (clone.metaWindow.showing_on_its_workspace()) {
let [origX, origY] = clone.getOriginalPosition();
clone.ease({
translation_x: origX,
translation_y: origY,
x: origX,
y: origY,
scale_x: 1,
scale_y: 1,
opacity: 255,

View File

@@ -1,5 +1,5 @@
project('gnome-shell', 'c',
version: '3.35.90',
version: '3.35.3',
meson_version: '>= 0.47.0',
license: 'GPLv2+'
)
@@ -25,7 +25,7 @@ gio_req = '>= 2.56.0'
gi_req = '>= 1.49.1'
gjs_req = '>= 1.63.2'
gtk_req = '>= 3.15.0'
mutter_req = '>= 3.35.90'
mutter_req = '>= 3.35.3'
polkit_req = '>= 0.100'
schemas_req = '>= 3.33.1'
startup_req = '>= 0.11'
@@ -55,7 +55,6 @@ 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,12 +8,6 @@ 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,13 +1,11 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
data/50-gnome-shell-system.xml
data/org.gnome.Extensions.desktop.in.in
data/gnome-shell-extension-prefs.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/extension-row.ui
js/extensionPrefs/ui/extensions-window.ui
js/gdm/authPrompt.js
js/gdm/loginDialog.js
js/gdm/util.js

File diff suppressed because it is too large Load Diff

421
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-02-06 19:01+0000\n"
"PO-Revision-Date: 2020-02-07 10:20+0100\n"
"POT-Creation-Date: 2020-01-28 15:54+0000\n"
"PO-Revision-Date: 2020-01-29 10:33+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"
@@ -44,12 +44,12 @@ msgstr "Mostrar todas las aplicaciones"
msgid "Open the application menu"
msgstr "Abrir el menú de la aplicación"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
msgid "Extensions"
msgstr "Extensiones"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:209
msgid "Shell Extensions"
msgstr "Extensiones de la Shell"
#: data/org.gnome.Extensions.desktop.in.in:7
#: data/gnome-shell-extension-prefs.desktop.in.in:5
msgid "Configure GNOME Shell Extensions"
msgstr "Configurar las extensiones de GNOME Shell"
@@ -410,47 +410,11 @@ msgstr ""
msgid "Network Login"
msgstr "Inicio de sesión de la red"
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "¿Quitar «%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 ""
"Si quita la extensión necesitará volver a descargarla si quiere activarla de "
"nuevo"
#: 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 "Cancelar"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Quitar"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr ""
"Daniel Mustieles <daniel.mustieles@gmail.com>, 2010-2020\n"
"Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011\n"
"Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011"
#: js/extensionPrefs/main.js:219
msgid "Manage your GNOME Extensions"
msgstr "Gestionar sus extensiones de GNOME Shell"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
#: js/extensionPrefs/main.js:102 js/extensionPrefs/main.js:525
msgid "Somethings gone wrong"
msgstr "Algo ha fallado"
#: js/extensionPrefs/main.js:268
#: js/extensionPrefs/main.js:109
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 "
@@ -459,95 +423,39 @@ msgstr ""
"Ha habido un problema: no se puede mostrar la configuración para esta "
"extensión. Se recomienda que informe del error a los autores de la extensión."
#: js/extensionPrefs/main.js:275
#: js/extensionPrefs/main.js:116
msgid "Technical Details"
msgstr "Detalles técnicos"
#: js/extensionPrefs/main.js:310
#: js/extensionPrefs/main.js:151
msgid "Copy Error"
msgstr "Copiar error"
#: js/extensionPrefs/main.js:337
#: js/extensionPrefs/main.js:178
msgid "Homepage"
msgstr "Página web"
#: js/extensionPrefs/main.js:338
#: js/extensionPrefs/main.js:179
msgid "Visit extension homepage"
msgstr "Visitar la página web de la extensión"
#: 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."
msgstr[0] "la próxima vez que inicie sesión se actualizará %d extensión"
msgstr[1] "la próxima vez que inicie sesión se actualizarán %d extensiones"
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descripción"
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versión"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "Página web"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Quitar…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Ayuda"
#: js/extensionPrefs/ui/extensions-window.ui:12
msgid "About Extensions"
msgstr "Acerca de extensiones"
#: js/extensionPrefs/ui/extensions-window.ui:27
msgid ""
"To find and add extensions, visit <a href=\"https://extensions.gnome.org"
"\">extensions.gnome.org</a>."
msgstr ""
"Para buscar y añadir extensiones visite <a href=\"https://extensions.gnome."
"org\">extensions.gnome.org</a>."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Advertencia"
#: 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 ""
"Las extensiones pueden causar problemas en el sistema, incluso problemas de "
"rendimiento. Si tiene problemas con sus sistema se recomienda desactivar "
"todas las extensiones."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Instalada manualmente"
#: js/extensionPrefs/ui/extensions-window.ui:157
msgid "Built-In"
msgstr "Integrada"
#: js/extensionPrefs/ui/extensions-window.ui:198
msgid "No Installed Extensions"
#: js/extensionPrefs/main.js:467
msgid "No Extensions Installed"
msgstr "No hay extensiones instaladas"
#: js/extensionPrefs/ui/extensions-window.ui:234
#: js/extensionPrefs/main.js:477
msgid ""
"Extensions can be installed through Software or <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
msgstr ""
"Las extensiones se puede instalar mediante software o <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/main.js:492
msgid "Browse in Software"
msgstr "Buscar en Software"
#: js/extensionPrefs/main.js:532
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."
@@ -555,21 +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/extensionPrefs/ui/extensions-window.ui:287
#| msgid "Log Out"
msgid "Log Out…"
msgstr "Cerrar la sesión…"
#: 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 "Cancelar"
#: js/gdm/authPrompt.js:184 js/gdm/authPrompt.js:237 js/gdm/authPrompt.js:468
#: js/gdm/authPrompt.js:188 js/gdm/authPrompt.js:241 js/gdm/authPrompt.js:476
msgid "Next"
msgstr "Siguiente"
#: js/gdm/authPrompt.js:233 js/ui/shellMountOperation.js:380
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:385
#: js/ui/unlockDialog.js:44
msgid "Unlock"
msgstr "Desbloquear"
#: js/gdm/authPrompt.js:235
#: js/gdm/authPrompt.js:239
msgctxt "button"
msgid "Sign In"
msgstr "Iniciar sesión"
@@ -592,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:234
#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:275
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297
msgid "Username: "
msgstr "Nombre de usuario:"
@@ -671,78 +582,81 @@ 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:120
#: js/misc/util.js:116
msgid "Command not found"
msgstr "Comando no encontrado"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: js/misc/util.js:156
#: js/misc/util.js:152
msgid "Could not parse command:"
msgstr "No se pudo analizar el comando:"
#: js/misc/util.js:164
#: js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Falló la ejecución de «%s»:"
#: js/misc/util.js:181
#: js/misc/util.js:177
msgid "Just now"
msgstr "Ahora mismo"
#: js/misc/util.js:183
#: js/misc/util.js:179
#, 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:187
#: js/misc/util.js:183
#, 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:191
#: js/misc/util.js:187
msgid "Yesterday"
msgstr "Ayer"
#: js/misc/util.js:193
#: js/misc/util.js:189
#, 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:197
#: js/misc/util.js:193
#, 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:201
#: js/misc/util.js:197
#, 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:204
#: js/misc/util.js:200
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
@@ -750,20 +664,20 @@ msgstr[0] "Hace %d año"
msgstr[1] "Hace %d años"
#. Translators: Time in 24h format
#: js/misc/util.js:237
#: js/misc/util.js:233
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:243
#: js/misc/util.js:239
#, 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:249
#: js/misc/util.js:245
#, no-c-format
msgid "%A, %H%M"
msgstr "%A, %H%M"
@@ -771,7 +685,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:255
#: js/misc/util.js:251
#, no-c-format
msgid "%B %-d, %H%M"
msgstr "%d de %B, %H%M"
@@ -779,7 +693,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:261
#: js/misc/util.js:257
#, no-c-format
msgid "%B %-d %Y, %H%M"
msgstr "%d de %B de %Y, %H%M"
@@ -787,20 +701,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:266
#: js/misc/util.js:262
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:272
#: js/misc/util.js:268
#, 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:278
#: js/misc/util.js:274
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@@ -808,7 +722,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:284
#: js/misc/util.js:280
#, no-c-format
msgid "%B %-d, %l%M %p"
msgstr "%d de %B, %l%M %p"
@@ -816,17 +730,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:290
#: js/misc/util.js:286
#, 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:42
#: js/portalHelper/main.js:40
msgid "Hotspot Login"
msgstr "Inicio de sesión en el punto de acceso"
#: js/portalHelper/main.js:88
#: js/portalHelper/main.js:86
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."
@@ -844,44 +758,44 @@ msgstr "Denegar acceso"
msgid "Grant Access"
msgstr "Conceder acceso"
#: js/ui/appDisplay.js:906
#: js/ui/appDisplay.js:904
msgid "Unnamed Folder"
msgstr "Carpeta sin nombre"
#: js/ui/appDisplay.js:929
#: js/ui/appDisplay.js:927
msgid "Frequently used applications will appear here"
msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
#: js/ui/appDisplay.js:1064
#: js/ui/appDisplay.js:1062
msgid "Frequent"
msgstr "Frecuentes"
#: js/ui/appDisplay.js:1071
#: js/ui/appDisplay.js:1069
msgid "All"
msgstr "Todas"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2454 js/ui/panel.js:75
#: js/ui/appDisplay.js:2452 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Ventanas abiertas"
#: js/ui/appDisplay.js:2474 js/ui/panel.js:82
#: js/ui/appDisplay.js:2472 js/ui/panel.js:82
msgid "New Window"
msgstr "Ventana nueva"
#: js/ui/appDisplay.js:2485
#: js/ui/appDisplay.js:2483
msgid "Launch using Dedicated Graphics Card"
msgstr "Lanzar usando la tarjeta gráfica dedicada"
#: js/ui/appDisplay.js:2513 js/ui/dash.js:239
#: js/ui/appDisplay.js:2511 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: js/ui/appDisplay.js:2519
#: js/ui/appDisplay.js:2517
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
#: js/ui/appDisplay.js:2529 js/ui/panel.js:93
#: js/ui/appDisplay.js:2527 js/ui/panel.js:93
msgid "Show Details"
msgstr "Mostrar detalles"
@@ -1099,47 +1013,54 @@ msgstr "La versión de udisks instalada no soporta la configuración PIM"
msgid "Open with %s"
msgstr "Abrir con %s"
#: js/ui/components/networkAgent.js:89
#: 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
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:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:123 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: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
#: 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
msgid "Password: "
msgstr "Contraseña: "
#. static WEP
#: js/ui/components/networkAgent.js:207
#: js/ui/components/networkAgent.js:229
msgid "Key: "
msgstr "Clave:"
#: js/ui/components/networkAgent.js:242 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287
msgid "Private key password: "
msgstr "Contraseña de la clave privada:"
#: js/ui/components/networkAgent.js:263
#: js/ui/components/networkAgent.js:285
msgid "Identity: "
msgstr "Identidad:"
#: js/ui/components/networkAgent.js:277
#: js/ui/components/networkAgent.js:299
msgid "Service: "
msgstr "Servicio:"
#: 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: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:307 js/ui/components/networkAgent.js:682
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -1148,54 +1069,58 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»."
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708
msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada"
#: js/ui/components/networkAgent.js:313
#: js/ui/components/networkAgent.js:335
msgid "Network name: "
msgstr "Nombre de la red: "
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712
msgid "DSL authentication"
msgstr "Autenticación DSL"
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:695
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717
msgid "PIN code required"
msgstr "Código PIN requerido"
#: js/ui/components/networkAgent.js:326 js/ui/components/networkAgent.js:696
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
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:327
#: js/ui/components/networkAgent.js:349
msgid "PIN: "
msgstr "PIN: "
#: 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
#: 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
#, 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:670 js/ui/status/network.js:1688
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688
msgid "Network Manager"
msgstr "Gestor de la red"
#: js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:728
msgid "VPN password"
msgstr "Contraseña de la VPN"
#: js/ui/components/polkitAgent.js:39
#: js/ui/components/polkitAgent.js:41
msgid "Authentication Required"
msgstr "Se necesita autenticación"
#: js/ui/components/polkitAgent.js:80
#: js/ui/components/polkitAgent.js:81
msgid "Administrator"
msgstr "Administrador"
#: js/ui/components/polkitAgent.js:142
#: js/ui/components/polkitAgent.js:141
msgid "Authenticate"
msgstr "Autenticar"
@@ -1203,14 +1128,10 @@ 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:254 js/ui/shellMountOperation.js:402
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:365
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 "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
@@ -1426,27 +1347,19 @@ msgstr "%s (remoto)"
msgid "%s (console)"
msgstr "%s (consola)"
#: js/ui/extensionDownloader.js:170
#: js/ui/extensionDownloader.js:194
msgid "Install"
msgstr "Instalar"
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:200
msgid "Install Extension"
msgstr "Instalar extensión"
#: js/ui/extensionDownloader.js:177
#: js/ui/extensionDownloader.js:201
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
msgid "Extension Updates Available"
msgstr "Actualizaciones de extensiones disponibles"
#: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed."
msgstr "Las actualizaciones de las extensiones están listas para instalarse."
#: js/ui/inhibitShortcutsDialog.js:79
msgid "Allow inhibiting shortcuts"
msgstr "Permitir inhibir los atajos"
@@ -1741,7 +1654,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d notificación nueva"
msgstr[1] "%d notificaciones nuevas"
#: js/ui/screenShield.js:454 js/ui/status/system.js:103
#: js/ui/screenShield.js:454 js/ui/status/system.js:98
msgid "Lock"
msgstr "Bloquear"
@@ -1799,20 +1712,20 @@ msgstr "Ocultar texto"
msgid "Caps lock is on."
msgstr "Bloq. Mayús. está activo"
#: js/ui/shellMountOperation.js:285
#: js/ui/shellMountOperation.js:287
msgid "Hidden Volume"
msgstr "Ocultar volumen"
#: js/ui/shellMountOperation.js:288
#: js/ui/shellMountOperation.js:290
msgid "Windows System Volume"
msgstr "Volumen de sistema Windows"
#: js/ui/shellMountOperation.js:291
#: js/ui/shellMountOperation.js:293
msgid "Uses Keyfiles"
msgstr "Usa archivos de claves"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:298
#: js/ui/shellMountOperation.js:299
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
@@ -1821,31 +1734,35 @@ msgstr ""
"%s</i> en su lugar."
#: js/ui/shellMountOperation.js:306
msgid "Enter PIM Number"
msgstr "Introduzca el número PIM"
msgid "PIM Number"
msgstr "Número PIM"
#: js/ui/shellMountOperation.js:365
#: 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
msgid "Remember Password"
msgstr "Recordar contraseña"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:391
#: js/ui/shellMountOperation.js:396
#, 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:469
#: js/ui/shellMountOperation.js:468
#, javascript-format
msgid "Unable to start %s"
msgstr "No se puede iniciar %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:470
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "No se pudo encontrar la aplicación %s"
@@ -2261,23 +2178,23 @@ msgstr "Apagar"
msgid "Airplane Mode On"
msgstr "Modo avión activado"
#: js/ui/status/system.js:116
#: js/ui/status/system.js:111
msgid "Power Off / Log Out"
msgstr "Apagar / cerrar sesión"
#: js/ui/status/system.js:119
#: js/ui/status/system.js:114
msgid "Log Out"
msgstr "Cerrar la sesión"
#: js/ui/status/system.js:131
#: js/ui/status/system.js:126
msgid "Switch User…"
msgstr "Cambiar de usuario…"
#: js/ui/status/system.js:145
#: js/ui/status/system.js:140
msgid "Suspend"
msgstr "Suspender"
#: js/ui/status/system.js:157
#: js/ui/status/system.js:152
msgid "Power Off…"
msgstr "Apagar…"
@@ -2373,23 +2290,22 @@ msgstr "Buscar"
msgid "“%s” is ready"
msgstr "«%s» está preparado"
#. Translators: This string should be shorter than 30 characters
#: js/ui/windowManager.js:55
msgid "Keep these display settings?"
#: js/ui/windowManager.js:54
msgid "Do you want to 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:64
#: js/ui/windowManager.js:68
msgid "Revert Settings"
msgstr "Revertir configuración"
#: js/ui/windowManager.js:67
#: js/ui/windowManager.js:71
msgid "Keep Changes"
msgstr "Mantener cambios"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:89
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -2398,7 +2314,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:542
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@@ -2544,6 +2460,11 @@ msgstr ""
"La descripción es una única frase para explicar qué hace su extensión.\n"
"Algunos ejemplos: %s"
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descripción"
#: subprojects/extensions-tool/src/command-create.c:222
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
@@ -2746,6 +2667,10 @@ msgstr "URL"
msgid "Original author"
msgstr "Autor original"
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versión"
#: subprojects/extensions-tool/src/main.c:188
msgid "State"
msgstr "Estado"
@@ -2848,30 +2773,6 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sonidos del sistema"
#~ msgid "Logout…"
#~ msgstr "Cerrar sesión…"
#~ msgid "org.gnome.Extensions"
#~ msgstr "org.gnome.Extensions"
#~ msgid "Browse in Software"
#~ msgstr "Buscar en Software"
#~ 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"
@@ -2984,6 +2885,9 @@ 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"
@@ -3188,6 +3092,9 @@ msgstr "Sonidos del sistema"
#~ msgid "Open"
#~ msgstr "Abrir"
#~ msgid "Remove"
#~ msgstr "Quitar"
#~ msgid "Clear Messages"
#~ msgstr "Limpiar mensajes"

623
po/eu.po

File diff suppressed because it is too large Load Diff

1609
po/fa.po

File diff suppressed because it is too large Load Diff

534
po/fi.po

File diff suppressed because it is too large Load Diff

626
po/gl.po

File diff suppressed because it is too large Load Diff

457
po/hr.po

File diff suppressed because it is too large Load Diff

514
po/id.po

File diff suppressed because it is too large Load Diff

565
po/ja.po

File diff suppressed because it is too large Load Diff

1614
po/lt.po

File diff suppressed because it is too large Load Diff

1186
po/mjw.po

File diff suppressed because it is too large Load Diff

View File

@@ -24,8 +24,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-02-06 19:01+0000\n"
"PO-Revision-Date: 2020-02-06 20:40-0300\n"
"POT-Creation-Date: 2020-01-28 15:54+0000\n"
"PO-Revision-Date: 2020-01-28 18:42-0300\n"
"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n"
@@ -60,13 +60,12 @@ msgstr "Mostrar todos os aplicativos"
msgid "Open the application menu"
msgstr "Abre o menu do aplicativo"
#: data/org.gnome.Extensions.desktop.in.in:4 js/extensionPrefs/main.js:218
#: js/extensionPrefs/ui/extensions-window.ui:61
#| msgid "Shell Extensions"
msgid "Extensions"
msgstr "Extensões"
#: data/gnome-shell-extension-prefs.desktop.in.in:4
#: js/extensionPrefs/main.js:209
msgid "Shell Extensions"
msgstr "Extensões do shell"
#: data/org.gnome.Extensions.desktop.in.in:7
#: data/gnome-shell-extension-prefs.desktop.in.in:5
msgid "Configure GNOME Shell Extensions"
msgstr "Configurar extensões do Shell do GNOME"
@@ -423,45 +422,11 @@ msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover"
msgid "Network Login"
msgstr "Sessão de Rede"
#: js/extensionPrefs/main.js:140
#, javascript-format
msgid "Remove “%s”?"
msgstr "Remover “%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 ""
"Se você remover a extensão, você precisa voltar a baixá-la se você quiser "
"habilitá-la novamente"
#: 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 "Cancelar"
#: js/extensionPrefs/main.js:145
msgid "Remove"
msgstr "Remover"
#: js/extensionPrefs/main.js:217
msgid "translator-credits"
msgstr "Rafael Fontenelle <rafaelff@gnome.org>"
#: js/extensionPrefs/main.js:219
#| msgid "Configure GNOME Shell Extensions"
msgid "Manage your GNOME Extensions"
msgstr "Gerenciar suas extensões do GNOME"
#: js/extensionPrefs/main.js:261 js/extensionPrefs/ui/extensions-window.ui:222
#: js/extensionPrefs/main.js:102 js/extensionPrefs/main.js:525
msgid "Somethings gone wrong"
msgstr "Algo deu errado"
#: js/extensionPrefs/main.js:268
#: js/extensionPrefs/main.js:109
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 "
@@ -471,101 +436,39 @@ msgstr ""
"ser exibidas. Recomendamos que você relate o problema aos autores da "
"extensão."
#: js/extensionPrefs/main.js:275
#: js/extensionPrefs/main.js:116
msgid "Technical Details"
msgstr "Detalhes técnicos"
#: js/extensionPrefs/main.js:310
#: js/extensionPrefs/main.js:151
msgid "Copy Error"
msgstr "Copiar erro"
#: js/extensionPrefs/main.js:337
#: js/extensionPrefs/main.js:178
msgid "Homepage"
msgstr "Site"
#: js/extensionPrefs/main.js:338
#: js/extensionPrefs/main.js:179
msgid "Visit extension homepage"
msgstr "Visita a página web da extensão"
#: 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."
msgstr[0] "%d extensão será atualizada na próxima sessão."
msgstr[1] "%d extensões serão atualizadas na próxima sessão."
#: js/extensionPrefs/ui/extension-row.ui:100
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descrição"
#: js/extensionPrefs/ui/extension-row.ui:123
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versão"
#: js/extensionPrefs/ui/extension-row.ui:151
msgid "Author"
msgstr "Autor"
#: js/extensionPrefs/ui/extension-row.ui:175
msgid "Website"
msgstr "Site"
#: js/extensionPrefs/ui/extension-row.ui:192
msgid "Remove…"
msgstr "Remover…"
#: js/extensionPrefs/ui/extensions-window.ui:8
msgid "Help"
msgstr "Ajuda"
#: js/extensionPrefs/ui/extensions-window.ui:12
#| msgid "List extensions"
msgid "About Extensions"
msgstr "Sobre as Extensões"
#: 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 ""
"Para encontrar e adicionar extensões, visite <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/ui/extensions-window.ui:35
msgid "Warning"
msgstr "Aviso"
#: 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 ""
"Extensões podem causar problemas no sistema, incluindo problemas de "
"desempenho. Se você encontrar problemas com o seu sistema, é recomendável "
"desativar todas as extensões."
#: js/extensionPrefs/ui/extensions-window.ui:133
msgid "Manually Installed"
msgstr "Instalada manualmente"
#: js/extensionPrefs/ui/extensions-window.ui:157
#| msgid "Built-in Only"
msgid "Built-In"
msgstr "Interna"
#: js/extensionPrefs/ui/extensions-window.ui:198
#| msgid "Install Extension"
msgid "No Installed Extensions"
#: js/extensionPrefs/main.js:467
msgid "No Extensions Installed"
msgstr "Nenhuma extensão instalada"
#: js/extensionPrefs/ui/extensions-window.ui:234
#: js/extensionPrefs/main.js:477
msgid ""
"Extensions can be installed through Software or <a href=\"https://extensions."
"gnome.org\">extensions.gnome.org</a>."
msgstr ""
"Extensões podem ser instaladas por meio do Software ou <a href=\"https://"
"extensions.gnome.org\">extensions.gnome.org</a>."
#: js/extensionPrefs/main.js:492
msgid "Browse in Software"
msgstr "Navegar no Software"
#: js/extensionPrefs/main.js:532
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."
@@ -573,21 +476,24 @@ msgstr ""
"Sentimos muito, mas não foi possível obter a lista de extensões instaladas. "
"Certifique-se de estar em uma sessão do GNOME e tente novamente."
#: js/extensionPrefs/ui/extensions-window.ui:287
#| msgid "Log Out"
msgid "Log Out…"
msgstr "Encerrar sessão…"
#: 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 "Cancelar"
#: js/gdm/authPrompt.js:184 js/gdm/authPrompt.js:237 js/gdm/authPrompt.js:468
#: js/gdm/authPrompt.js:188 js/gdm/authPrompt.js:241 js/gdm/authPrompt.js:476
msgid "Next"
msgstr "Próximo"
#: js/gdm/authPrompt.js:233 js/ui/shellMountOperation.js:380
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:385
#: js/ui/unlockDialog.js:44
msgid "Unlock"
msgstr "Desbloquear"
#: js/gdm/authPrompt.js:235
#: js/gdm/authPrompt.js:239
msgctxt "button"
msgid "Sign In"
msgstr "Entrar"
@@ -610,8 +516,8 @@ msgstr "(ex.: usuário ou %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:234
#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:275
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297
msgid "Username: "
msgstr "Nome de usuário: "
@@ -689,78 +595,81 @@ msgstr "alternar usuário;trocar de usuário"
#. 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 "bloqueio de orientação;desbloqueio de orientação;tela;rotação"
#: js/misc/systemActions.js:251
#| msgid "Lock Screen Rotation"
msgctxt "search-result"
msgid "Unlock Screen Rotation"
msgstr "Desbloquear rotação de tela"
#: js/misc/systemActions.js:252
#| msgid "Lock Screen Rotation"
msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Bloquear rotação de tela"
#: js/misc/util.js:120
#: js/misc/util.js:116
msgid "Command not found"
msgstr "Comando não encontrado"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: js/misc/util.js:156
#: js/misc/util.js:152
msgid "Could not parse command:"
msgstr "Não foi possível analisar comando:"
#: js/misc/util.js:164
#: js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "A execução de “%s” falhou:"
#: js/misc/util.js:181
#: js/misc/util.js:177
msgid "Just now"
msgstr "Agora mesmo"
#: js/misc/util.js:183
#: js/misc/util.js:179
#, javascript-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minuto atrás"
msgstr[1] "%d minutos atrás"
#: js/misc/util.js:187
#: js/misc/util.js:183
#, javascript-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d hora atrás"
msgstr[1] "%d horas atrás"
#: js/misc/util.js:191
#: js/misc/util.js:187
msgid "Yesterday"
msgstr "Ontem"
#: js/misc/util.js:193
#: js/misc/util.js:189
#, javascript-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d dia atrás"
msgstr[1] "%d dias atrás"
#: js/misc/util.js:197
#: js/misc/util.js:193
#, javascript-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d semana atrás"
msgstr[1] "%d semanas atrás"
#: js/misc/util.js:201
#: js/misc/util.js:197
#, javascript-format
msgid "%d month ago"
msgid_plural "%d months ago"
msgstr[0] "%d mês atrás"
msgstr[1] "%d meses atrás"
#: js/misc/util.js:204
#: js/misc/util.js:200
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
@@ -768,20 +677,20 @@ msgstr[0] "%d ano atrás"
msgstr[1] "%d anos atrás"
#. Translators: Time in 24h format
#: js/misc/util.js:237
#: js/misc/util.js:233
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:243
#: js/misc/util.js:239
#, no-c-format
msgid "Yesterday, %H%M"
msgstr "Ontem, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30"
#: js/misc/util.js:249
#: js/misc/util.js:245
#, no-c-format
msgid "%A, %H%M"
msgstr "%A, %H%M"
@@ -789,7 +698,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:255
#: js/misc/util.js:251
#, no-c-format
msgid "%B %-d, %H%M"
msgstr "%-d de %B, %H%M"
@@ -797,7 +706,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:261
#: js/misc/util.js:257
#, no-c-format
msgid "%B %-d %Y, %H%M"
msgstr "%-d de %B de %Y, %H%M"
@@ -805,20 +714,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:266
#: js/misc/util.js:262
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:272
#: js/misc/util.js:268
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Ontem, %l%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm"
#: js/misc/util.js:278
#: js/misc/util.js:274
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@@ -826,7 +735,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:284
#: js/misc/util.js:280
#, no-c-format
msgid "%B %-d, %l%M %p"
msgstr "%-d de %B, %l%M %p"
@@ -834,17 +743,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:290
#: js/misc/util.js:286
#, 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:42
#: js/portalHelper/main.js:40
msgid "Hotspot Login"
msgstr "Autenticação de ponto de acesso"
#: js/portalHelper/main.js:88
#: js/portalHelper/main.js:86
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."
@@ -863,44 +772,44 @@ msgstr "Negar acesso"
msgid "Grant Access"
msgstr "Conceder acesso"
#: js/ui/appDisplay.js:906
#: js/ui/appDisplay.js:904
msgid "Unnamed Folder"
msgstr "Pasta sem nome"
#: js/ui/appDisplay.js:929
#: js/ui/appDisplay.js:927
msgid "Frequently used applications will appear here"
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
#: js/ui/appDisplay.js:1064
#: js/ui/appDisplay.js:1062
msgid "Frequent"
msgstr "Frequente"
#: js/ui/appDisplay.js:1071
#: js/ui/appDisplay.js:1069
msgid "All"
msgstr "Todos"
#. Translators: This is the heading of a list of open windows
#: js/ui/appDisplay.js:2454 js/ui/panel.js:75
#: js/ui/appDisplay.js:2452 js/ui/panel.js:75
msgid "Open Windows"
msgstr "Janelas abertas"
#: js/ui/appDisplay.js:2474 js/ui/panel.js:82
#: js/ui/appDisplay.js:2472 js/ui/panel.js:82
msgid "New Window"
msgstr "Nova janela"
#: js/ui/appDisplay.js:2485
#: js/ui/appDisplay.js:2483
msgid "Launch using Dedicated Graphics Card"
msgstr "Inicia usando placa de vídeo dedicada"
#: js/ui/appDisplay.js:2513 js/ui/dash.js:239
#: js/ui/appDisplay.js:2511 js/ui/dash.js:239
msgid "Remove from Favorites"
msgstr "Remover dos favoritos"
#: js/ui/appDisplay.js:2519
#: js/ui/appDisplay.js:2517
msgid "Add to Favorites"
msgstr "Adicionar aos favoritos"
#: js/ui/appDisplay.js:2529 js/ui/panel.js:93
#: js/ui/appDisplay.js:2527 js/ui/panel.js:93
msgid "Show Details"
msgstr "Mostrar detalhes"
@@ -1118,48 +1027,55 @@ msgstr "A versão do udisks instalado não possui suporte à configuração do P
msgid "Open with %s"
msgstr "Abrir com %s"
#: js/ui/components/networkAgent.js:89
#: js/ui/components/keyring.js:70 js/ui/components/polkitAgent.js:278
msgid "Password:"
msgstr "Senha:"
#: js/ui/components/keyring.js:104
msgid "Type again:"
msgstr "Digite novamente:"
#: js/ui/components/networkAgent.js:115
msgid ""
"Alternatively you can connect by pushing the “WPS” button on your router."
msgstr ""
"Alternativamente, você pode conectar pressionando o botão “WPS” em seu "
"roteador."
#: js/ui/components/networkAgent.js:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:123 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: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
#: 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
msgid "Password: "
msgstr "Senha: "
#. static WEP
#: js/ui/components/networkAgent.js:207
#: js/ui/components/networkAgent.js:229
msgid "Key: "
msgstr "Chave: "
#: js/ui/components/networkAgent.js:242 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287
msgid "Private key password: "
msgstr "Senha da chave privada: "
#: js/ui/components/networkAgent.js:263
#: js/ui/components/networkAgent.js:285
msgid "Identity: "
msgstr "Identidade: "
#: js/ui/components/networkAgent.js:277
#: js/ui/components/networkAgent.js:299
msgid "Service: "
msgstr "Serviço: "
#: 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 "Autenticação necessária"
#: js/ui/components/networkAgent.js:328 js/ui/components/networkAgent.js:703
msgid "Authentication required by wireless network"
msgstr "Autenticação requisitada pela rede sem fio"
#: js/ui/components/networkAgent.js:307 js/ui/components/networkAgent.js:682
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -1168,54 +1084,58 @@ msgstr ""
"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio "
"“%s”."
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708
msgid "Wired 802.1X authentication"
msgstr "Autenticação 802.1X cabeada"
#: js/ui/components/networkAgent.js:313
#: js/ui/components/networkAgent.js:335
msgid "Network name: "
msgstr "Nome da rede: "
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712
msgid "DSL authentication"
msgstr "Autenticação DSL"
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:695
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717
msgid "PIN code required"
msgstr "Código PIN requisitado"
#: js/ui/components/networkAgent.js:326 js/ui/components/networkAgent.js:696
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
msgid "PIN code is needed for the mobile broadband device"
msgstr "O código PIN é necessário para o dispositivo móvel de banda larga"
#: js/ui/components/networkAgent.js:327
#: js/ui/components/networkAgent.js:349
msgid "PIN: "
msgstr "PIN: "
#: 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
#: js/ui/components/networkAgent.js:356 js/ui/components/networkAgent.js:724
msgid "Mobile broadband network password"
msgstr "Senha da rede de banda larga móvel"
#: 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
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Uma senha é necessária para se conectar a “%s”."
#: js/ui/components/networkAgent.js:670 js/ui/status/network.js:1688
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688
msgid "Network Manager"
msgstr "Gerenciador de rede"
#: js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:728
msgid "VPN password"
msgstr "Senha de VPN"
#: js/ui/components/polkitAgent.js:39
#: js/ui/components/polkitAgent.js:41
msgid "Authentication Required"
msgstr "Autenticação necessária"
#: js/ui/components/polkitAgent.js:80
#: js/ui/components/polkitAgent.js:81
msgid "Administrator"
msgstr "Administrador"
#: js/ui/components/polkitAgent.js:142
#: js/ui/components/polkitAgent.js:141
msgid "Authenticate"
msgstr "Autenticação"
@@ -1223,15 +1143,10 @@ msgstr "Autenticação"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: js/ui/components/polkitAgent.js:254 js/ui/shellMountOperation.js:402
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:365
msgid "Sorry, that didnt work. Please try again."
msgstr "Desculpe, isto não funcionou. Por favor, tente novamente."
#: js/ui/components/polkitAgent.js:277 js/ui/shellMountOperation.js:326
#| msgid "Remember Password"
msgid "Enter Password…"
msgstr "Lembrar senha…"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#: js/ui/components/telepathyClient.js:787
@@ -1447,39 +1362,34 @@ msgstr "%s (remoto)"
msgid "%s (console)"
msgstr "%s (console)"
#: js/ui/extensionDownloader.js:170
#: js/ui/extensionDownloader.js:194
msgid "Install"
msgstr "Instalar"
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:200
#| msgid "Uninstall extension"
msgid "Install Extension"
msgstr "Instalar extensão"
#: js/ui/extensionDownloader.js:177
#: js/ui/extensionDownloader.js:201
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Baixar e instalar “%s” de extensions.gnome.org?"
#: js/ui/extensionSystem.js:228
#| msgid "No Extensions Installed"
msgid "Extension Updates Available"
msgstr "Atualizações de extensões disponíveis"
#: js/ui/extensionSystem.js:229
msgid "Extension updates are ready to be installed."
msgstr "Atualizações de extensões estão prontas para serem instaladas."
#: js/ui/inhibitShortcutsDialog.js:79
#| msgid "%s wants to inhibit shortcuts"
msgid "Allow inhibiting shortcuts"
msgstr "Permitir inibir atalhos"
#. Translators: %s is an application name like "Settings"
#: js/ui/inhibitShortcutsDialog.js:82
#, javascript-format
#| msgid "Application wants to inhibit shortcuts"
msgid "The application %s wants to inhibit shortcuts"
msgstr "O aplicativo %s deseja inibir atalhos"
#: js/ui/inhibitShortcutsDialog.js:83
#| msgid "Application wants to inhibit shortcuts"
msgid "An application wants to inhibit shortcuts"
msgstr "Um aplicativo deseja inibir atalhos"
@@ -1728,10 +1638,12 @@ msgid "Top Bar"
msgstr "Barra superior"
#: js/ui/runDialog.js:58
#| msgid "Enter a Command"
msgid "Run a Command"
msgstr "Executar um comando"
#: js/ui/runDialog.js:73
#| msgid "Press Esc to exit"
msgid "Press ESC to close"
msgstr "Pressione Esc para fechar"
@@ -1763,7 +1675,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d nova notificação"
msgstr[1] "%d novas notificações"
#: js/ui/screenShield.js:454 js/ui/status/system.js:103
#: js/ui/screenShield.js:454 js/ui/status/system.js:98
msgid "Lock"
msgstr "Bloquear"
@@ -1821,20 +1733,20 @@ msgstr "Ocultar texto"
msgid "Caps lock is on."
msgstr "Caps lock está ligado."
#: js/ui/shellMountOperation.js:285
#: js/ui/shellMountOperation.js:287
msgid "Hidden Volume"
msgstr "Volume oculto"
#: js/ui/shellMountOperation.js:288
#: js/ui/shellMountOperation.js:290
msgid "Windows System Volume"
msgstr "Volume de sistema Windows"
#: js/ui/shellMountOperation.js:291
#: js/ui/shellMountOperation.js:293
msgid "Uses Keyfiles"
msgstr "Usa arquivos de chave"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:298
#: js/ui/shellMountOperation.js:299
#, javascript-format
msgid ""
"To unlock a volume that uses keyfiles, use the <i>%s</i> utility instead."
@@ -1843,32 +1755,35 @@ msgstr ""
"%s</i>."
#: js/ui/shellMountOperation.js:306
#| msgid "PIM Number"
msgid "Enter PIM Number…"
msgstr "Insira um número PIM…"
msgid "PIM Number"
msgstr "Número PIM"
#: js/ui/shellMountOperation.js:365
#: js/ui/shellMountOperation.js:325
msgid "The PIM must be a number or empty."
msgstr "O PIM deve ser um número ou vazio."
#: js/ui/shellMountOperation.js:336
msgid "Password"
msgstr "Senha"
#: js/ui/shellMountOperation.js:372
msgid "Remember Password"
msgstr "Lembrar senha"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:391
#: js/ui/shellMountOperation.js:396
#, javascript-format
msgid "Open %s"
msgstr "Abrir o %s"
#: js/ui/shellMountOperation.js:423
msgid "The PIM must be a number or empty."
msgstr "O PIM deve ser um número ou vazio."
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:469
#: js/ui/shellMountOperation.js:468
#, javascript-format
msgid "Unable to start %s"
msgstr "Não foi possível iniciar o %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:470
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Não foi possível localizar o aplicativo %s"
@@ -2004,6 +1919,7 @@ msgstr "Permitir acesso a localização"
#. Translators: %s is an application name
#: js/ui/status/location.js:357
#, javascript-format
#| msgid "Give %s access to your location?"
msgid "The app %s wants to access your location"
msgstr "O aplicativo %s deseja acesso a sua localização"
@@ -2285,23 +2201,23 @@ msgstr "Desativar"
msgid "Airplane Mode On"
msgstr "Modo avião ligado"
#: js/ui/status/system.js:116
#: js/ui/status/system.js:111
msgid "Power Off / Log Out"
msgstr "Desligar / encerrar sessão"
#: js/ui/status/system.js:119
#: js/ui/status/system.js:114
msgid "Log Out"
msgstr "Encerrar sessão"
#: js/ui/status/system.js:131
#: js/ui/status/system.js:126
msgid "Switch User…"
msgstr "Alternar usuário…"
#: js/ui/status/system.js:145
#: js/ui/status/system.js:140
msgid "Suspend"
msgstr "Suspender"
#: js/ui/status/system.js:157
#: js/ui/status/system.js:152
msgid "Power Off…"
msgstr "Desligar…"
@@ -2400,24 +2316,22 @@ msgstr "“%s” está pronto"
# Título de janela de confirmação; Se grande demais, pode ser exibida com "..."
# Vide: https://bugzilla.gnome.org/show_bug.cgi?id=786331
#. 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 "Manter essas configurações da tela?"
#: js/ui/windowManager.js:54
msgid "Do you want to keep these display settings?"
msgstr "Deseja manter essas configurações da tela?"
#. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:64
#: js/ui/windowManager.js:68
msgid "Revert Settings"
msgstr "Reverter configurações"
#: js/ui/windowManager.js:67
#: js/ui/windowManager.js:71
msgid "Keep Changes"
msgstr "Manter alterações"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:89
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -2426,7 +2340,7 @@ msgstr[1] "Alterações nas configurações serão revertidas em %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:542
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@@ -2571,6 +2485,11 @@ msgstr ""
"Descrição é uma explicação uma só frase do que sua extensão faz.\n"
"Exemplos são: %s"
#: subprojects/extensions-tool/src/command-create.c:211
#: subprojects/extensions-tool/src/main.c:173
msgid "Description"
msgstr "Descrição"
#: subprojects/extensions-tool/src/command-create.c:222
msgid ""
"UUID is a globally-unique identifier for your extension.\n"
@@ -2773,6 +2692,10 @@ msgstr "URL"
msgid "Original author"
msgstr "Autor original"
#: subprojects/extensions-tool/src/main.c:185
msgid "Version"
msgstr "Versão"
#: subprojects/extensions-tool/src/main.c:188
msgid "State"
msgstr "Estado"
@@ -2875,24 +2798,6 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#~ msgid "Browse in Software"
#~ msgstr "Navegar no Software"
#~ msgid "Password:"
#~ msgstr "Senha:"
#~ msgid "Type again:"
#~ msgstr "Digite novamente:"
#~ msgid "Authentication required by wireless network"
#~ msgstr "Autenticação requisitada pela rede sem fio"
#~ msgid "Mobile broadband network password"
#~ msgstr "Senha da rede de banda larga móvel"
#~ msgid "Password"
#~ msgstr "Senha"
#~ msgctxt "search-result"
#~ msgid "Lock Orientation"
#~ msgstr "Bloquear orientação"
@@ -3008,6 +2913,9 @@ msgstr "Sons do sistema"
#~ msgstr[0] "%d dispositivo conectado"
#~ msgstr[1] "%d dispositivos conectados"
#~ msgid "Authentication required"
#~ msgstr "Autenticação necessária"
# UPS significa uninterruptible power supply, mas no Brasil vejo usando mais
# "No-break", que é a mesma coisa, então optei pela segunda. -- Rafael Fontenelle
#~ msgid "UPS"

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-02-03 20:34+0000\n"
"PO-Revision-Date: 2020-02-04 10:59+0100\n"
"POT-Creation-Date: 2020-01-28 15:54+0000\n"
"PO-Revision-Date: 2020-01-29 14:12+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
@@ -51,17 +51,12 @@ msgstr "Zobraziť všetky aplikácie"
msgid "Open the application menu"
msgstr "Otvoriť ponuku aplikácií"
#: 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:4
#: js/extensionPrefs/main.js:209
msgid "Shell Extensions"
msgstr "Rozšírenia pre Shell"
#: 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
#: data/gnome-shell-extension-prefs.desktop.in.in:5
msgid "Configure GNOME Shell Extensions"
msgstr "Nastavenie rozšírení pre Shell prostredia GNOME"
@@ -382,7 +377,7 @@ msgstr "Zobrazené umiestnenia v svetových časoch"
#: data/org.gnome.shell.gschema.xml.in:245
msgid "Automatic location"
msgstr "Automatické umiestnenie"
msgstr "Automatická poloha"
#: data/org.gnome.shell.gschema.xml.in:246
msgid "Whether to fetch the current location or not"
@@ -394,7 +389,7 @@ msgstr "Umiestnenie"
#: data/org.gnome.shell.gschema.xml.in:254
msgid "The location for which to show a forecast"
msgstr "Umiestnenie, pre ktoré zobraz predpoveď"
msgstr "Poloha pre zobrazenie predpovede"
#: data/org.gnome.shell.gschema.xml.in:266
msgid "Attach modal dialog to the parent window"
@@ -433,44 +428,11 @@ msgstr ""
msgid "Network Login"
msgstr "Sieťové prihlásenie"
#: 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
#: js/extensionPrefs/main.js:102 js/extensionPrefs/main.js:525
msgid "Somethings gone wrong"
msgstr "Niečo sa pokazilo"
#: js/extensionPrefs/main.js:268
#: js/extensionPrefs/main.js:109
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 "
@@ -479,78 +441,39 @@ 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:275
#: js/extensionPrefs/main.js:116
msgid "Technical Details"
msgstr "Technické podrobnosti"
#: js/extensionPrefs/main.js:310
#: js/extensionPrefs/main.js:151
msgid "Copy Error"
msgstr "Skopírovať chybu"
#: js/extensionPrefs/main.js:337
#: js/extensionPrefs/main.js:178
msgid "Homepage"
msgstr "Domovská stránka"
#: js/extensionPrefs/main.js:338
#: js/extensionPrefs/main.js:179
msgid "Visit extension homepage"
msgstr "Navštíviť domovskú stránku rozšírenia"
#: 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"
#: js/extensionPrefs/main.js:467
msgid "No Extensions Installed"
msgstr "Žiadne nainštalované rozšírenia"
#: js/extensionPrefs/ui/extensions-window.ui:234
#: 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
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."
@@ -559,20 +482,24 @@ msgstr ""
"rozšírení. Uistite sa, že ste prihlásený do prostredia GNOME a skúste to "
"znovu."
#: js/extensionPrefs/ui/extensions-window.ui:287
msgid "Logout…"
msgstr "Odhlásiť sa…"
#: 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/gdm/authPrompt.js:184 js/gdm/authPrompt.js:237 js/gdm/authPrompt.js:468
#: js/gdm/authPrompt.js:188 js/gdm/authPrompt.js:241 js/gdm/authPrompt.js:476
msgid "Next"
msgstr "Ďalej"
#: js/gdm/authPrompt.js:233 js/ui/shellMountOperation.js:380
#: js/gdm/authPrompt.js:237 js/ui/shellMountOperation.js:385
#: js/ui/unlockDialog.js:44
msgid "Unlock"
msgstr "Odomknúť"
#: js/gdm/authPrompt.js:235
#: js/gdm/authPrompt.js:239
msgctxt "button"
msgid "Sign In"
msgstr "Prihlásiť sa"
@@ -597,8 +524,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:234
#: js/ui/components/networkAgent.js:257 js/ui/components/networkAgent.js:275
#: js/gdm/loginDialog.js:899 js/ui/components/networkAgent.js:256
#: js/ui/components/networkAgent.js:279 js/ui/components/networkAgent.js:297
msgid "Username: "
msgstr "Používateľské meno: "
@@ -692,26 +619,26 @@ msgctxt "search-result"
msgid "Lock Screen Rotation"
msgstr "Uzamknúť otočenie obrazovky"
#: js/misc/util.js:120
#: js/misc/util.js:116
msgid "Command not found"
msgstr "Príkaz nebol nájdený"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: js/misc/util.js:156
#: js/misc/util.js:152
msgid "Could not parse command:"
msgstr "Nepodarilo sa analyzovať príkaz:"
#: js/misc/util.js:164
#: js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Spustenie „%s“ zlyhalo:"
#: js/misc/util.js:181
#: js/misc/util.js:177
msgid "Just now"
msgstr "Práve teraz"
#: js/misc/util.js:183
#: js/misc/util.js:179
#, javascript-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@@ -719,7 +646,7 @@ msgstr[0] "Pred %d minútou"
msgstr[1] "Pred %d minútami"
msgstr[2] "Pred %d minútami"
#: js/misc/util.js:187
#: js/misc/util.js:183
#, javascript-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@@ -727,11 +654,11 @@ msgstr[0] "Pred %d hodinou"
msgstr[1] "Pred %d hodinami"
msgstr[2] "Pred %d hodinami"
#: js/misc/util.js:191
#: js/misc/util.js:187
msgid "Yesterday"
msgstr "Včera"
#: js/misc/util.js:193
#: js/misc/util.js:189
#, javascript-format
msgid "%d day ago"
msgid_plural "%d days ago"
@@ -739,7 +666,7 @@ msgstr[0] "Pred %d dňom"
msgstr[1] "Pred %d dňami"
msgstr[2] "Pred %d dňami"
#: js/misc/util.js:197
#: js/misc/util.js:193
#, javascript-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@@ -747,7 +674,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:201
#: js/misc/util.js:197
#, javascript-format
msgid "%d month ago"
msgid_plural "%d months ago"
@@ -755,7 +682,7 @@ msgstr[0] "Pred %d mesiacom"
msgstr[1] "Pred %d mesiacmi"
msgstr[2] "Pred %d mesiacmi"
#: js/misc/util.js:204
#: js/misc/util.js:200
#, javascript-format
msgid "%d year ago"
msgid_plural "%d years ago"
@@ -764,20 +691,20 @@ msgstr[1] "Pred %d rokmi"
msgstr[2] "Pred %d rokmi"
#. Translators: Time in 24h format
#: js/misc/util.js:237
#: js/misc/util.js:233
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:243
#: js/misc/util.js:239
#, 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:249
#: js/misc/util.js:245
#, no-c-format
msgid "%A, %H%M"
msgstr "%A, %H:%M"
@@ -785,7 +712,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:255
#: js/misc/util.js:251
#, no-c-format
msgid "%B %-d, %H%M"
msgstr "%d. %B, %H:%M"
@@ -793,7 +720,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:261
#: js/misc/util.js:257
#, no-c-format
msgid "%B %-d %Y, %H%M"
msgstr "%d. %B %Y, %H:%M"
@@ -801,13 +728,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:266
#: js/misc/util.js:262
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:272
#: js/misc/util.js:268
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Včera, %l:%M %p"
@@ -817,7 +744,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:278
#: js/misc/util.js:274
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l:%M %p"
@@ -825,7 +752,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:284
#: js/misc/util.js:280
#, no-c-format
msgid "%B %-d, %l%M %p"
msgstr "%d. %B, %l:%M %p"
@@ -833,17 +760,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:290
#: js/misc/util.js:286
#, 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:42
#: js/portalHelper/main.js:40
msgid "Hotspot Login"
msgstr "Prihlásenie do aktívneho bodu"
#: js/portalHelper/main.js:88
#: js/portalHelper/main.js:86
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."
@@ -1121,47 +1048,54 @@ msgstr "Nainštalovaná verzia programu udisks nepodporuje nastavenie PIM"
msgid "Open with %s"
msgstr "Otvoriť pomocou aplikácie %s"
#: js/ui/components/networkAgent.js:89
#: 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
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:101 js/ui/status/network.js:223
#: js/ui/components/networkAgent.js:123 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: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
#: 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
msgid "Password: "
msgstr "Heslo: "
#. static WEP
#: js/ui/components/networkAgent.js:207
#: js/ui/components/networkAgent.js:229
msgid "Key: "
msgstr "Kľúč: "
#: js/ui/components/networkAgent.js:242 js/ui/components/networkAgent.js:265
#: js/ui/components/networkAgent.js:264 js/ui/components/networkAgent.js:287
msgid "Private key password: "
msgstr "Heslo k súkromnému kľúču: "
#: js/ui/components/networkAgent.js:263
#: js/ui/components/networkAgent.js:285
msgid "Identity: "
msgstr "Identita: "
#: js/ui/components/networkAgent.js:277
#: js/ui/components/networkAgent.js:299
msgid "Service: "
msgstr "Služba: "
#: 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: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:307 js/ui/components/networkAgent.js:682
#: js/ui/components/networkAgent.js:329 js/ui/components/networkAgent.js:704
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -1170,55 +1104,59 @@ msgstr ""
"Na prístup do bezdrôtovej siete „%s“ sú vyžadované heslá alebo šifrovacie "
"kľúče."
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:686
#: js/ui/components/networkAgent.js:333 js/ui/components/networkAgent.js:708
msgid "Wired 802.1X authentication"
msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
#: js/ui/components/networkAgent.js:313
#: js/ui/components/networkAgent.js:335
msgid "Network name: "
msgstr "Názov siete: "
#: js/ui/components/networkAgent.js:318 js/ui/components/networkAgent.js:690
#: js/ui/components/networkAgent.js:340 js/ui/components/networkAgent.js:712
msgid "DSL authentication"
msgstr "Overenie totožnosti k DSL"
#: js/ui/components/networkAgent.js:325 js/ui/components/networkAgent.js:695
#: js/ui/components/networkAgent.js:347 js/ui/components/networkAgent.js:717
msgid "PIN code required"
msgstr "Požaduje sa kód PIN"
#: js/ui/components/networkAgent.js:326 js/ui/components/networkAgent.js:696
#: js/ui/components/networkAgent.js:348 js/ui/components/networkAgent.js:718
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:327
#: js/ui/components/networkAgent.js:349
msgid "PIN: "
msgstr "PIN: "
#: 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
#: 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
#, 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:670 js/ui/status/network.js:1688
#: js/ui/components/networkAgent.js:692 js/ui/status/network.js:1688
msgid "Network Manager"
msgstr "Správca siete"
#: js/ui/components/networkAgent.js:706
#: js/ui/components/networkAgent.js:728
msgid "VPN password"
msgstr "Heslo siete VPN"
#: js/ui/components/polkitAgent.js:39
#: js/ui/components/polkitAgent.js:41
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:80
#: js/ui/components/polkitAgent.js:81
msgid "Administrator"
msgstr "Správca"
#: js/ui/components/polkitAgent.js:142
#: js/ui/components/polkitAgent.js:141
msgid "Authenticate"
msgstr "Overiť totožnosť"
@@ -1226,14 +1164,10 @@ 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:254 js/ui/shellMountOperation.js:402
#: js/ui/components/polkitAgent.js:259 js/ui/shellMountOperation.js:365
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
@@ -1455,28 +1389,20 @@ msgstr "%s (vzdialená relácia)"
msgid "%s (console)"
msgstr "%s (konzola)"
#: js/ui/extensionDownloader.js:170
#: js/ui/extensionDownloader.js:194
msgid "Install"
msgstr "Inštalovať"
# dialog title
#: js/ui/extensionDownloader.js:176
#: js/ui/extensionDownloader.js:200
msgid "Install Extension"
msgstr "Inštalácia rozšírenia"
#: js/ui/extensionDownloader.js:177
#: js/ui/extensionDownloader.js:201
#, 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"
@@ -1842,52 +1768,56 @@ msgstr "Skryť text"
msgid "Caps lock is on."
msgstr "Je zapnutá funkcia Caps Lock."
#: js/ui/shellMountOperation.js:285
#: js/ui/shellMountOperation.js:287
msgid "Hidden Volume"
msgstr "Skrytý zväzok"
#: js/ui/shellMountOperation.js:288
#: js/ui/shellMountOperation.js:290
msgid "Windows System Volume"
msgstr "Zväzok so systémom Windows"
#: js/ui/shellMountOperation.js:291
#: js/ui/shellMountOperation.js:293
msgid "Uses Keyfiles"
msgstr "Využíva kľúčové súbory"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:298
#: js/ui/shellMountOperation.js:299
#, 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 "Enter PIM Number"
msgstr "Zadajte číslo PIM"
msgid "PIM Number"
msgstr "Číslo PIM"
#: js/ui/shellMountOperation.js:365
#: 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
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:391
#: js/ui/shellMountOperation.js:396
#, 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:469
#: js/ui/shellMountOperation.js:468
#, javascript-format
msgid "Unable to start %s"
msgstr "Nepodarilo sa spustiť %s"
#. Translators: %s is the Disks application
#: js/ui/shellMountOperation.js:471
#: js/ui/shellMountOperation.js:470
#, javascript-format
msgid "Couldnt find the %s application"
msgstr "Nepodarilo sa nájsť aplikáciu %s"
@@ -2001,7 +1931,7 @@ msgstr "Zobraziť rozloženie klávesnice"
#: js/ui/status/location.js:65 js/ui/status/location.js:174
msgid "Location Enabled"
msgstr "Umiestnenie je povolené"
msgstr "Poloha povolená"
#: js/ui/status/location.js:66 js/ui/status/location.js:175
msgid "Disable"
@@ -2013,11 +1943,11 @@ msgstr "Nastavenia súkromia"
#: js/ui/status/location.js:173
msgid "Location In Use"
msgstr "Používa sa umiestnenie"
msgstr "Poloha sa používa"
#: js/ui/status/location.js:177
msgid "Location Disabled"
msgstr "Umiestnenie je zakázané"
msgstr "Poloha zakázaná"
#: js/ui/status/location.js:178
msgid "Enable"
@@ -2250,11 +2180,11 @@ msgstr "Aktivácia pripojenia k sieti zlyhala"
#: js/ui/status/nightLight.js:63
msgid "Night Light Disabled"
msgstr "Nočné osvetlenie zakázané"
msgstr "Nočné svetlo zakázané"
#: js/ui/status/nightLight.js:64
msgid "Night Light On"
msgstr "Nočné osvetlenie zapnuté"
msgstr "Nočné svetlo zapnuté"
#: js/ui/status/nightLight.js:66
msgid "Resume"
@@ -2286,13 +2216,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
@@ -2428,23 +2358,22 @@ msgstr "Hľadať"
msgid "“%s” is ready"
msgstr "Aplikácia „%s“ je pripravená"
#. Translators: This string should be shorter than 30 characters
#: js/ui/windowManager.js:55
msgid "Keep these display settings?"
msgstr "Ponechať nastavenia displeja?"
#: js/ui/windowManager.js:54
msgid "Do you want to keep these display settings?"
msgstr "Chcete ponechať tieto nastavenia displeja?"
#. Translators: this and the following message should be limited in length,
#. to avoid ellipsizing the labels.
#.
#: js/ui/windowManager.js:64
#: js/ui/windowManager.js:68
msgid "Revert Settings"
msgstr "Vrátiť nastavenia"
#: js/ui/windowManager.js:67
#: js/ui/windowManager.js:71
msgid "Keep Changes"
msgstr "Uchovať zmeny"
#: js/ui/windowManager.js:85
#: js/ui/windowManager.js:89
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -2454,7 +2383,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:542
#: js/ui/windowManager.js:546
#, javascript-format
msgid "%d × %d"
msgstr "%d × %d"
@@ -2924,24 +2853,6 @@ 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"
@@ -3059,6 +2970,9 @@ 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"
@@ -3257,6 +3171,9 @@ msgstr "Systémové zvuky"
#~ msgid "Open"
#~ msgstr "Otvoriť"
#~ msgid "Remove"
#~ msgstr "Odstrániť"
#~ msgid "Clear Messages"
#~ msgstr "Vymazať správy"

1639
po/sv.po

File diff suppressed because it is too large Load Diff

1618
po/tr.po

File diff suppressed because it is too large Load Diff

View File

@@ -1443,9 +1443,8 @@ st_texture_cache_load_file_sync_to_cogl_texture (StTextureCache *cache,
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
{
double resource_scale_double = resource_scale;
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), image);
g_hash_table_insert (cache->priv->used_scales, &resource_scale_double, &resource_scale_double);
g_hash_table_insert (cache->priv->used_scales, &resource_scale, &resource_scale);
}
}
@@ -1492,11 +1491,10 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache *cache,
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
{
double resource_scale_double = resource_scale;
cairo_surface_reference (surface);
g_hash_table_insert (cache->priv->keyed_surface_cache,
g_strdup (key), surface);
g_hash_table_insert (cache->priv->used_scales, &resource_scale_double, &resource_scale_double);
g_hash_table_insert (cache->priv->used_scales, &resource_scale, &resource_scale);
}
}
else

View File

@@ -1707,13 +1707,7 @@ do_size_property (StThemeNode *node,
CRDeclaration *decl,
int *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);
get_length_from_term_int (node, decl->value, FALSE, node_value);
}
void

View File

@@ -96,9 +96,6 @@ Displays a list of installed extensions.
*--prefs*;;
Only include extensions with preferences
*--updates*;;
Only include extensions with pending updates
*-d*;;
*--details*;;
Show some extra information for each extension

View File

@@ -32,8 +32,7 @@ typedef enum {
LIST_FLAGS_SYSTEM = 1 << 1,
LIST_FLAGS_ENABLED = 1 << 2,
LIST_FLAGS_DISABLED = 1 << 3,
LIST_FLAGS_NO_PREFS = 1 << 4,
LIST_FLAGS_NO_UPDATES = 1 << 5,
LIST_FLAGS_NO_PREFS = 1 << 4
} ListFilterFlags;
static gboolean
@@ -70,13 +69,11 @@ list_extensions (ListFilterFlags filter, DisplayFormat format)
g_autoptr (GVariantDict) info = NULL;
double type, state;
gboolean has_prefs;
gboolean has_update;
info = g_variant_dict_new (value);
g_variant_dict_lookup (info, "type", "d", &type);
g_variant_dict_lookup (info, "state", "d", &state);
g_variant_dict_lookup (info, "hasPrefs", "b", &has_prefs);
g_variant_dict_lookup (info, "hasUpdate", "b", &has_update);
if (type == TYPE_USER && (filter & LIST_FLAGS_USER) == 0)
continue;
@@ -93,9 +90,6 @@ list_extensions (ListFilterFlags filter, DisplayFormat format)
if (!has_prefs && (filter & LIST_FLAGS_NO_PREFS) == 0)
continue;
if (!has_update && (filter & LIST_FLAGS_NO_UPDATES) == 0)
continue;
if (needs_newline)
g_print ("\n");
@@ -118,7 +112,6 @@ handle_list (int argc, char *argv[], gboolean do_help)
gboolean enabled = FALSE;
gboolean disabled = FALSE;
gboolean has_prefs = FALSE;
gboolean has_updates = FALSE;
GOptionEntry entries[] = {
{ .long_name = "user",
.arg = G_OPTION_ARG_NONE, .arg_data = &user,
@@ -135,9 +128,6 @@ handle_list (int argc, char *argv[], gboolean do_help)
{ .long_name = "prefs",
.arg = G_OPTION_ARG_NONE, .arg_data = &has_prefs,
.description = _("Show extensions with preferences") },
{ .long_name = "updates",
.arg = G_OPTION_ARG_NONE, .arg_data = &has_updates,
.description = _("Show extensions with updates") },
{ .long_name = "details", .short_name = 'd',
.arg = G_OPTION_ARG_NONE, .arg_data = &details,
.description = _("Print extension details") },
@@ -184,9 +174,6 @@ handle_list (int argc, char *argv[], gboolean do_help)
if (!has_prefs)
flags |= LIST_FLAGS_NO_PREFS;
if (!has_updates)
flags |= LIST_FLAGS_NO_UPDATES;
return list_extensions (flags, details ? DISPLAY_DETAILED
: DISPLAY_ONELINE) ? 0 : 2;
}