Compare commits
126 Commits
Author | SHA1 | Date | |
---|---|---|---|
2dbe511519 | |||
e031a5d28b | |||
f9b32474b0 | |||
53d268a7ef | |||
70da558802 | |||
11215374ff | |||
cb45a38838 | |||
bb4d430ebf | |||
c17f84ca23 | |||
0ae1f9ffc7 | |||
d15bcd9845 | |||
f79a11d993 | |||
9391d9d11b | |||
aee90a3116 | |||
ffac5279a7 | |||
318283fc70 | |||
3582ba0c77 | |||
985d0c786c | |||
9c8c282e08 | |||
93dc7a51c0 | |||
393577ee78 | |||
eef593a34e | |||
3790e924e9 | |||
2f165aade8 | |||
2c502aec45 | |||
6bbf246752 | |||
0b3e8e29cf | |||
d509ab7779 | |||
502a9aefdc | |||
ccba18aa8f | |||
586ebcd5be | |||
317b9a9c87 | |||
67f10ea7eb | |||
793edd3a2b | |||
5dabaf2fe9 | |||
1d9b25f771 | |||
74cd20116a | |||
867695eb4f | |||
9e3592ebf3 | |||
f8ec14d625 | |||
1f21e50663 | |||
7403545a48 | |||
1d95b317ba | |||
f7568b69d4 | |||
8d7649eaec | |||
10b1c7e8a3 | |||
b1c936164c | |||
74ad6abfc2 | |||
9786b2d096 | |||
ea02380c15 | |||
048d5dc914 | |||
aa6b63373e | |||
0b219bf8cb | |||
109b29aeb5 | |||
bc069b99ec | |||
16fa186b63 | |||
e70c0d3e2d | |||
8d47afb195 | |||
a01469fb08 | |||
929636ebd0 | |||
681ef1efec | |||
4f14f122bd | |||
67e9ed5d60 | |||
5c25497e16 | |||
626cbea9cf | |||
aa7ed319e9 | |||
580bd67278 | |||
9e44978aed | |||
64b5ec0b11 | |||
48f9ea3d9e | |||
798a0ca240 | |||
5ee6cbd4c8 | |||
3b219a6a9a | |||
536ff6f561 | |||
013b6aa44a | |||
0e7d3a7558 | |||
8bd4895538 | |||
465c77ddcf | |||
6ef2d4a4cc | |||
7ae7f046c2 | |||
f4051e810e | |||
e6c239d0f3 | |||
35a7a3c1ac | |||
a0991c8261 | |||
9520880568 | |||
719d793e22 | |||
c7fb65c78e | |||
dd74ea99a7 | |||
c6fe6eb7ab | |||
2cbee05c8a | |||
308b1d6039 | |||
4cd832c05a | |||
2af4925d95 | |||
5e52f0e2a8 | |||
a46a68d616 | |||
203d7c4b43 | |||
24703ffa57 | |||
5cd913a527 | |||
91844e48e9 | |||
6c2f3d1d17 | |||
9c222c7e5c | |||
2249da7976 | |||
a55288bda0 | |||
e645edbda7 | |||
aee7cd73c4 | |||
380a71dd21 | |||
23dd5cc160 | |||
847cb5b972 | |||
cc64091f9c | |||
b68eb44ca5 | |||
403540e8a1 | |||
c39497222f | |||
9e56e668e0 | |||
41ae93dba0 | |||
6c527c1bb4 | |||
90c7876341 | |||
10b77a8305 | |||
1902f4773b | |||
4b95be6a95 | |||
61323926e0 | |||
e30d18febe | |||
9f2f80ae4f | |||
bd6e0ceb81 | |||
673d7038d8 | |||
3a6231dcc1 | |||
9d54e46ce7 |
59
NEWS
59
NEWS
@ -1,3 +1,62 @@
|
|||||||
|
3.9.4
|
||||||
|
=====
|
||||||
|
* Fix chat entries not being focused when expanded [Jasper; #698778]
|
||||||
|
* Fix alignment of "Not Listed?" label [Mathieu; #702307]
|
||||||
|
* Fix alignment of time stamps in chat notifications [Carlos; #687809]
|
||||||
|
* Round the ends of slider trough [Jasper; #702825]
|
||||||
|
* Add support for "box-shadow: none" [Cosimo; #702782]
|
||||||
|
* Keep chrome below popup windows [Florian; #702338]
|
||||||
|
* Move the session list to a popup menu [Ray; #702818]
|
||||||
|
* Fix autorun notifications for "non-native" volumes [Matthias; #703418]
|
||||||
|
* dnd: Speed up by not picking on each motion event [Jasper; #703443]
|
||||||
|
* Fix management of asynchronous background loading [Lionel; #703001]
|
||||||
|
* Rework focus handling [Jasper; #700735]
|
||||||
|
* Optimize box-shadow rendering [Lionel; #689858]
|
||||||
|
* Remove support for fixed positioning in BoxLayouts [Florian; #703808]
|
||||||
|
* Misc bug fixes and cleanups [Adel, Jasper, Florian, Ray, Lionel, Emilio;
|
||||||
|
#702849, #610279, #703132, #703105, #703160, #703126, #703304, #703403,
|
||||||
|
#698593, #703442, #703565, #700901, #703874, #703807, #703893, #703909]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Mathieu Bridon, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen,
|
||||||
|
Fran Diéguez, Adel Gadllah, Lionel Landwerlin, Florian Müllner,
|
||||||
|
Emilio Pozuelo Monfort, Carlos Soriano, Jasper St. Pierre, Ray Strode
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Baurzhan Muftakhidinov [kk], Marek Černocký [cs], Daniel Mustieles [es],
|
||||||
|
Fran Diéguez [gl], Kjartan Maraas [nb], Andika Triwidada [id],
|
||||||
|
Benjamin Steinwender [de], Nguyễn Thái Ngọc Duy [vi], Trần Ngọc Quân [vi]
|
||||||
|
|
||||||
|
3.9.3
|
||||||
|
=====
|
||||||
|
* Don't push window thumbs when workspace switcher is hidden [Jasper; #701167]
|
||||||
|
* Tweak timeout for activating windows during XDND [Adel; #700150]
|
||||||
|
* Fix ellipsization in control buttons in app picker [Carlos; #696307]
|
||||||
|
* Fix DND to empty dash [Florian; #684618]
|
||||||
|
* Fix OSD window appearing below system modal dialogs [Rui; #701269]
|
||||||
|
* Clear clipboard on screen lock to prevent information leak [Florian; #698922]
|
||||||
|
* Allow session mode specific overrides schema [Florian; #701717]
|
||||||
|
* window-switcher: Only show windows from current workspace by default
|
||||||
|
[Florian; #701214]
|
||||||
|
* logout dialog: Show the correct text right away [Matthias; #702056]
|
||||||
|
* bluetooth: Port to bluez 5 [Emilio; #700891]
|
||||||
|
* dateMenu: Allow events to span multiple lines [Giovanni; #701231]
|
||||||
|
* gdm: Clear message queue when no more messages are pending [Jonh; #702458]
|
||||||
|
* Misc bug fixes and cleanups [Jasper, Florian, Adel, Giovanni; #693836,
|
||||||
|
#700972, #701386, #700877, #701755, #698918, #701224, #702125, #701954,
|
||||||
|
#701849, #702121]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Matthias Clasen, Fran Diéguez, Adel Gadllah, Rui Matos,
|
||||||
|
Florian Müllner, Emilio Pozuelo Monfort, Carlos Soriano, Jasper St. Pierre,
|
||||||
|
Jonh Wendell
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Marek Černocký [cs], Victor Ibragimov [tg], Fran Diéguez [gl],
|
||||||
|
Benjamin Steinwender [de], Cheng-Chia Tseng [zh_HK, zh_TW],
|
||||||
|
eternalhui [zh_CN], Ivaylo Valkov [bg], Kjartan Maraas [nb],
|
||||||
|
Daniel Mustieles [es]
|
||||||
|
|
||||||
3.9.2
|
3.9.2
|
||||||
=====
|
=====
|
||||||
* Use a symbolic icon for DESKTOP windows [Matthias; #697914]
|
* Use a symbolic icon for DESKTOP windows [Matthias; #697914]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.9.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.9.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
|||||||
CLUTTER_MIN_VERSION=1.13.4
|
CLUTTER_MIN_VERSION=1.13.4
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||||
GJS_MIN_VERSION=1.35.4
|
GJS_MIN_VERSION=1.35.4
|
||||||
MUTTER_MIN_VERSION=3.9.2
|
MUTTER_MIN_VERSION=3.9.4
|
||||||
GTK_MIN_VERSION=3.7.9
|
GTK_MIN_VERSION=3.7.9
|
||||||
GIO_MIN_VERSION=2.37.0
|
GIO_MIN_VERSION=2.37.0
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
@ -71,7 +71,7 @@ LIBEDATASERVER_MIN_VERSION=3.5.3
|
|||||||
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
||||||
POLKIT_MIN_VERSION=0.100
|
POLKIT_MIN_VERSION=0.100
|
||||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||||
GCR_MIN_VERSION=3.3.90
|
GCR_MIN_VERSION=3.7.5
|
||||||
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
GNOME_DESKTOP_REQUIRED_VERSION=3.7.90
|
||||||
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
||||||
NETWORKMANAGER_MIN_VERSION=0.9.8
|
NETWORKMANAGER_MIN_VERSION=0.9.8
|
||||||
@ -109,7 +109,7 @@ PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4)
|
|||||||
PKG_CHECK_MODULES(CARIBOU, caribou-1.0 >= 0.4.8)
|
PKG_CHECK_MODULES(CARIBOU, caribou-1.0 >= 0.4.8)
|
||||||
|
|
||||||
AC_MSG_CHECKING([for bluetooth support])
|
AC_MSG_CHECKING([for bluetooth support])
|
||||||
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.9.0],
|
||||||
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0`
|
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0`
|
||||||
BLUETOOTH_LIBS=`$PKG_CONFIG --variable=applet_libs gnome-bluetooth-1.0`
|
BLUETOOTH_LIBS=`$PKG_CONFIG --variable=applet_libs gnome-bluetooth-1.0`
|
||||||
AC_SUBST([BLUETOOTH_LIBS],["$BLUETOOTH_LIBS"])
|
AC_SUBST([BLUETOOTH_LIBS],["$BLUETOOTH_LIBS"])
|
||||||
|
@ -204,7 +204,7 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
|
|||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>false</default>
|
<default>true</default>
|
||||||
<summary>Limit switcher to current workspace.</summary>
|
<summary>Limit switcher to current workspace.</summary>
|
||||||
<description>
|
<description>
|
||||||
If true, only windows from the current workspace are shown in the switcher.
|
If true, only windows from the current workspace are shown in the switcher.
|
||||||
|
@ -123,6 +123,20 @@ StScrollBar StButton#vhandle:active {
|
|||||||
background-image: url("checkbox-focused.svg");
|
background-image: url("checkbox-focused.svg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Slider */
|
||||||
|
|
||||||
|
.slider {
|
||||||
|
height: 1em;
|
||||||
|
min-width: 15em;
|
||||||
|
-slider-height: 0.3em;
|
||||||
|
-slider-background-color: #333333;
|
||||||
|
-slider-border-color: #5f5f5f;
|
||||||
|
-slider-active-background-color: #76b0ec;
|
||||||
|
-slider-active-border-color: #1f6dbc;
|
||||||
|
-slider-border-width: 1px;
|
||||||
|
-slider-handle-radius: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
/* PopupMenu */
|
/* PopupMenu */
|
||||||
|
|
||||||
.popup-menu-ornament {
|
.popup-menu-ornament {
|
||||||
@ -222,18 +236,6 @@ StScrollBar StButton#vhandle:active {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.popup-slider-menu-item {
|
|
||||||
height: 1em;
|
|
||||||
min-width: 15em;
|
|
||||||
-slider-height: 0.3em;
|
|
||||||
-slider-background-color: #333333;
|
|
||||||
-slider-border-color: #5f5f5f;
|
|
||||||
-slider-active-background-color: #76b0ec;
|
|
||||||
-slider-active-border-color: #1f6dbc;
|
|
||||||
-slider-border-width: 1px;
|
|
||||||
-slider-handle-radius: 0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-device-menu-item {
|
.popup-device-menu-item {
|
||||||
spacing: .5em;
|
spacing: .5em;
|
||||||
}
|
}
|
||||||
@ -325,10 +327,6 @@ StScrollBar StButton#vhandle:active {
|
|||||||
border-width: 2px;
|
border-width: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-view-control:focus {
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-view-control:first-child:ltr:focus,
|
.app-view-control:first-child:ltr:focus,
|
||||||
.app-view-control:last-child:rtl:focus {
|
.app-view-control:last-child:rtl:focus {
|
||||||
border-right-width: 1px;
|
border-right-width: 1px;
|
||||||
@ -381,6 +379,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
/* Entries */
|
/* Entries */
|
||||||
|
|
||||||
#searchEntry,
|
#searchEntry,
|
||||||
|
.login-dialog StEntry,
|
||||||
.notification StEntry,
|
.notification StEntry,
|
||||||
.modal-dialog StEntry {
|
.modal-dialog StEntry {
|
||||||
color: rgb(64, 64, 64);
|
color: rgb(64, 64, 64);
|
||||||
@ -392,6 +391,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry,
|
#searchEntry,
|
||||||
|
.login-dialog StEntry,
|
||||||
.run-dialog-entry,
|
.run-dialog-entry,
|
||||||
.notification StEntry {
|
.notification StEntry {
|
||||||
border: 2px solid rgba(245,245,245,0.2);
|
border: 2px solid rgba(245,245,245,0.2);
|
||||||
@ -404,6 +404,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
#searchEntry:focus,
|
#searchEntry:focus,
|
||||||
#searchEntry:hover,
|
#searchEntry:hover,
|
||||||
|
.login-dialog StEntry:focus,
|
||||||
.notification StEntry:focus,
|
.notification StEntry:focus,
|
||||||
.modal-dialog StEntry {
|
.modal-dialog StEntry {
|
||||||
border: 2px solid rgb(136,138,133);
|
border: 2px solid rgb(136,138,133);
|
||||||
@ -413,6 +414,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
|
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login-dialog StEntry:focus,
|
||||||
.notification StEntry:focus,
|
.notification StEntry:focus,
|
||||||
.modal-dialog StEntry:focus {
|
.modal-dialog StEntry:focus {
|
||||||
border: 2px solid #3465a4;
|
border: 2px solid #3465a4;
|
||||||
@ -436,6 +438,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
transition-duration: 0ms;
|
transition-duration: 0ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login-dialog StEntry,
|
||||||
.notification StEntry,
|
.notification StEntry,
|
||||||
.modal-dialog StEntry {
|
.modal-dialog StEntry {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
@ -449,6 +452,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login-dialog StEntry:insensitive,
|
||||||
.modal-dialog StEntry:insensitive {
|
.modal-dialog StEntry:insensitive {
|
||||||
border-color: #666666;
|
border-color: #666666;
|
||||||
color: #9f9f9f;
|
color: #9f9f9f;
|
||||||
@ -804,6 +808,11 @@ StScrollBar StButton#vhandle:active {
|
|||||||
height: 24px;
|
height: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.empty-dash-drop-target {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
/* Search Box */
|
/* Search Box */
|
||||||
|
|
||||||
#searchEntry {
|
#searchEntry {
|
||||||
@ -891,14 +900,18 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.app-view-controls {
|
.app-view-controls {
|
||||||
width: 250px;
|
|
||||||
padding-bottom: 32px;
|
padding-bottom: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-view-control {
|
.app-view-control {
|
||||||
padding: 4px 16px;
|
padding: 4px 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.app-view-control:focus {
|
||||||
|
padding: 3px 31px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.search-display > StBoxLayout,
|
.search-display > StBoxLayout,
|
||||||
.all-apps > StBoxLayout,
|
.all-apps > StBoxLayout,
|
||||||
.frequent-apps > StBoxLayout {
|
.frequent-apps > StBoxLayout {
|
||||||
@ -1120,7 +1133,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
padding: 4px;
|
padding: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lg-extension-list {
|
.lg-extensions-list {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
spacing: 6px;
|
spacing: 6px;
|
||||||
}
|
}
|
||||||
@ -1148,9 +1161,9 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
/* Calendar popup */
|
/* Calendar popup */
|
||||||
|
|
||||||
#calendarEventsArea {
|
#calendarArea {
|
||||||
/* this is the width of the second column of the popup */
|
/* this is the total width of the popup */
|
||||||
min-width: 320px;
|
max-width: 720px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.calendar-vertical-separator {
|
.calendar-vertical-separator {
|
||||||
@ -1289,32 +1302,40 @@ StScrollBar StButton#vhandle:active {
|
|||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-header-vbox {
|
.events-table {
|
||||||
spacing: 6pt;
|
min-width: 320px;
|
||||||
padding-right: .5em;
|
spacing-columns: 6pt;
|
||||||
|
padding: 0 1.4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-header-vbox:rtl {
|
.events-table:ltr {
|
||||||
padding-left: .5em;
|
padding-right: 1.9em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-header-hbox {
|
.events-table:rtl {
|
||||||
padding: 0.3em 1.4em;
|
padding-left: 1.9em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-day-header {
|
.events-day-header {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #999999;
|
color: #999999;
|
||||||
padding: 0.4em 1.4em 0em 1.4em;
|
padding-left: 0.4em;
|
||||||
|
padding-top: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.events-day-header:first-child {
|
||||||
|
padding-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-day-header:rtl {
|
.events-day-header:rtl {
|
||||||
padding: 0em 1.4em 0.4em 1.4em;
|
padding-left: 0;
|
||||||
|
padding-right: 0.4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-day-dayname {
|
.events-day-dayname {
|
||||||
color: rgba(153, 153, 153, 1.0);
|
color: rgba(153, 153, 153, 1.0);
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
min-width: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-day-dayname:rtl {
|
.events-day-dayname:rtl {
|
||||||
@ -1332,23 +1353,12 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
.events-day-task {
|
.events-day-task {
|
||||||
color: rgba(153, 153, 153, 1.0);
|
color: rgba(153, 153, 153, 1.0);
|
||||||
|
padding-left: 8pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.events-day-name-box {
|
.events-day-task:rtl {
|
||||||
min-width: 15pt;
|
padding-left: 0px;
|
||||||
}
|
padding-right: 8pt;
|
||||||
|
|
||||||
.events-time-box {
|
|
||||||
min-width: 48pt;
|
|
||||||
padding-right: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.events-time-box:rtl {
|
|
||||||
padding-right: 0px;
|
|
||||||
padding-left: 12pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.events-event-box {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.url-highlighter {
|
.url-highlighter {
|
||||||
@ -2315,6 +2325,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #666666;
|
color: #666666;
|
||||||
padding-top: 1em;
|
padding-top: 1em;
|
||||||
|
padding-left: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
|
.login-dialog-not-listed-button:focus .login-dialog-not-listed-label,
|
||||||
@ -2345,43 +2356,17 @@ StScrollBar StButton#vhandle:active {
|
|||||||
width: 15em;
|
width: 15em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list,
|
.login-dialog-session-list-button StIcon {
|
||||||
.login-dialog-session-list-item {
|
icon-size: 1.25em;
|
||||||
color: #babdb6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-button:focus,
|
|
||||||
.login-dialog-session-list-button:active,
|
|
||||||
.login-dialog-session-list-button:hover,
|
|
||||||
.login-dialog-session-list-item:focus,
|
|
||||||
.login-dialog-session-list-item:hover {
|
|
||||||
color: white;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-button {
|
.login-dialog-session-list-button {
|
||||||
padding: 4px;
|
color: #8b8b8b;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-session-list-scroll-view {
|
.login-dialog-session-list-button:hover,
|
||||||
padding: 6px;
|
.login-dialog-session-list-button:active {
|
||||||
}
|
color: white;
|
||||||
|
|
||||||
.login-dialog-session-list-item {
|
|
||||||
padding-bottom: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-triangle {
|
|
||||||
padding-right: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-item-box {
|
|
||||||
padding-left: 6px;
|
|
||||||
spacing: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-dialog-session-list-item-dot {
|
|
||||||
width: 10px;
|
|
||||||
height: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-logo-bin {
|
.login-dialog-logo-bin {
|
||||||
|
@ -37,6 +37,7 @@ nobase_dist_js_DATA = \
|
|||||||
misc/util.js \
|
misc/util.js \
|
||||||
perf/core.js \
|
perf/core.js \
|
||||||
ui/altTab.js \
|
ui/altTab.js \
|
||||||
|
ui/animation.js \
|
||||||
ui/appDisplay.js \
|
ui/appDisplay.js \
|
||||||
ui/appFavorites.js \
|
ui/appFavorites.js \
|
||||||
ui/backgroundMenu.js \
|
ui/backgroundMenu.js \
|
||||||
@ -68,6 +69,7 @@ nobase_dist_js_DATA = \
|
|||||||
ui/sessionMode.js \
|
ui/sessionMode.js \
|
||||||
ui/shellEntry.js \
|
ui/shellEntry.js \
|
||||||
ui/shellMountOperation.js \
|
ui/shellMountOperation.js \
|
||||||
|
ui/slider.js \
|
||||||
ui/notificationDaemon.js \
|
ui/notificationDaemon.js \
|
||||||
ui/osdWindow.js \
|
ui/osdWindow.js \
|
||||||
ui/overview.js \
|
ui/overview.js \
|
||||||
|
@ -19,39 +19,47 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const AccountsService = imports.gi.AccountsService;
|
const AccountsService = imports.gi.AccountsService;
|
||||||
|
const Atk = imports.gi.Atk;
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const Gdm = imports.gi.Gdm;
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Lang = imports.lang;
|
|
||||||
const Pango = imports.gi.Pango;
|
|
||||||
const Realmd = imports.gdm.realmd;
|
|
||||||
const Signals = imports.signals;
|
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gdm = imports.gi.Gdm;
|
|
||||||
|
|
||||||
|
const Animation = imports.ui.animation;
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const Fprint = imports.gdm.fingerprint;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
const GdmUtil = imports.gdm.util;
|
const GdmUtil = imports.gdm.util;
|
||||||
const Lightbox = imports.ui.lightbox;
|
const Layout = imports.ui.layout;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const Realmd = imports.gdm.realmd;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserMenu = imports.ui.userMenu;
|
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
const _FADE_ANIMATION_TIME = 0.25;
|
const _FADE_ANIMATION_TIME = 0.25;
|
||||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||||
|
const _DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
|
||||||
|
const _DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
||||||
|
const _DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
||||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||||
const _LOGO_ICON_HEIGHT = 48;
|
const _LOGO_ICON_HEIGHT = 48;
|
||||||
|
|
||||||
let _loginDialog = null;
|
let _loginDialog = null;
|
||||||
|
|
||||||
|
const DefaultButtonWellMode = {
|
||||||
|
NONE: 0,
|
||||||
|
SESSION_MENU_BUTTON: 1,
|
||||||
|
SPINNER: 2
|
||||||
|
};
|
||||||
|
|
||||||
const UserListItem = new Lang.Class({
|
const UserListItem = new Lang.Class({
|
||||||
Name: 'UserListItem',
|
Name: 'UserListItem',
|
||||||
|
|
||||||
@ -69,8 +77,8 @@ const UserListItem = new Lang.Class({
|
|||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
x_fill: true });
|
x_fill: true });
|
||||||
|
|
||||||
this._userAvatar = new UserMenu.UserAvatarWidget(this.user,
|
this._userAvatar = new UserWidget.Avatar(this.user,
|
||||||
{ styleClass: 'login-dialog-user-list-item-icon' });
|
{ styleClass: 'login-dialog-user-list-item-icon' });
|
||||||
layout.add(this._userAvatar.actor);
|
layout.add(this._userAvatar.actor);
|
||||||
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
|
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
@ -288,203 +296,118 @@ const UserList = new Lang.Class({
|
|||||||
});
|
});
|
||||||
Signals.addSignalMethods(UserList.prototype);
|
Signals.addSignalMethods(UserList.prototype);
|
||||||
|
|
||||||
const SessionListItem = new Lang.Class({
|
const SessionMenuButton = new Lang.Class({
|
||||||
Name: 'SessionListItem',
|
Name: 'SessionMenuButton',
|
||||||
|
|
||||||
_init: function(id, name) {
|
|
||||||
this.id = id;
|
|
||||||
|
|
||||||
this.actor = new St.Button({ style_class: 'login-dialog-session-list-item',
|
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
|
||||||
can_focus: true,
|
|
||||||
reactive: true,
|
|
||||||
x_fill: true,
|
|
||||||
x_align: St.Align.START });
|
|
||||||
|
|
||||||
this._box = new St.BoxLayout({ style_class: 'login-dialog-session-list-item-box' });
|
|
||||||
|
|
||||||
this.actor.add_actor(this._box);
|
|
||||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
|
||||||
|
|
||||||
this._dot = new St.DrawingArea({ style_class: 'login-dialog-session-list-item-dot' });
|
|
||||||
this._dot.connect('repaint', Lang.bind(this, this._onRepaintDot));
|
|
||||||
this._box.add_actor(this._dot);
|
|
||||||
this.setShowDot(false);
|
|
||||||
|
|
||||||
let label = new St.Label({ style_class: 'login-dialog-session-list-item-label',
|
|
||||||
text: name });
|
|
||||||
this.actor.label_actor = label;
|
|
||||||
|
|
||||||
this._box.add_actor(label);
|
|
||||||
},
|
|
||||||
|
|
||||||
setShowDot: function(show) {
|
|
||||||
if (show)
|
|
||||||
this._dot.opacity = 255;
|
|
||||||
else
|
|
||||||
this._dot.opacity = 0;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onRepaintDot: function(area) {
|
|
||||||
let cr = area.get_context();
|
|
||||||
let [width, height] = area.get_surface_size();
|
|
||||||
let color = area.get_theme_node().get_foreground_color();
|
|
||||||
|
|
||||||
cr.setSourceRGBA (color.red / 255,
|
|
||||||
color.green / 255,
|
|
||||||
color.blue / 255,
|
|
||||||
color.alpha / 255);
|
|
||||||
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
|
|
||||||
cr.fill();
|
|
||||||
cr.$dispose();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onClicked: function() {
|
|
||||||
this.emit('activate');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Signals.addSignalMethods(SessionListItem.prototype);
|
|
||||||
|
|
||||||
const SessionList = new Lang.Class({
|
|
||||||
Name: 'SessionList',
|
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.actor = new St.Bin();
|
let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' });
|
||||||
|
|
||||||
this._box = new St.BoxLayout({ style_class: 'login-dialog-session-list',
|
|
||||||
vertical: true});
|
|
||||||
this.actor.child = this._box;
|
|
||||||
|
|
||||||
this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
|
this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
|
||||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
reactive: true,
|
||||||
|
track_hover: true,
|
||||||
can_focus: true,
|
can_focus: true,
|
||||||
x_fill: true,
|
accessible_name: _("Choose Session"),
|
||||||
y_fill: true });
|
accessible_role: Atk.Role.MENU,
|
||||||
let box = new St.BoxLayout();
|
child: gearIcon });
|
||||||
this._button.add_actor(box);
|
|
||||||
|
|
||||||
this._triangle = new St.Label({ style_class: 'login-dialog-session-list-triangle',
|
this.actor = new St.Bin({ child: this._button });
|
||||||
text: '\u25B8' });
|
|
||||||
box.add_actor(this._triangle);
|
|
||||||
|
|
||||||
let label = new St.Label({ style_class: 'login-dialog-session-list-label',
|
this._menu = new PopupMenu.PopupMenu(this._button, 0, St.Side.TOP);
|
||||||
text: _("Session…") });
|
Main.uiGroup.add_actor(this._menu.actor);
|
||||||
box.add_actor(label);
|
this._menu.actor.hide();
|
||||||
|
|
||||||
this._button.connect('clicked',
|
this._menu.connect('open-state-changed',
|
||||||
Lang.bind(this, this._onClicked));
|
Lang.bind(this, function(menu, isOpen) {
|
||||||
this._box.add_actor(this._button);
|
if (isOpen)
|
||||||
this._scrollView = new St.ScrollView({ style_class: 'login-dialog-session-list-scroll-view'});
|
this._button.add_style_pseudo_class('active');
|
||||||
this._scrollView.set_policy(Gtk.PolicyType.NEVER,
|
else
|
||||||
Gtk.PolicyType.AUTOMATIC);
|
this._button.remove_style_pseudo_class('active');
|
||||||
this._box.add_actor(this._scrollView);
|
}));
|
||||||
this._itemList = new St.BoxLayout({ style_class: 'login-dialog-session-item-list',
|
|
||||||
vertical: true });
|
let subtitle = new PopupMenu.PopupMenuItem(_("Session"), { style_class: 'popup-subtitle-menu-item',
|
||||||
this._scrollView.add_actor(this._itemList);
|
reactive: false });
|
||||||
this._scrollView.hide();
|
this._menu.addMenuItem(subtitle);
|
||||||
this.isOpen = false;
|
|
||||||
|
this._manager = new PopupMenu.PopupMenuManager({ actor: this._button });
|
||||||
|
this._manager.addMenu(this._menu);
|
||||||
|
|
||||||
|
this._button.connect('clicked', Lang.bind(this, function() {
|
||||||
|
this._menu.toggle();
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._items = {};
|
||||||
|
this._activeSessionId = null;
|
||||||
this._populate();
|
this._populate();
|
||||||
},
|
},
|
||||||
|
|
||||||
open: function() {
|
|
||||||
if (this.isOpen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._button.add_style_pseudo_class('open');
|
|
||||||
this._scrollView.show();
|
|
||||||
this._triangle.set_text('\u25BE');
|
|
||||||
|
|
||||||
this.isOpen = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function() {
|
|
||||||
if (!this.isOpen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._button.remove_style_pseudo_class('open');
|
|
||||||
this._scrollView.hide();
|
|
||||||
this._triangle.set_text('\u25B8');
|
|
||||||
|
|
||||||
this.isOpen = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onClicked: function() {
|
|
||||||
if (!this.isOpen)
|
|
||||||
this.open();
|
|
||||||
else
|
|
||||||
this.close();
|
|
||||||
},
|
|
||||||
|
|
||||||
updateSensitivity: function(sensitive) {
|
updateSensitivity: function(sensitive) {
|
||||||
this._button.reactive = sensitive;
|
this._button.reactive = sensitive;
|
||||||
this._button.can_focus = sensitive;
|
this._button.can_focus = sensitive;
|
||||||
|
this._menu.close(BoxPointer.PopupAnimation.NONE);
|
||||||
|
},
|
||||||
|
|
||||||
for (let id in this._items)
|
_updateOrnament: function() {
|
||||||
this._items[id].actor.reactive = sensitive;
|
let itemIds = Object.keys(this._items);
|
||||||
|
for (let i = 0; i < itemIds.length; i++) {
|
||||||
|
if (itemIds[i] == this._activeSessionId)
|
||||||
|
this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.DOT);
|
||||||
|
else
|
||||||
|
this._items[itemIds[i]].setOrnament(PopupMenu.Ornament.NONE);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setActiveSession: function(sessionId) {
|
setActiveSession: function(sessionId) {
|
||||||
if (sessionId == this._activeSessionId)
|
if (sessionId == this._activeSessionId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (this._activeSessionId)
|
|
||||||
this._items[this._activeSessionId].setShowDot(false);
|
|
||||||
|
|
||||||
this._items[sessionId].setShowDot(true);
|
|
||||||
this._activeSessionId = sessionId;
|
this._activeSessionId = sessionId;
|
||||||
|
this._updateOrnament();
|
||||||
|
|
||||||
this.emit('session-activated', this._activeSessionId);
|
this.emit('session-activated', this._activeSessionId);
|
||||||
},
|
},
|
||||||
|
|
||||||
_populate: function() {
|
close: function() {
|
||||||
this._itemList.destroy_all_children();
|
this._menu.close();
|
||||||
this._activeSessionId = null;
|
},
|
||||||
this._items = {};
|
|
||||||
|
|
||||||
|
_populate: function() {
|
||||||
let ids = Gdm.get_session_ids();
|
let ids = Gdm.get_session_ids();
|
||||||
ids.sort();
|
ids.sort();
|
||||||
|
|
||||||
if (ids.length <= 1) {
|
if (ids.length <= 1) {
|
||||||
this._box.hide();
|
|
||||||
this._button.hide();
|
this._button.hide();
|
||||||
} else {
|
return;
|
||||||
this._button.show();
|
|
||||||
this._box.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < ids.length; i++) {
|
for (let i = 0; i < ids.length; i++) {
|
||||||
let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]);
|
let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]);
|
||||||
|
|
||||||
let item = new SessionListItem(ids[i], sessionName);
|
let id = ids[i];
|
||||||
this._itemList.add_actor(item.actor);
|
let item = new PopupMenu.PopupMenuItem(sessionName);
|
||||||
this._items[ids[i]] = item;
|
this._menu.addMenuItem(item);
|
||||||
|
this._items[id] = item;
|
||||||
|
|
||||||
if (!this._activeSessionId)
|
if (!this._activeSessionId)
|
||||||
this.setActiveSession(ids[i]);
|
this.setActiveSession(id);
|
||||||
|
|
||||||
item.connect('activate',
|
item.connect('activate', Lang.bind(this, function() {
|
||||||
Lang.bind(this, function() {
|
this.setActiveSession(id);
|
||||||
this.setActiveSession(item.id);
|
}));
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(SessionList.prototype);
|
Signals.addSignalMethods(SessionMenuButton.prototype);
|
||||||
|
|
||||||
const LoginDialog = new Lang.Class({
|
const LoginDialog = new Lang.Class({
|
||||||
Name: 'LoginDialog',
|
Name: 'LoginDialog',
|
||||||
Extends: ModalDialog.ModalDialog,
|
|
||||||
|
|
||||||
_init: function(parentActor) {
|
_init: function(parentActor) {
|
||||||
this.parent({ shellReactive: true,
|
this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW,
|
||||||
styleClass: 'login-dialog',
|
style_class: 'login-dialog',
|
||||||
parentActor: parentActor,
|
visible: false });
|
||||||
keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN,
|
|
||||||
shouldFadeIn: false });
|
this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true }));
|
||||||
this.connect('destroy',
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
Lang.bind(this, this._onDestroy));
|
parentActor.add_child(this.actor);
|
||||||
this.connect('opened',
|
|
||||||
Lang.bind(this, this._onOpened));
|
|
||||||
|
|
||||||
this._userManager = AccountsService.UserManager.get_default()
|
this._userManager = AccountsService.UserManager.get_default()
|
||||||
this._greeterClient = new Gdm.Client();
|
this._greeterClient = new Gdm.Client();
|
||||||
@ -527,7 +450,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
|
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
this.contentLayout.add(this._userSelectionBox);
|
this._userSelectionBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||||
|
align_axis: Clutter.AlignAxis.BOTH,
|
||||||
|
factor: 0.5 }));
|
||||||
|
this.actor.add_child(this._userSelectionBox);
|
||||||
|
|
||||||
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
|
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
|
||||||
text: '' });
|
text: '' });
|
||||||
@ -540,15 +466,20 @@ const LoginDialog = new Lang.Class({
|
|||||||
x_fill: true,
|
x_fill: true,
|
||||||
y_fill: true });
|
y_fill: true });
|
||||||
|
|
||||||
this.setInitialKeyFocus(this._userList.actor);
|
|
||||||
|
|
||||||
this._promptBox = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
this._promptBox = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
this.contentLayout.add(this._promptBox,
|
|
||||||
{ expand: true,
|
this._promptBox.connect('button-press-event',
|
||||||
x_fill: true,
|
Lang.bind(this, function(actor, event) {
|
||||||
y_fill: true,
|
if (event.get_key_symbol() == Clutter.KEY_Escape) {
|
||||||
x_align: St.Align.START });
|
this.cancel();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||||
|
align_axis: Clutter.AlignAxis.BOTH,
|
||||||
|
factor: 0.5 }));
|
||||||
|
this.actor.add_child(this._promptBox);
|
||||||
this._promptUser = new St.Bin({ x_fill: true,
|
this._promptUser = new St.Bin({ x_fill: true,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
this._promptBox.add(this._promptUser,
|
this._promptBox.add(this._promptUser,
|
||||||
@ -573,6 +504,8 @@ const LoginDialog = new Lang.Class({
|
|||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.START });
|
x_align: St.Align.START });
|
||||||
|
|
||||||
|
this._promptEntry.grab_key_focus();
|
||||||
|
|
||||||
this._promptMessage = new St.Label({ visible: false });
|
this._promptMessage = new St.Label({ visible: false });
|
||||||
this._promptBox.add(this._promptMessage, { x_fill: true });
|
this._promptBox.add(this._promptMessage, { x_fill: true });
|
||||||
|
|
||||||
@ -580,19 +513,15 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
this._promptBox.add(this._promptLoginHint);
|
this._promptBox.add(this._promptLoginHint);
|
||||||
|
|
||||||
|
this._buttonBox = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
|
||||||
|
vertical: false });
|
||||||
|
this._promptBox.add(this._buttonBox,
|
||||||
|
{ expand: true,
|
||||||
|
x_align: St.Align.MIDDLE,
|
||||||
|
y_align: St.Align.END });
|
||||||
|
this._cancelButton = null;
|
||||||
this._signInButton = null;
|
this._signInButton = null;
|
||||||
|
|
||||||
this._sessionList = new SessionList();
|
|
||||||
this._sessionList.connect('session-activated',
|
|
||||||
Lang.bind(this, function(list, sessionId) {
|
|
||||||
this._greeter.call_select_session_sync (sessionId, null);
|
|
||||||
}));
|
|
||||||
|
|
||||||
this._promptBox.add(this._sessionList.actor,
|
|
||||||
{ expand: true,
|
|
||||||
x_fill: false,
|
|
||||||
y_fill: true,
|
|
||||||
x_align: St.Align.START });
|
|
||||||
this._promptBox.hide();
|
this._promptBox.hide();
|
||||||
|
|
||||||
// translators: this message is shown below the user list on the
|
// translators: this message is shown below the user list on the
|
||||||
@ -609,6 +538,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
x_fill: true });
|
x_fill: true });
|
||||||
|
|
||||||
this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn));
|
this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn));
|
||||||
|
this._notListedButton.hide();
|
||||||
|
|
||||||
this._userSelectionBox.add(this._notListedButton,
|
this._userSelectionBox.add(this._notListedButton,
|
||||||
{ expand: false,
|
{ expand: false,
|
||||||
@ -617,7 +547,13 @@ const LoginDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._logoBin = new St.Bin({ style_class: 'login-dialog-logo-bin', y_expand: true });
|
this._logoBin = new St.Bin({ style_class: 'login-dialog-logo-bin', y_expand: true });
|
||||||
this._logoBin.set_y_align(Clutter.ActorAlign.END);
|
this._logoBin.set_y_align(Clutter.ActorAlign.END);
|
||||||
this.backgroundStack.add_actor(this._logoBin);
|
this._logoBin.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||||
|
align_axis: Clutter.AlignAxis.X_AXIS,
|
||||||
|
factor: 0.5 }));
|
||||||
|
this._logoBin.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||||
|
align_axis: Clutter.AlignAxis.Y_AXIS,
|
||||||
|
factor: 1.0 }));
|
||||||
|
this.actor.add_child(this._logoBin);
|
||||||
this._updateLogo();
|
this._updateLogo();
|
||||||
|
|
||||||
if (!this._userManager.is_loaded)
|
if (!this._userManager.is_loaded)
|
||||||
@ -637,15 +573,32 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._onUserListActivated(item);
|
this._onUserListActivated(item);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
this._defaultButtonWell = new St.Widget();
|
||||||
|
this._defaultButtonWellMode = DefaultButtonWellMode.NONE;
|
||||||
|
|
||||||
|
this._sessionMenuButton = new SessionMenuButton();
|
||||||
|
this._sessionMenuButton.connect('session-activated',
|
||||||
|
Lang.bind(this, function(list, sessionId) {
|
||||||
|
this._greeter.call_select_session_sync (sessionId, null);
|
||||||
|
}));
|
||||||
|
this._sessionMenuButton.actor.opacity = 0;
|
||||||
|
this._sessionMenuButton.actor.show();
|
||||||
|
this._defaultButtonWell.add_child(this._sessionMenuButton.actor);
|
||||||
|
|
||||||
|
let spinnerIcon = global.datadir + '/theme/process-working.svg';
|
||||||
|
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, _DEFAULT_BUTTON_WELL_ICON_SIZE);
|
||||||
|
this._workSpinner.actor.opacity = 0;
|
||||||
|
this._workSpinner.actor.show();
|
||||||
|
|
||||||
|
this._defaultButtonWell.add_child(this._workSpinner.actor);
|
||||||
|
this._sessionMenuButton.actor.add_constraint(new Clutter.AlignConstraint({ source: this._workSpinner.actor,
|
||||||
|
align_axis: Clutter.AlignAxis.BOTH,
|
||||||
|
factor: 0.5 }));
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateDisableUserList: function() {
|
_updateDisableUserList: function() {
|
||||||
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
||||||
|
|
||||||
// If this is the first time around, set initial focus
|
|
||||||
if (this._disableUserList == undefined && disableUserList)
|
|
||||||
this.setInitialKeyFocus(this._promptEntry);
|
|
||||||
|
|
||||||
if (disableUserList != this._disableUserList) {
|
if (disableUserList != this._disableUserList) {
|
||||||
this._disableUserList = disableUserList;
|
this._disableUserList = disableUserList;
|
||||||
|
|
||||||
@ -698,15 +651,77 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._showUserList();
|
this._showUserList();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getActorForDefaultButtonWellMode: function(mode) {
|
||||||
|
let actor;
|
||||||
|
|
||||||
|
if (mode == DefaultButtonWellMode.NONE)
|
||||||
|
actor = null;
|
||||||
|
else if (mode == DefaultButtonWellMode.SPINNER)
|
||||||
|
actor = this._workSpinner.actor;
|
||||||
|
else if (mode == DefaultButtonWellMode.SESSION_MENU_BUTTON)
|
||||||
|
actor = this._sessionMenuButton.actor;
|
||||||
|
|
||||||
|
return actor;
|
||||||
|
},
|
||||||
|
|
||||||
|
_setDefaultButtonWellMode: function(mode, immediately) {
|
||||||
|
if (this._defaultButtonWellMode == DefaultButtonWellMode.NONE &&
|
||||||
|
mode == DefaultButtonWellMode.NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let oldActor = this._getActorForDefaultButtonWellMode(this._defaultButtonWellMode);
|
||||||
|
|
||||||
|
if (oldActor)
|
||||||
|
Tweener.removeTweens(oldActor);
|
||||||
|
|
||||||
|
let actor = this._getActorForDefaultButtonWellMode(mode);
|
||||||
|
|
||||||
|
if (this._defaultButtonWellMode != mode && oldActor) {
|
||||||
|
if (immediately)
|
||||||
|
oldActor.opacity = 0;
|
||||||
|
else
|
||||||
|
Tweener.addTween(oldActor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: _DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||||
|
delay: _DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||||
|
transition: 'linear',
|
||||||
|
onCompleteScope: this,
|
||||||
|
onComplete: function() {
|
||||||
|
if (mode == DefaultButtonWellMode.SPINNER) {
|
||||||
|
if (this._workSpinner)
|
||||||
|
this._workSpinner.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (actor) {
|
||||||
|
if (mode == DefaultButtonWellMode.SPINNER)
|
||||||
|
this._workSpinner.play();
|
||||||
|
|
||||||
|
if (immediately)
|
||||||
|
actor.opacity = 255;
|
||||||
|
else
|
||||||
|
Tweener.addTween(actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: _DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||||
|
delay: _DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||||
|
transition: 'linear' });
|
||||||
|
}
|
||||||
|
|
||||||
|
this._defaultButtonWellMode = mode;
|
||||||
|
},
|
||||||
|
|
||||||
_verificationFailed: function() {
|
_verificationFailed: function() {
|
||||||
this._promptEntry.text = '';
|
this._promptEntry.text = '';
|
||||||
|
|
||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
this.setWorking(false);
|
this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDefaultSessionChanged: function(client, sessionId) {
|
_onDefaultSessionChanged: function(client, sessionId) {
|
||||||
this._sessionList.setActiveSession(sessionId);
|
this._sessionMenuButton.setActiveSession(sessionId);
|
||||||
},
|
},
|
||||||
|
|
||||||
_showMessage: function(userVerifier, message, styleClass) {
|
_showMessage: function(userVerifier, message, styleClass) {
|
||||||
@ -737,8 +752,20 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._reset();
|
this._reset();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_shouldShowSessionMenuButton: function() {
|
||||||
|
if (this._verifyingUser)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (!this._user)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (this._user.is_logged_in)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
_showPrompt: function(forSecret) {
|
_showPrompt: function(forSecret) {
|
||||||
this._sessionList.actor.hide();
|
|
||||||
this._promptLabel.show();
|
this._promptLabel.show();
|
||||||
this._promptEntry.show();
|
this._promptEntry.show();
|
||||||
this._promptLoginHint.opacity = 0;
|
this._promptLoginHint.opacity = 0;
|
||||||
@ -750,8 +777,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
time: _FADE_ANIMATION_TIME,
|
time: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad' });
|
transition: 'easeOutQuad' });
|
||||||
|
|
||||||
if ((this._user && !this._user.is_logged_in()) || this._verifyingUser)
|
if (this._shouldShowSessionMenuButton())
|
||||||
this._sessionList.actor.show();
|
this._setDefaultButtonWellMode(DefaultButtonWellMode.SESSION_MENU_BUTTON, true);
|
||||||
|
else
|
||||||
|
this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
|
||||||
|
|
||||||
this._promptEntry.grab_key_focus();
|
this._promptEntry.grab_key_focus();
|
||||||
|
|
||||||
@ -768,33 +797,49 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_prepareDialog: function(forSecret, hold) {
|
_prepareDialog: function(forSecret, hold) {
|
||||||
this.buttonLayout.visible = true;
|
this._buttonBox.visible = true;
|
||||||
this.clearButtons();
|
this._buttonBox.remove_all_children();
|
||||||
|
|
||||||
if (!this._disableUserList || this._verifyingUser)
|
if (!this._disableUserList || this._verifyingUser) {
|
||||||
this.addButton({ action: Lang.bind(this, this.cancel),
|
this._cancelButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||||
label: _("Cancel"),
|
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||||
key: Clutter.Escape },
|
reactive: true,
|
||||||
{ expand: true,
|
can_focus: true,
|
||||||
x_fill: false,
|
label: _("Cancel") });
|
||||||
y_fill: false,
|
this._cancelButton.connect('clicked',
|
||||||
x_align: St.Align.START,
|
Lang.bind(this, function() {
|
||||||
y_align: St.Align.MIDDLE });
|
this.cancel();
|
||||||
this.placeSpinner({ expand: false,
|
}));
|
||||||
x_fill: false,
|
this._buttonBox.add(this._cancelButton,
|
||||||
y_fill: false,
|
{ expand: false,
|
||||||
x_align: St.Align.END,
|
x_fill: false,
|
||||||
y_align: St.Align.MIDDLE });
|
y_fill: false,
|
||||||
this._signInButton = this.addButton({ action: Lang.bind(this, function() {
|
x_align: St.Align.START,
|
||||||
hold.release();
|
y_align: St.Align.END });
|
||||||
}),
|
}
|
||||||
label: forSecret ? C_("button", "Sign In") : _("Next"),
|
|
||||||
default: true },
|
this._buttonBox.add(this._defaultButtonWell,
|
||||||
{ expand: false,
|
{ expand: true,
|
||||||
x_fill: false,
|
x_fill: false,
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: St.Align.END,
|
x_align: St.Align.END,
|
||||||
y_align: St.Align.MIDDLE });
|
y_align: St.Align.MIDDLE });
|
||||||
|
this._signInButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||||
|
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||||
|
reactive: true,
|
||||||
|
can_focus: true,
|
||||||
|
label: forSecret ? C_("button", "Sign In") : _("Next") });
|
||||||
|
this._signInButton.connect('clicked',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
hold.release();
|
||||||
|
}));
|
||||||
|
this._signInButton.add_style_pseudo_class('default');
|
||||||
|
this._buttonBox.add(this._signInButton,
|
||||||
|
{ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.END });
|
||||||
|
|
||||||
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
||||||
|
|
||||||
@ -813,7 +858,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
_updateSensitivity: function(sensitive) {
|
_updateSensitivity: function(sensitive) {
|
||||||
this._promptEntry.reactive = sensitive;
|
this._promptEntry.reactive = sensitive;
|
||||||
this._promptEntry.clutter_text.editable = sensitive;
|
this._promptEntry.clutter_text.editable = sensitive;
|
||||||
this._sessionList.updateSensitivity(sensitive);
|
this._sessionMenuButton.updateSensitivity(sensitive);
|
||||||
this._updateSignInButtonSensitivity(sensitive);
|
this._updateSignInButtonSensitivity(sensitive);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -825,8 +870,6 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_hidePrompt: function() {
|
_hidePrompt: function() {
|
||||||
this.setButtons([]);
|
|
||||||
|
|
||||||
if (this._promptEntryTextChangedId > 0) {
|
if (this._promptEntryTextChangedId > 0) {
|
||||||
this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId);
|
this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId);
|
||||||
this._promptEntryTextChangedId = 0;
|
this._promptEntryTextChangedId = 0;
|
||||||
@ -837,7 +880,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptEntryActivateId = 0;
|
this._promptEntryActivateId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setWorking(false);
|
this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
|
||||||
this._promptBox.hide();
|
this._promptBox.hide();
|
||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
|
|
||||||
@ -846,11 +889,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
this._promptEntry.set_text('');
|
this._promptEntry.set_text('');
|
||||||
|
|
||||||
this._sessionList.close();
|
this._sessionMenuButton.close();
|
||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
|
|
||||||
this.clearButtons();
|
this._buttonBox.remove_all_children();
|
||||||
this._signInButton = null;
|
this._signInButton = null;
|
||||||
|
this._cancelButton = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||||
@ -867,7 +911,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
function() {
|
function() {
|
||||||
let text = this._promptEntry.get_text();
|
let text = this._promptEntry.get_text();
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
this.setWorking(true);
|
this._setDefaultButtonWellMode(DefaultButtonWellMode.SPINNER, false);
|
||||||
this._userVerifier.answerQuery(serviceName, text);
|
this._userVerifier.answerQuery(serviceName, text);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
@ -916,7 +960,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_startSession: function(serviceName) {
|
_startSession: function(serviceName) {
|
||||||
Tweener.addTween(this.dialogLayout,
|
Tweener.addTween(this.actor,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: _FADE_ANIMATION_TIME,
|
time: _FADE_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
@ -925,7 +969,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
|
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
if (children[i] != Main.layoutManager.screenShieldGroup)
|
if (children[i] != Main.layoutManager.screenShieldGroup)
|
||||||
children[i].opacity = this.dialogLayout.opacity;
|
children[i].opacity = this.actor.opacity;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onUpdateScope: this,
|
onUpdateScope: this,
|
||||||
@ -1088,6 +1132,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
_showUserList: function() {
|
_showUserList: function() {
|
||||||
this._hidePrompt();
|
this._hidePrompt();
|
||||||
this._setUserListExpanded(true);
|
this._setUserListExpanded(true);
|
||||||
|
this._notListedButton.show();
|
||||||
this._userList.actor.grab_key_focus();
|
this._userList.actor.grab_key_focus();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1153,17 +1198,18 @@ const LoginDialog = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_onOpened: function() {
|
open: function() {
|
||||||
Main.ctrlAltTabManager.addGroup(this.dialogLayout,
|
Main.ctrlAltTabManager.addGroup(this.actor,
|
||||||
_("Login Window"),
|
_("Login Window"),
|
||||||
'dialog-password-symbolic',
|
'dialog-password-symbolic',
|
||||||
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
|
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
|
||||||
|
this._userList.actor.grab_key_focus();
|
||||||
|
this.actor.show();
|
||||||
|
|
||||||
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function() {
|
close: function() {
|
||||||
this.parent();
|
|
||||||
|
|
||||||
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
|
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1171,3 +1217,4 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptEntry.clutter_text.insert_unichar(unichar);
|
this._promptEntry.clutter_text.insert_unichar(unichar);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
Signals.addSignalMethods(LoginDialog.prototype);
|
||||||
|
@ -164,6 +164,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
answerQuery: function(serviceName, answer) {
|
answerQuery: function(serviceName, answer) {
|
||||||
if (!this._userVerifier.hasPendingMessages) {
|
if (!this._userVerifier.hasPendingMessages) {
|
||||||
|
this._clearMessageQueue();
|
||||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||||
} else {
|
} else {
|
||||||
let signalId = this._userVerifier.connect('no-more-messages',
|
let signalId = this._userVerifier.connect('no-more-messages',
|
||||||
|
84
js/ui/animation.js
Normal file
84
js/ui/animation.js
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Mainloop = imports.mainloop;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
|
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
|
||||||
|
|
||||||
|
const Animation = new Lang.Class({
|
||||||
|
Name: 'Animation',
|
||||||
|
|
||||||
|
_init: function(filename, width, height, speed) {
|
||||||
|
this.actor = new St.Bin();
|
||||||
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
|
this._speed = speed;
|
||||||
|
|
||||||
|
this._isLoaded = false;
|
||||||
|
this._isPlaying = false;
|
||||||
|
this._timeoutId = 0;
|
||||||
|
this._frame = 0;
|
||||||
|
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
|
||||||
|
Lang.bind(this, this._animationsLoaded));
|
||||||
|
this.actor.set_child(this._animations);
|
||||||
|
},
|
||||||
|
|
||||||
|
play: function() {
|
||||||
|
if (this._isLoaded && this._timeoutId == 0) {
|
||||||
|
if (this._frame == 0)
|
||||||
|
this._showFrame(0);
|
||||||
|
|
||||||
|
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isPlaying = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
stop: function() {
|
||||||
|
if (this._timeoutId > 0) {
|
||||||
|
Mainloop.source_remove(this._timeoutId);
|
||||||
|
this._timeoutId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isPlaying = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
_showFrame: function(frame) {
|
||||||
|
let oldFrameActor = this._animations.get_child_at_index(this._frame);
|
||||||
|
if (oldFrameActor)
|
||||||
|
oldFrameActor.hide();
|
||||||
|
|
||||||
|
this._frame = (frame % this._animations.get_n_children());
|
||||||
|
|
||||||
|
let newFrameActor = this._animations.get_child_at_index(this._frame);
|
||||||
|
if (newFrameActor)
|
||||||
|
newFrameActor.show();
|
||||||
|
},
|
||||||
|
|
||||||
|
_update: function() {
|
||||||
|
this._showFrame(this._frame + 1);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_animationsLoaded: function() {
|
||||||
|
this._isLoaded = true;
|
||||||
|
|
||||||
|
if (this._isPlaying)
|
||||||
|
this.play();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDestroy: function() {
|
||||||
|
this.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AnimatedIcon = new Lang.Class({
|
||||||
|
Name: 'AnimatedIcon',
|
||||||
|
Extends: Animation,
|
||||||
|
|
||||||
|
_init: function(filename, size) {
|
||||||
|
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
|
||||||
|
}
|
||||||
|
});
|
@ -336,6 +336,42 @@ const Views = {
|
|||||||
ALL: 1
|
ALL: 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ControlsBoxLayout = Lang.Class({
|
||||||
|
Name: 'ControlsBoxLayout',
|
||||||
|
Extends: Clutter.BoxLayout,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the BoxLayout behavior to use the maximum preferred width of all
|
||||||
|
* buttons for each child
|
||||||
|
*/
|
||||||
|
vfunc_get_preferred_width: function(container, forHeight) {
|
||||||
|
let maxMinWidth = 0;
|
||||||
|
let maxNaturalWidth = 0;
|
||||||
|
for (let child = container.get_first_child();
|
||||||
|
child;
|
||||||
|
child = child.get_next_sibling()) {
|
||||||
|
let [minWidth, natWidth] = child.get_preferred_width(forHeight);
|
||||||
|
maxMinWidth = Math.max(maxMinWidth, minWidth);
|
||||||
|
maxNaturalWidth = Math.max(maxNaturalWidth, natWidth);
|
||||||
|
}
|
||||||
|
let childrenCount = container.get_n_children();
|
||||||
|
let totalSpacing = this.spacing * (childrenCount - 1);
|
||||||
|
return [maxMinWidth * childrenCount + totalSpacing,
|
||||||
|
maxNaturalWidth * childrenCount + totalSpacing];
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_set_container: function(container) {
|
||||||
|
if(this._styleChangedId) {
|
||||||
|
this._container.disconnect(this._styleChangedId);
|
||||||
|
this._styleChangedId = 0;
|
||||||
|
}
|
||||||
|
if(container != null)
|
||||||
|
this._styleChangedId = container.connect('style-changed', Lang.bind(this,
|
||||||
|
function() { this.spacing = this._container.get_theme_node().get_length('spacing'); }));
|
||||||
|
this._container = container;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const AppDisplay = new Lang.Class({
|
const AppDisplay = new Lang.Class({
|
||||||
Name: 'AppDisplay',
|
Name: 'AppDisplay',
|
||||||
|
|
||||||
@ -379,9 +415,9 @@ const AppDisplay = new Lang.Class({
|
|||||||
x_expand: true, y_expand: true });
|
x_expand: true, y_expand: true });
|
||||||
this.actor.add(this._viewStack, { expand: true });
|
this.actor.add(this._viewStack, { expand: true });
|
||||||
|
|
||||||
let layout = new Clutter.BoxLayout({ homogeneous: true });
|
let layout = new ControlsBoxLayout({ homogeneous: true });
|
||||||
this._controls = new St.Widget({ style_class: 'app-view-controls',
|
this._controls = new St.Widget({ style_class: 'app-view-controls' });
|
||||||
layout_manager: layout });
|
this._controls.set_layout_manager(layout);
|
||||||
this.actor.add(new St.Bin({ child: this._controls }));
|
this.actor.add(new St.Bin({ child: this._controls }));
|
||||||
|
|
||||||
|
|
||||||
|
@ -142,23 +142,20 @@ const BackgroundCache = new Lang.Class({
|
|||||||
cancellable: null,
|
cancellable: null,
|
||||||
onFinished: null });
|
onFinished: null });
|
||||||
|
|
||||||
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
let fileLoad = { filename: params.filename,
|
||||||
if (this._pendingFileLoads[i].filename == params.filename &&
|
style: params.style,
|
||||||
this._pendingFileLoads[i].style == params.style) {
|
shouldCopy: false,
|
||||||
this._pendingFileLoads[i].callers.push({ shouldCopy: true,
|
monitorIndex: params.monitorIndex,
|
||||||
monitorIndex: params.monitorIndex,
|
effects: params.effects,
|
||||||
effects: params.effects,
|
onFinished: params.onFinished,
|
||||||
onFinished: params.onFinished });
|
cancellable: new Gio.Cancellable(), };
|
||||||
return;
|
this._pendingFileLoads.push(fileLoad);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._pendingFileLoads.push({ filename: params.filename,
|
if (params.cancellable) {
|
||||||
style: params.style,
|
params.cancellable.connect(Lang.bind(this, function(c) {
|
||||||
callers: [{ shouldCopy: false,
|
fileLoad.cancellable.cancel();
|
||||||
monitorIndex: params.monitorIndex,
|
}));
|
||||||
effects: params.effects,
|
}
|
||||||
onFinished: params.onFinished }] });
|
|
||||||
|
|
||||||
let content = new Meta.Background({ meta_screen: global.screen,
|
let content = new Meta.Background({ meta_screen: global.screen,
|
||||||
monitor: params.monitorIndex,
|
monitor: params.monitorIndex,
|
||||||
@ -166,9 +163,19 @@ const BackgroundCache = new Lang.Class({
|
|||||||
|
|
||||||
content.load_file_async(params.filename,
|
content.load_file_async(params.filename,
|
||||||
params.style,
|
params.style,
|
||||||
params.cancellable,
|
fileLoad.cancellable,
|
||||||
Lang.bind(this,
|
Lang.bind(this,
|
||||||
function(object, result) {
|
function(object, result) {
|
||||||
|
if (fileLoad.cancellable.is_cancelled()) {
|
||||||
|
if (params.cancellable && params.cancellable.is_cancelled()) {
|
||||||
|
if (params.onFinished)
|
||||||
|
params.onFinished(null);
|
||||||
|
this._removePendingFileLoad(fileLoad);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
content.load_file_finish(result);
|
content.load_file_finish(result);
|
||||||
|
|
||||||
@ -178,22 +185,25 @@ const BackgroundCache = new Lang.Class({
|
|||||||
content = null;
|
content = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let needsCopy = false;
|
||||||
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||||
let pendingLoad = this._pendingFileLoads[i];
|
let pendingLoad = this._pendingFileLoads[i];
|
||||||
if (pendingLoad.filename != params.filename ||
|
if (pendingLoad.filename != params.filename ||
|
||||||
pendingLoad.style != params.style)
|
pendingLoad.style != params.style)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (let j = 0; j < pendingLoad.callers.length; j++) {
|
if (pendingLoad.cancellable.is_cancelled())
|
||||||
if (pendingLoad.callers[j].onFinished) {
|
continue;
|
||||||
if (content && pendingLoad.callers[j].shouldCopy) {
|
|
||||||
content = object.copy(pendingLoad.callers[j].monitorIndex,
|
|
||||||
pendingLoad.callers[j].effects);
|
|
||||||
|
|
||||||
}
|
pendingLoad.cancellable.cancel();
|
||||||
|
if (pendingLoad.onFinished) {
|
||||||
pendingLoad.callers[j].onFinished(content);
|
if (content && needsCopy) {
|
||||||
|
content = object.copy(pendingLoad.monitorIndex,
|
||||||
|
pendingLoad.effects);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
needsCopy = true;
|
||||||
|
pendingLoad.onFinished(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._pendingFileLoads.splice(i, 1);
|
this._pendingFileLoads.splice(i, 1);
|
||||||
@ -201,6 +211,15 @@ const BackgroundCache = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_removePendingFileLoad: function(fileLoad) {
|
||||||
|
for (let i = 0; i < this._pendingFileLoads.length; i++) {
|
||||||
|
if (this._pendingFileLoads[i].cancellable == fileLoad.cancellable) {
|
||||||
|
this._pendingFileLoads.splice(i, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
getImageContent: function(params) {
|
getImageContent: function(params) {
|
||||||
params = Params.parse(params, { monitorIndex: 0,
|
params = Params.parse(params, { monitorIndex: 0,
|
||||||
style: null,
|
style: null,
|
||||||
@ -571,7 +590,16 @@ const Background = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let uri = this._settings.get_string(PICTURE_URI_KEY);
|
let uri = this._settings.get_string(PICTURE_URI_KEY);
|
||||||
let filename = Gio.File.new_for_uri(uri).get_path();
|
let filename;
|
||||||
|
if (GLib.uri_parse_scheme(uri) != null)
|
||||||
|
filename = Gio.File.new_for_uri(uri).get_path();
|
||||||
|
else
|
||||||
|
filename = uri;
|
||||||
|
|
||||||
|
if (!filename) {
|
||||||
|
this._setLoaded();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._loadFile(filename);
|
this._loadFile(filename);
|
||||||
},
|
},
|
||||||
|
@ -589,12 +589,12 @@ const BoxPointer = new Lang.Class({
|
|||||||
return St.Side.TOP;
|
return St.Side.TOP;
|
||||||
break;
|
break;
|
||||||
case St.Side.LEFT:
|
case St.Side.LEFT:
|
||||||
if (sourceAllocation.y2 + boxWidth > monitor.x + monitor.width &&
|
if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
|
||||||
boxWidth < sourceAllocation.x1 - monitor.x)
|
boxWidth < sourceAllocation.x1 - monitor.x)
|
||||||
return St.Side.RIGHT;
|
return St.Side.RIGHT;
|
||||||
break;
|
break;
|
||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
if (sourceAllocation.y1 - boxWidth < monitor.x &&
|
if (sourceAllocation.x1 - boxWidth < monitor.x &&
|
||||||
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
|
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
|
||||||
return St.Side.LEFT;
|
return St.Side.LEFT;
|
||||||
break;
|
break;
|
||||||
|
@ -675,7 +675,7 @@ const EventsList = new Lang.Class({
|
|||||||
Name: 'EventsList',
|
Name: 'EventsList',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.actor = new St.BoxLayout({ vertical: true, style_class: 'events-header-vbox'});
|
this.actor = new St.Table({ style_class: 'events-table' });
|
||||||
this._date = new Date();
|
this._date = new Date();
|
||||||
this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
|
this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
|
||||||
this._desktopSettings.connect('changed', Lang.bind(this, this._update));
|
this._desktopSettings.connect('changed', Lang.bind(this, this._update));
|
||||||
@ -687,55 +687,72 @@ const EventsList = new Lang.Class({
|
|||||||
this._eventSource.connect('changed', Lang.bind(this, this._update));
|
this._eventSource.connect('changed', Lang.bind(this, this._update));
|
||||||
},
|
},
|
||||||
|
|
||||||
_addEvent: function(dayNameBox, timeBox, eventTitleBox, includeDayName, day, time, desc) {
|
_addEvent: function(event, index, includeDayName) {
|
||||||
if (includeDayName) {
|
let dayString;
|
||||||
dayNameBox.add(new St.Label( { style_class: 'events-day-dayname',
|
if (includeDayName)
|
||||||
text: day } ),
|
dayString = _getEventDayAbbreviation(event.date.getDay());
|
||||||
{ x_fill: true } );
|
else
|
||||||
}
|
dayString = '';
|
||||||
timeBox.add(new St.Label( { style_class: 'events-day-time',
|
|
||||||
text: time} ),
|
let dayLabel = new St.Label({ style_class: 'events-day-dayname',
|
||||||
{ x_fill: true } );
|
text: dayString });
|
||||||
eventTitleBox.add(new St.Label( { style_class: 'events-day-task',
|
dayLabel.clutter_text.line_wrap = false;
|
||||||
text: desc} ));
|
dayLabel.clutter_text.ellipsize = false;
|
||||||
|
|
||||||
|
this.actor.add(dayLabel, { row: index, col: 0,
|
||||||
|
x_expand: false, x_align: St.Align.END,
|
||||||
|
y_fill: false, y_align: St.Align.START });
|
||||||
|
|
||||||
|
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
|
||||||
|
let timeString = _formatEventTime(event, clockFormat);
|
||||||
|
let timeLabel = new St.Label({ style_class: 'events-day-time',
|
||||||
|
text: timeString });
|
||||||
|
timeLabel.clutter_text.line_wrap = false;
|
||||||
|
timeLabel.clutter_text.ellipsize = false;
|
||||||
|
|
||||||
|
this.actor.add(timeLabel, { row: index, col: 1,
|
||||||
|
x_expand: false, x_align: St.Align.MIDDLE,
|
||||||
|
y_fill: false, y_align: St.Align.START });
|
||||||
|
|
||||||
|
let titleLabel = new St.Label({ style_class: 'events-day-task',
|
||||||
|
text: event.summary });
|
||||||
|
titleLabel.clutter_text.line_wrap = true;
|
||||||
|
titleLabel.clutter_text.ellipsize = false;
|
||||||
|
|
||||||
|
this.actor.add(titleLabel, { row: index, col: 2,
|
||||||
|
x_expand: true, x_align: St.Align.START,
|
||||||
|
y_fill: false, y_align: St.Align.START });
|
||||||
},
|
},
|
||||||
|
|
||||||
_addPeriod: function(header, begin, end, includeDayName, showNothingScheduled) {
|
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
|
||||||
let events = this._eventSource.getEvents(begin, end);
|
let events = this._eventSource.getEvents(begin, end);
|
||||||
|
|
||||||
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);;
|
|
||||||
|
|
||||||
if (events.length == 0 && !showNothingScheduled)
|
if (events.length == 0 && !showNothingScheduled)
|
||||||
return;
|
return index;
|
||||||
|
|
||||||
let vbox = new St.BoxLayout( {vertical: true} );
|
this.actor.add(new St.Label({ style_class: 'events-day-header', text: header }),
|
||||||
this.actor.add(vbox);
|
{ row: index, col: 0, col_span: 3,
|
||||||
|
// In theory, x_expand should be true here, but x_expand
|
||||||
vbox.add(new St.Label({ style_class: 'events-day-header', text: header }));
|
// is a property of the column for StTable, ie all day cells
|
||||||
let box = new St.BoxLayout({style_class: 'events-header-hbox'});
|
// get it too
|
||||||
let dayNameBox = new St.BoxLayout({ vertical: true, style_class: 'events-day-name-box' });
|
x_expand: false, x_align: St.Align.START,
|
||||||
let timeBox = new St.BoxLayout({ vertical: true, style_class: 'events-time-box' });
|
y_fill: false, y_align: St.Align.START });
|
||||||
let eventTitleBox = new St.BoxLayout({ vertical: true, style_class: 'events-event-box' });
|
index++;
|
||||||
box.add(dayNameBox, {x_fill: false});
|
|
||||||
box.add(timeBox, {x_fill: false});
|
|
||||||
box.add(eventTitleBox, {expand: true});
|
|
||||||
vbox.add(box);
|
|
||||||
|
|
||||||
for (let n = 0; n < events.length; n++) {
|
for (let n = 0; n < events.length; n++) {
|
||||||
let event = events[n];
|
this._addEvent(events[n], index, includeDayName);
|
||||||
let dayString = _getEventDayAbbreviation(event.date.getDay());
|
index++;
|
||||||
let timeString = _formatEventTime(event, clockFormat);
|
|
||||||
let summaryString = event.summary;
|
|
||||||
this._addEvent(dayNameBox, timeBox, eventTitleBox, includeDayName, dayString, timeString, summaryString);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (events.length == 0 && showNothingScheduled) {
|
if (events.length == 0 && showNothingScheduled) {
|
||||||
let now = new Date();
|
let now = new Date();
|
||||||
/* Translators: Text to show if there are no events */
|
/* Translators: Text to show if there are no events */
|
||||||
let nothingEvent = new CalendarEvent(now, now, _("Nothing Scheduled"), true);
|
let nothingEvent = new CalendarEvent(now, now, _("Nothing Scheduled"), true);
|
||||||
let timeString = _formatEventTime(nothingEvent, clockFormat);
|
this._addEvent(nothingEvent, index, false);
|
||||||
this._addEvent(dayNameBox, timeBox, eventTitleBox, false, "", timeString, nothingEvent.summary);
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
},
|
},
|
||||||
|
|
||||||
_showOtherDay: function(day) {
|
_showOtherDay: function(day) {
|
||||||
@ -752,20 +769,21 @@ const EventsList = new Lang.Class({
|
|||||||
else
|
else
|
||||||
/* Translators: Shown on calendar heading when selected day occurs on different year */
|
/* Translators: Shown on calendar heading when selected day occurs on different year */
|
||||||
dayString = day.toLocaleFormat(C_("calendar heading", "%A, %B %d, %Y"));
|
dayString = day.toLocaleFormat(C_("calendar heading", "%A, %B %d, %Y"));
|
||||||
this._addPeriod(dayString, dayBegin, dayEnd, false, true);
|
this._addPeriod(dayString, 0, dayBegin, dayEnd, false, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
_showToday: function() {
|
_showToday: function() {
|
||||||
this.actor.destroy_all_children();
|
this.actor.destroy_all_children();
|
||||||
|
let index = 0;
|
||||||
|
|
||||||
let now = new Date();
|
let now = new Date();
|
||||||
let dayBegin = _getBeginningOfDay(now);
|
let dayBegin = _getBeginningOfDay(now);
|
||||||
let dayEnd = _getEndOfDay(now);
|
let dayEnd = _getEndOfDay(now);
|
||||||
this._addPeriod(_("Today"), dayBegin, dayEnd, false, true);
|
index = this._addPeriod(_("Today"), index, dayBegin, dayEnd, false, true);
|
||||||
|
|
||||||
let tomorrowBegin = new Date(dayBegin.getTime() + 86400 * 1000);
|
let tomorrowBegin = new Date(dayBegin.getTime() + 86400 * 1000);
|
||||||
let tomorrowEnd = new Date(dayEnd.getTime() + 86400 * 1000);
|
let tomorrowEnd = new Date(dayEnd.getTime() + 86400 * 1000);
|
||||||
this._addPeriod(_("Tomorrow"), tomorrowBegin, tomorrowEnd, false, true);
|
index = this._addPeriod(_("Tomorrow"), index, tomorrowBegin, tomorrowEnd, false, true);
|
||||||
|
|
||||||
let dayInWeek = (dayEnd.getDay() - this._weekStart + 7) % 7;
|
let dayInWeek = (dayEnd.getDay() - this._weekStart + 7) % 7;
|
||||||
|
|
||||||
@ -776,7 +794,7 @@ const EventsList = new Lang.Class({
|
|||||||
*/
|
*/
|
||||||
let thisWeekBegin = new Date(dayBegin.getTime() + 2 * 86400 * 1000);
|
let thisWeekBegin = new Date(dayBegin.getTime() + 2 * 86400 * 1000);
|
||||||
let thisWeekEnd = new Date(dayEnd.getTime() + (6 - dayInWeek) * 86400 * 1000);
|
let thisWeekEnd = new Date(dayEnd.getTime() + (6 - dayInWeek) * 86400 * 1000);
|
||||||
this._addPeriod(_("This week"), thisWeekBegin, thisWeekEnd, true, false);
|
index = this._addPeriod(_("This week"), index, thisWeekBegin, thisWeekEnd, true, false);
|
||||||
} else {
|
} else {
|
||||||
/* otherwise it's one of the two last days of the week ... show
|
/* otherwise it's one of the two last days of the week ... show
|
||||||
* "Next week" and include events up until and including *next*
|
* "Next week" and include events up until and including *next*
|
||||||
@ -784,7 +802,7 @@ const EventsList = new Lang.Class({
|
|||||||
*/
|
*/
|
||||||
let nextWeekBegin = new Date(dayBegin.getTime() + 2 * 86400 * 1000);
|
let nextWeekBegin = new Date(dayBegin.getTime() + 2 * 86400 * 1000);
|
||||||
let nextWeekEnd = new Date(dayEnd.getTime() + (13 - dayInWeek) * 86400 * 1000);
|
let nextWeekEnd = new Date(dayEnd.getTime() + (13 - dayInWeek) * 86400 * 1000);
|
||||||
this._addPeriod(_("Next week"), nextWeekBegin, nextWeekEnd, true, false);
|
index = this._addPeriod(_("Next week"), index, nextWeekBegin, nextWeekEnd, true, false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ function shouldAutorunMount(mount, forTransient) {
|
|||||||
if (!volume || (!volume.allowAutorun && forTransient))
|
if (!volume || (!volume.allowAutorun && forTransient))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!root.is_native() || isMountRootHidden(root))
|
if (root.is_native() && isMountRootHidden(root))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -16,7 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent;
|
|||||||
const Components = imports.ui.components;
|
const Components = imports.ui.components;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const UserMenu = imports.ui.userMenu;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
const DIALOG_ICON_SIZE = 48;
|
const DIALOG_ICON_SIZE = 48;
|
||||||
|
|
||||||
@ -100,9 +100,9 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
messageBox.add(userBox);
|
messageBox.add(userBox);
|
||||||
this._userAvatar = new UserMenu.UserAvatarWidget(this._user,
|
this._userAvatar = new UserWidget.Avatar(this._user,
|
||||||
{ iconSize: DIALOG_ICON_SIZE,
|
{ iconSize: DIALOG_ICON_SIZE,
|
||||||
styleClass: 'polkit-dialog-user-icon' });
|
styleClass: 'polkit-dialog-user-icon' });
|
||||||
this._userAvatar.actor.hide();
|
this._userAvatar.actor.hide();
|
||||||
userBox.add(this._userAvatar.actor,
|
userBox.add(this._userAvatar.actor,
|
||||||
{ x_fill: true,
|
{ x_fill: true,
|
||||||
|
@ -18,7 +18,7 @@ const Params = imports.misc.params;
|
|||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
// See Notification.appendMessage
|
// See Notification.appendMessage
|
||||||
const SCROLLBACK_IMMEDIATE_TIME = 60; // 1 minute
|
const SCROLLBACK_IMMEDIATE_TIME = 3 * 60; // 3 minutes
|
||||||
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
||||||
const SCROLLBACK_RECENT_LENGTH = 20;
|
const SCROLLBACK_RECENT_LENGTH = 20;
|
||||||
const SCROLLBACK_IDLE_LENGTH = 5;
|
const SCROLLBACK_IDLE_LENGTH = 5;
|
||||||
@ -967,7 +967,8 @@ const ChatNotification = new Lang.Class({
|
|||||||
let timeLabel = this._append({ body: this._formatTimestamp(lastMessageDate),
|
let timeLabel = this._append({ body: this._formatTimestamp(lastMessageDate),
|
||||||
group: 'meta',
|
group: 'meta',
|
||||||
styles: ['chat-meta-message'],
|
styles: ['chat-meta-message'],
|
||||||
childProps: { expand: true, x_fill: false },
|
childProps: { expand: true, x_fill: false,
|
||||||
|
x_align: St.Align.END },
|
||||||
noTimestamp: true,
|
noTimestamp: true,
|
||||||
timestamp: lastMessageTime });
|
timestamp: lastMessageTime });
|
||||||
|
|
||||||
|
@ -58,14 +58,10 @@ const CtrlAltTabManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
focusGroup: function(item, timestamp) {
|
focusGroup: function(item, timestamp) {
|
||||||
if (item.focusCallback) {
|
if (item.focusCallback)
|
||||||
item.focusCallback(timestamp);
|
item.focusCallback(timestamp);
|
||||||
} else {
|
else
|
||||||
if (global.stage_input_mode == Shell.StageInputMode.NORMAL)
|
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
|
|
||||||
|
|
||||||
item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Sort the items into a consistent order; panel first, tray last,
|
// Sort the items into a consistent order; panel first, tray last,
|
||||||
@ -136,8 +132,6 @@ const CtrlAltTabManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_focusWindows: function(timestamp) {
|
_focusWindows: function(timestamp) {
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
|
||||||
global.stage.key_focus = null;
|
|
||||||
global.screen.focus_default_window(timestamp);
|
global.screen.focus_default_window(timestamp);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -287,13 +287,7 @@ const ShowAppsIcon = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
handleDragOver: function(source, actor, x, y, time) {
|
handleDragOver: function(source, actor, x, y, time) {
|
||||||
let app = getAppFromSource(source);
|
if (!this._canRemoveApp(getAppFromSource(source)))
|
||||||
if (app == null)
|
|
||||||
return DND.DragMotionResult.NO_DROP;
|
|
||||||
|
|
||||||
let id = app.get_id();
|
|
||||||
let isFavorite = AppFavorites.getAppFavorites().isFavorite(id);
|
|
||||||
if (!isFavorite)
|
|
||||||
return DND.DragMotionResult.NO_DROP;
|
return DND.DragMotionResult.NO_DROP;
|
||||||
|
|
||||||
return DND.DragMotionResult.MOVE_DROP;
|
return DND.DragMotionResult.MOVE_DROP;
|
||||||
@ -301,7 +295,7 @@ const ShowAppsIcon = new Lang.Class({
|
|||||||
|
|
||||||
acceptDrop: function(source, actor, x, y, time) {
|
acceptDrop: function(source, actor, x, y, time) {
|
||||||
let app = getAppFromSource(source);
|
let app = getAppFromSource(source);
|
||||||
if (app == null)
|
if (!this._canRemoveApp(app))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
let id = app.get_id();
|
let id = app.get_id();
|
||||||
@ -326,6 +320,16 @@ const DragPlaceholderItem = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const EmptyDropTargetItem = new Lang.Class({
|
||||||
|
Name: 'EmptyDropTargetItem',
|
||||||
|
Extends: DashItemContainer,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent();
|
||||||
|
this.setChild(new St.Bin({ style_class: 'empty-dash-drop-target' }));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const DashActor = new Lang.Class({
|
const DashActor = new Lang.Class({
|
||||||
Name: 'DashActor',
|
Name: 'DashActor',
|
||||||
Extends: St.Widget,
|
Extends: St.Widget,
|
||||||
@ -441,6 +445,12 @@ const Dash = new Lang.Class({
|
|||||||
dragMotion: Lang.bind(this, this._onDragMotion)
|
dragMotion: Lang.bind(this, this._onDragMotion)
|
||||||
};
|
};
|
||||||
DND.addDragMonitor(this._dragMonitor);
|
DND.addDragMonitor(this._dragMonitor);
|
||||||
|
|
||||||
|
if (this._box.get_n_children() == 0) {
|
||||||
|
this._emptyDropTarget = new EmptyDropTargetItem();
|
||||||
|
this._box.insert_child_at_index(this._emptyDropTarget, 0);
|
||||||
|
this._emptyDropTarget.show(true);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onDragCancelled: function() {
|
_onDragCancelled: function() {
|
||||||
@ -457,6 +467,7 @@ const Dash = new Lang.Class({
|
|||||||
|
|
||||||
_endDrag: function() {
|
_endDrag: function() {
|
||||||
this._clearDragPlaceholder();
|
this._clearDragPlaceholder();
|
||||||
|
this._clearEmptyDropTarget();
|
||||||
this._showAppsIcon.setDragApp(null);
|
this._showAppsIcon.setDragApp(null);
|
||||||
DND.removeDragMonitor(this._dragMonitor);
|
DND.removeDragMonitor(this._dragMonitor);
|
||||||
},
|
},
|
||||||
@ -797,9 +808,21 @@ const Dash = new Lang.Class({
|
|||||||
|
|
||||||
_clearDragPlaceholder: function() {
|
_clearDragPlaceholder: function() {
|
||||||
if (this._dragPlaceholder) {
|
if (this._dragPlaceholder) {
|
||||||
|
this._animatingPlaceholdersCount++;
|
||||||
this._dragPlaceholder.animateOutAndDestroy();
|
this._dragPlaceholder.animateOutAndDestroy();
|
||||||
|
this._dragPlaceholder.connect('destroy',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._animatingPlaceholdersCount--;
|
||||||
|
}));
|
||||||
this._dragPlaceholder = null;
|
this._dragPlaceholder = null;
|
||||||
this._dragPlaceholderPos = -1;
|
}
|
||||||
|
this._dragPlaceholderPos = -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
_clearEmptyDropTarget: function() {
|
||||||
|
if (this._emptyDropTarget) {
|
||||||
|
this._emptyDropTarget.animateOutAndDestroy();
|
||||||
|
this._emptyDropTarget = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -827,23 +850,18 @@ const Dash = new Lang.Class({
|
|||||||
numChildren--;
|
numChildren--;
|
||||||
}
|
}
|
||||||
|
|
||||||
let pos = Math.floor(y * numChildren / boxHeight);
|
let pos;
|
||||||
|
if (!this._emptyDropTarget)
|
||||||
|
pos = Math.floor(y * numChildren / boxHeight);
|
||||||
|
else
|
||||||
|
pos = 0; // always insert at the top when dash is empty
|
||||||
|
|
||||||
if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
|
if (pos != this._dragPlaceholderPos && pos <= numFavorites && this._animatingPlaceholdersCount == 0) {
|
||||||
this._dragPlaceholderPos = pos;
|
this._dragPlaceholderPos = pos;
|
||||||
|
|
||||||
// Don't allow positioning before or after self
|
// Don't allow positioning before or after self
|
||||||
if (favPos != -1 && (pos == favPos || pos == favPos + 1)) {
|
if (favPos != -1 && (pos == favPos || pos == favPos + 1)) {
|
||||||
if (this._dragPlaceholder) {
|
this._clearDragPlaceholder();
|
||||||
this._dragPlaceholder.animateOutAndDestroy();
|
|
||||||
this._animatingPlaceholdersCount++;
|
|
||||||
this._dragPlaceholder.connect('destroy',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._animatingPlaceholdersCount--;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
this._dragPlaceholder = null;
|
|
||||||
|
|
||||||
return DND.DragMotionResult.CONTINUE;
|
return DND.DragMotionResult.CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -868,9 +886,9 @@ const Dash = new Lang.Class({
|
|||||||
|
|
||||||
// Remove the drag placeholder if we are not in the
|
// Remove the drag placeholder if we are not in the
|
||||||
// "favorites zone"
|
// "favorites zone"
|
||||||
if (pos > numFavorites && this._dragPlaceholder) {
|
if (pos > numFavorites)
|
||||||
this._clearDragPlaceholder();
|
this._clearDragPlaceholder();
|
||||||
}
|
|
||||||
if (!this._dragPlaceholder)
|
if (!this._dragPlaceholder)
|
||||||
return DND.DragMotionResult.NO_DROP;
|
return DND.DragMotionResult.NO_DROP;
|
||||||
|
|
||||||
|
@ -80,8 +80,7 @@ const DateMenuButton = new Lang.Class({
|
|||||||
vbox.add(this._calendar.actor);
|
vbox.add(this._calendar.actor);
|
||||||
|
|
||||||
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
separator.setColumnWidths(1);
|
vbox.add(separator.actor, { y_align: St.Align.END, expand: true, y_fill: false });
|
||||||
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
|
||||||
|
|
||||||
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
|
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
|
||||||
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
|
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
|
||||||
@ -107,12 +106,7 @@ const DateMenuButton = new Lang.Class({
|
|||||||
hbox.add(this._separator);
|
hbox.add(this._separator);
|
||||||
|
|
||||||
// Fill up the second column
|
// Fill up the second column
|
||||||
vbox = new St.BoxLayout({ name: 'calendarEventsArea',
|
hbox.add(this._eventList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
|
||||||
vertical: true });
|
|
||||||
hbox.add(vbox, { expand: true });
|
|
||||||
|
|
||||||
// Event list
|
|
||||||
vbox.add(this._eventList.actor, { expand: true });
|
|
||||||
|
|
||||||
// Whenever the menu is opened, select today
|
// Whenever the menu is opened, select today
|
||||||
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
|
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
|
||||||
@ -159,15 +153,14 @@ const DateMenuButton = new Lang.Class({
|
|||||||
this._openClocksItem.actor.visible = visible &&
|
this._openClocksItem.actor.visible = visible &&
|
||||||
(this._getClockApp() != null);
|
(this._getClockApp() != null);
|
||||||
this._separator.visible = visible;
|
this._separator.visible = visible;
|
||||||
|
this._eventList.actor.visible = visible;
|
||||||
if (visible) {
|
if (visible) {
|
||||||
let alignment = 0.25;
|
let alignment = 0.25;
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||||
alignment = 1.0 - alignment;
|
alignment = 1.0 - alignment;
|
||||||
this.menu._arrowAlignment = alignment;
|
this.menu._arrowAlignment = alignment;
|
||||||
this._eventList.actor.get_parent().show();
|
|
||||||
} else {
|
} else {
|
||||||
this.menu._arrowAlignment = 0.5;
|
this.menu._arrowAlignment = 0.5;
|
||||||
this._eventList.actor.get_parent().hide();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
117
js/ui/dnd.js
117
js/ui/dnd.js
@ -1,6 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
@ -147,16 +148,16 @@ const _Draggable = new Lang.Class({
|
|||||||
|
|
||||||
_grabEvents: function() {
|
_grabEvents: function() {
|
||||||
if (!this._eventsGrabbed) {
|
if (!this._eventsGrabbed) {
|
||||||
Clutter.grab_pointer(_getEventHandlerActor());
|
this._eventsGrabbed = Main.pushModal(_getEventHandlerActor());
|
||||||
Clutter.grab_keyboard(_getEventHandlerActor());
|
if (this._eventsGrabbed)
|
||||||
this._eventsGrabbed = true;
|
Clutter.grab_pointer(_getEventHandlerActor());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_ungrabEvents: function() {
|
_ungrabEvents: function() {
|
||||||
if (this._eventsGrabbed) {
|
if (this._eventsGrabbed) {
|
||||||
Clutter.ungrab_pointer();
|
Clutter.ungrab_pointer();
|
||||||
Clutter.ungrab_keyboard();
|
Main.popModal(_getEventHandlerActor());
|
||||||
this._eventsGrabbed = false;
|
this._eventsGrabbed = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -358,60 +359,65 @@ const _Draggable = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateDragHover : function () {
|
||||||
|
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
||||||
|
this._dragX, this._dragY);
|
||||||
|
let dragEvent = {
|
||||||
|
x: this._dragX,
|
||||||
|
y: this._dragY,
|
||||||
|
dragActor: this._dragActor,
|
||||||
|
source: this.actor._delegate,
|
||||||
|
targetActor: target
|
||||||
|
};
|
||||||
|
for (let i = 0; i < dragMonitors.length; i++) {
|
||||||
|
let motionFunc = dragMonitors[i].dragMotion;
|
||||||
|
if (motionFunc) {
|
||||||
|
let result = motionFunc(dragEvent);
|
||||||
|
if (result != DragMotionResult.CONTINUE) {
|
||||||
|
global.set_cursor(DRAG_CURSOR_MAP[result]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (target) {
|
||||||
|
if (target._delegate && target._delegate.handleDragOver) {
|
||||||
|
let [r, targX, targY] = target.transform_stage_point(this._dragX, this._dragY);
|
||||||
|
// We currently loop through all parents on drag-over even if one of the children has handled it.
|
||||||
|
// We can check the return value of the function and break the loop if it's true if we don't want
|
||||||
|
// to continue checking the parents.
|
||||||
|
let result = target._delegate.handleDragOver(this.actor._delegate,
|
||||||
|
this._dragActor,
|
||||||
|
targX,
|
||||||
|
targY,
|
||||||
|
0);
|
||||||
|
if (result != DragMotionResult.CONTINUE) {
|
||||||
|
global.set_cursor(DRAG_CURSOR_MAP[result]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
target = target.get_parent();
|
||||||
|
}
|
||||||
|
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
_queueUpdateDragHover: function() {
|
||||||
|
if (this._updateHoverId)
|
||||||
|
GLib.source_remove(this._updateHoverId);
|
||||||
|
|
||||||
|
this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT,
|
||||||
|
Lang.bind(this, this._updateDragHover));
|
||||||
|
},
|
||||||
|
|
||||||
_updateDragPosition : function (event) {
|
_updateDragPosition : function (event) {
|
||||||
let [stageX, stageY] = event.get_coords();
|
let [stageX, stageY] = event.get_coords();
|
||||||
this._dragX = stageX;
|
this._dragX = stageX;
|
||||||
this._dragY = stageY;
|
this._dragY = stageY;
|
||||||
|
this._dragActor.set_position(stageX + this._dragOffsetX,
|
||||||
|
stageY + this._dragOffsetY);
|
||||||
|
|
||||||
// If we are dragging, update the position
|
this._queueUpdateDragHover();
|
||||||
if (this._dragActor) {
|
|
||||||
this._dragActor.set_position(stageX + this._dragOffsetX,
|
|
||||||
stageY + this._dragOffsetY);
|
|
||||||
|
|
||||||
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
|
|
||||||
stageX, stageY);
|
|
||||||
|
|
||||||
// We call observers only once per motion with the innermost
|
|
||||||
// target actor. If necessary, the observer can walk the
|
|
||||||
// parent itself.
|
|
||||||
let dragEvent = {
|
|
||||||
x: stageX,
|
|
||||||
y: stageY,
|
|
||||||
dragActor: this._dragActor,
|
|
||||||
source: this.actor._delegate,
|
|
||||||
targetActor: target
|
|
||||||
};
|
|
||||||
for (let i = 0; i < dragMonitors.length; i++) {
|
|
||||||
let motionFunc = dragMonitors[i].dragMotion;
|
|
||||||
if (motionFunc) {
|
|
||||||
let result = motionFunc(dragEvent);
|
|
||||||
if (result != DragMotionResult.CONTINUE) {
|
|
||||||
global.set_cursor(DRAG_CURSOR_MAP[result]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (target) {
|
|
||||||
if (target._delegate && target._delegate.handleDragOver) {
|
|
||||||
let [r, targX, targY] = target.transform_stage_point(stageX, stageY);
|
|
||||||
// We currently loop through all parents on drag-over even if one of the children has handled it.
|
|
||||||
// We can check the return value of the function and break the loop if it's true if we don't want
|
|
||||||
// to continue checking the parents.
|
|
||||||
let result = target._delegate.handleDragOver(this.actor._delegate,
|
|
||||||
this._dragActor,
|
|
||||||
targX,
|
|
||||||
targY,
|
|
||||||
event.get_time());
|
|
||||||
if (result != DragMotionResult.CONTINUE) {
|
|
||||||
global.set_cursor(DRAG_CURSOR_MAP[result]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
target = target.get_parent();
|
|
||||||
}
|
|
||||||
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -511,6 +517,11 @@ const _Draggable = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_cancelDrag: function(eventTime) {
|
_cancelDrag: function(eventTime) {
|
||||||
|
if (this._updateHoverId) {
|
||||||
|
GLib.source_remove(this._updateHoverId);
|
||||||
|
this._updateHoverId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('drag-cancelled', eventTime);
|
this.emit('drag-cancelled', eventTime);
|
||||||
this._dragInProgress = false;
|
this._dragInProgress = false;
|
||||||
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
|
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
|
||||||
|
@ -35,7 +35,7 @@ const GnomeSession = imports.misc.gnomeSession;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserMenu = imports.ui.userMenu;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
let _endSessionDialog = null;
|
let _endSessionDialog = null;
|
||||||
|
|
||||||
@ -360,9 +360,9 @@ const EndSessionDialog = new Lang.Class({
|
|||||||
icon_size: _DIALOG_ICON_SIZE,
|
icon_size: _DIALOG_ICON_SIZE,
|
||||||
style_class: dialogContent.iconStyleClass });
|
style_class: dialogContent.iconStyleClass });
|
||||||
} else {
|
} else {
|
||||||
let avatarWidget = new UserMenu.UserAvatarWidget(this._user,
|
let avatarWidget = new UserWidget.Avatar(this._user,
|
||||||
{ iconSize: _DIALOG_ICON_SIZE,
|
{ iconSize: _DIALOG_ICON_SIZE,
|
||||||
styleClass: dialogContent.iconStyleClass });
|
styleClass: dialogContent.iconStyleClass });
|
||||||
this._iconBin.child = avatarWidget.actor;
|
this._iconBin.child = avatarWidget.actor;
|
||||||
avatarWidget.update();
|
avatarWidget.update();
|
||||||
}
|
}
|
||||||
@ -420,6 +420,7 @@ const EndSessionDialog = new Lang.Class({
|
|||||||
_startTimer: function() {
|
_startTimer: function() {
|
||||||
let startTime = GLib.get_monotonic_time();
|
let startTime = GLib.get_monotonic_time();
|
||||||
this._secondsLeft = this._totalSecondsToStayOpen;
|
this._secondsLeft = this._totalSecondsToStayOpen;
|
||||||
|
this._updateDescription();
|
||||||
|
|
||||||
this._timerId = Mainloop.timeout_add_seconds(1, Lang.bind(this,
|
this._timerId = Mainloop.timeout_add_seconds(1, Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
|
@ -32,13 +32,9 @@ const GrabHelper = new Lang.Class({
|
|||||||
|
|
||||||
this._actors = [];
|
this._actors = [];
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
this._keyFocusNotifyId = 0;
|
|
||||||
this._focusWindowChangedId = 0;
|
|
||||||
this._ignoreRelease = false;
|
this._ignoreRelease = false;
|
||||||
this._isUngrabbingCount = 0;
|
|
||||||
|
|
||||||
this._modalCount = 0;
|
this._modalCount = 0;
|
||||||
this._grabFocusCount = 0;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// addActor:
|
// addActor:
|
||||||
@ -118,38 +114,36 @@ const GrabHelper = new Lang.Class({
|
|||||||
// grab:
|
// grab:
|
||||||
// @params: A bunch of parameters, see below
|
// @params: A bunch of parameters, see below
|
||||||
//
|
//
|
||||||
// Grabs the mouse and keyboard, according to the GrabHelper's
|
// The general effect of a "grab" is to ensure that the passed in actor
|
||||||
// parameters. If @newFocus is not %null, then the keyboard focus
|
// and all actors inside the grab get exclusive control of the mouse and
|
||||||
// is moved to the first #StWidget:can-focus widget inside it.
|
// keyboard, with the grab automatically being dropped if the user tries
|
||||||
|
// to dismiss it. The actor is passed in through @params.actor.
|
||||||
//
|
//
|
||||||
// The grab will automatically be dropped if:
|
// grab() can be called multiple times, with the scope of the grab being
|
||||||
// - The user clicks outside the grabbed actors
|
// changed to a different actor every time. A nested grab does not have
|
||||||
// - The user types Escape
|
// to have its grabbed actor inside the parent grab actors.
|
||||||
// - The keyboard focus is moved outside the grabbed actors
|
|
||||||
// - A window is focused
|
|
||||||
//
|
//
|
||||||
// If @params.actor is not null, then it will be focused as the
|
// Grabs can be automatically dropped if the user tries to dismiss it
|
||||||
// new actor. If you attempt to grab an already focused actor, the
|
// in one of two ways: the user clicking outside the currently grabbed
|
||||||
// request to be focused will be ignored. The actor will not be
|
// actor, or the user typing the Escape key.
|
||||||
// added to the grab stack, so do not call a paired ungrab().
|
|
||||||
//
|
//
|
||||||
// If @params contains { modal: true }, then grab() will push a modal
|
// If the user clicks outside the grabbed actors, and the clicked on
|
||||||
// on the owner of the GrabHelper. As long as there is at least one
|
// actor is part of a previous grab in the stack, grabs will be popped
|
||||||
// { modal: true } actor on the grab stack, the grab will be kept.
|
// until that grab is active. However, the click event will not be
|
||||||
// When the last { modal: true } actor is ungrabbed, then the modal
|
// replayed to the actor.
|
||||||
// will be dropped. A modal grab can fail if there is already a grab
|
|
||||||
// in effect from aother application; in this case the function returns
|
|
||||||
// false and nothing happens. Non-modal grabs can never fail.
|
|
||||||
//
|
//
|
||||||
// If @params contains { grabFocus: true }, then if you call grab()
|
// If the user types the Escape key, one grab from the grab stack will
|
||||||
// while the shell is outside the overview, it will set the stage
|
// be popped.
|
||||||
// input mode to %Shell.StageInputMode.FOCUSED, and ungrab() will
|
//
|
||||||
// revert it back, and re-focus the previously-focused window (if
|
// When a grab is popped by user interacting as described above, if you
|
||||||
// another window hasn't been explicitly focused before then).
|
// pass a callback as @params.onUngrab, it will be called with %true.
|
||||||
|
//
|
||||||
|
// If @params.focus is not null, we'll set the key focus directly
|
||||||
|
// to that actor instead of navigating in @params.actor. This is for
|
||||||
|
// use cases like menus, where we want to grab the menu actor, but keep
|
||||||
|
// focus on the clicked on menu item.
|
||||||
grab: function(params) {
|
grab: function(params) {
|
||||||
params = Params.parse(params, { actor: null,
|
params = Params.parse(params, { actor: null,
|
||||||
modal: false,
|
|
||||||
grabFocus: false,
|
|
||||||
focus: null,
|
focus: null,
|
||||||
onUngrab: null });
|
onUngrab: null });
|
||||||
|
|
||||||
@ -162,24 +156,18 @@ const GrabHelper = new Lang.Class({
|
|||||||
|
|
||||||
params.savedFocus = focus;
|
params.savedFocus = focus;
|
||||||
|
|
||||||
if (params.modal && !this._takeModalGrab())
|
if (!this._takeModalGrab())
|
||||||
return false;
|
|
||||||
|
|
||||||
if (params.grabFocus && !this._takeFocusGrab(hadFocus))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this._grabStack.push(params);
|
this._grabStack.push(params);
|
||||||
|
|
||||||
if (params.focus) {
|
if (params.focus) {
|
||||||
params.focus.grab_key_focus();
|
params.focus.grab_key_focus();
|
||||||
} else if (newFocus && (hadFocus || params.grabFocus)) {
|
} else if (newFocus && hadFocus) {
|
||||||
if (!newFocus.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false))
|
if (!newFocus.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false))
|
||||||
newFocus.grab_key_focus();
|
newFocus.grab_key_focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((params.grabFocus || params.modal) && !this._capturedEventId)
|
|
||||||
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -188,6 +176,8 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (firstGrab) {
|
if (firstGrab) {
|
||||||
if (!Main.pushModal(this._owner, this._modalParams))
|
if (!Main.pushModal(this._owner, this._modalParams))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
||||||
}
|
}
|
||||||
|
|
||||||
this._modalCount++;
|
this._modalCount++;
|
||||||
@ -199,56 +189,15 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (this._modalCount > 0)
|
if (this._modalCount > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
global.stage.disconnect(this._capturedEventId);
|
||||||
|
this._capturedEventId = 0;
|
||||||
|
|
||||||
|
this._ignoreRelease = false;
|
||||||
|
|
||||||
Main.popModal(this._owner);
|
Main.popModal(this._owner);
|
||||||
global.sync_pointer();
|
global.sync_pointer();
|
||||||
},
|
},
|
||||||
|
|
||||||
_takeFocusGrab: function(hadFocus) {
|
|
||||||
let firstGrab = (this._grabFocusCount == 0);
|
|
||||||
if (firstGrab) {
|
|
||||||
let metaDisplay = global.screen.get_display();
|
|
||||||
|
|
||||||
this._grabbedFromKeynav = hadFocus;
|
|
||||||
this._preGrabInputMode = global.stage_input_mode;
|
|
||||||
|
|
||||||
if (this._preGrabInputMode == Shell.StageInputMode.NORMAL)
|
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
|
|
||||||
|
|
||||||
this._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
|
|
||||||
this._focusWindowChangedId = metaDisplay.connect('notify::focus-window', Lang.bind(this, this._focusWindowChanged));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._grabFocusCount++;
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_releaseFocusGrab: function() {
|
|
||||||
this._grabFocusCount--;
|
|
||||||
if (this._grabFocusCount > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this._keyFocusNotifyId > 0) {
|
|
||||||
global.stage.disconnect(this._keyFocusNotifyId);
|
|
||||||
this._keyFocusNotifyId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._focusWindowChangedId > 0) {
|
|
||||||
let metaDisplay = global.screen.get_display();
|
|
||||||
metaDisplay.disconnect(this._focusWindowChangedId);
|
|
||||||
this._focusWindowChangedId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
let prePopInputMode = global.stage_input_mode;
|
|
||||||
|
|
||||||
if (this._grabbedFromKeynav) {
|
|
||||||
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED &&
|
|
||||||
prePopInputMode != Shell.StageInputMode.FULLSCREEN)
|
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
|
|
||||||
}
|
|
||||||
|
|
||||||
global.screen.focus_default_window(global.display.get_current_time_roundtrip());
|
|
||||||
},
|
|
||||||
|
|
||||||
// ignoreRelease:
|
// ignoreRelease:
|
||||||
//
|
//
|
||||||
// Make sure that the next button release event evaluated by the
|
// Make sure that the next button release event evaluated by the
|
||||||
@ -262,10 +211,14 @@ const GrabHelper = new Lang.Class({
|
|||||||
// ungrab:
|
// ungrab:
|
||||||
// @params: The parameters for the grab; see below.
|
// @params: The parameters for the grab; see below.
|
||||||
//
|
//
|
||||||
// Pops an actor from the grab stack, potentially dropping the grab.
|
// Pops @params.actor from the grab stack, potentially dropping
|
||||||
|
// the grab. If the actor is not on the grab stack, this call is
|
||||||
|
// ignored with no ill effects.
|
||||||
//
|
//
|
||||||
// If the actor that was popped from the grab stack was not the actor
|
// If the actor is not at the top of the grab stack, grabs are
|
||||||
// That was passed in, this call is ignored.
|
// popped until the grabbed actor is at the top of the grab stack.
|
||||||
|
// The onUngrab callback for every grab is called for every popped
|
||||||
|
// grab with the parameter %false.
|
||||||
ungrab: function(params) {
|
ungrab: function(params) {
|
||||||
params = Params.parse(params, { actor: this.currentGrab.actor,
|
params = Params.parse(params, { actor: this.currentGrab.actor,
|
||||||
isUser: false });
|
isUser: false });
|
||||||
@ -274,14 +227,6 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (grabStackIndex < 0)
|
if (grabStackIndex < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// We may get key focus changes when calling onUngrab, which
|
|
||||||
// would cause an extra ungrab() on the next actor in the
|
|
||||||
// stack, which is wrong. Ignore key focus changes during the
|
|
||||||
// ungrab, and restore the saved key focus ourselves afterwards.
|
|
||||||
// We use a count as ungrab() may be re-entrant, as onUngrab()
|
|
||||||
// may ungrab additional actors.
|
|
||||||
this._isUngrabbingCount++;
|
|
||||||
|
|
||||||
let focus = global.stage.key_focus;
|
let focus = global.stage.key_focus;
|
||||||
let hadFocus = focus && this._isWithinGrabbedActor(focus);
|
let hadFocus = focus && this._isWithinGrabbedActor(focus);
|
||||||
|
|
||||||
@ -296,18 +241,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (poppedGrab.onUngrab)
|
if (poppedGrab.onUngrab)
|
||||||
poppedGrab.onUngrab(params.isUser);
|
poppedGrab.onUngrab(params.isUser);
|
||||||
|
|
||||||
if (poppedGrab.modal)
|
this._releaseModalGrab();
|
||||||
this._releaseModalGrab();
|
|
||||||
|
|
||||||
if (poppedGrab.grabFocus)
|
|
||||||
this._releaseFocusGrab();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.grabbed && this._capturedEventId > 0) {
|
|
||||||
global.stage.disconnect(this._capturedEventId);
|
|
||||||
this._capturedEventId = 0;
|
|
||||||
|
|
||||||
this._ignoreRelease = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hadFocus) {
|
if (hadFocus) {
|
||||||
@ -315,8 +249,6 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (poppedGrab.savedFocus)
|
if (poppedGrab.savedFocus)
|
||||||
poppedGrab.savedFocus.grab_key_focus();
|
poppedGrab.savedFocus.grab_key_focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._isUngrabbingCount--;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onCapturedEvent: function(actor, event) {
|
_onCapturedEvent: function(actor, event) {
|
||||||
@ -337,9 +269,6 @@ const GrabHelper = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!button && this._modalCount == 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (this._isWithinGrabbedActor(event.get_source()))
|
if (this._isWithinGrabbedActor(event.get_source()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -356,21 +285,6 @@ const GrabHelper = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._modalCount > 0;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onKeyFocusChanged: function() {
|
|
||||||
if (this._isUngrabbingCount > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let focus = global.stage.key_focus;
|
|
||||||
if (!focus || !this._isWithinGrabbedActor(focus))
|
|
||||||
this.ungrab({ isUser: true });
|
|
||||||
},
|
|
||||||
|
|
||||||
_focusWindowChanged: function() {
|
|
||||||
let metaDisplay = global.screen.get_display();
|
|
||||||
if (metaDisplay.focus_window != null)
|
|
||||||
this.ungrab({ isUser: true });
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
@ -528,17 +528,10 @@ const LayoutManager = new Lang.Class({
|
|||||||
get focusIndex() {
|
get focusIndex() {
|
||||||
let i = Main.layoutManager.primaryIndex;
|
let i = Main.layoutManager.primaryIndex;
|
||||||
|
|
||||||
if (global.stage_input_mode == Shell.StageInputMode.FOCUSED ||
|
if (global.stage.key_focus != null)
|
||||||
global.stage_input_mode == Shell.StageInputMode.FULLSCREEN) {
|
i = this.findIndexForActor(global.stage.key_focus);
|
||||||
let focusActor = global.stage.key_focus;
|
else if (global.display.focus_window != null)
|
||||||
if (focusActor)
|
i = global.display.focus_window.get_monitor();
|
||||||
i = this.findIndexForActor(focusActor);
|
|
||||||
} else {
|
|
||||||
let focusWindow = global.display.focus_window;
|
|
||||||
if (focusWindow)
|
|
||||||
i = focusWindow.get_monitor();
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -596,9 +589,13 @@ const LayoutManager = new Lang.Class({
|
|||||||
// screen. So, we set no_clear_hint at the end of the animation.
|
// screen. So, we set no_clear_hint at the end of the animation.
|
||||||
|
|
||||||
_prepareStartupAnimation: function() {
|
_prepareStartupAnimation: function() {
|
||||||
// Set ourselves to FULLSCREEN input mode while the animation is running
|
// During the initial transition, add a simple actor to block all events,
|
||||||
// so events don't get delivered to X11 windows (which are distorted by the animation)
|
// so they don't get delivered to X11 windows that have been transformed.
|
||||||
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
|
this._coverPane = new Clutter.Actor({ opacity: 0,
|
||||||
|
width: global.screen_width,
|
||||||
|
height: global.screen_height,
|
||||||
|
reactive: true });
|
||||||
|
this.addChrome(this._coverPane);
|
||||||
|
|
||||||
if (Main.sessionMode.isGreeter) {
|
if (Main.sessionMode.isGreeter) {
|
||||||
this.panelBox.translation_y = -this.panelBox.height;
|
this.panelBox.translation_y = -this.panelBox.height;
|
||||||
@ -668,7 +665,8 @@ const LayoutManager = new Lang.Class({
|
|||||||
// we no longer need to clear the stage
|
// we no longer need to clear the stage
|
||||||
global.stage.no_clear_hint = true;
|
global.stage.no_clear_hint = true;
|
||||||
|
|
||||||
global.stage_input_mode = Shell.StageInputMode.NORMAL;
|
this._coverPane.destroy();
|
||||||
|
this._coverPane = null;
|
||||||
|
|
||||||
this._systemBackground.actor.destroy();
|
this._systemBackground.actor.destroy();
|
||||||
this._systemBackground = null;
|
this._systemBackground = null;
|
||||||
@ -749,6 +747,8 @@ const LayoutManager = new Lang.Class({
|
|||||||
// and shown otherwise)
|
// and shown otherwise)
|
||||||
addChrome: function(actor, params) {
|
addChrome: function(actor, params) {
|
||||||
this.uiGroup.add_actor(actor);
|
this.uiGroup.add_actor(actor);
|
||||||
|
if (this.uiGroup.contains(global.top_window_group))
|
||||||
|
this.uiGroup.set_child_below_sibling(actor, global.top_window_group);
|
||||||
this._trackActor(actor, params);
|
this._trackActor(actor, params);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -849,8 +849,9 @@ const LookingGlass = new Lang.Class({
|
|||||||
this._updateFont();
|
this._updateFont();
|
||||||
|
|
||||||
// We want it to appear to slide out from underneath the panel
|
// We want it to appear to slide out from underneath the panel
|
||||||
Main.layoutManager.panelBox.add_actor(this.actor);
|
Main.uiGroup.add_actor(this.actor);
|
||||||
this.actor.lower_bottom();
|
Main.uiGroup.set_child_below_sibling(this.actor,
|
||||||
|
Main.layoutManager.panelBox);
|
||||||
Main.layoutManager.panelBox.connect('allocation-changed',
|
Main.layoutManager.panelBox.connect('allocation-changed',
|
||||||
Lang.bind(this, this._queueResize));
|
Lang.bind(this, this._queueResize));
|
||||||
Main.layoutManager.keyboardBox.connect('allocation-changed',
|
Main.layoutManager.keyboardBox.connect('allocation-changed',
|
||||||
@ -1072,7 +1073,7 @@ const LookingGlass = new Lang.Class({
|
|||||||
let availableHeight = primary.height - Main.layoutManager.keyboardBox.height;
|
let availableHeight = primary.height - Main.layoutManager.keyboardBox.height;
|
||||||
let myHeight = Math.min(primary.height * 0.7, availableHeight * 0.9);
|
let myHeight = Math.min(primary.height * 0.7, availableHeight * 0.9);
|
||||||
this.actor.x = (primary.width - myWidth) / 2;
|
this.actor.x = (primary.width - myWidth) / 2;
|
||||||
this._hiddenY = this.actor.get_parent().height - myHeight - 4; // -4 to hide the top corners
|
this._hiddenY = Main.layoutManager.panelBox.height - myHeight - 4; // -4 to hide the top corners
|
||||||
this._targetY = this._hiddenY + myHeight;
|
this._targetY = this._hiddenY + myHeight;
|
||||||
this.actor.y = this._hiddenY;
|
this.actor.y = this._hiddenY;
|
||||||
this.actor.width = myWidth;
|
this.actor.width = myWidth;
|
||||||
|
@ -71,6 +71,7 @@ let _startDate;
|
|||||||
let _defaultCssStylesheet = null;
|
let _defaultCssStylesheet = null;
|
||||||
let _cssStylesheet = null;
|
let _cssStylesheet = null;
|
||||||
let _a11ySettings = null;
|
let _a11ySettings = null;
|
||||||
|
let dynamicWorkspacesSchema = null;
|
||||||
|
|
||||||
function _sessionUpdated() {
|
function _sessionUpdated() {
|
||||||
_loadDefaultStylesheet();
|
_loadDefaultStylesheet();
|
||||||
@ -108,6 +109,7 @@ function start() {
|
|||||||
|
|
||||||
function _sessionsLoaded() {
|
function _sessionsLoaded() {
|
||||||
sessionMode.connect('updated', _sessionUpdated);
|
sessionMode.connect('updated', _sessionUpdated);
|
||||||
|
_initializePrefs();
|
||||||
_initializeUI();
|
_initializeUI();
|
||||||
|
|
||||||
shellDBusService = new ShellDBus.GnomeShell();
|
shellDBusService = new ShellDBus.GnomeShell();
|
||||||
@ -116,6 +118,17 @@ function _sessionsLoaded() {
|
|||||||
_sessionUpdated();
|
_sessionUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _initializePrefs() {
|
||||||
|
let keys = new Gio.Settings({ schema: sessionMode.overridesSchema }).list_keys();
|
||||||
|
for (let i = 0; i < keys.length; i++)
|
||||||
|
Meta.prefs_override_preference_schema(keys[i], sessionMode.overridesSchema);
|
||||||
|
|
||||||
|
if (keys.indexOf('dynamic-workspaces') > -1)
|
||||||
|
dynamicWorkspacesSchema = sessionMode.overridesSchema;
|
||||||
|
else
|
||||||
|
dynamicWorkspacesSchema = 'org.gnome.mutter';
|
||||||
|
}
|
||||||
|
|
||||||
function _initializeUI() {
|
function _initializeUI() {
|
||||||
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
||||||
// also initialize ShellAppSystem first. ShellAppSystem
|
// also initialize ShellAppSystem first. ShellAppSystem
|
||||||
@ -343,8 +356,6 @@ function pushModal(actor, params) {
|
|||||||
Meta.disable_unredirect_for_screen(global.screen);
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
|
|
||||||
|
|
||||||
modalCount += 1;
|
modalCount += 1;
|
||||||
let actorDestroyId = actor.connect('destroy', function() {
|
let actorDestroyId = actor.connect('destroy', function() {
|
||||||
let index = _findModal(actor);
|
let index = _findModal(actor);
|
||||||
@ -393,7 +404,6 @@ function popModal(actor, timestamp) {
|
|||||||
if (focusIndex < 0) {
|
if (focusIndex < 0) {
|
||||||
global.stage.set_key_focus(null);
|
global.stage.set_key_focus(null);
|
||||||
global.end_modal(timestamp);
|
global.end_modal(timestamp);
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
|
||||||
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||||
|
|
||||||
throw new Error('incorrect pop');
|
throw new Error('incorrect pop');
|
||||||
@ -441,7 +451,6 @@ function popModal(actor, timestamp) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
global.end_modal(timestamp);
|
global.end_modal(timestamp);
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
|
||||||
Meta.enable_unredirect_for_screen(global.screen);
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,65 @@ function _fixMarkup(text, allowMarkup) {
|
|||||||
return GLib.markup_escape_text(text, -1);
|
return GLib.markup_escape_text(text, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const FocusGrabber = new Lang.Class({
|
||||||
|
Name: 'FocusGrabber',
|
||||||
|
|
||||||
|
_init: function(actor) {
|
||||||
|
this._actor = actor;
|
||||||
|
this._prevKeyFocusActor = null;
|
||||||
|
this._focusActorChangedId = 0;
|
||||||
|
this._focused = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
grabFocus: function() {
|
||||||
|
if (this._focused)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._prevFocusedWindow = global.display.focus_window;
|
||||||
|
this._prevKeyFocusActor = global.stage.get_key_focus();
|
||||||
|
|
||||||
|
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
|
||||||
|
|
||||||
|
if (!this._actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false))
|
||||||
|
this._actor.grab_key_focus();
|
||||||
|
|
||||||
|
this._focused = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_focusUngrabbed: function() {
|
||||||
|
if (!this._focused)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (this._focusActorChangedId > 0) {
|
||||||
|
global.stage.disconnect(this._focusActorChangedId);
|
||||||
|
this._focusActorChangedId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._focused = false;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_focusActorChanged: function() {
|
||||||
|
let focusedActor = global.stage.get_key_focus();
|
||||||
|
if (!focusedActor || !this._actor.contains(focusedActor))
|
||||||
|
this._focusUngrabbed();
|
||||||
|
},
|
||||||
|
|
||||||
|
ungrabFocus: function() {
|
||||||
|
if (!this._focusUngrabbed())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (this._prevKeyFocusActor) {
|
||||||
|
global.stage.set_key_focus(this._prevKeyFocusActor);
|
||||||
|
this._prevKeyFocusActor = null;
|
||||||
|
} else {
|
||||||
|
let focusedActor = global.stage.get_key_focus();
|
||||||
|
if (focusedActor && this._actor.contains(focusedActor))
|
||||||
|
global.stage.set_key_focus(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const URLHighlighter = new Lang.Class({
|
const URLHighlighter = new Lang.Class({
|
||||||
Name: 'URLHighlighter',
|
Name: 'URLHighlighter',
|
||||||
|
|
||||||
@ -1574,6 +1633,7 @@ const MessageTray = new Lang.Class({
|
|||||||
this._notificationBin.set_y_align(Clutter.ActorAlign.START);
|
this._notificationBin.set_y_align(Clutter.ActorAlign.START);
|
||||||
this._notificationWidget.add_actor(this._notificationBin);
|
this._notificationWidget.add_actor(this._notificationBin);
|
||||||
this._notificationWidget.hide();
|
this._notificationWidget.hide();
|
||||||
|
this._notificationFocusGrabber = new FocusGrabber(this._notificationWidget);
|
||||||
this._notificationQueue = [];
|
this._notificationQueue = [];
|
||||||
this._notification = null;
|
this._notification = null;
|
||||||
this._notificationClickedId = 0;
|
this._notificationClickedId = 0;
|
||||||
@ -1623,7 +1683,6 @@ const MessageTray = new Lang.Class({
|
|||||||
{ keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
|
{ keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
|
||||||
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
||||||
this._grabHelper.addActor(this.actor);
|
this._grabHelper.addActor(this.actor);
|
||||||
this._grabHelper.addActor(this._notificationWidget);
|
|
||||||
|
|
||||||
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged));
|
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged));
|
||||||
|
|
||||||
@ -1749,7 +1808,6 @@ const MessageTray = new Lang.Class({
|
|||||||
let [x, y, mask] = global.get_pointer();
|
let [x, y, mask] = global.get_pointer();
|
||||||
this._contextMenu.setPosition(Math.round(x), Math.round(y));
|
this._contextMenu.setPosition(Math.round(x), Math.round(y));
|
||||||
this._grabHelper.grab({ actor: this._contextMenu.actor,
|
this._grabHelper.grab({ actor: this._contextMenu.actor,
|
||||||
modal: true,
|
|
||||||
onUngrab: Lang.bind(this, function () {
|
onUngrab: Lang.bind(this, function () {
|
||||||
this._contextMenu.close(BoxPointer.PopupAnimation.FULL);
|
this._contextMenu.close(BoxPointer.PopupAnimation.FULL);
|
||||||
})
|
})
|
||||||
@ -2316,7 +2374,6 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
_showTray: function() {
|
_showTray: function() {
|
||||||
if (!this._grabHelper.grab({ actor: this.actor,
|
if (!this._grabHelper.grab({ actor: this.actor,
|
||||||
modal: true,
|
|
||||||
onUngrab: Lang.bind(this, this._escapeTray) })) {
|
onUngrab: Lang.bind(this, this._escapeTray) })) {
|
||||||
this._traySummoned = false;
|
this._traySummoned = false;
|
||||||
return false;
|
return false;
|
||||||
@ -2520,19 +2577,7 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_hideNotification: function() {
|
_hideNotification: function() {
|
||||||
// HACK!
|
this._notificationFocusGrabber.ungrabFocus();
|
||||||
// There seems to be a reentrancy issue in calling .ungrab() here,
|
|
||||||
// which causes _updateState to be called before _notificationState
|
|
||||||
// becomes HIDING. That hides the notification again, nullifying the
|
|
||||||
// object but not setting _notificationState (and that's the weird part)
|
|
||||||
// As then _notificationState is stuck into SHOWN but _notification
|
|
||||||
// is null, every new _updateState fails and the message tray is
|
|
||||||
// lost forever.
|
|
||||||
//
|
|
||||||
// See more at https://bugzilla.gnome.org/show_bug.cgi?id=683986
|
|
||||||
this._notificationState = State.HIDING;
|
|
||||||
|
|
||||||
this._grabHelper.ungrab({ actor: this._notification.actor });
|
|
||||||
|
|
||||||
if (this._notificationExpandedId) {
|
if (this._notificationExpandedId) {
|
||||||
this._notification.disconnect(this._notificationExpandedId);
|
this._notification.disconnect(this._notificationExpandedId);
|
||||||
@ -2597,16 +2642,16 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_expandNotification: function(autoExpanding) {
|
_expandNotification: function(autoExpanding) {
|
||||||
// Don't focus notifications that are auto-expanding.
|
|
||||||
if (!autoExpanding)
|
|
||||||
this._ensureNotificationFocused();
|
|
||||||
|
|
||||||
if (!this._notificationExpandedId)
|
if (!this._notificationExpandedId)
|
||||||
this._notificationExpandedId =
|
this._notificationExpandedId =
|
||||||
this._notification.connect('expanded',
|
this._notification.connect('expanded',
|
||||||
Lang.bind(this, this._onNotificationExpanded));
|
Lang.bind(this, this._onNotificationExpanded));
|
||||||
// Don't animate changes in notifications that are auto-expanding.
|
// Don't animate changes in notifications that are auto-expanding.
|
||||||
this._notification.expand(!autoExpanding);
|
this._notification.expand(!autoExpanding);
|
||||||
|
|
||||||
|
// Don't focus notifications that are auto-expanding.
|
||||||
|
if (!autoExpanding)
|
||||||
|
this._ensureNotificationFocused();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onNotificationExpanded: function() {
|
_onNotificationExpanded: function() {
|
||||||
@ -2630,8 +2675,7 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_ensureNotificationFocused: function() {
|
_ensureNotificationFocused: function() {
|
||||||
this._grabHelper.grab({ actor: this._notification.actor,
|
this._notificationFocusGrabber.grabFocus();
|
||||||
grabFocus: true });
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onSourceDoneDisplayingContent: function(source, closeTray) {
|
_onSourceDoneDisplayingContent: function(source, closeTray) {
|
||||||
@ -2674,7 +2718,6 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
this._summaryBoxPointer.bin.child = child;
|
this._summaryBoxPointer.bin.child = child;
|
||||||
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
|
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
|
||||||
modal: true,
|
|
||||||
onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) });
|
onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) });
|
||||||
|
|
||||||
this._summaryBoxPointer.actor.opacity = 0;
|
this._summaryBoxPointer.actor.opacity = 0;
|
||||||
|
@ -14,6 +14,7 @@ const Atk = imports.gi.Atk;
|
|||||||
|
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
|
const Animation = imports.ui.animation;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
const Lightbox = imports.ui.lightbox;
|
const Lightbox = imports.ui.lightbox;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
@ -78,9 +79,8 @@ const ModalDialog = new Lang.Class({
|
|||||||
|
|
||||||
this.dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog',
|
this.dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
if (params.styleClass != null) {
|
if (params.styleClass != null)
|
||||||
this.dialogLayout.add_style_class_name(params.styleClass);
|
this.dialogLayout.add_style_class_name(params.styleClass);
|
||||||
}
|
|
||||||
|
|
||||||
if (!this._shellReactive) {
|
if (!this._shellReactive) {
|
||||||
this._lightbox = new Lightbox.Lightbox(this._group,
|
this._lightbox = new Lightbox.Lightbox(this._group,
|
||||||
@ -187,10 +187,8 @@ const ModalDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
placeSpinner: function(layoutInfo) {
|
placeSpinner: function(layoutInfo) {
|
||||||
/* This is here because of recursive imports */
|
|
||||||
const Panel = imports.ui.panel;
|
|
||||||
let spinnerIcon = global.datadir + '/theme/process-working.svg';
|
let spinnerIcon = global.datadir + '/theme/process-working.svg';
|
||||||
this._workSpinner = new Panel.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
|
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
|
||||||
this._workSpinner.actor.opacity = 0;
|
this._workSpinner.actor.opacity = 0;
|
||||||
this._workSpinner.actor.show();
|
this._workSpinner.actor.show();
|
||||||
|
|
||||||
@ -358,8 +356,9 @@ const ModalDialog = new Lang.Class({
|
|||||||
if (this._savedKeyFocus) {
|
if (this._savedKeyFocus) {
|
||||||
this._savedKeyFocus.grab_key_focus();
|
this._savedKeyFocus.grab_key_focus();
|
||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
} else
|
} else {
|
||||||
this._initialKeyFocus.grab_key_focus();
|
this._initialKeyFocus.grab_key_focus();
|
||||||
|
}
|
||||||
|
|
||||||
if (!this._shellReactive)
|
if (!this._shellReactive)
|
||||||
this._eventBlocker.lower_bottom();
|
this._eventBlocker.lower_bottom();
|
||||||
|
@ -136,8 +136,10 @@ const OsdWindow = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (!this.actor.visible) {
|
if (!this.actor.visible) {
|
||||||
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
this.actor.opacity = 0;
|
this.actor.opacity = 0;
|
||||||
|
this.actor.get_parent().set_child_above_sibling(this.actor, null);
|
||||||
|
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
@ -156,16 +158,20 @@ const OsdWindow = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Mainloop.source_remove(this._hideTimeoutId);
|
Mainloop.source_remove(this._hideTimeoutId);
|
||||||
this._hideTimeoutId = 0;
|
|
||||||
this._hide();
|
this._hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
_hide: function() {
|
_hide: function() {
|
||||||
|
this._hideTimeoutId = 0;
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: FADE_TIME,
|
time: FADE_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: Lang.bind(this, this._reset) });
|
onComplete: Lang.bind(this, function() {
|
||||||
|
this._reset();
|
||||||
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
|
})
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_reset: function() {
|
_reset: function() {
|
||||||
|
@ -148,7 +148,7 @@ const Overview = new Lang.Class({
|
|||||||
// Dash elements, or mouseover handlers in the workspaces.
|
// Dash elements, or mouseover handlers in the workspaces.
|
||||||
this._coverPane = new Clutter.Actor({ opacity: 0,
|
this._coverPane = new Clutter.Actor({ opacity: 0,
|
||||||
reactive: true });
|
reactive: true });
|
||||||
this._overview.add_actor(this._coverPane);
|
this._stack.add_actor(this._coverPane);
|
||||||
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
|
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
|
||||||
|
|
||||||
this._stack.add_actor(this._overview);
|
this._stack.add_actor(this._overview);
|
||||||
|
@ -15,6 +15,7 @@ const Signals = imports.signals;
|
|||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
|
|
||||||
|
const Animation = imports.ui.animation;
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
@ -29,7 +30,6 @@ const PANEL_ICON_SIZE = 24;
|
|||||||
|
|
||||||
const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
|
const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
|
||||||
|
|
||||||
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
|
|
||||||
const SPINNER_ANIMATION_TIME = 0.2;
|
const SPINNER_ANIMATION_TIME = 0.2;
|
||||||
|
|
||||||
// To make sure the panel corners blend nicely with the panel,
|
// To make sure the panel corners blend nicely with the panel,
|
||||||
@ -75,81 +75,6 @@ function _unpremultiply(color) {
|
|||||||
blue: blue, alpha: color.alpha });
|
blue: blue, alpha: color.alpha });
|
||||||
};
|
};
|
||||||
|
|
||||||
const Animation = new Lang.Class({
|
|
||||||
Name: 'Animation',
|
|
||||||
|
|
||||||
_init: function(filename, width, height, speed) {
|
|
||||||
this.actor = new St.Bin();
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
|
||||||
this._speed = speed;
|
|
||||||
|
|
||||||
this._isLoaded = false;
|
|
||||||
this._isPlaying = false;
|
|
||||||
this._timeoutId = 0;
|
|
||||||
this._frame = 0;
|
|
||||||
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
|
|
||||||
Lang.bind(this, this._animationsLoaded));
|
|
||||||
this.actor.set_child(this._animations);
|
|
||||||
},
|
|
||||||
|
|
||||||
play: function() {
|
|
||||||
if (this._isLoaded && this._timeoutId == 0) {
|
|
||||||
if (this._frame == 0)
|
|
||||||
this._showFrame(0);
|
|
||||||
|
|
||||||
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isPlaying = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
stop: function() {
|
|
||||||
if (this._timeoutId > 0) {
|
|
||||||
Mainloop.source_remove(this._timeoutId);
|
|
||||||
this._timeoutId = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._isPlaying = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
_showFrame: function(frame) {
|
|
||||||
let oldFrameActor = this._animations.get_child_at_index(this._frame);
|
|
||||||
if (oldFrameActor)
|
|
||||||
oldFrameActor.hide();
|
|
||||||
|
|
||||||
this._frame = (frame % this._animations.get_n_children());
|
|
||||||
|
|
||||||
let newFrameActor = this._animations.get_child_at_index(this._frame);
|
|
||||||
if (newFrameActor)
|
|
||||||
newFrameActor.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
_update: function() {
|
|
||||||
this._showFrame(this._frame + 1);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_animationsLoaded: function() {
|
|
||||||
this._isLoaded = true;
|
|
||||||
|
|
||||||
if (this._isPlaying)
|
|
||||||
this.play();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDestroy: function() {
|
|
||||||
this.stop();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const AnimatedIcon = new Lang.Class({
|
|
||||||
Name: 'AnimatedIcon',
|
|
||||||
Extends: Animation,
|
|
||||||
|
|
||||||
_init: function(filename, size) {
|
|
||||||
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const TextShadower = new Lang.Class({
|
const TextShadower = new Lang.Class({
|
||||||
Name: 'TextShadower',
|
Name: 'TextShadower',
|
||||||
|
|
||||||
@ -360,7 +285,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
if (!success || this._spinnerIcon == icon)
|
if (!success || this._spinnerIcon == icon)
|
||||||
return;
|
return;
|
||||||
this._spinnerIcon = icon;
|
this._spinnerIcon = icon;
|
||||||
this._spinner = new AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
|
this._spinner = new Animation.AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
|
||||||
this._container.add_actor(this._spinner.actor);
|
this._container.add_actor(this._spinner.actor);
|
||||||
this._spinner.actor.hide();
|
this._spinner.actor.hide();
|
||||||
this._spinner.actor.lower_bottom();
|
this._spinner.actor.lower_bottom();
|
||||||
@ -524,7 +449,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
// If the app has just lost focus to the panel, pretend
|
// If the app has just lost focus to the panel, pretend
|
||||||
// nothing happened; otherwise you can't keynav to the
|
// nothing happened; otherwise you can't keynav to the
|
||||||
// app menu.
|
// app menu.
|
||||||
if (global.stage_input_mode == Shell.StageInputMode.FOCUSED)
|
if (global.stage.key_focus != null)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._sync();
|
this._sync();
|
||||||
|
@ -15,10 +15,9 @@ const GrabHelper = imports.ui.grabHelper;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Separator = imports.ui.separator;
|
const Separator = imports.ui.separator;
|
||||||
|
const Slider = imports.ui.slider;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const SLIDER_SCROLL_STEP = 0.05; /* Slider scrolling step in % */
|
|
||||||
|
|
||||||
const Ornament = {
|
const Ornament = {
|
||||||
NONE: 0,
|
NONE: 0,
|
||||||
DOT: 1,
|
DOT: 1,
|
||||||
@ -515,211 +514,23 @@ const PopupSliderMenuItem = new Lang.Class({
|
|||||||
_init: function(value) {
|
_init: function(value) {
|
||||||
this.parent({ activate: false });
|
this.parent({ activate: false });
|
||||||
|
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
this._slider = new Slider.Slider(value);
|
||||||
|
this._slider.connect('value-changed', Lang.bind(this, function(actor, value) {
|
||||||
if (isNaN(value))
|
this.emit('value-changed', value);
|
||||||
// Avoid spreading NaNs around
|
|
||||||
throw TypeError('The slider value must be a number');
|
|
||||||
this._value = Math.max(Math.min(value, 1), 0);
|
|
||||||
|
|
||||||
this._slider = new St.DrawingArea({ style_class: 'popup-slider-menu-item', reactive: true });
|
|
||||||
this.addActor(this._slider, { span: -1, expand: true });
|
|
||||||
this._slider.connect('repaint', Lang.bind(this, this._sliderRepaint));
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
|
|
||||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
|
||||||
this.actor.connect('notify::mapped', Lang.bind(this, function() {
|
|
||||||
if (!this.actor.mapped)
|
|
||||||
this._endDragging();
|
|
||||||
}));
|
}));
|
||||||
|
this.addActor(this._slider.actor);
|
||||||
this._releaseId = this._motionId = 0;
|
|
||||||
this._dragging = false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setValue: function(value) {
|
setValue: function(value) {
|
||||||
if (isNaN(value))
|
this._slider.setValue(value);
|
||||||
throw TypeError('The slider value must be a number');
|
|
||||||
|
|
||||||
this._value = Math.max(Math.min(value, 1), 0);
|
|
||||||
this._slider.queue_repaint();
|
|
||||||
},
|
|
||||||
|
|
||||||
_sliderRepaint: function(area) {
|
|
||||||
let cr = area.get_context();
|
|
||||||
let themeNode = area.get_theme_node();
|
|
||||||
let [width, height] = area.get_surface_size();
|
|
||||||
|
|
||||||
let handleRadius = themeNode.get_length('-slider-handle-radius');
|
|
||||||
|
|
||||||
let handleBorderWidth = themeNode.get_length('-slider-handle-border-width');
|
|
||||||
let [hasHandleColor, handleBorderColor] =
|
|
||||||
themeNode.lookup_color('-slider-handle-border-color', false);
|
|
||||||
|
|
||||||
let sliderWidth = width - 2 * handleRadius;
|
|
||||||
let sliderHeight = themeNode.get_length('-slider-height');
|
|
||||||
|
|
||||||
let sliderBorderWidth = themeNode.get_length('-slider-border-width');
|
|
||||||
|
|
||||||
let sliderBorderColor = themeNode.get_color('-slider-border-color');
|
|
||||||
let sliderColor = themeNode.get_color('-slider-background-color');
|
|
||||||
|
|
||||||
let sliderActiveBorderColor = themeNode.get_color('-slider-active-border-color');
|
|
||||||
let sliderActiveColor = themeNode.get_color('-slider-active-background-color');
|
|
||||||
|
|
||||||
cr.setSourceRGBA (
|
|
||||||
sliderActiveColor.red / 255,
|
|
||||||
sliderActiveColor.green / 255,
|
|
||||||
sliderActiveColor.blue / 255,
|
|
||||||
sliderActiveColor.alpha / 255);
|
|
||||||
cr.rectangle(handleRadius, (height - sliderHeight) / 2, sliderWidth * this._value, sliderHeight);
|
|
||||||
cr.fillPreserve();
|
|
||||||
cr.setSourceRGBA (
|
|
||||||
sliderActiveBorderColor.red / 255,
|
|
||||||
sliderActiveBorderColor.green / 255,
|
|
||||||
sliderActiveBorderColor.blue / 255,
|
|
||||||
sliderActiveBorderColor.alpha / 255);
|
|
||||||
cr.setLineWidth(sliderBorderWidth);
|
|
||||||
cr.stroke();
|
|
||||||
|
|
||||||
cr.setSourceRGBA (
|
|
||||||
sliderColor.red / 255,
|
|
||||||
sliderColor.green / 255,
|
|
||||||
sliderColor.blue / 255,
|
|
||||||
sliderColor.alpha / 255);
|
|
||||||
cr.rectangle(handleRadius + sliderWidth * this._value, (height - sliderHeight) / 2, sliderWidth * (1 - this._value), sliderHeight);
|
|
||||||
cr.fillPreserve();
|
|
||||||
cr.setSourceRGBA (
|
|
||||||
sliderBorderColor.red / 255,
|
|
||||||
sliderBorderColor.green / 255,
|
|
||||||
sliderBorderColor.blue / 255,
|
|
||||||
sliderBorderColor.alpha / 255);
|
|
||||||
cr.setLineWidth(sliderBorderWidth);
|
|
||||||
cr.stroke();
|
|
||||||
|
|
||||||
let handleY = height / 2;
|
|
||||||
let handleX = handleRadius + (width - 2 * handleRadius) * this._value;
|
|
||||||
|
|
||||||
let color = themeNode.get_foreground_color();
|
|
||||||
cr.setSourceRGBA (
|
|
||||||
color.red / 255,
|
|
||||||
color.green / 255,
|
|
||||||
color.blue / 255,
|
|
||||||
color.alpha / 255);
|
|
||||||
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
|
|
||||||
cr.fillPreserve();
|
|
||||||
if (hasHandleColor && handleBorderWidth) {
|
|
||||||
cr.setSourceRGBA(
|
|
||||||
handleBorderColor.red / 255,
|
|
||||||
handleBorderColor.green / 255,
|
|
||||||
handleBorderColor.blue / 255,
|
|
||||||
handleBorderColor.alpha / 255);
|
|
||||||
cr.setLineWidth(handleBorderWidth);
|
|
||||||
cr.stroke();
|
|
||||||
}
|
|
||||||
cr.$dispose();
|
|
||||||
},
|
|
||||||
|
|
||||||
_startDragging: function(actor, event) {
|
|
||||||
if (this._dragging) // don't allow two drags at the same time
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._dragging = true;
|
|
||||||
|
|
||||||
// FIXME: we should only grab the specific device that originated
|
|
||||||
// the event, but for some weird reason events are still delivered
|
|
||||||
// outside the slider if using clutter_grab_pointer_for_device
|
|
||||||
Clutter.grab_pointer(this._slider);
|
|
||||||
this._releaseId = this._slider.connect('button-release-event', Lang.bind(this, this._endDragging));
|
|
||||||
this._motionId = this._slider.connect('motion-event', Lang.bind(this, this._motionEvent));
|
|
||||||
let absX, absY;
|
|
||||||
[absX, absY] = event.get_coords();
|
|
||||||
this._moveHandle(absX, absY);
|
|
||||||
},
|
|
||||||
|
|
||||||
_endDragging: function() {
|
|
||||||
if (this._dragging) {
|
|
||||||
this._slider.disconnect(this._releaseId);
|
|
||||||
this._slider.disconnect(this._motionId);
|
|
||||||
|
|
||||||
Clutter.ungrab_pointer();
|
|
||||||
this._dragging = false;
|
|
||||||
|
|
||||||
this.emit('drag-end');
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
scroll: function(event) {
|
|
||||||
let direction = event.get_scroll_direction();
|
|
||||||
let delta;
|
|
||||||
|
|
||||||
if (event.is_pointer_emulated())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
|
||||||
delta = -SLIDER_SCROLL_STEP;
|
|
||||||
} else if (direction == Clutter.ScrollDirection.UP) {
|
|
||||||
delta = +SLIDER_SCROLL_STEP;
|
|
||||||
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
|
|
||||||
let [dx, dy] = event.get_scroll_delta();
|
|
||||||
// Even though the slider is horizontal, use dy to match
|
|
||||||
// the UP/DOWN above.
|
|
||||||
delta = -dy / 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._value = Math.min(Math.max(0, this._value + delta), 1);
|
|
||||||
|
|
||||||
this._slider.queue_repaint();
|
|
||||||
this.emit('value-changed', this._value);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onScrollEvent: function(actor, event) {
|
|
||||||
this.scroll(event);
|
|
||||||
},
|
|
||||||
|
|
||||||
_motionEvent: function(actor, event) {
|
|
||||||
let absX, absY;
|
|
||||||
[absX, absY] = event.get_coords();
|
|
||||||
this._moveHandle(absX, absY);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_moveHandle: function(absX, absY) {
|
|
||||||
let relX, relY, sliderX, sliderY;
|
|
||||||
[sliderX, sliderY] = this._slider.get_transformed_position();
|
|
||||||
relX = absX - sliderX;
|
|
||||||
relY = absY - sliderY;
|
|
||||||
|
|
||||||
let width = this._slider.width;
|
|
||||||
let handleRadius = this._slider.get_theme_node().get_length('-slider-handle-radius');
|
|
||||||
|
|
||||||
let newvalue;
|
|
||||||
if (relX < handleRadius)
|
|
||||||
newvalue = 0;
|
|
||||||
else if (relX > width - handleRadius)
|
|
||||||
newvalue = 1;
|
|
||||||
else
|
|
||||||
newvalue = (relX - handleRadius) / (width - 2 * handleRadius);
|
|
||||||
this._value = newvalue;
|
|
||||||
this._slider.queue_repaint();
|
|
||||||
this.emit('value-changed', this._value);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
get value() {
|
get value() {
|
||||||
return this._value;
|
return this._slider.value;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onKeyPressEvent: function (actor, event) {
|
scroll: function (event) {
|
||||||
let key = event.get_key_symbol();
|
this._slider.scroll(event);
|
||||||
if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) {
|
|
||||||
let delta = key == Clutter.KEY_Right ? 0.1 : -0.1;
|
|
||||||
this._value = Math.max(0, Math.min(this._value + delta, 1));
|
|
||||||
this._slider.queue_repaint();
|
|
||||||
this.emit('value-changed', this._value);
|
|
||||||
this.emit('drag-end');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1890,7 +1701,7 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
if (open) {
|
if (open) {
|
||||||
if (this.activeMenu && !this.activeMenu.isChildMenu(menu))
|
if (this.activeMenu && !this.activeMenu.isChildMenu(menu))
|
||||||
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
|
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
|
||||||
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor,
|
this._grabHelper.grab({ actor: menu.actor, focus: menu.sourceActor,
|
||||||
onUngrab: Lang.bind(this, this._closeMenu, menu) });
|
onUngrab: Lang.bind(this, this._closeMenu, menu) });
|
||||||
} else {
|
} else {
|
||||||
this._grabHelper.ungrab({ actor: menu.actor });
|
this._grabHelper.ungrab({ actor: menu.actor });
|
||||||
|
@ -720,6 +720,8 @@ const ScreenShield = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDragEnd: function(action, actor, eventX, eventY, modifiers) {
|
_onDragEnd: function(action, actor, eventX, eventY, modifiers) {
|
||||||
|
if (this._lockScreenState != MessageTray.State.HIDING)
|
||||||
|
return;
|
||||||
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
|
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
|
||||||
// Complete motion automatically
|
// Complete motion automatically
|
||||||
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
|
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
|
||||||
@ -762,19 +764,6 @@ const ScreenShield = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._becomeModal()) {
|
|
||||||
// We could not become modal, so we can't activate the
|
|
||||||
// screenshield. The user is probably very upset at this
|
|
||||||
// point, but any application using global grabs is broken
|
|
||||||
// Just tell him to stop using this app
|
|
||||||
//
|
|
||||||
// XXX: another option is to kick the user into the gdm login
|
|
||||||
// screen, where we're not affected by grabs
|
|
||||||
Main.notifyError(_("Unable to lock"),
|
|
||||||
_("Lock was blocked by an application"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._lightbox.actor.visible ||
|
if (this._lightbox.actor.visible ||
|
||||||
this._isActive) {
|
this._isActive) {
|
||||||
// We're either shown and active, or in the process of
|
// We're either shown and active, or in the process of
|
||||||
@ -788,6 +777,19 @@ const ScreenShield = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this._becomeModal()) {
|
||||||
|
// We could not become modal, so we can't activate the
|
||||||
|
// screenshield. The user is probably very upset at this
|
||||||
|
// point, but any application using global grabs is broken
|
||||||
|
// Just tell him to stop using this app
|
||||||
|
//
|
||||||
|
// XXX: another option is to kick the user into the gdm login
|
||||||
|
// screen, where we're not affected by grabs
|
||||||
|
Main.notifyError(_("Unable to lock"),
|
||||||
|
_("Lock was blocked by an application"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this._lightbox.show();
|
this._lightbox.show();
|
||||||
|
|
||||||
if (this._activationTime == 0)
|
if (this._activationTime == 0)
|
||||||
@ -1215,6 +1217,12 @@ const ScreenShield = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear the clipboard - otherwise, its contents may be leaked
|
||||||
|
// to unauthorized parties by pasting into the unlock dialog's
|
||||||
|
// password entry and unmasking the entry
|
||||||
|
St.Clipboard.get_default().set_text(St.ClipboardType.CLIPBOARD, '');
|
||||||
|
St.Clipboard.get_default().set_text(St.ClipboardType.PRIMARY, '');
|
||||||
|
|
||||||
this._isLocked = true;
|
this._isLocked = true;
|
||||||
this.activate(animate);
|
this.activate(animate);
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ const _modes = {
|
|||||||
'restrictive': {
|
'restrictive': {
|
||||||
parentMode: null,
|
parentMode: null,
|
||||||
stylesheetName: 'gnome-shell.css',
|
stylesheetName: 'gnome-shell.css',
|
||||||
|
overridesSchema: 'org.gnome.shell.overrides',
|
||||||
hasOverview: false,
|
hasOverview: false,
|
||||||
showCalendarEvents: false,
|
showCalendarEvents: false,
|
||||||
allowSettings: false,
|
allowSettings: false,
|
||||||
|
206
js/ui/slider.js
Normal file
206
js/ui/slider.js
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
const Cairo = imports.cairo;
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
|
||||||
|
const SLIDER_SCROLL_STEP = 0.05; /* Slider scrolling step in % */
|
||||||
|
|
||||||
|
const Slider = new Lang.Class({
|
||||||
|
Name: "Slider",
|
||||||
|
|
||||||
|
_init: function(value) {
|
||||||
|
if (isNaN(value))
|
||||||
|
// Avoid spreading NaNs around
|
||||||
|
throw TypeError('The slider value must be a number');
|
||||||
|
this._value = Math.max(Math.min(value, 1), 0);
|
||||||
|
|
||||||
|
this.actor = new St.DrawingArea({ style_class: 'slider',
|
||||||
|
can_focus: true,
|
||||||
|
reactive: true });
|
||||||
|
this.actor.connect('repaint', Lang.bind(this, this._sliderRepaint));
|
||||||
|
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
|
||||||
|
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||||
|
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
||||||
|
|
||||||
|
this._releaseId = this._motionId = 0;
|
||||||
|
this._dragging = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
setValue: function(value) {
|
||||||
|
if (isNaN(value))
|
||||||
|
throw TypeError('The slider value must be a number');
|
||||||
|
|
||||||
|
this._value = Math.max(Math.min(value, 1), 0);
|
||||||
|
this.actor.queue_repaint();
|
||||||
|
},
|
||||||
|
|
||||||
|
_sliderRepaint: function(area) {
|
||||||
|
let cr = area.get_context();
|
||||||
|
let themeNode = area.get_theme_node();
|
||||||
|
let [width, height] = area.get_surface_size();
|
||||||
|
|
||||||
|
let handleRadius = themeNode.get_length('-slider-handle-radius');
|
||||||
|
|
||||||
|
let handleBorderWidth = themeNode.get_length('-slider-handle-border-width');
|
||||||
|
let [hasHandleColor, handleBorderColor] =
|
||||||
|
themeNode.lookup_color('-slider-handle-border-color', false);
|
||||||
|
|
||||||
|
let sliderHeight = themeNode.get_length('-slider-height');
|
||||||
|
|
||||||
|
let sliderBorderWidth = themeNode.get_length('-slider-border-width');
|
||||||
|
let sliderBorderRadius = Math.min(width, sliderHeight) / 2;
|
||||||
|
|
||||||
|
let sliderBorderColor = themeNode.get_color('-slider-border-color');
|
||||||
|
let sliderColor = themeNode.get_color('-slider-background-color');
|
||||||
|
|
||||||
|
let sliderActiveBorderColor = themeNode.get_color('-slider-active-border-color');
|
||||||
|
let sliderActiveColor = themeNode.get_color('-slider-active-background-color');
|
||||||
|
|
||||||
|
const TAU = Math.PI * 2;
|
||||||
|
|
||||||
|
let handleX = handleRadius + (width - 2 * handleRadius) * this._value;
|
||||||
|
|
||||||
|
cr.arc(sliderBorderRadius + sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 1/4, TAU * 3/4);
|
||||||
|
cr.lineTo(handleX, (height - sliderHeight) / 2);
|
||||||
|
cr.lineTo(handleX, (height + sliderHeight) / 2);
|
||||||
|
cr.lineTo(sliderBorderRadius + sliderBorderWidth, (height + sliderHeight) / 2);
|
||||||
|
Clutter.cairo_set_source_color(cr, sliderActiveColor);
|
||||||
|
cr.fillPreserve();
|
||||||
|
Clutter.cairo_set_source_color(cr, sliderActiveBorderColor);
|
||||||
|
cr.setLineWidth(sliderBorderWidth);
|
||||||
|
cr.stroke();
|
||||||
|
|
||||||
|
cr.arc(width - sliderBorderRadius - sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 3/4, TAU * 1/4);
|
||||||
|
cr.lineTo(handleX, (height + sliderHeight) / 2);
|
||||||
|
cr.lineTo(handleX, (height - sliderHeight) / 2);
|
||||||
|
cr.lineTo(width - sliderBorderRadius - sliderBorderWidth, (height - sliderHeight) / 2);
|
||||||
|
Clutter.cairo_set_source_color(cr, sliderColor);
|
||||||
|
cr.fillPreserve();
|
||||||
|
Clutter.cairo_set_source_color(cr, sliderBorderColor);
|
||||||
|
cr.setLineWidth(sliderBorderWidth);
|
||||||
|
cr.stroke();
|
||||||
|
|
||||||
|
let handleY = height / 2;
|
||||||
|
|
||||||
|
let color = themeNode.get_foreground_color();
|
||||||
|
Clutter.cairo_set_source_color(cr, color);
|
||||||
|
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
|
||||||
|
cr.fillPreserve();
|
||||||
|
if (hasHandleColor && handleBorderWidth) {
|
||||||
|
Clutter.cairo_set_source_color(cr, handleBorderColor);
|
||||||
|
cr.setLineWidth(handleBorderWidth);
|
||||||
|
cr.stroke();
|
||||||
|
}
|
||||||
|
cr.$dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
_startDragging: function(actor, event) {
|
||||||
|
if (this._dragging) // don't allow two drags at the same time
|
||||||
|
return false;
|
||||||
|
|
||||||
|
this._dragging = true;
|
||||||
|
|
||||||
|
// FIXME: we should only grab the specific device that originated
|
||||||
|
// the event, but for some weird reason events are still delivered
|
||||||
|
// outside the slider if using clutter_grab_pointer_for_device
|
||||||
|
Clutter.grab_pointer(this.actor);
|
||||||
|
this._releaseId = this.actor.connect('button-release-event', Lang.bind(this, this._endDragging));
|
||||||
|
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
|
||||||
|
let absX, absY;
|
||||||
|
[absX, absY] = event.get_coords();
|
||||||
|
this._moveHandle(absX, absY);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_endDragging: function() {
|
||||||
|
if (this._dragging) {
|
||||||
|
this.actor.disconnect(this._releaseId);
|
||||||
|
this.actor.disconnect(this._motionId);
|
||||||
|
|
||||||
|
Clutter.ungrab_pointer();
|
||||||
|
this._dragging = false;
|
||||||
|
|
||||||
|
this.emit('drag-end');
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
scroll: function(event) {
|
||||||
|
let direction = event.get_scroll_direction();
|
||||||
|
let delta;
|
||||||
|
|
||||||
|
if (event.is_pointer_emulated())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||||
|
delta = -SLIDER_SCROLL_STEP;
|
||||||
|
} else if (direction == Clutter.ScrollDirection.UP) {
|
||||||
|
delta = +SLIDER_SCROLL_STEP;
|
||||||
|
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
|
||||||
|
let [dx, dy] = event.get_scroll_delta();
|
||||||
|
// Even though the slider is horizontal, use dy to match
|
||||||
|
// the UP/DOWN above.
|
||||||
|
delta = -dy / 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._value = Math.min(Math.max(0, this._value + delta), 1);
|
||||||
|
|
||||||
|
this.actor.queue_repaint();
|
||||||
|
this.emit('value-changed', this._value);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onScrollEvent: function(actor, event) {
|
||||||
|
this.scroll(event);
|
||||||
|
},
|
||||||
|
|
||||||
|
_motionEvent: function(actor, event) {
|
||||||
|
let absX, absY;
|
||||||
|
[absX, absY] = event.get_coords();
|
||||||
|
this._moveHandle(absX, absY);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onKeyPressEvent: function (actor, event) {
|
||||||
|
let key = event.get_key_symbol();
|
||||||
|
if (key == Clutter.KEY_Right || key == Clutter.KEY_Left) {
|
||||||
|
let delta = key == Clutter.KEY_Right ? 0.1 : -0.1;
|
||||||
|
this._value = Math.max(0, Math.min(this._value + delta, 1));
|
||||||
|
this._slider.queue_repaint();
|
||||||
|
this.emit('value-changed', this._value);
|
||||||
|
this.emit('drag-end');
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
_moveHandle: function(absX, absY) {
|
||||||
|
let relX, relY, sliderX, sliderY;
|
||||||
|
[sliderX, sliderY] = this.actor.get_transformed_position();
|
||||||
|
relX = absX - sliderX;
|
||||||
|
relY = absY - sliderY;
|
||||||
|
|
||||||
|
let width = this.actor.width;
|
||||||
|
let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius');
|
||||||
|
|
||||||
|
let newvalue;
|
||||||
|
if (relX < handleRadius)
|
||||||
|
newvalue = 0;
|
||||||
|
else if (relX > width - handleRadius)
|
||||||
|
newvalue = 1;
|
||||||
|
else
|
||||||
|
newvalue = (relX - handleRadius) / (width - 2 * handleRadius);
|
||||||
|
this._value = newvalue;
|
||||||
|
this.actor.queue_repaint();
|
||||||
|
this.emit('value-changed', this._value);
|
||||||
|
},
|
||||||
|
|
||||||
|
get value() {
|
||||||
|
return this._value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Signals.addSignalMethods(Slider.prototype);
|
@ -86,6 +86,7 @@ const Indicator = new Lang.Class({
|
|||||||
this._applet.connect('pincode-request', Lang.bind(this, this._pinRequest));
|
this._applet.connect('pincode-request', Lang.bind(this, this._pinRequest));
|
||||||
this._applet.connect('confirm-request', Lang.bind(this, this._confirmRequest));
|
this._applet.connect('confirm-request', Lang.bind(this, this._confirmRequest));
|
||||||
this._applet.connect('auth-request', Lang.bind(this, this._authRequest));
|
this._applet.connect('auth-request', Lang.bind(this, this._authRequest));
|
||||||
|
this._applet.connect('auth-service-request', Lang.bind(this, this._authServiceRequest));
|
||||||
this._applet.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
this._applet.connect('cancel-request', Lang.bind(this, this._cancelRequest));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -292,9 +293,14 @@ const Indicator = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_authRequest: function(applet, device_path, name, long_name, uuid) {
|
_authRequest: function(applet, device_path, name, long_name) {
|
||||||
this._ensureSource();
|
this._ensureSource();
|
||||||
this._source.notify(new AuthNotification(this._source, this._applet, device_path, name, long_name, uuid));
|
this._source.notify(new AuthNotification(this._source, this._applet, device_path, name, long_name));
|
||||||
|
},
|
||||||
|
|
||||||
|
_authServiceRequest: function(applet, device_path, name, long_name, uuid) {
|
||||||
|
this._ensureSource();
|
||||||
|
this._source.notify(new AuthServiceNotification(this._source, this._applet, device_path, name, long_name, uuid));
|
||||||
},
|
},
|
||||||
|
|
||||||
_confirmRequest: function(applet, device_path, name, long_name, pin) {
|
_confirmRequest: function(applet, device_path, name, long_name, pin) {
|
||||||
@ -316,6 +322,34 @@ const AuthNotification = new Lang.Class({
|
|||||||
Name: 'AuthNotification',
|
Name: 'AuthNotification',
|
||||||
Extends: MessageTray.Notification,
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
|
_init: function(source, applet, device_path, name, long_name) {
|
||||||
|
this.parent(source,
|
||||||
|
_("Bluetooth"),
|
||||||
|
_("Authorization request from %s").format(name),
|
||||||
|
{ customContent: true });
|
||||||
|
this.setResident(true);
|
||||||
|
|
||||||
|
this._applet = applet;
|
||||||
|
this._devicePath = device_path;
|
||||||
|
this.addBody(_("Device %s wants to pair with this computer").format(long_name));
|
||||||
|
|
||||||
|
this.addButton('allow', _("Allow"));
|
||||||
|
this.addButton('deny', _("Deny"));
|
||||||
|
|
||||||
|
this.connect('action-invoked', Lang.bind(this, function(self, action) {
|
||||||
|
if (action == 'allow')
|
||||||
|
this._applet.agent_reply_confirm(this._devicePath, true);
|
||||||
|
else
|
||||||
|
this._applet.agent_reply_confirm(this._devicePath, false);
|
||||||
|
this.destroy();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AuthServiceNotification = new Lang.Class({
|
||||||
|
Name: 'AuthServiceNotification',
|
||||||
|
Extends: MessageTray.Notification,
|
||||||
|
|
||||||
_init: function(source, applet, device_path, name, long_name, uuid) {
|
_init: function(source, applet, device_path, name, long_name, uuid) {
|
||||||
this.parent(source,
|
this.parent(source,
|
||||||
_("Bluetooth"),
|
_("Bluetooth"),
|
||||||
@ -334,14 +368,14 @@ const AuthNotification = new Lang.Class({
|
|||||||
this.connect('action-invoked', Lang.bind(this, function(self, action) {
|
this.connect('action-invoked', Lang.bind(this, function(self, action) {
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 'always-grant':
|
case 'always-grant':
|
||||||
this._applet.agent_reply_auth(this._devicePath, true, true);
|
this._applet.agent_reply_auth_service(this._devicePath, true, true);
|
||||||
break;
|
break;
|
||||||
case 'grant':
|
case 'grant':
|
||||||
this._applet.agent_reply_auth(this._devicePath, true, false);
|
this._applet.agent_reply_auth_service(this._devicePath, true, false);
|
||||||
break;
|
break;
|
||||||
case 'reject':
|
case 'reject':
|
||||||
default:
|
default:
|
||||||
this._applet.agent_reply_auth(this._devicePath, false, false);
|
this._applet.agent_reply_auth_service(this._devicePath, false, false);
|
||||||
}
|
}
|
||||||
this.destroy();
|
this.destroy();
|
||||||
}));
|
}));
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -10,8 +10,6 @@ const Signals = imports.signals;
|
|||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
|
|
||||||
const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */
|
|
||||||
|
|
||||||
const VOLUME_NOTIFY_ID = 1;
|
const VOLUME_NOTIFY_ID = 1;
|
||||||
|
|
||||||
// Each Gvc.MixerControl is a connection to PulseAudio,
|
// Each Gvc.MixerControl is a connection to PulseAudio,
|
||||||
@ -44,7 +42,6 @@ const StreamSlider = new Lang.Class({
|
|||||||
this.item.addMenuItem(this._slider);
|
this.item.addMenuItem(this._slider);
|
||||||
|
|
||||||
this._stream = null;
|
this._stream = null;
|
||||||
this._shouldShow = true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
get stream() {
|
get stream() {
|
||||||
|
@ -17,7 +17,6 @@ const ModalDialog = imports.ui.modalDialog;
|
|||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserMenu = imports.ui.userMenu;
|
|
||||||
const UserWidget = imports.ui.userWidget;
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
|
@ -20,8 +20,8 @@ const Main = imports.ui.main;
|
|||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Params = imports.misc.params;
|
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
|
const UserWidget = imports.ui.userWidget;
|
||||||
|
|
||||||
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
||||||
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
||||||
@ -32,8 +32,6 @@ const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
|||||||
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
||||||
const SHOW_FULL_NAME_IN_TOP_BAR_KEY = 'show-full-name-in-top-bar';
|
const SHOW_FULL_NAME_IN_TOP_BAR_KEY = 'show-full-name-in-top-bar';
|
||||||
|
|
||||||
const DIALOG_ICON_SIZE = 64;
|
|
||||||
|
|
||||||
const MAX_USERS_IN_SESSION_DIALOG = 5;
|
const MAX_USERS_IN_SESSION_DIALOG = 5;
|
||||||
|
|
||||||
const IMStatus = {
|
const IMStatus = {
|
||||||
@ -57,48 +55,6 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session
|
|||||||
|
|
||||||
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
|
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
|
||||||
|
|
||||||
// Adapted from gdm/gui/user-switch-applet/applet.c
|
|
||||||
//
|
|
||||||
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
|
|
||||||
// Copyright (C) 2008,2009 Red Hat, Inc.
|
|
||||||
|
|
||||||
const UserAvatarWidget = new Lang.Class({
|
|
||||||
Name: 'UserAvatarWidget',
|
|
||||||
|
|
||||||
_init: function(user, params) {
|
|
||||||
this._user = user;
|
|
||||||
params = Params.parse(params, { reactive: false,
|
|
||||||
iconSize: DIALOG_ICON_SIZE,
|
|
||||||
styleClass: 'status-chooser-user-icon' });
|
|
||||||
this._iconSize = params.iconSize;
|
|
||||||
|
|
||||||
this.actor = new St.Bin({ style_class: params.styleClass,
|
|
||||||
track_hover: params.reactive,
|
|
||||||
reactive: params.reactive });
|
|
||||||
},
|
|
||||||
|
|
||||||
setSensitive: function(sensitive) {
|
|
||||||
this.actor.can_focus = sensitive;
|
|
||||||
this.actor.reactive = sensitive;
|
|
||||||
},
|
|
||||||
|
|
||||||
update: function() {
|
|
||||||
let iconFile = this._user.get_icon_file();
|
|
||||||
if (iconFile && !GLib.file_test(iconFile, GLib.FileTest.EXISTS))
|
|
||||||
iconFile = null;
|
|
||||||
|
|
||||||
if (iconFile) {
|
|
||||||
let file = Gio.File.new_for_path(iconFile);
|
|
||||||
this.actor.child = null;
|
|
||||||
this.actor.style = 'background-image: url("%s");'.format(iconFile);
|
|
||||||
} else {
|
|
||||||
this.actor.style = null;
|
|
||||||
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
|
|
||||||
icon_size: this._iconSize });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const IMStatusItem = new Lang.Class({
|
const IMStatusItem = new Lang.Class({
|
||||||
Name: 'IMStatusItem',
|
Name: 'IMStatusItem',
|
||||||
Extends: PopupMenu.PopupBaseMenuItem,
|
Extends: PopupMenu.PopupBaseMenuItem,
|
||||||
@ -170,7 +126,7 @@ const IMStatusChooserItem = new Lang.Class({
|
|||||||
this._userManager = AccountsService.UserManager.get_default();
|
this._userManager = AccountsService.UserManager.get_default();
|
||||||
this._user = this._userManager.get_user(GLib.get_user_name());
|
this._user = this._userManager.get_user(GLib.get_user_name());
|
||||||
|
|
||||||
this._avatar = new UserAvatarWidget(this._user, { reactive: true });
|
this._avatar = new UserWidget.Avatar(this._user, { reactive: true });
|
||||||
this._iconBin = new St.Button({ child: this._avatar.actor });
|
this._iconBin = new St.Button({ child: this._avatar.actor });
|
||||||
this.addActor(this._iconBin);
|
this.addActor(this._iconBin);
|
||||||
|
|
||||||
@ -610,7 +566,6 @@ const UserMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
let allowSettings = Main.sessionMode.allowSettings;
|
let allowSettings = Main.sessionMode.allowSettings;
|
||||||
this._statusChooser.setSensitive(allowSettings);
|
this._statusChooser.setSensitive(allowSettings);
|
||||||
this._systemSettings.visible = allowSettings;
|
|
||||||
|
|
||||||
this.setSensitive(!Main.sessionMode.isLocked);
|
this.setSensitive(!Main.sessionMode.isLocked);
|
||||||
this._updatePresenceIcon();
|
this._updatePresenceIcon();
|
||||||
@ -786,10 +741,7 @@ const UserMenuButton = new Lang.Class({
|
|||||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
|
||||||
item = new PopupMenu.PopupMenuItem(_("Settings"));
|
this.menu.addSettingsAction(_("Settings"), 'gnome-control-center.desktop');
|
||||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
|
||||||
this.menu.addMenuItem(item);
|
|
||||||
this._systemSettings = item;
|
|
||||||
|
|
||||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
@ -850,12 +802,6 @@ const UserMenuButton = new Lang.Class({
|
|||||||
app.activate();
|
app.activate();
|
||||||
},
|
},
|
||||||
|
|
||||||
_onPreferencesActivate: function() {
|
|
||||||
Main.overview.hide();
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-control-center.desktop');
|
|
||||||
app.activate();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onLockScreenActivate: function() {
|
_onLockScreenActivate: function() {
|
||||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
@ -908,7 +854,7 @@ const UserMenuButton = new Lang.Class({
|
|||||||
let session = sessions[i];
|
let session = sessions[i];
|
||||||
let userEntry = new St.BoxLayout({ style_class: 'login-dialog-user-list-item',
|
let userEntry = new St.BoxLayout({ style_class: 'login-dialog-user-list-item',
|
||||||
vertical: false });
|
vertical: false });
|
||||||
let avatar = new UserAvatarWidget(session.user);
|
let avatar = new UserWidget.Avatar(session.user);
|
||||||
avatar.update();
|
avatar.update();
|
||||||
userEntry.add(avatar.actor);
|
userEntry.add(avatar.actor);
|
||||||
|
|
||||||
|
@ -3,10 +3,56 @@
|
|||||||
//
|
//
|
||||||
// A widget showing the user avatar and name
|
// A widget showing the user avatar and name
|
||||||
const AccountsService = imports.gi.AccountsService;
|
const AccountsService = imports.gi.AccountsService;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
const UserMenu = imports.ui.userMenu;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
|
const AVATAR_ICON_SIZE = 64;
|
||||||
|
|
||||||
|
// Adapted from gdm/gui/user-switch-applet/applet.c
|
||||||
|
//
|
||||||
|
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
|
||||||
|
// Copyright (C) 2008,2009 Red Hat, Inc.
|
||||||
|
|
||||||
|
const Avatar = new Lang.Class({
|
||||||
|
Name: 'Avatar',
|
||||||
|
|
||||||
|
_init: function(user, params) {
|
||||||
|
this._user = user;
|
||||||
|
params = Params.parse(params, { reactive: false,
|
||||||
|
iconSize: AVATAR_ICON_SIZE,
|
||||||
|
styleClass: 'status-chooser-user-icon' });
|
||||||
|
this._iconSize = params.iconSize;
|
||||||
|
|
||||||
|
this.actor = new St.Bin({ style_class: params.styleClass,
|
||||||
|
track_hover: params.reactive,
|
||||||
|
reactive: params.reactive });
|
||||||
|
},
|
||||||
|
|
||||||
|
setSensitive: function(sensitive) {
|
||||||
|
this.actor.can_focus = sensitive;
|
||||||
|
this.actor.reactive = sensitive;
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function() {
|
||||||
|
let iconFile = this._user.get_icon_file();
|
||||||
|
if (iconFile && !GLib.file_test(iconFile, GLib.FileTest.EXISTS))
|
||||||
|
iconFile = null;
|
||||||
|
|
||||||
|
if (iconFile) {
|
||||||
|
let file = Gio.File.new_for_path(iconFile);
|
||||||
|
this.actor.child = null;
|
||||||
|
this.actor.style = 'background-image: url("%s");'.format(iconFile);
|
||||||
|
} else {
|
||||||
|
this.actor.style = null;
|
||||||
|
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
|
||||||
|
icon_size: this._iconSize });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const UserWidget = new Lang.Class({
|
const UserWidget = new Lang.Class({
|
||||||
Name: 'UserWidget',
|
Name: 'UserWidget',
|
||||||
@ -18,7 +64,7 @@ const UserWidget = new Lang.Class({
|
|||||||
vertical: false });
|
vertical: false });
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
|
|
||||||
this._avatar = new UserMenu.UserAvatarWidget(user);
|
this._avatar = new Avatar(user);
|
||||||
this.actor.add(this._avatar.actor,
|
this.actor.add(this._avatar.actor,
|
||||||
{ x_fill: true, y_fill: true });
|
{ x_fill: true, y_fill: true });
|
||||||
|
|
||||||
|
@ -93,8 +93,8 @@ const WorkspaceTracker = new Lang.Class({
|
|||||||
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
|
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
|
||||||
global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked));
|
global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked));
|
||||||
|
|
||||||
this._overrideSettings = new Gio.Settings({ schema: 'org.gnome.shell.overrides' });
|
this._workspaceSettings = new Gio.Settings({ schema: Main.dynamicWorkspacesSchema });
|
||||||
this._overrideSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces));
|
this._workspaceSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces));
|
||||||
|
|
||||||
this._nWorkspacesChanged();
|
this._nWorkspacesChanged();
|
||||||
},
|
},
|
||||||
@ -479,6 +479,10 @@ const WindowManager = new Lang.Class({
|
|||||||
false, -1, 1);
|
false, -1, 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
keepWorkspaceAlive: function(workspace, duration) {
|
||||||
|
this._workspaceTracker.keepWorkspaceAlive(workspace, duration);
|
||||||
|
},
|
||||||
|
|
||||||
setCustomKeybindingHandler: function(name, modes, handler) {
|
setCustomKeybindingHandler: function(name, modes, handler) {
|
||||||
if (Meta.keybindings_set_custom_handler(name, handler))
|
if (Meta.keybindings_set_custom_handler(name, handler))
|
||||||
this.allowKeybinding(name, modes);
|
this.allowKeybinding(name, modes);
|
||||||
|
@ -127,7 +127,7 @@ const WindowClone = new Lang.Class({
|
|||||||
if (this._stackAbove == null)
|
if (this._stackAbove == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (this.inDrag || this._zooming) {
|
if (this.inDrag) {
|
||||||
if (this._stackAbove._delegate)
|
if (this._stackAbove._delegate)
|
||||||
return this._stackAbove._delegate.getActualStackAbove();
|
return this._stackAbove._delegate.getActualStackAbove();
|
||||||
else
|
else
|
||||||
@ -997,7 +997,7 @@ const Workspace = new Lang.Class({
|
|||||||
|
|
||||||
this._dropRect.set_position(geom.x, geom.y);
|
this._dropRect.set_position(geom.x, geom.y);
|
||||||
this._dropRect.set_size(geom.width, geom.height);
|
this._dropRect.set_size(geom.width, geom.height);
|
||||||
this._updateWindowPositions(WindowPositionFlags.NONE);
|
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
||||||
|
|
||||||
this._actualGeometryLater = 0;
|
this._actualGeometryLater = 0;
|
||||||
return false;
|
return false;
|
||||||
|
@ -764,8 +764,8 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
// to open its first window within some time, as tracked by Shell.WindowTracker.
|
// to open its first window within some time, as tracked by Shell.WindowTracker.
|
||||||
// Here, we only add a very brief timeout to avoid the _immediate_ removal of the
|
// Here, we only add a very brief timeout to avoid the _immediate_ removal of the
|
||||||
// workspace while we wait for the startup sequence to load.
|
// workspace while we wait for the startup sequence to load.
|
||||||
Main.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex),
|
Main.wm.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex),
|
||||||
WORKSPACE_KEEP_ALIVE_TIME);
|
WORKSPACE_KEEP_ALIVE_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the animation on the workspace (which is actually
|
// Start the animation on the workspace (which is actually
|
||||||
|
387
po/cs.po
387
po/cs.po
@ -12,8 +12,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-05-28 07:17+0000\n"
|
"POT-Creation-Date: 2013-06-27 11:02+0000\n"
|
||||||
"PO-Revision-Date: 2013-05-29 12:26+0200\n"
|
"PO-Revision-Date: 2013-06-28 18:32+0200\n"
|
||||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||||
"Language: cs\n"
|
"Language: cs\n"
|
||||||
@ -317,12 +317,12 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Připojovat modální dialogová okna k rodičovským oknům"
|
msgstr "Modální dialogová okna připojovat k rodičovskému oknu"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
msgstr "Tento kíč přepisuje klíč v org.gnome.mutter, když běží GNOME Shell."
|
msgstr "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.mutter"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||||
msgid "Arrangement of buttons on the titlebar"
|
msgid "Arrangement of buttons on the titlebar"
|
||||||
@ -333,12 +333,12 @@ msgid ""
|
|||||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||||
"GNOME Shell."
|
"GNOME Shell."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Tento kíč přepisuje klíč v org.gnome.desktop.wm.preferences, když běží GNOME "
|
"Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.desktop.wm."
|
||||||
"Shell."
|
"preferences"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr "Nechat okna upuštěná při okraji obrazovky vytvářet dlaždice"
|
msgstr "Okna upuštěná u okraje obrazovky nechat řadit jako dlaždice"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
@ -346,7 +346,7 @@ msgstr "Pracovní plochy jsou spravovány dynamicky"
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Pracovní plochy pouze na hlavním monitoru"
|
msgstr "Pracovní plochy jen na hlavním monitoru"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:125
|
#: ../js/extensionPrefs/main.js:125
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -363,37 +363,41 @@ msgid "Select an extension to configure using the combobox above."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Pomocí rozbalovacího seznamu výše zvolte rozšíření, které chete nastavit."
|
"Pomocí rozbalovacího seznamu výše zvolte rozšíření, které chete nastavit."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:371
|
#: ../js/gdm/loginDialog.js:308
|
||||||
msgid "Session…"
|
msgid "Choose Session"
|
||||||
msgstr "Sezení…"
|
msgstr "Vybrat sezení"
|
||||||
|
|
||||||
|
#: ../js/gdm/loginDialog.js:326
|
||||||
|
msgid "Session"
|
||||||
|
msgstr "Sezení"
|
||||||
|
|
||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:601
|
#: ../js/gdm/loginDialog.js:528
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Nejste na seznamu?"
|
msgstr "Nejste na seznamu?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
|
#: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
|
||||||
#: ../js/ui/userMenu.js:938
|
#: ../js/ui/userMenu.js:884
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Zrušit"
|
msgstr "Zrušit"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:833
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Přihlásit se"
|
msgstr "Přihlásit se"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:833
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Následující"
|
msgstr "Následující"
|
||||||
|
|
||||||
#. Translators: this message is shown below the username entry field
|
#. Translators: this message is shown below the username entry field
|
||||||
#. to clue the user in on how to login to the local network realm
|
#. to clue the user in on how to login to the local network realm
|
||||||
#: ../js/gdm/loginDialog.js:888
|
#: ../js/gdm/loginDialog.js:934
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(např. uživatel nebo %s)"
|
msgstr "(např. uživatel nebo %s)"
|
||||||
@ -401,12 +405,12 @@ msgstr "(např. uživatel nebo %s)"
|
|||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Uživatelské jméno: "
|
msgstr "Uživatelské jméno: "
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1158
|
#: ../js/gdm/loginDialog.js:1205
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Přihlašovací okno"
|
msgstr "Přihlašovací okno"
|
||||||
|
|
||||||
@ -415,8 +419,8 @@ msgstr "Přihlašovací okno"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Vypnout"
|
msgstr "Vypnout"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
|
||||||
#: ../js/ui/userMenu.js:816
|
#: ../js/ui/userMenu.js:768
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Uspat do paměti"
|
msgstr "Uspat do paměti"
|
||||||
|
|
||||||
@ -424,18 +428,18 @@ msgstr "Uspat do paměti"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Restartovat"
|
msgstr "Restartovat"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
|
||||||
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
#: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Vypnout"
|
msgstr "Vypnout"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:247
|
#: ../js/gdm/util.js:248
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Chyba ověření"
|
msgstr "Chyba ověření"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: ../js/gdm/util.js:364
|
#: ../js/gdm/util.js:365
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(nebo otiskněte prst)"
|
msgstr "(nebo otiskněte prst)"
|
||||||
|
|
||||||
@ -454,23 +458,23 @@ msgstr "Nelze analyzovat příkaz:"
|
|||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Vykonání „%s“ selhalo:"
|
msgstr "Vykonání „%s“ selhalo:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:361
|
#: ../js/ui/appDisplay.js:397
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Časté"
|
msgstr "Časté"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:368
|
#: ../js/ui/appDisplay.js:404
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Všechny"
|
msgstr "Všechny"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:960
|
#: ../js/ui/appDisplay.js:996
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nové okno"
|
msgstr "Nové okno"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Odstranit z oblíbených"
|
msgstr "Odstranit z oblíbených"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:964
|
#: ../js/ui/appDisplay.js:1000
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Přidat mezi oblíbené"
|
msgstr "Přidat mezi oblíbené"
|
||||||
|
|
||||||
@ -484,7 +488,7 @@ msgstr "%s byl přidán mezi oblíbené."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s byl odstraněn z oblíbených."
|
msgstr "%s byl odstraněn z oblíbených."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Nastavení"
|
msgstr "Nastavení"
|
||||||
|
|
||||||
@ -609,35 +613,35 @@ msgid "S"
|
|||||||
msgstr "So"
|
msgstr "So"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:735
|
#: ../js/ui/calendar.js:750
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nic nenaplánováno"
|
msgstr "Nic nenaplánováno"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:751
|
#: ../js/ui/calendar.js:768
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %e. %B"
|
msgstr "%A, %e. %B"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:754
|
#: ../js/ui/calendar.js:771
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %e. %B %Y"
|
msgstr "%A, %e. %B %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:764
|
#: ../js/ui/calendar.js:782
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Dnes"
|
msgstr "Dnes"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:768
|
#: ../js/ui/calendar.js:786
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Zítra"
|
msgstr "Zítra"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:779
|
#: ../js/ui/calendar.js:797
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Tento týden"
|
msgstr "Tento týden"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:787
|
#: ../js/ui/calendar.js:805
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Následující týden"
|
msgstr "Následující týden"
|
||||||
|
|
||||||
@ -826,14 +830,14 @@ msgstr "<b>%d.</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
|
|||||||
|
|
||||||
#. Translators: this is the other person changing their old IM name to their new
|
#. Translators: this is the other person changing their old IM name to their new
|
||||||
#. IM name.
|
#. IM name.
|
||||||
#: ../js/ui/components/telepathyClient.js:985
|
#: ../js/ui/components/telepathyClient.js:986
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is now known as %s"
|
msgid "%s is now known as %s"
|
||||||
msgstr "%s je teď znám jako %s"
|
msgstr "%s je teď znám jako %s"
|
||||||
|
|
||||||
#. translators: argument is a room name like
|
#. translators: argument is a room name like
|
||||||
#. * room@jabber.org for example.
|
#. * room@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1088
|
#: ../js/ui/components/telepathyClient.js:1089
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invitation to %s"
|
msgid "Invitation to %s"
|
||||||
msgstr "Pozvánka na připojení k %s"
|
msgstr "Pozvánka na připojení k %s"
|
||||||
@ -841,38 +845,38 @@ msgstr "Pozvánka na připojení k %s"
|
|||||||
#. translators: first argument is the name of a contact and the second
|
#. translators: first argument is the name of a contact and the second
|
||||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||||
#. * for example.
|
#. * for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1096
|
#: ../js/ui/components/telepathyClient.js:1097
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is inviting you to join %s"
|
msgid "%s is inviting you to join %s"
|
||||||
msgstr "%s vás zve do %s"
|
msgstr "%s vás zve do %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1098
|
#: ../js/ui/components/telepathyClient.js:1099
|
||||||
#: ../js/ui/components/telepathyClient.js:1137
|
#: ../js/ui/components/telepathyClient.js:1138
|
||||||
#: ../js/ui/components/telepathyClient.js:1177
|
#: ../js/ui/components/telepathyClient.js:1178
|
||||||
#: ../js/ui/components/telepathyClient.js:1240
|
#: ../js/ui/components/telepathyClient.js:1241
|
||||||
msgid "Decline"
|
msgid "Decline"
|
||||||
msgstr "Odmítnout"
|
msgstr "Odmítnout"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1099
|
#: ../js/ui/components/telepathyClient.js:1100
|
||||||
#: ../js/ui/components/telepathyClient.js:1178
|
#: ../js/ui/components/telepathyClient.js:1179
|
||||||
#: ../js/ui/components/telepathyClient.js:1241
|
#: ../js/ui/components/telepathyClient.js:1242
|
||||||
msgid "Accept"
|
msgid "Accept"
|
||||||
msgstr "Přijmout"
|
msgstr "Přijmout"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1129
|
#: ../js/ui/components/telepathyClient.js:1130
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Video call from %s"
|
msgid "Video call from %s"
|
||||||
msgstr "Videohovor od %s"
|
msgstr "Videohovor od %s"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1132
|
#: ../js/ui/components/telepathyClient.js:1133
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Call from %s"
|
msgid "Call from %s"
|
||||||
msgstr "Hovor od %s"
|
msgstr "Hovor od %s"
|
||||||
|
|
||||||
#. translators: this is a button label (verb), not a noun
|
#. translators: this is a button label (verb), not a noun
|
||||||
#: ../js/ui/components/telepathyClient.js:1139
|
#: ../js/ui/components/telepathyClient.js:1140
|
||||||
msgid "Answer"
|
msgid "Answer"
|
||||||
msgstr "Zvednout"
|
msgstr "Zvednout"
|
||||||
|
|
||||||
@ -881,110 +885,110 @@ msgstr "Zvednout"
|
|||||||
#. * file name. The string will be something
|
#. * file name. The string will be something
|
||||||
#. * like: "Alice is sending you test.ogg"
|
#. * like: "Alice is sending you test.ogg"
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/components/telepathyClient.js:1171
|
#: ../js/ui/components/telepathyClient.js:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is sending you %s"
|
msgid "%s is sending you %s"
|
||||||
msgstr "%s vám posílá %s"
|
msgstr "%s vám posílá %s"
|
||||||
|
|
||||||
#. To translators: The parameter is the contact's alias
|
#. To translators: The parameter is the contact's alias
|
||||||
#: ../js/ui/components/telepathyClient.js:1206
|
#: ../js/ui/components/telepathyClient.js:1207
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s would like permission to see when you are online"
|
msgid "%s would like permission to see when you are online"
|
||||||
msgstr "%s vás žádá o oprávnění vidět, že jste dostupní"
|
msgstr "%s vás žádá o oprávnění vidět, že jste dostupní"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1298
|
#: ../js/ui/components/telepathyClient.js:1299
|
||||||
msgid "Network error"
|
msgid "Network error"
|
||||||
msgstr "Chyba sítě"
|
msgstr "Chyba sítě"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1300
|
#: ../js/ui/components/telepathyClient.js:1301
|
||||||
msgid "Authentication failed"
|
msgid "Authentication failed"
|
||||||
msgstr "Ověření selhalo"
|
msgstr "Ověření selhalo"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1302
|
#: ../js/ui/components/telepathyClient.js:1303
|
||||||
msgid "Encryption error"
|
msgid "Encryption error"
|
||||||
msgstr "Chyba šifrování"
|
msgstr "Chyba šifrování"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1304
|
#: ../js/ui/components/telepathyClient.js:1305
|
||||||
msgid "Certificate not provided"
|
msgid "Certificate not provided"
|
||||||
msgstr "Certifikát neposkytnut"
|
msgstr "Certifikát neposkytnut"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1306
|
#: ../js/ui/components/telepathyClient.js:1307
|
||||||
msgid "Certificate untrusted"
|
msgid "Certificate untrusted"
|
||||||
msgstr "Nedůvěryhodný certifikát"
|
msgstr "Nedůvěryhodný certifikát"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1308
|
#: ../js/ui/components/telepathyClient.js:1309
|
||||||
msgid "Certificate expired"
|
msgid "Certificate expired"
|
||||||
msgstr "Platnost certifikátu vypršela"
|
msgstr "Platnost certifikátu vypršela"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1310
|
#: ../js/ui/components/telepathyClient.js:1311
|
||||||
msgid "Certificate not activated"
|
msgid "Certificate not activated"
|
||||||
msgstr "Certifikát není aktivován"
|
msgstr "Certifikát není aktivován"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1312
|
#: ../js/ui/components/telepathyClient.js:1313
|
||||||
msgid "Certificate hostname mismatch"
|
msgid "Certificate hostname mismatch"
|
||||||
msgstr "Název počítače certifikátu nesouhlasí"
|
msgstr "Název počítače certifikátu nesouhlasí"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1314
|
#: ../js/ui/components/telepathyClient.js:1315
|
||||||
msgid "Certificate fingerprint mismatch"
|
msgid "Certificate fingerprint mismatch"
|
||||||
msgstr "Otisk prstu certifikátu nesouhlasí"
|
msgstr "Otisk prstu certifikátu nesouhlasí"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1316
|
#: ../js/ui/components/telepathyClient.js:1317
|
||||||
msgid "Certificate self-signed"
|
msgid "Certificate self-signed"
|
||||||
msgstr "Certifikát je podepsán sám sebou"
|
msgstr "Certifikát je podepsán sám sebou"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1318
|
#: ../js/ui/components/telepathyClient.js:1319
|
||||||
msgid "Status is set to offline"
|
msgid "Status is set to offline"
|
||||||
msgstr "Stav nastaven na „Odhlášen“"
|
msgstr "Stav nastaven na „Odhlášen“"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1320
|
#: ../js/ui/components/telepathyClient.js:1321
|
||||||
msgid "Encryption is not available"
|
msgid "Encryption is not available"
|
||||||
msgstr "Šifrování není dostupné"
|
msgstr "Šifrování není dostupné"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1322
|
#: ../js/ui/components/telepathyClient.js:1323
|
||||||
msgid "Certificate is invalid"
|
msgid "Certificate is invalid"
|
||||||
msgstr "Certifikát je neplatný"
|
msgstr "Certifikát je neplatný"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1324
|
#: ../js/ui/components/telepathyClient.js:1325
|
||||||
msgid "Connection has been refused"
|
msgid "Connection has been refused"
|
||||||
msgstr "Spojení bylo odmítnuto"
|
msgstr "Spojení bylo odmítnuto"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1326
|
#: ../js/ui/components/telepathyClient.js:1327
|
||||||
msgid "Connection can't be established"
|
msgid "Connection can't be established"
|
||||||
msgstr "Spojení nemohlo bát navázáno"
|
msgstr "Spojení nemohlo bát navázáno"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1328
|
#: ../js/ui/components/telepathyClient.js:1329
|
||||||
msgid "Connection has been lost"
|
msgid "Connection has been lost"
|
||||||
msgstr "Spojení bylo ztraceno"
|
msgstr "Spojení bylo ztraceno"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1330
|
#: ../js/ui/components/telepathyClient.js:1331
|
||||||
msgid "This account is already connected to the server"
|
msgid "This account is already connected to the server"
|
||||||
msgstr "Tento účet je již připojen k serveru"
|
msgstr "Tento účet je již připojen k serveru"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1332
|
#: ../js/ui/components/telepathyClient.js:1333
|
||||||
msgid ""
|
msgid ""
|
||||||
"Connection has been replaced by a new connection using the same resource"
|
"Connection has been replaced by a new connection using the same resource"
|
||||||
msgstr "Spojení bylo nahrazeno novým spojením, které používá stejný zdroj"
|
msgstr "Spojení bylo nahrazeno novým spojením, které používá stejný zdroj"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1334
|
#: ../js/ui/components/telepathyClient.js:1335
|
||||||
msgid "The account already exists on the server"
|
msgid "The account already exists on the server"
|
||||||
msgstr "Takový účet již na serveru existuje"
|
msgstr "Takový účet již na serveru existuje"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1336
|
#: ../js/ui/components/telepathyClient.js:1337
|
||||||
msgid "Server is currently too busy to handle the connection"
|
msgid "Server is currently too busy to handle the connection"
|
||||||
msgstr "Server je právě příliš zaneprázdněn na to, aby obsloužil spojení"
|
msgstr "Server je právě příliš zaneprázdněn na to, aby obsloužil spojení"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1338
|
#: ../js/ui/components/telepathyClient.js:1339
|
||||||
msgid "Certificate has been revoked"
|
msgid "Certificate has been revoked"
|
||||||
msgstr "Certifikát byl odvolán"
|
msgstr "Certifikát byl odvolán"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1340
|
#: ../js/ui/components/telepathyClient.js:1341
|
||||||
msgid ""
|
msgid ""
|
||||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Certifikát používá nepříliš bezpečný šifrovací algoritmus nebo je z "
|
"Certifikát používá nepříliš bezpečný šifrovací algoritmus nebo je z "
|
||||||
"kryptografického hlediska slabý"
|
"kryptografického hlediska slabý"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1342
|
#: ../js/ui/components/telepathyClient.js:1343
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
"The length of the server certificate, or the depth of the server certificate "
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
"chain, exceed the limits imposed by the cryptography library"
|
||||||
@ -992,22 +996,22 @@ msgstr ""
|
|||||||
"Délka certifikátu serveru nebo délka zřetězených certifikátů serveru "
|
"Délka certifikátu serveru nebo délka zřetězených certifikátů serveru "
|
||||||
"přesáhla omezení dané kryptografickou knihovnou"
|
"přesáhla omezení dané kryptografickou knihovnou"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1344
|
#: ../js/ui/components/telepathyClient.js:1345
|
||||||
msgid "Internal error"
|
msgid "Internal error"
|
||||||
msgstr "Vnitřní chyba"
|
msgstr "Vnitřní chyba"
|
||||||
|
|
||||||
#. translators: argument is the account name, like
|
#. translators: argument is the account name, like
|
||||||
#. * name@jabber.org for example.
|
#. * name@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1354
|
#: ../js/ui/components/telepathyClient.js:1355
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Unable to connect to %s"
|
msgid "Unable to connect to %s"
|
||||||
msgstr "Nelze se připojit k „%s“"
|
msgstr "Nelze se připojit k „%s“"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1359
|
#: ../js/ui/components/telepathyClient.js:1360
|
||||||
msgid "View account"
|
msgid "View account"
|
||||||
msgstr "Zobrazit účet"
|
msgstr "Zobrazit účet"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1398
|
#: ../js/ui/components/telepathyClient.js:1399
|
||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Neznámý důvod"
|
msgstr "Neznámý důvod"
|
||||||
|
|
||||||
@ -1021,19 +1025,19 @@ msgstr "Zobrazit aplikace"
|
|||||||
|
|
||||||
#. Translators: this is the name of the dock/favorites area on
|
#. Translators: this is the name of the dock/favorites area on
|
||||||
#. the left of the overview
|
#. the left of the overview
|
||||||
#: ../js/ui/dash.js:435
|
#: ../js/ui/dash.js:439
|
||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Oblíbené"
|
msgstr "Oblíbené"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:86
|
#: ../js/ui/dateMenu.js:85
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Otevřít kalendář"
|
msgstr "Otevřít kalendář"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:90
|
#: ../js/ui/dateMenu.js:89
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Otevřít Hodiny"
|
msgstr "Otevřít Hodiny"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Nastavení data a času"
|
msgstr "Nastavení data a času"
|
||||||
|
|
||||||
@ -1041,7 +1045,7 @@ msgstr "Nastavení data a času"
|
|||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/dateMenu.js:208
|
#: ../js/ui/dateMenu.js:201
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %e. %B, %Y"
|
msgstr "%A, %e. %B, %Y"
|
||||||
|
|
||||||
@ -1216,15 +1220,15 @@ msgstr "Vymazat zprávy"
|
|||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Nastavení upozornění"
|
msgstr "Nastavení upozornění"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1707
|
#: ../js/ui/messageTray.js:1711
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Žádné zprávy"
|
msgstr "Žádné zprávy"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1780
|
#: ../js/ui/messageTray.js:1784
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Lišta zpráv"
|
msgstr "Lišta zpráv"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2805
|
#: ../js/ui/messageTray.js:2811
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Informace o systému"
|
msgstr "Informace o systému"
|
||||||
|
|
||||||
@ -1233,7 +1237,7 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Neznámé"
|
msgstr "Neznámé"
|
||||||
|
|
||||||
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:150
|
#: ../js/ui/overviewControls.js:474 ../js/ui/screenShield.js:150
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new message"
|
msgid "%d new message"
|
||||||
msgid_plural "%d new messages"
|
msgid_plural "%d new messages"
|
||||||
@ -1257,17 +1261,17 @@ msgstr "Přehled"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Vyhledávejte psaním…"
|
msgstr "Vyhledávejte psaním…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:642
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Ukončit"
|
msgstr "Ukončit"
|
||||||
|
|
||||||
#. Translators: If there is no suitable word for "Activities"
|
#. Translators: If there is no suitable word for "Activities"
|
||||||
#. in your language, you can use the word for "Overview".
|
#. in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:693
|
#: ../js/ui/panel.js:618
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Činnosti"
|
msgstr "Činnosti"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:989
|
#: ../js/ui/panel.js:914
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Horní lišta"
|
msgstr "Horní lišta"
|
||||||
|
|
||||||
@ -1276,7 +1280,7 @@ msgstr "Horní lišta"
|
|||||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||||
#. switches containing "◯" and "|"). Other values will
|
#. switches containing "◯" and "|"). Other values will
|
||||||
#. simply result in invisible toggle switches.
|
#. simply result in invisible toggle switches.
|
||||||
#: ../js/ui/popupMenu.js:738
|
#: ../js/ui/popupMenu.js:549
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
@ -1302,7 +1306,7 @@ msgstr[0] "%d nové upozornění"
|
|||||||
msgstr[1] "%d nová upozornění"
|
msgstr[1] "%d nová upozornění"
|
||||||
msgstr[2] "%d nových upozornění"
|
msgstr[2] "%d nových upozornění"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
|
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Uzamknout"
|
msgstr "Uzamknout"
|
||||||
|
|
||||||
@ -1317,19 +1321,19 @@ msgstr "GNOME potřebuje uzamknout obrazovku"
|
|||||||
#.
|
#.
|
||||||
#. XXX: another option is to kick the user into the gdm login
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
#. screen, where we're not affected by grabs
|
#. screen, where we're not affected by grabs
|
||||||
#: ../js/ui/screenShield.js:773 ../js/ui/screenShield.js:1213
|
#: ../js/ui/screenShield.js:775 ../js/ui/screenShield.js:1215
|
||||||
msgid "Unable to lock"
|
msgid "Unable to lock"
|
||||||
msgstr "Nelze uzamknout obrazovku"
|
msgstr "Nelze uzamknout obrazovku"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214
|
#: ../js/ui/screenShield.js:776 ../js/ui/screenShield.js:1216
|
||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Zamknutí bylo zablokováno některou z aplikací"
|
msgstr "Zamknutí bylo zablokováno některou z aplikací"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:453
|
#: ../js/ui/searchDisplay.js:445
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Hledá se…"
|
msgstr "Hledá se…"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:497
|
#: ../js/ui/searchDisplay.js:489
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Žádné výsledky."
|
msgstr "Žádné výsledky."
|
||||||
|
|
||||||
@ -1357,7 +1361,7 @@ msgstr "Heslo"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Pamatovat si heslo"
|
msgstr "Pamatovat si heslo"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Odemknout"
|
msgstr "Odemknout"
|
||||||
|
|
||||||
@ -1410,9 +1414,9 @@ msgid "Large Text"
|
|||||||
msgstr "Styl velkého textu"
|
msgstr "Styl velkého textu"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
||||||
#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321
|
#: ../js/ui/status/bluetooth.js:290 ../js/ui/status/bluetooth.js:327
|
||||||
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
|
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
|
||||||
#: ../js/ui/status/network.js:739
|
#: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@ -1433,97 +1437,106 @@ msgid "Bluetooth Settings"
|
|||||||
msgstr "Nastavit Bluetooth"
|
msgstr "Nastavit Bluetooth"
|
||||||
|
|
||||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||||
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
|
#: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
|
||||||
msgid "hardware disabled"
|
msgid "hardware disabled"
|
||||||
msgstr "zařízení zakázáno"
|
msgstr "zařízení zakázáno"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:197
|
#: ../js/ui/status/bluetooth.js:198
|
||||||
msgid "Connection"
|
msgid "Connection"
|
||||||
msgstr "Připojení"
|
msgstr "Připojení"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
|
#: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
|
||||||
msgid "disconnecting..."
|
msgid "disconnecting..."
|
||||||
msgstr "odpojování…"
|
msgstr "odpojování…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
|
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
|
||||||
#: ../js/ui/status/network.js:1343
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "připojování…"
|
msgstr "připojování…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:239
|
#: ../js/ui/status/bluetooth.js:240
|
||||||
msgid "Send Files…"
|
msgid "Send Files…"
|
||||||
msgstr "Odeslat soubory…"
|
msgstr "Odeslat soubory…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:246
|
#: ../js/ui/status/bluetooth.js:247
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Nastavení klávesnice"
|
msgstr "Nastavení klávesnice"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:249
|
#: ../js/ui/status/bluetooth.js:250
|
||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "Nastavení myši"
|
msgstr "Nastavení myši"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316
|
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "Nastavení zvuku"
|
msgstr "Nastavení zvuku"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:322
|
#: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Authorization request from %s"
|
msgid "Authorization request from %s"
|
||||||
msgstr "Požadavek na autorizaci od %s"
|
msgstr "Požadavek na autorizaci od %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:328
|
#: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
|
||||||
#, c-format
|
#: ../js/ui/status/bluetooth.js:430
|
||||||
msgid "Device %s wants access to the service '%s'"
|
|
||||||
msgstr "Zařízení %s požaduje přístup ke službě „%s“"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:330
|
|
||||||
msgid "Always grant access"
|
|
||||||
msgstr "Vždy udělovat přístup"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:331
|
|
||||||
msgid "Grant this time only"
|
|
||||||
msgstr "Udělit pouze tentokrát"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:332
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Odmítnout"
|
|
||||||
|
|
||||||
#. Translators: argument is the device short name
|
|
||||||
#: ../js/ui/status/bluetooth.js:359
|
|
||||||
#, c-format
|
|
||||||
msgid "Pairing confirmation for %s"
|
|
||||||
msgstr "Potvrzení spárování pro %s"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "Zařízení %s se chce spárovat s tímto počítačem"
|
msgstr "Zařízení %s se chce spárovat s tímto počítačem"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:336
|
||||||
|
msgid "Allow"
|
||||||
|
msgstr "Povolit"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:337
|
||||||
|
msgid "Deny"
|
||||||
|
msgstr "Zamítnout"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:362
|
||||||
|
#, c-format
|
||||||
|
msgid "Device %s wants access to the service '%s'"
|
||||||
|
msgstr "Zařízení %s požaduje přístup ke službě „%s“"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:364
|
||||||
|
msgid "Always grant access"
|
||||||
|
msgstr "Vždy udělovat přístup"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:365
|
||||||
|
msgid "Grant this time only"
|
||||||
|
msgstr "Udělit pouze tentokrát"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:366
|
#: ../js/ui/status/bluetooth.js:366
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "Odmítnout"
|
||||||
|
|
||||||
|
#. Translators: argument is the device short name
|
||||||
|
#: ../js/ui/status/bluetooth.js:393
|
||||||
|
#, c-format
|
||||||
|
msgid "Pairing confirmation for %s"
|
||||||
|
msgstr "Potvrzení spárování pro %s"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:400
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
||||||
msgstr "Ověřte prosím, zda klíč „%06d“ odpovídá tomu na zařízení."
|
msgstr "Ověřte prosím, zda klíč „%06d“ odpovídá tomu na zařízení."
|
||||||
|
|
||||||
#. Translators: this is the verb, not the noun
|
#. Translators: this is the verb, not the noun
|
||||||
#: ../js/ui/status/bluetooth.js:369
|
#: ../js/ui/status/bluetooth.js:403
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
msgstr "Souhlasí"
|
msgstr "Souhlasí"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:370
|
#: ../js/ui/status/bluetooth.js:404
|
||||||
msgid "Does not match"
|
msgid "Does not match"
|
||||||
msgstr "Nesouhlasí"
|
msgstr "Nesouhlasí"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:389
|
#: ../js/ui/status/bluetooth.js:423
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing request for %s"
|
msgid "Pairing request for %s"
|
||||||
msgstr "Požadavek na spárování pro %s"
|
msgstr "Požadavek na spárování pro %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:397
|
#: ../js/ui/status/bluetooth.js:431
|
||||||
msgid "Please enter the PIN mentioned on the device."
|
msgid "Please enter the PIN mentioned on the device."
|
||||||
msgstr "Zadejte prosím PIN, který je uveden na zařízení."
|
msgstr "Zadejte prosím PIN, který je uveden na zařízení."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:414
|
#: ../js/ui/status/bluetooth.js:448
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "Budiž"
|
msgstr "Budiž"
|
||||||
|
|
||||||
@ -1543,87 +1556,81 @@ msgstr "Hlasitost, síť, baterie"
|
|||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<neznámé>"
|
msgstr "<neznámé>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:127
|
#: ../js/ui/status/network.js:125
|
||||||
msgid "Wi-Fi"
|
msgid "Wi-Fi"
|
||||||
msgstr "Wi-Fi"
|
msgstr "Wi-Fi"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:164
|
#: ../js/ui/status/network.js:162
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "zakázáno"
|
msgstr "zakázáno"
|
||||||
|
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu)
|
#. under NetworkManager's control (and thus cannot be used in the menu)
|
||||||
#: ../js/ui/status/network.js:402
|
#: ../js/ui/status/network.js:397
|
||||||
msgid "unmanaged"
|
msgid "unmanaged"
|
||||||
msgstr "nespravováno"
|
msgstr "nespravováno"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
|
#: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "je vyžadováno ověření"
|
msgstr "je vyžadováno ověření"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
#: ../js/ui/status/network.js:423
|
#: ../js/ui/status/network.js:419
|
||||||
msgid "firmware missing"
|
msgid "firmware missing"
|
||||||
msgstr "nedostupný firmware"
|
msgstr "nedostupný firmware"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
|
||||||
#: ../js/ui/status/network.js:430
|
|
||||||
msgid "cable unplugged"
|
|
||||||
msgstr "kabel byl odpojen"
|
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:435
|
#: ../js/ui/status/network.js:423
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "nedostupné"
|
msgstr "nedostupné"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
|
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "připojení selhalo"
|
msgstr "připojení selhalo"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
|
#: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
|
||||||
#: ../js/ui/status/network.js:1424
|
|
||||||
msgid "More…"
|
msgid "More…"
|
||||||
msgstr "Další…"
|
msgstr "Další…"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
|
#: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "Připojení (soukromé)"
|
msgstr "Připojení (soukromé)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:597
|
#: ../js/ui/status/network.js:572
|
||||||
msgid "Wired"
|
msgid "Wired"
|
||||||
msgstr "Drátová"
|
msgstr "Drátová"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:611
|
#: ../js/ui/status/network.js:592
|
||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "Mobilní širokopásmová"
|
msgstr "Mobilní širokopásmová"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1522
|
#: ../js/ui/status/network.js:1474
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr "Povolit síť"
|
msgstr "Povolit síť"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1583
|
#: ../js/ui/status/network.js:1522
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Nastavení sítě"
|
msgstr "Nastavení sítě"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1600
|
#: ../js/ui/status/network.js:1539
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Network Manager"
|
msgstr "Network Manager"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1690
|
#: ../js/ui/status/network.js:1623
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Připojení selhalo"
|
msgstr "Připojení selhalo"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1691
|
#: ../js/ui/status/network.js:1624
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Aktivace síťového připojení selhala"
|
msgstr "Aktivace síťového připojení selhala"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2047
|
#: ../js/ui/status/network.js:1937
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "Síť je zakázána"
|
msgstr "Síť je zakázána"
|
||||||
|
|
||||||
@ -1728,72 +1735,72 @@ msgctxt "device"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Neznámé"
|
msgstr "Neznámé"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:124
|
#: ../js/ui/status/volume.js:121
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Hlasitost změněna"
|
msgstr "Hlasitost změněna"
|
||||||
|
|
||||||
#. Translators: This is the label for audio volume
|
#. Translators: This is the label for audio volume
|
||||||
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297
|
#: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Hlasitost"
|
msgstr "Hlasitost"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:258
|
#: ../js/ui/status/volume.js:255
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Mikrofon"
|
msgstr "Mikrofon"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:120
|
#: ../js/ui/unlockDialog.js:119
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Přihlásit se jako jiný uživatel"
|
msgstr "Přihlásit se jako jiný uživatel"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:141
|
#: ../js/ui/unlockDialog.js:140
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Odemykací okno"
|
msgstr "Odemykací okno"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:193
|
#: ../js/ui/userMenu.js:149
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "Přítomen"
|
msgstr "Přítomen"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:196
|
#: ../js/ui/userMenu.js:152
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Zaneprázdněn"
|
msgstr "Zaneprázdněn"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:199
|
#: ../js/ui/userMenu.js:155
|
||||||
msgid "Invisible"
|
msgid "Invisible"
|
||||||
msgstr "Neviditelný"
|
msgstr "Neviditelný"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:202
|
#: ../js/ui/userMenu.js:158
|
||||||
msgid "Away"
|
msgid "Away"
|
||||||
msgstr "Nepřítomen"
|
msgstr "Nepřítomen"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:205
|
#: ../js/ui/userMenu.js:161
|
||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "Nečinný"
|
msgstr "Nečinný"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:208
|
#: ../js/ui/userMenu.js:164
|
||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Odpojen"
|
msgstr "Odpojen"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:781
|
#: ../js/ui/userMenu.js:736
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Upozornění"
|
msgstr "Upozornění"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:797
|
#: ../js/ui/userMenu.js:749
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Přepnout uživatele"
|
msgstr "Přepnout uživatele"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:802
|
#: ../js/ui/userMenu.js:754
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Odhlásit se"
|
msgstr "Odhlásit se"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:822
|
#: ../js/ui/userMenu.js:774
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Nainstalovat aktualizace a restartovat"
|
msgstr "Nainstalovat aktualizace a restartovat"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:840
|
#: ../js/ui/userMenu.js:792
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Váš stav v konverzacích byl nastaven na „Zaneprázdněn“"
|
msgstr "Váš stav v konverzacích byl nastaven na „Zaneprázdněn“"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:841
|
#: ../js/ui/userMenu.js:793
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1801,22 +1808,22 @@ msgstr ""
|
|||||||
"Upozornění jsou nyní vypnuta, včetně zpráv v konverzacích. Váš stav on-line "
|
"Upozornění jsou nyní vypnuta, včetně zpráv v konverzacích. Váš stav on-line "
|
||||||
"byl změněn tak, aby ostatní věděli, že si jejich zprávy nemusíte přečíst."
|
"byl změněn tak, aby ostatní věděli, že si jejich zprávy nemusíte přečíst."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:888
|
#: ../js/ui/userMenu.js:834
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "Jsou přihlášeni jiní uživatelé."
|
msgstr "Jsou přihlášeni jiní uživatelé."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:893
|
#: ../js/ui/userMenu.js:839
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr "Vypnutí by mohlo způsobit ztrátu jejich neuložené práce."
|
msgstr "Vypnutí by mohlo způsobit ztrátu jejich neuložené práce."
|
||||||
|
|
||||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
#: ../js/ui/userMenu.js:921
|
#: ../js/ui/userMenu.js:867
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (vzdálený)"
|
msgstr "%s (vzdálený)"
|
||||||
|
|
||||||
#. Translators: Console here refers to a tty like a VT console
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
#: ../js/ui/userMenu.js:924
|
#: ../js/ui/userMenu.js:870
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (konzole)"
|
msgstr "%s (konzole)"
|
||||||
@ -1876,19 +1883,19 @@ msgstr[2] "%u vstupů"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Systémové zvuky"
|
msgstr "Systémové zvuky"
|
||||||
|
|
||||||
#: ../src/main.c:372
|
#: ../src/main.c:353
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Vypsat verzi"
|
msgstr "Vypsat verzi"
|
||||||
|
|
||||||
#: ../src/main.c:378
|
#: ../src/main.c:359
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Režim použitý GDM pro přihlašovací obrazovku"
|
msgstr "Režim použitý GDM pro přihlašovací obrazovku"
|
||||||
|
|
||||||
#: ../src/main.c:384
|
#: ../src/main.c:365
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr "Použít pro přihlašovací obrazovku určitý mód, např. „gdm“."
|
msgstr "Použít pro přihlašovací obrazovku určitý mód, např. „gdm“."
|
||||||
|
|
||||||
#: ../src/main.c:390
|
#: ../src/main.c:371
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Vypsat možné režimy"
|
msgstr "Vypsat možné režimy"
|
||||||
|
|
||||||
|
388
po/es.po
388
po/es.po
@ -10,8 +10,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell.master\n"
|
"Project-Id-Version: gnome-shell.master\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-05-25 08:18+0000\n"
|
"POT-Creation-Date: 2013-06-26 18:42+0000\n"
|
||||||
"PO-Revision-Date: 2013-05-27 13:23+0200\n"
|
"PO-Revision-Date: 2013-06-27 12:33+0200\n"
|
||||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||||
"Language-Team: Español <gnome-es-list@gnome.org>\n"
|
"Language-Team: Español <gnome-es-list@gnome.org>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@ -369,37 +369,43 @@ msgid "Select an extension to configure using the combobox above."
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Seleccione una extensión que configurar usando la caja combinada de arriba."
|
"Seleccione una extensión que configurar usando la caja combinada de arriba."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:371
|
#: ../js/gdm/loginDialog.js:302
|
||||||
msgid "Session…"
|
#| msgid "Switch Session"
|
||||||
msgstr "Sesión…"
|
msgid "Choose Session"
|
||||||
|
msgstr "Elegir sesión"
|
||||||
|
|
||||||
|
#: ../js/gdm/loginDialog.js:320
|
||||||
|
#| msgid "Session…"
|
||||||
|
msgid "Session"
|
||||||
|
msgstr "Sesión"
|
||||||
|
|
||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:601
|
#: ../js/gdm/loginDialog.js:522
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "¿No está en la lista?"
|
msgstr "¿No está en la lista?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:739 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
|
#: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
|
||||||
#: ../js/ui/userMenu.js:938
|
#: ../js/ui/userMenu.js:884
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:768
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Iniciar sesión"
|
msgstr "Iniciar sesión"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:768
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Siguiente"
|
msgstr "Siguiente"
|
||||||
|
|
||||||
#. Translators: this message is shown below the username entry field
|
#. Translators: this message is shown below the username entry field
|
||||||
#. to clue the user in on how to login to the local network realm
|
#. to clue the user in on how to login to the local network realm
|
||||||
#: ../js/gdm/loginDialog.js:888
|
#: ../js/gdm/loginDialog.js:869
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(ej., usuario o %s)"
|
msgstr "(ej., usuario o %s)"
|
||||||
@ -407,12 +413,12 @@ msgstr "(ej., usuario o %s)"
|
|||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:873 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Nombre de usuario:"
|
msgstr "Nombre de usuario:"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1158
|
#: ../js/gdm/loginDialog.js:1140
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Ventana de inicio de sesión"
|
msgstr "Ventana de inicio de sesión"
|
||||||
|
|
||||||
@ -421,8 +427,8 @@ msgstr "Ventana de inicio de sesión"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Energía"
|
msgstr "Energía"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
|
||||||
#: ../js/ui/userMenu.js:816
|
#: ../js/ui/userMenu.js:768
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Suspender"
|
msgstr "Suspender"
|
||||||
|
|
||||||
@ -430,18 +436,18 @@ msgstr "Suspender"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Reiniciar"
|
msgstr "Reiniciar"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
|
||||||
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
#: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Apagar"
|
msgstr "Apagar"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:247
|
#: ../js/gdm/util.js:248
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Error de autenticación"
|
msgstr "Error de autenticación"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: ../js/gdm/util.js:364
|
#: ../js/gdm/util.js:365
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(o pase el dedo)"
|
msgstr "(o pase el dedo)"
|
||||||
|
|
||||||
@ -460,23 +466,23 @@ msgstr "No se pudo analizar el comando:"
|
|||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Falló la ejecución de «%s»:"
|
msgstr "Falló la ejecución de «%s»:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:361
|
#: ../js/ui/appDisplay.js:397
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Frecuentes"
|
msgstr "Frecuentes"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:368
|
#: ../js/ui/appDisplay.js:404
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todas"
|
msgstr "Todas"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:960
|
#: ../js/ui/appDisplay.js:996
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Ventana nueva"
|
msgstr "Ventana nueva"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Quitar de los favoritos"
|
msgstr "Quitar de los favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:964
|
#: ../js/ui/appDisplay.js:1000
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Añadir a los favoritos"
|
msgstr "Añadir a los favoritos"
|
||||||
|
|
||||||
@ -490,7 +496,7 @@ msgstr "Se ha añadido %s a sus favoritos."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "Se ha quitado %s de sus favoritos."
|
msgstr "Se ha quitado %s de sus favoritos."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configuración"
|
msgstr "Configuración"
|
||||||
|
|
||||||
@ -615,35 +621,35 @@ msgid "S"
|
|||||||
msgstr "S"
|
msgstr "S"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:735
|
#: ../js/ui/calendar.js:750
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nada programado"
|
msgstr "Nada programado"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:751
|
#: ../js/ui/calendar.js:768
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %d de %B"
|
msgstr "%A, %d de %B"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:754
|
#: ../js/ui/calendar.js:771
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %d de %B de %Y"
|
msgstr "%A, %d de %B de %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:764
|
#: ../js/ui/calendar.js:782
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Hoy"
|
msgstr "Hoy"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:768
|
#: ../js/ui/calendar.js:786
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Mañana"
|
msgstr "Mañana"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:779
|
#: ../js/ui/calendar.js:797
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Esta semana"
|
msgstr "Esta semana"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:787
|
#: ../js/ui/calendar.js:805
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "La semana que viene"
|
msgstr "La semana que viene"
|
||||||
|
|
||||||
@ -832,14 +838,14 @@ msgstr "<b>%d</b> de <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
|
|||||||
|
|
||||||
#. Translators: this is the other person changing their old IM name to their new
|
#. Translators: this is the other person changing their old IM name to their new
|
||||||
#. IM name.
|
#. IM name.
|
||||||
#: ../js/ui/components/telepathyClient.js:985
|
#: ../js/ui/components/telepathyClient.js:986
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is now known as %s"
|
msgid "%s is now known as %s"
|
||||||
msgstr "Ahora %s se llama %s"
|
msgstr "Ahora %s se llama %s"
|
||||||
|
|
||||||
#. translators: argument is a room name like
|
#. translators: argument is a room name like
|
||||||
#. * room@jabber.org for example.
|
#. * room@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1088
|
#: ../js/ui/components/telepathyClient.js:1089
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invitation to %s"
|
msgid "Invitation to %s"
|
||||||
msgstr "Invitación a %s"
|
msgstr "Invitación a %s"
|
||||||
@ -847,38 +853,38 @@ msgstr "Invitación a %s"
|
|||||||
#. translators: first argument is the name of a contact and the second
|
#. translators: first argument is the name of a contact and the second
|
||||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||||
#. * for example.
|
#. * for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1096
|
#: ../js/ui/components/telepathyClient.js:1097
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is inviting you to join %s"
|
msgid "%s is inviting you to join %s"
|
||||||
msgstr "%s le está invitando a unirse a %s"
|
msgstr "%s le está invitando a unirse a %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1098
|
#: ../js/ui/components/telepathyClient.js:1099
|
||||||
#: ../js/ui/components/telepathyClient.js:1137
|
#: ../js/ui/components/telepathyClient.js:1138
|
||||||
#: ../js/ui/components/telepathyClient.js:1177
|
#: ../js/ui/components/telepathyClient.js:1178
|
||||||
#: ../js/ui/components/telepathyClient.js:1240
|
#: ../js/ui/components/telepathyClient.js:1241
|
||||||
msgid "Decline"
|
msgid "Decline"
|
||||||
msgstr "Rechazar"
|
msgstr "Rechazar"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1099
|
#: ../js/ui/components/telepathyClient.js:1100
|
||||||
#: ../js/ui/components/telepathyClient.js:1178
|
#: ../js/ui/components/telepathyClient.js:1179
|
||||||
#: ../js/ui/components/telepathyClient.js:1241
|
#: ../js/ui/components/telepathyClient.js:1242
|
||||||
msgid "Accept"
|
msgid "Accept"
|
||||||
msgstr "Aceptar"
|
msgstr "Aceptar"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1129
|
#: ../js/ui/components/telepathyClient.js:1130
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Video call from %s"
|
msgid "Video call from %s"
|
||||||
msgstr "Videollamada de %s"
|
msgstr "Videollamada de %s"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1132
|
#: ../js/ui/components/telepathyClient.js:1133
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Call from %s"
|
msgid "Call from %s"
|
||||||
msgstr "Llamada de %s"
|
msgstr "Llamada de %s"
|
||||||
|
|
||||||
#. translators: this is a button label (verb), not a noun
|
#. translators: this is a button label (verb), not a noun
|
||||||
#: ../js/ui/components/telepathyClient.js:1139
|
#: ../js/ui/components/telepathyClient.js:1140
|
||||||
msgid "Answer"
|
msgid "Answer"
|
||||||
msgstr "Responder"
|
msgstr "Responder"
|
||||||
|
|
||||||
@ -887,112 +893,112 @@ msgstr "Responder"
|
|||||||
#. * file name. The string will be something
|
#. * file name. The string will be something
|
||||||
#. * like: "Alice is sending you test.ogg"
|
#. * like: "Alice is sending you test.ogg"
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/components/telepathyClient.js:1171
|
#: ../js/ui/components/telepathyClient.js:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is sending you %s"
|
msgid "%s is sending you %s"
|
||||||
msgstr "%s le está enviando %s"
|
msgstr "%s le está enviando %s"
|
||||||
|
|
||||||
#. To translators: The parameter is the contact's alias
|
#. To translators: The parameter is the contact's alias
|
||||||
#: ../js/ui/components/telepathyClient.js:1206
|
#: ../js/ui/components/telepathyClient.js:1207
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s would like permission to see when you are online"
|
msgid "%s would like permission to see when you are online"
|
||||||
msgstr "%s solicita permiso para ver cuándo está en línea"
|
msgstr "%s solicita permiso para ver cuándo está en línea"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1298
|
#: ../js/ui/components/telepathyClient.js:1299
|
||||||
msgid "Network error"
|
msgid "Network error"
|
||||||
msgstr "Error de la red"
|
msgstr "Error de la red"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1300
|
#: ../js/ui/components/telepathyClient.js:1301
|
||||||
msgid "Authentication failed"
|
msgid "Authentication failed"
|
||||||
msgstr "Falló la autenticación"
|
msgstr "Falló la autenticación"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1302
|
#: ../js/ui/components/telepathyClient.js:1303
|
||||||
msgid "Encryption error"
|
msgid "Encryption error"
|
||||||
msgstr "Error de cifrado"
|
msgstr "Error de cifrado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1304
|
#: ../js/ui/components/telepathyClient.js:1305
|
||||||
msgid "Certificate not provided"
|
msgid "Certificate not provided"
|
||||||
msgstr "Certificado no proporcionado"
|
msgstr "Certificado no proporcionado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1306
|
#: ../js/ui/components/telepathyClient.js:1307
|
||||||
msgid "Certificate untrusted"
|
msgid "Certificate untrusted"
|
||||||
msgstr "No se confía en el certificado"
|
msgstr "No se confía en el certificado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1308
|
#: ../js/ui/components/telepathyClient.js:1309
|
||||||
msgid "Certificate expired"
|
msgid "Certificate expired"
|
||||||
msgstr "Certificado caducado"
|
msgstr "Certificado caducado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1310
|
#: ../js/ui/components/telepathyClient.js:1311
|
||||||
msgid "Certificate not activated"
|
msgid "Certificate not activated"
|
||||||
msgstr "Certificado no activado"
|
msgstr "Certificado no activado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1312
|
#: ../js/ui/components/telepathyClient.js:1313
|
||||||
msgid "Certificate hostname mismatch"
|
msgid "Certificate hostname mismatch"
|
||||||
msgstr "El nombre del servidor dle certificado no coincide"
|
msgstr "El nombre del servidor dle certificado no coincide"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1314
|
#: ../js/ui/components/telepathyClient.js:1315
|
||||||
msgid "Certificate fingerprint mismatch"
|
msgid "Certificate fingerprint mismatch"
|
||||||
msgstr "La huella del certificado no coincide"
|
msgstr "La huella del certificado no coincide"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1316
|
#: ../js/ui/components/telepathyClient.js:1317
|
||||||
msgid "Certificate self-signed"
|
msgid "Certificate self-signed"
|
||||||
msgstr "Certificado autofirmado"
|
msgstr "Certificado autofirmado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1318
|
#: ../js/ui/components/telepathyClient.js:1319
|
||||||
msgid "Status is set to offline"
|
msgid "Status is set to offline"
|
||||||
msgstr "El estado está establecido a «desconectado»"
|
msgstr "El estado está establecido a «desconectado»"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1320
|
#: ../js/ui/components/telepathyClient.js:1321
|
||||||
msgid "Encryption is not available"
|
msgid "Encryption is not available"
|
||||||
msgstr "El cifrado no está disponible"
|
msgstr "El cifrado no está disponible"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1322
|
#: ../js/ui/components/telepathyClient.js:1323
|
||||||
msgid "Certificate is invalid"
|
msgid "Certificate is invalid"
|
||||||
msgstr "El certificado no es válido"
|
msgstr "El certificado no es válido"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1324
|
#: ../js/ui/components/telepathyClient.js:1325
|
||||||
msgid "Connection has been refused"
|
msgid "Connection has been refused"
|
||||||
msgstr "Se ha rechazado la conexión"
|
msgstr "Se ha rechazado la conexión"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1326
|
#: ../js/ui/components/telepathyClient.js:1327
|
||||||
msgid "Connection can't be established"
|
msgid "Connection can't be established"
|
||||||
msgstr "No se puede establecer la conexión"
|
msgstr "No se puede establecer la conexión"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1328
|
#: ../js/ui/components/telepathyClient.js:1329
|
||||||
msgid "Connection has been lost"
|
msgid "Connection has been lost"
|
||||||
msgstr "Se ha perdido la conexión"
|
msgstr "Se ha perdido la conexión"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1330
|
#: ../js/ui/components/telepathyClient.js:1331
|
||||||
msgid "This account is already connected to the server"
|
msgid "This account is already connected to the server"
|
||||||
msgstr "Esta cuenta ya está conectada al servidor"
|
msgstr "Esta cuenta ya está conectada al servidor"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1332
|
#: ../js/ui/components/telepathyClient.js:1333
|
||||||
msgid ""
|
msgid ""
|
||||||
"Connection has been replaced by a new connection using the same resource"
|
"Connection has been replaced by a new connection using the same resource"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Se ha sustituido la conexión por una nueva conexión usando el mismo recurso"
|
"Se ha sustituido la conexión por una nueva conexión usando el mismo recurso"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1334
|
#: ../js/ui/components/telepathyClient.js:1335
|
||||||
msgid "The account already exists on the server"
|
msgid "The account already exists on the server"
|
||||||
msgstr "La cuenta ya existe en el servidor"
|
msgstr "La cuenta ya existe en el servidor"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1336
|
#: ../js/ui/components/telepathyClient.js:1337
|
||||||
msgid "Server is currently too busy to handle the connection"
|
msgid "Server is currently too busy to handle the connection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Actualmente el servidor está muy ocupado intentando gestionar la conexión"
|
"Actualmente el servidor está muy ocupado intentando gestionar la conexión"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1338
|
#: ../js/ui/components/telepathyClient.js:1339
|
||||||
msgid "Certificate has been revoked"
|
msgid "Certificate has been revoked"
|
||||||
msgstr "Se ha revocado el certificado"
|
msgstr "Se ha revocado el certificado"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1340
|
#: ../js/ui/components/telepathyClient.js:1341
|
||||||
msgid ""
|
msgid ""
|
||||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"El certificado usa un algoritmo de cifrado inseguro o es criptográficamente "
|
"El certificado usa un algoritmo de cifrado inseguro o es criptográficamente "
|
||||||
"débil"
|
"débil"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1342
|
#: ../js/ui/components/telepathyClient.js:1343
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
"The length of the server certificate, or the depth of the server certificate "
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
"chain, exceed the limits imposed by the cryptography library"
|
||||||
@ -1001,22 +1007,22 @@ msgstr ""
|
|||||||
"certificado del servidor exceden los límites impuestos por la biblioteca de "
|
"certificado del servidor exceden los límites impuestos por la biblioteca de "
|
||||||
"criptografía"
|
"criptografía"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1344
|
#: ../js/ui/components/telepathyClient.js:1345
|
||||||
msgid "Internal error"
|
msgid "Internal error"
|
||||||
msgstr "Error interno"
|
msgstr "Error interno"
|
||||||
|
|
||||||
#. translators: argument is the account name, like
|
#. translators: argument is the account name, like
|
||||||
#. * name@jabber.org for example.
|
#. * name@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1354
|
#: ../js/ui/components/telepathyClient.js:1355
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Unable to connect to %s"
|
msgid "Unable to connect to %s"
|
||||||
msgstr "No se pudo conectar a %s"
|
msgstr "No se pudo conectar a %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1359
|
#: ../js/ui/components/telepathyClient.js:1360
|
||||||
msgid "View account"
|
msgid "View account"
|
||||||
msgstr "Ver cuenta"
|
msgstr "Ver cuenta"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1398
|
#: ../js/ui/components/telepathyClient.js:1399
|
||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Razón desconocida"
|
msgstr "Razón desconocida"
|
||||||
|
|
||||||
@ -1030,26 +1036,26 @@ msgstr "Mostrar aplicaciones"
|
|||||||
|
|
||||||
#. Translators: this is the name of the dock/favorites area on
|
#. Translators: this is the name of the dock/favorites area on
|
||||||
#. the left of the overview
|
#. the left of the overview
|
||||||
#: ../js/ui/dash.js:435
|
#: ../js/ui/dash.js:439
|
||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Tablero"
|
msgstr "Tablero"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:86
|
#: ../js/ui/dateMenu.js:85
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Abrir calendario"
|
msgstr "Abrir calendario"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:90
|
#: ../js/ui/dateMenu.js:89
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Abrir Relojes"
|
msgstr "Abrir Relojes"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Configuración de hora y fecha"
|
msgstr "Configuración de hora y fecha"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/dateMenu.js:208
|
#: ../js/ui/dateMenu.js:201
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %e de %B de %Y"
|
msgstr "%A, %e de %B de %Y"
|
||||||
|
|
||||||
@ -1153,7 +1159,7 @@ msgstr "Instalar"
|
|||||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||||
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
|
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
|
||||||
|
|
||||||
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
|
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
|
||||||
#: ../js/ui/status/power.js:211
|
#: ../js/ui/status/power.js:211
|
||||||
msgid "Keyboard"
|
msgid "Keyboard"
|
||||||
msgstr "Teclado"
|
msgstr "Teclado"
|
||||||
@ -1222,15 +1228,15 @@ msgstr "Limpiar mensajes"
|
|||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Configuración de las notificaciones"
|
msgstr "Configuración de las notificaciones"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1707
|
#: ../js/ui/messageTray.js:1711
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "No hay mensajes"
|
msgstr "No hay mensajes"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1780
|
#: ../js/ui/messageTray.js:1784
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Bandeja de mensajes"
|
msgstr "Bandeja de mensajes"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2800
|
#: ../js/ui/messageTray.js:2811
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Información del sistema"
|
msgstr "Información del sistema"
|
||||||
|
|
||||||
@ -1239,7 +1245,7 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconocido"
|
msgstr "Desconocido"
|
||||||
|
|
||||||
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:150
|
#: ../js/ui/overviewControls.js:474 ../js/ui/screenShield.js:150
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new message"
|
msgid "%d new message"
|
||||||
msgid_plural "%d new messages"
|
msgid_plural "%d new messages"
|
||||||
@ -1262,17 +1268,17 @@ msgstr "Vista general"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Escribir para buscar…"
|
msgstr "Escribir para buscar…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:642
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Salir"
|
msgstr "Salir"
|
||||||
|
|
||||||
#. Translators: If there is no suitable word for "Activities"
|
#. Translators: If there is no suitable word for "Activities"
|
||||||
#. in your language, you can use the word for "Overview".
|
#. in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:693
|
#: ../js/ui/panel.js:618
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Actividades"
|
msgstr "Actividades"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:989
|
#: ../js/ui/panel.js:914
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Barra superior"
|
msgstr "Barra superior"
|
||||||
|
|
||||||
@ -1281,7 +1287,7 @@ msgstr "Barra superior"
|
|||||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||||
#. switches containing "◯" and "|"). Other values will
|
#. switches containing "◯" and "|"). Other values will
|
||||||
#. simply result in invisible toggle switches.
|
#. simply result in invisible toggle switches.
|
||||||
#: ../js/ui/popupMenu.js:738
|
#: ../js/ui/popupMenu.js:549
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
@ -1306,7 +1312,7 @@ msgid_plural "%d new notifications"
|
|||||||
msgstr[0] "%d notificación nueva"
|
msgstr[0] "%d notificación nueva"
|
||||||
msgstr[1] "%d notificaciones nuevas"
|
msgstr[1] "%d notificaciones nuevas"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
|
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Bloquear"
|
msgstr "Bloquear"
|
||||||
|
|
||||||
@ -1329,11 +1335,11 @@ msgstr "No se pudo bloquear"
|
|||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Una aplicación impidió el bloqueo"
|
msgstr "Una aplicación impidió el bloqueo"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:453
|
#: ../js/ui/searchDisplay.js:445
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Buscando…"
|
msgstr "Buscando…"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:497
|
#: ../js/ui/searchDisplay.js:489
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "No se encontraron resultados."
|
msgstr "No se encontraron resultados."
|
||||||
|
|
||||||
@ -1361,7 +1367,7 @@ msgstr "Contraseña"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Recordar contraseña"
|
msgstr "Recordar contraseña"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Desbloquear"
|
msgstr "Desbloquear"
|
||||||
|
|
||||||
@ -1414,9 +1420,9 @@ msgid "Large Text"
|
|||||||
msgstr "Texto grande"
|
msgstr "Texto grande"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
||||||
#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321
|
#: ../js/ui/status/bluetooth.js:290 ../js/ui/status/bluetooth.js:327
|
||||||
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
|
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
|
||||||
#: ../js/ui/status/network.js:739
|
#: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@ -1437,107 +1443,115 @@ msgid "Bluetooth Settings"
|
|||||||
msgstr "Configuración de Bluetooth"
|
msgstr "Configuración de Bluetooth"
|
||||||
|
|
||||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||||
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
|
#: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
|
||||||
msgid "hardware disabled"
|
msgid "hardware disabled"
|
||||||
msgstr "hardware desactivado"
|
msgstr "hardware desactivado"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:197
|
#: ../js/ui/status/bluetooth.js:198
|
||||||
msgid "Connection"
|
msgid "Connection"
|
||||||
msgstr "Conexión"
|
msgstr "Conexión"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
|
#: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
|
||||||
msgid "disconnecting..."
|
msgid "disconnecting..."
|
||||||
msgstr "deconectando…"
|
msgstr "deconectando…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
|
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
|
||||||
#: ../js/ui/status/network.js:1343
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "conectando…"
|
msgstr "conectando…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:239
|
#: ../js/ui/status/bluetooth.js:240
|
||||||
msgid "Send Files…"
|
msgid "Send Files…"
|
||||||
msgstr "Enviar archivos…"
|
msgstr "Enviar archivos…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:246
|
#: ../js/ui/status/bluetooth.js:247
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Configuración del teclado"
|
msgstr "Configuración del teclado"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:249
|
#: ../js/ui/status/bluetooth.js:250
|
||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "Configuración del ratón…"
|
msgstr "Configuración del ratón…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316
|
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "Configuración del sonido"
|
msgstr "Configuración del sonido"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:322
|
#: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Authorization request from %s"
|
msgid "Authorization request from %s"
|
||||||
msgstr "Solicitud de autorización de %s"
|
msgstr "Solicitud de autorización de %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:328
|
#: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
|
||||||
#, c-format
|
#: ../js/ui/status/bluetooth.js:430
|
||||||
msgid "Device %s wants access to the service '%s'"
|
|
||||||
msgstr "El dispositivo %s quiere acceder al servicio «%s»"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:330
|
|
||||||
msgid "Always grant access"
|
|
||||||
msgstr "Conceder acceso siempre"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:331
|
|
||||||
msgid "Grant this time only"
|
|
||||||
msgstr "Conceder sólo esta vez"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:332
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Rechazar"
|
|
||||||
|
|
||||||
#. Translators: argument is the device short name
|
|
||||||
#: ../js/ui/status/bluetooth.js:359
|
|
||||||
#, c-format
|
|
||||||
msgid "Pairing confirmation for %s"
|
|
||||||
msgstr "Confirmación de emparejamiento para «%s»"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
|
msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:366
|
#: ../js/ui/status/bluetooth.js:336
|
||||||
|
msgid "Allow"
|
||||||
|
msgstr "Permitir"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:337
|
||||||
|
msgid "Deny"
|
||||||
|
msgstr "Denegar"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:362
|
||||||
|
#, c-format
|
||||||
|
msgid "Device %s wants access to the service '%s'"
|
||||||
|
msgstr "El dispositivo %s quiere acceder al servicio «%s»"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:364
|
||||||
|
msgid "Always grant access"
|
||||||
|
msgstr "Conceder acceso siempre"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:365
|
||||||
|
msgid "Grant this time only"
|
||||||
|
msgstr "Conceder sólo esta vez"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:366
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "Rechazar"
|
||||||
|
|
||||||
|
#. Translators: argument is the device short name
|
||||||
|
#: ../js/ui/status/bluetooth.js:393
|
||||||
|
#, c-format
|
||||||
|
msgid "Pairing confirmation for %s"
|
||||||
|
msgstr "Confirmación de emparejamiento para «%s»"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:400
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "Please confirm whether the PIN '%06d' matches the one on the device."
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Confirme que la clave mostrada en «%06d» coincide con la del dispositivo."
|
"Confirme que la clave mostrada en «%06d» coincide con la del dispositivo."
|
||||||
|
|
||||||
#. Translators: this is the verb, not the noun
|
#. Translators: this is the verb, not the noun
|
||||||
#: ../js/ui/status/bluetooth.js:369
|
#: ../js/ui/status/bluetooth.js:403
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
msgstr "Coincide"
|
msgstr "Coincide"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:370
|
#: ../js/ui/status/bluetooth.js:404
|
||||||
msgid "Does not match"
|
msgid "Does not match"
|
||||||
msgstr "No coincide"
|
msgstr "No coincide"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:389
|
#: ../js/ui/status/bluetooth.js:423
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing request for %s"
|
msgid "Pairing request for %s"
|
||||||
msgstr "Solicitud de emparejamiento para «%s»"
|
msgstr "Solicitud de emparejamiento para «%s»"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:397
|
#: ../js/ui/status/bluetooth.js:431
|
||||||
msgid "Please enter the PIN mentioned on the device."
|
msgid "Please enter the PIN mentioned on the device."
|
||||||
msgstr "Introduzca el PIN mencionado en el dispositivo."
|
msgstr "Introduzca el PIN mencionado en el dispositivo."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:414
|
#: ../js/ui/status/bluetooth.js:448
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "Aceptar"
|
msgstr "Aceptar"
|
||||||
|
|
||||||
#: ../js/ui/status/keyboard.js:368
|
#: ../js/ui/status/keyboard.js:396
|
||||||
msgid "Show Keyboard Layout"
|
msgid "Show Keyboard Layout"
|
||||||
msgstr "Mostrar la distribución del teclado"
|
msgstr "Mostrar la distribución del teclado"
|
||||||
|
|
||||||
#: ../js/ui/status/keyboard.js:373
|
#: ../js/ui/status/keyboard.js:401
|
||||||
msgid "Region & Language Settings"
|
msgid "Region & Language Settings"
|
||||||
msgstr "Configuración de región e idioma"
|
msgstr "Configuración de región e idioma"
|
||||||
|
|
||||||
@ -1549,87 +1563,81 @@ msgstr "Volumen, red, batería"
|
|||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<desconocido>"
|
msgstr "<desconocido>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:127
|
#: ../js/ui/status/network.js:125
|
||||||
msgid "Wi-Fi"
|
msgid "Wi-Fi"
|
||||||
msgstr "Wi-Fi"
|
msgstr "Wi-Fi"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:164
|
#: ../js/ui/status/network.js:162
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "desactivada"
|
msgstr "desactivada"
|
||||||
|
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu)
|
#. under NetworkManager's control (and thus cannot be used in the menu)
|
||||||
#: ../js/ui/status/network.js:402
|
#: ../js/ui/status/network.js:397
|
||||||
msgid "unmanaged"
|
msgid "unmanaged"
|
||||||
msgstr "no gestionada"
|
msgstr "no gestionada"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
|
#: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "se necesita autenticación"
|
msgstr "se necesita autenticación"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
#: ../js/ui/status/network.js:423
|
#: ../js/ui/status/network.js:419
|
||||||
msgid "firmware missing"
|
msgid "firmware missing"
|
||||||
msgstr "falta el «firmware»"
|
msgstr "falta el «firmware»"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
|
||||||
#: ../js/ui/status/network.js:430
|
|
||||||
msgid "cable unplugged"
|
|
||||||
msgstr "cable desconectado"
|
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:435
|
#: ../js/ui/status/network.js:423
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "no disponible"
|
msgstr "no disponible"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
|
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "falló la conexión"
|
msgstr "falló la conexión"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
|
#: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
|
||||||
#: ../js/ui/status/network.js:1424
|
|
||||||
msgid "More…"
|
msgid "More…"
|
||||||
msgstr "Más…"
|
msgstr "Más…"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
|
#: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "Conectada (privada)"
|
msgstr "Conectada (privada)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:597
|
#: ../js/ui/status/network.js:572
|
||||||
msgid "Wired"
|
msgid "Wired"
|
||||||
msgstr "Cableada"
|
msgstr "Cableada"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:611
|
#: ../js/ui/status/network.js:592
|
||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "Banda ancha móvil"
|
msgstr "Banda ancha móvil"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1522
|
#: ../js/ui/status/network.js:1474
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr "Activar red"
|
msgstr "Activar red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1583
|
#: ../js/ui/status/network.js:1522
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Configuración de la red"
|
msgstr "Configuración de la red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1600
|
#: ../js/ui/status/network.js:1539
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Gestor de la red"
|
msgstr "Gestor de la red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1690
|
#: ../js/ui/status/network.js:1623
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Falló la conexión"
|
msgstr "Falló la conexión"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1691
|
#: ../js/ui/status/network.js:1624
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Falló la activación de la conexión de red"
|
msgstr "Falló la activación de la conexión de red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2047
|
#: ../js/ui/status/network.js:1937
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "La red está desactivada"
|
msgstr "La red está desactivada"
|
||||||
|
|
||||||
@ -1730,72 +1738,72 @@ msgctxt "device"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconocido"
|
msgstr "Desconocido"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:124
|
#: ../js/ui/status/volume.js:121
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Volumen modificado"
|
msgstr "Volumen modificado"
|
||||||
|
|
||||||
#. Translators: This is the label for audio volume
|
#. Translators: This is the label for audio volume
|
||||||
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297
|
#: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Volumen"
|
msgstr "Volumen"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:258
|
#: ../js/ui/status/volume.js:255
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Micrófono"
|
msgstr "Micrófono"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:120
|
#: ../js/ui/unlockDialog.js:119
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Iniciar sesión como otro usuario"
|
msgstr "Iniciar sesión como otro usuario"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:141
|
#: ../js/ui/unlockDialog.js:140
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Desbloquear ventana"
|
msgstr "Desbloquear ventana"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:193
|
#: ../js/ui/userMenu.js:149
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "Disponible"
|
msgstr "Disponible"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:196
|
#: ../js/ui/userMenu.js:152
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Ocupado"
|
msgstr "Ocupado"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:199
|
#: ../js/ui/userMenu.js:155
|
||||||
msgid "Invisible"
|
msgid "Invisible"
|
||||||
msgstr "Invisible"
|
msgstr "Invisible"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:202
|
#: ../js/ui/userMenu.js:158
|
||||||
msgid "Away"
|
msgid "Away"
|
||||||
msgstr "Ausente"
|
msgstr "Ausente"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:205
|
#: ../js/ui/userMenu.js:161
|
||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "Inactivo"
|
msgstr "Inactivo"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:208
|
#: ../js/ui/userMenu.js:164
|
||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Desconectado"
|
msgstr "Desconectado"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:781
|
#: ../js/ui/userMenu.js:736
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Notificaciones"
|
msgstr "Notificaciones"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:797
|
#: ../js/ui/userMenu.js:749
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Cambiar de usuario"
|
msgstr "Cambiar de usuario"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:802
|
#: ../js/ui/userMenu.js:754
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Cerrar la sesión"
|
msgstr "Cerrar la sesión"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:822
|
#: ../js/ui/userMenu.js:774
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Instalar actualizaciones y reiniciar"
|
msgstr "Instalar actualizaciones y reiniciar"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:840
|
#: ../js/ui/userMenu.js:792
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Su estado del chat se establecerá a «ocupado»"
|
msgstr "Su estado del chat se establecerá a «ocupado»"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:841
|
#: ../js/ui/userMenu.js:793
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1804,22 +1812,22 @@ msgstr ""
|
|||||||
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
|
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
|
||||||
"leer sus mensajes."
|
"leer sus mensajes."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:888
|
#: ../js/ui/userMenu.js:834
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "Hay otros usuarios con la sesión iniciada"
|
msgstr "Hay otros usuarios con la sesión iniciada"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:893
|
#: ../js/ui/userMenu.js:839
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr "Apagar puede hacer que pierdan el trabajo que no hayan guardado."
|
msgstr "Apagar puede hacer que pierdan el trabajo que no hayan guardado."
|
||||||
|
|
||||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
#: ../js/ui/userMenu.js:921
|
#: ../js/ui/userMenu.js:867
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (remoto)"
|
msgstr "%s (remoto)"
|
||||||
|
|
||||||
#. Translators: Console here refers to a tty like a VT console
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
#: ../js/ui/userMenu.js:924
|
#: ../js/ui/userMenu.js:870
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (consola)"
|
msgstr "%s (consola)"
|
||||||
@ -1877,21 +1885,21 @@ msgstr[1] "%u entradas"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Sonidos del sistema"
|
msgstr "Sonidos del sistema"
|
||||||
|
|
||||||
#: ../src/main.c:372
|
#: ../src/main.c:353
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Imprimir versión"
|
msgstr "Imprimir versión"
|
||||||
|
|
||||||
#: ../src/main.c:378
|
#: ../src/main.c:359
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Modo usado por GDM para la pantalla de inicio"
|
msgstr "Modo usado por GDM para la pantalla de inicio"
|
||||||
|
|
||||||
#: ../src/main.c:384
|
#: ../src/main.c:365
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de "
|
"Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de "
|
||||||
"sesión"
|
"sesión"
|
||||||
|
|
||||||
#: ../src/main.c:390
|
#: ../src/main.c:371
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Listar los modos posibles"
|
msgstr "Listar los modos posibles"
|
||||||
|
|
||||||
@ -1912,6 +1920,9 @@ msgstr "La contraseña no puede estar vacía"
|
|||||||
msgid "Authentication dialog was dismissed by the user"
|
msgid "Authentication dialog was dismissed by the user"
|
||||||
msgstr "El usuario rechazó el diálogo de autenticación"
|
msgstr "El usuario rechazó el diálogo de autenticación"
|
||||||
|
|
||||||
|
#~ msgid "cable unplugged"
|
||||||
|
#~ msgstr "cable desconectado"
|
||||||
|
|
||||||
#~ msgid "Whether to collect stats about applications usage"
|
#~ msgid "Whether to collect stats about applications usage"
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "Indica si se deben recolectar estadísticas acerca del uso de las "
|
#~ "Indica si se deben recolectar estadísticas acerca del uso de las "
|
||||||
@ -2028,9 +2039,6 @@ msgstr "El usuario rechazó el diálogo de autenticación"
|
|||||||
#~ msgid "System Settings"
|
#~ msgid "System Settings"
|
||||||
#~ msgstr "Configuración del sistema"
|
#~ msgstr "Configuración del sistema"
|
||||||
|
|
||||||
#~ msgid "Switch Session"
|
|
||||||
#~ msgstr "Cambiar de sesión"
|
|
||||||
|
|
||||||
#~ msgid "disabled OpenSearch providers"
|
#~ msgid "disabled OpenSearch providers"
|
||||||
#~ msgstr "proveedores OpenSearch desactivados"
|
#~ msgstr "proveedores OpenSearch desactivados"
|
||||||
|
|
||||||
|
375
po/nb.po
375
po/nb.po
@ -8,8 +8,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell 3.9.x\n"
|
"Project-Id-Version: gnome-shell 3.9.x\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2013-05-28 09:43+0200\n"
|
"POT-Creation-Date: 2013-07-04 11:09+0200\n"
|
||||||
"PO-Revision-Date: 2013-05-28 09:44+0200\n"
|
"PO-Revision-Date: 2013-07-04 11:09+0200\n"
|
||||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@ -331,37 +331,41 @@ msgstr "Utvidelse"
|
|||||||
msgid "Select an extension to configure using the combobox above."
|
msgid "Select an extension to configure using the combobox above."
|
||||||
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
|
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:371
|
#: ../js/gdm/loginDialog.js:308
|
||||||
msgid "Session…"
|
msgid "Choose Session"
|
||||||
msgstr "Økt …"
|
msgstr "Velg økt"
|
||||||
|
|
||||||
|
#: ../js/gdm/loginDialog.js:326
|
||||||
|
msgid "Session"
|
||||||
|
msgstr "Økt"
|
||||||
|
|
||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:601
|
#: ../js/gdm/loginDialog.js:528
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Ikke listet?"
|
msgstr "Ikke listet?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
|
#: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
|
||||||
#: ../js/ui/userMenu.js:938
|
#: ../js/ui/userMenu.js:884
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Avbryt"
|
msgstr "Avbryt"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:833
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Logg inn"
|
msgstr "Logg inn"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:833
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Neste"
|
msgstr "Neste"
|
||||||
|
|
||||||
#. Translators: this message is shown below the username entry field
|
#. Translators: this message is shown below the username entry field
|
||||||
#. to clue the user in on how to login to the local network realm
|
#. to clue the user in on how to login to the local network realm
|
||||||
#: ../js/gdm/loginDialog.js:888
|
#: ../js/gdm/loginDialog.js:934
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(f.eks. bruker eller %s)"
|
msgstr "(f.eks. bruker eller %s)"
|
||||||
@ -369,12 +373,12 @@ msgstr "(f.eks. bruker eller %s)"
|
|||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Brukernavn: "
|
msgstr "Brukernavn: "
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1158
|
#: ../js/gdm/loginDialog.js:1205
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Innloggingsvindu"
|
msgstr "Innloggingsvindu"
|
||||||
|
|
||||||
@ -383,8 +387,8 @@ msgstr "Innloggingsvindu"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Strøm"
|
msgstr "Strøm"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
|
||||||
#: ../js/ui/userMenu.js:816
|
#: ../js/ui/userMenu.js:768
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Hvilemodus"
|
msgstr "Hvilemodus"
|
||||||
|
|
||||||
@ -392,18 +396,18 @@ msgstr "Hvilemodus"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Start på nytt"
|
msgstr "Start på nytt"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
|
||||||
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
#: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Slå av"
|
msgstr "Slå av"
|
||||||
|
|
||||||
#: ../js/gdm/util.js:247
|
#: ../js/gdm/util.js:248
|
||||||
msgid "Authentication error"
|
msgid "Authentication error"
|
||||||
msgstr "Autentiseringsfeil"
|
msgstr "Autentiseringsfeil"
|
||||||
|
|
||||||
#. Translators: this message is shown below the password entry field
|
#. Translators: this message is shown below the password entry field
|
||||||
#. to indicate the user can swipe their finger instead
|
#. to indicate the user can swipe their finger instead
|
||||||
#: ../js/gdm/util.js:364
|
#: ../js/gdm/util.js:365
|
||||||
msgid "(or swipe finger)"
|
msgid "(or swipe finger)"
|
||||||
msgstr "(eller dra finger)"
|
msgstr "(eller dra finger)"
|
||||||
|
|
||||||
@ -422,23 +426,23 @@ msgstr "Klarte ikke å lese kommando:"
|
|||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Kjøring av «%s» feilet:"
|
msgstr "Kjøring av «%s» feilet:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:361
|
#: ../js/ui/appDisplay.js:397
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Ofte"
|
msgstr "Ofte"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:368
|
#: ../js/ui/appDisplay.js:404
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Alle"
|
msgstr "Alle"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:960
|
#: ../js/ui/appDisplay.js:996
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nytt vindu"
|
msgstr "Nytt vindu"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Fjern fra favoritter"
|
msgstr "Fjern fra favoritter"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:964
|
#: ../js/ui/appDisplay.js:1000
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Legg til i favoritter"
|
msgstr "Legg til i favoritter"
|
||||||
|
|
||||||
@ -452,7 +456,7 @@ msgstr "%s ble lagt til i dine favoritter."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s ble fjernet fra dine favoritter."
|
msgstr "%s ble fjernet fra dine favoritter."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Innstillinger"
|
msgstr "Innstillinger"
|
||||||
|
|
||||||
@ -577,35 +581,35 @@ msgid "S"
|
|||||||
msgstr "Lø"
|
msgstr "Lø"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:735
|
#: ../js/ui/calendar.js:750
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Ingenting planlagt"
|
msgstr "Ingenting planlagt"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:751
|
#: ../js/ui/calendar.js:768
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A %B %d"
|
msgstr "%A %B %d"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:754
|
#: ../js/ui/calendar.js:771
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A %B %d, %Y"
|
msgstr "%A %B %d, %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:764
|
#: ../js/ui/calendar.js:782
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "I dag"
|
msgstr "I dag"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:768
|
#: ../js/ui/calendar.js:786
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "I morgen"
|
msgstr "I morgen"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:779
|
#: ../js/ui/calendar.js:797
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Denne uken"
|
msgstr "Denne uken"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:787
|
#: ../js/ui/calendar.js:805
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Neste uke"
|
msgstr "Neste uke"
|
||||||
|
|
||||||
@ -794,14 +798,14 @@ msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H.%M</b> "
|
|||||||
|
|
||||||
#. Translators: this is the other person changing their old IM name to their new
|
#. Translators: this is the other person changing their old IM name to their new
|
||||||
#. IM name.
|
#. IM name.
|
||||||
#: ../js/ui/components/telepathyClient.js:985
|
#: ../js/ui/components/telepathyClient.js:986
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is now known as %s"
|
msgid "%s is now known as %s"
|
||||||
msgstr "%s er nå kjent som %s"
|
msgstr "%s er nå kjent som %s"
|
||||||
|
|
||||||
#. translators: argument is a room name like
|
#. translators: argument is a room name like
|
||||||
#. * room@jabber.org for example.
|
#. * room@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1088
|
#: ../js/ui/components/telepathyClient.js:1089
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invitation to %s"
|
msgid "Invitation to %s"
|
||||||
msgstr "Invitasjon til %s"
|
msgstr "Invitasjon til %s"
|
||||||
@ -809,38 +813,38 @@ msgstr "Invitasjon til %s"
|
|||||||
#. translators: first argument is the name of a contact and the second
|
#. translators: first argument is the name of a contact and the second
|
||||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||||
#. * for example.
|
#. * for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1096
|
#: ../js/ui/components/telepathyClient.js:1097
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is inviting you to join %s"
|
msgid "%s is inviting you to join %s"
|
||||||
msgstr "%s inviterer deg til å bli med i %s"
|
msgstr "%s inviterer deg til å bli med i %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1098
|
#: ../js/ui/components/telepathyClient.js:1099
|
||||||
#: ../js/ui/components/telepathyClient.js:1137
|
#: ../js/ui/components/telepathyClient.js:1138
|
||||||
#: ../js/ui/components/telepathyClient.js:1177
|
#: ../js/ui/components/telepathyClient.js:1178
|
||||||
#: ../js/ui/components/telepathyClient.js:1240
|
#: ../js/ui/components/telepathyClient.js:1241
|
||||||
msgid "Decline"
|
msgid "Decline"
|
||||||
msgstr "Avslå"
|
msgstr "Avslå"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1099
|
#: ../js/ui/components/telepathyClient.js:1100
|
||||||
#: ../js/ui/components/telepathyClient.js:1178
|
#: ../js/ui/components/telepathyClient.js:1179
|
||||||
#: ../js/ui/components/telepathyClient.js:1241
|
#: ../js/ui/components/telepathyClient.js:1242
|
||||||
msgid "Accept"
|
msgid "Accept"
|
||||||
msgstr "Godta"
|
msgstr "Godta"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1129
|
#: ../js/ui/components/telepathyClient.js:1130
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Video call from %s"
|
msgid "Video call from %s"
|
||||||
msgstr "Videosamtale fra %s"
|
msgstr "Videosamtale fra %s"
|
||||||
|
|
||||||
#. translators: argument is a contact name like Alice for example.
|
#. translators: argument is a contact name like Alice for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1132
|
#: ../js/ui/components/telepathyClient.js:1133
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Call from %s"
|
msgid "Call from %s"
|
||||||
msgstr "Samtale fra %s"
|
msgstr "Samtale fra %s"
|
||||||
|
|
||||||
#. translators: this is a button label (verb), not a noun
|
#. translators: this is a button label (verb), not a noun
|
||||||
#: ../js/ui/components/telepathyClient.js:1139
|
#: ../js/ui/components/telepathyClient.js:1140
|
||||||
msgid "Answer"
|
msgid "Answer"
|
||||||
msgstr "Svar"
|
msgstr "Svar"
|
||||||
|
|
||||||
@ -849,110 +853,110 @@ msgstr "Svar"
|
|||||||
#. * file name. The string will be something
|
#. * file name. The string will be something
|
||||||
#. * like: "Alice is sending you test.ogg"
|
#. * like: "Alice is sending you test.ogg"
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/components/telepathyClient.js:1171
|
#: ../js/ui/components/telepathyClient.js:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s is sending you %s"
|
msgid "%s is sending you %s"
|
||||||
msgstr "%s sender deg %s"
|
msgstr "%s sender deg %s"
|
||||||
|
|
||||||
#. To translators: The parameter is the contact's alias
|
#. To translators: The parameter is the contact's alias
|
||||||
#: ../js/ui/components/telepathyClient.js:1206
|
#: ../js/ui/components/telepathyClient.js:1207
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s would like permission to see when you are online"
|
msgid "%s would like permission to see when you are online"
|
||||||
msgstr "%s vil ha rettigheter til å se når du er tilkoblet"
|
msgstr "%s vil ha rettigheter til å se når du er tilkoblet"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1298
|
#: ../js/ui/components/telepathyClient.js:1299
|
||||||
msgid "Network error"
|
msgid "Network error"
|
||||||
msgstr "Nettverksfeil"
|
msgstr "Nettverksfeil"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1300
|
#: ../js/ui/components/telepathyClient.js:1301
|
||||||
msgid "Authentication failed"
|
msgid "Authentication failed"
|
||||||
msgstr "Autentisering feilet"
|
msgstr "Autentisering feilet"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1302
|
#: ../js/ui/components/telepathyClient.js:1303
|
||||||
msgid "Encryption error"
|
msgid "Encryption error"
|
||||||
msgstr "Feil ved kryptering"
|
msgstr "Feil ved kryptering"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1304
|
#: ../js/ui/components/telepathyClient.js:1305
|
||||||
msgid "Certificate not provided"
|
msgid "Certificate not provided"
|
||||||
msgstr "Sertifikat ikke oppgitt"
|
msgstr "Sertifikat ikke oppgitt"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1306
|
#: ../js/ui/components/telepathyClient.js:1307
|
||||||
msgid "Certificate untrusted"
|
msgid "Certificate untrusted"
|
||||||
msgstr "Stoler ikke på sertifikatet"
|
msgstr "Stoler ikke på sertifikatet"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1308
|
#: ../js/ui/components/telepathyClient.js:1309
|
||||||
msgid "Certificate expired"
|
msgid "Certificate expired"
|
||||||
msgstr "Sertifikatet er utløpt"
|
msgstr "Sertifikatet er utløpt"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1310
|
#: ../js/ui/components/telepathyClient.js:1311
|
||||||
msgid "Certificate not activated"
|
msgid "Certificate not activated"
|
||||||
msgstr "Sertifikatet er ikke aktivert"
|
msgstr "Sertifikatet er ikke aktivert"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1312
|
#: ../js/ui/components/telepathyClient.js:1313
|
||||||
msgid "Certificate hostname mismatch"
|
msgid "Certificate hostname mismatch"
|
||||||
msgstr "Feil vertsnavn for sertifikat"
|
msgstr "Feil vertsnavn for sertifikat"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1314
|
#: ../js/ui/components/telepathyClient.js:1315
|
||||||
msgid "Certificate fingerprint mismatch"
|
msgid "Certificate fingerprint mismatch"
|
||||||
msgstr "Feil fingeravtrykk for sertifikat"
|
msgstr "Feil fingeravtrykk for sertifikat"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1316
|
#: ../js/ui/components/telepathyClient.js:1317
|
||||||
msgid "Certificate self-signed"
|
msgid "Certificate self-signed"
|
||||||
msgstr "Sertifikatet er selvsignert"
|
msgstr "Sertifikatet er selvsignert"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1318
|
#: ../js/ui/components/telepathyClient.js:1319
|
||||||
msgid "Status is set to offline"
|
msgid "Status is set to offline"
|
||||||
msgstr "Status er satt til frakoblet"
|
msgstr "Status er satt til frakoblet"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1320
|
#: ../js/ui/components/telepathyClient.js:1321
|
||||||
msgid "Encryption is not available"
|
msgid "Encryption is not available"
|
||||||
msgstr "Kryptering er ikke tilgjengelig"
|
msgstr "Kryptering er ikke tilgjengelig"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1322
|
#: ../js/ui/components/telepathyClient.js:1323
|
||||||
msgid "Certificate is invalid"
|
msgid "Certificate is invalid"
|
||||||
msgstr "Sertifikatet er ugyldig"
|
msgstr "Sertifikatet er ugyldig"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1324
|
#: ../js/ui/components/telepathyClient.js:1325
|
||||||
msgid "Connection has been refused"
|
msgid "Connection has been refused"
|
||||||
msgstr "Tilkobling ble nektet"
|
msgstr "Tilkobling ble nektet"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1326
|
#: ../js/ui/components/telepathyClient.js:1327
|
||||||
msgid "Connection can't be established"
|
msgid "Connection can't be established"
|
||||||
msgstr "Tilkobling kan ikke etableres"
|
msgstr "Tilkobling kan ikke etableres"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1328
|
#: ../js/ui/components/telepathyClient.js:1329
|
||||||
msgid "Connection has been lost"
|
msgid "Connection has been lost"
|
||||||
msgstr "Tilkobling tapt"
|
msgstr "Tilkobling tapt"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1330
|
#: ../js/ui/components/telepathyClient.js:1331
|
||||||
msgid "This account is already connected to the server"
|
msgid "This account is already connected to the server"
|
||||||
msgstr "Denne kontoen er allerede koblet til tjeneren"
|
msgstr "Denne kontoen er allerede koblet til tjeneren"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1332
|
#: ../js/ui/components/telepathyClient.js:1333
|
||||||
msgid ""
|
msgid ""
|
||||||
"Connection has been replaced by a new connection using the same resource"
|
"Connection has been replaced by a new connection using the same resource"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs"
|
"Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1334
|
#: ../js/ui/components/telepathyClient.js:1335
|
||||||
msgid "The account already exists on the server"
|
msgid "The account already exists on the server"
|
||||||
msgstr "Kontoen eksisterer allerede på tjeneren"
|
msgstr "Kontoen eksisterer allerede på tjeneren"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1336
|
#: ../js/ui/components/telepathyClient.js:1337
|
||||||
msgid "Server is currently too busy to handle the connection"
|
msgid "Server is currently too busy to handle the connection"
|
||||||
msgstr "Tjener er for opptatt til å håndtere tilkoblingen"
|
msgstr "Tjener er for opptatt til å håndtere tilkoblingen"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1338
|
#: ../js/ui/components/telepathyClient.js:1339
|
||||||
msgid "Certificate has been revoked"
|
msgid "Certificate has been revoked"
|
||||||
msgstr "Sertifikatet er tilbaketrukket"
|
msgstr "Sertifikatet er tilbaketrukket"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1340
|
#: ../js/ui/components/telepathyClient.js:1341
|
||||||
msgid ""
|
msgid ""
|
||||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
|
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1342
|
#: ../js/ui/components/telepathyClient.js:1343
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
"The length of the server certificate, or the depth of the server certificate "
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
"chain, exceed the limits imposed by the cryptography library"
|
||||||
@ -960,22 +964,22 @@ msgstr ""
|
|||||||
"Lengden eller dybden på tjenersertifikatet oversteg grensen som er satt i "
|
"Lengden eller dybden på tjenersertifikatet oversteg grensen som er satt i "
|
||||||
"kryptografibiblioteket"
|
"kryptografibiblioteket"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1344
|
#: ../js/ui/components/telepathyClient.js:1345
|
||||||
msgid "Internal error"
|
msgid "Internal error"
|
||||||
msgstr "Intern feil"
|
msgstr "Intern feil"
|
||||||
|
|
||||||
#. translators: argument is the account name, like
|
#. translators: argument is the account name, like
|
||||||
#. * name@jabber.org for example.
|
#. * name@jabber.org for example.
|
||||||
#: ../js/ui/components/telepathyClient.js:1354
|
#: ../js/ui/components/telepathyClient.js:1355
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Unable to connect to %s"
|
msgid "Unable to connect to %s"
|
||||||
msgstr "Kan ikke koble til %s"
|
msgstr "Kan ikke koble til %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1359
|
#: ../js/ui/components/telepathyClient.js:1360
|
||||||
msgid "View account"
|
msgid "View account"
|
||||||
msgstr "Vis konto"
|
msgstr "Vis konto"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1398
|
#: ../js/ui/components/telepathyClient.js:1399
|
||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Ukjent årsak"
|
msgstr "Ukjent årsak"
|
||||||
|
|
||||||
@ -989,26 +993,26 @@ msgstr "Vis programmer"
|
|||||||
|
|
||||||
#. Translators: this is the name of the dock/favorites area on
|
#. Translators: this is the name of the dock/favorites area on
|
||||||
#. the left of the overview
|
#. the left of the overview
|
||||||
#: ../js/ui/dash.js:435
|
#: ../js/ui/dash.js:439
|
||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Favoritter"
|
msgstr "Favoritter"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:86
|
#: ../js/ui/dateMenu.js:85
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Åpne kalender"
|
msgstr "Åpne kalender"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:90
|
#: ../js/ui/dateMenu.js:89
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Åpne Klokker"
|
msgstr "Åpne Klokker"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Innstillinger for dato og klokkeslett"
|
msgstr "Innstillinger for dato og klokkeslett"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/dateMenu.js:208
|
#: ../js/ui/dateMenu.js:201
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%a %e %B, %Y"
|
msgstr "%a %e %B, %Y"
|
||||||
|
|
||||||
@ -1182,15 +1186,15 @@ msgstr "Tøm meldinger"
|
|||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Innstillinger for varsling"
|
msgstr "Innstillinger for varsling"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1707
|
#: ../js/ui/messageTray.js:1711
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Ingen meldinger"
|
msgstr "Ingen meldinger"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1780
|
#: ../js/ui/messageTray.js:1784
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Meldingstrau"
|
msgstr "Meldingstrau"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2805
|
#: ../js/ui/messageTray.js:2811
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Systeminformasjon"
|
msgstr "Systeminformasjon"
|
||||||
|
|
||||||
@ -1199,7 +1203,7 @@ msgctxt "program"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Ukjent"
|
msgstr "Ukjent"
|
||||||
|
|
||||||
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:150
|
#: ../js/ui/overviewControls.js:474 ../js/ui/screenShield.js:150
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d new message"
|
msgid "%d new message"
|
||||||
msgid_plural "%d new messages"
|
msgid_plural "%d new messages"
|
||||||
@ -1222,17 +1226,17 @@ msgstr "Oversikt"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Skriv for å søke …"
|
msgstr "Skriv for å søke …"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:642
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Avslutt"
|
msgstr "Avslutt"
|
||||||
|
|
||||||
#. Translators: If there is no suitable word for "Activities"
|
#. Translators: If there is no suitable word for "Activities"
|
||||||
#. in your language, you can use the word for "Overview".
|
#. in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:693
|
#: ../js/ui/panel.js:618
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Aktiviteter"
|
msgstr "Aktiviteter"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:989
|
#: ../js/ui/panel.js:914
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Topp-panel"
|
msgstr "Topp-panel"
|
||||||
|
|
||||||
@ -1241,7 +1245,7 @@ msgstr "Topp-panel"
|
|||||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||||
#. switches containing "◯" and "|"). Other values will
|
#. switches containing "◯" and "|"). Other values will
|
||||||
#. simply result in invisible toggle switches.
|
#. simply result in invisible toggle switches.
|
||||||
#: ../js/ui/popupMenu.js:738
|
#: ../js/ui/popupMenu.js:549
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
@ -1266,7 +1270,7 @@ msgid_plural "%d new notifications"
|
|||||||
msgstr[0] "%d ny varsling"
|
msgstr[0] "%d ny varsling"
|
||||||
msgstr[1] "%d nye varslinger"
|
msgstr[1] "%d nye varslinger"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
|
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Lås"
|
msgstr "Lås"
|
||||||
|
|
||||||
@ -1281,19 +1285,19 @@ msgstr "GNOME må låse skjermen"
|
|||||||
#.
|
#.
|
||||||
#. XXX: another option is to kick the user into the gdm login
|
#. XXX: another option is to kick the user into the gdm login
|
||||||
#. screen, where we're not affected by grabs
|
#. screen, where we're not affected by grabs
|
||||||
#: ../js/ui/screenShield.js:773 ../js/ui/screenShield.js:1213
|
#: ../js/ui/screenShield.js:775 ../js/ui/screenShield.js:1215
|
||||||
msgid "Unable to lock"
|
msgid "Unable to lock"
|
||||||
msgstr "Kan ikke låse"
|
msgstr "Kan ikke låse"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214
|
#: ../js/ui/screenShield.js:776 ../js/ui/screenShield.js:1216
|
||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Låsing ble stoppet av et program"
|
msgstr "Låsing ble stoppet av et program"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:453
|
#: ../js/ui/searchDisplay.js:445
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Søker …"
|
msgstr "Søker …"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:497
|
#: ../js/ui/searchDisplay.js:489
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Ingen resultater."
|
msgstr "Ingen resultater."
|
||||||
|
|
||||||
@ -1321,7 +1325,7 @@ msgstr "Passord"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Husk passord"
|
msgstr "Husk passord"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Lås opp"
|
msgstr "Lås opp"
|
||||||
|
|
||||||
@ -1374,9 +1378,9 @@ msgid "Large Text"
|
|||||||
msgstr "Stor tekst"
|
msgstr "Stor tekst"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
||||||
#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321
|
#: ../js/ui/status/bluetooth.js:290 ../js/ui/status/bluetooth.js:327
|
||||||
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
|
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
|
||||||
#: ../js/ui/status/network.js:739
|
#: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@ -1397,97 +1401,106 @@ msgid "Bluetooth Settings"
|
|||||||
msgstr "Innstillinger for Bluetooth"
|
msgstr "Innstillinger for Bluetooth"
|
||||||
|
|
||||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||||
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
|
#: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
|
||||||
msgid "hardware disabled"
|
msgid "hardware disabled"
|
||||||
msgstr "maskinvare slått av"
|
msgstr "maskinvare slått av"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:197
|
#: ../js/ui/status/bluetooth.js:198
|
||||||
msgid "Connection"
|
msgid "Connection"
|
||||||
msgstr "Tilkobling"
|
msgstr "Tilkobling"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
|
#: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
|
||||||
msgid "disconnecting..."
|
msgid "disconnecting..."
|
||||||
msgstr "kobler fra …"
|
msgstr "kobler fra …"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
|
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
|
||||||
#: ../js/ui/status/network.js:1343
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "kobler til …"
|
msgstr "kobler til …"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:239
|
#: ../js/ui/status/bluetooth.js:240
|
||||||
msgid "Send Files…"
|
msgid "Send Files…"
|
||||||
msgstr "Send filer …"
|
msgstr "Send filer …"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:246
|
#: ../js/ui/status/bluetooth.js:247
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Innstillinger for tastatur"
|
msgstr "Innstillinger for tastatur"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:249
|
#: ../js/ui/status/bluetooth.js:250
|
||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "Innstillinger for mus"
|
msgstr "Innstillinger for mus"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316
|
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "Innstillinger for lyd"
|
msgstr "Innstillinger for lyd"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:322
|
#: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Authorization request from %s"
|
msgid "Authorization request from %s"
|
||||||
msgstr "Forespørsel om autorisering fra %s"
|
msgstr "Forespørsel om autorisering fra %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:328
|
#: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
|
||||||
#, c-format
|
#: ../js/ui/status/bluetooth.js:430
|
||||||
msgid "Device %s wants access to the service '%s'"
|
|
||||||
msgstr "Enhet %s vil ha tilgang til tjenesten «%s»"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:330
|
|
||||||
msgid "Always grant access"
|
|
||||||
msgstr "Alltid gi tilgang"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:331
|
|
||||||
msgid "Grant this time only"
|
|
||||||
msgstr "Gi tilgang kun denne ene gangen"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:332
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Avvis"
|
|
||||||
|
|
||||||
#. Translators: argument is the device short name
|
|
||||||
#: ../js/ui/status/bluetooth.js:359
|
|
||||||
#, c-format
|
|
||||||
msgid "Pairing confirmation for %s"
|
|
||||||
msgstr "Bekreftelse for tilkobling for %s"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "Enhet %s vil koble seg sammen med denne datamaskinen"
|
msgstr "Enhet %s vil koble seg sammen med denne datamaskinen"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:336
|
||||||
|
msgid "Allow"
|
||||||
|
msgstr "Tillat"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:337
|
||||||
|
msgid "Deny"
|
||||||
|
msgstr "Nekt"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:362
|
||||||
|
#, c-format
|
||||||
|
msgid "Device %s wants access to the service '%s'"
|
||||||
|
msgstr "Enhet %s vil ha tilgang til tjenesten «%s»"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:364
|
||||||
|
msgid "Always grant access"
|
||||||
|
msgstr "Alltid gi tilgang"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:365
|
||||||
|
msgid "Grant this time only"
|
||||||
|
msgstr "Gi tilgang kun denne ene gangen"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:366
|
#: ../js/ui/status/bluetooth.js:366
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "Avvis"
|
||||||
|
|
||||||
|
#. Translators: argument is the device short name
|
||||||
|
#: ../js/ui/status/bluetooth.js:393
|
||||||
|
#, c-format
|
||||||
|
msgid "Pairing confirmation for %s"
|
||||||
|
msgstr "Bekreftelse for tilkobling for %s"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:400
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
||||||
msgstr "Vennligst bekreft om passord «%06d» er lik den som brukes på enheten."
|
msgstr "Vennligst bekreft om passord «%06d» er lik den som brukes på enheten."
|
||||||
|
|
||||||
#. Translators: this is the verb, not the noun
|
#. Translators: this is the verb, not the noun
|
||||||
#: ../js/ui/status/bluetooth.js:369
|
#: ../js/ui/status/bluetooth.js:403
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
msgstr "Stemmer overens"
|
msgstr "Stemmer overens"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:370
|
#: ../js/ui/status/bluetooth.js:404
|
||||||
msgid "Does not match"
|
msgid "Does not match"
|
||||||
msgstr "Stemmer ikke overens"
|
msgstr "Stemmer ikke overens"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:389
|
#: ../js/ui/status/bluetooth.js:423
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing request for %s"
|
msgid "Pairing request for %s"
|
||||||
msgstr "Forespørsel om tilkobling for %s"
|
msgstr "Forespørsel om tilkobling for %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:397
|
#: ../js/ui/status/bluetooth.js:431
|
||||||
msgid "Please enter the PIN mentioned on the device."
|
msgid "Please enter the PIN mentioned on the device."
|
||||||
msgstr "Vennligst oppgi PIN som oppgitt på enheten."
|
msgstr "Vennligst oppgi PIN som oppgitt på enheten."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:414
|
#: ../js/ui/status/bluetooth.js:448
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
@ -1507,87 +1520,81 @@ msgstr "Volum, nettverk, batteri"
|
|||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<ukjent>"
|
msgstr "<ukjent>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:127
|
#: ../js/ui/status/network.js:125
|
||||||
msgid "Wi-Fi"
|
msgid "Wi-Fi"
|
||||||
msgstr "Wi-Fi"
|
msgstr "Wi-Fi"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:164
|
#: ../js/ui/status/network.js:162
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "slått av"
|
msgstr "slått av"
|
||||||
|
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu)
|
#. under NetworkManager's control (and thus cannot be used in the menu)
|
||||||
#: ../js/ui/status/network.js:402
|
#: ../js/ui/status/network.js:397
|
||||||
msgid "unmanaged"
|
msgid "unmanaged"
|
||||||
msgstr "ikke håndtert"
|
msgstr "ikke håndtert"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
|
#: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "autentisering kreves"
|
msgstr "autentisering kreves"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
#: ../js/ui/status/network.js:423
|
#: ../js/ui/status/network.js:419
|
||||||
msgid "firmware missing"
|
msgid "firmware missing"
|
||||||
msgstr "fastvare mangler"
|
msgstr "fastvare mangler"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
|
||||||
#: ../js/ui/status/network.js:430
|
|
||||||
msgid "cable unplugged"
|
|
||||||
msgstr "kabel koblet fra"
|
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:435
|
#: ../js/ui/status/network.js:423
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "ikke tilgjengelig"
|
msgstr "ikke tilgjengelig"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
|
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "tilkobling feilet"
|
msgstr "tilkobling feilet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
|
#: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
|
||||||
#: ../js/ui/status/network.js:1424
|
|
||||||
msgid "More…"
|
msgid "More…"
|
||||||
msgstr "Mer …"
|
msgstr "Mer …"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
|
#: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "Tilkoblet (privat)"
|
msgstr "Tilkoblet (privat)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:597
|
#: ../js/ui/status/network.js:572
|
||||||
msgid "Wired"
|
msgid "Wired"
|
||||||
msgstr "Kablet"
|
msgstr "Kablet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:611
|
#: ../js/ui/status/network.js:592
|
||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "Mobilt bredbånd"
|
msgstr "Mobilt bredbånd"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1522
|
#: ../js/ui/status/network.js:1474
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr "Slå på nettverk"
|
msgstr "Slå på nettverk"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1583
|
#: ../js/ui/status/network.js:1522
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Innstillinger for nettverk"
|
msgstr "Innstillinger for nettverk"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1600
|
#: ../js/ui/status/network.js:1539
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Nettverkshåndtering"
|
msgstr "Nettverkshåndtering"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1690
|
#: ../js/ui/status/network.js:1623
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Tilkobling feilet"
|
msgstr "Tilkobling feilet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1691
|
#: ../js/ui/status/network.js:1624
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Aktivering av nettverkstilkobling feilet"
|
msgstr "Aktivering av nettverkstilkobling feilet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2047
|
#: ../js/ui/status/network.js:1938
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "Nettverk er slått av"
|
msgstr "Nettverk er slått av"
|
||||||
|
|
||||||
@ -1688,72 +1695,72 @@ msgctxt "device"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Ukjent"
|
msgstr "Ukjent"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:124
|
#: ../js/ui/status/volume.js:121
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Volum endret"
|
msgstr "Volum endret"
|
||||||
|
|
||||||
#. Translators: This is the label for audio volume
|
#. Translators: This is the label for audio volume
|
||||||
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297
|
#: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Volum"
|
msgstr "Volum"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:258
|
#: ../js/ui/status/volume.js:255
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Mikrofon"
|
msgstr "Mikrofon"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:120
|
#: ../js/ui/unlockDialog.js:119
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Logg inn som en annen bruker"
|
msgstr "Logg inn som en annen bruker"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:141
|
#: ../js/ui/unlockDialog.js:140
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Lås opp vindu"
|
msgstr "Lås opp vindu"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:193
|
#: ../js/ui/userMenu.js:149
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "Tilgjengelig"
|
msgstr "Tilgjengelig"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:196
|
#: ../js/ui/userMenu.js:152
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Opptatt"
|
msgstr "Opptatt"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:199
|
#: ../js/ui/userMenu.js:155
|
||||||
msgid "Invisible"
|
msgid "Invisible"
|
||||||
msgstr "Usynlig"
|
msgstr "Usynlig"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:202
|
#: ../js/ui/userMenu.js:158
|
||||||
msgid "Away"
|
msgid "Away"
|
||||||
msgstr "Borte"
|
msgstr "Borte"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:205
|
#: ../js/ui/userMenu.js:161
|
||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "Ledig"
|
msgstr "Ledig"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:208
|
#: ../js/ui/userMenu.js:164
|
||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Frakoblet"
|
msgstr "Frakoblet"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:781
|
#: ../js/ui/userMenu.js:736
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Varslinger"
|
msgstr "Varslinger"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:797
|
#: ../js/ui/userMenu.js:749
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Bytt bruker"
|
msgstr "Bytt bruker"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:802
|
#: ../js/ui/userMenu.js:754
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Logg ut"
|
msgstr "Logg ut"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:822
|
#: ../js/ui/userMenu.js:774
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Installer oppdateringer og start på nytt"
|
msgstr "Installer oppdateringer og start på nytt"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:840
|
#: ../js/ui/userMenu.js:792
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Din pratestatus vil bli satt til opptatt"
|
msgstr "Din pratestatus vil bli satt til opptatt"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:841
|
#: ../js/ui/userMenu.js:793
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1762,24 +1769,24 @@ msgstr ""
|
|||||||
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
|
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
|
||||||
"deres meldinger."
|
"deres meldinger."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:888
|
#: ../js/ui/userMenu.js:834
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "Andre brukere er logget inn."
|
msgstr "Andre brukere er logget inn."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:893
|
#: ../js/ui/userMenu.js:839
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Hvis du slår av vil dette kunne medføre at de mister arbeid som ikke er "
|
"Hvis du slår av vil dette kunne medføre at de mister arbeid som ikke er "
|
||||||
"lagret."
|
"lagret."
|
||||||
|
|
||||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
#: ../js/ui/userMenu.js:921
|
#: ../js/ui/userMenu.js:867
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (ekstern)"
|
msgstr "%s (ekstern)"
|
||||||
|
|
||||||
#. Translators: Console here refers to a tty like a VT console
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
#: ../js/ui/userMenu.js:924
|
#: ../js/ui/userMenu.js:870
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (konsoll)"
|
msgstr "%s (konsoll)"
|
||||||
@ -1837,19 +1844,19 @@ msgstr[1] "%u innganger"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Systemlyder"
|
msgstr "Systemlyder"
|
||||||
|
|
||||||
#: ../src/main.c:372
|
#: ../src/main.c:353
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Skriv ut versjon"
|
msgstr "Skriv ut versjon"
|
||||||
|
|
||||||
#: ../src/main.c:378
|
#: ../src/main.c:359
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Modus som brukes av GDM for innloggingsskjermen"
|
msgstr "Modus som brukes av GDM for innloggingsskjermen"
|
||||||
|
|
||||||
#: ../src/main.c:384
|
#: ../src/main.c:365
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
|
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
|
||||||
|
|
||||||
#: ../src/main.c:390
|
#: ../src/main.c:371
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Vis mulige modi"
|
msgstr "Vis mulige modi"
|
||||||
|
|
||||||
|
265
po/tg.po
265
po/tg.po
@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: Tajik Gnome\n"
|
"Project-Id-Version: Tajik Gnome\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-05-29 22:58+0000\n"
|
"POT-Creation-Date: 2013-06-14 18:16+0000\n"
|
||||||
"PO-Revision-Date: 2013-05-30 17:27+0500\n"
|
"PO-Revision-Date: 2013-06-16 23:32+0500\n"
|
||||||
"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
|
"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"Language: Tajik\n"
|
"Language: Tajik\n"
|
||||||
@ -207,12 +207,10 @@ msgstr ""
|
|||||||
"Тугма барои кушодани намуди \"Намоиш додани барномаҳо\"-и Хулосаи фаъолият."
|
"Тугма барои кушодани намуди \"Намоиш додани барномаҳо\"-и Хулосаи фаъолият."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||||
#| msgid "Keybinding to open the \"Show Applications\" view"
|
|
||||||
msgid "Keybinding to open the overview"
|
msgid "Keybinding to open the overview"
|
||||||
msgstr "Тугмабандӣ барои кушодани хулоса"
|
msgstr "Тугмабандӣ барои кушодани хулоса"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||||
#| msgid "Keybinding to open the \"Show Applications\" view"
|
|
||||||
msgid "Keybinding to open the Activities Overview."
|
msgid "Keybinding to open the Activities Overview."
|
||||||
msgstr "Тугмабандӣ барои кушодани хулосаи фаъолият."
|
msgstr "Тугмабандӣ барои кушодани хулосаи фаъолият."
|
||||||
|
|
||||||
@ -377,37 +375,37 @@ msgstr ""
|
|||||||
"Пасвандеро интихоб кунед, то ин ки бо ҷаъбаи мураккаби боло онро "
|
"Пасвандеро интихоб кунед, то ин ки бо ҷаъбаи мураккаби боло онро "
|
||||||
"конфигуратсия кунед."
|
"конфигуратсия кунед."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:371
|
#: ../js/gdm/loginDialog.js:370
|
||||||
msgid "Session…"
|
msgid "Session…"
|
||||||
msgstr "Ҷаласа..."
|
msgstr "Ҷаласа..."
|
||||||
|
|
||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:601
|
#: ../js/gdm/loginDialog.js:600
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Вуҷуд надора?"
|
msgstr "Вуҷуд надора?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:775 ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
|
#: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
|
||||||
#: ../js/ui/userMenu.js:938
|
#: ../js/ui/userMenu.js:884
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Бекор кардан"
|
msgstr "Бекор кардан"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:790
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Ворид шудан"
|
msgstr "Ворид шудан"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:791
|
#: ../js/gdm/loginDialog.js:790
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "Навбатӣ"
|
msgstr "Навбатӣ"
|
||||||
|
|
||||||
#. Translators: this message is shown below the username entry field
|
#. Translators: this message is shown below the username entry field
|
||||||
#. to clue the user in on how to login to the local network realm
|
#. to clue the user in on how to login to the local network realm
|
||||||
#: ../js/gdm/loginDialog.js:888
|
#: ../js/gdm/loginDialog.js:887
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(масалан, корбар ё %s)"
|
msgstr "(масалан, корбар ё %s)"
|
||||||
@ -415,12 +413,12 @@ msgstr "(масалан, корбар ё %s)"
|
|||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
|
#: ../js/gdm/loginDialog.js:891 ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Номи корбар:"
|
msgstr "Номи корбар:"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1158
|
#: ../js/gdm/loginDialog.js:1157
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Равзанаи воридшавӣ"
|
msgstr "Равзанаи воридшавӣ"
|
||||||
|
|
||||||
@ -429,8 +427,8 @@ msgstr "Равзанаи воридшавӣ"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Барқ"
|
msgstr "Барқ"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
|
||||||
#: ../js/ui/userMenu.js:816
|
#: ../js/ui/userMenu.js:768
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Таваққуф"
|
msgstr "Таваққуф"
|
||||||
|
|
||||||
@ -438,8 +436,8 @@ msgstr "Таваққуф"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Бозоғозидан"
|
msgstr "Бозоғозидан"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
|
||||||
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
#: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Хомӯш кардан"
|
msgstr "Хомӯш кардан"
|
||||||
|
|
||||||
@ -468,23 +466,23 @@ msgstr "Фармон иҷро нашудааст:"
|
|||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "Иҷрокунии '%s' қатъ шудааст:"
|
msgstr "Иҷрокунии '%s' қатъ шудааст:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:361
|
#: ../js/ui/appDisplay.js:397
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Роиҷ"
|
msgstr "Роиҷ"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:368
|
#: ../js/ui/appDisplay.js:404
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Ҳама"
|
msgstr "Ҳама"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:960
|
#: ../js/ui/appDisplay.js:996
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Равзанаи нав"
|
msgstr "Равзанаи нав"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
|
#: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Тоза кардан аз Баргузидаҳо"
|
msgstr "Тоза кардан аз Баргузидаҳо"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:964
|
#: ../js/ui/appDisplay.js:1000
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Илова кардан ба Баргузидаҳо"
|
msgstr "Илова кардан ба Баргузидаҳо"
|
||||||
|
|
||||||
@ -498,7 +496,7 @@ msgstr "%s ба баргузидаҳои шумо илова шудааст."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s аз баргузидаҳои шумо тоза шудааст."
|
msgstr "%s аз баргузидаҳои шумо тоза шудааст."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Танзимот"
|
msgstr "Танзимот"
|
||||||
|
|
||||||
@ -623,35 +621,35 @@ msgid "S"
|
|||||||
msgstr "Ш"
|
msgstr "Ш"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events
|
#. Translators: Text to show if there are no events
|
||||||
#: ../js/ui/calendar.js:735
|
#: ../js/ui/calendar.js:750
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Ягон чиз ба нақша нагирифтааст"
|
msgstr "Ягон чиз ба нақша нагирифтааст"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||||
#: ../js/ui/calendar.js:751
|
#: ../js/ui/calendar.js:768
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %B %d"
|
msgstr "%A, %B %d"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||||
#: ../js/ui/calendar.js:754
|
#: ../js/ui/calendar.js:771
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %B %d, %Y"
|
msgstr "%A, %B %d, %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:764
|
#: ../js/ui/calendar.js:782
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Имрӯз"
|
msgstr "Имрӯз"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:768
|
#: ../js/ui/calendar.js:786
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Фардо"
|
msgstr "Фардо"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:779
|
#: ../js/ui/calendar.js:797
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Ҳафтаи ҷорӣ"
|
msgstr "Ҳафтаи ҷорӣ"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:787
|
#: ../js/ui/calendar.js:805
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Ҳафтаи навбатӣ"
|
msgstr "Ҳафтаи навбатӣ"
|
||||||
|
|
||||||
@ -1035,26 +1033,26 @@ msgstr "Намоиш додани барномаҳо"
|
|||||||
|
|
||||||
#. Translators: this is the name of the dock/favorites area on
|
#. Translators: this is the name of the dock/favorites area on
|
||||||
#. the left of the overview
|
#. the left of the overview
|
||||||
#: ../js/ui/dash.js:435
|
#: ../js/ui/dash.js:439
|
||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Рах"
|
msgstr "Рах"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:86
|
#: ../js/ui/dateMenu.js:85
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Кушодани тақвим"
|
msgstr "Кушодани тақвим"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:90
|
#: ../js/ui/dateMenu.js:89
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Кушодани соат"
|
msgstr "Кушодани соат"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Танзимоти сана ва вақт"
|
msgstr "Танзимоти сана ва вақт"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#.
|
#.
|
||||||
#: ../js/ui/dateMenu.js:208
|
#: ../js/ui/dateMenu.js:202
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A %B %e, %Y"
|
msgstr "%A %B %e, %Y"
|
||||||
|
|
||||||
@ -1284,7 +1282,7 @@ msgstr "Панели боло"
|
|||||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||||
#. switches containing "◯" and "|"). Other values will
|
#. switches containing "◯" and "|"). Other values will
|
||||||
#. simply result in invisible toggle switches.
|
#. simply result in invisible toggle switches.
|
||||||
#: ../js/ui/popupMenu.js:738
|
#: ../js/ui/popupMenu.js:545
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-us"
|
msgstr "toggle-switch-us"
|
||||||
|
|
||||||
@ -1308,7 +1306,7 @@ msgid "%d new notification"
|
|||||||
msgid_plural "%d new notifications"
|
msgid_plural "%d new notifications"
|
||||||
msgstr[0] "%d огоҳии нав"
|
msgstr[0] "%d огоҳии нав"
|
||||||
|
|
||||||
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
|
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
|
||||||
msgid "Lock"
|
msgid "Lock"
|
||||||
msgstr "Қулф кардан"
|
msgstr "Қулф кардан"
|
||||||
|
|
||||||
@ -1363,7 +1361,7 @@ msgstr "Парол"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Ба ёд гирифтани парол"
|
msgstr "Ба ёд гирифтани парол"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
|
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Кушодан"
|
msgstr "Кушодан"
|
||||||
|
|
||||||
@ -1416,9 +1414,9 @@ msgid "Large Text"
|
|||||||
msgstr "Матни бузург"
|
msgstr "Матни бузург"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
||||||
#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321
|
#: ../js/ui/status/bluetooth.js:290 ../js/ui/status/bluetooth.js:327
|
||||||
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
|
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
|
||||||
#: ../js/ui/status/network.js:739
|
#: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@ -1439,75 +1437,83 @@ msgid "Bluetooth Settings"
|
|||||||
msgstr "Танзимоти Bluetooth"
|
msgstr "Танзимоти Bluetooth"
|
||||||
|
|
||||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||||
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
|
#: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
|
||||||
msgid "hardware disabled"
|
msgid "hardware disabled"
|
||||||
msgstr "сахтафзор ғайрифаъол шудааст"
|
msgstr "сахтафзор ғайрифаъол шудааст"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:197
|
#: ../js/ui/status/bluetooth.js:198
|
||||||
msgid "Connection"
|
msgid "Connection"
|
||||||
msgstr "Пайвастшавӣ"
|
msgstr "Пайвастшавӣ"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
|
#: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
|
||||||
msgid "disconnecting..."
|
msgid "disconnecting..."
|
||||||
msgstr "қатъ кардани пайваст..."
|
msgstr "қатъ кардани пайваст..."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
|
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
|
||||||
#: ../js/ui/status/network.js:1343
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "пайвастшавӣ..."
|
msgstr "пайвастшавӣ..."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:239
|
#: ../js/ui/status/bluetooth.js:240
|
||||||
msgid "Send Files…"
|
msgid "Send Files…"
|
||||||
msgstr "Фиристодани файлҳо…"
|
msgstr "Фиристодани файлҳо…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:246
|
#: ../js/ui/status/bluetooth.js:247
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Танзимоти клавиатура"
|
msgstr "Танзимоти клавиатура"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:249
|
#: ../js/ui/status/bluetooth.js:250
|
||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "Танзимоти муш"
|
msgstr "Танзимоти муш"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316
|
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "Танзимоти садо"
|
msgstr "Танзимоти садо"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:322
|
#: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Authorization request from %s"
|
msgid "Authorization request from %s"
|
||||||
msgstr "Дархости санҷиши ҳаққоният аз %s"
|
msgstr "Дархости санҷиши ҳаққоният аз %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:328
|
#: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
|
||||||
#, c-format
|
#: ../js/ui/status/bluetooth.js:430
|
||||||
msgid "Device %s wants access to the service '%s'"
|
|
||||||
msgstr "Дастгоҳи %s дастрасиро ба хидмати \"%s\" дархост мекунад"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:330
|
|
||||||
msgid "Always grant access"
|
|
||||||
msgstr "Ҳамеша иҷозат додан"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:331
|
|
||||||
msgid "Grant this time only"
|
|
||||||
msgstr "Танҳо дар ин маротиба иҷозат додан"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:332
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Рад кардан"
|
|
||||||
|
|
||||||
#. Translators: argument is the device short name
|
|
||||||
#: ../js/ui/status/bluetooth.js:359
|
|
||||||
#, c-format
|
|
||||||
msgid "Pairing confirmation for %s"
|
|
||||||
msgstr "Тасдиқи ҷуфтсозӣ барои %s"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "Дастгоҳи %s мехоҳад, ки бо ин компютер ҷуфт кунад"
|
msgstr "Дастгоҳи %s мехоҳад, ки бо ин компютер ҷуфт кунад"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:366
|
#: ../js/ui/status/bluetooth.js:336
|
||||||
|
msgid "Allow"
|
||||||
|
msgstr "Иҷозат додан"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:337
|
||||||
|
msgid "Deny"
|
||||||
|
msgstr "Манъ кардан"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:362
|
||||||
|
#, c-format
|
||||||
|
msgid "Device %s wants access to the service '%s'"
|
||||||
|
msgstr "Дастгоҳи %s дастрасиро ба хидмати \"%s\" дархост мекунад"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:364
|
||||||
|
msgid "Always grant access"
|
||||||
|
msgstr "Ҳамеша иҷозат додан"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:365
|
||||||
|
msgid "Grant this time only"
|
||||||
|
msgstr "Танҳо дар ин маротиба иҷозат додан"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:366
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "Рад кардан"
|
||||||
|
|
||||||
|
#. Translators: argument is the device short name
|
||||||
|
#: ../js/ui/status/bluetooth.js:393
|
||||||
|
#, c-format
|
||||||
|
msgid "Pairing confirmation for %s"
|
||||||
|
msgstr "Тасдиқи ҷуфтсозӣ барои %s"
|
||||||
|
|
||||||
|
#: ../js/ui/status/bluetooth.js:400
|
||||||
#, c-format
|
#, c-format
|
||||||
#| msgid "Please confirm whether the PIN '%06d' matches the one on the device."
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@ -1515,24 +1521,24 @@ msgstr ""
|
|||||||
"мавҷудбуда мувофиқат мекунад."
|
"мавҷудбуда мувофиқат мекунад."
|
||||||
|
|
||||||
#. Translators: this is the verb, not the noun
|
#. Translators: this is the verb, not the noun
|
||||||
#: ../js/ui/status/bluetooth.js:369
|
#: ../js/ui/status/bluetooth.js:403
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
msgstr "Мутобиқаткунанда"
|
msgstr "Мутобиқаткунанда"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:370
|
#: ../js/ui/status/bluetooth.js:404
|
||||||
msgid "Does not match"
|
msgid "Does not match"
|
||||||
msgstr "Мувофиқат намекунад"
|
msgstr "Мувофиқат намекунад"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:389
|
#: ../js/ui/status/bluetooth.js:423
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing request for %s"
|
msgid "Pairing request for %s"
|
||||||
msgstr "Дархости ҷуфтсозӣ барои %s"
|
msgstr "Дархости ҷуфтсозӣ барои %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:397
|
#: ../js/ui/status/bluetooth.js:431
|
||||||
msgid "Please enter the PIN mentioned on the device."
|
msgid "Please enter the PIN mentioned on the device."
|
||||||
msgstr "Лутфан, рамзи PIN-ро, ки дар дастгоҳ гуфта шудааст, ворид кунед."
|
msgstr "Лутфан, рамзи PIN-ро, ки дар дастгоҳ гуфта шудааст, ворид кунед."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:414
|
#: ../js/ui/status/bluetooth.js:448
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "OK"
|
msgstr "OK"
|
||||||
|
|
||||||
@ -1552,87 +1558,81 @@ msgstr "Ҳаҷм, шабака, батарея"
|
|||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<номаълум>"
|
msgstr "<номаълум>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:127
|
#: ../js/ui/status/network.js:125
|
||||||
msgid "Wi-Fi"
|
msgid "Wi-Fi"
|
||||||
msgstr "Wi-Fi"
|
msgstr "Wi-Fi"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:164
|
#: ../js/ui/status/network.js:162
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "ғайрифаъол"
|
msgstr "ғайрифаъол"
|
||||||
|
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu)
|
#. under NetworkManager's control (and thus cannot be used in the menu)
|
||||||
#: ../js/ui/status/network.js:402
|
#: ../js/ui/status/network.js:397
|
||||||
msgid "unmanaged"
|
msgid "unmanaged"
|
||||||
msgstr "идоранашуда"
|
msgstr "идоранашуда"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
|
#: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "санҷиши ҳаққоният лозим аст"
|
msgstr "санҷиши ҳаққоният лозим аст"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
#: ../js/ui/status/network.js:423
|
#: ../js/ui/status/network.js:419
|
||||||
msgid "firmware missing"
|
msgid "firmware missing"
|
||||||
msgstr "нармафзори дарунсохт вуҷуд надорад"
|
msgstr "нармафзори дарунсохт вуҷуд надорад"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
|
||||||
#: ../js/ui/status/network.js:430
|
|
||||||
msgid "cable unplugged"
|
|
||||||
msgstr "сим ҷудо шудааст"
|
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:435
|
#: ../js/ui/status/network.js:423
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "дастнорас"
|
msgstr "дастнорас"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
|
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "пайваст қатъ шудааст"
|
msgstr "пайваст қатъ шудааст"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
|
#: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
|
||||||
#: ../js/ui/status/network.js:1424
|
|
||||||
msgid "More…"
|
msgid "More…"
|
||||||
msgstr "Бештар..."
|
msgstr "Бештар..."
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
|
#: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "Пайваст шудааст (шахсӣ)"
|
msgstr "Пайваст шудааст (шахсӣ)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:597
|
#: ../js/ui/status/network.js:572
|
||||||
msgid "Wired"
|
msgid "Wired"
|
||||||
msgstr "Симдор"
|
msgstr "Симдор"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:611
|
#: ../js/ui/status/network.js:592
|
||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "Паҳннавори мобилӣ"
|
msgstr "Паҳннавори мобилӣ"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1522
|
#: ../js/ui/status/network.js:1474
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr "Фаъол кардани шабака"
|
msgstr "Фаъол кардани шабака"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1583
|
#: ../js/ui/status/network.js:1522
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Танзимоти шабака"
|
msgstr "Танзимоти шабака"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1600
|
#: ../js/ui/status/network.js:1539
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Мудири шабака"
|
msgstr "Мудири шабака"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1690
|
#: ../js/ui/status/network.js:1623
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Пайваст қатъ шудааст"
|
msgstr "Пайваст қатъ шудааст"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1691
|
#: ../js/ui/status/network.js:1624
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Фаъолсозии пайвасти шабака қатъ шудааст."
|
msgstr "Фаъолсозии пайвасти шабака қатъ шудааст."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2047
|
#: ../js/ui/status/network.js:1933
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "Шабака ғайрифаъол аст"
|
msgstr "Шабака ғайрифаъол аст"
|
||||||
|
|
||||||
@ -1729,72 +1729,72 @@ msgctxt "device"
|
|||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Номаълум"
|
msgstr "Номаълум"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:124
|
#: ../js/ui/status/volume.js:121
|
||||||
msgid "Volume changed"
|
msgid "Volume changed"
|
||||||
msgstr "Ҳаҷм тағйир ёфт"
|
msgstr "Ҳаҷм тағйир ёфт"
|
||||||
|
|
||||||
#. Translators: This is the label for audio volume
|
#. Translators: This is the label for audio volume
|
||||||
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297
|
#: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Баландии садо"
|
msgstr "Баландии садо"
|
||||||
|
|
||||||
#: ../js/ui/status/volume.js:258
|
#: ../js/ui/status/volume.js:255
|
||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "Микрофон"
|
msgstr "Микрофон"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:120
|
#: ../js/ui/unlockDialog.js:119
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "Ворид шудан бо корбари дигар"
|
msgstr "Ворид шудан бо корбари дигар"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:141
|
#: ../js/ui/unlockDialog.js:140
|
||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Кушодани равзана"
|
msgstr "Кушодани равзана"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:193
|
#: ../js/ui/userMenu.js:149
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "Дастрас"
|
msgstr "Дастрас"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:196
|
#: ../js/ui/userMenu.js:152
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Машғул"
|
msgstr "Машғул"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:199
|
#: ../js/ui/userMenu.js:155
|
||||||
msgid "Invisible"
|
msgid "Invisible"
|
||||||
msgstr "Ноаён"
|
msgstr "Ноаён"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:202
|
#: ../js/ui/userMenu.js:158
|
||||||
msgid "Away"
|
msgid "Away"
|
||||||
msgstr "Ғоиб"
|
msgstr "Ғоиб"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:205
|
#: ../js/ui/userMenu.js:161
|
||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "Ғайрифаъол"
|
msgstr "Ғайрифаъол"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:208
|
#: ../js/ui/userMenu.js:164
|
||||||
msgid "Offline"
|
msgid "Offline"
|
||||||
msgstr "Офлайн"
|
msgstr "Офлайн"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:781
|
#: ../js/ui/userMenu.js:736
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Огоҳиҳо"
|
msgstr "Огоҳиҳо"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:797
|
#: ../js/ui/userMenu.js:749
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Таъвизи корбар"
|
msgstr "Таъвизи корбар"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:802
|
#: ../js/ui/userMenu.js:754
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Баромад"
|
msgstr "Баромад"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:822
|
#: ../js/ui/userMenu.js:774
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "Насб кардани навсозиҳо ва бозоғозидан"
|
msgstr "Насб кардани навсозиҳо ва бозоғозидан"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:840
|
#: ../js/ui/userMenu.js:792
|
||||||
msgid "Your chat status will be set to busy"
|
msgid "Your chat status will be set to busy"
|
||||||
msgstr "Вазъияти чати шумо ба \"машғул\" тағйир дода мешавад"
|
msgstr "Вазъияти чати шумо ба \"машғул\" тағйир дода мешавад"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:841
|
#: ../js/ui/userMenu.js:793
|
||||||
msgid ""
|
msgid ""
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
@ -1803,22 +1803,22 @@ msgstr ""
|
|||||||
"шумо ба тавре танзим карда шуд, ки дигарон фаҳманд, ки эҳтимолан шумо "
|
"шумо ба тавре танзим карда шуд, ки дигарон фаҳманд, ки эҳтимолан шумо "
|
||||||
"паёмҳои онҳоро намебинед."
|
"паёмҳои онҳоро намебинед."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:888
|
#: ../js/ui/userMenu.js:834
|
||||||
msgid "Other users are logged in."
|
msgid "Other users are logged in."
|
||||||
msgstr "Корбарони дигар ворид шудаанд."
|
msgstr "Корбарони дигар ворид шудаанд."
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:893
|
#: ../js/ui/userMenu.js:839
|
||||||
msgid "Shutting down might cause them to lose unsaved work."
|
msgid "Shutting down might cause them to lose unsaved work."
|
||||||
msgstr "Анҷоми кор метавонад сабаби гум шудани кори захиранашуда гардад."
|
msgstr "Анҷоми кор метавонад сабаби гум шудани кори захиранашуда гардад."
|
||||||
|
|
||||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||||
#: ../js/ui/userMenu.js:921
|
#: ../js/ui/userMenu.js:867
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (remote)"
|
msgid "%s (remote)"
|
||||||
msgstr "%s (дурдаст)"
|
msgstr "%s (дурдаст)"
|
||||||
|
|
||||||
#. Translators: Console here refers to a tty like a VT console
|
#. Translators: Console here refers to a tty like a VT console
|
||||||
#: ../js/ui/userMenu.js:924
|
#: ../js/ui/userMenu.js:870
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (console)"
|
msgid "%s (console)"
|
||||||
msgstr "%s (консол)"
|
msgstr "%s (консол)"
|
||||||
@ -1874,20 +1874,20 @@ msgstr[0] "%u вуруд"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Системаи садо"
|
msgstr "Системаи садо"
|
||||||
|
|
||||||
#: ../src/main.c:372
|
#: ../src/main.c:353
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Версияи чоп"
|
msgstr "Версияи чоп"
|
||||||
|
|
||||||
#: ../src/main.c:378
|
#: ../src/main.c:359
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Усуле, ки бо GDM барои экрани воридшавӣ истифода мешавад"
|
msgstr "Усуле, ки бо GDM барои экрани воридшавӣ истифода мешавад"
|
||||||
|
|
||||||
#: ../src/main.c:384
|
#: ../src/main.c:365
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Истифода бурдани ҳолати мушаххас, масалан \"gdm\" барои экрани воридшавӣ"
|
"Истифода бурдани ҳолати мушаххас, масалан \"gdm\" барои экрани воридшавӣ"
|
||||||
|
|
||||||
#: ../src/main.c:390
|
#: ../src/main.c:371
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Рӯйхати ҳолатҳои имконпазир"
|
msgstr "Рӯйхати ҳолатҳои имконпазир"
|
||||||
|
|
||||||
@ -1908,6 +1908,9 @@ msgstr "Парол бояд холӣ набошад"
|
|||||||
msgid "Authentication dialog was dismissed by the user"
|
msgid "Authentication dialog was dismissed by the user"
|
||||||
msgstr "Равзанаи гуфтугӯи санҷиши ҳакконият бо корбар бекор карда шуд"
|
msgstr "Равзанаи гуфтугӯи санҷиши ҳакконият бо корбар бекор карда шуд"
|
||||||
|
|
||||||
|
#~ msgid "cable unplugged"
|
||||||
|
#~ msgstr "сим ҷудо шудааст"
|
||||||
|
|
||||||
#~ msgid "Whether to collect stats about applications usage"
|
#~ msgid "Whether to collect stats about applications usage"
|
||||||
#~ msgstr "Ҷамъ кардан ё ҷамъ накардани омор дар бораи истифодабарии барномаҳо"
|
#~ msgstr "Ҷамъ кардан ё ҷамъ накардани омор дар бораи истифодабарии барномаҳо"
|
||||||
|
|
||||||
|
666
po/zh_CN.po
666
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
435
po/zh_HK.po
435
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
438
po/zh_TW.po
438
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
20
src/main.c
20
src/main.c
@ -36,8 +36,6 @@ extern GType gnome_shell_plugin_get_type (void);
|
|||||||
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
|
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
|
||||||
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
|
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
|
||||||
|
|
||||||
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
|
|
||||||
|
|
||||||
#define WM_NAME "GNOME Shell"
|
#define WM_NAME "GNOME Shell"
|
||||||
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
|
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
|
||||||
|
|
||||||
@ -171,23 +169,6 @@ shell_dbus_init (gboolean replace)
|
|||||||
g_object_unref (session);
|
g_object_unref (session);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
shell_prefs_init (void)
|
|
||||||
{
|
|
||||||
meta_prefs_override_preference_schema ("attach-modal-dialogs",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
meta_prefs_override_preference_schema ("dynamic-workspaces",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
meta_prefs_override_preference_schema ("workspaces-only-on-primary",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
meta_prefs_override_preference_schema ("button-layout",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
meta_prefs_override_preference_schema ("edge-tiling",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
meta_prefs_override_preference_schema ("focus-change-on-pointer-rest",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_introspection_init (void)
|
shell_introspection_init (void)
|
||||||
{
|
{
|
||||||
@ -436,7 +417,6 @@ main (int argc, char **argv)
|
|||||||
shell_dbus_init (meta_get_replace_current_wm ());
|
shell_dbus_init (meta_get_replace_current_wm ());
|
||||||
shell_a11y_init ();
|
shell_a11y_init ();
|
||||||
shell_perf_log_init ();
|
shell_perf_log_init ();
|
||||||
shell_prefs_init ();
|
|
||||||
shell_introspection_init ();
|
shell_introspection_init ();
|
||||||
shell_fonts_init ();
|
shell_fonts_init ();
|
||||||
|
|
||||||
|
@ -70,7 +70,6 @@ struct _ShellGlobal {
|
|||||||
GtkWindow *grab_notifier;
|
GtkWindow *grab_notifier;
|
||||||
gboolean gtk_grab_active;
|
gboolean gtk_grab_active;
|
||||||
|
|
||||||
ShellStageInputMode input_mode;
|
|
||||||
XserverRegion input_region;
|
XserverRegion input_region;
|
||||||
|
|
||||||
GjsContext *js_context;
|
GjsContext *js_context;
|
||||||
@ -94,6 +93,8 @@ struct _ShellGlobal {
|
|||||||
guint32 xdnd_timestamp;
|
guint32 xdnd_timestamp;
|
||||||
|
|
||||||
gint64 last_gc_end_time;
|
gint64 last_gc_end_time;
|
||||||
|
|
||||||
|
gboolean has_modal;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -106,7 +107,6 @@ enum {
|
|||||||
PROP_SCREEN_WIDTH,
|
PROP_SCREEN_WIDTH,
|
||||||
PROP_SCREEN_HEIGHT,
|
PROP_SCREEN_HEIGHT,
|
||||||
PROP_STAGE,
|
PROP_STAGE,
|
||||||
PROP_STAGE_INPUT_MODE,
|
|
||||||
PROP_WINDOW_GROUP,
|
PROP_WINDOW_GROUP,
|
||||||
PROP_TOP_WINDOW_GROUP,
|
PROP_TOP_WINDOW_GROUP,
|
||||||
PROP_WINDOW_MANAGER,
|
PROP_WINDOW_MANAGER,
|
||||||
@ -141,9 +141,6 @@ shell_global_set_property(GObject *object,
|
|||||||
|
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case PROP_STAGE_INPUT_MODE:
|
|
||||||
shell_global_set_stage_input_mode (global, g_value_get_enum (value));
|
|
||||||
break;
|
|
||||||
case PROP_SESSION_MODE:
|
case PROP_SESSION_MODE:
|
||||||
g_clear_pointer (&global->session_mode, g_free);
|
g_clear_pointer (&global->session_mode, g_free);
|
||||||
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
||||||
@ -195,9 +192,6 @@ shell_global_get_property(GObject *object,
|
|||||||
case PROP_STAGE:
|
case PROP_STAGE:
|
||||||
g_value_set_object (value, global->stage);
|
g_value_set_object (value, global->stage);
|
||||||
break;
|
break;
|
||||||
case PROP_STAGE_INPUT_MODE:
|
|
||||||
g_value_set_enum (value, global->input_mode);
|
|
||||||
break;
|
|
||||||
case PROP_WINDOW_GROUP:
|
case PROP_WINDOW_GROUP:
|
||||||
g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
|
g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
|
||||||
break;
|
break;
|
||||||
@ -278,8 +272,6 @@ shell_global_init (ShellGlobal *global)
|
|||||||
g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
|
g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
|
||||||
global->gtk_grab_active = FALSE;
|
global->gtk_grab_active = FALSE;
|
||||||
|
|
||||||
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
|
|
||||||
|
|
||||||
global->sound_context = ca_gtk_context_get ();
|
global->sound_context = ca_gtk_context_get ();
|
||||||
ca_context_change_props (global->sound_context,
|
ca_context_change_props (global->sound_context,
|
||||||
CA_PROP_APPLICATION_NAME, "GNOME Shell",
|
CA_PROP_APPLICATION_NAME, "GNOME Shell",
|
||||||
@ -417,14 +409,6 @@ shell_global_class_init (ShellGlobalClass *klass)
|
|||||||
"Stage holding the desktop scene graph",
|
"Stage holding the desktop scene graph",
|
||||||
CLUTTER_TYPE_ACTOR,
|
CLUTTER_TYPE_ACTOR,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_STAGE_INPUT_MODE,
|
|
||||||
g_param_spec_enum ("stage-input-mode",
|
|
||||||
"Stage input mode",
|
|
||||||
"The stage input mode",
|
|
||||||
SHELL_TYPE_STAGE_INPUT_MODE,
|
|
||||||
SHELL_STAGE_INPUT_MODE_NORMAL,
|
|
||||||
G_PARAM_READWRITE));
|
|
||||||
g_object_class_install_property (gobject_class,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_WINDOW_GROUP,
|
PROP_WINDOW_GROUP,
|
||||||
g_param_spec_object ("window-group",
|
g_param_spec_object ("window-group",
|
||||||
@ -529,6 +513,18 @@ shell_global_get (void)
|
|||||||
return the_object;
|
return the_object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint32
|
||||||
|
get_current_time_maybe_roundtrip (ShellGlobal *global)
|
||||||
|
{
|
||||||
|
guint32 time;
|
||||||
|
|
||||||
|
time = shell_global_get_current_time (global);
|
||||||
|
if (time != CurrentTime)
|
||||||
|
return time;
|
||||||
|
|
||||||
|
return meta_display_get_current_time_roundtrip (global->meta_display);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
focus_window_changed (MetaDisplay *display,
|
focus_window_changed (MetaDisplay *display,
|
||||||
GParamSpec *param,
|
GParamSpec *param,
|
||||||
@ -536,58 +532,71 @@ focus_window_changed (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
ShellGlobal *global = user_data;
|
ShellGlobal *global = user_data;
|
||||||
|
|
||||||
if (global->input_mode == SHELL_STAGE_INPUT_MODE_FOCUSED &&
|
if (global->has_modal)
|
||||||
meta_display_get_focus_window (display) != NULL)
|
return;
|
||||||
shell_global_set_stage_input_mode (global, SHELL_STAGE_INPUT_MODE_NORMAL);
|
|
||||||
|
/* If the stage window became unfocused, drop the key focus
|
||||||
|
* on Clutter's side. */
|
||||||
|
if (!meta_stage_is_focused (global->meta_screen))
|
||||||
|
clutter_stage_set_key_focus (global->stage, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static ClutterActor *
|
||||||
* shell_global_set_stage_input_mode:
|
get_key_focused_actor (ShellGlobal *global)
|
||||||
* @global: the #ShellGlobal
|
|
||||||
* @mode: the stage input mode
|
|
||||||
*
|
|
||||||
* Sets the input mode of the stage; when @mode is
|
|
||||||
* %SHELL_STAGE_INPUT_MODE_NORMAL, then the stage accepts clicks in
|
|
||||||
* the region defined by shell_global_set_stage_input_region() but
|
|
||||||
* passes through clicks outside that region. When it is
|
|
||||||
* %SHELL_STAGE_INPUT_MODE_FULLSCREEN, the stage absorbs all input.
|
|
||||||
*
|
|
||||||
* When the input mode is %SHELL_STAGE_INPUT_MODE_FOCUSED, the pointer
|
|
||||||
* is handled as with %SHELL_STAGE_INPUT_MODE_NORMAL, but additionally
|
|
||||||
* the stage window has the keyboard focus. If the stage loses the
|
|
||||||
* focus (eg, because the user clicked into a window) the input mode
|
|
||||||
* will revert to %SHELL_STAGE_INPUT_MODE_NORMAL.
|
|
||||||
*
|
|
||||||
* Note that whenever a mutter-internal Gtk widget has a pointer grab,
|
|
||||||
* the shell goes unresponsive and passes things to the underlying GTK+
|
|
||||||
* widget to ensure that the widget gets any clicks it is expecting.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
shell_global_set_stage_input_mode (ShellGlobal *global,
|
|
||||||
ShellStageInputMode mode)
|
|
||||||
{
|
{
|
||||||
MetaScreen *screen;
|
ClutterActor *actor;
|
||||||
|
|
||||||
g_return_if_fail (SHELL_IS_GLOBAL (global));
|
actor = clutter_stage_get_key_focus (global->stage);
|
||||||
|
|
||||||
screen = meta_plugin_get_screen (global->plugin);
|
/* If there's no explicit key focus, clutter_stage_get_key_focus()
|
||||||
|
* returns the stage. This is a terrible API. */
|
||||||
|
if (actor == CLUTTER_ACTOR (global->stage))
|
||||||
|
actor = NULL;
|
||||||
|
|
||||||
|
return actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sync_stage_window_focus (ShellGlobal *global)
|
||||||
|
{
|
||||||
|
ClutterActor *actor;
|
||||||
|
|
||||||
|
if (global->has_modal)
|
||||||
|
return;
|
||||||
|
|
||||||
|
actor = get_key_focused_actor (global);
|
||||||
|
|
||||||
|
/* An actor got key focus and the stage needs to be focused. */
|
||||||
|
if (actor != NULL && !meta_stage_is_focused (global->meta_screen))
|
||||||
|
meta_focus_stage_window (global->meta_screen,
|
||||||
|
get_current_time_maybe_roundtrip (global));
|
||||||
|
|
||||||
|
/* An actor dropped key focus. Focus the default window. */
|
||||||
|
else if (actor == NULL && meta_stage_is_focused (global->meta_screen))
|
||||||
|
meta_screen_focus_default_window (global->meta_screen,
|
||||||
|
get_current_time_maybe_roundtrip (global));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
focus_actor_changed (ClutterStage *stage,
|
||||||
|
GParamSpec *param,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
ShellGlobal *global = user_data;
|
||||||
|
sync_stage_window_focus (global);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sync_input_region (ShellGlobal *global)
|
||||||
|
{
|
||||||
|
MetaScreen *screen = global->meta_screen;
|
||||||
|
|
||||||
if (global->gtk_grab_active)
|
if (global->gtk_grab_active)
|
||||||
meta_empty_stage_input_region (screen);
|
meta_empty_stage_input_region (screen);
|
||||||
else if (mode == SHELL_STAGE_INPUT_MODE_FULLSCREEN || !global->input_region)
|
else if (global->has_modal)
|
||||||
meta_set_stage_input_region (screen, None);
|
meta_set_stage_input_region (screen, None);
|
||||||
else
|
else
|
||||||
meta_set_stage_input_region (screen, global->input_region);
|
meta_set_stage_input_region (screen, global->input_region);
|
||||||
|
|
||||||
if (mode == SHELL_STAGE_INPUT_MODE_FOCUSED)
|
|
||||||
meta_focus_stage_window (global->meta_screen,
|
|
||||||
shell_global_get_current_time (global));
|
|
||||||
|
|
||||||
if (mode != global->input_mode)
|
|
||||||
{
|
|
||||||
global->input_mode = mode;
|
|
||||||
g_object_notify (G_OBJECT (global), "stage-input-mode");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -682,8 +691,7 @@ shell_global_unset_cursor (ShellGlobal *global)
|
|||||||
* describing the input region.
|
* describing the input region.
|
||||||
*
|
*
|
||||||
* Sets the area of the stage that is responsive to mouse clicks when
|
* Sets the area of the stage that is responsive to mouse clicks when
|
||||||
* the stage mode is %SHELL_STAGE_INPUT_MODE_NORMAL (but does not change the
|
* we don't have a modal or grab.
|
||||||
* current stage mode).
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
shell_global_set_stage_input_region (ShellGlobal *global,
|
shell_global_set_stage_input_region (ShellGlobal *global,
|
||||||
@ -713,10 +721,7 @@ shell_global_set_stage_input_region (ShellGlobal *global,
|
|||||||
global->input_region = XFixesCreateRegion (global->xdisplay, rects, nrects);
|
global->input_region = XFixesCreateRegion (global->xdisplay, rects, nrects);
|
||||||
g_free (rects);
|
g_free (rects);
|
||||||
|
|
||||||
/* set_stage_input_mode() will figure out whether or not we
|
sync_input_region (global);
|
||||||
* should actually change the input region right now.
|
|
||||||
*/
|
|
||||||
shell_global_set_stage_input_mode (global, global->input_mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -956,6 +961,8 @@ _shell_global_set_plugin (ShellGlobal *global,
|
|||||||
"End of stage page repaint",
|
"End of stage page repaint",
|
||||||
"");
|
"");
|
||||||
|
|
||||||
|
g_signal_connect (global->stage, "notify::key-focus",
|
||||||
|
G_CALLBACK (focus_actor_changed), global);
|
||||||
g_signal_connect (global->meta_display, "notify::focus-window",
|
g_signal_connect (global->meta_display, "notify::focus-window",
|
||||||
G_CALLBACK (focus_window_changed), global);
|
G_CALLBACK (focus_window_changed), global);
|
||||||
|
|
||||||
@ -991,7 +998,14 @@ shell_global_begin_modal (ShellGlobal *global,
|
|||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
MetaModalOptions options)
|
MetaModalOptions options)
|
||||||
{
|
{
|
||||||
return meta_plugin_begin_modal (global->plugin, global->stage_xwindow, None, options, timestamp);
|
/* Make it an error to call begin_modal while we already
|
||||||
|
* have a modal active. */
|
||||||
|
if (global->has_modal)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
global->has_modal = meta_plugin_begin_modal (global->plugin, global->stage_xwindow, None, options, timestamp);
|
||||||
|
sync_input_region (global);
|
||||||
|
return global->has_modal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1004,7 +1018,25 @@ void
|
|||||||
shell_global_end_modal (ShellGlobal *global,
|
shell_global_end_modal (ShellGlobal *global,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
|
ClutterActor *actor;
|
||||||
|
|
||||||
|
if (!global->has_modal)
|
||||||
|
return;
|
||||||
|
|
||||||
meta_plugin_end_modal (global->plugin, timestamp);
|
meta_plugin_end_modal (global->plugin, timestamp);
|
||||||
|
global->has_modal = FALSE;
|
||||||
|
|
||||||
|
/* If the stage window is unfocused, ensure that there's no
|
||||||
|
* actor focused on Clutter's side. */
|
||||||
|
if (!meta_stage_is_focused (global->meta_screen))
|
||||||
|
clutter_stage_set_key_focus (global->stage, NULL);
|
||||||
|
|
||||||
|
/* An actor dropped key focus. Focus the default window. */
|
||||||
|
else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_screen))
|
||||||
|
meta_screen_focus_default_window (global->meta_screen,
|
||||||
|
get_current_time_maybe_roundtrip (global));
|
||||||
|
|
||||||
|
sync_input_region (global);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -1222,7 +1254,7 @@ grab_notify (GtkWidget *widget, gboolean was_grabbed, gpointer user_data)
|
|||||||
global->gtk_grab_active = !was_grabbed;
|
global->gtk_grab_active = !was_grabbed;
|
||||||
|
|
||||||
/* Update for the new setting of gtk_grab_active */
|
/* Update for the new setting of gtk_grab_active */
|
||||||
shell_global_set_stage_input_mode (global, global->input_mode);
|
sync_input_region (global);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1314,10 +1346,6 @@ shell_global_sync_pointer (ShellGlobal *global)
|
|||||||
event.type = CLUTTER_MOTION;
|
event.type = CLUTTER_MOTION;
|
||||||
event.time = shell_global_get_current_time (global);
|
event.time = shell_global_get_current_time (global);
|
||||||
event.flags = 0;
|
event.flags = 0;
|
||||||
/* This is wrong: we should be setting event.stage to NULL if the
|
|
||||||
* pointer is not inside the bounds of the stage given the current
|
|
||||||
* stage_input_mode. For our current purposes however, this works.
|
|
||||||
*/
|
|
||||||
event.stage = global->stage;
|
event.stage = global->stage;
|
||||||
event.x = x;
|
event.x = x;
|
||||||
event.y = y;
|
event.y = y;
|
||||||
|
@ -47,14 +47,6 @@ void shell_global_end_modal (ShellGlobal *global,
|
|||||||
void shell_global_freeze_keyboard (ShellGlobal *global,
|
void shell_global_freeze_keyboard (ShellGlobal *global,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
SHELL_STAGE_INPUT_MODE_NORMAL,
|
|
||||||
SHELL_STAGE_INPUT_MODE_FOCUSED,
|
|
||||||
SHELL_STAGE_INPUT_MODE_FULLSCREEN
|
|
||||||
} ShellStageInputMode;
|
|
||||||
|
|
||||||
void shell_global_set_stage_input_mode (ShellGlobal *global,
|
|
||||||
ShellStageInputMode mode);
|
|
||||||
void shell_global_set_stage_input_region (ShellGlobal *global,
|
void shell_global_set_stage_input_region (ShellGlobal *global,
|
||||||
GSList *rectangles);
|
GSList *rectangles);
|
||||||
|
|
||||||
|
@ -43,8 +43,6 @@ struct _ShellNetworkAgentClass
|
|||||||
/* used by SHELL_TYPE_NETWORK_AGENT */
|
/* used by SHELL_TYPE_NETWORK_AGENT */
|
||||||
GType shell_network_agent_get_type (void);
|
GType shell_network_agent_get_type (void);
|
||||||
|
|
||||||
ShellNetworkAgent *shell_network_agent_new (void);
|
|
||||||
|
|
||||||
void shell_network_agent_set_password (ShellNetworkAgent *self,
|
void shell_network_agent_set_password (ShellNetworkAgent *self,
|
||||||
gchar *request_id,
|
gchar *request_id,
|
||||||
gchar *setting_key,
|
gchar *setting_key,
|
||||||
|
@ -285,7 +285,6 @@ get_content_preferred_width (StBoxLayout *self,
|
|||||||
{
|
{
|
||||||
StBoxLayoutPrivate *priv = self->priv;
|
StBoxLayoutPrivate *priv = self->priv;
|
||||||
gint n_children = 0;
|
gint n_children = 0;
|
||||||
gint n_fixed = 0;
|
|
||||||
gfloat min_width, natural_width;
|
gfloat min_width, natural_width;
|
||||||
ClutterActor *child;
|
ClutterActor *child;
|
||||||
|
|
||||||
@ -304,12 +303,6 @@ get_content_preferred_width (StBoxLayout *self,
|
|||||||
|
|
||||||
n_children++;
|
n_children++;
|
||||||
|
|
||||||
if (clutter_actor_get_fixed_position_set (child))
|
|
||||||
{
|
|
||||||
n_fixed++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->is_vertical)
|
if (priv->is_vertical)
|
||||||
{
|
{
|
||||||
_st_actor_get_preferred_width (child, -1, FALSE,
|
_st_actor_get_preferred_width (child, -1, FALSE,
|
||||||
@ -329,10 +322,10 @@ get_content_preferred_width (StBoxLayout *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!priv->is_vertical && (n_children - n_fixed) > 1)
|
if (!priv->is_vertical && n_children > 1)
|
||||||
{
|
{
|
||||||
min_width += priv->spacing * (n_children - n_fixed - 1);
|
min_width += priv->spacing * (n_children - 1);
|
||||||
natural_width += priv->spacing * (n_children - n_fixed - 1);
|
natural_width += priv->spacing * (n_children - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (min_width_p)
|
if (min_width_p)
|
||||||
@ -367,7 +360,6 @@ get_content_preferred_height (StBoxLayout *self,
|
|||||||
{
|
{
|
||||||
StBoxLayoutPrivate *priv = self->priv;
|
StBoxLayoutPrivate *priv = self->priv;
|
||||||
gint n_children = 0;
|
gint n_children = 0;
|
||||||
gint n_fixed = 0;
|
|
||||||
gfloat min_height, natural_height;
|
gfloat min_height, natural_height;
|
||||||
ClutterActor *child;
|
ClutterActor *child;
|
||||||
|
|
||||||
@ -386,12 +378,6 @@ get_content_preferred_height (StBoxLayout *self,
|
|||||||
|
|
||||||
n_children++;
|
n_children++;
|
||||||
|
|
||||||
if (clutter_actor_get_fixed_position_set (child))
|
|
||||||
{
|
|
||||||
n_fixed++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->is_vertical)
|
if (priv->is_vertical)
|
||||||
{
|
{
|
||||||
clutter_container_child_get ((ClutterContainer*) self, child,
|
clutter_container_child_get ((ClutterContainer*) self, child,
|
||||||
@ -416,10 +402,10 @@ get_content_preferred_height (StBoxLayout *self,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->is_vertical && (n_children - n_fixed) > 1)
|
if (priv->is_vertical && n_children > 1)
|
||||||
{
|
{
|
||||||
min_height += priv->spacing * (n_children - n_fixed - 1);
|
min_height += priv->spacing * (n_children - 1);
|
||||||
natural_height += priv->spacing * (n_children - n_fixed - 1);
|
natural_height += priv->spacing * (n_children - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (min_height_p)
|
if (min_height_p)
|
||||||
@ -511,12 +497,9 @@ compute_shrinks (StBoxLayout *self,
|
|||||||
{
|
{
|
||||||
gfloat child_min, child_nat;
|
gfloat child_min, child_nat;
|
||||||
gboolean child_fill;
|
gboolean child_fill;
|
||||||
gboolean fixed;
|
|
||||||
|
|
||||||
fixed = clutter_actor_get_fixed_position_set (child);
|
|
||||||
|
|
||||||
shrinks[i].child_index = i;
|
shrinks[i].child_index = i;
|
||||||
if (CLUTTER_ACTOR_IS_VISIBLE (child) && !fixed)
|
if (CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||||
{
|
{
|
||||||
if (priv->is_vertical)
|
if (priv->is_vertical)
|
||||||
{
|
{
|
||||||
@ -738,20 +721,13 @@ st_box_layout_allocate (ClutterActor *actor,
|
|||||||
{
|
{
|
||||||
ClutterActorBox child_box;
|
ClutterActorBox child_box;
|
||||||
gfloat child_min, child_nat, child_allocated;
|
gfloat child_min, child_nat, child_allocated;
|
||||||
gboolean xfill, yfill, expand, fixed;
|
gboolean xfill, yfill, expand;
|
||||||
StAlign xalign, yalign;
|
StAlign xalign, yalign;
|
||||||
gdouble xalign_f, yalign_f;
|
gdouble xalign_f, yalign_f;
|
||||||
|
|
||||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
||||||
goto next_child;
|
goto next_child;
|
||||||
|
|
||||||
fixed = clutter_actor_get_fixed_position_set (child);
|
|
||||||
if (fixed)
|
|
||||||
{
|
|
||||||
clutter_actor_allocate_preferred_size (child, flags);
|
|
||||||
goto next_child;
|
|
||||||
}
|
|
||||||
|
|
||||||
clutter_container_child_get ((ClutterContainer*) actor, child,
|
clutter_container_child_get ((ClutterContainer*) actor, child,
|
||||||
"x-fill", &xfill,
|
"x-fill", &xfill,
|
||||||
"y-fill", &yfill,
|
"y-fill", &yfill,
|
||||||
|
@ -1268,8 +1268,7 @@ st_theme_node_prerender_background (StThemeNode *node,
|
|||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void st_theme_node_paint_borders (StThemeNode *node,
|
static void st_theme_node_paint_borders (StThemeNodePaintState *state,
|
||||||
StThemeNodePaintState *state,
|
|
||||||
const ClutterActorBox *box,
|
const ClutterActorBox *box,
|
||||||
guint8 paint_opacity);
|
guint8 paint_opacity);
|
||||||
|
|
||||||
@ -1370,9 +1369,11 @@ st_theme_node_load_background_image (StThemeNode *node)
|
|||||||
return node->background_texture != COGL_INVALID_HANDLE;
|
return node->background_texture != COGL_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void st_theme_node_prerender_shadow (StThemeNodePaintState *state);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_theme_node_render_resources (StThemeNode *node,
|
st_theme_node_render_resources (StThemeNodePaintState *state,
|
||||||
StThemeNodePaintState *state,
|
StThemeNode *node,
|
||||||
float width,
|
float width,
|
||||||
float height)
|
float height)
|
||||||
{
|
{
|
||||||
@ -1390,6 +1391,7 @@ st_theme_node_render_resources (StThemeNode *node,
|
|||||||
*/
|
*/
|
||||||
st_theme_node_paint_state_free (state);
|
st_theme_node_paint_state_free (state);
|
||||||
|
|
||||||
|
state->node = node;
|
||||||
state->alloc_width = width;
|
state->alloc_width = width;
|
||||||
state->alloc_height = height;
|
state->alloc_height = height;
|
||||||
|
|
||||||
@ -1474,40 +1476,82 @@ st_theme_node_render_resources (StThemeNode *node,
|
|||||||
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
|
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
|
||||||
state->prerendered_texture);
|
state->prerendered_texture);
|
||||||
else if (node->background_color.alpha > 0 || has_border)
|
else if (node->background_color.alpha > 0 || has_border)
|
||||||
|
st_theme_node_prerender_shadow (state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we don't have cached textures yet, check whether we can cache
|
||||||
|
them. */
|
||||||
|
if (!node->cached_textures)
|
||||||
|
{
|
||||||
|
if (state->prerendered_material == COGL_INVALID_HANDLE &&
|
||||||
|
width >= node->box_shadow_min_width &&
|
||||||
|
height >= node->box_shadow_min_height)
|
||||||
{
|
{
|
||||||
CoglHandle buffer, offscreen;
|
st_theme_node_paint_state_copy (&node->cached_state, state);
|
||||||
int texture_width = ceil (width);
|
node->cached_textures = TRUE;
|
||||||
int texture_height = ceil (height);
|
|
||||||
|
|
||||||
buffer = cogl_texture_new_with_size (texture_width,
|
|
||||||
texture_height,
|
|
||||||
COGL_TEXTURE_NO_SLICING,
|
|
||||||
COGL_PIXEL_FORMAT_ANY);
|
|
||||||
offscreen = cogl_offscreen_new_to_texture (buffer);
|
|
||||||
|
|
||||||
if (offscreen != COGL_INVALID_HANDLE)
|
|
||||||
{
|
|
||||||
ClutterActorBox box = { 0, 0, width, height };
|
|
||||||
CoglColor clear_color;
|
|
||||||
|
|
||||||
cogl_push_framebuffer (offscreen);
|
|
||||||
cogl_ortho (0, width, height, 0, 0, 1.0);
|
|
||||||
|
|
||||||
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
|
|
||||||
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
|
|
||||||
|
|
||||||
st_theme_node_paint_borders (node, state, &box, 0xFF);
|
|
||||||
cogl_pop_framebuffer ();
|
|
||||||
cogl_handle_unref (offscreen);
|
|
||||||
|
|
||||||
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
|
|
||||||
buffer);
|
|
||||||
}
|
|
||||||
cogl_handle_unref (buffer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
st_theme_node_update_resources (StThemeNodePaintState *state,
|
||||||
|
StThemeNode *node,
|
||||||
|
float width,
|
||||||
|
float height)
|
||||||
|
{
|
||||||
|
gboolean had_prerendered_texture = FALSE;
|
||||||
|
gboolean had_box_shadow = FALSE;
|
||||||
|
StShadow *box_shadow_spec;
|
||||||
|
|
||||||
|
g_return_if_fail (width > 0 && height > 0);
|
||||||
|
|
||||||
|
/* Free handles we can't reuse */
|
||||||
|
if (state->prerendered_texture != COGL_INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
cogl_handle_unref (state->prerendered_texture);
|
||||||
|
state->prerendered_texture = COGL_INVALID_HANDLE;
|
||||||
|
had_prerendered_texture = TRUE;
|
||||||
|
}
|
||||||
|
if (state->prerendered_material != COGL_INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
cogl_handle_unref (state->prerendered_material);
|
||||||
|
state->prerendered_material = COGL_INVALID_HANDLE;
|
||||||
|
|
||||||
|
if (node->border_slices_texture == COGL_INVALID_HANDLE &&
|
||||||
|
state->box_shadow_material != COGL_INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
cogl_handle_unref (state->box_shadow_material);
|
||||||
|
state->box_shadow_material = COGL_INVALID_HANDLE;
|
||||||
|
had_box_shadow = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
state->node = node;
|
||||||
|
state->alloc_width = width;
|
||||||
|
state->alloc_height = height;
|
||||||
|
|
||||||
|
box_shadow_spec = st_theme_node_get_box_shadow (node);
|
||||||
|
|
||||||
|
if (had_prerendered_texture)
|
||||||
|
{
|
||||||
|
state->prerendered_texture = st_theme_node_prerender_background (node, width, height);
|
||||||
|
state->prerendered_material = _st_create_texture_material (state->prerendered_texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int corner_id;
|
||||||
|
|
||||||
|
for (corner_id = 0; corner_id < 4; corner_id++)
|
||||||
|
if (state->corner_material[corner_id] == COGL_INVALID_HANDLE)
|
||||||
|
state->corner_material[corner_id] =
|
||||||
|
st_theme_node_lookup_corner (node, width, height, corner_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (had_box_shadow)
|
||||||
|
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
|
||||||
|
state->prerendered_texture);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paint_material_with_opacity (CoglHandle material,
|
paint_material_with_opacity (CoglHandle material,
|
||||||
ClutterActorBox *box,
|
ClutterActorBox *box,
|
||||||
@ -1527,11 +1571,11 @@ paint_material_with_opacity (CoglHandle material,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_theme_node_paint_borders (StThemeNode *node,
|
st_theme_node_paint_borders (StThemeNodePaintState *state,
|
||||||
StThemeNodePaintState *state,
|
|
||||||
const ClutterActorBox *box,
|
const ClutterActorBox *box,
|
||||||
guint8 paint_opacity)
|
guint8 paint_opacity)
|
||||||
{
|
{
|
||||||
|
StThemeNode *node = state->node;
|
||||||
float width, height;
|
float width, height;
|
||||||
int border_width[4];
|
int border_width[4];
|
||||||
guint border_radius[4];
|
guint border_radius[4];
|
||||||
@ -1792,6 +1836,353 @@ st_theme_node_paint_borders (StThemeNode *node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
st_theme_node_paint_sliced_shadow (StThemeNodePaintState *state,
|
||||||
|
const ClutterActorBox *box,
|
||||||
|
guint8 paint_opacity)
|
||||||
|
{
|
||||||
|
StThemeNode *node = state->node;
|
||||||
|
guint border_radius[4];
|
||||||
|
CoglColor color;
|
||||||
|
StShadow *box_shadow_spec;
|
||||||
|
gfloat xoffset, yoffset;
|
||||||
|
gfloat width, height;
|
||||||
|
gfloat shadow_width, shadow_height;
|
||||||
|
gfloat xend, yend, top, bottom, left, right;
|
||||||
|
gfloat s_top, s_bottom, s_left, s_right;
|
||||||
|
gfloat shadow_blur_radius, x_spread_factor, y_spread_factor;
|
||||||
|
float rectangles[8 * 9];
|
||||||
|
gint idx;
|
||||||
|
|
||||||
|
if (paint_opacity == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
st_theme_node_reduce_border_radius (node, box->x2 - box->x1, box->y2 - box->y1, border_radius);
|
||||||
|
|
||||||
|
box_shadow_spec = st_theme_node_get_box_shadow (node);
|
||||||
|
|
||||||
|
/* Compute input & output areas :
|
||||||
|
*
|
||||||
|
* yoffset ----------------------------
|
||||||
|
* | | | |
|
||||||
|
* | | | |
|
||||||
|
* | | | |
|
||||||
|
* top ----------------------------
|
||||||
|
* | | | |
|
||||||
|
* | | | |
|
||||||
|
* | | | |
|
||||||
|
* bottom ----------------------------
|
||||||
|
* | | | |
|
||||||
|
* | | | |
|
||||||
|
* | | | |
|
||||||
|
* yend ----------------------------
|
||||||
|
* xoffset left right xend
|
||||||
|
*
|
||||||
|
* s_top = top in offscreen's coordinates (0.0 - 1.0)
|
||||||
|
* s_bottom = bottom in offscreen's coordinates (0.0 - 1.0)
|
||||||
|
* s_left = left in offscreen's coordinates (0.0 - 1.0)
|
||||||
|
* s_right = right in offscreen's coordinates (0.0 - 1.0)
|
||||||
|
*/
|
||||||
|
if (box_shadow_spec->blur == 0)
|
||||||
|
shadow_blur_radius = 0;
|
||||||
|
else
|
||||||
|
shadow_blur_radius = (5 * (box_shadow_spec->blur / 2.0)) / 2;
|
||||||
|
|
||||||
|
shadow_width = state->box_shadow_width + 2 * shadow_blur_radius;
|
||||||
|
shadow_height = state->box_shadow_height + 2 * shadow_blur_radius;
|
||||||
|
|
||||||
|
/* Compute input regions parameters */
|
||||||
|
s_top = shadow_blur_radius + box_shadow_spec->blur +
|
||||||
|
MAX (node->border_radius[ST_CORNER_TOPLEFT],
|
||||||
|
node->border_radius[ST_CORNER_TOPRIGHT]);
|
||||||
|
s_bottom = shadow_blur_radius + box_shadow_spec->blur +
|
||||||
|
MAX (node->border_radius[ST_CORNER_BOTTOMLEFT],
|
||||||
|
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
|
||||||
|
s_left = shadow_blur_radius + box_shadow_spec->blur +
|
||||||
|
MAX (node->border_radius[ST_CORNER_TOPLEFT],
|
||||||
|
node->border_radius[ST_CORNER_BOTTOMLEFT]);
|
||||||
|
s_right = shadow_blur_radius + box_shadow_spec->blur +
|
||||||
|
MAX (node->border_radius[ST_CORNER_TOPRIGHT],
|
||||||
|
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
|
||||||
|
|
||||||
|
/* Compute output regions parameters */
|
||||||
|
xoffset = box->x1 + box_shadow_spec->xoffset - shadow_blur_radius - box_shadow_spec->spread;
|
||||||
|
yoffset = box->y1 + box_shadow_spec->yoffset - shadow_blur_radius - box_shadow_spec->spread;
|
||||||
|
width = box->x2 - box->x1 + 2 * shadow_blur_radius;
|
||||||
|
height = box->y2 - box->y1 + 2 * shadow_blur_radius;
|
||||||
|
|
||||||
|
x_spread_factor = (width + 2 * box_shadow_spec->spread) / width;
|
||||||
|
y_spread_factor = (height + 2 * box_shadow_spec->spread) / height;
|
||||||
|
|
||||||
|
width += 2 * box_shadow_spec->spread;
|
||||||
|
height += 2 * box_shadow_spec->spread;
|
||||||
|
|
||||||
|
xend = xoffset + width;
|
||||||
|
yend = yoffset + height;
|
||||||
|
|
||||||
|
top = s_top * y_spread_factor;
|
||||||
|
bottom = s_bottom * y_spread_factor;
|
||||||
|
left = s_left * x_spread_factor;
|
||||||
|
right = s_right * x_spread_factor;
|
||||||
|
|
||||||
|
bottom = height - bottom;
|
||||||
|
right = width - right;
|
||||||
|
|
||||||
|
/* Final adjustments */
|
||||||
|
s_top /= shadow_height;
|
||||||
|
s_bottom /= shadow_height;
|
||||||
|
s_left /= shadow_width;
|
||||||
|
s_right /= shadow_width;
|
||||||
|
|
||||||
|
s_bottom = 1.0 - s_bottom;
|
||||||
|
s_right = 1.0 - s_right;
|
||||||
|
|
||||||
|
top += yoffset;
|
||||||
|
bottom += yoffset;
|
||||||
|
left += xoffset;
|
||||||
|
right += xoffset;
|
||||||
|
|
||||||
|
/* Setup pipeline */
|
||||||
|
cogl_color_set_from_4ub (&color,
|
||||||
|
box_shadow_spec->color.red * paint_opacity / 255,
|
||||||
|
box_shadow_spec->color.green * paint_opacity / 255,
|
||||||
|
box_shadow_spec->color.blue * paint_opacity / 255,
|
||||||
|
box_shadow_spec->color.alpha * paint_opacity / 255);
|
||||||
|
cogl_color_premultiply (&color);
|
||||||
|
|
||||||
|
cogl_material_set_layer_combine_constant (state->box_shadow_material, 0, &color);
|
||||||
|
|
||||||
|
cogl_set_source (state->box_shadow_material);
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
|
||||||
|
if (top > 0)
|
||||||
|
{
|
||||||
|
if (left > 0)
|
||||||
|
{
|
||||||
|
/* Top left corner */
|
||||||
|
rectangles[idx++] = xoffset;
|
||||||
|
rectangles[idx++] = yoffset;
|
||||||
|
rectangles[idx++] = left;
|
||||||
|
rectangles[idx++] = top;
|
||||||
|
|
||||||
|
rectangles[idx++] = 0;
|
||||||
|
rectangles[idx++] = 0;
|
||||||
|
rectangles[idx++] = s_left;
|
||||||
|
rectangles[idx++] = s_top;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Top middle */
|
||||||
|
rectangles[idx++] = left;
|
||||||
|
rectangles[idx++] = yoffset;
|
||||||
|
rectangles[idx++] = right;
|
||||||
|
rectangles[idx++] = top;
|
||||||
|
|
||||||
|
rectangles[idx++] = s_left;
|
||||||
|
rectangles[idx++] = 0;
|
||||||
|
rectangles[idx++] = s_right;
|
||||||
|
rectangles[idx++] = s_top;
|
||||||
|
|
||||||
|
if (right > 0)
|
||||||
|
{
|
||||||
|
/* Top right corner */
|
||||||
|
rectangles[idx++] = right;
|
||||||
|
rectangles[idx++] = yoffset;
|
||||||
|
rectangles[idx++] = xend;
|
||||||
|
rectangles[idx++] = top;
|
||||||
|
|
||||||
|
rectangles[idx++] = s_right;
|
||||||
|
rectangles[idx++] = 0;
|
||||||
|
rectangles[idx++] = 1;
|
||||||
|
rectangles[idx++] = s_top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (left > 0)
|
||||||
|
{
|
||||||
|
/* Left middle */
|
||||||
|
rectangles[idx++] = xoffset;
|
||||||
|
rectangles[idx++] = top;
|
||||||
|
rectangles[idx++] = left;
|
||||||
|
rectangles[idx++] = bottom;
|
||||||
|
|
||||||
|
rectangles[idx++] = 0;
|
||||||
|
rectangles[idx++] = s_top;
|
||||||
|
rectangles[idx++] = s_left;
|
||||||
|
rectangles[idx++] = s_bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Center middle */
|
||||||
|
rectangles[idx++] = left;
|
||||||
|
rectangles[idx++] = top;
|
||||||
|
rectangles[idx++] = right;
|
||||||
|
rectangles[idx++] = bottom;
|
||||||
|
|
||||||
|
rectangles[idx++] = s_left;
|
||||||
|
rectangles[idx++] = s_top;
|
||||||
|
rectangles[idx++] = s_right;
|
||||||
|
rectangles[idx++] = s_bottom;
|
||||||
|
|
||||||
|
|
||||||
|
if (right > 0)
|
||||||
|
{
|
||||||
|
/* Right middle */
|
||||||
|
rectangles[idx++] = right;
|
||||||
|
rectangles[idx++] = top;
|
||||||
|
rectangles[idx++] = xend;
|
||||||
|
rectangles[idx++] = bottom;
|
||||||
|
|
||||||
|
rectangles[idx++] = s_right;
|
||||||
|
rectangles[idx++] = s_top;
|
||||||
|
rectangles[idx++] = 1;
|
||||||
|
rectangles[idx++] = s_bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bottom > 0)
|
||||||
|
{
|
||||||
|
if (left > 0)
|
||||||
|
{
|
||||||
|
/* Bottom left corner */
|
||||||
|
rectangles[idx++] = xoffset;
|
||||||
|
rectangles[idx++] = bottom;
|
||||||
|
rectangles[idx++] = left;
|
||||||
|
rectangles[idx++] = yend;
|
||||||
|
|
||||||
|
rectangles[idx++] = 0;
|
||||||
|
rectangles[idx++] = s_bottom;
|
||||||
|
rectangles[idx++] = s_left;
|
||||||
|
rectangles[idx++] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Bottom middle */
|
||||||
|
rectangles[idx++] = left;
|
||||||
|
rectangles[idx++] = bottom;
|
||||||
|
rectangles[idx++] = right;
|
||||||
|
rectangles[idx++] = yend;
|
||||||
|
|
||||||
|
rectangles[idx++] = s_left;
|
||||||
|
rectangles[idx++] = s_bottom;
|
||||||
|
rectangles[idx++] = s_right;
|
||||||
|
rectangles[idx++] = 1;
|
||||||
|
|
||||||
|
if (right > 0)
|
||||||
|
{
|
||||||
|
/* Bottom right corner */
|
||||||
|
rectangles[idx++] = right;
|
||||||
|
rectangles[idx++] = bottom;
|
||||||
|
rectangles[idx++] = xend;
|
||||||
|
rectangles[idx++] = yend;
|
||||||
|
|
||||||
|
rectangles[idx++] = s_right;
|
||||||
|
rectangles[idx++] = s_bottom;
|
||||||
|
rectangles[idx++] = 1;
|
||||||
|
rectangles[idx++] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cogl_rectangles_with_texture_coords (rectangles, idx / 8);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Visual feedback on shadow's 9-slice and orignal offscreen buffer,
|
||||||
|
for debug purposes */
|
||||||
|
cogl_rectangle (xend, yoffset, xend + shadow_width, yoffset + shadow_height);
|
||||||
|
|
||||||
|
cogl_set_source_color4ub (0xff, 0x0, 0x0, 0xff);
|
||||||
|
|
||||||
|
cogl_rectangle (xoffset, top, xend, top + 1);
|
||||||
|
cogl_rectangle (xoffset, bottom, xend, bottom + 1);
|
||||||
|
cogl_rectangle (left, yoffset, left + 1, yend);
|
||||||
|
cogl_rectangle (right, yoffset, right + 1, yend);
|
||||||
|
|
||||||
|
cogl_rectangle (xend, yoffset, xend + shadow_width, yoffset + 1);
|
||||||
|
cogl_rectangle (xend, yoffset + shadow_height, xend + shadow_width, yoffset + shadow_height + 1);
|
||||||
|
cogl_rectangle (xend, yoffset, xend + 1, yoffset + shadow_height);
|
||||||
|
cogl_rectangle (xend + shadow_width, yoffset, xend + shadow_width + 1, yoffset + shadow_height);
|
||||||
|
|
||||||
|
s_top *= shadow_height;
|
||||||
|
s_bottom *= shadow_height;
|
||||||
|
s_left *= shadow_width;
|
||||||
|
s_right *= shadow_width;
|
||||||
|
|
||||||
|
cogl_rectangle (xend, yoffset + s_top, xend + shadow_width, yoffset + s_top + 1);
|
||||||
|
cogl_rectangle (xend, yoffset + s_bottom, xend + shadow_width, yoffset + s_bottom + 1);
|
||||||
|
cogl_rectangle (xend + s_left, yoffset, xend + s_left + 1, yoffset + shadow_height);
|
||||||
|
cogl_rectangle (xend + s_right, yoffset, xend + s_right + 1, yoffset + shadow_height);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
st_theme_node_prerender_shadow (StThemeNodePaintState *state)
|
||||||
|
{
|
||||||
|
StThemeNode *node = state->node;
|
||||||
|
guint border_radius[4];
|
||||||
|
int max_borders[4];
|
||||||
|
int center_radius, corner_id;
|
||||||
|
CoglHandle buffer, offscreen;
|
||||||
|
|
||||||
|
/* Get infos from the node */
|
||||||
|
if (state->alloc_width < node->box_shadow_min_width ||
|
||||||
|
state->alloc_height < node->box_shadow_min_height)
|
||||||
|
st_theme_node_reduce_border_radius (node, state->alloc_width, state->alloc_height, border_radius);
|
||||||
|
else
|
||||||
|
for (corner_id = 0; corner_id < 4; corner_id++)
|
||||||
|
border_radius[corner_id] = node->border_radius[corner_id];
|
||||||
|
|
||||||
|
/* Compute maximum borders sizes */
|
||||||
|
max_borders[ST_SIDE_TOP] = MAX (node->border_radius[ST_CORNER_TOPLEFT],
|
||||||
|
node->border_radius[ST_CORNER_TOPRIGHT]);
|
||||||
|
max_borders[ST_SIDE_BOTTOM] = MAX (node->border_radius[ST_CORNER_BOTTOMLEFT],
|
||||||
|
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
|
||||||
|
max_borders[ST_SIDE_LEFT] = MAX (node->border_radius[ST_CORNER_TOPLEFT],
|
||||||
|
node->border_radius[ST_CORNER_BOTTOMLEFT]);
|
||||||
|
max_borders[ST_SIDE_RIGHT] = MAX (node->border_radius[ST_CORNER_TOPRIGHT],
|
||||||
|
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
|
||||||
|
|
||||||
|
center_radius = (node->box_shadow->blur > 0) ? (2 * node->box_shadow->blur + 1) : 1;
|
||||||
|
node->box_shadow_min_width = max_borders[ST_SIDE_LEFT] + max_borders[ST_SIDE_RIGHT] + center_radius;
|
||||||
|
node->box_shadow_min_height = max_borders[ST_SIDE_TOP] + max_borders[ST_SIDE_BOTTOM] + center_radius;
|
||||||
|
|
||||||
|
if (state->alloc_width < node->box_shadow_min_width ||
|
||||||
|
state->alloc_height < node->box_shadow_min_height)
|
||||||
|
{
|
||||||
|
state->box_shadow_width = state->alloc_width;
|
||||||
|
state->box_shadow_height = state->alloc_height;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
state->box_shadow_width = node->box_shadow_min_width;
|
||||||
|
state->box_shadow_height = node->box_shadow_min_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Render offscreen */
|
||||||
|
buffer = cogl_texture_new_with_size (state->box_shadow_width,
|
||||||
|
state->box_shadow_height,
|
||||||
|
COGL_TEXTURE_NO_SLICING,
|
||||||
|
COGL_PIXEL_FORMAT_ANY);
|
||||||
|
offscreen = cogl_offscreen_new_to_texture (buffer);
|
||||||
|
|
||||||
|
if (offscreen != COGL_INVALID_HANDLE)
|
||||||
|
{
|
||||||
|
ClutterActorBox box = { 0, 0, state->box_shadow_width, state->box_shadow_height};
|
||||||
|
CoglColor clear_color;
|
||||||
|
|
||||||
|
cogl_push_framebuffer (offscreen);
|
||||||
|
cogl_ortho (0, state->box_shadow_width, state->box_shadow_height, 0, 0, 1.0);
|
||||||
|
|
||||||
|
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
|
||||||
|
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
|
||||||
|
|
||||||
|
st_theme_node_paint_borders (state, &box, 0xFF);
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
cogl_handle_unref (offscreen);
|
||||||
|
|
||||||
|
state->box_shadow_material = _st_create_shadow_material (st_theme_node_get_box_shadow (node),
|
||||||
|
buffer);
|
||||||
|
}
|
||||||
|
cogl_handle_unref (buffer);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_theme_node_paint_sliced_border_image (StThemeNode *node,
|
st_theme_node_paint_sliced_border_image (StThemeNode *node,
|
||||||
float width,
|
float width,
|
||||||
@ -1945,6 +2336,43 @@ st_theme_node_paint_outline (StThemeNode *node,
|
|||||||
cogl_rectangles (rects, 4);
|
cogl_rectangles (rects, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_theme_node_needs_new_box_shadow_for_size (StThemeNodePaintState *state,
|
||||||
|
StThemeNode *node,
|
||||||
|
float width,
|
||||||
|
float height)
|
||||||
|
{
|
||||||
|
if (!node->rendered_once)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* The allocation hasn't changed, no need to recompute a new
|
||||||
|
box-shadow. */
|
||||||
|
if (state->alloc_width == width ||
|
||||||
|
state->alloc_height == height)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* If there is no shadow, no need to recompute a new box-shadow. */
|
||||||
|
if (node->box_shadow_min_width == 0 ||
|
||||||
|
node->box_shadow_min_height == 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* If the new size is inferior to the box-shadow minimum size (we
|
||||||
|
already know the size has changed), we need to recompute the
|
||||||
|
box-shadow. */
|
||||||
|
if (width < node->box_shadow_min_width ||
|
||||||
|
height < node->box_shadow_min_height)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* Now checking whether the size of the node has crossed the minimum
|
||||||
|
box-shadow size boundary, from below to above the minimum size .
|
||||||
|
If that's the case, we need to recompute the box-shadow */
|
||||||
|
if (state->alloc_width < node->box_shadow_min_width ||
|
||||||
|
state->alloc_height < node->box_shadow_min_height)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
st_theme_node_paint (StThemeNode *node,
|
st_theme_node_paint (StThemeNode *node,
|
||||||
StThemeNodePaintState *state,
|
StThemeNodePaintState *state,
|
||||||
@ -1964,11 +2392,22 @@ st_theme_node_paint (StThemeNode *node,
|
|||||||
if (width <= 0 || height <= 0)
|
if (width <= 0 || height <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (state->alloc_width != width || state->alloc_height != height)
|
if (st_theme_node_needs_new_box_shadow_for_size (state, node, width, height))
|
||||||
{
|
{
|
||||||
state->node = node;
|
/* If we had the ability to cache textures on the node, then we
|
||||||
st_theme_node_render_resources (node, state, width, height);
|
can just copy them over to the paint state and avoid all
|
||||||
|
rendering. We end up sharing textures a cross different
|
||||||
|
widgets. */
|
||||||
|
if (node->rendered_once && node->cached_textures &&
|
||||||
|
width >= node->box_shadow_min_width && height >= node->box_shadow_min_height)
|
||||||
|
st_theme_node_paint_state_copy (state, &node->cached_state);
|
||||||
|
else
|
||||||
|
st_theme_node_render_resources (state, node, width, height);
|
||||||
|
|
||||||
|
node->rendered_once = TRUE;
|
||||||
}
|
}
|
||||||
|
else if (state->alloc_width != width || state->alloc_height != height)
|
||||||
|
st_theme_node_update_resources (state, node, width, height);
|
||||||
|
|
||||||
/* Rough notes about the relationship of borders and backgrounds in CSS3;
|
/* Rough notes about the relationship of borders and backgrounds in CSS3;
|
||||||
* see http://www.w3.org/TR/css3-background/ for more accurate details.
|
* see http://www.w3.org/TR/css3-background/ for more accurate details.
|
||||||
@ -1997,10 +2436,18 @@ st_theme_node_paint (StThemeNode *node,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (state->box_shadow_material)
|
if (state->box_shadow_material)
|
||||||
_st_paint_shadow_with_opacity (node->box_shadow,
|
{
|
||||||
state->box_shadow_material,
|
if (state->alloc_width < node->box_shadow_min_width ||
|
||||||
&allocation,
|
state->alloc_height < node->box_shadow_min_height)
|
||||||
paint_opacity);
|
_st_paint_shadow_with_opacity (node->box_shadow,
|
||||||
|
state->box_shadow_material,
|
||||||
|
&allocation,
|
||||||
|
paint_opacity);
|
||||||
|
else
|
||||||
|
st_theme_node_paint_sliced_shadow (state,
|
||||||
|
&allocation,
|
||||||
|
paint_opacity);
|
||||||
|
}
|
||||||
|
|
||||||
if (state->prerendered_material != COGL_INVALID_HANDLE ||
|
if (state->prerendered_material != COGL_INVALID_HANDLE ||
|
||||||
st_theme_node_load_border_image (node))
|
st_theme_node_load_border_image (node))
|
||||||
@ -2024,7 +2471,7 @@ st_theme_node_paint (StThemeNode *node,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
st_theme_node_paint_borders (node, state, box, paint_opacity);
|
st_theme_node_paint_borders (state, box, paint_opacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
st_theme_node_paint_outline (node, box, paint_opacity);
|
st_theme_node_paint_outline (node, box, paint_opacity);
|
||||||
@ -2124,6 +2571,8 @@ st_theme_node_paint_state_copy (StThemeNodePaintState *state,
|
|||||||
|
|
||||||
state->alloc_width = other->alloc_width;
|
state->alloc_width = other->alloc_width;
|
||||||
state->alloc_height = other->alloc_height;
|
state->alloc_height = other->alloc_height;
|
||||||
|
state->box_shadow_width = other->box_shadow_width;
|
||||||
|
state->box_shadow_height = other->box_shadow_height;
|
||||||
|
|
||||||
if (other->box_shadow_material)
|
if (other->box_shadow_material)
|
||||||
state->box_shadow_material = cogl_handle_ref (other->box_shadow_material);
|
state->box_shadow_material = cogl_handle_ref (other->box_shadow_material);
|
||||||
|
@ -99,12 +99,19 @@ struct _StThemeNode {
|
|||||||
guint background_image_shadow_computed : 1;
|
guint background_image_shadow_computed : 1;
|
||||||
guint text_shadow_computed : 1;
|
guint text_shadow_computed : 1;
|
||||||
guint link_type : 2;
|
guint link_type : 2;
|
||||||
|
guint rendered_once : 1;
|
||||||
|
guint cached_textures : 1;
|
||||||
|
|
||||||
|
int box_shadow_min_width;
|
||||||
|
int box_shadow_min_height;
|
||||||
|
|
||||||
CoglHandle border_slices_texture;
|
CoglHandle border_slices_texture;
|
||||||
CoglHandle border_slices_material;
|
CoglHandle border_slices_material;
|
||||||
CoglHandle background_texture;
|
CoglHandle background_texture;
|
||||||
CoglHandle background_material;
|
CoglHandle background_material;
|
||||||
CoglHandle background_shadow_material;
|
CoglHandle background_shadow_material;
|
||||||
|
|
||||||
|
StThemeNodePaintState cached_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _StThemeNodeClass {
|
struct _StThemeNodeClass {
|
||||||
|
@ -54,6 +54,8 @@ st_theme_node_init (StThemeNode *node)
|
|||||||
node->background_shadow_material = COGL_INVALID_HANDLE;
|
node->background_shadow_material = COGL_INVALID_HANDLE;
|
||||||
node->border_slices_texture = COGL_INVALID_HANDLE;
|
node->border_slices_texture = COGL_INVALID_HANDLE;
|
||||||
node->border_slices_material = COGL_INVALID_HANDLE;
|
node->border_slices_material = COGL_INVALID_HANDLE;
|
||||||
|
|
||||||
|
st_theme_node_paint_state_init (&node->cached_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -101,6 +103,8 @@ st_theme_node_dispose (GObject *gobject)
|
|||||||
g_signal_handlers_disconnect_by_func (node->theme,
|
g_signal_handlers_disconnect_by_func (node->theme,
|
||||||
on_custom_stylesheets_changed, node);
|
on_custom_stylesheets_changed, node);
|
||||||
|
|
||||||
|
st_theme_node_paint_state_free (&node->cached_state);
|
||||||
|
|
||||||
g_clear_object (&node->theme);
|
g_clear_object (&node->theme);
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
|
G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
|
||||||
@ -3056,6 +3060,10 @@ parse_shadow_property (StThemeNode *node,
|
|||||||
*/
|
*/
|
||||||
for (term = decl->value; term; term = term->next)
|
for (term = decl->value; term; term = term->next)
|
||||||
{
|
{
|
||||||
|
/* if we found "none", we're all set with the default values */
|
||||||
|
if (term_is_none (term))
|
||||||
|
return VALUE_FOUND;
|
||||||
|
|
||||||
if (term->type == TERM_NUMBER)
|
if (term->type == TERM_NUMBER)
|
||||||
{
|
{
|
||||||
gdouble value;
|
gdouble value;
|
||||||
|
@ -102,6 +102,9 @@ struct _StThemeNodePaintState {
|
|||||||
float alloc_width;
|
float alloc_width;
|
||||||
float alloc_height;
|
float alloc_height;
|
||||||
|
|
||||||
|
float box_shadow_width;
|
||||||
|
float box_shadow_height;
|
||||||
|
|
||||||
CoglHandle box_shadow_material;
|
CoglHandle box_shadow_material;
|
||||||
CoglHandle prerendered_texture;
|
CoglHandle prerendered_texture;
|
||||||
CoglHandle prerendered_material;
|
CoglHandle prerendered_material;
|
||||||
|
@ -385,7 +385,7 @@ st_widget_finalize (GObject *gobject)
|
|||||||
g_free (priv->inline_style);
|
g_free (priv->inline_style);
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
|
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
|
||||||
st_theme_node_paint_state_init (&priv->paint_states[i]);
|
st_theme_node_paint_state_free (&priv->paint_states[i]);
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_widget_parent_class)->finalize (gobject);
|
G_OBJECT_CLASS (st_widget_parent_class)->finalize (gobject);
|
||||||
}
|
}
|
||||||
@ -643,8 +643,9 @@ st_widget_get_theme_node (StWidget *widget)
|
|||||||
|
|
||||||
if (stage == NULL)
|
if (stage == NULL)
|
||||||
{
|
{
|
||||||
g_error ("st_widget_get_theme_node called on the widget %s which is not in the stage.",
|
g_critical ("st_widget_get_theme_node called on the widget %s which is not in the stage.",
|
||||||
st_describe_actor (CLUTTER_ACTOR (widget)));
|
st_describe_actor (CLUTTER_ACTOR (widget)));
|
||||||
|
return g_object_new (ST_TYPE_THEME_NODE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent_node == NULL)
|
if (parent_node == NULL)
|
||||||
|
@ -8,6 +8,7 @@ TEST_JS = \
|
|||||||
interactive/border-radius.js \
|
interactive/border-radius.js \
|
||||||
interactive/border-width.js \
|
interactive/border-width.js \
|
||||||
interactive/box-layout.js \
|
interactive/box-layout.js \
|
||||||
|
interactive/box-shadow-animated.js \
|
||||||
interactive/box-shadows.js \
|
interactive/box-shadows.js \
|
||||||
interactive/calendar.js \
|
interactive/calendar.js \
|
||||||
interactive/css-fonts.js \
|
interactive/css-fonts.js \
|
||||||
|
@ -45,12 +45,6 @@ function test() {
|
|||||||
style: 'border: 1px solid #aaaaaa; '
|
style: 'border: 1px solid #aaaaaa; '
|
||||||
+ 'background: #cceeff' }));
|
+ 'background: #cceeff' }));
|
||||||
|
|
||||||
b2.add(new St.Label({ x: 50,
|
|
||||||
y: 50,
|
|
||||||
text: "Fixed",
|
|
||||||
style: 'border: 1px solid #aaaaaa;'
|
|
||||||
+ 'background: #ffffcc' }));
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
function createCollapsableBox(width) {
|
function createCollapsableBox(width) {
|
||||||
|
84
tests/interactive/box-shadow-animated.js
Normal file
84
tests/interactive/box-shadow-animated.js
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
const Mainloop = imports.mainloop;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
|
||||||
|
const UI = imports.testcommon.ui;
|
||||||
|
|
||||||
|
const DELAY = 2000;
|
||||||
|
|
||||||
|
function resize_animated(label) {
|
||||||
|
if (label.width == 100) {
|
||||||
|
label.save_easing_state();
|
||||||
|
label.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
|
||||||
|
label.set_easing_duration(DELAY - 50);
|
||||||
|
label.set_size(500, 500);
|
||||||
|
label.restore_easing_state();
|
||||||
|
} else {
|
||||||
|
label.save_easing_state();
|
||||||
|
label.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
|
||||||
|
label.set_easing_duration(DELAY - 50);
|
||||||
|
label.set_size(100, 100);
|
||||||
|
label.restore_easing_state();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_css_style(shadow_style)
|
||||||
|
{
|
||||||
|
return 'border: 20px solid black;' +
|
||||||
|
'border-radius: 20px;' +
|
||||||
|
'background-color: white; ' +
|
||||||
|
'padding: 5px;' + shadow_style;
|
||||||
|
}
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
let stage = new Clutter.Stage({ width: 1000, height: 600 });
|
||||||
|
UI.init(stage);
|
||||||
|
|
||||||
|
let iter = 0;
|
||||||
|
let shadowStyles = [ 'box-shadow: 3px 50px 0px 4px rgba(0,0,0,0.5);',
|
||||||
|
'box-shadow: 3px 4px 10px 4px rgba(0,0,0,0.5);',
|
||||||
|
'box-shadow: 0px 50px 0px 0px rgba(0,0,0,0.5);',
|
||||||
|
'box-shadow: 100px 100px 20px 4px rgba(0,0,0,0.5);'];
|
||||||
|
let label1 = new St.Label({ style: get_css_style(shadowStyles[iter]),
|
||||||
|
text: shadowStyles[iter],
|
||||||
|
x: 20,
|
||||||
|
y: 20,
|
||||||
|
width: 100,
|
||||||
|
height: 100
|
||||||
|
});
|
||||||
|
stage.add_actor(label1);
|
||||||
|
let label2 = new St.Label({ style: get_css_style(shadowStyles[iter]),
|
||||||
|
text: shadowStyles[iter],
|
||||||
|
x: 500,
|
||||||
|
y: 20,
|
||||||
|
width: 100,
|
||||||
|
height: 100
|
||||||
|
});
|
||||||
|
stage.add_actor(label2);
|
||||||
|
|
||||||
|
resize_animated(label1);
|
||||||
|
resize_animated(label2);
|
||||||
|
Mainloop.timeout_add(DELAY, Lang.bind(this, function() {
|
||||||
|
log(label1 + label1.get_size());
|
||||||
|
resize_animated(label1);
|
||||||
|
resize_animated(label2);
|
||||||
|
return true;
|
||||||
|
}));
|
||||||
|
|
||||||
|
Mainloop.timeout_add(2 * DELAY, Lang.bind(this, function() {
|
||||||
|
iter += 1;
|
||||||
|
iter %= shadowStyles.length;
|
||||||
|
label1.set_style(get_css_style(shadowStyles[iter]));
|
||||||
|
label1.set_text(shadowStyles[iter]);
|
||||||
|
label2.set_style(get_css_style(shadowStyles[iter]));
|
||||||
|
label2.set_text(shadowStyles[iter]);
|
||||||
|
return true;
|
||||||
|
}));
|
||||||
|
|
||||||
|
UI.main(stage);
|
||||||
|
}
|
||||||
|
test();
|
Reference in New Issue
Block a user