Compare commits
101 Commits
3.7.1
...
wip/media-
Author | SHA1 | Date | |
---|---|---|---|
60d87ef4ba | |||
d886dc17e1 | |||
9dd2a467ba | |||
e757b06987 | |||
6f2da1baf1 | |||
f30dcad8a7 | |||
7dc235511e | |||
644c210fe2 | |||
68e8f98671 | |||
1228db6ac1 | |||
86596749fa | |||
76229a3601 | |||
95abdeb919 | |||
df0151d338 | |||
ee2f12fe81 | |||
10c104529f | |||
cbc8ec6508 | |||
8e7758e280 | |||
9aefbd189c | |||
b9d50584d8 | |||
e5f7390c09 | |||
797b1ff8bb | |||
09b738045c | |||
4fd690333a | |||
5ef5e25a7f | |||
87e8770cbc | |||
cac9d120be | |||
1ae0fadbf4 | |||
65497e089a | |||
2d763bd033 | |||
4ebf396cf5 | |||
6faa50d496 | |||
6fcd6298c8 | |||
5c16be5dbb | |||
e3abb6f178 | |||
70736be4eb | |||
1c3e7330f3 | |||
6e4c89b310 | |||
73b4a0ef5f | |||
d88002c4ed | |||
025c63c045 | |||
b189cbd46e | |||
a21ddb5914 | |||
e04a4c3923 | |||
ae0821e07b | |||
a508bece36 | |||
2c9969a8f4 | |||
dd9fc91f6f | |||
39d9838cc1 | |||
1397c7c624 | |||
c09fcba94f | |||
c77b38fc4f | |||
aef9b733e5 | |||
348208617b | |||
2c34c8e20f | |||
d19fa731d6 | |||
59bb1cc387 | |||
56909d0646 | |||
04da29c939 | |||
307f7a3024 | |||
e80bfa39f5 | |||
29714922ea | |||
88192114ac | |||
9d78208b76 | |||
d817bf0395 | |||
4d51056226 | |||
a607174a25 | |||
37d6a624b7 | |||
0c807bddaf | |||
a0470bfc66 | |||
b9463d23e8 | |||
04debd1623 | |||
9d31576cf5 | |||
8daca28a90 | |||
9899604261 | |||
687e1eabed | |||
eb09f34114 | |||
fbeb446ed7 | |||
92033ce0f5 | |||
9171bab5e5 | |||
f9819eb7b0 | |||
85728f0d15 | |||
9396849d56 | |||
6f5e5672bb | |||
b936e60876 | |||
fa4bd91213 | |||
81eeef7d3c | |||
a7b5134820 | |||
92a01c67ba | |||
71c23613b5 | |||
4f876995de | |||
9cf4a76196 | |||
9efe5287e4 | |||
8c4b34de4e | |||
93e3559dc3 | |||
caa0f63e1f | |||
a4e29e1244 | |||
599f2f43e3 | |||
3a453c5f73 | |||
98b313c75f | |||
8b796d80a7 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -45,6 +45,7 @@ intltool-merge.in
|
||||
intltool-update.in
|
||||
libtool
|
||||
m4/
|
||||
man/gnome-shell.1
|
||||
omf.make
|
||||
po/*.gmo
|
||||
po/gnome-shell.pot
|
||||
|
@ -1,7 +1,11 @@
|
||||
# Point to our macro directory and pick up user flags from the environment
|
||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
||||
|
||||
SUBDIRS = data js src browser-plugin tests po man docs
|
||||
SUBDIRS = data js src browser-plugin tests po docs
|
||||
|
||||
if ENABLE_MAN
|
||||
SUBDIRS += man
|
||||
endif
|
||||
|
||||
EXTRA_DIST = \
|
||||
.project \
|
||||
@ -21,4 +25,4 @@ distcheck-hook:
|
||||
@echo "Checking disted files against files in git"
|
||||
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
|
||||
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man
|
||||
|
21
configure.ac
21
configure.ac
@ -36,6 +36,8 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
||||
|
||||
PKG_PROG_PKG_CONFIG([0.22])
|
||||
|
||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
||||
|
||||
GLIB_GSETTINGS
|
||||
|
||||
# Get a value to substitute into gnome-shell.in
|
||||
@ -52,7 +54,7 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
|
||||
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
build_recorder=true
|
||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11"
|
||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
|
||||
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
@ -97,8 +99,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||
libnm-glib libnm-util gnome-keyring-1
|
||||
gcr-3 >= $GCR_MIN_VERSION
|
||||
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
|
||||
gcr-3 >= $GCR_MIN_VERSION)
|
||||
|
||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||
|
||||
@ -139,7 +140,7 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||
AC_SUBST([HAVE_BLUETOOTH],[0])
|
||||
AC_MSG_RESULT([no])])
|
||||
|
||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0)
|
||||
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
|
||||
AC_SUBST(CALENDAR_SERVER_CFLAGS)
|
||||
AC_SUBST(CALENDAR_SERVER_LIBS)
|
||||
|
||||
@ -208,6 +209,18 @@ AC_SUBST(TYPELIBDIR)
|
||||
|
||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||
|
||||
AC_ARG_ENABLE(man,
|
||||
[AS_HELP_STRING([--enable-man],
|
||||
[generate man pages [default=yes]])],,
|
||||
enable_man=yes)
|
||||
if test "$enable_man" != no; then
|
||||
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
||||
if test -z "$XSLTPROC"; then
|
||||
AC_MSG_ERROR([xsltproc is required for --enable-man])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
||||
|
||||
# Stay command-line compatible with the gnome-common configure option. Here
|
||||
# minimum/yes/maximum are the same, however.
|
||||
AC_ARG_ENABLE(compile_warnings,
|
||||
|
@ -8,6 +8,9 @@
|
||||
<KeyListEntry name="toggle-message-tray"
|
||||
_description="Show the message tray"/>
|
||||
|
||||
<KeyListEntry name="focus-active-notification"
|
||||
_description="Focus the active notification"/>
|
||||
|
||||
<KeyListEntry name="toggle-application-view"
|
||||
_description="Show all applications"/>
|
||||
|
||||
|
@ -57,6 +57,14 @@ value here is from the TpConnectionPresenceType enumeration.</_summary>
|
||||
<_summary>Internally used to store the last session presence status for the user. The
|
||||
value here is from the GsmPresenceStatus enumeration.</_summary>
|
||||
</key>
|
||||
<key name="always-show-log-out" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Always show the 'Log out' menuitem in the user menu.</_summary>
|
||||
<_description>
|
||||
This key overrides the automatic hiding of the 'Log out'
|
||||
menuitem in single-user, single-session situations.
|
||||
</_description>
|
||||
</key>
|
||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||
@ -98,6 +106,13 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
|
||||
Keybinding to toggle the visibility of the message tray.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="focus-active-notification" type="as">
|
||||
<default>["<Super>n"]</default>
|
||||
<_summary>Keybinding to focus the active notification</_summary>
|
||||
<_description>
|
||||
Keybinding to focus the active notification.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="toggle-recording" type="as">
|
||||
<default><![CDATA[['<Control><Shift><Alt>r']]]></default>
|
||||
<_summary>Keybinding to toggle the screen recorder</_summary>
|
||||
|
@ -39,7 +39,6 @@ stage {
|
||||
/* small */
|
||||
.app-well-menu,
|
||||
.contact-details-status,
|
||||
.run-dialog-label,
|
||||
.run-dialog-error-label {
|
||||
font-size: 9pt;
|
||||
}
|
||||
@ -311,7 +310,7 @@ StScrollBar StButton#vhandle:active {
|
||||
.notification-icon-button:focus,
|
||||
.hotplug-notification-item:focus,
|
||||
.modal-dialog-button:focus {
|
||||
border: 2px solid #8b8b8b;
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
.dash-search-button:active,
|
||||
@ -326,17 +325,20 @@ StScrollBar StButton#vhandle:active {
|
||||
background-gradient-end: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
.notification-button:insensitive,
|
||||
.notification-icon-button:insensitive,
|
||||
.notification-button:insensitive {
|
||||
.modal-dialog-button:insensitive {
|
||||
border-color: #666666;
|
||||
color: #9f9f9f;
|
||||
background-gradient-direction: none;
|
||||
background-color: rgba(102, 102, 102, 0.15);
|
||||
}
|
||||
|
||||
/* Entries */
|
||||
|
||||
#searchEntry,
|
||||
.notification StEntry,
|
||||
.login-dialog-prompt-entry,
|
||||
.prompt-dialog-password-entry {
|
||||
.modal-dialog StEntry {
|
||||
color: rgb(64, 64, 64);
|
||||
caret-color: rgb(64, 64, 64);
|
||||
font-size: 12pt;
|
||||
@ -346,6 +348,7 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
#searchEntry,
|
||||
.run-dialog-entry,
|
||||
.notification StEntry {
|
||||
border: 2px solid rgba(245,245,245,0.2);
|
||||
background-gradient-start: rgba(5,5,6,0.1);
|
||||
@ -358,8 +361,7 @@ StScrollBar StButton#vhandle:active {
|
||||
#searchEntry:focus,
|
||||
#searchEntry:hover,
|
||||
.notification StEntry:focus,
|
||||
.login-dialog-prompt-entry,
|
||||
.prompt-dialog-password-entry {
|
||||
.modal-dialog StEntry {
|
||||
border: 2px solid rgb(136,138,133);
|
||||
background-gradient-start: rgb(200,200,200);
|
||||
background-gradient-end: white;
|
||||
@ -368,12 +370,17 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.notification StEntry:focus,
|
||||
.prompt-dialog-password-entry:focus,
|
||||
.login-dialog-prompt-entry:focus {
|
||||
.modal-dialog StEntry:focus {
|
||||
border: 2px solid #3465a4;
|
||||
}
|
||||
|
||||
#searchEntry {
|
||||
border-color: rgba(245,245,245,0.3);
|
||||
color: rgb(192, 192, 192);
|
||||
caret-color: rgb(192, 192, 192);
|
||||
}
|
||||
|
||||
#searchEntry:hover {
|
||||
color: rgb(128, 128, 128);
|
||||
caret-color: rgb(128, 128, 128);
|
||||
}
|
||||
@ -386,8 +393,7 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.notification StEntry,
|
||||
.prompt-dialog-password-entry,
|
||||
.login-dialog-prompt-entry {
|
||||
.modal-dialog StEntry {
|
||||
border-radius: 5px;
|
||||
padding: 4px 4px;
|
||||
}
|
||||
@ -551,7 +557,6 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.status-chooser-combo.popup-combo-menu {
|
||||
background-color: rgba(0,0,0,0.7);
|
||||
padding: .4em 0em;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #5f5f5f;
|
||||
@ -614,9 +619,9 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.window-close, .notification-close {
|
||||
background-image: url("close-window.svg");
|
||||
background-size: 34px;
|
||||
height: 34px;
|
||||
width: 34px;
|
||||
background-size: 32px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.window-close {
|
||||
@ -627,15 +632,22 @@ StScrollBar StButton#vhandle:active {
|
||||
/* we start out in the top right of the
|
||||
* notification, inset.
|
||||
*
|
||||
* center is 32px/2 = 17px
|
||||
* center is 32px/2 = 16px
|
||||
*
|
||||
* adjust left 2px
|
||||
* adjust down 8px */
|
||||
|
||||
-shell-close-overlap-x: 15px;
|
||||
-shell-close-overlap-x: 14px;
|
||||
-shell-close-overlap-y: -12px;
|
||||
}
|
||||
|
||||
.notification-close:rtl {
|
||||
/* as above, but starting out in the top left of the
|
||||
* notification. */
|
||||
|
||||
-shell-close-overlap-x: -14px;
|
||||
}
|
||||
|
||||
.window-close:rtl {
|
||||
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
|
||||
}
|
||||
@ -682,6 +694,11 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.search-entry-icon {
|
||||
icon-size: 1em;
|
||||
color: #c0c0c0;
|
||||
}
|
||||
|
||||
#searchEntry:hover .search-entry-icon,
|
||||
#searchEntry:focus .search-entry-icon {
|
||||
color: #8d8f8a;
|
||||
}
|
||||
|
||||
@ -1193,7 +1210,6 @@ StScrollBar StButton#vhandle:active {
|
||||
background: #2e3436 url(message-tray-background.png);
|
||||
background-repeat: repeat;
|
||||
transition-duration: 250;
|
||||
height: 72px;
|
||||
}
|
||||
|
||||
#message-tray:keyboard {
|
||||
@ -1203,7 +1219,7 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
#message-tray:overview {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
border-top: 1px solid rgba(128, 128, 128, 0.3);
|
||||
outline: 1px solid rgba(128, 128, 128, 0.3);
|
||||
}
|
||||
|
||||
.notification {
|
||||
@ -1416,6 +1432,10 @@ StScrollBar StButton#vhandle:active {
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.chat-notification-scrollview{
|
||||
max-height: 22em;
|
||||
}
|
||||
|
||||
.subscription-message {
|
||||
font-style: italic;
|
||||
}
|
||||
@ -1425,28 +1445,34 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
#summary-mode {
|
||||
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */
|
||||
height: 60px;
|
||||
spacing: 10px;
|
||||
height: 72px;
|
||||
}
|
||||
|
||||
.summary-source-button {
|
||||
border-radius: 4px;
|
||||
transition-duration: 100;
|
||||
padding: 6px 3px 6px 3px;
|
||||
}
|
||||
|
||||
.summary-source-button:hover {
|
||||
.summary-source-button:last-child:ltr {
|
||||
padding-right: 6px;
|
||||
}
|
||||
|
||||
.summary-source-button:last-child:rtl {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.summary-source-button:hover .summary-source {
|
||||
background-color: rgba(255,255,255,0.1);
|
||||
}
|
||||
|
||||
.summary-source-button:focus,
|
||||
.summary-source-button:selected {
|
||||
.summary-source-button:focus .summary-source,
|
||||
.summary-source-button:selected .summary-source {
|
||||
background-color: rgba(255,255,255,0.33);
|
||||
}
|
||||
|
||||
.summary-source {
|
||||
padding-right: 6px;
|
||||
padding-left: 6px;
|
||||
border-radius: 4px;
|
||||
padding: 0 6px 0 6px;
|
||||
transition-duration: 100;
|
||||
}
|
||||
|
||||
.summary-source-counter {
|
||||
@ -1624,35 +1650,26 @@ StScrollBar StButton#vhandle:active {
|
||||
padding: 4px 32px 5px;
|
||||
}
|
||||
|
||||
.modal-dialog-button:insensitive {
|
||||
color: rgb(60, 60, 60);
|
||||
}
|
||||
|
||||
.modal-dialog-button:focus {
|
||||
padding: 3px 31px 4px;
|
||||
}
|
||||
|
||||
/* Run Dialog */
|
||||
|
||||
.run-dialog-label {
|
||||
font-size: 12pt;
|
||||
font-weight: bold;
|
||||
color: #999999;
|
||||
padding-bottom: .4em;
|
||||
}
|
||||
|
||||
.run-dialog-error-box {
|
||||
padding-top: 15px;
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
.run-dialog-entry {
|
||||
font-weight: bold;
|
||||
width: 23em;
|
||||
selection-background-color: white;
|
||||
selected-color: black;
|
||||
}
|
||||
|
||||
.run-dialog {
|
||||
border-radius: 16px;
|
||||
|
||||
padding-right: 21px;
|
||||
padding-left: 21px;
|
||||
padding-bottom: 15px;
|
||||
padding-top: 15px;
|
||||
.modal-dialog .run-dialog-entry {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
.lightbox {
|
||||
@ -2178,24 +2195,20 @@ StScrollBar StButton#vhandle:active {
|
||||
height: .75em;
|
||||
}
|
||||
|
||||
|
||||
.login-dialog .modal-dialog-button {
|
||||
border: 1px solid #666666;
|
||||
border-radius: 5px;
|
||||
padding: 3px 18px;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:focus {
|
||||
padding: 2px 17px;
|
||||
border: 2px solid #8b8b8b;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:default {
|
||||
background-gradient-start: #6793c4;
|
||||
background-gradient-end: #335d8f;
|
||||
background-gradient-direction: vertical;
|
||||
padding: 2px 17px;
|
||||
border: 2px solid #16335d;
|
||||
border-color: #16335d;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:default:focus {
|
||||
@ -2213,6 +2226,13 @@ StScrollBar StButton#vhandle:active {
|
||||
background-gradient-end: #74a0d0;
|
||||
}
|
||||
|
||||
.login-dialog .modal-dialog-button:default:insensitive {
|
||||
border-color: #666666;
|
||||
color: #9f9f9f;
|
||||
background-gradient-direction: none;
|
||||
background-color: rgba(102, 102, 102, 0.15);
|
||||
}
|
||||
|
||||
.login-dialog-message-warning {
|
||||
color: orange;
|
||||
}
|
||||
@ -2305,3 +2325,17 @@ StScrollBar StButton#vhandle:active {
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
.osd-window {
|
||||
color: #ededed;
|
||||
background-color: rgba(33, 37, 38, 0.80);
|
||||
border-radius: 15px;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 0.75);
|
||||
|
||||
padding: 40px;
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
.osd-progress-bar {
|
||||
height: 0.8em;
|
||||
border: 1px solid;
|
||||
}
|
||||
|
@ -100,6 +100,7 @@ nobase_dist_js_DATA = \
|
||||
ui/components/__init__.js \
|
||||
ui/components/autorunManager.js \
|
||||
ui/components/automountManager.js \
|
||||
ui/components/mediaKeysManager.js \
|
||||
ui/components/networkAgent.js \
|
||||
ui/components/polkitAgent.js \
|
||||
ui/components/recorder.js \
|
||||
|
@ -39,13 +39,14 @@ const GdmUtil = imports.gdm.util;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const UserMenu = imports.ui.userMenu;
|
||||
|
||||
const _RESIZE_ANIMATION_TIME = 0.25;
|
||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||
const _LOGO_ICON_NAME_SIZE = 48;
|
||||
const _LOGO_ICON_HEIGHT = 16;
|
||||
|
||||
let _loginDialog = null;
|
||||
|
||||
@ -82,6 +83,36 @@ function _smoothlyResizeActor(actor, width, height) {
|
||||
return hold;
|
||||
}
|
||||
|
||||
const LogoMenuButton = new Lang.Class({
|
||||
Name: 'LogoMenuButton',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function() {
|
||||
this.parent(0.0, null, true);
|
||||
|
||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
||||
Lang.bind(this, this._updateLogo));
|
||||
|
||||
this._iconBin = new St.Bin();
|
||||
this.actor.add_actor(this._iconBin);
|
||||
|
||||
this._updateLogo();
|
||||
},
|
||||
|
||||
_updateLogo: function() {
|
||||
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
|
||||
let icon = null;
|
||||
|
||||
if (path) {
|
||||
let file = Gio.file_new_for_path(path);
|
||||
let cache = St.TextureCache.get_default();
|
||||
icon = cache.load_uri_async(file.get_uri(), -1, _LOGO_ICON_HEIGHT);
|
||||
}
|
||||
this._iconBin.set_child(icon);
|
||||
}
|
||||
});
|
||||
|
||||
const UserListItem = new Lang.Class({
|
||||
Name: 'UserListItem',
|
||||
|
||||
@ -653,22 +684,19 @@ const LoginDialog = new Lang.Class({
|
||||
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
|
||||
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
|
||||
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
|
||||
this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
|
||||
this._userVerifier.connect('reset', Lang.bind(this, this._reset));
|
||||
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
|
||||
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
|
||||
this._verifyingUser = false;
|
||||
|
||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
|
||||
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
|
||||
Lang.bind(this, this._updateLogo));
|
||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
||||
Lang.bind(this, this._updateBanner));
|
||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
|
||||
Lang.bind(this, this._updateBanner));
|
||||
|
||||
this._logoBox = new St.Bin({ style_class: 'login-dialog-logo-box' });
|
||||
this.contentLayout.add(this._logoBox);
|
||||
this._updateLogo();
|
||||
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
|
||||
Lang.bind(this, this._updateDisableUserList));
|
||||
|
||||
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
|
||||
text: '' });
|
||||
@ -676,7 +704,8 @@ const LoginDialog = new Lang.Class({
|
||||
this._updateBanner();
|
||||
|
||||
this._titleLabel = new St.Label({ style_class: 'login-dialog-title',
|
||||
text: C_("title", "Sign In") });
|
||||
text: C_("title", "Sign In"),
|
||||
visible: false });
|
||||
|
||||
this.contentLayout.add(this._titleLabel,
|
||||
{ y_fill: false,
|
||||
@ -706,6 +735,7 @@ const LoginDialog = new Lang.Class({
|
||||
x_align: St.Align.START });
|
||||
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
||||
can_focus: true });
|
||||
this._promptEntryTextChangedId = 0;
|
||||
this._promptBox.add(this._promptEntry,
|
||||
{ expand: true,
|
||||
x_fill: true,
|
||||
@ -744,7 +774,7 @@ const LoginDialog = new Lang.Class({
|
||||
x_align: St.Align.START,
|
||||
x_fill: true });
|
||||
|
||||
this._notListedButton.connect('clicked', Lang.bind(this, this._onNotListedClicked));
|
||||
this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn));
|
||||
|
||||
this.contentLayout.add(this._notListedButton,
|
||||
{ expand: false,
|
||||
@ -770,18 +800,19 @@ const LoginDialog = new Lang.Class({
|
||||
|
||||
},
|
||||
|
||||
_updateLogo: function() {
|
||||
this._logoBox.child = null;
|
||||
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
|
||||
_updateDisableUserList: function() {
|
||||
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
|
||||
|
||||
if (path) {
|
||||
let file = Gio.file_new_for_path(path);
|
||||
let uri = file.get_uri();
|
||||
// If this is the first time around, set initial focus
|
||||
if (this._disableUserList == undefined && disableUserList)
|
||||
this.setInitialKeyFocus(this._promptEntry);
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
this._logoBox.child = textureCache.load_uri_async(uri, -1, _LOGO_ICON_NAME_SIZE);
|
||||
if (disableUserList != this._disableUserList) {
|
||||
this._disableUserList = disableUserList;
|
||||
|
||||
if (!this._verifyingUser)
|
||||
this._reset();
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
_updateBanner: function() {
|
||||
@ -796,32 +827,15 @@ const LoginDialog = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_onReset: function(client, serviceName) {
|
||||
_reset: function() {
|
||||
this._promptMessage.hide();
|
||||
|
||||
let tasks = [this._hidePrompt,
|
||||
|
||||
new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
|
||||
this._fadeInNotListedButton,
|
||||
this._fadeInLogo]),
|
||||
|
||||
function() {
|
||||
this._sessionList.close();
|
||||
this._promptLoginHint.hide();
|
||||
this._userList.actor.show();
|
||||
this._userList.actor.opacity = 255;
|
||||
return this._userList.showItems();
|
||||
},
|
||||
|
||||
function() {
|
||||
this._userList.actor.reactive = true;
|
||||
this._userList.actor.grab_key_focus();
|
||||
}];
|
||||
|
||||
this._user = null;
|
||||
this._verifyingUser = false;
|
||||
|
||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||
batch.run();
|
||||
if (this._disableUserList)
|
||||
this._hideUserListAndLogIn();
|
||||
else
|
||||
this._showUserList();
|
||||
},
|
||||
|
||||
_onDefaultSessionChanged: function(client, sessionId) {
|
||||
@ -829,9 +843,13 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showMessage: function(userVerifier, message, styleClass) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
if (message) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
} else {
|
||||
GdmUtil.fadeOutActor(this._promptMessage);
|
||||
}
|
||||
},
|
||||
|
||||
_showLoginHint: function(verifier, message) {
|
||||
@ -872,6 +890,9 @@ const LoginDialog = new Lang.Class({
|
||||
if (this._user && this._user.is_logged_in())
|
||||
return null;
|
||||
|
||||
if (!this._verifyingUser)
|
||||
return null;
|
||||
|
||||
return GdmUtil.fadeInActor(this._sessionList.actor);
|
||||
},
|
||||
|
||||
@ -884,17 +905,21 @@ const LoginDialog = new Lang.Class({
|
||||
return batch.run();
|
||||
},
|
||||
|
||||
_showPrompt: function() {
|
||||
_showPrompt: function(forSecret) {
|
||||
let hold = new Batch.Hold();
|
||||
|
||||
let buttons = [{ action: Lang.bind(this, this.cancel),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.Escape },
|
||||
{ action: Lang.bind(this, function() {
|
||||
hold.release();
|
||||
}),
|
||||
label: C_("button", "Sign In"),
|
||||
default: true }];
|
||||
let cancelButtonInfo = { action: Lang.bind(this, this.cancel),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.Escape };
|
||||
let okButtonInfo = { action: Lang.bind(this, function() {
|
||||
hold.release();
|
||||
}),
|
||||
label: forSecret ? C_("button", "Sign In") : _("Next"),
|
||||
default: true };
|
||||
let buttons = [];
|
||||
if (!this._disableUserList || this._verifyingUser)
|
||||
buttons.push(cancelButtonInfo);
|
||||
buttons.push(okButtonInfo);
|
||||
|
||||
let tasks = [function() {
|
||||
return this._fadeInPrompt();
|
||||
@ -902,6 +927,16 @@ const LoginDialog = new Lang.Class({
|
||||
|
||||
function() {
|
||||
this.setButtons(buttons);
|
||||
|
||||
let updateOkButtonEnabled = Lang.bind(this, function() {
|
||||
let sensitive = this._promptEntry.text.length > 0;
|
||||
okButtonInfo.button.reactive = sensitive;
|
||||
okButtonInfo.button.can_focus = sensitive;
|
||||
});
|
||||
|
||||
updateOkButtonEnabled();
|
||||
|
||||
this._promptEntryTextChangedId = this._promptEntry.clutter_text.connect('text-changed', updateOkButtonEnabled);
|
||||
},
|
||||
|
||||
hold];
|
||||
@ -914,6 +949,11 @@ const LoginDialog = new Lang.Class({
|
||||
_hidePrompt: function() {
|
||||
this.setButtons([]);
|
||||
|
||||
if (this._promptEntryTextChangedId > 0) {
|
||||
this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId);
|
||||
this._promptEntryTextChangedId = 0;
|
||||
}
|
||||
|
||||
let tasks = [function() {
|
||||
return GdmUtil.fadeOutActor(this._promptBox);
|
||||
},
|
||||
@ -935,7 +975,9 @@ const LoginDialog = new Lang.Class({
|
||||
this._promptEntry.set_text('');
|
||||
this._promptEntry.clutter_text.set_password_char(passwordChar);
|
||||
|
||||
let tasks = [this._showPrompt,
|
||||
let tasks = [function() {
|
||||
return this._showPrompt(!!passwordChar);
|
||||
},
|
||||
|
||||
function() {
|
||||
let _text = this._promptEntry.get_text();
|
||||
@ -947,6 +989,23 @@ const LoginDialog = new Lang.Class({
|
||||
return batch.run();
|
||||
},
|
||||
|
||||
_askForUsernameAndLogIn: function() {
|
||||
this._promptLabel.set_text(_("Username: "));
|
||||
this._promptEntry.set_text('');
|
||||
this._promptEntry.clutter_text.set_password_char('');
|
||||
|
||||
let tasks = [this._showPrompt,
|
||||
|
||||
function() {
|
||||
let userName = this._promptEntry.get_text();
|
||||
this._promptEntry.reactive = false;
|
||||
return this._beginVerificationForUser(userName);
|
||||
}];
|
||||
|
||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||
return batch.run();
|
||||
},
|
||||
|
||||
_onSessionOpened: function(client, serviceName) {
|
||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||
},
|
||||
@ -1075,7 +1134,7 @@ const LoginDialog = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_onNotListedClicked: function(user) {
|
||||
_hideUserListAndLogIn: function() {
|
||||
let tasks = [function() {
|
||||
return this._userList.hideItems();
|
||||
},
|
||||
@ -1089,26 +1148,37 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
|
||||
this._fadeOutNotListedButton,
|
||||
this._fadeOutLogo]),
|
||||
this._fadeOutNotListedButton]),
|
||||
|
||||
function() {
|
||||
let hold = new Batch.Hold();
|
||||
|
||||
this._userVerifier.begin(null, hold);
|
||||
return hold;
|
||||
return this._askForUsernameAndLogIn();
|
||||
}];
|
||||
|
||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||
batch.run();
|
||||
},
|
||||
|
||||
_fadeInLogo: function() {
|
||||
return GdmUtil.fadeInActor(this._logoBox);
|
||||
},
|
||||
_showUserList: function() {
|
||||
let tasks = [this._hidePrompt,
|
||||
|
||||
_fadeOutLogo: function() {
|
||||
return GdmUtil.fadeOutActor(this._logoBox);
|
||||
new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
|
||||
this._fadeInNotListedButton]),
|
||||
|
||||
function() {
|
||||
this._sessionList.close();
|
||||
this._promptLoginHint.hide();
|
||||
this._userList.actor.show();
|
||||
this._userList.actor.opacity = 255;
|
||||
return this._userList.showItems();
|
||||
},
|
||||
|
||||
function() {
|
||||
this._userList.actor.reactive = true;
|
||||
this._userList.actor.grab_key_focus();
|
||||
}];
|
||||
|
||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||
batch.run();
|
||||
},
|
||||
|
||||
_fadeInBanner: function() {
|
||||
@ -1139,6 +1209,7 @@ const LoginDialog = new Lang.Class({
|
||||
let hold = new Batch.Hold();
|
||||
|
||||
this._userVerifier.begin(userName, hold);
|
||||
this._verifyingUser = true;
|
||||
return hold;
|
||||
},
|
||||
|
||||
@ -1159,8 +1230,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
|
||||
this._fadeOutNotListedButton,
|
||||
this._fadeOutLogo]),
|
||||
this._fadeOutNotListedButton]),
|
||||
|
||||
function() {
|
||||
return this._userList.shrinkToNaturalHeight();
|
||||
@ -1192,6 +1262,8 @@ const LoginDialog = new Lang.Class({
|
||||
this._userList.addUser(users[i]);
|
||||
}
|
||||
|
||||
this._updateDisableUserList();
|
||||
|
||||
this._userManager.connect('user-added',
|
||||
Lang.bind(this, function(userManager, user) {
|
||||
this._userList.addUser(user);
|
||||
|
@ -23,6 +23,7 @@ const BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
|
||||
const ALLOWED_FAILURES_KEY = 'allowed-failures';
|
||||
|
||||
const LOGO_KEY = 'logo';
|
||||
const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||
|
||||
function fadeInActor(actor) {
|
||||
if (actor.opacity == 255 && actor.visible)
|
||||
@ -125,6 +126,9 @@ const ShellUserVerifier = new Lang.Class({
|
||||
},
|
||||
|
||||
answerQuery: function(serviceName, answer) {
|
||||
// Clear any previous message
|
||||
this.emit('show-message', null, null);
|
||||
|
||||
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
|
||||
},
|
||||
|
||||
@ -330,12 +334,11 @@ const ShellUserVerifier = new Lang.Class({
|
||||
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
|
||||
// go back to the welcome screen.
|
||||
|
||||
this._failCounter++;
|
||||
let canRetry = retry && this._userName &&
|
||||
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
|
||||
|
||||
if (canRetry) {
|
||||
this._failCounter++;
|
||||
|
||||
this.clear();
|
||||
this.begin(this._userName, new Batch.Hold());
|
||||
} else {
|
||||
|
@ -17,6 +17,9 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
|
||||
<method name='Suspend'>
|
||||
<arg type='b' direction='in'/>
|
||||
</method>
|
||||
<method name='Hibernate'>
|
||||
<arg type='b' direction='in'/>
|
||||
</method>
|
||||
<method name='CanPowerOff'>
|
||||
<arg type='s' direction='out'/>
|
||||
</method>
|
||||
@ -26,6 +29,9 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
|
||||
<method name='CanSuspend'>
|
||||
<arg type='s' direction='out'/>
|
||||
</method>
|
||||
<method name='CanHibernate'>
|
||||
<arg type='s' direction='out'/>
|
||||
</method>
|
||||
</interface>;
|
||||
|
||||
const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'>
|
||||
@ -140,6 +146,15 @@ const LoginManagerSystemd = new Lang.Class({
|
||||
});
|
||||
},
|
||||
|
||||
canHibernate: function(asyncCallback) {
|
||||
this._proxy.CanSuspendRemote(function(result, error) {
|
||||
if (error)
|
||||
asyncCallback(false);
|
||||
else
|
||||
asyncCallback(result[0] != 'no');
|
||||
});
|
||||
},
|
||||
|
||||
powerOff: function() {
|
||||
this._proxy.PowerOffRemote(true);
|
||||
},
|
||||
@ -150,6 +165,10 @@ const LoginManagerSystemd = new Lang.Class({
|
||||
|
||||
suspend: function() {
|
||||
this._proxy.SuspendRemote(true);
|
||||
},
|
||||
|
||||
hibernate: function() {
|
||||
this._proxy.HibernateRemote(true);
|
||||
}
|
||||
});
|
||||
|
||||
@ -215,6 +234,13 @@ const LoginManagerConsoleKit = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
canHibernate: function(asyncCallback) {
|
||||
Mainloop.idle_add(Lang.bind(this, function() {
|
||||
asyncCallback(this._upClient.get_can_hibernate());
|
||||
return false;
|
||||
}));
|
||||
},
|
||||
|
||||
powerOff: function() {
|
||||
this._proxy.StopRemote();
|
||||
},
|
||||
@ -225,5 +251,9 @@ const LoginManagerConsoleKit = new Lang.Class({
|
||||
|
||||
suspend: function() {
|
||||
this._upClient.suspend_sync(null);
|
||||
},
|
||||
|
||||
hibernate: function() {
|
||||
this._upClient.hibernate_sync(null);
|
||||
}
|
||||
});
|
||||
|
@ -46,8 +46,70 @@ let _providersTable;
|
||||
function _getProvidersTable() {
|
||||
if (_providersTable)
|
||||
return _providersTable;
|
||||
let [providers, countryCodes] = Shell.mobile_providers_parse();
|
||||
return _providersTable = providers;
|
||||
return _providersTable = Shell.mobile_providers_parse(null,null);
|
||||
}
|
||||
|
||||
function findProviderForMCCMNC(table, needle) {
|
||||
let needlemcc = needle.substring(0, 3);
|
||||
let needlemnc = needle.substring(3, needle.length);
|
||||
|
||||
let name2, name3;
|
||||
for (let iter in table) {
|
||||
let country = table[iter];
|
||||
let providers = country.get_providers();
|
||||
|
||||
// Search through each country's providers
|
||||
for (let i = 0; i < providers.length; i++) {
|
||||
let provider = providers[i];
|
||||
|
||||
// Search through MCC/MNC list
|
||||
let list = provider.get_gsm_mcc_mnc();
|
||||
for (let j = 0; j < list.length; j++) {
|
||||
let mccmnc = list[j];
|
||||
|
||||
// Match both 2-digit and 3-digit MNC; prefer a
|
||||
// 3-digit match if found, otherwise a 2-digit one.
|
||||
if (mccmnc.mcc != needlemcc)
|
||||
continue; // MCC was wrong
|
||||
|
||||
if (!name3 && needle.length == 6 && needlemnc == mccmnc.mnc)
|
||||
name3 = provider.name;
|
||||
|
||||
if (!name2 && needlemnc.substring(0, 2) == mccmnc.mnc.substring(0, 2))
|
||||
name2 = provider.name;
|
||||
|
||||
if (name2 && name3)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return name3 || name2 || null;
|
||||
}
|
||||
|
||||
function findProviderForSid(table, sid) {
|
||||
if (sid == 0)
|
||||
return null;
|
||||
|
||||
// Search through each country
|
||||
for (let iter in table) {
|
||||
let country = table[iter];
|
||||
let providers = country.get_providers();
|
||||
|
||||
// Search through each country's providers
|
||||
for (let i = 0; i < providers.length; i++) {
|
||||
let provider = providers[i];
|
||||
let cdma_sid = provider.get_cdma_sid();
|
||||
|
||||
// Search through CDMA SID list
|
||||
for (let j = 0; j < cdma_sid.length; j++) {
|
||||
if (cdma_sid[j] == sid)
|
||||
return provider.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
const ModemGsm = new Lang.Class({
|
||||
@ -91,64 +153,29 @@ const ModemGsm = new Lang.Class({
|
||||
},
|
||||
|
||||
_findOperatorName: function(name, opCode) {
|
||||
if (name.length != 0 && (name.length > 6 || name.length < 5)) {
|
||||
// this looks like a valid name, i.e. not an MCCMNC (that some
|
||||
// devices return when not yet connected
|
||||
return name;
|
||||
}
|
||||
if (isNaN(parseInt(name))) {
|
||||
// name is definitely not a MCCMNC, so it may be a name
|
||||
// after all; return that
|
||||
return name;
|
||||
if (name) {
|
||||
if (name && name.length != 0 && (name.length > 6 || name.length < 5)) {
|
||||
// this looks like a valid name, i.e. not an MCCMNC (that some
|
||||
// devices return when not yet connected
|
||||
return name;
|
||||
}
|
||||
if (isNaN(parseInt(name))) {
|
||||
// name is definitely not a MCCMNC, so it may be a name
|
||||
// after all; return that
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
let needle;
|
||||
if (name.length == 0 && opCode)
|
||||
if ((name == null || name.length == 0) && opCode)
|
||||
needle = opCode;
|
||||
else if (name.length == 6 || name.length == 5)
|
||||
needle = name;
|
||||
else // nothing to search
|
||||
return null;
|
||||
|
||||
return this._findProviderForMCCMNC(needle);
|
||||
},
|
||||
|
||||
_findProviderForMCCMNC: function(needle) {
|
||||
let table = _getProvidersTable();
|
||||
let needlemcc = needle.substring(0, 3);
|
||||
let needlemnc = needle.substring(3, needle.length);
|
||||
|
||||
let name2, name3;
|
||||
for (let iter in table) {
|
||||
let providers = table[iter];
|
||||
|
||||
// Search through each country's providers
|
||||
for (let i = 0; i < providers.length; i++) {
|
||||
let provider = providers[i];
|
||||
|
||||
// Search through MCC/MNC list
|
||||
let list = provider.get_gsm_mcc_mnc();
|
||||
for (let j = 0; j < list.length; j++) {
|
||||
let mccmnc = list[j];
|
||||
|
||||
// Match both 2-digit and 3-digit MNC; prefer a
|
||||
// 3-digit match if found, otherwise a 2-digit one.
|
||||
if (mccmnc.mcc != needlemcc)
|
||||
continue; // MCC was wrong
|
||||
|
||||
if (!name3 && needle.length == 6 && needlemnc == mccmnc.mnc)
|
||||
name3 = provider.name;
|
||||
|
||||
if (!name2 && needlemnc.substring(0, 2) == mccmnc.mnc.substring(0, 2))
|
||||
name2 = provider.name;
|
||||
|
||||
if (name2 && name3)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return name3 || name2 || null;
|
||||
return findProviderForMCCMNC(table, needle);
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(ModemGsm.prototype);
|
||||
@ -189,39 +216,14 @@ const ModemCdma = new Lang.Class({
|
||||
this.operator_name = null;
|
||||
} else {
|
||||
let [bandClass, band, id] = result;
|
||||
if (name.length > 0)
|
||||
this.operator_name = this._findProviderForSid(id);
|
||||
else
|
||||
if (name.length > 0) {
|
||||
let table = _getProvidersTable();
|
||||
this.operator_name = findProviderForSid(table, id);
|
||||
} else
|
||||
this.operator_name = null;
|
||||
}
|
||||
this.emit('notify::operator-name');
|
||||
}));
|
||||
},
|
||||
|
||||
_findProviderForSid: function(sid) {
|
||||
if (sid == 0)
|
||||
return null;
|
||||
|
||||
let table = _getProvidersTable();
|
||||
|
||||
// Search through each country
|
||||
for (let iter in table) {
|
||||
let providers = table[iter];
|
||||
|
||||
// Search through each country's providers
|
||||
for (let i = 0; i < providers.length; i++) {
|
||||
let provider = providers[i];
|
||||
let cdma_sid = provider.get_cdma_sid();
|
||||
|
||||
// Search through CDMA SID list
|
||||
for (let j = 0; j < cdma_sid.length; j++) {
|
||||
if (cdma_sid[j] == sid)
|
||||
return provider.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(ModemCdma.prototype);
|
||||
|
@ -288,3 +288,31 @@ function insertSorted(array, val, cmp) {
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
/**
|
||||
* wrapKeybinding:
|
||||
*
|
||||
* Wrap a keybinding handler so that
|
||||
* it ignores an invocation if the shell is modal, but
|
||||
* not when the overview is active, or when global
|
||||
* keybindings are allowed by session mode.
|
||||
* This function is only useful for keybindings installed
|
||||
* with Meta.KeybindingFlags.HANDLE_WHEN_GRABBED
|
||||
*/
|
||||
function wrapKeybinding(handler, onlyInOverview) {
|
||||
return function() {
|
||||
let handle;
|
||||
|
||||
if (onlyInOverview) {
|
||||
handle = Main.sessionMode.allowKeybindingsWhenModal ||
|
||||
Main.modalCount == (Main.overview.visible ? 1 : 0);
|
||||
} else {
|
||||
handle = true;
|
||||
}
|
||||
|
||||
if (handle)
|
||||
return handler.apply(this, arguments);
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -199,7 +199,7 @@ const AltTabPopup = new Lang.Class({
|
||||
this.actor.get_allocation_box();
|
||||
|
||||
// Make the initial selection
|
||||
if (binding == 'switch-group') {
|
||||
if (binding == 'internal-keybinding-switch-group') {
|
||||
if (backward) {
|
||||
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
||||
} else {
|
||||
@ -208,9 +208,9 @@ const AltTabPopup = new Lang.Class({
|
||||
else
|
||||
this._select(0, 0);
|
||||
}
|
||||
} else if (binding == 'switch-group-backward') {
|
||||
} else if (binding == 'internal-keybinding-switch-group-backward') {
|
||||
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
||||
} else if (binding == 'switch-windows-backward') {
|
||||
} else if (binding == 'internal-keybinding-switch-windows-backward') {
|
||||
this._select(this._appIcons.length - 1);
|
||||
} else if (this._appIcons.length == 1) {
|
||||
this._select(0);
|
||||
|
@ -479,7 +479,6 @@ const AppWellIcon = new Lang.Class({
|
||||
Lang.bind(this,
|
||||
this._onStateChanged));
|
||||
this._onStateChanged();
|
||||
this.isMenuUp = false;
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
@ -561,7 +560,8 @@ const AppWellIcon = new Lang.Class({
|
||||
this._menuManager.addMenu(this._menu);
|
||||
}
|
||||
|
||||
this.isMenuUp = true;
|
||||
this.emit('menu-state-changed', true);
|
||||
|
||||
this.actor.set_hover(true);
|
||||
this._menu.popup();
|
||||
|
||||
@ -578,7 +578,7 @@ const AppWellIcon = new Lang.Class({
|
||||
|
||||
_onMenuPoppedDown: function() {
|
||||
this.actor.sync_hover();
|
||||
this.isMenuUp = false;
|
||||
this.emit('menu-state-changed', false);
|
||||
},
|
||||
|
||||
_onActivate: function (event) {
|
||||
|
@ -84,9 +84,12 @@ const AppFavorites = new Lang.Class({
|
||||
|
||||
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
||||
|
||||
Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
|
||||
this._removeFavorite(appId);
|
||||
}));
|
||||
Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()),
|
||||
{ forFeedback: true,
|
||||
undoCallback: Lang.bind(this, function () {
|
||||
this._removeFavorite(appId);
|
||||
})
|
||||
});
|
||||
},
|
||||
|
||||
addFavorite: function(appId) {
|
||||
@ -116,9 +119,11 @@ const AppFavorites = new Lang.Class({
|
||||
return;
|
||||
|
||||
Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
||||
Lang.bind(this, function () {
|
||||
this._addFavorite(appId, pos);
|
||||
}));
|
||||
{ forFeedback: true,
|
||||
undoCallback: Lang.bind(this, function () {
|
||||
this._addFavorite(appId, pos);
|
||||
})
|
||||
});
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(AppFavorites.prototype);
|
||||
|
@ -141,6 +141,7 @@ const BoxPointer = new Lang.Class({
|
||||
|
||||
this._muteInput();
|
||||
|
||||
Tweener.removeTweens(this);
|
||||
Tweener.addTween(this, { opacity: fade ? 0 : 255,
|
||||
xOffset: xOffset,
|
||||
yOffset: yOffset,
|
||||
|
@ -270,8 +270,9 @@ const DBusEventSource = new Lang.Class({
|
||||
this._loadEvents(false);
|
||||
},
|
||||
|
||||
_onEventsReceived: function([appointments]) {
|
||||
_onEventsReceived: function(results, error) {
|
||||
let newEvents = [];
|
||||
let appointments = results ? results[0] : null;
|
||||
if (appointments != null) {
|
||||
for (let n = 0; n < appointments.length; n++) {
|
||||
let a = appointments[n];
|
||||
|
647
js/ui/components/mediaKeysManager.js
Normal file
647
js/ui/components/mediaKeysManager.js
Normal file
@ -0,0 +1,647 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gdk = imports.gi.Gdk;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const INTERFACE_SETTINGS = 'org.gnome.desktop.interface';
|
||||
const POWER_SETTINGS = 'org.gnome.settings-daemon.plugins.power';
|
||||
const XSETTINGS_SETTINGS = 'org.gnome.settings-daemon.plugins.xsettings';
|
||||
const TOUCHPAD_SETTINGS = 'org.gnome.settings-daemon.peripherals.touchpad';
|
||||
const KEYBINDING_SETTINGS = 'org.gnome.settings-daemon.plugins.media-keys';
|
||||
const CUSTOM_KEYBINDING_SETTINGS = 'org.gnome.settings-daemon.plugins.media-keys.custom-keybinding';
|
||||
const A11Y_SETTINGS = 'org.gnome.desktop.a11y.applications';
|
||||
const MAGNIFIER_SETTINGS = 'org.gnome.desktop.a11y.magnifier';
|
||||
const INPUT_SOURCE_SETTINGS = 'org.gnome.desktop.input-sources';
|
||||
|
||||
const MediaKeysInterface = <interface name='org.gnome.SettingsDaemon.MediaKeys'>
|
||||
<method name='GrabMediaPlayerKeys'>
|
||||
<arg name='application' direction='in' type='s'/>
|
||||
<arg name='time' direction='in' type='u'/>
|
||||
</method>
|
||||
<method name='ReleaseMediaPlayerKeys'>
|
||||
<arg name='application' direction='in' type='s'/>
|
||||
</method>
|
||||
<signal name='MediaPlayerKeyPressed'>
|
||||
<arg name='application' type='s'/>
|
||||
<arg name='key' type='s'/>
|
||||
</signal>
|
||||
</interface>;
|
||||
|
||||
/* [ actionName, setting, hardcodedKeysym, overviewOnly, args ] */
|
||||
/* (overviewOnly means that the keybinding is handled when the shell is not
|
||||
modal, or when the overview is active, but not when other modal operations
|
||||
are active; otherwise the keybinding is always handled) */
|
||||
const DEFAULT_KEYBINDINGS = [
|
||||
[ 'doTouchpadToggle', null, 'XF86TouchpadToggle', false ],
|
||||
[ 'doTouchpadSet', null, 'XF86TouchpadOn', false, [ true ] ],
|
||||
[ 'doTouchpadSet', null, 'XF86TouchpadOff', false, [ false ] ],
|
||||
[ 'doMute', 'volume-mute', null, false, [ false ] ],
|
||||
[ 'doVolumeAdjust', 'volume-down', null, false, [ Clutter.ScrollDirection.DOWN, false ] ],
|
||||
[ 'doVolumeAdjust', 'volume-up', null, false, [ Clutter.ScrollDirection.UP, false ] ],
|
||||
[ 'doMute', null, '<Alt>XF86AudioMute', false, [ true ] ],
|
||||
[ 'doVolumeAdjust', null, '<Alt>XF86AudioLowerVolume', false, [ Clutter.ScrollDirection.DOWN, true ] ],
|
||||
[ 'doVolumeAdjust', null, '<Alt>XF86AudioRaiseVolume', false, [ Clutter.ScrollDirection.UP, true ] ],
|
||||
[ 'doLogout', 'logout', null, true ],
|
||||
[ 'doEject', 'eject', null, false ],
|
||||
[ 'doHome', 'home', null, true ],
|
||||
[ 'doLaunchMimeHandler', 'media', null, true, [ 'application/x-vorbis+ogg' ] ],
|
||||
[ 'doLaunchApp', 'calculator', null, true, [ 'gcalcltool.desktop' ] ],
|
||||
[ 'doLaunchApp', 'search', null, true, [ 'tracker-needle.desktop' ] ],
|
||||
[ 'doLaunchMimeHandler', 'email', null, true, [ 'x-scheme-handler/mailto' ] ],
|
||||
[ 'doScreensaver', 'screensaver', null, true ],
|
||||
[ 'doScreensaver', null, 'XF86ScreenSaver', true ],
|
||||
[ 'doLaunchApp', 'help', null, true, [ 'yelp.desktop' ] ],
|
||||
[ 'doSpawn', 'screenshot', null, true, [ ['gnome-screenshot'] ] ],
|
||||
[ 'doSpawn', 'window-screenshot', null, true, [ ['gnome-screenshot', '--window'] ] ],
|
||||
[ 'doSpawn', 'area-screenshot', null, true, [ ['gnome-screenshot', '--area'] ] ],
|
||||
[ 'doSpawn', 'screenshot-clip', null, true, [ ['gnome-screenshot', '--clipboard'] ] ],
|
||||
[ 'doSpawn', 'window-screenshot-clip', null, true, [ ['gnome-screenshot', '--window', '--clipboard'] ] ],
|
||||
[ 'doSpawn', 'area-screenshot-clip', null, true, [ ['gnome-screenshot', '--area', '--clipboard'] ] ],
|
||||
[ 'doLaunchMimeHandler', 'www', null, true, [ 'x-scheme-handler/http' ] ],
|
||||
[ 'doMediaKey', 'play', null, true, [ 'Play' ] ],
|
||||
[ 'doMediaKey', 'pause', null, true, [ 'Pause' ] ],
|
||||
[ 'doMediaKey', 'stop', null, true, [ 'Stop' ] ],
|
||||
[ 'doMediaKey', 'previous', null, true, [ 'Previous' ] ],
|
||||
[ 'doMediaKey', 'next', null, true, [ 'Next' ] ],
|
||||
[ 'doMediaKey', null, 'XF86AudioRewind', true, [ 'Rewind' ] ],
|
||||
[ 'doMediaKey', null, 'XF86AudioForward', true, [ 'FastForward' ] ],
|
||||
[ 'doMediaKey', null, 'XF86AudioRepeat', true, [ 'Repeat' ] ],
|
||||
[ 'doMediaKey', null, 'XF86AudioRandomPlay', true, [ 'Shuffle' ] ],
|
||||
[ 'doXRandRAction', null, '<Super>p', false, [ 'VideoModeSwitch' ] ],
|
||||
/* Key code of the XF86Display key (Fn-F7 on Thinkpads, Fn-F4 on HP machines, etc.) */
|
||||
[ 'doXRandRAction', null, 'XF86Display', false, [ 'VideoModeSwitch' ] ],
|
||||
/* Key code of the XF86RotateWindows key (present on some tablets) */
|
||||
[ 'doXRandRAction', null, 'XF86RotateWindows', false, [ 'Rotate' ] ],
|
||||
[ 'doA11yAction', 'magnifier', null, true, [ 'screen-magnifier-enabled' ] ],
|
||||
[ 'doA11yAction', 'screenreader', null, true, [ 'screen-reader-enabled' ] ],
|
||||
[ 'doA11yAction', 'on-screen-keyboard', null, true, [ 'screen-keyboard-enabled' ] ],
|
||||
[ 'doTextSize', 'increase-text-size', null, true, [ 1 ] ],
|
||||
[ 'doTextSize', 'decrease-text-size', null, true, [ -1 ] ],
|
||||
[ 'doToggleContrast', 'toggle-contrast', null, true ],
|
||||
[ 'doMagnifierZoom', 'magnifier-zoom-in', null, true, [ 1 ] ],
|
||||
[ 'doMagnifierZoom', 'magnifier-zoom-out', null, true, [ -1 ] ],
|
||||
[ 'doPowerAction', null, 'XF86PowerOff', true, [ 'button-power' ] ],
|
||||
/* the kernel / Xorg names really are like this... */
|
||||
[ 'doPowerAction', null, 'XF86Suspend', false, [ 'button-sleep' ] ],
|
||||
[ 'doPowerAction', null, 'XF86Sleep', false, [ 'button-suspend' ] ],
|
||||
[ 'doPowerAction', null, 'XF86Hibernate', false, [ 'button-hibernate' ] ],
|
||||
[ 'doBrightness', null, 'XF86MonBrightnessUp', false, [ 'Screen', 'StepUp' ] ],
|
||||
[ 'doBrightness', null, 'XF86MonBrightnessDown', false, [ 'Screen', 'StepDown' ] ],
|
||||
[ 'doBrightness', null, 'XF86KbdBrightnessUp', false, [ 'Keyboard', 'StepUp' ] ],
|
||||
[ 'doBrightness', null, 'XF86KbdBrightnessDown', false, [ 'Keyboard', 'StepDown' ] ],
|
||||
[ 'doBrightnessToggle', null, 'XF86KbdLightOnOff', false, ],
|
||||
[ 'doInputSource', 'switch-input-source', null, false, [ +1 ] ],
|
||||
[ 'doInputSource', 'switch-input-source-backward', null, false, [ -1 ] ],
|
||||
[ 'doLaunchApp', null, 'XF86Battery', true, [ 'gnome-power-statistics.desktop' ] ]
|
||||
];
|
||||
|
||||
var osdWin;
|
||||
const OSDWindow = new Lang.Class({
|
||||
Name: 'OSDWindow',
|
||||
|
||||
FADE_TIMEOUT: 1500,
|
||||
FADE_DURATION: 100,
|
||||
|
||||
_init: function(iconName, value) {
|
||||
/* assume 130x130 on a 640x480 display and scale from there */
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
let scalew = monitor.width / 640.0;
|
||||
let scaleh = monitor.height / 480.0;
|
||||
let scale = Math.min(scalew, scaleh);
|
||||
let size = 130 * Math.max(1, scale);
|
||||
|
||||
this.actor = new St.BoxLayout({ style_class: 'osd-window',
|
||||
vertical: true,
|
||||
reactive: false,
|
||||
visible: false,
|
||||
width: size,
|
||||
height: size,
|
||||
});
|
||||
|
||||
this._icon = new St.Icon({ icon_name: iconName,
|
||||
icon_size: size / 2,
|
||||
});
|
||||
this.actor.add(this._icon, { expand: true,
|
||||
x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.MIDDLE });
|
||||
|
||||
this._value = value;
|
||||
this._progressBar = new St.DrawingArea({ style_class: 'osd-progress-bar' });
|
||||
this._progressBar.connect('repaint', Lang.bind(this, this._drawProgress));
|
||||
this.actor.add(this._progressBar, { expand: true, x_fill: true, y_fill: false });
|
||||
this._progressBar.visible = value !== undefined;
|
||||
|
||||
Main.layoutManager.addChrome(this.actor);
|
||||
|
||||
/* Position in the middle of primary monitor */
|
||||
let [width, height] = this.actor.get_size();
|
||||
this.actor.x = ((monitor.width - width) / 2) + monitor.x;
|
||||
this.actor.y = monitor.y + (monitor.height / 2) + (monitor.height / 2 - height) / 2;
|
||||
},
|
||||
|
||||
show: function() {
|
||||
this.actor.show();
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: this.FADE_DURATION / 1000,
|
||||
transition: 'easeInQuad' });
|
||||
|
||||
if (this._timeoutId)
|
||||
GLib.source_remove(this._timeoutId);
|
||||
|
||||
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, this.FADE_TIMEOUT, Lang.bind(this, this.hide));
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: this.FADE_DURATION / 1000,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
this.actor.destroy();
|
||||
this.actor = null;
|
||||
osdWin = null;
|
||||
},
|
||||
onCompleteScope: this });
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
setIcon: function(name) {
|
||||
this._icon.icon_name = name;
|
||||
},
|
||||
|
||||
setValue: function(value) {
|
||||
if (value == this._value)
|
||||
return;
|
||||
|
||||
this._value = value;
|
||||
this._progressBar.visible = value !== undefined;
|
||||
this._progressBar.queue_repaint();
|
||||
},
|
||||
|
||||
_drawProgress: function(area) {
|
||||
let cr = area.get_context();
|
||||
|
||||
let themeNode = this.actor.get_theme_node();
|
||||
let color = themeNode.get_foreground_color();
|
||||
Clutter.cairo_set_source_color(cr, color);
|
||||
|
||||
let [width, height] = area.get_surface_size();
|
||||
width = width * this._value;
|
||||
|
||||
cr.moveTo(0,0);
|
||||
cr.lineTo(width, 0);
|
||||
cr.lineTo(width, height);
|
||||
cr.lineTo(0, height);
|
||||
cr.fill();
|
||||
}
|
||||
});
|
||||
|
||||
function showOSD(icon, value) {
|
||||
if (osdWin) {
|
||||
osdWin.setIcon(icon);
|
||||
osdWin.setValue(value);
|
||||
} else {
|
||||
osdWin = new OSDWindow(icon, value);
|
||||
}
|
||||
|
||||
osdWin.show();
|
||||
}
|
||||
|
||||
const MediaKeysGrabber = new Lang.Class({
|
||||
Name: 'MediaKeysGrabber',
|
||||
|
||||
_init: function() {
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MediaKeysInterface, this);
|
||||
this._apps = [];
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SettingsDaemon/MediaKeys');
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
this._dbusImpl.unexport();
|
||||
},
|
||||
|
||||
GrabMediaPlayerKeysAsync: function(parameters, invocation) {
|
||||
let [appName, time] = parameters;
|
||||
|
||||
/* I'm not sure of this code, but it is in gnome-settings-daemon
|
||||
(letting alone that the introspection is wrong in glib...)
|
||||
*/
|
||||
if (time == Gdk.CURRENT_TIME) {
|
||||
let tv = new GLib.TimeVal;
|
||||
GLib.get_current_time(tv);
|
||||
time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
||||
}
|
||||
|
||||
let pos = -1;
|
||||
for (let i = 0; i < this._apps.length; i++) {
|
||||
if (this._apps[i].appName == appName) {
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos != -1)
|
||||
this._freeMediaPlayer(pos);
|
||||
|
||||
let app = {
|
||||
appName: appName,
|
||||
name: invocation.get_sender(),
|
||||
time: time,
|
||||
watchId: Gio.DBus.session.watch_name(invocation.get_sender(),
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
null,
|
||||
Lang.bind(this, this._onNameVanished)),
|
||||
};
|
||||
Util.insertSorted(this._apps, app, function(a, b) {
|
||||
return b.time-a.time;
|
||||
});
|
||||
|
||||
invocation.return_value(GLib.Variant.new('()', []));
|
||||
},
|
||||
|
||||
ReleaseMediaPlayerAsync: function(parameters, invocation) {
|
||||
let name = invocation.get_sender();
|
||||
let [appName] = parameters;
|
||||
|
||||
let pos = -1;
|
||||
for (let i = 0; i < this._apps.length; i++) {
|
||||
if (this._apps[i].appName == appName) {
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pos == -1) {
|
||||
for (let i = 0; i < this._apps.length; i++) {
|
||||
if (this._apps[i].name == name) {
|
||||
pos = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pos != -1)
|
||||
this._freeMediaPlayer(pos);
|
||||
|
||||
invocation.return_value(GLib.Variant.new('()', []));
|
||||
},
|
||||
|
||||
_freeMediaPlayer: function(pos) {
|
||||
let app = this._apps[pos];
|
||||
Gio.bus_unwatch_name(app.watchId)
|
||||
|
||||
this._apps.splice(pos, 1);
|
||||
},
|
||||
|
||||
mediaKeyPressed: function(key) {
|
||||
if (this._apps.length == 0) {
|
||||
showOSD('action-unavailable-symbolic');
|
||||
return;
|
||||
}
|
||||
|
||||
let app = this._apps[0];
|
||||
Gio.DBus.session.emit_signal(app.name,
|
||||
'/org/gnome/SettingsDaemon/MediaKeys',
|
||||
'org.gnome.SettingsDaemon.MediaKeys',
|
||||
'MediaPlayerKeyPressed',
|
||||
GLib.Variant.new('(ss)', [app.appName || '',
|
||||
key]));
|
||||
},
|
||||
});
|
||||
|
||||
const MediaKeysManager = new Lang.Class({
|
||||
Name: 'MediaKeysManager',
|
||||
|
||||
_init: function() {
|
||||
this._a11yControl = Main.panel.statusArea.a11y;
|
||||
this._volumeControl = Main.panel.statusArea.volume;
|
||||
this._userMenu = Main.panel.statusArea.userMenu;
|
||||
this._mediaPlayerKeys = new MediaKeysGrabber();
|
||||
|
||||
this._keybindingSettings = new Gio.Settings({ schema: KEYBINDING_SETTINGS });
|
||||
},
|
||||
|
||||
enable: function() {
|
||||
for (let i = 0; i < DEFAULT_KEYBINDINGS.length; i++) {
|
||||
let [action, setting, keyval, overviewOnly, args] = DEFAULT_KEYBINDINGS[i];
|
||||
let func = this[action];
|
||||
if (!func) {
|
||||
log('Keybinding action %s is missing'.format(action));
|
||||
continue;
|
||||
}
|
||||
|
||||
let name = setting ? setting : 'media-keys-keybindings-%d'.format(i);
|
||||
let ok;
|
||||
func = Util.wrapKeybinding(Lang.bind.apply(null, [this, func].concat(args)), overviewOnly);
|
||||
if (setting)
|
||||
ok = global.display.add_keybinding(setting, this._keybindingSettings,
|
||||
Meta.KeyBindingFlags.BUILTIN |
|
||||
Meta.KeyBindingFlags.IS_SINGLE |
|
||||
Meta.KeyBindingFlags.HANDLE_WHEN_GRABBED, func);
|
||||
else
|
||||
ok = global.display.add_grabbed_key(name, keyval,
|
||||
Meta.KeyBindingFlags.HANDLE_WHEN_GRABBED, func);
|
||||
|
||||
if (!ok)
|
||||
log('Installing keybinding %s failed'.format(name));
|
||||
}
|
||||
|
||||
this._customKeybindings = [];
|
||||
this._changedId = this._keybindingSettings.connect('changed::custom-keybindings',
|
||||
Lang.bind(this, this._reloadCustomKeybindings));
|
||||
this._reloadCustomKeybindings();
|
||||
|
||||
this._mediaPlayerKeys.enable();
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
for (let i = 0; i < DEFAULT_KEYBINDINGS.length; i++) {
|
||||
let [action, setting, keyval, overviewOnly, args] = DEFAULT_KEYBINDINGS[i];
|
||||
|
||||
let name = setting ? setting : 'media-keys-keybindings-%d'.format(i);
|
||||
if (setting)
|
||||
global.display.remove_keybinding(setting, this._keybindingSettings);
|
||||
else
|
||||
global.display.remove_grabbed_key(name);
|
||||
}
|
||||
|
||||
this._clearCustomKeybindings();
|
||||
this._keybindingSettings.disconnect(this._changedId);
|
||||
|
||||
this._mediaPlayerKeys.disable();
|
||||
},
|
||||
|
||||
_clearCustomKeybindings: function() {
|
||||
for (let i = 0; i < this._customKeybindings.length; i++)
|
||||
global.display.remove_keybinding('binding', this._customKeybindings[i]);
|
||||
|
||||
this._customKeybindings = [];
|
||||
},
|
||||
|
||||
_reloadCustomKeybindings: function() {
|
||||
this._clearCustomKeybindings();
|
||||
|
||||
let paths = this._keybindingSettings.get_strv('custom-keybindings');
|
||||
for (let i = 0; i < paths.length; i++) {
|
||||
let setting = new Gio.Settings({ schema: CUSTOM_KEYBINDING_SETTINGS,
|
||||
path: paths[i] });
|
||||
let func = Util.wrapKeybinding(Lang.bind(this, this.doCustom, setting), true);
|
||||
|
||||
global.display.add_keybinding('binding', setting,
|
||||
Meta.KeyBindingFlags.IS_SINGLE |
|
||||
Meta.KeyBindingFlags.HANDLE_WHEN_GRABBED, func);
|
||||
this._customKeybindings.push(setting);
|
||||
}
|
||||
},
|
||||
|
||||
doCustom: function(display, screen, window, binding, settings) {
|
||||
let command = settings.get_string('command');
|
||||
Util.spawnCommandLine(command);
|
||||
},
|
||||
|
||||
doTouchpadToggle: function(display, screen, window, binding) {
|
||||
let settings = new Gio.Settings({ schema: TOUCHPAD_SETTINGS });
|
||||
let enabled = settings.get_boolean('touchpad-enabled');
|
||||
|
||||
this.doTouchpadSet(display, screen, window, binding, !enabled);
|
||||
settings.set_boolean(!enabled);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
doTouchpadSet: function(display, screen, window, binding, enabled) {
|
||||
showOSD(enabled ? 'input-touchpad-symbolic' : 'touchpad-disabled-symbolic');
|
||||
return true;
|
||||
},
|
||||
|
||||
doMute: function(display, screen, window, binding, quiet) {
|
||||
let [icon, value] = this._volumeControl.volumeMenu.toggleMute(quiet);
|
||||
showOSD(icon, value);
|
||||
return true;
|
||||
},
|
||||
|
||||
doVolumeAdjust: function(display, screen, window, binding, direction, quiet) {
|
||||
let [icon, value] = this._volumeControl.volumeMenu.scroll(direction, quiet);
|
||||
showOSD(icon, value);
|
||||
return true;
|
||||
},
|
||||
|
||||
doLogout: function(display, screen, window, binding) {
|
||||
this._userMenu.logOut();
|
||||
return true;
|
||||
},
|
||||
|
||||
doEject: function(display, screen, window, binding) {
|
||||
let volumeMonitor = Gio.VolumeMonitor.get();
|
||||
|
||||
let drives = volumeMonitor.get_connected_drives();
|
||||
let score = 0, drive;
|
||||
for (let i = 0; i < drives.length; i++) {
|
||||
if (!drives[i].can_eject())
|
||||
continue;
|
||||
if (!drives[i].is_media_removable())
|
||||
continue;
|
||||
if (score < 1) {
|
||||
drive = drives[i];
|
||||
score = 1;
|
||||
}
|
||||
if (!drives[i].has_media())
|
||||
continue;
|
||||
if (score < 2) {
|
||||
drive = drives[i];
|
||||
score = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
showOSD('media-eject-custom-symbolic');
|
||||
|
||||
if (!drive)
|
||||
return true;
|
||||
|
||||
let mountOp = new ShellMountOperation.ShellMountOperation(drive);
|
||||
drive.eject_with_operation(Gio.MountUnmountFlags.FORCE,
|
||||
mountOp.mountOp, null, null);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
doHome: function() {
|
||||
let homeFile = Gio.file_new_for_path (GLib.get_home_dir());
|
||||
let homeUri = homeFile.get_uri();
|
||||
Gio.app_info_launch_default_for_uri(homeUri, null);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
doLaunchMimeHandler: function(display, screen, window, binding, mimeType) {
|
||||
let gioApp = Gio.AppInfo.get_default_for_type(mimeType, false);
|
||||
if (gioApp != null) {
|
||||
let app = Shell.AppSystem.get_default().lookup_app(gioApp.get_id());
|
||||
app.open_new_window(-1);
|
||||
} else {
|
||||
log('Could not find default application for \'%s\' mime-type'.format(mimeType));
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
doLaunchApp: function(display, screen, window, binding, appId) {
|
||||
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
||||
app.open_new_window(-1);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
doScreensaver: function() {
|
||||
// FIXME: handled in house, to the screenshield!
|
||||
return true;
|
||||
},
|
||||
|
||||
doSpawn: function(display, screen, window, binding, argv) {
|
||||
Util.spawn(argv);
|
||||
return true;
|
||||
},
|
||||
|
||||
doMediaKey: function(display, screen, window, binding, key) {
|
||||
this._mediaPlayerKeys.mediaKeyPressed(key);
|
||||
},
|
||||
|
||||
_onXRandRFinished: function(connection, result) {
|
||||
connection.call_finish(result);
|
||||
this._XRandRCancellable = null;
|
||||
},
|
||||
|
||||
doXRandRAction: function(display, screen, window, binding, action) {
|
||||
if (this._XRandRCancellable)
|
||||
this._XRandRCancellable.cancel();
|
||||
|
||||
this._XRandRCancellable = new Gio.Cancellable();
|
||||
Gio.DBus.session.call('org.gnome.SettingsDaemon',
|
||||
'/org/gnome/SettingsDaemon/XRANDR',
|
||||
'org.gnome.SettingsDaemon.XRANDR_2',
|
||||
action,
|
||||
GLib.Variant.new('(x)', [global.get_current_time()]),
|
||||
null, /* reply type */
|
||||
Gio.DBusCallFlags.NONE,
|
||||
-1,
|
||||
this._XRandRCancellable,
|
||||
Lang.bind(this, this._onXRandRFinished));
|
||||
},
|
||||
|
||||
doA11yAction: function(display, screen, window, binding, key) {
|
||||
let settings = new Gio.Settings({ schema: A11Y_SETTINGS });
|
||||
let enabled = settings.get_boolean(key);
|
||||
settings.set_boolean(key, !enabled);
|
||||
},
|
||||
|
||||
doTextSize: function(display, screen, window, binding, multiplier) {
|
||||
// Same values used in the Seeing tab of the Universal Access panel
|
||||
const FACTORS = [ 0.75, 1.0, 1.25, 1.5 ];
|
||||
|
||||
// Figure out the current DPI scaling factor
|
||||
let settings = new Gio.Settings({ schema: INTERFACE_SETTINGS });
|
||||
let factor = settings.get_double('text-scaling-factor');
|
||||
factor += multiplier * 0.25;
|
||||
|
||||
/* Try to find a matching value */
|
||||
let distance = 1e6;
|
||||
let best = 1.0;
|
||||
for (let i = 0; i < FACTORS.length; i++) {
|
||||
let d = Math.abs(factor - FACTORS[i]);
|
||||
if (d < distance) {
|
||||
best = factors[i];
|
||||
distance = d;
|
||||
}
|
||||
}
|
||||
|
||||
if (best == 1.0)
|
||||
settings.reset('text-scaling-factor');
|
||||
else
|
||||
settings.set_double('text-scaling-factor', best);
|
||||
},
|
||||
|
||||
doToggleContrast: function(display, screen, window, binding) {
|
||||
this._a11yControl.toggleHighContrast();
|
||||
},
|
||||
|
||||
doMagnifierZoom: function(display, screen, window, binding, offset) {
|
||||
let settings = new Gio.Settings({ schema: MAGNIFIER_SETTINGS });
|
||||
|
||||
let value = settings.get_value('mag-factor');
|
||||
value = Math.round(value + offset);
|
||||
settings.set_value('mag-factor', value);
|
||||
},
|
||||
|
||||
doPowerAction: function(display, screen, window, binding, action) {
|
||||
let settings = new Gio.Settings({ schema: POWER_SETTINGS });
|
||||
switch (settings.get_string(action)) {
|
||||
case 'suspend':
|
||||
this._userMenu.suspend();
|
||||
break;
|
||||
case 'interactive':
|
||||
case 'shutdown':
|
||||
this._userMenu.shutdown();
|
||||
break;
|
||||
case 'hibernate':
|
||||
this._userMenu.hibernate();
|
||||
break;
|
||||
case 'blank':
|
||||
case 'default':
|
||||
default:
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
_onBrightnessFinished: function(connection, result, kind) {
|
||||
let [percentage] = connection.call_finish(result).deep_unpack();
|
||||
|
||||
let icon = kind == 'Keyboard' ? 'keyboard-brightness-symbolic' : 'display-brightness-symbolic';
|
||||
showOSD(icon, percentage / 100);
|
||||
},
|
||||
|
||||
doBrightness: function(display, screen, window, binding, kind, action) {
|
||||
let iface = 'org.gnome.SettingsDaemon.Power.' + kind;
|
||||
let objectPath = '/org/gnome/SettingsDaemon/Power';
|
||||
|
||||
Gio.DBus.session.call('org.gnome.SettingsDaemon',
|
||||
objectPath, iface, action,
|
||||
null, null, /* parameters, reply type */
|
||||
Gio.DBusCallFlags.NONE, -1, null,
|
||||
Lang.bind(this, this._onBrightnessFinished, kind));
|
||||
},
|
||||
|
||||
doInputSource: function(display, screen, window, binding, offset) {
|
||||
let settings = new Gio.Settings({ schema: INPUT_SOURCE_SETTINGS });
|
||||
|
||||
let current = settings.get_uint('current');
|
||||
let max = settings.get_strv('sources').length - 1;
|
||||
|
||||
current += offset;
|
||||
if (current < 0)
|
||||
current = 0;
|
||||
else if (current > max)
|
||||
current = max;
|
||||
|
||||
settings.set_uint('current', current);
|
||||
},
|
||||
});
|
||||
|
||||
const Component = MediaKeysManager;
|
@ -408,7 +408,10 @@ const VPNRequestHandler = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
cancel: function(respond) {
|
||||
if (respond)
|
||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
|
||||
|
||||
if (this._newStylePlugin && this._shellDialog) {
|
||||
this._shellDialog.close(global.get_current_time());
|
||||
this._shellDialog.destroy();
|
||||
@ -599,6 +602,16 @@ const NetworkAgent = new Lang.Class({
|
||||
},
|
||||
|
||||
disable: function() {
|
||||
let requestId;
|
||||
|
||||
for (requestId in this._dialogs)
|
||||
this._dialogs[requestId].cancel();
|
||||
this._dialogs = { };
|
||||
|
||||
for (requestId in this._vpnRequests)
|
||||
this._vpnRequests[requestId].cancel(true);
|
||||
this._vpnRequests = { };
|
||||
|
||||
this._native.unregister();
|
||||
},
|
||||
|
||||
@ -622,7 +635,7 @@ const NetworkAgent = new Lang.Class({
|
||||
this._dialogs[requestId].destroy();
|
||||
delete this._dialogs[requestId];
|
||||
} else if (this._vpnRequests[requestId]) {
|
||||
this._vpnRequests[requestId].cancel();
|
||||
this._vpnRequests[requestId].cancel(false);
|
||||
delete this._vpnRequests[requestId];
|
||||
}
|
||||
},
|
||||
|
@ -41,7 +41,7 @@ const Recorder = new Lang.Class({
|
||||
recorder.set_framerate(this._recorderSettings.get_int('framerate'));
|
||||
/* Translators: this is a filename used for screencast recording */
|
||||
// xgettext:no-c-format
|
||||
recorder.set_filename(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
|
||||
recorder.set_file_template(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
|
||||
let pipeline = this._recorderSettings.get_string('pipeline');
|
||||
|
||||
if (!pipeline.match(/^\s*$/))
|
||||
@ -52,6 +52,8 @@ const Recorder = new Lang.Class({
|
||||
Meta.disable_unredirect_for_screen(global.screen);
|
||||
recorder.record();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -771,16 +771,19 @@ const ChatNotification = new Lang.Class({
|
||||
this.emit('unfocused');
|
||||
}));
|
||||
|
||||
this._oldMaxScrollAdjustment = 0;
|
||||
this._createScrollArea();
|
||||
this._lastGroup = null;
|
||||
this._lastGroupActor = null;
|
||||
|
||||
// Keep track of the bottom position for the current adjustment and
|
||||
// force a scroll to the bottom if things change while we were at the
|
||||
// bottom
|
||||
this._oldMaxScrollValue = this._scrollArea.vscroll.adjustment.value;
|
||||
this._scrollArea.add_style_class_name('chat-notification-scrollview');
|
||||
this._scrollArea.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) {
|
||||
let currentValue = adjustment.value + adjustment.page_size;
|
||||
if (currentValue == this._oldMaxScrollAdjustment)
|
||||
if (adjustment.value == this._oldMaxScrollValue)
|
||||
this.scrollTo(St.Side.BOTTOM);
|
||||
this._oldMaxScrollAdjustment = adjustment.upper;
|
||||
this._oldMaxScrollValue = Math.max(adjustment.lower, adjustment.upper - adjustment.page_size);
|
||||
}));
|
||||
|
||||
this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text });
|
||||
@ -1133,7 +1136,7 @@ const AudioVideoNotification = new Lang.Class({
|
||||
this.parent(source, title, null, { customContent: true });
|
||||
this.setResident(true);
|
||||
|
||||
this.addButton('reject', _("Reject"));
|
||||
this.addButton('reject', _("Decline"));
|
||||
/* translators: this is a button label (verb), not a noun */
|
||||
this.addButton('answer', _("Answer"));
|
||||
|
||||
|
@ -23,8 +23,7 @@ const DASH_ITEM_HOVER_TIMEOUT = 300;
|
||||
|
||||
function getAppFromSource(source) {
|
||||
if (source instanceof AppDisplay.AppWellIcon) {
|
||||
let appSystem = Shell.AppSystem.get_default();
|
||||
return appSystem.lookup_app(source.getId());
|
||||
return source.app;
|
||||
} else if (source.metaWindow) {
|
||||
let tracker = Shell.WindowTracker.get_default();
|
||||
return tracker.get_window_app(source.metaWindow);
|
||||
@ -142,6 +141,7 @@ const DashItemContainer = new Lang.Class({
|
||||
|
||||
setLabelText: function(text) {
|
||||
this._labelText = text;
|
||||
this.child.accessible_name = text;
|
||||
},
|
||||
|
||||
hideLabel: function () {
|
||||
@ -259,7 +259,6 @@ const ShowAppsIcon = new Lang.Class({
|
||||
|
||||
this.setChild(this.toggleButton);
|
||||
this.setDragApp(null);
|
||||
this.toggleButton.label_actor = this.label;
|
||||
},
|
||||
|
||||
_createIcon: function(size) {
|
||||
@ -492,32 +491,51 @@ const Dash = new Lang.Class({
|
||||
},
|
||||
|
||||
_createAppItem: function(app) {
|
||||
let display = new AppDisplay.AppWellIcon(app,
|
||||
let appIcon = new AppDisplay.AppWellIcon(app,
|
||||
{ setSizeManually: true,
|
||||
showLabel: false });
|
||||
display._draggable.connect('drag-begin',
|
||||
appIcon._draggable.connect('drag-begin',
|
||||
Lang.bind(this, function() {
|
||||
display.actor.opacity = 50;
|
||||
appIcon.actor.opacity = 50;
|
||||
}));
|
||||
display._draggable.connect('drag-end',
|
||||
appIcon._draggable.connect('drag-end',
|
||||
Lang.bind(this, function() {
|
||||
display.actor.opacity = 255;
|
||||
appIcon.actor.opacity = 255;
|
||||
}));
|
||||
appIcon.connect('menu-state-changed',
|
||||
Lang.bind(this, function(appIcon, opened) {
|
||||
this._itemMenuStateChanged(item, opened);
|
||||
}));
|
||||
|
||||
let item = new DashItemContainer();
|
||||
item.setChild(display.actor);
|
||||
item.setChild(appIcon.actor);
|
||||
|
||||
// Override default AppWellIcon label_actor, now the
|
||||
// accessible_name is set at DashItemContainer.setLabelText
|
||||
appIcon.actor.label_actor = null;
|
||||
item.setLabelText(app.get_name());
|
||||
// Override default AppWellIcon label_actor
|
||||
display.actor.label_actor = item.label;
|
||||
display.icon.setIconSize(this.iconSize);
|
||||
|
||||
appIcon.icon.setIconSize(this.iconSize);
|
||||
this._hookUpLabel(item);
|
||||
|
||||
return item;
|
||||
},
|
||||
|
||||
_itemMenuStateChanged: function(item, opened) {
|
||||
// When the menu closes, it calls sync_hover, which means
|
||||
// that the notify::hover handler does everything we need to.
|
||||
if (opened) {
|
||||
if (this._showLabelTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._showLabelTimeoutId);
|
||||
this._showLabelTimeoutId = 0;
|
||||
}
|
||||
|
||||
item.hideLabel();
|
||||
}
|
||||
},
|
||||
|
||||
_onHover: function (item) {
|
||||
if (item.child.get_hover() && !item.child._delegate.isMenuUp) {
|
||||
if (item.child.get_hover()) {
|
||||
if (this._showLabelTimeoutId == 0) {
|
||||
let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT;
|
||||
this._showLabelTimeoutId = Mainloop.timeout_add(timeout,
|
||||
|
@ -105,7 +105,7 @@ const restartDialogContent = {
|
||||
endDescription: _("Restarting the system."),
|
||||
confirmButtons: [{ signal: 'ConfirmedReboot',
|
||||
label: C_("button", "Restart") }],
|
||||
iconName: 'system-shutdown-symbolic',
|
||||
iconName: 'view-refresh-symbolic',
|
||||
iconStyleClass: 'end-session-dialog-shutdown-icon'
|
||||
};
|
||||
|
||||
|
@ -20,25 +20,6 @@ const KEYBOARD_TYPE = 'keyboard-type';
|
||||
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
|
||||
const SHOW_KEYBOARD = 'screen-keyboard-enabled';
|
||||
|
||||
// Key constants taken from Antler
|
||||
// FIXME: ought to be moved into libcaribou
|
||||
const PRETTY_KEYS = {
|
||||
'BackSpace': '\u232b',
|
||||
'space': ' ',
|
||||
'Return': '\u23ce',
|
||||
'Caribou_Prefs': '\u2328',
|
||||
'Caribou_ShiftUp': '\u2b06',
|
||||
'Caribou_ShiftDown': '\u2b07',
|
||||
'Caribou_Emoticons': '\u263a',
|
||||
'Caribou_Symbols': '123',
|
||||
'Caribou_Symbols_More': '{#*',
|
||||
'Caribou_Alpha': 'Abc',
|
||||
'Tab': 'Tab',
|
||||
'Escape': 'Esc',
|
||||
'Control_L': 'Ctrl',
|
||||
'Alt_L': 'Alt'
|
||||
};
|
||||
|
||||
const CaribouKeyboardIface = <interface name='org.gnome.Caribou.Keyboard'>
|
||||
<method name='Show'>
|
||||
<arg type='u' direction='in' />
|
||||
@ -98,17 +79,7 @@ const Key = new Lang.Class({
|
||||
},
|
||||
|
||||
_makeKey: function () {
|
||||
let label = this._key.name;
|
||||
|
||||
if (label.length > 1) {
|
||||
let pretty = PRETTY_KEYS[label];
|
||||
if (pretty)
|
||||
label = pretty;
|
||||
else
|
||||
label = this._getUnichar(this._key);
|
||||
}
|
||||
|
||||
label = GLib.markup_escape_text(label, -1);
|
||||
let label = GLib.markup_escape_text(this._key.label, -1);
|
||||
let button = new St.Button ({ label: label,
|
||||
style_class: 'keyboard-key' });
|
||||
|
||||
|
@ -104,7 +104,7 @@ const LayoutManager = new Lang.Class({
|
||||
this.primaryMonitor = null;
|
||||
this.primaryIndex = -1;
|
||||
this._hotCorners = [];
|
||||
this._rootPixmap = null;
|
||||
this._background = null;
|
||||
this._leftPanelBarrier = 0;
|
||||
this._rightPanelBarrier = 0;
|
||||
this._trayBarrier = 0;
|
||||
@ -128,8 +128,6 @@ const LayoutManager = new Lang.Class({
|
||||
this.trayBox = new St.Widget({ name: 'trayBox',
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this.addChrome(this.trayBox);
|
||||
this.trayBox.connect('allocation-changed',
|
||||
Lang.bind(this, this._updateTrayBarrier));
|
||||
|
||||
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
|
||||
reactive: true,
|
||||
@ -280,22 +278,6 @@ const LayoutManager = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_updateTrayBarrier: function() {
|
||||
let monitor = this.bottomMonitor;
|
||||
|
||||
if (this._trayBarrier)
|
||||
global.destroy_pointer_barrier(this._trayBarrier);
|
||||
|
||||
if (Main.messageTray) {
|
||||
this._trayBarrier =
|
||||
global.create_pointer_barrier(monitor.x + monitor.width, monitor.y + monitor.height - Main.messageTray.actor.height,
|
||||
monitor.x + monitor.width, monitor.y + monitor.height,
|
||||
4 /* BarrierNegativeX */);
|
||||
} else {
|
||||
this._trayBarrier = 0;
|
||||
}
|
||||
},
|
||||
|
||||
_monitorsChanged: function() {
|
||||
this._updateMonitors();
|
||||
this._updateBoxes();
|
||||
@ -333,30 +315,30 @@ const LayoutManager = new Lang.Class({
|
||||
// to the greeter. Otherwise, we'll just animate the panel,
|
||||
// as usual.
|
||||
if (Main.sessionMode.isGreeter) {
|
||||
this._rootPixmap = global.create_xrootpmap_texture();
|
||||
if (this._rootPixmap != null) {
|
||||
Main.uiGroup.add_actor(this._rootPixmap);
|
||||
Tweener.addTween(this._rootPixmap,
|
||||
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
|
||||
if (this._background != null) {
|
||||
Main.uiGroup.add_actor(this._background);
|
||||
Tweener.addTween(this._background,
|
||||
{ opacity: 0,
|
||||
time: PLYMOUTH_TRANSITION_TIME,
|
||||
transition: 'linear',
|
||||
onComplete: this._fadeRootpmapComplete,
|
||||
onComplete: this._fadeBackgroundComplete,
|
||||
onCompleteScope: this });
|
||||
plymouthTransitionRunning = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!plymouthTransitionRunning)
|
||||
this._fadeRootpmapComplete();
|
||||
this._fadeBackgroundComplete();
|
||||
},
|
||||
|
||||
_fadeRootpmapComplete: function() {
|
||||
_fadeBackgroundComplete: function() {
|
||||
// Don't animate the strut
|
||||
this._chrome.freezeUpdateRegions();
|
||||
|
||||
if (this._rootPixmap != null) {
|
||||
this._rootPixmap.destroy();
|
||||
this._rootPixmap = null;
|
||||
if (this._background != null) {
|
||||
this._background.destroy();
|
||||
this._background = null;
|
||||
}
|
||||
|
||||
Tweener.addTween(this.panelBox,
|
||||
|
@ -69,7 +69,7 @@ let _overridesSettings = null;
|
||||
let background = null;
|
||||
|
||||
function _sessionUpdated() {
|
||||
Meta.keybindings_set_custom_handler('panel-run-dialog', sessionMode.hasRunDialog ? openRunDialog : null);
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-panel-run-dialog', sessionMode.hasRunDialog ? Util.wrapKeybinding(openRunDialog, true) : null);
|
||||
if (sessionMode.isGreeter)
|
||||
screenShield.showDialog();
|
||||
}
|
||||
@ -155,8 +155,14 @@ function start() {
|
||||
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||
false, -1, 1);
|
||||
Meta.keybindings_set_custom_handler('panel-main-menu', Lang.bind(overview, overview.toggle));
|
||||
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-panel-main-menu', Util.wrapKeybinding(Lang.bind(overview, function() {
|
||||
this.toggle();
|
||||
return true;
|
||||
}), true));
|
||||
global.display.connect('overlay-key', Util.wrapKeybinding(Lang.bind(overview, function() {
|
||||
this.toggle();
|
||||
return true;
|
||||
}), true));
|
||||
|
||||
sessionMode.connect('update', _sessionUpdated);
|
||||
_sessionUpdated();
|
||||
@ -167,8 +173,6 @@ function start() {
|
||||
|
||||
_startDate = new Date();
|
||||
|
||||
global.stage.connect('captured-event', _globalKeyPressHandler);
|
||||
|
||||
log('GNOME Shell started at ' + _startDate);
|
||||
|
||||
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
|
||||
@ -465,80 +469,6 @@ function getWindowActorsForWorkspace(workspaceIndex) {
|
||||
});
|
||||
}
|
||||
|
||||
// This function encapsulates hacks to make certain global keybindings
|
||||
// work even when we are in one of our modes where global keybindings
|
||||
// are disabled with a global grab. (When there is a global grab, then
|
||||
// all key events will be delivered to the stage, so ::captured-event
|
||||
// on the stage can be used for global keybindings.)
|
||||
function _globalKeyPressHandler(actor, event) {
|
||||
if (modalCount == 0)
|
||||
return false;
|
||||
if (event.type() != Clutter.EventType.KEY_PRESS)
|
||||
return false;
|
||||
|
||||
if (!sessionMode.allowKeybindingsWhenModal) {
|
||||
if (modalCount > (overview.visible ? 1 : 0))
|
||||
return false;
|
||||
}
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
let keyCode = event.get_key_code();
|
||||
let ignoredModifiers = global.display.get_ignored_modifier_mask();
|
||||
let modifierState = event.get_state() & ~ignoredModifiers;
|
||||
|
||||
// This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType
|
||||
let action = global.display.get_keybinding_action(keyCode, modifierState);
|
||||
|
||||
if (action == Meta.KeyBindingAction.SWITCH_PANELS) {
|
||||
ctrlAltTabManager.popup(modifierState & Clutter.ModifierType.SHIFT_MASK,
|
||||
modifierState);
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
// left/right would effectively act as synonyms for up/down if we enabled them;
|
||||
// but that could be considered confusing; we also disable them in the main view.
|
||||
//
|
||||
// case Meta.KeyBindingAction.WORKSPACE_LEFT:
|
||||
// if (!sessionMode.hasWorkspaces)
|
||||
// return false;
|
||||
//
|
||||
// wm.actionMoveWorkspaceLeft();
|
||||
// return true;
|
||||
// case Meta.KeyBindingAction.WORKSPACE_RIGHT:
|
||||
// if (!sessionMode.hasWorkspaces)
|
||||
// return false;
|
||||
//
|
||||
// wm.actionMoveWorkspaceRight();
|
||||
// return true;
|
||||
case Meta.KeyBindingAction.WORKSPACE_UP:
|
||||
if (!sessionMode.hasWorkspaces)
|
||||
return false;
|
||||
|
||||
wm.actionMoveWorkspace(Meta.MotionDirection.UP);
|
||||
return true;
|
||||
case Meta.KeyBindingAction.WORKSPACE_DOWN:
|
||||
if (!sessionMode.hasWorkspaces)
|
||||
return false;
|
||||
|
||||
wm.actionMoveWorkspace(Meta.MotionDirection.DOWN);
|
||||
return true;
|
||||
case Meta.KeyBindingAction.PANEL_RUN_DIALOG:
|
||||
case Meta.KeyBindingAction.COMMAND_2:
|
||||
if (!sessionMode.hasRunDialog)
|
||||
return false;
|
||||
|
||||
openRunDialog();
|
||||
return true;
|
||||
case Meta.KeyBindingAction.PANEL_MAIN_MENU:
|
||||
case Meta.KeyBindingAction.OVERLAY_KEY:
|
||||
overview.hide();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function _findModal(actor) {
|
||||
for (let i = 0; i < modalActorFocusStack.length; i++) {
|
||||
if (modalActorFocusStack[i].actor == actor)
|
||||
@ -679,6 +609,8 @@ function openRunDialog() {
|
||||
runDialog = new RunDialog.RunDialog();
|
||||
}
|
||||
runDialog.open();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -314,6 +314,7 @@ const Notification = new Lang.Class({
|
||||
this.resident = false;
|
||||
// 'transient' is a reserved keyword in JS, so we have to use an alternate variable name
|
||||
this.isTransient = false;
|
||||
this.forFeedback = false;
|
||||
this.expanded = false;
|
||||
this.focused = false;
|
||||
this.acknowledged = false;
|
||||
@ -713,6 +714,10 @@ const Notification = new Lang.Class({
|
||||
this.isTransient = isTransient;
|
||||
},
|
||||
|
||||
setForFeedback: function(forFeedback) {
|
||||
this.forFeedback = forFeedback;
|
||||
},
|
||||
|
||||
setUseActionIcons: function(useIcons) {
|
||||
this._useActionIcons = useIcons;
|
||||
},
|
||||
@ -1237,12 +1242,6 @@ const SummaryItem = new Lang.Class({
|
||||
|
||||
this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||
|
||||
this._closeButton = makeCloseButton();
|
||||
this._closeButton.connect('clicked', Lang.bind(this, function() {
|
||||
source.destroy();
|
||||
source.emit('done-displaying-content');
|
||||
}));
|
||||
|
||||
this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview',
|
||||
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
|
||||
hscrollbar_policy: Gtk.PolicyType.NEVER });
|
||||
@ -1251,7 +1250,9 @@ const SummaryItem = new Lang.Class({
|
||||
vertical: true });
|
||||
this.notificationStackView.add_actor(this.notificationStack);
|
||||
this.notificationStackWidget.add_actor(this.notificationStackView);
|
||||
this.notificationStackWidget.add_actor(this._closeButton);
|
||||
|
||||
this.closeButton = makeCloseButton();
|
||||
this.notificationStackWidget.add_actor(this.closeButton);
|
||||
this._stackedNotifications = [];
|
||||
|
||||
this._oldMaxScrollAdjustment = 0;
|
||||
@ -1268,14 +1269,6 @@ const SummaryItem = new Lang.Class({
|
||||
global.focus_manager.add_group(this.rightClickMenu);
|
||||
},
|
||||
|
||||
get closeButtonVisible() {
|
||||
return this._closeButton.visible;
|
||||
},
|
||||
|
||||
set closeButtonVisible(v) {
|
||||
this._closeButton.visible = v;
|
||||
},
|
||||
|
||||
_onKeyPress: function(actor, event) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Up) {
|
||||
actor.emit('clicked', 1);
|
||||
@ -1401,6 +1394,8 @@ const MessageTray = new Lang.Class({
|
||||
y_expand: true,
|
||||
x_expand: true,
|
||||
layout_manager: new Clutter.BinLayout() });
|
||||
this._notificationWidget.connect('key-release-event', Lang.bind(this, this._onNotificationKeyRelease));
|
||||
|
||||
this.actor.add_actor(this._notificationWidget);
|
||||
|
||||
this._notificationBin = new St.Bin({ y_expand: true });
|
||||
@ -1450,7 +1445,7 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
this._closeButton = makeCloseButton();
|
||||
this._closeButton.hide();
|
||||
this._closeButton.connect('clicked', Lang.bind(this, this._onCloseClicked));
|
||||
this._closeButton.connect('clicked', Lang.bind(this, this._closeNotification));
|
||||
this._notificationWidget.add_actor(this._closeButton);
|
||||
|
||||
this._idleMonitorBecameActiveId = 0;
|
||||
@ -1526,6 +1521,10 @@ const MessageTray = new Lang.Class({
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Lang.bind(this, this.toggleAndNavigate));
|
||||
global.display.add_keybinding('focus-active-notification',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Lang.bind(this, this._expandActiveNotification));
|
||||
|
||||
this._summaryItems = [];
|
||||
this._chatSummaryItemsCount = 0;
|
||||
@ -1601,14 +1600,23 @@ const MessageTray = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
_onCloseClicked: function() {
|
||||
_onNotificationKeyRelease: function(actor, event) {
|
||||
let ignoredModifiers = global.display.get_ignored_modifier_mask();
|
||||
let modifierState = event.get_state() & ~ignoredModifiers;
|
||||
|
||||
if (event.get_key_symbol() == Clutter.KEY_Escape && modifierState == 0) {
|
||||
this._closeNotification();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
_closeNotification: function() {
|
||||
if (this._notificationState == State.SHOWN) {
|
||||
this._closeButton.hide();
|
||||
this._notificationClosed = true;
|
||||
this._notification.emit('done-displaying');
|
||||
|
||||
if (!this._notification.resident)
|
||||
this._notification.destroy();
|
||||
|
||||
this._updateState();
|
||||
this._notificationClosed = false;
|
||||
}
|
||||
},
|
||||
@ -1964,8 +1972,9 @@ const MessageTray = new Lang.Class({
|
||||
// Notifications
|
||||
let notificationQueue = this._notificationQueue;
|
||||
let notificationUrgent = notificationQueue.length > 0 && notificationQueue[0].urgency == Urgency.CRITICAL;
|
||||
let notificationForFeedback = notificationQueue.length > 0 && notificationQueue[0].forFeedback;
|
||||
let notificationsLimited = this._busy || this._inFullscreen;
|
||||
let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent) && Main.sessionMode.hasNotifications;
|
||||
let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent || notificationForFeedback) && Main.sessionMode.hasNotifications;
|
||||
let nextNotification = notificationQueue.length > 0 ? notificationQueue[0] : null;
|
||||
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
|
||||
let notificationExpanded = this._notification && this._notification.expanded;
|
||||
@ -2101,9 +2110,8 @@ const MessageTray = new Lang.Class({
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
if (this._overviewVisible) {
|
||||
if (!this._overviewVisible)
|
||||
this._lightbox.show();
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
@ -2141,6 +2149,10 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
_hideTray: function() {
|
||||
// Having the summary item animate out while sliding down the tray
|
||||
// is distracting, so hide it immediately in case it was visible.
|
||||
this._summaryBoxPointer.actor.hide();
|
||||
|
||||
this._tween(this.actor, '_trayState', State.HIDDEN,
|
||||
{ y: 0,
|
||||
time: ANIMATION_TIME,
|
||||
@ -2344,6 +2356,13 @@ const MessageTray = new Lang.Class({
|
||||
notification.destroy(NotificationDestroyedReason.EXPIRED);
|
||||
},
|
||||
|
||||
_expandActiveNotification: function() {
|
||||
if (!this._notification)
|
||||
return;
|
||||
|
||||
this._expandNotification(false);
|
||||
},
|
||||
|
||||
_expandNotification: function(autoExpanding) {
|
||||
// Don't grab focus in notifications that are auto-expanded.
|
||||
if (!autoExpanding)
|
||||
@ -2420,7 +2439,10 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationQueue = newQueue;
|
||||
|
||||
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
|
||||
this._summaryBoxPointerItem.closeButtonVisible = true;
|
||||
|
||||
let closeButton = this._summaryBoxPointerItem.closeButton;
|
||||
closeButton.show();
|
||||
this._summaryBoxPointerCloseClickedId = closeButton.connect('clicked', Lang.bind(this, this._hideSummaryBoxPointer));
|
||||
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
|
||||
} else if (this._clickedSummaryItemMouseButton == 3) {
|
||||
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
|
||||
@ -2530,6 +2552,8 @@ const MessageTray = new Lang.Class({
|
||||
this._summaryBoxPointer.bin.child = null;
|
||||
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
|
||||
this._summaryBoxPointerContentUpdatedId = 0;
|
||||
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
|
||||
this._summaryBoxPointerCloseClickedId = 0;
|
||||
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
|
||||
this._summaryBoxPointerDoneDisplayingId = 0;
|
||||
|
||||
|
@ -28,6 +28,24 @@ const DASH_MAX_WIDTH = 96;
|
||||
|
||||
const DND_WINDOW_SWITCH_TIMEOUT = 1250;
|
||||
|
||||
const GLSL_DIM_EFFECT_DECLARATIONS = '';
|
||||
const GLSL_DIM_EFFECT_CODE = '\
|
||||
vec2 dist = cogl_tex_coord_in[0].xy - vec2(0.5, 0.5); \
|
||||
float elipse_radius = 0.5; \
|
||||
/* from https://bugzilla.gnome.org/show_bug.cgi?id=669798: \
|
||||
the alpha on the gradient goes from 165 at its darkest to 98 at its most transparent. */ \
|
||||
float y = 165.0 / 255.0; \
|
||||
float x = 98.0 / 255.0; \
|
||||
/* interpolate darkening value, based on distance from screen center */ \
|
||||
float val = min(length(dist), elipse_radius); \
|
||||
float a = mix(x, y, val / elipse_radius); \
|
||||
/* dim_factor varies from [1.0 -> 0.5] when overview is showing \
|
||||
We use it to smooth value, then we clamp it to valid color interval */ \
|
||||
a = clamp(a - cogl_color_in.r + 0.5, 0.0, 1.0); \
|
||||
/* We\'re blending between: color and black color (obviously omitted in the equation) */ \
|
||||
cogl_color_out.xyz = cogl_color_out.xyz * (1.0 - a); \
|
||||
cogl_color_out.a = 1.0;';
|
||||
|
||||
const SwipeScrollDirection = {
|
||||
NONE: 0,
|
||||
HORIZONTAL: 1,
|
||||
@ -57,7 +75,14 @@ const ShellInfo = new Lang.Class({
|
||||
this._source.destroy();
|
||||
},
|
||||
|
||||
setMessage: function(text, undoCallback, undoLabel) {
|
||||
setMessage: function(text, options) {
|
||||
options = Params.parse(options, { undoCallback: null,
|
||||
forFeedback: false
|
||||
});
|
||||
|
||||
let undoCallback = options.undoCallback;
|
||||
let forFeedback = options.forFeedback;
|
||||
|
||||
if (this._source == null) {
|
||||
this._source = new MessageTray.SystemNotificationSource();
|
||||
this._source.connect('destroy', Lang.bind(this,
|
||||
@ -71,6 +96,7 @@ const ShellInfo = new Lang.Class({
|
||||
if (this._source.notifications.length == 0) {
|
||||
notification = new MessageTray.Notification(this._source, text, null);
|
||||
notification.setTransient(true);
|
||||
notification.setForFeedback(forFeedback);
|
||||
} else {
|
||||
notification = this._source.notifications[0];
|
||||
notification.update(text, null, { clear: true });
|
||||
@ -78,10 +104,8 @@ const ShellInfo = new Lang.Class({
|
||||
|
||||
this._undoCallback = undoCallback;
|
||||
if (undoCallback) {
|
||||
notification.addButton('system-undo',
|
||||
undoLabel ? undoLabel : _("Undo"));
|
||||
notification.connect('action-invoked',
|
||||
Lang.bind(this, this._onUndoClicked));
|
||||
notification.addButton('system-undo', _("Undo"));
|
||||
notification.connect('action-invoked', Lang.bind(this, this._onUndoClicked));
|
||||
}
|
||||
|
||||
this._source.notify(notification);
|
||||
@ -113,6 +137,10 @@ const Overview = new Lang.Class({
|
||||
// scenes which allows us to show the background with different
|
||||
// rendering options without duplicating the texture data.
|
||||
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
|
||||
this._background.add_glsl_snippet(Meta.SnippetHook.FRAGMENT,
|
||||
GLSL_DIM_EFFECT_DECLARATIONS,
|
||||
GLSL_DIM_EFFECT_CODE,
|
||||
false);
|
||||
this._background.hide();
|
||||
global.overlay_group.add_actor(this._background);
|
||||
|
||||
@ -233,11 +261,16 @@ const Overview = new Lang.Class({
|
||||
this._viewSelector.removeSearchProvider(provider);
|
||||
},
|
||||
|
||||
setMessage: function(text, undoCallback, undoLabel) {
|
||||
//
|
||||
// options:
|
||||
// - undoCallback (function): the callback to be called if undo support is needed
|
||||
// - forFeedback (boolean): whether the message is for direct feedback of a user action
|
||||
//
|
||||
setMessage: function(text, options) {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
|
||||
this._shellInfo.setMessage(text, undoCallback, undoLabel);
|
||||
this._shellInfo.setMessage(text, options);
|
||||
},
|
||||
|
||||
_onDragBegin: function() {
|
||||
@ -622,7 +655,7 @@ const Overview = new Lang.Class({
|
||||
});
|
||||
|
||||
Tweener.addTween(this._background,
|
||||
{ dim_factor: 0.4,
|
||||
{ dim_factor: 0.8,
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
@ -247,6 +247,10 @@ const AppMenuButton = new Lang.Class({
|
||||
this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight));
|
||||
this._container.connect('allocate', Lang.bind(this, this._contentAllocate));
|
||||
|
||||
let textureCache = St.TextureCache.get_default();
|
||||
textureCache.connect('icon-theme-changed',
|
||||
Lang.bind(this, this._onIconThemeChanged));
|
||||
|
||||
this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' });
|
||||
this._iconBox.connect('style-changed',
|
||||
Lang.bind(this, this._onIconBoxStyleChanged));
|
||||
@ -332,6 +336,15 @@ const AppMenuButton = new Lang.Class({
|
||||
this._updateIconBoxClip();
|
||||
},
|
||||
|
||||
_onIconThemeChanged: function() {
|
||||
if (this._iconBox.child == null)
|
||||
return;
|
||||
|
||||
this._iconBox.child.destroy();
|
||||
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
|
||||
this._iconBox.set_child(icon);
|
||||
},
|
||||
|
||||
_updateIconBoxClip: function() {
|
||||
let allocation = this._iconBox.allocation;
|
||||
if (this._iconBottomClip > 0)
|
||||
@ -901,6 +914,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
|
||||
'logo': imports.gdm.loginDialog.LogoMenuButton,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
|
||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||
|
@ -214,7 +214,8 @@ const Button = new Lang.Class({
|
||||
destroy: function() {
|
||||
this.actor._delegate = null;
|
||||
|
||||
this.menu.destroy();
|
||||
if (this.menu)
|
||||
this.menu.destroy();
|
||||
this.actor.destroy();
|
||||
|
||||
this.emit('destroy');
|
||||
|
@ -1269,13 +1269,14 @@ const PopupMenu = new Lang.Class({
|
||||
},
|
||||
|
||||
close: function(animate) {
|
||||
if (!this.isOpen)
|
||||
return;
|
||||
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
|
||||
this._boxPointer.hide(animate);
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.hide(animate);
|
||||
|
||||
if (!this.isOpen)
|
||||
return;
|
||||
|
||||
this.isOpen = false;
|
||||
this.emit('open-state-changed', false);
|
||||
|
@ -38,9 +38,22 @@ function loadRemoteSearchProviders(addProviderCallback) {
|
||||
for (let i = 0; i < dataDirs.length; i++) {
|
||||
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
|
||||
let dir = Gio.file_new_for_path(path);
|
||||
if (!dir.query_exists(null))
|
||||
continue;
|
||||
loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback);
|
||||
|
||||
dir.query_info_async('standard:type', Gio.FileQueryInfoFlags.NONE,
|
||||
GLib.PRIORITY_DEFAULT, null,
|
||||
function(object, res) {
|
||||
let exists = false;
|
||||
try {
|
||||
object.query_info_finish(res);
|
||||
exists = true;
|
||||
} catch (e) {
|
||||
}
|
||||
|
||||
if (!exists)
|
||||
return;
|
||||
|
||||
loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -60,7 +73,7 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
|
||||
if (!keyfile.has_group(KEY_FILE_GROUP))
|
||||
continue;
|
||||
|
||||
let remoteProvider, title;
|
||||
let remoteProvider;
|
||||
try {
|
||||
let group = KEY_FILE_GROUP;
|
||||
let busName = keyfile.get_string(group, 'BusName');
|
||||
@ -74,25 +87,17 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
|
||||
let desktopId = keyfile.get_string(group, 'DesktopId');
|
||||
appInfo = Gio.DesktopAppInfo.new(desktopId);
|
||||
} catch (e) {
|
||||
log('Ignoring search provider ' + path + ': missing DesktopId');
|
||||
continue;
|
||||
}
|
||||
|
||||
let icon;
|
||||
if (appInfo) {
|
||||
icon = appInfo.get_icon();
|
||||
title = appInfo.get_name();
|
||||
} else {
|
||||
let iconName = keyfile.get_string(group, 'Icon');
|
||||
icon = new Gio.ThemedIcon({ name: iconName });
|
||||
title = keyfile.get_locale_string(group, 'Title', null);
|
||||
}
|
||||
|
||||
remoteProvider = new RemoteSearchProvider(title,
|
||||
icon,
|
||||
remoteProvider = new RemoteSearchProvider(appInfo.get_name(),
|
||||
appInfo.get_icon(),
|
||||
busName,
|
||||
objectPath);
|
||||
loadedProviders[objectPath] = remoteProvider;
|
||||
} catch(e) {
|
||||
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
|
||||
log('Failed to add search provider %s: %s'.format(path, e.toString()));
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -108,12 +113,16 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
|
||||
_init: function(title, icon, dbusName, dbusPath) {
|
||||
this._proxy = new SearchProviderProxy(Gio.DBus.session,
|
||||
dbusName, dbusPath);
|
||||
dbusName, dbusPath, Lang.bind(this, this._onProxyConstructed));
|
||||
|
||||
this.parent(title.toUpperCase());
|
||||
this._cancellable = new Gio.Cancellable();
|
||||
},
|
||||
|
||||
_onProxyConstructed: function(proxy) {
|
||||
// Do nothing
|
||||
},
|
||||
|
||||
createIcon: function(size, meta) {
|
||||
if (meta['gicon']) {
|
||||
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
|
||||
|
@ -202,11 +202,12 @@ const RunDialog = new Lang.Class({
|
||||
|
||||
|
||||
let label = new St.Label({ style_class: 'run-dialog-label',
|
||||
text: _("Please enter a command:") });
|
||||
text: _("Enter a Command") });
|
||||
|
||||
this.contentLayout.add(label, { y_align: St.Align.START });
|
||||
|
||||
let entry = new St.Entry({ style_class: 'run-dialog-entry' });
|
||||
let entry = new St.Entry({ style_class: 'run-dialog-entry',
|
||||
can_focus: true });
|
||||
ShellEntry.addContextMenu(entry);
|
||||
|
||||
entry.label_actor = label;
|
||||
@ -236,6 +237,10 @@ const RunDialog = new Lang.Class({
|
||||
|
||||
this._errorBox.hide();
|
||||
|
||||
this.setButtons([{ action: Lang.bind(this, this.close),
|
||||
label: _("Close"),
|
||||
key: Clutter.Escape }]);
|
||||
|
||||
this._pathCompleter = new Gio.FilenameCompleter();
|
||||
this._commandCompleter = new CommandCompleter();
|
||||
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
|
||||
@ -246,20 +251,12 @@ const RunDialog = new Lang.Class({
|
||||
let symbol = e.get_key_symbol();
|
||||
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
||||
this.popModal();
|
||||
if (e.get_state() & Clutter.ModifierType.CONTROL_MASK)
|
||||
this._run(o.get_text(), true);
|
||||
else
|
||||
this._run(o.get_text(), false);
|
||||
if (!this._commandError)
|
||||
this._run(o.get_text(),
|
||||
e.get_state() & Clutter.ModifierType.CONTROL_MASK);
|
||||
if (!this._commandError ||
|
||||
!this.pushModal())
|
||||
this.close();
|
||||
else {
|
||||
if (!this.pushModal())
|
||||
this.close();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.Escape) {
|
||||
this.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
if (symbol == Clutter.slash) {
|
||||
|
@ -26,7 +26,7 @@ const Util = imports.misc.util;
|
||||
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
||||
const LOCK_ENABLED_KEY = 'lock-enabled';
|
||||
|
||||
const CURTAIN_SLIDE_TIME = 0.5;
|
||||
const CURTAIN_SLIDE_TIME = 0.3;
|
||||
// fraction of screen height the arrow must reach before completing
|
||||
// the slide up automatically
|
||||
const ARROW_DRAG_THRESHOLD = 0.1;
|
||||
@ -47,7 +47,39 @@ const SUMMARY_ICON_SIZE = 48;
|
||||
// STANDARD_FADE_TIME is used when the session goes idle, while
|
||||
// SHORT_FADE_TIME is used when requesting lock explicitly from the user menu
|
||||
const STANDARD_FADE_TIME = 10;
|
||||
const SHORT_FADE_TIME = 0.8;
|
||||
const SHORT_FADE_TIME = 0.3;
|
||||
|
||||
function sample(offx, offy) {
|
||||
return 'texel += texture2D (sampler, tex_coord.st + pixel_step * ' +
|
||||
'vec2 (' + offx + ',' + offy + ') * 2.0);\n'
|
||||
}
|
||||
const GLSL_BLUR_EFFECT_DECLARATIONS = ' \
|
||||
uniform vec2 pixel_step;\n \
|
||||
vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
|
||||
vec4 texel;\n \
|
||||
texel = texture2D (sampler, tex_coord.st);\n'
|
||||
+ sample(-1.0, -1.0)
|
||||
+ sample( 0.0, -1.0)
|
||||
+ sample(+1.0, -1.0)
|
||||
+ sample(-1.0, 0.0)
|
||||
+ sample( 0.0, 0.0)
|
||||
+ sample(+1.0, 0.0)
|
||||
+ sample(-1.0, +1.0)
|
||||
+ sample( 0.0, +1.0)
|
||||
+ sample(+1.0, +1.0) + ' \
|
||||
texel /= 9.0;\n \
|
||||
return texel;\n \
|
||||
}\n \
|
||||
vec3 desaturate (const vec3 color, const float desaturation)\n \
|
||||
{\n \
|
||||
const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n \
|
||||
vec3 gray = vec3 (dot (gray_conv, color));\n \
|
||||
return vec3 (mix (color.rgb, gray, desaturation));\n \
|
||||
}';
|
||||
const GLSL_BLUR_EFFECT_CODE = ' \
|
||||
cogl_texel = apply_blur(cogl_sampler, cogl_tex_coord.st);\n \
|
||||
cogl_texel.rgb = desaturate(cogl_texel.rgb, 0.6);\n';
|
||||
|
||||
|
||||
const Clock = new Lang.Class({
|
||||
Name: 'ScreenShieldClock',
|
||||
@ -186,7 +218,7 @@ const NotificationsBox = new Lang.Class({
|
||||
|
||||
if (obj.resident) {
|
||||
this._residentNotificationBox.add(item.notificationStackWidget);
|
||||
item.closeButtonVisible = false;
|
||||
item.closeButton.hide();
|
||||
item.prepareNotificationStackForShowing();
|
||||
} else {
|
||||
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
|
||||
@ -244,7 +276,7 @@ const NotificationsBox = new Lang.Class({
|
||||
obj.resident = true;
|
||||
|
||||
this._residentNotificationBox.add(obj.item.notificationStackWidget);
|
||||
obj.item.closeButtonVisible = false;
|
||||
obj.item.closeButton.hide();
|
||||
obj.item.prepareNotificationStackForShowing();
|
||||
} else {
|
||||
// just update the counter
|
||||
@ -335,6 +367,10 @@ const Arrow = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
function clamp(value, min, max) {
|
||||
return Math.max(min, Math.min(max, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* To test screen shield, make sure to kill gnome-screensaver.
|
||||
*
|
||||
@ -367,8 +403,13 @@ const ScreenShield = new Lang.Class({
|
||||
name: 'lockScreenContents' });
|
||||
this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true }));
|
||||
|
||||
let backgroundActor = Meta.BackgroundActor.new_for_screen(global.screen);
|
||||
backgroundActor.add_glsl_snippet(Meta.SnippetHook.TEXTURE_LOOKUP,
|
||||
GLSL_BLUR_EFFECT_DECLARATIONS,
|
||||
GLSL_BLUR_EFFECT_CODE,
|
||||
true);
|
||||
this._background = new St.Bin({ style_class: 'screen-shield-background',
|
||||
child: Meta.BackgroundActor.new_for_screen(global.screen) });
|
||||
child: backgroundActor });
|
||||
this._lockScreenGroup.add_actor(this._background);
|
||||
this._lockScreenGroup.add_actor(this._lockScreenContents);
|
||||
|
||||
@ -387,14 +428,11 @@ const ScreenShield = new Lang.Class({
|
||||
}
|
||||
this._lockScreenContents.add_actor(this._arrowContainer);
|
||||
|
||||
let dragArea = new Clutter.Rect({ origin: new Clutter.Point({ x: 0, y: -global.screen_height, }),
|
||||
size: new Clutter.Size({ width: global.screen_width,
|
||||
height: global.screen_height }) });
|
||||
let action = new Clutter.DragAction({ drag_axis: Clutter.DragAxis.Y_AXIS,
|
||||
drag_area: dragArea });
|
||||
action.connect('drag-begin', Lang.bind(this, this._onDragBegin));
|
||||
action.connect('drag-end', Lang.bind(this, this._onDragEnd));
|
||||
this._lockScreenGroup.add_action(action);
|
||||
this._dragAction = new Clutter.GestureAction();
|
||||
this._dragAction.connect('gesture-begin', Lang.bind(this, this._onDragBegin));
|
||||
this._dragAction.connect('gesture-progress', Lang.bind(this, this._onDragMotion));
|
||||
this._dragAction.connect('gesture-end', Lang.bind(this, this._onDragEnd));
|
||||
this._lockScreenGroup.add_action(this._dragAction);
|
||||
|
||||
this._lockDialogGroup = new St.Widget({ x_expand: true,
|
||||
y_expand: true,
|
||||
@ -436,6 +474,8 @@ const ScreenShield = new Lang.Class({
|
||||
{ inhibitEvents: true,
|
||||
fadeInTime: STANDARD_FADE_TIME,
|
||||
fadeFactor: 1 });
|
||||
|
||||
this.idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||
},
|
||||
|
||||
_onLockScreenKeyRelease: function(actor, event) {
|
||||
@ -456,7 +496,7 @@ const ScreenShield = new Lang.Class({
|
||||
symbol == Clutter.KEY_Return ||
|
||||
symbol == Clutter.KEY_KP_Enter) {
|
||||
this._ensureUnlockDialog(true);
|
||||
this._hideLockScreen(true);
|
||||
this._hideLockScreen(true, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -479,7 +519,7 @@ const ScreenShield = new Lang.Class({
|
||||
// 7 standard scrolls to lift up
|
||||
if (this._lockScreenScrollCounter > 35) {
|
||||
this._ensureUnlockDialog(false);
|
||||
this._hideLockScreen(true);
|
||||
this._hideLockScreen(true, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -511,12 +551,27 @@ const ScreenShield = new Lang.Class({
|
||||
Tweener.removeTweens(this._lockScreenGroup);
|
||||
this._lockScreenState = MessageTray.State.HIDING;
|
||||
this._ensureUnlockDialog(false);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_onDragMotion: function() {
|
||||
let [origX, origY] = this._dragAction.get_press_coords(0);
|
||||
let [currentX, currentY] = this._dragAction.get_motion_coords(0);
|
||||
|
||||
let newY = currentY - origY;
|
||||
newY = clamp(newY, -global.stage.height, 0);
|
||||
|
||||
this._lockScreenGroup.y = newY;
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_onDragEnd: function(action, actor, eventX, eventY, modifiers) {
|
||||
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
|
||||
// Complete motion automatically
|
||||
this._hideLockScreen(true);
|
||||
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
|
||||
this._hideLockScreen(true, -velocityY);
|
||||
} else {
|
||||
// restore the lock screen to its original place
|
||||
// try to use the same speed as the normal animation
|
||||
@ -526,7 +581,7 @@ const ScreenShield = new Lang.Class({
|
||||
Tweener.addTween(this._lockScreenGroup,
|
||||
{ y: 0,
|
||||
time: time,
|
||||
transition: 'linear',
|
||||
transition: 'easeInQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
@ -545,55 +600,62 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
_onStatusChanged: function(status) {
|
||||
if (status == GnomeSession.PresenceStatus.IDLE) {
|
||||
if (this._dialog) {
|
||||
this._dialog.cancel();
|
||||
if (!this._isGreeter) {
|
||||
this._dialog = null;
|
||||
if (status != GnomeSession.PresenceStatus.IDLE)
|
||||
return;
|
||||
|
||||
if (this._dialog) {
|
||||
this._dialog.cancel();
|
||||
if (!this._isGreeter) {
|
||||
this._dialog = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor);
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
if (!this._isActive) {
|
||||
this._lightbox.show();
|
||||
|
||||
if (this._activationTime == 0)
|
||||
this._activationTime = GLib.get_monotonic_time();
|
||||
|
||||
this._becameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, function() {
|
||||
this.idleMonitor.disconnect(this._becameActiveId);
|
||||
|
||||
let lightboxWasShown = this._lightbox.shown;
|
||||
this._lightbox.hide();
|
||||
|
||||
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
|
||||
if (shouldLock || this._isLocked) {
|
||||
this.lock(false);
|
||||
} else if (this._isActive) {
|
||||
this.unlock();
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor);
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
if (!this._isActive) {
|
||||
this._lightbox.show();
|
||||
|
||||
if (this._activationTime == 0)
|
||||
this._activationTime = GLib.get_monotonic_time();
|
||||
}
|
||||
} else {
|
||||
let lightboxWasShown = this._lightbox.shown;
|
||||
this._lightbox.hide();
|
||||
|
||||
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
|
||||
if (shouldLock || this._isActive) {
|
||||
this.lock(false);
|
||||
} else if (this._isModal) {
|
||||
this.unlock();
|
||||
}
|
||||
this._isActive = true;
|
||||
this.emit('lock-status-changed');
|
||||
}
|
||||
},
|
||||
|
||||
showDialog: function() {
|
||||
// Ensure that the stage window is mapped, before taking a grab
|
||||
// otherwise X errors out
|
||||
let actorShownId = 0;
|
||||
actorShownId = this.actor.connect('show', Lang.bind(this, function() {
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor);
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
this.actor.disconnect(actorShownId);
|
||||
return false;
|
||||
}));
|
||||
|
||||
this.actor.show();
|
||||
this._isGreeter = Main.sessionMode.isGreeter;
|
||||
this._ensureUnlockDialog(true);
|
||||
this._hideLockScreen(false);
|
||||
this._hideLockScreen(false, 0);
|
||||
},
|
||||
|
||||
_bumpLockScreen: function() {
|
||||
@ -611,19 +673,26 @@ const ScreenShield = new Lang.Class({
|
||||
});
|
||||
},
|
||||
|
||||
_hideLockScreen: function(animate) {
|
||||
_hideLockScreen: function(animate, velocity) {
|
||||
this._lockScreenState = MessageTray.State.HIDING;
|
||||
|
||||
if (animate) {
|
||||
// Tween the lock screen out of screen
|
||||
// try to use the same speed regardless of original position
|
||||
// if velocity is not specified (i.e. we come here from pressing ESC),
|
||||
// use the same speed regardless of original position
|
||||
// if velocity is specified, it's in pixels per milliseconds
|
||||
let h = global.stage.height;
|
||||
let time = CURTAIN_SLIDE_TIME * (h + this._lockScreenGroup.y) / h;
|
||||
let delta = (h + this._lockScreenGroup.y);
|
||||
let min_velocity = global.stage.height / (CURTAIN_SLIDE_TIME * 1000);
|
||||
|
||||
velocity = Math.max(min_velocity, velocity);
|
||||
let time = (delta / velocity) / 1000;
|
||||
|
||||
Tweener.removeTweens(this._lockScreenGroup);
|
||||
Tweener.addTween(this._lockScreenGroup,
|
||||
{ y: -h,
|
||||
time: time,
|
||||
transition: 'linear',
|
||||
transition: 'easeInQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenState = MessageTray.State.HIDDEN;
|
||||
this._lockScreenGroup.hide();
|
||||
@ -635,6 +704,8 @@ const ScreenShield = new Lang.Class({
|
||||
this._lockScreenGroup.hide();
|
||||
}
|
||||
|
||||
global.stage.show_cursor();
|
||||
|
||||
if (Main.sessionMode.currentMode == 'lock-screen')
|
||||
Main.sessionMode.popMode('lock-screen');
|
||||
},
|
||||
@ -684,7 +755,7 @@ const ScreenShield = new Lang.Class({
|
||||
Tweener.addTween(this._lockScreenGroup,
|
||||
{ y: 0,
|
||||
time: SHORT_FADE_TIME,
|
||||
transition: 'linear',
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
this._lockScreenShown();
|
||||
},
|
||||
@ -723,6 +794,16 @@ const ScreenShield = new Lang.Class({
|
||||
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
|
||||
this._animateArrows();
|
||||
|
||||
let motionId = global.stage.connect('captured-event', function(stage, event) {
|
||||
if (event.type() == Clutter.EventType.MOTION) {
|
||||
global.stage.show_cursor();
|
||||
global.stage.disconnect(motionId);
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
global.stage.hide_cursor();
|
||||
|
||||
this._lockScreenState = MessageTray.State.SHOWN;
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenScrollCounter = 0;
|
||||
@ -831,6 +912,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._activationTime = 0;
|
||||
this._isActive = false;
|
||||
this._isLocked = false;
|
||||
this.emit('lock-status-changed');
|
||||
},
|
||||
|
||||
@ -855,6 +937,7 @@ const ScreenShield = new Lang.Class({
|
||||
this._resetLockScreen(animate, animate);
|
||||
|
||||
this._isActive = true;
|
||||
this._isLocked = true;
|
||||
this.emit('lock-status-changed');
|
||||
},
|
||||
});
|
||||
|
@ -37,9 +37,9 @@ const _modes = {
|
||||
isGreeter: true,
|
||||
isPrimary: true,
|
||||
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
||||
components: ['polkitAgent'],
|
||||
components: ['polkitAgent', 'mediaKeysManager'],
|
||||
panel: {
|
||||
left: [],
|
||||
left: ['logo'],
|
||||
center: ['dateMenu'],
|
||||
right: ['a11y', 'display', 'keyboard',
|
||||
'volume', 'battery', 'powerMenu']
|
||||
@ -50,7 +50,7 @@ const _modes = {
|
||||
isLocked: true,
|
||||
isGreeter: undefined,
|
||||
unlockDialog: undefined,
|
||||
components: ['polkitAgent', 'telepathyClient'],
|
||||
components: ['polkitAgent', 'telepathyClient', 'mediaKeysManager'],
|
||||
panel: {
|
||||
left: ['userMenu'],
|
||||
center: [],
|
||||
@ -61,7 +61,7 @@ const _modes = {
|
||||
'unlock-dialog': {
|
||||
isLocked: true,
|
||||
unlockDialog: undefined,
|
||||
components: ['polkitAgent', 'telepathyClient'],
|
||||
components: ['polkitAgent', 'telepathyClient', 'mediaKeysManager'],
|
||||
panel: {
|
||||
left: ['userMenu'],
|
||||
center: [],
|
||||
@ -71,7 +71,7 @@ const _modes = {
|
||||
|
||||
'initial-setup': {
|
||||
isPrimary: true,
|
||||
components: ['keyring'],
|
||||
components: ['keyring', 'mediaKeysManager'],
|
||||
panel: {
|
||||
left: [],
|
||||
center: ['dateMenu'],
|
||||
@ -91,8 +91,9 @@ const _modes = {
|
||||
isLocked: false,
|
||||
isPrimary: true,
|
||||
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
||||
components: ['networkAgent', 'polkitAgent', 'telepathyClient',
|
||||
'keyring', 'recorder', 'autorunManager', 'automountManager'],
|
||||
components: ['networkAgent', 'polkitAgent', 'telepathyClient', 'keyring',
|
||||
'recorder', 'autorunManager', 'automountManager',
|
||||
'mediaKeysManager'],
|
||||
panel: {
|
||||
left: ['activities', 'appMenu'],
|
||||
center: ['dateMenu'],
|
||||
|
@ -38,8 +38,8 @@ const ATIndicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent('preferences-desktop-accessibility-symbolic', _("Accessibility"));
|
||||
|
||||
let highContrast = this._buildHCItem();
|
||||
this.menu.addMenuItem(highContrast);
|
||||
this._highContrast = this._buildHCItem();
|
||||
this.menu.addMenuItem(this._highContrast);
|
||||
|
||||
let magnifier = this._buildItem(_("Zoom"), APPLICATIONS_SCHEMA,
|
||||
'screen-magnifier-enabled');
|
||||
@ -159,5 +159,9 @@ const ATIndicator = new Lang.Class({
|
||||
widget.setToggleState(active);
|
||||
});
|
||||
return widget;
|
||||
}
|
||||
},
|
||||
|
||||
toggleHighContrast: function() {
|
||||
this._highContrast.toggle();
|
||||
},
|
||||
});
|
||||
|
@ -233,20 +233,11 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const NMDevice = new Lang.Class({
|
||||
Name: 'NMDevice',
|
||||
const NMConnectionBased = new Lang.Class({
|
||||
Name: 'NMConnectionBased',
|
||||
Abstract: true,
|
||||
|
||||
_init: function(client, device, connections) {
|
||||
this.device = device;
|
||||
if (device) {
|
||||
this.device._delegate = this;
|
||||
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||
} else
|
||||
this._stateChangedId = 0;
|
||||
|
||||
// protected
|
||||
this._client = client;
|
||||
_init: function(connections) {
|
||||
this._connections = [ ];
|
||||
for (let i = 0; i < connections.length; i++) {
|
||||
if (!connections[i].get_uuid())
|
||||
@ -264,26 +255,115 @@ const NMDevice = new Lang.Class({
|
||||
this._connections.push(obj);
|
||||
}
|
||||
this._connections.sort(this._connectionSortFunction);
|
||||
},
|
||||
|
||||
checkConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
let exists = pos != -1;
|
||||
let valid = this.connectionValid(connection);
|
||||
let similar = false;
|
||||
if (exists) {
|
||||
let existing = this._connections[pos];
|
||||
|
||||
// Check if connection changed name or id
|
||||
similar = existing.name == connection.get_id() &&
|
||||
existing.timestamp == connection._timestamp;
|
||||
}
|
||||
|
||||
if (exists && valid && similar) {
|
||||
// Nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (exists)
|
||||
this.removeConnection(connection);
|
||||
if (valid)
|
||||
this.addConnection(connection);
|
||||
},
|
||||
|
||||
addConnection: function(connection) {
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connection,
|
||||
name: connection.get_id(),
|
||||
uuid: connection.get_uuid(),
|
||||
timestamp: connection._timestamp,
|
||||
item: null,
|
||||
};
|
||||
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
|
||||
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
if (pos == -1) {
|
||||
// this connection was never added, nothing to do here
|
||||
return;
|
||||
}
|
||||
|
||||
let obj = this._connections[pos];
|
||||
if (obj.item)
|
||||
obj.item.destroy();
|
||||
this._connections.splice(pos, 1);
|
||||
|
||||
if (this._connections.length <= 1) {
|
||||
// We need to show the automatic connection again
|
||||
// (or in the case of NMDeviceWired, we want to hide
|
||||
// the only explicit connection)
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
|
||||
_findConnection: function(uuid) {
|
||||
for (let i = 0; i < this._connections.length; i++) {
|
||||
let obj = this._connections[i];
|
||||
if (obj.uuid == uuid)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
},
|
||||
|
||||
_connectionSortFunction: function(one, two) {
|
||||
if (one.timestamp == two.timestamp)
|
||||
return GLib.utf8_collate(one.name, two.name);
|
||||
|
||||
return two.timestamp - one.timestamp;
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(NMConnectionBased.prototype);
|
||||
|
||||
const NMDevice = new Lang.Class({
|
||||
Name: 'NMDevice',
|
||||
Abstract: true,
|
||||
Extends: NMConnectionBased,
|
||||
|
||||
_init: function(client, device, connections) {
|
||||
this.device = device;
|
||||
this.device._delegate = this;
|
||||
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||
|
||||
// protected
|
||||
this._client = client;
|
||||
this.parent(connections);
|
||||
this._activeConnection = null;
|
||||
this._activeConnectionItem = null;
|
||||
this._autoConnectionItem = null;
|
||||
this._overflowItem = null;
|
||||
|
||||
if (this.device) {
|
||||
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
|
||||
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
||||
let ok;
|
||||
if (state)
|
||||
ok = this.activate();
|
||||
else
|
||||
ok = this.deactivate();
|
||||
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
|
||||
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
||||
let ok;
|
||||
if (state)
|
||||
ok = this.activate();
|
||||
else
|
||||
ok = this.deactivate();
|
||||
|
||||
if (!ok)
|
||||
item.setToggleState(!state);
|
||||
}));
|
||||
if (!ok)
|
||||
item.setToggleState(!state);
|
||||
}));
|
||||
|
||||
this._updateStatusItem();
|
||||
}
|
||||
this._updateStatusItem();
|
||||
this.section = new PopupMenu.PopupMenuSection();
|
||||
|
||||
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
|
||||
@ -352,6 +432,10 @@ const NMDevice = new Lang.Class({
|
||||
return this.device.state == NetworkManager.DeviceState.ACTIVATED;
|
||||
},
|
||||
|
||||
clearActiveConnection: function(activeConnection) {
|
||||
this.setActiveConnection(null);
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
if (activeConnection == this._activeConnection)
|
||||
// nothing to do
|
||||
@ -369,80 +453,13 @@ const NMDevice = new Lang.Class({
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
checkConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
let exists = pos != -1;
|
||||
let valid = this.connectionValid(connection);
|
||||
let similar = false;
|
||||
if (exists) {
|
||||
let existing = this._connections[pos];
|
||||
|
||||
// Check if connection changed name or id
|
||||
similar = existing.name == connection.get_id() &&
|
||||
existing.timestamp == connection._timestamp;
|
||||
}
|
||||
|
||||
if (exists && valid && similar) {
|
||||
// Nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (exists)
|
||||
this.removeConnection(connection);
|
||||
if (valid)
|
||||
this.addConnection(connection);
|
||||
},
|
||||
|
||||
addConnection: function(connection) {
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connection,
|
||||
name: connection.get_id(),
|
||||
uuid: connection.get_uuid(),
|
||||
timestamp: connection._timestamp,
|
||||
item: null,
|
||||
};
|
||||
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
if (pos == -1) {
|
||||
// this connection was never added, nothing to do here
|
||||
return;
|
||||
}
|
||||
|
||||
let obj = this._connections[pos];
|
||||
if (obj.item)
|
||||
obj.item.destroy();
|
||||
this._connections.splice(pos, 1);
|
||||
|
||||
if (this._connections.length <= 1) {
|
||||
// We need to show the automatic connection again
|
||||
// (or in the case of NMDeviceWired, we want to hide
|
||||
// the only explicit connection)
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
return this.device.connection_valid(connection);
|
||||
},
|
||||
|
||||
_connectionSortFunction: function(one, two) {
|
||||
if (one.timestamp == two.timestamp)
|
||||
return GLib.utf8_collate(one.name, two.name);
|
||||
|
||||
return two.timestamp - one.timestamp;
|
||||
},
|
||||
|
||||
setEnabled: function(enabled) {
|
||||
// do nothing by default, we want to keep the conneciton list visible
|
||||
// in the majority of cases (wired, wwan, vpn)
|
||||
// in the majority of cases (wired, wwan)
|
||||
},
|
||||
|
||||
getStatusLabel: function() {
|
||||
@ -500,15 +517,6 @@ const NMDevice = new Lang.Class({
|
||||
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
|
||||
},
|
||||
|
||||
_findConnection: function(uuid) {
|
||||
for (let i = 0; i < this._connections.length; i++) {
|
||||
let obj = this._connections[i];
|
||||
if (obj.uuid == uuid)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
},
|
||||
|
||||
_queueCreateSection: function() {
|
||||
this._clearSection();
|
||||
Main.queueDeferredWork(this._deferredWorkId);
|
||||
@ -652,8 +660,6 @@ const NMDevice = new Lang.Class({
|
||||
return out;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(NMDevice.prototype);
|
||||
|
||||
|
||||
const NMDeviceWired = new Lang.Class({
|
||||
Name: 'NMDeviceWired',
|
||||
@ -868,95 +874,6 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Not a real device, but I save a lot code this way
|
||||
const NMDeviceVPN = new Lang.Class({
|
||||
Name: 'NMDeviceVPN',
|
||||
Extends: NMDevice,
|
||||
|
||||
_init: function(client, device, connections) {
|
||||
// Disable autoconnections
|
||||
this._autoConnectionName = null;
|
||||
this.category = NMConnectionCategory.VPN;
|
||||
|
||||
this.parent(client, null, connections);
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
return connection._type == NetworkManager.SETTING_VPN_SETTING_NAME;
|
||||
},
|
||||
|
||||
get empty() {
|
||||
return this._connections.length == 0;
|
||||
},
|
||||
|
||||
get connected() {
|
||||
if (!this._activeConnection)
|
||||
return false;
|
||||
|
||||
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
if (this._stateChangeId)
|
||||
this._activeConnection.disconnect(this._stateChangeId);
|
||||
this._stateChangeId = 0;
|
||||
|
||||
this.parent(activeConnection);
|
||||
|
||||
if (this._activeConnection)
|
||||
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
|
||||
Lang.bind(this, this._connectionStateChanged));
|
||||
|
||||
this.emit('state-changed');
|
||||
},
|
||||
|
||||
_shouldShowConnectionList: function() {
|
||||
return true;
|
||||
},
|
||||
|
||||
deactivate: function() {
|
||||
if (this._activeConnection)
|
||||
this._client.deactivate_connection(this._activeConnection);
|
||||
},
|
||||
|
||||
getStatusLabel: function() {
|
||||
if (!this._activeConnection) // Same as DISCONNECTED
|
||||
return null;
|
||||
|
||||
switch(this._activeConnection.vpn_state) {
|
||||
case NetworkManager.VPNConnectionState.DISCONNECTED:
|
||||
case NetworkManager.VPNConnectionState.ACTIVATED:
|
||||
return null;
|
||||
case NetworkManager.VPNConnectionState.PREPARE:
|
||||
case NetworkManager.VPNConnectionState.CONNECT:
|
||||
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
|
||||
return _("connecting...");
|
||||
case NetworkManager.VPNConnectionState.NEED_AUTH:
|
||||
/* Translators: this is for network connections that require some kind of key or password */
|
||||
return _("authentication required");
|
||||
case NetworkManager.VPNConnectionState.FAILED:
|
||||
return _("connection failed");
|
||||
default:
|
||||
log('VPN connection state invalid, is %d'.format(this.device.state));
|
||||
return 'invalid';
|
||||
}
|
||||
},
|
||||
|
||||
_connectionStateChanged: function(connection, newstate, reason) {
|
||||
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
|
||||
// FIXME: if we ever want to show something based on reason,
|
||||
// we need to convert from NetworkManager.VPNConnectionStateReason
|
||||
// to NetworkManager.DeviceStateReason
|
||||
this.emit('activation-failed', reason);
|
||||
}
|
||||
|
||||
// Differently from real NMDevices, there is no need to queue
|
||||
// an update of the menu section, contents wouldn't change anyway
|
||||
this.emit('state-changed');
|
||||
}
|
||||
});
|
||||
|
||||
const NMDeviceWireless = new Lang.Class({
|
||||
Name: 'NMDeviceWireless',
|
||||
Extends: NMDevice,
|
||||
@ -1557,6 +1474,151 @@ const NMDeviceWireless = new Lang.Class({
|
||||
},
|
||||
});
|
||||
|
||||
const NMVPNSection = new Lang.Class({
|
||||
Name: 'NMVPNSection',
|
||||
Extends: NMConnectionBased,
|
||||
category: NMConnectionCategory.VPN,
|
||||
|
||||
_init: function(client, connections) {
|
||||
this.parent(connections);
|
||||
this._client = client;
|
||||
|
||||
this.section = new PopupMenu.PopupMenuSection();
|
||||
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
|
||||
},
|
||||
|
||||
get empty() {
|
||||
return this._connections.length == 0;
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
// filtering is done by NMApplet code
|
||||
return true;
|
||||
},
|
||||
|
||||
getStatusLabel: function(activeConnection) {
|
||||
switch(activeConnection.vpn_state) {
|
||||
case NetworkManager.VPNConnectionState.DISCONNECTED:
|
||||
case NetworkManager.VPNConnectionState.ACTIVATED:
|
||||
return null;
|
||||
case NetworkManager.VPNConnectionState.PREPARE:
|
||||
case NetworkManager.VPNConnectionState.CONNECT:
|
||||
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
|
||||
return _("connecting...");
|
||||
case NetworkManager.VPNConnectionState.NEED_AUTH:
|
||||
/* Translators: this is for network connections that require some kind of key or password */
|
||||
return _("authentication required");
|
||||
case NetworkManager.VPNConnectionState.FAILED:
|
||||
return _("connection failed");
|
||||
default:
|
||||
log('VPN connection state invalid, is %d'.format(this.device.state));
|
||||
return 'invalid';
|
||||
}
|
||||
},
|
||||
|
||||
clearActiveConnection: function(activeConnection) {
|
||||
let pos = this._findConnection(activeConnection.uuid);
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
let obj = this._connections[pos];
|
||||
obj.active.disconnect(obj.stateChangedId);
|
||||
obj.active = null;
|
||||
|
||||
if (obj.item) {
|
||||
obj.item.setToggleState(false);
|
||||
obj.item.setStatus(null);
|
||||
}
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
let pos = this._findConnection(activeConnection.uuid);
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
let obj = this._connections[pos];
|
||||
obj.active = activeConnection;
|
||||
obj.stateChangedId = obj.active.connect('vpn-state-changed',
|
||||
Lang.bind(this, this._connectionStateChanged));
|
||||
|
||||
if (obj.item) {
|
||||
obj.item.setToggleState(obj.active.vpn_state ==
|
||||
NetworkManager.VPNConnectionState.ACTIVATED);
|
||||
obj.item.setStatus(this.getStatusLabel(obj.active));
|
||||
}
|
||||
},
|
||||
|
||||
_queueCreateSection: function() {
|
||||
this.section.removeAll();
|
||||
Main.queueDeferredWork(this._deferredWorkId);
|
||||
},
|
||||
|
||||
_createConnectionItem: function(obj) {
|
||||
let menuItem = new PopupMenu.PopupSwitchMenuItem(obj.name, false,
|
||||
{ style_class: 'popup-subtitle-menu-item' });
|
||||
menuItem.connect('toggled', Lang.bind(this, function(menuItem) {
|
||||
if (menuItem.state) {
|
||||
this._client.activate_connection(obj.connection, null, null, null);
|
||||
// Immediately go back to disconnected, until NM tells us to change
|
||||
menuItem.setToggleState(false);
|
||||
} else if (obj.active) {
|
||||
this._client.deactivate_connection(obj.active);
|
||||
}
|
||||
}));
|
||||
|
||||
if (obj.active) {
|
||||
menuItem.setToggleState(obj.active.vpn_state ==
|
||||
NetworkManager.VPNConnectionState.ACTIVATED);
|
||||
menuItem.setStatus(this.getStatusLabel(obj.active));
|
||||
}
|
||||
|
||||
return menuItem;
|
||||
},
|
||||
|
||||
_createSection: function() {
|
||||
if (this._connections.length > 0) {
|
||||
this.section.actor.show();
|
||||
|
||||
for(let j = 0; j < this._connections.length; ++j) {
|
||||
let obj = this._connections[j];
|
||||
obj.item = this._createConnectionItem(obj);
|
||||
|
||||
if (j >= NUM_VISIBLE_NETWORKS) {
|
||||
if (!this._overflowItem) {
|
||||
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
|
||||
this.section.addMenuItem(this._overflowItem);
|
||||
}
|
||||
this._overflowItem.menu.addMenuItem(obj.item);
|
||||
} else
|
||||
this.section.addMenuItem(obj.item);
|
||||
}
|
||||
} else {
|
||||
this.section.actor.hide()
|
||||
}
|
||||
},
|
||||
|
||||
_connectionStateChanged: function(vpnConnection, newstate, reason) {
|
||||
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
|
||||
// FIXME: if we ever want to show something based on reason,
|
||||
// we need to convert from NetworkManager.VPNConnectionStateReason
|
||||
// to NetworkManager.DeviceStateReason
|
||||
this.emit('activation-failed', reason);
|
||||
}
|
||||
|
||||
let pos = this._findConnection(vpnConnection.uuid);
|
||||
if (pos >= 0) {
|
||||
let obj = this._connections[pos];
|
||||
if (obj.item) {
|
||||
obj.item.setToggleState(vpnConnection.vpn_state ==
|
||||
NetworkManager.VPNConnectionState.ACTIVATED);
|
||||
obj.item.setStatus(this.getStatusLabel(vpnConnection));
|
||||
}
|
||||
} else {
|
||||
log('Could not find connection for vpn-state-changed handler');
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const NMApplet = new Lang.Class({
|
||||
Name: 'NMApplet',
|
||||
Extends: PanelMenu.SystemStatusButton,
|
||||
@ -1622,15 +1684,9 @@ const NMApplet = new Lang.Class({
|
||||
this.menu.addMenuItem(this._devices.wwan.section);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._devices.vpn = {
|
||||
section: new PopupMenu.PopupMenuSection(),
|
||||
device: this._makeWrapperDevice(NMDeviceVPN, null),
|
||||
item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
|
||||
};
|
||||
this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
|
||||
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
|
||||
this._devices.vpn.section.actor.hide();
|
||||
this.menu.addMenuItem(this._devices.vpn.section);
|
||||
this._vpnSection = new NMVPNSection(this._client, this._connections);
|
||||
this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
|
||||
this.menu.addMenuItem(this._vpnSection.section);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
|
||||
|
||||
@ -1699,18 +1755,6 @@ const NMApplet = new Lang.Class({
|
||||
},
|
||||
|
||||
_syncSectionTitle: function(category) {
|
||||
if (category == NMConnectionCategory.VPN) {
|
||||
// Special case VPN: it's only one device (and a fake one
|
||||
// actually), and we don't show it if empty
|
||||
let device = this._devices.vpn.device;
|
||||
let section = this._devices.vpn.section;
|
||||
let item = this._devices.vpn.item;
|
||||
|
||||
section.actor.visible = !device.empty;
|
||||
item.updateForDevice(device);
|
||||
return;
|
||||
}
|
||||
|
||||
let devices = this._devices[category].devices;
|
||||
let item = this._devices[category].item;
|
||||
let section = this._devices[category].section;
|
||||
@ -1758,17 +1802,20 @@ const NMApplet = new Lang.Class({
|
||||
this._source.notify(device._notification);
|
||||
},
|
||||
|
||||
_onActivationFailed: function(device, reason) {
|
||||
// XXX: nm-applet has no special text depending on reason
|
||||
// but I'm not sure of this generic message
|
||||
this._notifyForDevice(device, 'network-error-symbolic',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
},
|
||||
|
||||
_makeWrapperDevice: function(wrapperClass, device) {
|
||||
let wrapper = new wrapperClass(this._client, device, this._connections);
|
||||
|
||||
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
|
||||
// XXX: nm-applet has no special text depending on reason
|
||||
// but I'm not sure of this generic message
|
||||
this._notifyForDevice(device, 'network-error-symbolic',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
}));
|
||||
wrapper._activationFailedId = wrapper.connect('activation-failed',
|
||||
Lang.bind(this, this._onActivationFailed));
|
||||
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
|
||||
this._syncSectionTitle(dev.category);
|
||||
}));
|
||||
@ -1851,7 +1898,7 @@ const NMApplet = new Lang.Class({
|
||||
for (let i = 0; i < closedConnections.length; i++) {
|
||||
let active = closedConnections[i];
|
||||
if (active._primaryDevice) {
|
||||
active._primaryDevice.setActiveConnection(null);
|
||||
active._primaryDevice.clearActiveConnection(active);
|
||||
active._primaryDevice = null;
|
||||
}
|
||||
if (active._inited) {
|
||||
@ -1918,7 +1965,7 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
}
|
||||
} else
|
||||
a._primaryDevice = this._devices.vpn.device
|
||||
a._primaryDevice = this._vpnSection;
|
||||
|
||||
if (a._primaryDevice)
|
||||
a._primaryDevice.setActiveConnection(a);
|
||||
@ -2000,8 +2047,7 @@ const NMApplet = new Lang.Class({
|
||||
let section = connection._section;
|
||||
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
this._devices.vpn.device.removeConnection(connection);
|
||||
this._syncSectionTitle(section);
|
||||
this._vpnSection.removeConnection(connection);
|
||||
} else if (section != NMConnectionCategory.INVALID) {
|
||||
let devices = this._devices[section].devices;
|
||||
for (let i = 0; i < devices.length; i++)
|
||||
@ -2024,8 +2070,7 @@ const NMApplet = new Lang.Class({
|
||||
if (section == NMConnectionCategory.INVALID)
|
||||
return;
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
this._devices.vpn.device.checkConnection(connection);
|
||||
this._syncSectionTitle(section);
|
||||
this._vpnSection.checkConnection(connection);
|
||||
} else {
|
||||
let devices = this._devices[section].devices;
|
||||
for (let i = 0; i < devices.length; i++) {
|
||||
@ -2051,7 +2096,6 @@ const NMApplet = new Lang.Class({
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRED);
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRELESS);
|
||||
this._syncSectionTitle(NMConnectionCategory.WWAN);
|
||||
this._syncSectionTitle(NMConnectionCategory.VPN);
|
||||
},
|
||||
|
||||
_syncNMState: function() {
|
||||
|
@ -96,7 +96,7 @@ const Indicator = new Lang.Class({
|
||||
let minutes = time % 60;
|
||||
let hours = Math.floor(time / 60);
|
||||
let timestring;
|
||||
if (time > 60) {
|
||||
if (time >= 60) {
|
||||
if (minutes == 0) {
|
||||
timestring = ngettext("%d hour remaining", "%d hours remaining", hours).format(hours);
|
||||
} else {
|
||||
|
@ -66,7 +66,21 @@ const VolumeMenu = new Lang.Class({
|
||||
this._onControlStateChanged();
|
||||
},
|
||||
|
||||
scroll: function(direction) {
|
||||
toggleMute: function(quiet) {
|
||||
let muted = this._output.is_muted;
|
||||
this._output.change_is_muted(!muted);
|
||||
|
||||
if (muted && !quiet)
|
||||
this._notifyVolumeChange();
|
||||
|
||||
if (!muted)
|
||||
return ['audio-volume-muted-symbolic', 0];
|
||||
else
|
||||
return [this._volumeToIcon(this._output.volume),
|
||||
this._output.volume / this._volumeMax];
|
||||
},
|
||||
|
||||
scroll: function(direction, quiet) {
|
||||
let currentVolume = this._output.volume;
|
||||
|
||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||
@ -85,7 +99,14 @@ const VolumeMenu = new Lang.Class({
|
||||
this._output.push_volume();
|
||||
}
|
||||
|
||||
this._notifyVolumeChange();
|
||||
if (!quiet)
|
||||
this._notifyVolumeChange();
|
||||
|
||||
if (this._output.is_muted)
|
||||
return ['audio-volume-muted-symbolic', 0];
|
||||
else
|
||||
return [this._volumeToIcon(this._output.volume),
|
||||
this._output.volume / this._volumeMax];
|
||||
},
|
||||
|
||||
_onControlStateChanged: function() {
|
||||
@ -221,14 +242,14 @@ const Indicator = new Lang.Class({
|
||||
this.parent('audio-volume-muted-symbolic', _("Volume"));
|
||||
|
||||
this._control = getMixerControl();
|
||||
this._volumeMenu = new VolumeMenu(this._control);
|
||||
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
|
||||
this.volumeMenu = new VolumeMenu(this._control);
|
||||
this.volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
|
||||
this._hasPulseAudio = (icon != null);
|
||||
this.setIcon(icon);
|
||||
this._syncVisibility();
|
||||
}));
|
||||
|
||||
this.menu.addMenuItem(this._volumeMenu);
|
||||
this.menu.addMenuItem(this.volumeMenu);
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
|
||||
@ -242,6 +263,6 @@ const Indicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_onScrollEvent: function(actor, event) {
|
||||
this._volumeMenu.scroll(event.get_scroll_direction());
|
||||
}
|
||||
this.volumeMenu.scroll(event.get_scroll_direction(), false);
|
||||
},
|
||||
});
|
||||
|
@ -151,6 +151,9 @@ const UnlockDialog = new Lang.Class({
|
||||
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
|
||||
this.setInitialKeyFocus(this._promptEntry);
|
||||
this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
|
||||
this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
|
||||
this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
|
||||
}));
|
||||
|
||||
this._promptLayout.add(this._promptEntry,
|
||||
{ expand: true,
|
||||
@ -203,14 +206,22 @@ const UnlockDialog = new Lang.Class({
|
||||
_updateSensitivity: function(sensitive) {
|
||||
this._promptEntry.reactive = sensitive;
|
||||
this._promptEntry.clutter_text.editable = sensitive;
|
||||
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
|
||||
},
|
||||
|
||||
_updateOkButtonSensitivity: function(sensitive) {
|
||||
this._okButton.button.reactive = sensitive;
|
||||
this._okButton.button.can_focus = sensitive;
|
||||
},
|
||||
|
||||
_showMessage: function(userVerifier, message, styleClass) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
if (message) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
} else {
|
||||
GdmUtil.fadeOutActor(this._promptMessage);
|
||||
}
|
||||
},
|
||||
|
||||
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||
@ -278,6 +289,7 @@ const UnlockDialog = new Lang.Class({
|
||||
this._currentQuery = null;
|
||||
this._firstQuestion = true;
|
||||
|
||||
this._promptEntry.text = '';
|
||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||
this._promptEntry.menu.isPassword = true;
|
||||
|
||||
|
@ -26,6 +26,7 @@ const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
|
||||
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
|
||||
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
||||
const LOCK_ENABLED_KEY = 'lock-enabled';
|
||||
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
||||
|
||||
const DIALOG_ICON_SIZE = 64;
|
||||
|
||||
@ -187,7 +188,7 @@ const IMStatusChooserItem = new Lang.Class({
|
||||
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.IDLE);
|
||||
|
||||
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic');
|
||||
item = new IMStatusItem(_("Offline"), 'user-offline-symbolic');
|
||||
this._combo.addMenuItem(item, IMStatus.OFFLINE);
|
||||
|
||||
this._combo.connect('active-item-changed',
|
||||
@ -571,6 +572,7 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
this._updateHaveShutdown();
|
||||
this._updateHaveSuspend();
|
||||
this._updateHaveHibernate();
|
||||
}));
|
||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||
Lang.bind(this, this._updateHaveShutdown));
|
||||
@ -616,10 +618,13 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
_updateLogout: function() {
|
||||
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
|
||||
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
|
||||
let systemAccount = this._user.system_account;
|
||||
let localAccount = this._user.local_account;
|
||||
let multiUser = this._userManager.has_multiple_users;
|
||||
let multiSession = Gdm.get_session_ids().length > 1;
|
||||
|
||||
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession);
|
||||
this._logoutItem.actor.visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount);
|
||||
},
|
||||
|
||||
_updateLockScreen: function() {
|
||||
@ -651,6 +656,13 @@ const UserMenuButton = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_updateHaveHibernate: function() {
|
||||
this._loginManager.canHibernate(Lang.bind(this,
|
||||
function(result) {
|
||||
this._haveHibernate = result;
|
||||
}));
|
||||
},
|
||||
|
||||
_updateSuspendOrPowerOff: function() {
|
||||
if (!this._suspendOrPowerOffItem)
|
||||
return;
|
||||
@ -748,7 +760,7 @@ const UserMenuButton = new Lang.Class({
|
||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("System Settings"));
|
||||
item = new PopupMenu.PopupMenuItem(_("Settings"));
|
||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
this._systemSettings = item;
|
||||
@ -762,7 +774,7 @@ const UserMenuButton = new Lang.Class({
|
||||
this._loginScreenItem = item;
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("Log Out"));
|
||||
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
|
||||
item.connect('activate', Lang.bind(this, this.logOut));
|
||||
this.menu.addMenuItem(item);
|
||||
this._logoutItem = item;
|
||||
|
||||
@ -831,7 +843,7 @@ const UserMenuButton = new Lang.Class({
|
||||
Gdm.goto_login_session_sync(null);
|
||||
},
|
||||
|
||||
_onQuitSessionActivate: function() {
|
||||
logOut: function() {
|
||||
Main.overview.hide();
|
||||
this._session.LogoutRemote(0);
|
||||
},
|
||||
@ -843,25 +855,60 @@ const UserMenuButton = new Lang.Class({
|
||||
this._session.RebootRemote();
|
||||
},
|
||||
|
||||
shutdown: function() {
|
||||
this._session.ShutdownRemote();
|
||||
},
|
||||
|
||||
suspend: function() {
|
||||
if (!this._haveSuspend)
|
||||
return false;
|
||||
|
||||
// Ensure we only suspend after locking the screen
|
||||
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
||||
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
||||
Main.screenShield.disconnect(tmpId);
|
||||
|
||||
this._loginManager.suspend();
|
||||
}));
|
||||
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
Main.screenShield.lock(true);
|
||||
} else {
|
||||
this._loginManager.suspend();
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
hibernate: function() {
|
||||
if (!this._haveHibernate)
|
||||
return false;
|
||||
|
||||
// Ensure we only suspend after locking the screen
|
||||
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
||||
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
||||
Main.screenShield.disconnect(tmpId);
|
||||
|
||||
this._loginManager.hibernate();
|
||||
}));
|
||||
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
Main.screenShield.lock(true);
|
||||
} else {
|
||||
this._loginManager.hibernate();
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
_onSuspendOrPowerOffActivate: function() {
|
||||
Main.overview.hide();
|
||||
|
||||
if (this._haveShutdown &&
|
||||
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
|
||||
this._session.ShutdownRemote();
|
||||
this.shutdown();
|
||||
} else {
|
||||
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
||||
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
||||
Main.screenShield.disconnect(tmpId);
|
||||
|
||||
this._loginManager.suspend();
|
||||
}));
|
||||
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
Main.screenShield.lock(true);
|
||||
} else {
|
||||
this._loginManager.suspend();
|
||||
}
|
||||
this.suspend();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -196,7 +196,7 @@ const ViewSelector = new Lang.Class({
|
||||
})
|
||||
});;
|
||||
this._pageArea.add_actor(page);
|
||||
return page
|
||||
return page;
|
||||
},
|
||||
|
||||
_showPage: function(page) {
|
||||
|
@ -39,6 +39,8 @@ const WindowAttentionHandler = new Lang.Class({
|
||||
let [title, banner] = this._getTitleAndBanner(app, window);
|
||||
|
||||
let notification = new MessageTray.Notification(source, title, banner);
|
||||
notification.setForFeedback(true);
|
||||
|
||||
source.notify(notification);
|
||||
|
||||
source.signalIDs.push(window.connect('notify::title', Lang.bind(this, function() {
|
||||
|
@ -12,6 +12,7 @@ const AltTab = imports.ui.altTab;
|
||||
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
||||
const Main = imports.ui.main;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
||||
const WINDOW_ANIMATION_TIME = 0.25;
|
||||
@ -101,32 +102,32 @@ const WindowManager = new Lang.Class({
|
||||
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
|
||||
|
||||
this._workspaceSwitcherPopup = null;
|
||||
Meta.keybindings_set_custom_handler('switch-to-workspace-left',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-left',
|
||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-right',
|
||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-up',
|
||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-down',
|
||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-left',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-to-workspace-right',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-right',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-to-workspace-up',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-up',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-to-workspace-down',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-down',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('move-to-workspace-left',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('move-to-workspace-right',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('move-to-workspace-up',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('move-to-workspace-down',
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-windows',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-windows',
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-group',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-group',
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-windows-backward',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-windows-backward',
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-group-backward',
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-group-backward',
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
Meta.keybindings_set_custom_handler('switch-panels',
|
||||
Lang.bind(this, this._startA11ySwitcher));
|
||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-panels',
|
||||
Util.wrapKeybinding(Lang.bind(this, this._startA11ySwitcher), true));
|
||||
global.display.add_keybinding('open-application-menu',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
@ -552,30 +553,32 @@ const WindowManager = new Lang.Class({
|
||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
||||
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
|
||||
tabPopup.destroy();
|
||||
return true;
|
||||
},
|
||||
|
||||
_startA11ySwitcher : function(display, screen, window, binding) {
|
||||
let modifiers = binding.get_modifiers();
|
||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
||||
Main.ctrlAltTabManager.popup(backwards, binding.get_mask());
|
||||
return true;
|
||||
},
|
||||
|
||||
_openAppMenu : function(display, screen, window, event, binding) {
|
||||
Main.panel.openAppMenu();
|
||||
return true;
|
||||
},
|
||||
|
||||
_showWorkspaceSwitcher : function(display, screen, window, binding) {
|
||||
if (screen.n_workspaces == 1)
|
||||
return;
|
||||
return false;
|
||||
|
||||
let [action,,,direction] = binding.get_name().split('-');
|
||||
let [,,action,,,direction] = binding.get_name().split('-');
|
||||
let direction = Meta.MotionDirection[direction.toUpperCase()];
|
||||
let newWs;
|
||||
|
||||
|
||||
if (direction != Meta.MotionDirection.UP &&
|
||||
direction != Meta.MotionDirection.DOWN)
|
||||
return;
|
||||
return false;
|
||||
|
||||
if (action == 'switch')
|
||||
newWs = this.actionMoveWorkspace(direction);
|
||||
@ -591,6 +594,8 @@ const WindowManager = new Lang.Class({
|
||||
}
|
||||
this._workspaceSwitcherPopup.display(direction, newWs.index());
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
actionMoveWorkspace: function(direction) {
|
||||
|
@ -159,6 +159,24 @@ const WindowClone = new Lang.Class({
|
||||
this._selected = false;
|
||||
},
|
||||
|
||||
get slot() {
|
||||
let x, y, w, h;
|
||||
|
||||
if (this.inDrag) {
|
||||
x = this.dragOrigX;
|
||||
y = this.dragOrigY;
|
||||
w = this.actor.width * this.dragOrigScale;
|
||||
h = this.actor.height * this.dragOrigScale;
|
||||
} else {
|
||||
x = this.actor.x;
|
||||
y = this.actor.y;
|
||||
w = this.actor.width * this.actor.scale_x;
|
||||
h = this.actor.height * this.actor.scale_y;
|
||||
}
|
||||
|
||||
return [x, y, w, h];
|
||||
},
|
||||
|
||||
setStackAbove: function (actor) {
|
||||
this._stackAbove = actor;
|
||||
if (this.inDrag || this._zooming)
|
||||
@ -435,6 +453,11 @@ const WindowOverlay = new Lang.Class({
|
||||
this._updateCaptionId = metaWindow.connect('notify::title',
|
||||
Lang.bind(this, function(w) {
|
||||
this.title.text = w.title;
|
||||
// we need this for the next call to get_preferred_width
|
||||
// to return useful results
|
||||
this.title.set_size(-1, -1);
|
||||
|
||||
this._repositionSelf();
|
||||
}));
|
||||
|
||||
let button = new St.Button({ style_class: 'window-close' });
|
||||
@ -501,6 +524,11 @@ const WindowOverlay = new Lang.Class({
|
||||
this.title.height + this.title._spacing];
|
||||
},
|
||||
|
||||
_repositionSelf: function() {
|
||||
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
||||
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
|
||||
},
|
||||
|
||||
/**
|
||||
* @cloneX: x position of windowClone
|
||||
* @cloneY: y position of windowClone
|
||||
@ -538,9 +566,8 @@ const WindowOverlay = new Lang.Class({
|
||||
else
|
||||
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
|
||||
|
||||
if (!title.fullWidth)
|
||||
title.fullWidth = title.width;
|
||||
let titleWidth = Math.min(title.fullWidth, cloneWidth);
|
||||
let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1);
|
||||
let titleWidth = Math.max(titleMinWidth, Math.min(titleNatWidth, cloneWidth));
|
||||
|
||||
let titleX = cloneX + (cloneWidth - titleWidth) / 2;
|
||||
let titleY = cloneY + cloneHeight + title._spacing;
|
||||
|
@ -1 +1,19 @@
|
||||
dist_man_MANS = gnome-shell.1
|
||||
XSLTPROC_FLAGS = \
|
||||
--nonet \
|
||||
--stringparam man.output.quietly 1 \
|
||||
--stringparam funcsynopsis.style ansi \
|
||||
--stringparam man.th.extra1.suppress 1 \
|
||||
--stringparam man.authors.section.enabled 0 \
|
||||
--stringparam man.copyright.section.enabled 0
|
||||
|
||||
.xml.1:
|
||||
$(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
|
||||
|
||||
man_MANS = \
|
||||
gnome-shell.1
|
||||
|
||||
xml_files = $(man_MANS:.1=.xml)
|
||||
|
||||
EXTRA_DIST = $(xml_files)
|
||||
|
||||
DISTCLEANFILES = $(man_MANS)
|
||||
|
@ -1,94 +0,0 @@
|
||||
.\" Copyright (c) 2009, Marcelo Jorge Vieira (metal) <metal@alucinados.com>
|
||||
.\"
|
||||
.\" This is free documentation; you can redistribute it and/or
|
||||
.\" modify it under the terms of the GNU General Public License as
|
||||
.\" published by the Free Software Foundation; either version 2 of
|
||||
.\" the License, or (at your option) any later version.
|
||||
.\"
|
||||
.\" The GNU General Public License's references to "object code"
|
||||
.\" and "executables" are to be interpreted as the output of any
|
||||
.\" document formatting or typesetting system, including
|
||||
.\" intermediate and printed output.
|
||||
.\"
|
||||
.\" This manual is distributed in the hope that it will be useful,
|
||||
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
.\" GNU General Public License for more details.
|
||||
.\"
|
||||
.\" You should have received a copy of the GNU General Public
|
||||
.\" License along with this manual; if not, write to the Free
|
||||
.\" Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
.\" Boston, MA 02111-1301 USA.
|
||||
.TH GNOME-SHELL 1
|
||||
.SH NAME
|
||||
gnome-shell \- Graphical shell for the GNOME desktop
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B gnome-shell [options]
|
||||
|
||||
.SH DESCRIPTION
|
||||
GNOME Shell provides core user interface functions for the GNOME 3
|
||||
desktop, like switching to windows and launching applications. GNOME
|
||||
Shell takes advantage of the capabilities of modern graphics hardware
|
||||
and introduces innovative user interface concepts to provide a
|
||||
visually attractive and easy to use experience.
|
||||
|
||||
.SH OPTIONS
|
||||
|
||||
.TP
|
||||
.B \-\-replace
|
||||
Replace the running window manager
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-sm-disable
|
||||
Disable connection to the session manager
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-sm-client-id=ID
|
||||
Specify session management ID
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-sm-save-file=FILE
|
||||
Initialize session from savefile
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-screen=SCREEN
|
||||
X screen to use
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-d, \-\-display=DISPLAY
|
||||
X display to use
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-sync
|
||||
Make X calls synchronous
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-version
|
||||
Print version and exit
|
||||
.br
|
||||
|
||||
.TP
|
||||
.B \-\-help
|
||||
Display help and exit
|
||||
.br
|
||||
|
||||
.SH BUGS
|
||||
The bug tracker can be reached by visiting the website
|
||||
\fIhttps://bugzilla.gnome.org/buglist.cgi?product=gnome-shell\fR
|
||||
|
||||
Before sending a bug report, please verify that you have the latest
|
||||
version of gnome-shell. Many bugs (major and minor) are fixed at each
|
||||
release, and if yours is out of date, the problem may already have
|
||||
been solved.
|
||||
|
||||
.SH ADDITIONAL INFORMATION
|
||||
|
||||
For further information, visit the website \fIhttp://live.gnome.org/GnomeShell\fR
|
159
man/gnome-shell.xml
Normal file
159
man/gnome-shell.xml
Normal file
@ -0,0 +1,159 @@
|
||||
<?xml version='1.0'?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||||
|
||||
<refentry id="gnome-shell">
|
||||
|
||||
<refentryinfo>
|
||||
<title>gnome-shell</title>
|
||||
<productname>gnome-shell</productname>
|
||||
|
||||
<authorgroup>
|
||||
<author>
|
||||
<contrib>wrote the original gnome-shell man page</contrib>
|
||||
<firstname>Marcelo Jorge</firstname>
|
||||
<surname>Vieira</surname>
|
||||
<email>metal@alucinados.com</email>
|
||||
</author>
|
||||
</authorgroup>
|
||||
|
||||
</refentryinfo>
|
||||
|
||||
<refmeta>
|
||||
<refentrytitle>gnome-shell</refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>gnome-shell</refname>
|
||||
<refpurpose>Graphical shell for the GNOME desktop</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>gnome-shell <arg choice="opt" rep="repeat">OPTION</arg></command>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>GNOME shell provides core user
|
||||
interface functions for the GNOME 3 desktop, like switching
|
||||
to windows and launching applications. GNOME shell takes
|
||||
advantage of the capabilities of modern graphics hardware
|
||||
and introduces innovative user interface concepts to provide
|
||||
a visually attractive and easy to use experience.</para>
|
||||
|
||||
<para>gnome-shell is a required component of
|
||||
the GNOME desktop, i.e. it is listed in the
|
||||
RequiredComponents field of
|
||||
<filename>/usr/share/gnome-session/sessions/gnome.session</filename>.
|
||||
It is started in the window manager phase of the session.
|
||||
</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Options</title>
|
||||
|
||||
<variablelist>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-r</option>, <option>--replace</option></term>
|
||||
|
||||
<listitem><para>Replace the running window manager</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--sm-disable</option></term>
|
||||
|
||||
<listitem><para>Disable connection to the session manager</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--sm-client-id=<replaceable>ID</replaceable></option></term>
|
||||
|
||||
<listitem><para>Specify session management <replaceable>ID</replaceable></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--sm-save-file=<replaceable>FILE</replaceable></option></term>
|
||||
|
||||
<listitem><para>Initialize session from <replaceable>FILE</replaceable></para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--screen=<replaceable>SCREEN</replaceable></option></term>
|
||||
|
||||
<listitem><para>X screen to use</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>-d</option>, <option>--display=<replaceable>DISPLAY</replaceable></option></term>
|
||||
|
||||
<listitem><para>X Display to use</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--sync</option></term>
|
||||
|
||||
<listitem><para>Make X calls synchronous</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--version</option></term>
|
||||
|
||||
<listitem><para>Print version and exit</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--help</option></term>
|
||||
|
||||
<listitem><para>Display help and exit</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--mode=<replaceable>MODE</replaceable></option></term>
|
||||
|
||||
<listitem><para>Use a specific mode, e.g. "gdm" for login screen</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--list-modes</option></term>
|
||||
|
||||
<listitem><para>List possible modes and exit</para></listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Files</title>
|
||||
|
||||
<para>
|
||||
<filename>/usr/share/gnome-session/sessions/gnome.session</filename>,
|
||||
<filename>/usr/share/applications/gnome-shell.desktop</filename>.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Bugs</title>
|
||||
|
||||
<para>The bug tracker can be reached by visiting the
|
||||
website <ulink url="https://bugzilla.gnome.org/buglist.cgi?product=gnome-shell">https://bugzilla.gnome.org/buglist.cgi?product=gnome-shell</ulink>.
|
||||
Before sending a bug report, please verify that you have
|
||||
the latest version of gnome-shell. Many bugs (major and
|
||||
minor) are fixed at each release, and if yours is out of
|
||||
date, the problem may already have been solved.</para>
|
||||
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Additional Information</title>
|
||||
|
||||
<para>For further information, visit the website
|
||||
<ulink url="http://live.gnome.org/GnomeShell">http://live.gnome.org/GnomeShell</ulink>.</para>
|
||||
</refsect1>
|
||||
|
||||
</refentry>
|
194
po/de.po
194
po/de.po
@ -19,9 +19,9 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-10-14 16:48+0000\n"
|
||||
"PO-Revision-Date: 2012-10-10 23:10+0100\n"
|
||||
"Last-Translator: Tobias Endrigkeit <tobiasendrigkeit@googlemail.com>\n"
|
||||
"POT-Creation-Date: 2012-11-06 04:39+0000\n"
|
||||
"PO-Revision-Date: 2012-11-06 20:04+0100\n"
|
||||
"Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -148,56 +148,68 @@ msgstr ""
|
||||
"Aufzählung entnommen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr "Den Menüeintrag »Abmelden« immer im Benutzermenü anzeigen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
msgstr ""
|
||||
"Dieser Schlüssel überschreibt das automatische Verbergen des Menüeintrags "
|
||||
"»Abmelden« in Einzelbenutzer, Einzelsitzungssituationen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Wochentag im Kalender anzeigen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr ""
|
||||
"Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr ""
|
||||
"Tastenkombination zum Umschalten der Sichtbarkeit des Benachrichtigungsfeldes"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr ""
|
||||
"Tastenkombination zum Umschalten der Sichtbarkeit des "
|
||||
"Benachrichtigungsfeldes."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Tastenkombination zum Umschalten des Bildschirmaufzeichners"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr ""
|
||||
"Tastenkombination zum Starten/Entfernen des eingebauten "
|
||||
"Bildschirmaufzeichners."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Zu verwendende Tastatur"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Der Typ der zu verwendenden Tastatur"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@ -206,11 +218,11 @@ msgstr ""
|
||||
"der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde."
|
||||
|
||||
# hmm Enkodieren oder Kodieren?
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -238,11 +250,11 @@ msgstr ""
|
||||
"aufzeichnet. %T wird als Platzhalter für die vermutete optimale Thread-"
|
||||
"Anzahl auf dem System verwendet."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Die Dateiendung zum Speichern des Screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -303,8 +315,8 @@ msgstr "Anmeldefenster"
|
||||
msgid "Power"
|
||||
msgstr "Ausschalten"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
|
||||
#: ../js/ui/userMenu.js:775
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:779
|
||||
msgid "Suspend"
|
||||
msgstr "Bereitschaft"
|
||||
|
||||
@ -312,8 +324,8 @@ msgstr "Bereitschaft"
|
||||
msgid "Restart"
|
||||
msgstr "Neu starten"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
|
||||
#: ../js/ui/userMenu.js:774
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Power Off"
|
||||
msgstr "Ausschalten"
|
||||
|
||||
@ -698,35 +710,35 @@ msgstr "Stumm"
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/components/telepathyClient.js:948
|
||||
#: ../js/ui/components/telepathyClient.js:952
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Gesendet am <b>%A</b> um <b>%X</b> "
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/components/telepathyClient.js:954
|
||||
#: ../js/ui/components/telepathyClient.js:958
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Gesendet am <b>%A</b>, <b>%d. %B</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/components/telepathyClient.js:959
|
||||
#: ../js/ui/components/telepathyClient.js:963
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Gesendet am <b>%A</b>, <b>%d. %B</b> %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#: ../js/ui/components/telepathyClient.js:992
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s heißt jetzt %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1092
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Einladung zum Betreten von %s"
|
||||
@ -734,42 +746,42 @@ msgstr "Einladung zum Betreten von %s"
|
||||
#. 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
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s lädt Sie ein, %s beizutreten"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
#: ../js/ui/components/telepathyClient.js:1102
|
||||
#: ../js/ui/components/telepathyClient.js:1181
|
||||
#: ../js/ui/components/telepathyClient.js:1244
|
||||
msgid "Decline"
|
||||
msgstr "Ablehnen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
#: ../js/ui/components/telepathyClient.js:1103
|
||||
#: ../js/ui/components/telepathyClient.js:1182
|
||||
#: ../js/ui/components/telepathyClient.js:1245
|
||||
msgid "Accept"
|
||||
msgstr "Annehmen"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1133
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Video-Anruf von %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1136
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Anruf von %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1141
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Abweisen"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1143
|
||||
msgid "Answer"
|
||||
msgstr "Antworten"
|
||||
|
||||
@ -778,113 +790,113 @@ msgstr "Antworten"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1175
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s sendet Ihnen %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1210
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s bittet um das Recht, Ihre Online-Verfügbarkeit sehen zu dürfen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
msgid "Network error"
|
||||
msgstr "Netzwerkfehler"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
msgid "Authentication failed"
|
||||
msgstr "Legitimierung fehlgeschlagen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
msgid "Encryption error"
|
||||
msgstr "Verschlüsselungsfehler"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Zertifikat wurde nicht bereitgestellt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Zertifikat nicht vertrauenswürdig"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
msgid "Certificate expired"
|
||||
msgstr "Zertifikat abgelaufen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Zertifikat nicht aktiviert"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Rechnername des Zertifikats stimmt nicht überein"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Fingerabdruck des Zertifikats stimmt nicht überein"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Selbstsigniertes Zertifikat"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Der Status ist auf »Abgemeldet« gesetzt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Verschlüsselung ist nicht verfügbar"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Zertifikat ist ungültig"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Verbindungsaufbau wurde verweigert"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Verbindung kann nicht hergestellt werden"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Verbindung wurde unterbrochen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Dieses Konto ist bereits mit dem Server verbunden"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"Die Verbindung wurde durch eine neue Verbindung mit der gleichen Ressource "
|
||||
"ersetzt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Dieses Konto ist bereits auf dem Server vorhanden"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr ""
|
||||
"Der Server ist derzeit überlastet und kann die Verbindung nicht annehmen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Zertifikat wurde zurückgezogen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Das Zertifikat verwendet einen unsicheren Chiffrier-Algorithmus oder ist "
|
||||
"kryptografisch schwach"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -893,26 +905,26 @@ msgstr ""
|
||||
"überschreiten die durch die kryptografische Bibliothek gegebenen "
|
||||
"Beschränkungen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Internal error"
|
||||
msgstr "Interner Fehler"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Verbindung zu %s ist fehlgeschlagen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1367
|
||||
msgid "Reconnect"
|
||||
msgstr "Erneut verbinden"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Edit account"
|
||||
msgstr "Konto bearbeiten"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1409
|
||||
#: ../js/ui/components/telepathyClient.js:1413
|
||||
msgid "Unknown reason"
|
||||
msgstr "Unbekannter Grund"
|
||||
|
||||
@ -1095,23 +1107,23 @@ msgstr "Quelle zeigen"
|
||||
msgid "Web Page"
|
||||
msgstr "Webseite"
|
||||
|
||||
#: ../js/ui/messageTray.js:1081
|
||||
#: ../js/ui/messageTray.js:1084
|
||||
msgid "Open"
|
||||
msgstr "Öffnen"
|
||||
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
#: ../js/ui/messageTray.js:1091
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: ../js/ui/messageTray.js:1540
|
||||
#: ../js/ui/messageTray.js:1543
|
||||
msgid "Message Tray"
|
||||
msgstr "Benachrichtigungsfeld"
|
||||
|
||||
#: ../js/ui/messageTray.js:2547
|
||||
#: ../js/ui/messageTray.js:2549
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformationen"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
@ -1171,18 +1183,18 @@ msgstr "Bitte geben Sie einen Befehl ein:"
|
||||
# %B - ausgeschriebener Name des Monats, abhängig von der gesetzten Umgebung
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d. %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:143
|
||||
#: ../js/ui/screenShield.js:144
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "%d neue Nachricht"
|
||||
msgstr[1] "%d neue Nachrichten"
|
||||
|
||||
#: ../js/ui/screenShield.js:145
|
||||
#: ../js/ui/screenShield.js:146
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
@ -1638,59 +1650,59 @@ msgstr "Mikrofon"
|
||||
msgid "Log in as another user"
|
||||
msgstr "Als anderer Benutzer anmelden"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Available"
|
||||
msgstr "Verfügbar"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Busy"
|
||||
msgstr "Beschäftigt"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Invisible"
|
||||
msgstr "Unsichtbar"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Away"
|
||||
msgstr "Abwesend"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Idle"
|
||||
msgstr "Untätig"
|
||||
|
||||
#: ../js/ui/userMenu.js:195
|
||||
#: ../js/ui/userMenu.js:196
|
||||
msgid "Unavailable"
|
||||
msgstr "Nicht verfügbar"
|
||||
|
||||
#: ../js/ui/userMenu.js:740
|
||||
#: ../js/ui/userMenu.js:744
|
||||
msgid "Notifications"
|
||||
msgstr "Benachrichtigungen"
|
||||
|
||||
#: ../js/ui/userMenu.js:748
|
||||
#: ../js/ui/userMenu.js:752
|
||||
msgid "System Settings"
|
||||
msgstr "Systemeinstellungen"
|
||||
|
||||
#: ../js/ui/userMenu.js:756
|
||||
#: ../js/ui/userMenu.js:760
|
||||
msgid "Switch User"
|
||||
msgstr "Benutzer wechseln"
|
||||
|
||||
#: ../js/ui/userMenu.js:761
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Log Out"
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: ../js/ui/userMenu.js:766
|
||||
#: ../js/ui/userMenu.js:770
|
||||
msgid "Lock"
|
||||
msgstr "Sperren"
|
||||
|
||||
#: ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/userMenu.js:785
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Aktualisierungen installieren und neustarten"
|
||||
|
||||
#: ../js/ui/userMenu.js:799
|
||||
#: ../js/ui/userMenu.js:803
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Ihr Anwesenheitsstatus wird auf »Beschäftigt« gesetzt"
|
||||
|
||||
#: ../js/ui/userMenu.js:800
|
||||
#: ../js/ui/userMenu.js:804
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@ -1777,7 +1789,7 @@ msgstr ""
|
||||
msgid "List possible modes"
|
||||
msgstr "Die möglichen Modi auflisten"
|
||||
|
||||
#: ../src/shell-app.c:621
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "»%s« konnte nicht gestartet werden"
|
||||
|
22
po/fa.po
22
po/fa.po
@ -708,7 +708,7 @@ msgstr "ارسال در <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s با عنوان %s شناخته میشود"
|
||||
msgstr "%s با عنوان %s شناخته میشود"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
@ -723,7 +723,7 @@ msgstr "دعوتنامه به %s"
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s از شما دعوت میکند که به %s بپیوندید"
|
||||
msgstr "%s از شما دعوت میکند که به %s بپیوندید"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
@ -767,13 +767,13 @@ msgstr "پاسخگویی"
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s در حال ارسال %s به شما است"
|
||||
msgstr "%s در حال ارسال %s به شما است"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s اجازه دسترسی برای دیدن زمانهایی که شما برخط هستید را دارد"
|
||||
msgstr "%s اجازه دسترسی برای دیدن زمانهایی که شما برخط هستید را دارد"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
msgid "Network error"
|
||||
@ -938,8 +938,8 @@ msgstr ""
|
||||
#, c-format
|
||||
msgid "%s will be logged out automatically in %d second."
|
||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:70
|
||||
#, c-format
|
||||
@ -1698,7 +1698,7 @@ msgstr ""
|
||||
#: ../js/ui/wanda.js:121
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "%s پیشگو میگوید"
|
||||
msgstr "%s پیشگو میگوید"
|
||||
|
||||
#: ../js/ui/wanda.js:162
|
||||
msgid "Your favorite Easter Egg"
|
||||
@ -1852,16 +1852,16 @@ msgstr "محاوره تایید هویت از طرف کاربر رد شد"
|
||||
#~ msgstr "شبکه"
|
||||
|
||||
#~ msgid "%s is online."
|
||||
#~ msgstr "%s بر خط است."
|
||||
#~ msgstr "%s بر خط است."
|
||||
|
||||
#~ msgid "%s is offline."
|
||||
#~ msgstr "%s برون خط است."
|
||||
#~ msgstr "%s برون خط است."
|
||||
|
||||
#~ msgid "%s is away."
|
||||
#~ msgstr "%s غایب است."
|
||||
#~ msgstr "%s غایب است."
|
||||
|
||||
#~ msgid "%s is busy."
|
||||
#~ msgstr "%s مشغول است."
|
||||
#~ msgstr "%s مشغول است."
|
||||
|
||||
#~ msgid "Hidden"
|
||||
#~ msgstr "نامرئی"
|
||||
|
419
po/nb.po
419
po/nb.po
@ -6,10 +6,10 @@
|
||||
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 3.5.x\n"
|
||||
"Project-Id-Version: gnome-shell 3.7.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-10-11 20:24+0200\n"
|
||||
"PO-Revision-Date: 2012-10-11 20:25+0200\n"
|
||||
"POT-Creation-Date: 2012-11-05 19:06+0100\n"
|
||||
"PO-Revision-Date: 2012-11-05 19:10+0100\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||
"Language: \n"
|
||||
@ -34,6 +34,14 @@ msgstr "System"
|
||||
msgid "Show the message tray"
|
||||
msgstr "Vis meldingstrau"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:3
|
||||
msgid "Show all applications"
|
||||
msgstr "Vis alle programmer"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:4
|
||||
msgid "Open the application menu"
|
||||
msgstr "Åpne programmenyen"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
@ -128,50 +136,71 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Vis dato for uken i kalender"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Viser ISO-ukedato i kalenderen hvis «true»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Tastaturbinding som åpner programmenyen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Tastaturbinding som åpner programmenyen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#, fuzzy
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Tastaturbinding som åpner programmenyen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr "Tastaturbinding som åpner programmenyen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Tastaturbinding som slår av/på synlighet for meldingstrau"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Tastaturbinding som slår av/på synlighet for meldingstrauet."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Tastaturbinding som slår av/på skjermopptak"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr "Tastaturbinding som starter/stopper innebygget opptak av skjerm."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Tastatur som skal brukes"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Type tastatur som skal brukes."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Bildefrekvens i bruk ved lagring av skjermvideoer."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@ -179,11 +208,11 @@ msgstr ""
|
||||
"Bildefrekvensen i den ferdige skjermvideoen tatt opp med GNOME Shells "
|
||||
"skjermvideoopptaker i bilder per sekund."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Gstreamer-kommandokø brukt til å kode skjermvideoen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#, fuzzy, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -200,11 +229,11 @@ msgstr ""
|
||||
"Setter GStreamer-rør som brukes til å kode opptak. Den følger syntaksen som "
|
||||
"brukes for gst-launch. Røret må ha en..."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Filendelse i bruk ved lagring av skjermvideo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -214,6 +243,37 @@ msgstr ""
|
||||
"og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt "
|
||||
"oppbevaringsformat."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/extensionPrefs/main.js:124
|
||||
#, c-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
@ -227,11 +287,11 @@ msgstr "Utvidelse"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:529
|
||||
#: ../js/gdm/loginDialog.js:560
|
||||
msgid "Session..."
|
||||
msgstr "Økt …"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:677
|
||||
#: ../js/gdm/loginDialog.js:704
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Logg inn"
|
||||
@ -239,56 +299,56 @@ msgstr "Logg inn"
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:736
|
||||
#: ../js/gdm/loginDialog.js:764
|
||||
msgid "Not listed?"
|
||||
msgstr "Ikke listet?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:906 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:171
|
||||
msgid "Cancel"
|
||||
msgstr "Avbryt"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:894
|
||||
#: ../js/gdm/loginDialog.js:911
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Logg inn"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1215
|
||||
#: ../js/gdm/loginDialog.js:1237
|
||||
msgid "Login Window"
|
||||
msgstr "Innloggingsvindu"
|
||||
|
||||
#. Translators: accessible name of the power menu in the login screen
|
||||
#: ../js/gdm/powerMenu.js:35
|
||||
#: ../js/gdm/powerMenu.js:36
|
||||
msgid "Power"
|
||||
msgstr "Strøm"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
|
||||
#: ../js/ui/userMenu.js:775
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:667 ../js/ui/userMenu.js:671
|
||||
#: ../js/ui/userMenu.js:782
|
||||
msgid "Suspend"
|
||||
msgstr "Hvilemodus"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:94
|
||||
#: ../js/gdm/powerMenu.js:98
|
||||
msgid "Restart"
|
||||
msgstr "Start på nytt"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
|
||||
#: ../js/ui/userMenu.js:774
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:669
|
||||
#: ../js/ui/userMenu.js:671 ../js/ui/userMenu.js:781
|
||||
msgid "Power Off"
|
||||
msgstr "Slå av"
|
||||
|
||||
#: ../js/gdm/util.js:148
|
||||
#: ../js/gdm/util.js:151
|
||||
msgid "Authentication error"
|
||||
msgstr "Autentiseringsfeil"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:265
|
||||
#: ../js/gdm/util.js:268
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(eller dra finger)"
|
||||
|
||||
#: ../js/gdm/util.js:290
|
||||
#: ../js/gdm/util.js:293
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(f.eks. bruker eller %s)"
|
||||
@ -338,7 +398,7 @@ msgstr "Legg til i favoritter"
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s ble lagt til i dine favoritter."
|
||||
|
||||
#: ../js/ui/appFavorites.js:118
|
||||
#: ../js/ui/appFavorites.js:121
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s ble fjernet fra dine favoritter."
|
||||
@ -457,48 +517,48 @@ msgid "S"
|
||||
msgstr "Lø"
|
||||
|
||||
#. Translators: Text to show if there are no events
|
||||
#: ../js/ui/calendar.js:699
|
||||
#: ../js/ui/calendar.js:700
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Ingenting planlagt"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: ../js/ui/calendar.js:715
|
||||
#: ../js/ui/calendar.js:716
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A %B %d"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: ../js/ui/calendar.js:718
|
||||
#: ../js/ui/calendar.js:719
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A %B %d, %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:728
|
||||
#: ../js/ui/calendar.js:729
|
||||
msgid "Today"
|
||||
msgstr "I dag"
|
||||
|
||||
#: ../js/ui/calendar.js:732
|
||||
#: ../js/ui/calendar.js:733
|
||||
msgid "Tomorrow"
|
||||
msgstr "I morgen"
|
||||
|
||||
#: ../js/ui/calendar.js:743
|
||||
#: ../js/ui/calendar.js:744
|
||||
msgid "This week"
|
||||
msgstr "Denne uken"
|
||||
|
||||
#: ../js/ui/calendar.js:751
|
||||
#: ../js/ui/calendar.js:752
|
||||
msgid "Next week"
|
||||
msgstr "Neste uke"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:297
|
||||
#: ../js/ui/components/autorunManager.js:295
|
||||
msgid "Removable Devices"
|
||||
msgstr "Avtagbare enheter"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:594
|
||||
#: ../js/ui/components/autorunManager.js:591
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Åpne med %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:620
|
||||
#: ../js/ui/components/autorunManager.js:617
|
||||
msgid "Eject"
|
||||
msgstr "Løs ut"
|
||||
|
||||
@ -652,38 +712,42 @@ msgstr "Fjern demping"
|
||||
msgid "Mute"
|
||||
msgstr "Demp"
|
||||
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/components/telepathyClient.js:948
|
||||
#. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
|
||||
#: ../js/ui/components/telepathyClient.js:945
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Sendt <b>%X</b> på <b>%A</b>"
|
||||
msgid "<b>%H:%M</b> on Yesterday"
|
||||
msgstr "<b>%H.%M</b> i går"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/components/telepathyClient.js:954
|
||||
#. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
|
||||
#: ../js/ui/components/telepathyClient.js:951
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Sendt <b>%A</b>, <b>%B %d</b>"
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>"
|
||||
msgstr "<b>%H.%M</b> på <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/components/telepathyClient.js:959
|
||||
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year
|
||||
#: ../js/ui/components/telepathyClient.js:957
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Sendt <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year
|
||||
#: ../js/ui/components/telepathyClient.js:962
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
|
||||
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#: ../js/ui/components/telepathyClient.js:990
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s er nå kjent som %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1089
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Invitasjon til %s"
|
||||
@ -691,42 +755,42 @@ msgstr "Invitasjon til %s"
|
||||
#. 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
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1097
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s inviterer deg til å bli med i %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
msgid "Decline"
|
||||
msgstr "Avslå"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
msgid "Decline"
|
||||
msgstr "Avslå"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#: ../js/ui/components/telepathyClient.js:1179
|
||||
#: ../js/ui/components/telepathyClient.js:1242
|
||||
msgid "Accept"
|
||||
msgstr "Godta"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1130
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videosamtale fra %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1133
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Samtale fra %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1138
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Avvis"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1140
|
||||
msgid "Answer"
|
||||
msgstr "Svar"
|
||||
|
||||
@ -735,110 +799,110 @@ msgstr "Svar"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1172
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s sender deg %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1207
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
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"
|
||||
msgstr "Nettverksfeil"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
msgid "Authentication failed"
|
||||
msgstr "Autentisering feilet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
msgid "Encryption error"
|
||||
msgstr "Feil ved kryptering"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Sertifikat ikke oppgitt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Stoler ikke på sertifikatet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
msgid "Certificate expired"
|
||||
msgstr "Sertifikatet er utløpt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Sertifikatet er ikke aktivert"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Feil vertsnavn for sertifikat"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Feil fingeravtrykk for sertifikat"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sertifikatet er selvsignert"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Status er satt til frakoblet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Kryptering er ikke tilgjengelig"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Sertifikatet er ugyldig"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Tilkobling ble nektet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Tilkobling kan ikke etableres"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Tilkobling tapt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Denne kontoen er allerede koblet til tjeneren"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
msgstr "Sertifikatet er tilbaketrukket"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -846,26 +910,26 @@ msgstr ""
|
||||
"Lengden eller dybden på tjenersertifikatet oversteg grensen som er satt i "
|
||||
"kryptografibiblioteket"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
msgid "Internal error"
|
||||
msgstr "Intern feil"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Tilkobling til %s feilet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Reconnect"
|
||||
msgstr "Koble til på nytt"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
msgid "Edit account"
|
||||
msgstr "Rediger konto"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1409
|
||||
#: ../js/ui/components/telepathyClient.js:1410
|
||||
msgid "Unknown reason"
|
||||
msgstr "Ukjent årsak"
|
||||
|
||||
@ -884,7 +948,7 @@ msgstr "Åpne kalender"
|
||||
#. Translators: This is the date format to use when the calendar popup is
|
||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||
#.
|
||||
#: ../js/ui/dateMenu.js:190
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%a %e %B, %Y"
|
||||
|
||||
@ -989,11 +1053,11 @@ msgstr "Installer"
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Last ned og installer «%s» fra extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:337
|
||||
#: ../js/ui/keyboard.js:308
|
||||
msgid "tray"
|
||||
msgstr "varslingsområde"
|
||||
|
||||
#: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
|
||||
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195
|
||||
#: ../js/ui/status/power.js:205
|
||||
msgid "Keyboard"
|
||||
msgstr "Tastatur"
|
||||
@ -1046,32 +1110,32 @@ msgstr "Vis kildekode"
|
||||
msgid "Web Page"
|
||||
msgstr "Nettside"
|
||||
|
||||
#: ../js/ui/messageTray.js:1081
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
msgid "Open"
|
||||
msgstr "Åpne"
|
||||
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
#: ../js/ui/messageTray.js:1095
|
||||
msgid "Remove"
|
||||
msgstr "Fjern"
|
||||
|
||||
#: ../js/ui/messageTray.js:1540
|
||||
#: ../js/ui/messageTray.js:1539
|
||||
msgid "Message Tray"
|
||||
msgstr "Meldingstrau"
|
||||
|
||||
#: ../js/ui/messageTray.js:2547
|
||||
#: ../js/ui/messageTray.js:2563
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformasjon"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373
|
||||
#: ../js/ui/notificationDaemon.js:504 ../src/shell-app.c:374
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: ../js/ui/overview.js:82
|
||||
#: ../js/ui/overview.js:89
|
||||
msgid "Undo"
|
||||
msgstr "Angre"
|
||||
|
||||
#: ../js/ui/overview.js:127
|
||||
#: ../js/ui/overview.js:133
|
||||
msgid "Overview"
|
||||
msgstr "Oversikt"
|
||||
|
||||
@ -1079,27 +1143,27 @@ msgstr "Oversikt"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters.
|
||||
#: ../js/ui/overview.js:201
|
||||
#: ../js/ui/overview.js:207
|
||||
msgid "Type to search..."
|
||||
msgstr "Skriv for å søke …"
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/overview.js:222
|
||||
#: ../js/ui/overview.js:228
|
||||
msgid "Dash"
|
||||
msgstr "Favoritter"
|
||||
|
||||
#: ../js/ui/panel.js:567
|
||||
#: ../js/ui/panel.js:581
|
||||
msgid "Quit"
|
||||
msgstr "Avslutt"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:599
|
||||
#: ../js/ui/panel.js:613
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
|
||||
#: ../js/ui/panel.js:965
|
||||
#: ../js/ui/panel.js:980
|
||||
msgid "Top Bar"
|
||||
msgstr "Topp-panel"
|
||||
|
||||
@ -1113,23 +1177,27 @@ msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:205
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Oppgi en kommando:"
|
||||
msgid "Enter a Command"
|
||||
msgstr "Oppgi en kommando"
|
||||
|
||||
#: ../js/ui/runDialog.js:241
|
||||
msgid "Close"
|
||||
msgstr "Lukk"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %B %d"
|
||||
|
||||
#: ../js/ui/screenShield.js:143
|
||||
#: ../js/ui/screenShield.js:144
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "%d ny melding"
|
||||
msgstr[1] "%d nye meldinger"
|
||||
|
||||
#: ../js/ui/screenShield.js:145
|
||||
#: ../js/ui/screenShield.js:146
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
@ -1168,7 +1236,7 @@ msgstr "Passord"
|
||||
msgid "Remember Password"
|
||||
msgstr "Husk passord"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:174
|
||||
msgid "Unlock"
|
||||
msgstr "Lås opp"
|
||||
|
||||
@ -1223,7 +1291,7 @@ msgstr "Stor tekst"
|
||||
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
|
||||
#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304
|
||||
#: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371
|
||||
#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:867
|
||||
#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:873
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@ -1252,12 +1320,12 @@ msgstr "maskinvare slått av"
|
||||
msgid "Connection"
|
||||
msgstr "Tilkobling"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:458
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:475
|
||||
msgid "disconnecting..."
|
||||
msgstr "kobler fra …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:464
|
||||
#: ../js/ui/status/network.js:934
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:481
|
||||
#: ../js/ui/status/network.js:1507
|
||||
msgid "connecting..."
|
||||
msgstr "kobler til …"
|
||||
|
||||
@ -1367,109 +1435,106 @@ msgstr "slått av"
|
||||
|
||||
#. Translators: this is for network devices that are physically present but are not
|
||||
#. under NetworkManager's control (and thus cannot be used in the menu)
|
||||
#: ../js/ui/status/network.js:456
|
||||
#: ../js/ui/status/network.js:473
|
||||
msgid "unmanaged"
|
||||
msgstr "ikke håndtert"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: ../js/ui/status/network.js:467 ../js/ui/status/network.js:937
|
||||
#: ../js/ui/status/network.js:484 ../js/ui/status/network.js:1510
|
||||
msgid "authentication required"
|
||||
msgstr "autentisering kreves"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing
|
||||
#: ../js/ui/status/network.js:477
|
||||
#: ../js/ui/status/network.js:494
|
||||
msgid "firmware missing"
|
||||
msgstr "fastvare mangler"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:484
|
||||
#: ../js/ui/status/network.js:501
|
||||
msgid "cable unplugged"
|
||||
msgstr "kabel koblet fra"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage
|
||||
#: ../js/ui/status/network.js:489
|
||||
#: ../js/ui/status/network.js:506
|
||||
msgid "unavailable"
|
||||
msgstr "ikke tilgjengelig"
|
||||
|
||||
#: ../js/ui/status/network.js:491 ../js/ui/status/network.js:939
|
||||
#: ../js/ui/status/network.js:508 ../js/ui/status/network.js:1512
|
||||
msgid "connection failed"
|
||||
msgstr "tilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1529
|
||||
#: ../js/ui/status/network.js:560 ../js/ui/status/network.js:1446
|
||||
#: ../js/ui/status/network.js:1588
|
||||
msgid "More..."
|
||||
msgstr "Mer …"
|
||||
|
||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||
#. and we cannot access its settings (including the name)
|
||||
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1459
|
||||
#: ../js/ui/status/network.js:596 ../js/ui/status/network.js:1376
|
||||
msgid "Connected (private)"
|
||||
msgstr "Tilkoblet (privat)"
|
||||
|
||||
#: ../js/ui/status/network.js:663
|
||||
#: ../js/ui/status/network.js:669
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Automatisk Ethernet"
|
||||
|
||||
#: ../js/ui/status/network.js:721
|
||||
#: ../js/ui/status/network.js:727
|
||||
msgid "Auto broadband"
|
||||
msgstr "Automatisk bredbånd"
|
||||
|
||||
#: ../js/ui/status/network.js:724
|
||||
#: ../js/ui/status/network.js:730
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Automatisk oppringt"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476
|
||||
#: ../js/ui/status/network.js:859 ../js/ui/status/network.js:1393
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "Automatisk %s"
|
||||
|
||||
#: ../js/ui/status/network.js:855
|
||||
#: ../js/ui/status/network.js:861
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Automatisk Bluetooth"
|
||||
|
||||
#: ../js/ui/status/network.js:1478
|
||||
#: ../js/ui/status/network.js:1395
|
||||
msgid "Auto wireless"
|
||||
msgstr "Automatisk trådløst"
|
||||
|
||||
#: ../js/ui/status/network.js:1575
|
||||
#: ../js/ui/status/network.js:1637
|
||||
msgid "Enable networking"
|
||||
msgstr "Slå på nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1597
|
||||
#: ../js/ui/status/network.js:1659
|
||||
msgid "Wired"
|
||||
msgstr "Kablet"
|
||||
|
||||
#: ../js/ui/status/network.js:1608
|
||||
#: ../js/ui/status/network.js:1670
|
||||
msgid "Wireless"
|
||||
msgstr "Trådløst"
|
||||
|
||||
#: ../js/ui/status/network.js:1618
|
||||
#: ../js/ui/status/network.js:1680
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Mobilt bredbånd"
|
||||
|
||||
#: ../js/ui/status/network.js:1628
|
||||
msgid "VPN Connections"
|
||||
msgstr "VPN-tilkoblinger"
|
||||
|
||||
#: ../js/ui/status/network.js:1635
|
||||
#: ../js/ui/status/network.js:1691
|
||||
msgid "Network Settings"
|
||||
msgstr "Innstillinger for nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1679
|
||||
#: ../js/ui/status/network.js:1735
|
||||
msgid "Network Manager"
|
||||
msgstr "Nettverkshåndtering"
|
||||
|
||||
#: ../js/ui/status/network.js:1769
|
||||
#: ../js/ui/status/network.js:1809
|
||||
msgid "Connection failed"
|
||||
msgstr "Tilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:1770
|
||||
#: ../js/ui/status/network.js:1810
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivering av nettverkstilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:2065
|
||||
#: ../js/ui/status/network.js:2108
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Nettverk er slått av"
|
||||
|
||||
@ -1579,63 +1644,63 @@ msgstr "Volum"
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:176
|
||||
#: ../js/ui/unlockDialog.js:181
|
||||
msgid "Log in as another user"
|
||||
msgstr "Logg inn som en annen bruker"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:176
|
||||
msgid "Available"
|
||||
msgstr "Tilgjengelig"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:179
|
||||
msgid "Busy"
|
||||
msgstr "Opptatt"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:182
|
||||
msgid "Invisible"
|
||||
msgstr "Usynlig"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:185
|
||||
msgid "Away"
|
||||
msgstr "Borte"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:188
|
||||
msgid "Idle"
|
||||
msgstr "Ledig"
|
||||
|
||||
#: ../js/ui/userMenu.js:195
|
||||
msgid "Unavailable"
|
||||
msgstr "Ikke tilgjengelig"
|
||||
#: ../js/ui/userMenu.js:191
|
||||
msgid "Offline"
|
||||
msgstr "Frakoblet"
|
||||
|
||||
#: ../js/ui/userMenu.js:740
|
||||
#: ../js/ui/userMenu.js:747
|
||||
msgid "Notifications"
|
||||
msgstr "Varslinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:748
|
||||
#: ../js/ui/userMenu.js:755
|
||||
msgid "System Settings"
|
||||
msgstr "Systeminnstillinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:756
|
||||
#: ../js/ui/userMenu.js:763
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#: ../js/ui/userMenu.js:761
|
||||
#: ../js/ui/userMenu.js:768
|
||||
msgid "Log Out"
|
||||
msgstr "Logg ut"
|
||||
|
||||
#: ../js/ui/userMenu.js:766
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Lock"
|
||||
msgstr "Lås"
|
||||
|
||||
#: ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/userMenu.js:788
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Installer oppdateringer og start på nytt"
|
||||
|
||||
#: ../js/ui/userMenu.js:799
|
||||
#: ../js/ui/userMenu.js:806
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Din pratestatus vil bli satt til opptatt"
|
||||
|
||||
#: ../js/ui/userMenu.js:800
|
||||
#: ../js/ui/userMenu.js:807
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@ -1644,15 +1709,15 @@ msgstr ""
|
||||
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
|
||||
"deres meldinger."
|
||||
|
||||
#: ../js/ui/viewSelector.js:85
|
||||
#: ../js/ui/viewSelector.js:87
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
|
||||
#: ../js/ui/viewSelector.js:89
|
||||
#: ../js/ui/viewSelector.js:91
|
||||
msgid "Applications"
|
||||
msgstr "Programmer"
|
||||
|
||||
#: ../js/ui/viewSelector.js:93
|
||||
#: ../js/ui/viewSelector.js:95
|
||||
msgid "Search"
|
||||
msgstr "Søk"
|
||||
|
||||
@ -1721,7 +1786,7 @@ msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
|
||||
msgid "List possible modes"
|
||||
msgstr "Vis mulige modi"
|
||||
|
||||
#: ../src/shell-app.c:621
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "Klarte ikke å starte «%s»"
|
||||
|
244
po/pl.po
244
po/pl.po
@ -11,8 +11,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-09-25 15:12+0200\n"
|
||||
"PO-Revision-Date: 2012-09-25 15:13+0200\n"
|
||||
"POT-Creation-Date: 2012-10-31 19:12+0100\n"
|
||||
"PO-Revision-Date: 2012-10-31 19:13+0100\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"Language: pl\n"
|
||||
@ -142,62 +142,74 @@ msgstr ""
|
||||
"użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr "Wyświetlanie elementu menu \"Wyloguj się\" w menu użytkownika."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
msgstr ""
|
||||
"Ten klucz zastępuje automatyczne ukrywanie elementu menu \"Wyloguj się\" w "
|
||||
"sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr ""
|
||||
"Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w "
|
||||
"formacie ISO."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Skrót do otwarcia menu programu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Skrót do otwarcia menu programu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Skrót do przełączenia nagrywania ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Której klawiatury używać"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Typ używanej klawiatury."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Liczba klatek na sekundę do nagrywania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -222,11 +234,11 @@ msgstr ""
|
||||
"i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na "
|
||||
"odgadniętą optymalną liczbę wątków dla komputera."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -252,11 +264,11 @@ msgstr ""
|
||||
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
|
||||
"wyboru."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:528
|
||||
#: ../js/gdm/loginDialog.js:529
|
||||
msgid "Session..."
|
||||
msgstr "Sesja..."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:676
|
||||
#: ../js/gdm/loginDialog.js:677
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Proszę się zalogować"
|
||||
@ -264,23 +276,23 @@ msgstr "Proszę się zalogować"
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:743
|
||||
#: ../js/gdm/loginDialog.js:736
|
||||
msgid "Not listed?"
|
||||
msgstr "Inny użytkownik?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:896 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:901
|
||||
#: ../js/gdm/loginDialog.js:894
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Zaloguj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1240
|
||||
#: ../js/gdm/loginDialog.js:1215
|
||||
msgid "Login Window"
|
||||
msgstr "Okno logowania"
|
||||
|
||||
@ -289,8 +301,8 @@ msgstr "Okno logowania"
|
||||
msgid "Power"
|
||||
msgstr "Zasilanie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:778
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:779
|
||||
msgid "Suspend"
|
||||
msgstr "Uśpij"
|
||||
|
||||
@ -298,8 +310,8 @@ msgstr "Uśpij"
|
||||
msgid "Restart"
|
||||
msgstr "Uruchom ponownie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:777
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Power Off"
|
||||
msgstr "Wyłącz komputer"
|
||||
|
||||
@ -350,7 +362,7 @@ msgstr "Ustawienia"
|
||||
msgid "New Window"
|
||||
msgstr "Nowe okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271
|
||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Usuń z ulubionych"
|
||||
|
||||
@ -514,16 +526,16 @@ msgstr "Ten tydzień"
|
||||
msgid "Next week"
|
||||
msgstr "Następny tydzień"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:278
|
||||
#: ../js/ui/components/autorunManager.js:297
|
||||
msgid "Removable Devices"
|
||||
msgstr "Urządzenia wymienne"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:575
|
||||
#: ../js/ui/components/autorunManager.js:594
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Otwórz za pomocą %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:601
|
||||
#: ../js/ui/components/autorunManager.js:620
|
||||
msgid "Eject"
|
||||
msgstr "Wysuń"
|
||||
|
||||
@ -680,35 +692,35 @@ msgstr "Wycisz"
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/components/telepathyClient.js:948
|
||||
#: ../js/ui/components/telepathyClient.js:950
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/components/telepathyClient.js:954
|
||||
#: ../js/ui/components/telepathyClient.js:956
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/components/telepathyClient.js:959
|
||||
#: ../js/ui/components/telepathyClient.js:961
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</b>"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#: ../js/ui/components/telepathyClient.js:990
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "Użytkownik %s jest teraz znany jako %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1090
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Zaproszenie do pokoju %s"
|
||||
@ -716,42 +728,42 @@ msgstr "Zaproszenie do pokoju %s"
|
||||
#. 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
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#: ../js/ui/components/telepathyClient.js:1179
|
||||
#: ../js/ui/components/telepathyClient.js:1242
|
||||
msgid "Decline"
|
||||
msgstr "Odmów"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
#: ../js/ui/components/telepathyClient.js:1101
|
||||
#: ../js/ui/components/telepathyClient.js:1180
|
||||
#: ../js/ui/components/telepathyClient.js:1243
|
||||
msgid "Accept"
|
||||
msgstr "Zaakceptuj"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1131
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Wideorozmowa z użytkownikiem %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1134
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Rozmowa z użytkownikiem %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Odrzuć"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1141
|
||||
msgid "Answer"
|
||||
msgstr "Odbierz"
|
||||
|
||||
@ -760,111 +772,111 @@ msgstr "Odbierz"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1173
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "Użytkownik %s przysyła plik %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1208
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Network error"
|
||||
msgstr "Błąd sieci"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
msgid "Authentication failed"
|
||||
msgstr "Uwierzytelnienie się nie powiodło"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
msgid "Encryption error"
|
||||
msgstr "Błąd szyfrowania"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Nie podano certyfikatu"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Certyfikat jest niezaufany"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certyfikat wygasł"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Certyfikat nie został aktywowany"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Nazwa komputera certyfikatu się nie zgadza"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Odcisk palca certyfikatu się nie zgadza"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Certyfikat został samodzielnie podpisany"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Stan jest ustawiony na offline"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Szyfrowanie jest niedostępne"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Certyfikat jest nieprawidłowy"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Odrzucono połączenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Nie można nawiązać połączenia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Utracono połączenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "To konto jest już połączone z serwerem"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Konto już istnieje na serwerze"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Certyfikat został unieważniony"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
|
||||
"kryptograficznie słaby"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -872,30 +884,30 @@ msgstr ""
|
||||
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
|
||||
"ograniczenia nałożone przez bibliotekę kryptograficzną"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Internal error"
|
||||
msgstr "Błąd wewnętrzny"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Połączenie z kontem %s się nie powiodło"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
msgid "Reconnect"
|
||||
msgstr "Połącz ponownie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Edit account"
|
||||
msgstr "Modyfikuj konto"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1409
|
||||
#: ../js/ui/components/telepathyClient.js:1411
|
||||
msgid "Unknown reason"
|
||||
msgstr "Nieznana przyczyna"
|
||||
|
||||
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273
|
||||
#: ../js/ui/dash.js:253 ../js/ui/dash.js:292
|
||||
msgid "Show Applications"
|
||||
msgstr "Wyświetl programy"
|
||||
|
||||
@ -903,14 +915,14 @@ msgstr "Wyświetl programy"
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Ustawienia daty i czasu"
|
||||
|
||||
#: ../js/ui/dateMenu.js:109
|
||||
#: ../js/ui/dateMenu.js:111
|
||||
msgid "Open Calendar"
|
||||
msgstr "Otwórz kalendarz"
|
||||
|
||||
#. Translators: This is the date format to use when the calendar popup is
|
||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||
#.
|
||||
#: ../js/ui/dateMenu.js:175
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e %B %Y"
|
||||
|
||||
@ -1075,23 +1087,23 @@ msgstr "Wyświetl źródło"
|
||||
msgid "Web Page"
|
||||
msgstr "Strona WWW"
|
||||
|
||||
#: ../js/ui/messageTray.js:1081
|
||||
#: ../js/ui/messageTray.js:1084
|
||||
msgid "Open"
|
||||
msgstr "Otwórz"
|
||||
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
#: ../js/ui/messageTray.js:1091
|
||||
msgid "Remove"
|
||||
msgstr "Usuń"
|
||||
|
||||
#: ../js/ui/messageTray.js:2088
|
||||
#: ../js/ui/messageTray.js:1543
|
||||
msgid "Message Tray"
|
||||
msgstr "Obszar powiadamiania"
|
||||
|
||||
#: ../js/ui/messageTray.js:2551
|
||||
#: ../js/ui/messageTray.js:2549
|
||||
msgid "System Information"
|
||||
msgstr "Informacje systemowe"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
@ -1147,7 +1159,7 @@ msgstr "Proszę wprowadzić polecenie:"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e %B"
|
||||
|
||||
@ -1199,7 +1211,7 @@ msgstr "Hasło"
|
||||
msgid "Remember Password"
|
||||
msgstr "Zapamiętanie hasła"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokuj"
|
||||
|
||||
@ -1614,67 +1626,63 @@ msgstr "Głośność"
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:176
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
msgid "Log in as another user"
|
||||
msgstr "Zaloguj jako inny użytkownik"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Available"
|
||||
msgstr "Dostępny"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Busy"
|
||||
msgstr "Zajęty"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Invisible"
|
||||
msgstr "Niewidoczny"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Away"
|
||||
msgstr "Nieobecny"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Idle"
|
||||
msgstr "Bezczynny"
|
||||
|
||||
#: ../js/ui/userMenu.js:195
|
||||
#: ../js/ui/userMenu.js:196
|
||||
msgid "Unavailable"
|
||||
msgstr "Niedostępny"
|
||||
|
||||
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/userMenu.js:619
|
||||
msgid "Switch Session"
|
||||
msgstr "Przełącz sesję"
|
||||
|
||||
#: ../js/ui/userMenu.js:743
|
||||
#: ../js/ui/userMenu.js:744
|
||||
msgid "Notifications"
|
||||
msgstr "Powiadomienia"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:752
|
||||
msgid "System Settings"
|
||||
msgstr "Ustawienia systemu"
|
||||
|
||||
#: ../js/ui/userMenu.js:764
|
||||
#: ../js/ui/userMenu.js:760
|
||||
msgid "Switch User"
|
||||
msgstr "Przełącz użytkownika"
|
||||
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Log Out"
|
||||
msgstr "Wyloguj się"
|
||||
|
||||
#: ../js/ui/userMenu.js:769
|
||||
#: ../js/ui/userMenu.js:770
|
||||
msgid "Lock"
|
||||
msgstr "Zablokuj ekran"
|
||||
|
||||
#: ../js/ui/userMenu.js:784
|
||||
#: ../js/ui/userMenu.js:785
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Zaktualizuj i uruchom ponownie"
|
||||
|
||||
#: ../js/ui/userMenu.js:802
|
||||
#: ../js/ui/userMenu.js:803
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
|
||||
|
||||
#: ../js/ui/userMenu.js:803
|
||||
#: ../js/ui/userMenu.js:804
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@ -1696,7 +1704,7 @@ msgstr "Programy"
|
||||
msgid "Search"
|
||||
msgstr "Wyszukiwanie"
|
||||
|
||||
#: ../js/ui/wanda.js:119
|
||||
#: ../js/ui/wanda.js:117
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Sorry, no wisdom for you today:\n"
|
||||
@ -1705,12 +1713,12 @@ msgstr ""
|
||||
"Nic mądrego na dzisiaj:\n"
|
||||
"%s"
|
||||
|
||||
#: ../js/ui/wanda.js:123
|
||||
#: ../js/ui/wanda.js:121
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "Wyrocznia %s przemawia"
|
||||
|
||||
#: ../js/ui/wanda.js:164
|
||||
#: ../js/ui/wanda.js:162
|
||||
msgid "Your favorite Easter Egg"
|
||||
msgstr "Twój ulubiony żart"
|
||||
|
||||
@ -1747,23 +1755,23 @@ msgstr[2] "%u wejść"
|
||||
msgid "System Sounds"
|
||||
msgstr "Dźwięki systemowe"
|
||||
|
||||
#: ../src/main.c:330
|
||||
#: ../src/main.c:332
|
||||
msgid "Print version"
|
||||
msgstr "Wyświetla wersję"
|
||||
|
||||
#: ../src/main.c:336
|
||||
#: ../src/main.c:338
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Tryb używany przez GDM dla ekranu logowania"
|
||||
|
||||
#: ../src/main.c:342
|
||||
#: ../src/main.c:344
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania"
|
||||
|
||||
#: ../src/main.c:348
|
||||
#: ../src/main.c:350
|
||||
msgid "List possible modes"
|
||||
msgstr "Wyświetla listę możliwych trybów"
|
||||
|
||||
#: ../src/shell-app.c:621
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "Uruchomienie \"%s\" się nie powiodło"
|
||||
|
256
po/ru.po
256
po/ru.po
@ -15,8 +15,8 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-09-25 00:06+0000\n"
|
||||
"PO-Revision-Date: 2012-09-27 16:38+0400\n"
|
||||
"POT-Creation-Date: 2012-10-31 16:48+0000\n"
|
||||
"PO-Revision-Date: 2012-11-04 20:48+0400\n"
|
||||
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
|
||||
"Language-Team: русский <gnome-cyr@gnome.org>\n"
|
||||
"Language: ru\n"
|
||||
@ -141,51 +141,63 @@ msgstr ""
|
||||
"Данное значение берётся из перечисления GsmPresenceStatus."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgstr "Всегда показывать в меню пункт «Завершить сеанс»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
msgid ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||
"user, single-session situations."
|
||||
msgstr ""
|
||||
"Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при "
|
||||
"использовании одиночного сеанса."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Показывать в часах дату недели"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Если установлено, календарь будет показывать неделю в формате ISO."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Комбинация клавиш для открытия меню приложения"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Комбинация клавиш для открытия меню приложения."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Комбинация клавиш для переключения видимости панели сообщений"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Комбинация клавиш для переключения видимости панели сообщений."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Комбинация клавиш для переключения записи экрана"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr ""
|
||||
"Комбинация клавиш для запуска/остановки встроенного средства записи экрана."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Какую клавиатуру использовать"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Тип используемой клавиатуры."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Частота смены кадров для записи скринкастов."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@ -193,11 +205,11 @@ msgstr ""
|
||||
"Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/"
|
||||
"сек)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Конвейер gstreamer, используемый для кодирования скринкастов"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@ -224,11 +236,11 @@ msgstr ""
|
||||
"используется как заполнитель для определения оптимального количества потоков "
|
||||
"в системе."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Расширение файла, использующееся для хранения скринкастов"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid ""
|
||||
"The filename for recorded screencasts will be a unique filename based on the "
|
||||
"current date, and use this extension. It should be changed when recording to "
|
||||
@ -251,11 +263,11 @@ msgstr "Расширение"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Выберите расширение из выпадающего списка."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:527
|
||||
#: ../js/gdm/loginDialog.js:529
|
||||
msgid "Session..."
|
||||
msgstr "Сеанс…"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:675
|
||||
#: ../js/gdm/loginDialog.js:677
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Вход в систему"
|
||||
@ -263,34 +275,33 @@ msgstr "Вход в систему"
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:742
|
||||
#: ../js/gdm/loginDialog.js:736
|
||||
msgid "Not listed?"
|
||||
msgstr "Нет в списке?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
|
||||
msgid "Cancel"
|
||||
msgstr "Отмена"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:900
|
||||
#: ../js/gdm/loginDialog.js:894
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Войти"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1239
|
||||
#: ../js/gdm/loginDialog.js:1215
|
||||
msgid "Login Window"
|
||||
msgstr "Окно входа в систему"
|
||||
|
||||
#. Translators: accessible name of the power menu in the login screen
|
||||
#: ../js/gdm/powerMenu.js:35
|
||||
#| msgid "Power Off"
|
||||
msgid "Power"
|
||||
msgstr "Питание"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:778
|
||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:779
|
||||
msgid "Suspend"
|
||||
msgstr "Ждущий режим"
|
||||
|
||||
@ -298,8 +309,8 @@ msgstr "Ждущий режим"
|
||||
msgid "Restart"
|
||||
msgstr "Перезапустить"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:777
|
||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Power Off"
|
||||
msgstr "Выключить"
|
||||
|
||||
@ -350,7 +361,7 @@ msgstr "НАСТРОЙКИ"
|
||||
msgid "New Window"
|
||||
msgstr "Новое окно"
|
||||
|
||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271
|
||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Удалить из избранного"
|
||||
|
||||
@ -514,16 +525,16 @@ msgstr "Эта неделя"
|
||||
msgid "Next week"
|
||||
msgstr "Следующая неделя"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:278
|
||||
#: ../js/ui/components/autorunManager.js:297
|
||||
msgid "Removable Devices"
|
||||
msgstr "Cъёмные устройства"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:575
|
||||
#: ../js/ui/components/autorunManager.js:594
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Открыть с помощью %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:601
|
||||
#: ../js/ui/components/autorunManager.js:620
|
||||
msgid "Eject"
|
||||
msgstr "Извлечь"
|
||||
|
||||
@ -679,35 +690,35 @@ msgstr "Приглушить звук"
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/components/telepathyClient.js:948
|
||||
#: ../js/ui/components/telepathyClient.js:950
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Отправлено в <b>%X</b> в <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/components/telepathyClient.js:954
|
||||
#: ../js/ui/components/telepathyClient.js:956
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Отправлено в <b>%A</b>, <b>%B %d</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/components/telepathyClient.js:959
|
||||
#: ../js/ui/components/telepathyClient.js:961
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Отправлено в <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#: ../js/ui/components/telepathyClient.js:990
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s теперь известен как %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1090
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Приглашение в %s"
|
||||
@ -715,42 +726,42 @@ msgstr "Приглашение в %s"
|
||||
#. 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
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s приглашает вас присоединиться к %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#: ../js/ui/components/telepathyClient.js:1179
|
||||
#: ../js/ui/components/telepathyClient.js:1242
|
||||
msgid "Decline"
|
||||
msgstr "Отказаться"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
#: ../js/ui/components/telepathyClient.js:1101
|
||||
#: ../js/ui/components/telepathyClient.js:1180
|
||||
#: ../js/ui/components/telepathyClient.js:1243
|
||||
msgid "Accept"
|
||||
msgstr "Принять"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1131
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Вас вызывает %s по видео"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1134
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Вас вызывает %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Отклонить"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1141
|
||||
msgid "Answer"
|
||||
msgstr "Ответить"
|
||||
|
||||
@ -759,111 +770,111 @@ msgstr "Ответить"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1173
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s отправляет вам %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1208
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s хотел бы получить разрешение видеть, когда вы в сети"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Network error"
|
||||
msgstr "Ошибка сети"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
msgid "Authentication failed"
|
||||
msgstr "Ошибка аутентификации"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
msgid "Encryption error"
|
||||
msgstr "Ошибка шифрования"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Сертификат не предоставляется"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Недоверенный сертификат"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
msgid "Certificate expired"
|
||||
msgstr "Срок действия сертификата истёк"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Сертификат не активирован"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Имя узла сертификата не совпадает"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Отпечаток сертификата не совпадает"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Самоподписанный сертификат"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Установлен статус «не в сети»"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Шифрование недоступно"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Недействительный сертификат"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
msgid "Connection has been refused"
|
||||
msgstr "В соединении отказано"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Соединение не может быть установлено"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Соединение потеряно"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Эта учётная запись уже подключена к серверу"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Соединение было заменено новым, используя тот же источник"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Учётная запись уже существует на сервере"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr ""
|
||||
"Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Сертификат аннулирован"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Сертификат использует небезопасный алгоритм шифрования или он "
|
||||
"криптографически нестоек"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -871,30 +882,30 @@ msgstr ""
|
||||
"Длина сертификата сервера, или глубина цепочки сертификатов сервера, "
|
||||
"превышает пределы, установленные библиотекой криптографии"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Internal error"
|
||||
msgstr "Внутренняя ошибка"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Сбой подключения к %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
msgid "Reconnect"
|
||||
msgstr "Переподключиться"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Edit account"
|
||||
msgstr "Изменить учётную запись"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1409
|
||||
#: ../js/ui/components/telepathyClient.js:1411
|
||||
msgid "Unknown reason"
|
||||
msgstr "Неизвестная причина"
|
||||
|
||||
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273
|
||||
#: ../js/ui/dash.js:253 ../js/ui/dash.js:292
|
||||
msgid "Show Applications"
|
||||
msgstr "Показать приложения"
|
||||
|
||||
@ -902,14 +913,14 @@ msgstr "Показать приложения"
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Настроить дату и время"
|
||||
|
||||
#: ../js/ui/dateMenu.js:109
|
||||
#: ../js/ui/dateMenu.js:111
|
||||
msgid "Open Calendar"
|
||||
msgstr "Открыть календарь"
|
||||
|
||||
#. Translators: This is the date format to use when the calendar popup is
|
||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||
#.
|
||||
#: ../js/ui/dateMenu.js:175
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e %B, %Y"
|
||||
|
||||
@ -1019,11 +1030,11 @@ msgstr "Установить"
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Загрузить и установить расширение «%s» с extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:327
|
||||
#: ../js/ui/keyboard.js:337
|
||||
msgid "tray"
|
||||
msgstr "лоток"
|
||||
|
||||
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195
|
||||
#: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
|
||||
#: ../js/ui/status/power.js:205
|
||||
msgid "Keyboard"
|
||||
msgstr "Клавиатура"
|
||||
@ -1076,23 +1087,23 @@ msgstr "Показать код"
|
||||
msgid "Web Page"
|
||||
msgstr "Веб-страница"
|
||||
|
||||
#: ../js/ui/messageTray.js:1080
|
||||
#: ../js/ui/messageTray.js:1084
|
||||
msgid "Open"
|
||||
msgstr "Открыть"
|
||||
|
||||
#: ../js/ui/messageTray.js:1087
|
||||
#: ../js/ui/messageTray.js:1091
|
||||
msgid "Remove"
|
||||
msgstr "Удалить"
|
||||
|
||||
#: ../js/ui/messageTray.js:2055
|
||||
#: ../js/ui/messageTray.js:1543
|
||||
msgid "Message Tray"
|
||||
msgstr "Панель сообщений"
|
||||
|
||||
#: ../js/ui/messageTray.js:2511
|
||||
#: ../js/ui/messageTray.js:2549
|
||||
msgid "System Information"
|
||||
msgstr "Системная информация"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373
|
||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Неизвестно"
|
||||
@ -1148,7 +1159,7 @@ msgstr "Введите команду:"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%d %B, %A"
|
||||
|
||||
@ -1200,7 +1211,7 @@ msgstr "Пароль"
|
||||
msgid "Remember Password"
|
||||
msgstr "Запомнить пароль"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
|
||||
msgid "Unlock"
|
||||
msgstr "Разблокировать"
|
||||
|
||||
@ -1318,7 +1329,7 @@ msgstr "Настроить клавиатуру"
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Настроить мышь"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236
|
||||
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
|
||||
msgid "Sound Settings"
|
||||
msgstr "Настроить звук"
|
||||
|
||||
@ -1607,7 +1618,7 @@ msgid "Unknown"
|
||||
msgstr "Неизвестно"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223
|
||||
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
|
||||
msgid "Volume"
|
||||
msgstr "Громкость"
|
||||
|
||||
@ -1615,67 +1626,63 @@ msgstr "Громкость"
|
||||
msgid "Microphone"
|
||||
msgstr "Микрофон"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:176
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
msgid "Log in as another user"
|
||||
msgstr "Войти от имени другого пользователя"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Available"
|
||||
msgstr "Доступен"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Busy"
|
||||
msgstr "Занят"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Invisible"
|
||||
msgstr "Невидим"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Away"
|
||||
msgstr "Отошёл"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Idle"
|
||||
msgstr "Бездействует"
|
||||
|
||||
#: ../js/ui/userMenu.js:195
|
||||
#: ../js/ui/userMenu.js:196
|
||||
msgid "Unavailable"
|
||||
msgstr "Недоступен"
|
||||
|
||||
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759
|
||||
msgid "Switch User"
|
||||
msgstr "Сменить пользователя"
|
||||
|
||||
#: ../js/ui/userMenu.js:619
|
||||
msgid "Switch Session"
|
||||
msgstr "Переключить сеанс"
|
||||
|
||||
#: ../js/ui/userMenu.js:743
|
||||
#: ../js/ui/userMenu.js:744
|
||||
msgid "Notifications"
|
||||
msgstr "Уведомления"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:752
|
||||
msgid "System Settings"
|
||||
msgstr "Системные параметры"
|
||||
|
||||
#: ../js/ui/userMenu.js:764
|
||||
#: ../js/ui/userMenu.js:760
|
||||
msgid "Switch User"
|
||||
msgstr "Сменить пользователя"
|
||||
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Log Out"
|
||||
msgstr "Выйти из системы"
|
||||
|
||||
#: ../js/ui/userMenu.js:769
|
||||
#: ../js/ui/userMenu.js:770
|
||||
msgid "Lock"
|
||||
msgstr "Заблокировать"
|
||||
|
||||
#: ../js/ui/userMenu.js:784
|
||||
#: ../js/ui/userMenu.js:785
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Установить обновления и выполнить перезагрузку"
|
||||
|
||||
#: ../js/ui/userMenu.js:802
|
||||
#: ../js/ui/userMenu.js:803
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Будет установлен статус «не беспокоить»"
|
||||
|
||||
#: ../js/ui/userMenu.js:803
|
||||
#: ../js/ui/userMenu.js:804
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@ -1695,7 +1702,7 @@ msgstr "Приложения"
|
||||
msgid "Search"
|
||||
msgstr "Поиск"
|
||||
|
||||
#: ../js/ui/wanda.js:119
|
||||
#: ../js/ui/wanda.js:117
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Sorry, no wisdom for you today:\n"
|
||||
@ -1704,12 +1711,12 @@ msgstr ""
|
||||
"Извините, на сегодня нет никаких советов:\n"
|
||||
"%s"
|
||||
|
||||
#: ../js/ui/wanda.js:123
|
||||
#: ../js/ui/wanda.js:121
|
||||
#, c-format
|
||||
msgid "%s the Oracle says"
|
||||
msgstr "Оракул говорит: «%s»"
|
||||
|
||||
#: ../js/ui/wanda.js:164
|
||||
#: ../js/ui/wanda.js:162
|
||||
msgid "Your favorite Easter Egg"
|
||||
msgstr "Ваше любимое «пасхальное яйцо»"
|
||||
|
||||
@ -1746,24 +1753,24 @@ msgstr[2] "%u входов"
|
||||
msgid "System Sounds"
|
||||
msgstr "Системные звуки"
|
||||
|
||||
#: ../src/main.c:330
|
||||
#: ../src/main.c:332
|
||||
msgid "Print version"
|
||||
msgstr "Показать номер версии"
|
||||
|
||||
#: ../src/main.c:336
|
||||
#: ../src/main.c:338
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Режим, используемый GDM для окна входа в систему"
|
||||
|
||||
#: ../src/main.c:342
|
||||
#: ../src/main.c:344
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr ""
|
||||
"Использовать для экрана входа в систему определённый режим, например «gdm»"
|
||||
|
||||
#: ../src/main.c:348
|
||||
#: ../src/main.c:350
|
||||
msgid "List possible modes"
|
||||
msgstr "Список возможных режимов"
|
||||
|
||||
#: ../src/shell-app.c:621
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "Не удалось запустить «%s»"
|
||||
@ -1788,6 +1795,9 @@ msgstr "По умолчанию"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Пользователь отклонил диалог аутентификации"
|
||||
|
||||
#~ msgid "Switch Session"
|
||||
#~ msgstr "Переключить сеанс"
|
||||
|
||||
#~ msgid "disabled OpenSearch providers"
|
||||
#~ msgstr "отключённые провайдеры OpenSearch"
|
||||
|
||||
|
296
po/sk.po
296
po/sk.po
@ -10,8 +10,8 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-10-18 16:51+0000\n"
|
||||
"PO-Revision-Date: 2012-10-13 22:35+0100\n"
|
||||
"POT-Creation-Date: 2012-10-27 16:22+0000\n"
|
||||
"PO-Revision-Date: 2012-10-28 19:49+0000\n"
|
||||
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
|
||||
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
|
||||
"Language: sk\n"
|
||||
@ -25,8 +25,6 @@ msgstr ""
|
||||
msgid "Screenshots"
|
||||
msgstr "Snímky obrazovky"
|
||||
|
||||
# PM: inde dianie na obrazovke
|
||||
# DK:presne taketo nieco som chcel povedat ale nevedel som ako
|
||||
#: ../data/50-gnome-shell-screenshot.xml.in.h:2
|
||||
msgid "Record a screencast"
|
||||
msgstr "Zaznamenať dianie na obrazovke"
|
||||
@ -37,20 +35,16 @@ msgstr "Systém"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:2
|
||||
msgid "Show the message tray"
|
||||
msgstr "Zobraziť lištu správ"
|
||||
msgstr "Zobrazí lištu správ"
|
||||
|
||||
# tooltip
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:3
|
||||
#, fuzzy
|
||||
#| msgid "Show Applications"
|
||||
msgid "Show all applications"
|
||||
msgstr "Zobrazí aplikácie"
|
||||
msgstr "Zobrazí všetky aplikácie"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:4
|
||||
#, fuzzy
|
||||
#| msgid "Keybinding to open the application menu"
|
||||
msgid "Open the application menu"
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií"
|
||||
msgstr "Otvorí ponuku aplikácií"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
@ -85,13 +79,9 @@ msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||
msgid "Uuids of extensions to enable"
|
||||
msgstr "Uuid identifikátory rozšírení určených na povolenie"
|
||||
msgstr "Vlastnosť uuid rozšírení určených na povolenie"
|
||||
|
||||
# PM: nepáči sa mi konštrukcia viet, preklad vyznieva strojovo
|
||||
# DK: uz lepsie?
|
||||
# PM: lepšie ale nepáči sa mi org.gnome.Shell. mne sa vidí že to bude nejaký súbor a potom predložka na asi nebude dobre
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||
"should be loaded. Any extension that wants to be loaded needs to be in this "
|
||||
@ -101,7 +91,7 @@ msgstr ""
|
||||
"Rozšírenia pre GNOME Shell majú vlastnosť uuid; tento kľúč obsahuje zoznam "
|
||||
"rozšírení, ktoré by mali byť načítané. Každé rozšírenie, ktoré je potrebné "
|
||||
"načítať, musí byť v tomto zozname. Tento zoznam môžete upraviť aj ručne "
|
||||
"pomocou metód DBus EnableExtension a DisableExtension na org.gnome.Shell."
|
||||
"pomocou metód DBus EnableExtension a DisableExtension v org.gnome.Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||
msgid "Whether to collect stats about applications usage"
|
||||
@ -176,17 +166,15 @@ msgid "Keybinding to open the application menu."
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
#, fuzzy
|
||||
#| msgid "Keybinding to open the application menu"
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií"
|
||||
msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#, fuzzy
|
||||
#| msgid "Keybinding to open the application menu."
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
|
||||
msgstr ""
|
||||
"Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade "
|
||||
"aktivít."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
@ -211,7 +199,7 @@ msgstr "Ktorú klávesnicu používať"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Typ klávesnice, ktorý sa má používať."
|
||||
msgstr "Typ klávesnice, ktorá sa má používať."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Framerate used for recording screencasts."
|
||||
@ -273,6 +261,39 @@ msgstr ""
|
||||
"základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
|
||||
"formátu kontajneru by mala byť zmenená."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Pripojiť modálne dialógové okno k rodičovskému oknu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr "Tento kľúč preváži kľúč v org.gnome.mutter po spustení GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Usporiadanie tlačidiel na titulku okna"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
msgstr ""
|
||||
"Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení GNOME "
|
||||
"Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Pracovné priestory sú spravované dynamicky"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Pracovné priestory sú iba na primárnom monitore"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:124
|
||||
#, c-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
@ -286,11 +307,11 @@ msgstr "Rozšírenie"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:529
|
||||
#: ../js/gdm/loginDialog.js:560
|
||||
msgid "Session..."
|
||||
msgstr "Relácia..."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:677
|
||||
#: ../js/gdm/loginDialog.js:704
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Prihlásenie"
|
||||
@ -299,42 +320,42 @@ msgstr "Prihlásenie"
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:736
|
||||
#: ../js/gdm/loginDialog.js:763
|
||||
msgid "Not listed?"
|
||||
msgstr "Nie ste v zozname?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:901 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
|
||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:168
|
||||
msgid "Cancel"
|
||||
msgstr "Zrušiť"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:894
|
||||
#: ../js/gdm/loginDialog.js:906
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Prihlásiť sa"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1215
|
||||
#: ../js/gdm/loginDialog.js:1217
|
||||
msgid "Login Window"
|
||||
msgstr "Prihlasovacie okno"
|
||||
|
||||
#. Translators: accessible name of the power menu in the login screen
|
||||
#: ../js/gdm/powerMenu.js:37
|
||||
#: ../js/gdm/powerMenu.js:36
|
||||
msgid "Power"
|
||||
msgstr "Napájanie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:95 ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:659
|
||||
#: ../js/ui/userMenu.js:770
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Suspend"
|
||||
msgstr "Uspať"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:100
|
||||
#: ../js/gdm/powerMenu.js:98
|
||||
msgid "Restart"
|
||||
msgstr "Reštartovať"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:105 ../js/ui/userMenu.js:657
|
||||
#: ../js/ui/userMenu.js:659 ../js/ui/userMenu.js:769
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:665
|
||||
#: ../js/ui/userMenu.js:667 ../js/ui/userMenu.js:777
|
||||
msgid "Power Off"
|
||||
msgstr "Vypnúť"
|
||||
|
||||
@ -517,35 +538,35 @@ msgid "S"
|
||||
msgstr "So"
|
||||
|
||||
#. Translators: Text to show if there are no events
|
||||
#: ../js/ui/calendar.js:699
|
||||
#: ../js/ui/calendar.js:700
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Žiadne naplánované udalosti"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: ../js/ui/calendar.js:715
|
||||
#: ../js/ui/calendar.js:716
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e. %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: ../js/ui/calendar.js:718
|
||||
#: ../js/ui/calendar.js:719
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %e. %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:728
|
||||
#: ../js/ui/calendar.js:729
|
||||
msgid "Today"
|
||||
msgstr "Dnes"
|
||||
|
||||
#: ../js/ui/calendar.js:732
|
||||
#: ../js/ui/calendar.js:733
|
||||
msgid "Tomorrow"
|
||||
msgstr "Zajtra"
|
||||
|
||||
#: ../js/ui/calendar.js:743
|
||||
#: ../js/ui/calendar.js:744
|
||||
msgid "This week"
|
||||
msgstr "Tento týždeň"
|
||||
|
||||
#: ../js/ui/calendar.js:751
|
||||
#: ../js/ui/calendar.js:752
|
||||
msgid "Next week"
|
||||
msgstr "Ďalší týždeň"
|
||||
|
||||
@ -553,10 +574,11 @@ msgstr "Ďalší týždeň"
|
||||
msgid "Removable Devices"
|
||||
msgstr "Vymeniteľné zariadenia"
|
||||
|
||||
# DK: doplnil som slovo "programu", aby to znelo prirodzenejsie. priklad:po pripojeni USB kluca bolo zobrazene "Otvoriť pomocou Súbory"
|
||||
#: ../js/ui/components/autorunManager.js:591
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Otvoriť pomocou %s"
|
||||
msgstr "Otvoriť pomocou programu %s"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:617
|
||||
msgid "Eject"
|
||||
@ -623,7 +645,7 @@ msgstr ""
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:314
|
||||
msgid "Wired 802.1X authentication"
|
||||
msgstr "Overenie totožnosti drôtovej 802.1X"
|
||||
msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:316
|
||||
msgid "Network name: "
|
||||
@ -631,7 +653,7 @@ msgstr "Názov siete: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:321
|
||||
msgid "DSL authentication"
|
||||
msgstr "Overenie totožnosti DSL"
|
||||
msgstr "Overenie totožnosti k DSL"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:328
|
||||
msgid "PIN code required"
|
||||
@ -639,7 +661,7 @@ msgstr "Požaduje sa kód PIN"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:329
|
||||
msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "Pre zariadenie mobilnej siete je potrebný PIN kód"
|
||||
msgstr "Pre zariadenie mobilnej siete je potrebný kód PIN"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:330
|
||||
msgid "PIN: "
|
||||
@ -647,7 +669,7 @@ msgstr "PIN: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:336
|
||||
msgid "Mobile broadband network password"
|
||||
msgstr "Heslo pre mobilnú sieť"
|
||||
msgstr "Heslo k mobilnej sieti"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:337
|
||||
#, c-format
|
||||
@ -675,11 +697,12 @@ msgstr "Overiť totožnosť"
|
||||
msgid "Sorry, that didn't work. Please try again."
|
||||
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
|
||||
|
||||
# %d je datum, %t je cas
|
||||
#. Translators: this is a filename used for screencast recording
|
||||
#: ../js/ui/components/recorder.js:44
|
||||
#, no-c-format
|
||||
msgid "Screencast from %d %t"
|
||||
msgstr "Záznam videa obrazovky z %d %t"
|
||||
msgstr "Záznam videa obrazovky dňa %d o %t"
|
||||
|
||||
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
|
||||
#. system-users for now as Empathy does.
|
||||
@ -714,44 +737,42 @@ msgid "Mute"
|
||||
msgstr "Stlmiť"
|
||||
|
||||
#. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
|
||||
#: ../js/ui/components/telepathyClient.js:941
|
||||
#: ../js/ui/components/telepathyClient.js:943
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on Yesterday"
|
||||
msgstr ""
|
||||
msgstr "včera o <b>%H:%M</b>"
|
||||
|
||||
#. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
|
||||
#: ../js/ui/components/telepathyClient.js:947
|
||||
#, fuzzy, no-c-format
|
||||
#| msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
#: ../js/ui/components/telepathyClient.js:949
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>"
|
||||
msgstr "Čas odoslania: <b>%A</b>, <b>%R</b>"
|
||||
msgstr "v <b>%A</b> o <b>%H:%M</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year
|
||||
#: ../js/ui/components/telepathyClient.js:953
|
||||
#, fuzzy, no-c-format
|
||||
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
#: ../js/ui/components/telepathyClient.js:955
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b>"
|
||||
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year
|
||||
#: ../js/ui/components/telepathyClient.js:958
|
||||
#, fuzzy, no-c-format
|
||||
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
#: ../js/ui/components/telepathyClient.js:960
|
||||
#, no-c-format
|
||||
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
|
||||
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b> %Y"
|
||||
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:986
|
||||
#: ../js/ui/components/telepathyClient.js:988
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s odteraz vystupuje ako %s"
|
||||
msgstr "Kontakt %s odteraz vystupuje ako %s"
|
||||
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1085
|
||||
#: ../js/ui/components/telepathyClient.js:1087
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Pozvánka do %s"
|
||||
@ -759,42 +780,42 @@ msgstr "Pozvánka do %s"
|
||||
#. 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
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1093
|
||||
#: ../js/ui/components/telepathyClient.js:1095
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s vás pozýva aby ste sa pridali do %s"
|
||||
msgstr "Kontakt %s vás pozýva aby ste sa pridali do %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1095
|
||||
#: ../js/ui/components/telepathyClient.js:1174
|
||||
#: ../js/ui/components/telepathyClient.js:1237
|
||||
#: ../js/ui/components/telepathyClient.js:1097
|
||||
#: ../js/ui/components/telepathyClient.js:1176
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
msgid "Decline"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1175
|
||||
#: ../js/ui/components/telepathyClient.js:1238
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
msgid "Accept"
|
||||
msgstr "Prijať"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1126
|
||||
#: ../js/ui/components/telepathyClient.js:1128
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videohovor od používateľa %s"
|
||||
msgstr "Videohovor od kontaktu %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1131
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Hovor od používateľa %s"
|
||||
msgstr "Hovor od kontaktu %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1134
|
||||
#: ../js/ui/components/telepathyClient.js:1136
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
msgid "Reject"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1136
|
||||
#: ../js/ui/components/telepathyClient.js:1138
|
||||
msgid "Answer"
|
||||
msgstr "Prijať hovor"
|
||||
|
||||
@ -803,110 +824,111 @@ msgstr "Prijať hovor"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1168
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s vám posiela %s"
|
||||
msgstr "Kontakt %s vám posiela %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1203
|
||||
#: ../js/ui/components/telepathyClient.js:1205
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s by chcel získať oprávnenie vidieť, kedy ste pripojený"
|
||||
msgstr ""
|
||||
"Kontakt %s by chcel získať oprávnenie vidieť, kedy ste pripojený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1297
|
||||
msgid "Network error"
|
||||
msgstr "Chyba siete"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1297
|
||||
#: ../js/ui/components/telepathyClient.js:1299
|
||||
msgid "Authentication failed"
|
||||
msgstr "Overenie totožnosti zlyhalo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1299
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
msgid "Encryption error"
|
||||
msgstr "Chyba šifrovania"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Neposkytnutý certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Nedôveryhodný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certifikát s ukončenou platnosťou"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Neaktivovaný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Certifikát s nesúhlasným názvom hostiteľa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Certifikát s nesúhlasným odtlačkom"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sebou podpísaný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Stav je nastavený na odhlásený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Šifrovanie nie je dostupné"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Certifikát je neplatný"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Pripojenie bolo odmietnuté"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Nedá sa nadviazať spojenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Spojenie sa stratilo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Tento účet je už pripojený k serveru"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Účet na serveri už existuje"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
#: ../js/ui/components/telepathyClient.js:1335
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1335
|
||||
#: ../js/ui/components/telepathyClient.js:1337
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Certifikát bol zrušený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1337
|
||||
#: ../js/ui/components/telepathyClient.js:1339
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je "
|
||||
"kryptograficky slabý"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1339
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -914,26 +936,26 @@ msgstr ""
|
||||
"Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje "
|
||||
"limit stanovený kryptografickou knižnicou."
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
msgid "Internal error"
|
||||
msgstr "Vnútorná chyba"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Pripojenie k %s zlyhalo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Reconnect"
|
||||
msgstr "Znovu sa pripojiť"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
msgid "Edit account"
|
||||
msgstr "Upraviť účet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1406
|
||||
#: ../js/ui/components/telepathyClient.js:1408
|
||||
msgid "Unknown reason"
|
||||
msgstr "Neznámy dôvod"
|
||||
|
||||
@ -992,7 +1014,7 @@ msgstr[2] "Budete automaticky odhlásený o %d sekundy."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:74
|
||||
msgid "Logging out of the system."
|
||||
msgstr "Odhlasuje sa zo systému."
|
||||
msgstr "Prebieha odhlásenie zo systému."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:76
|
||||
msgctxt "button"
|
||||
@ -1120,21 +1142,21 @@ msgstr "Zobraziť zdroj"
|
||||
msgid "Web Page"
|
||||
msgstr "Webová stránka"
|
||||
|
||||
#: ../js/ui/messageTray.js:1082
|
||||
#: ../js/ui/messageTray.js:1083
|
||||
msgid "Open"
|
||||
msgstr "Otvoriť"
|
||||
|
||||
#: ../js/ui/messageTray.js:1089
|
||||
#: ../js/ui/messageTray.js:1090
|
||||
msgid "Remove"
|
||||
msgstr "Odstrániť"
|
||||
|
||||
# DK: zvazoval som pouzit "Panel správ"
|
||||
# neviem co bude vhodnejsie ako preklad "tray"
|
||||
#: ../js/ui/messageTray.js:1545
|
||||
#: ../js/ui/messageTray.js:1534
|
||||
msgid "Message Tray"
|
||||
msgstr "Lišta správ"
|
||||
|
||||
#: ../js/ui/messageTray.js:2552
|
||||
#: ../js/ui/messageTray.js:2557
|
||||
msgid "System Information"
|
||||
msgstr "Informácie o systéme"
|
||||
|
||||
@ -1175,7 +1197,7 @@ msgstr "Ukončiť"
|
||||
msgid "Activities"
|
||||
msgstr "Aktivity"
|
||||
|
||||
#: ../js/ui/panel.js:965
|
||||
#: ../js/ui/panel.js:966
|
||||
msgid "Top Bar"
|
||||
msgstr "Horná lišta"
|
||||
|
||||
@ -1197,11 +1219,11 @@ msgstr "Prosím, zadajte príkaz:"
|
||||
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:79
|
||||
#: ../js/ui/screenShield.js:80
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e. %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:143
|
||||
#: ../js/ui/screenShield.js:144
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
@ -1209,13 +1231,13 @@ msgstr[0] "%d nových správ"
|
||||
msgstr[1] "%d nová správa"
|
||||
msgstr[2] "%d nové správy"
|
||||
|
||||
#: ../js/ui/screenShield.js:145
|
||||
#: ../js/ui/screenShield.js:146
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d nových upozornení"
|
||||
msgstr[1] "%d nové upozornenie"
|
||||
msgstr[2] "%d nové upozornenia"
|
||||
msgstr[0] "%d nových oznámení"
|
||||
msgstr[1] "%d nové oznámenie"
|
||||
msgstr[2] "%d nové oznámenia"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:275
|
||||
msgid "Searching..."
|
||||
@ -1249,13 +1271,13 @@ msgstr "Heslo"
|
||||
msgid "Remember Password"
|
||||
msgstr "Zapamätať heslo"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
|
||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:171
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokovať"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:39
|
||||
msgid "Accessibility"
|
||||
msgstr "Prístupnosť"
|
||||
msgstr "Zjednodušenie ovládania"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:44
|
||||
msgid "Zoom"
|
||||
@ -1537,7 +1559,7 @@ msgstr "Mobilné"
|
||||
|
||||
#: ../js/ui/status/network.js:1628
|
||||
msgid "VPN Connections"
|
||||
msgstr "VPN pripojenia"
|
||||
msgstr "Pripojenia k VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1635
|
||||
msgid "Network Settings"
|
||||
@ -1669,7 +1691,7 @@ msgstr "Hlasitosť"
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofón"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:177
|
||||
#: ../js/ui/unlockDialog.js:178
|
||||
msgid "Log in as another user"
|
||||
msgstr "Prihlásiť ako iný používateľ"
|
||||
|
||||
@ -1697,35 +1719,35 @@ msgstr "Nečinný"
|
||||
msgid "Unavailable"
|
||||
msgstr "Nedostupný"
|
||||
|
||||
#: ../js/ui/userMenu.js:735
|
||||
#: ../js/ui/userMenu.js:743
|
||||
msgid "Notifications"
|
||||
msgstr "Upozornenia"
|
||||
|
||||
#: ../js/ui/userMenu.js:743
|
||||
#: ../js/ui/userMenu.js:751
|
||||
msgid "System Settings"
|
||||
msgstr "Nastavenia systému"
|
||||
|
||||
#: ../js/ui/userMenu.js:751
|
||||
#: ../js/ui/userMenu.js:759
|
||||
msgid "Switch User"
|
||||
msgstr "Prepnúť používateľa"
|
||||
|
||||
#: ../js/ui/userMenu.js:756
|
||||
#: ../js/ui/userMenu.js:764
|
||||
msgid "Log Out"
|
||||
msgstr "Odhlásiť sa"
|
||||
|
||||
#: ../js/ui/userMenu.js:761
|
||||
#: ../js/ui/userMenu.js:769
|
||||
msgid "Lock"
|
||||
msgstr "Uzamknúť"
|
||||
|
||||
#: ../js/ui/userMenu.js:776
|
||||
#: ../js/ui/userMenu.js:784
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Nainštalovať aktualizácie a reštartovať"
|
||||
|
||||
#: ../js/ui/userMenu.js:794
|
||||
#: ../js/ui/userMenu.js:802
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Váš stav bude nastavený na zaneprázdnený"
|
||||
|
||||
#: ../js/ui/userMenu.js:795
|
||||
#: ../js/ui/userMenu.js:803
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
|
24
po/ug.po
24
po/ug.po
@ -218,12 +218,12 @@ msgstr "يىغقۇچقا قوش"
|
||||
#: ../js/ui/appFavorites.js:91
|
||||
#, c-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
|
||||
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
|
||||
|
||||
#: ../js/ui/appFavorites.js:122
|
||||
#, c-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
|
||||
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
@ -437,7 +437,7 @@ msgstr "يېقىنقى تۈرلەر"
|
||||
#: ../js/ui/endSessionDialog.js:63
|
||||
#, c-format
|
||||
msgid "Log Out %s"
|
||||
msgstr "%s تىزىمدىن چىقىش"
|
||||
msgstr "%s تىزىمدىن چىقىش"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
|
||||
msgid "Log Out"
|
||||
@ -452,7 +452,7 @@ msgstr ""
|
||||
#: ../js/ui/endSessionDialog.js:66
|
||||
#, c-format
|
||||
msgid "%s will be logged out automatically in %d seconds."
|
||||
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
|
||||
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:67
|
||||
#, c-format
|
||||
@ -566,7 +566,7 @@ msgstr "سىزىقچە"
|
||||
#: ../js/ui/panel.js:533
|
||||
#, c-format
|
||||
msgid "Quit %s"
|
||||
msgstr "%s چېكىن"
|
||||
msgstr "%s چېكىن"
|
||||
|
||||
#. Button on the left side of the panel.
|
||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||
@ -799,7 +799,7 @@ msgstr "رەت قىل"
|
||||
#: ../js/ui/status/bluetooth.js:408
|
||||
#, c-format
|
||||
msgid "Pairing confirmation for %s"
|
||||
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
|
||||
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
|
||||
#, c-format
|
||||
@ -823,7 +823,7 @@ msgstr "ماسلاشمىدى"
|
||||
#: ../js/ui/status/bluetooth.js:441
|
||||
#, c-format
|
||||
msgid "Pairing request for %s"
|
||||
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
|
||||
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:449
|
||||
msgid "Please enter the PIN mentioned on the device."
|
||||
@ -1074,22 +1074,22 @@ msgstr "مىكروفون"
|
||||
#: ../js/ui/telepathyClient.js:335
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s توردا."
|
||||
msgstr "%s توردا."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:340
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s توردا يوق."
|
||||
msgstr "%s توردا يوق."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:343
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s يوق."
|
||||
msgstr "%s يوق."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:346
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s ئالدىراش."
|
||||
msgstr "%s ئالدىراش."
|
||||
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
@ -1114,7 +1114,7 @@ msgstr "ئىزدە"
|
||||
#: ../js/ui/windowAttentionHandler.js:42
|
||||
#, c-format
|
||||
msgid "%s has finished starting"
|
||||
msgstr "%s باشلاشنى تاماملىدى"
|
||||
msgstr "%s باشلاشنى تاماملىدى"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:44
|
||||
#, c-format
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <string.h>
|
||||
#define HANDLE_LIBICAL_MEMORY
|
||||
#include <libecal/libecal.h>
|
||||
#include <libedataserverui/libedataserverui.h>
|
||||
|
||||
#undef CALENDAR_ENABLE_DEBUG
|
||||
#include "calendar-debug.h"
|
||||
|
@ -34,7 +34,6 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#define HANDLE_LIBICAL_MEMORY
|
||||
#include <libecal/libecal.h>
|
||||
@ -985,9 +984,11 @@ on_name_lost (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
gpointer user_data)
|
||||
{
|
||||
GMainLoop *main_loop = user_data;
|
||||
|
||||
g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n",
|
||||
(gint) getpid ());
|
||||
gtk_main_quit ();
|
||||
g_main_loop_quit (main_loop);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1003,11 +1004,13 @@ stdin_channel_io_func (GIOChannel *source,
|
||||
GIOCondition condition,
|
||||
gpointer data)
|
||||
{
|
||||
GMainLoop *main_loop = data;
|
||||
|
||||
if (condition & G_IO_HUP)
|
||||
{
|
||||
g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n",
|
||||
(gint) getpid ());
|
||||
gtk_main_quit ();
|
||||
g_main_loop_quit (main_loop);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1022,6 +1025,7 @@ main (int argc,
|
||||
{
|
||||
GError *error;
|
||||
GOptionContext *opt_context;
|
||||
GMainLoop *main_loop;
|
||||
gint ret;
|
||||
guint name_owner_id;
|
||||
GIOChannel *stdin_channel;
|
||||
@ -1031,9 +1035,7 @@ main (int argc,
|
||||
name_owner_id = 0;
|
||||
stdin_channel = NULL;
|
||||
|
||||
/* We need to initialize GTK+ since evolution-data-server may decide to use
|
||||
* GTK+ to pop up a dialog box */
|
||||
gtk_init (&argc, &argv);
|
||||
g_type_init ();
|
||||
|
||||
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
|
||||
g_assert (introspection_data != NULL);
|
||||
@ -1048,11 +1050,15 @@ main (int argc,
|
||||
goto out;
|
||||
}
|
||||
|
||||
main_loop = g_main_loop_new (NULL, FALSE);
|
||||
|
||||
stdin_channel = g_io_channel_unix_new (STDIN_FILENO);
|
||||
g_io_add_watch (stdin_channel,
|
||||
G_IO_HUP,
|
||||
stdin_channel_io_func,
|
||||
NULL);
|
||||
g_io_add_watch_full (stdin_channel,
|
||||
G_PRIORITY_DEFAULT,
|
||||
G_IO_HUP,
|
||||
stdin_channel_io_func,
|
||||
g_main_loop_ref (main_loop),
|
||||
(GDestroyNotify) g_main_loop_unref);
|
||||
|
||||
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
|
||||
BUS_NAME,
|
||||
@ -1061,10 +1067,12 @@ main (int argc,
|
||||
on_bus_acquired,
|
||||
on_name_acquired,
|
||||
on_name_lost,
|
||||
NULL,
|
||||
NULL);
|
||||
g_main_loop_ref (main_loop),
|
||||
(GDestroyNotify) g_main_loop_unref);
|
||||
|
||||
gtk_main ();
|
||||
g_main_loop_run (main_loop);
|
||||
|
||||
g_main_loop_unref (main_loop);
|
||||
|
||||
ret = 0;
|
||||
|
||||
|
@ -28,7 +28,7 @@ def show_version(option, opt_str, value, parser):
|
||||
def wait_for_dbus_name(wait_name):
|
||||
loop = GLib.MainLoop()
|
||||
|
||||
def on_name_appeared(connection, name, name_owner, *args):
|
||||
def on_name_appeared(connection, name, new_owner, *args):
|
||||
if not (name == wait_name and new_owner != ''):
|
||||
return
|
||||
loop.quit()
|
||||
@ -60,13 +60,18 @@ def start_perf_helper():
|
||||
wait_for_dbus_name (PERF_HELPER_NAME)
|
||||
|
||||
def stop_perf_helper():
|
||||
proxy = Gio.DBusProxy(g_bus_type=Gio.BusType.SESSION,
|
||||
g_name=PERF_HELPER_NAME,
|
||||
g_interface=PERF_HELPER_IFACE,
|
||||
g_object_path=PERF_HELPER_PATH)
|
||||
bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
|
||||
|
||||
proxy = Gio.DBusProxy.new_sync(bus,
|
||||
Gio.DBusProxyFlags.NONE,
|
||||
None,
|
||||
PERF_HELPER_NAME,
|
||||
PERF_HELPER_PATH,
|
||||
PERF_HELPER_IFACE,
|
||||
None)
|
||||
proxy.Exit()
|
||||
|
||||
def start_shell(extra_args, perf_output=None):
|
||||
def start_shell(perf_output=None):
|
||||
# Set up environment
|
||||
env = dict(os.environ)
|
||||
env['SHELL_PERF_MODULE'] = options.perf
|
||||
@ -76,19 +81,21 @@ def start_shell(extra_args, perf_output=None):
|
||||
env['SHELL_PERF_OUTPUT'] = perf_output
|
||||
|
||||
self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
|
||||
args = []
|
||||
args.append(os.path.join(self_dir, 'gnome-shell'))
|
||||
# pass on any additional arguments
|
||||
args += extra_args
|
||||
|
||||
if options.replace:
|
||||
args.append('--replace')
|
||||
|
||||
return subprocess.Popen(args, env=env)
|
||||
|
||||
def run_shell(args, perf_output=None):
|
||||
def run_shell(perf_output=None):
|
||||
# we do no additional supervision of gnome-shell,
|
||||
# beyond that of wait
|
||||
# in particular, we don't kill the shell upon
|
||||
# receving a KeyboardInterrupt, as we expect to be
|
||||
# in the same process group
|
||||
shell = start_shell(extra_args, perf_output=perf_output)
|
||||
shell = start_shell(perf_output=perf_output)
|
||||
shell.wait()
|
||||
return shell.returncode == 0
|
||||
|
||||
@ -173,7 +180,7 @@ def upload_performance_report(report_text):
|
||||
print "Performance report upload failed with status %d" % response.status
|
||||
print response.read()
|
||||
|
||||
def run_performance_test(args):
|
||||
def run_performance_test():
|
||||
iters = options.perf_iters
|
||||
if options.perf_warmup:
|
||||
iters += 1
|
||||
@ -192,7 +199,7 @@ def run_performance_test(args):
|
||||
# Run the performance test and collect the output as JSON
|
||||
normal_exit = False
|
||||
try:
|
||||
normal_exit = run_shell(args, perf_output=output_file)
|
||||
normal_exit = run_shell(perf_output=output_file)
|
||||
except:
|
||||
stop_perf_helper()
|
||||
raise
|
||||
@ -288,7 +295,8 @@ def run_performance_test(args):
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option("", "--perf", metavar="PERF_MODULE",
|
||||
help="Specify the name of a performance module to run")
|
||||
help="Specify the name of a performance module to run",
|
||||
default="core")
|
||||
parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
|
||||
help="Numbers of iterations of performance module to run",
|
||||
default=1)
|
||||
@ -301,9 +309,16 @@ parser.add_option("", "--perf-upload", action="store_true",
|
||||
parser.add_option("", "--version", action="callback", callback=show_version,
|
||||
help="Display version and exit")
|
||||
|
||||
parser.add_option("-r", "--replace", action="store_true",
|
||||
help="Replace the running window manager")
|
||||
|
||||
options, args = parser.parse_args()
|
||||
|
||||
normal_exit = run_performance_test(args)
|
||||
if args:
|
||||
parser.print_usage()
|
||||
sys.exit(1)
|
||||
|
||||
normal_exit = run_performance_test()
|
||||
if normal_exit:
|
||||
sys.exit(0)
|
||||
else:
|
||||
|
@ -73,6 +73,7 @@ struct _ShellApp
|
||||
char *window_id_string;
|
||||
|
||||
char *casefolded_name;
|
||||
char *casefolded_generic_name;
|
||||
char *name_collation_key;
|
||||
char *casefolded_exec;
|
||||
char **casefolded_keywords;
|
||||
@ -1310,6 +1311,7 @@ static void
|
||||
shell_app_init_search_data (ShellApp *app)
|
||||
{
|
||||
const char *name;
|
||||
const char *generic_name;
|
||||
const char *exec;
|
||||
const char * const *keywords;
|
||||
char *normalized_exec;
|
||||
@ -1319,6 +1321,12 @@ shell_app_init_search_data (ShellApp *app)
|
||||
name = g_app_info_get_name (G_APP_INFO (appinfo));
|
||||
app->casefolded_name = shell_util_normalize_and_casefold (name);
|
||||
|
||||
generic_name = g_desktop_app_info_get_generic_name (appinfo);
|
||||
if (generic_name)
|
||||
app->casefolded_generic_name = shell_util_normalize_and_casefold (generic_name);
|
||||
else
|
||||
app->casefolded_generic_name = NULL;
|
||||
|
||||
exec = g_app_info_get_executable (G_APP_INFO (appinfo));
|
||||
normalized_exec = shell_util_normalize_and_casefold (exec);
|
||||
app->casefolded_exec = trim_exec_line (normalized_exec);
|
||||
@ -1388,6 +1396,18 @@ _shell_app_match_search_terms (ShellApp *app,
|
||||
current_match = MATCH_SUBSTRING;
|
||||
}
|
||||
|
||||
if (app->casefolded_generic_name)
|
||||
{
|
||||
p = strstr (app->casefolded_generic_name, term);
|
||||
if (p != NULL)
|
||||
{
|
||||
if (p == app->casefolded_generic_name || *(p - 1) == ' ')
|
||||
current_match = MATCH_PREFIX;
|
||||
else if (current_match < MATCH_PREFIX)
|
||||
current_match = MATCH_SUBSTRING;
|
||||
}
|
||||
}
|
||||
|
||||
if (app->casefolded_exec)
|
||||
{
|
||||
p = strstr (app->casefolded_exec, term);
|
||||
@ -1497,6 +1517,7 @@ shell_app_finalize (GObject *object)
|
||||
g_free (app->window_id_string);
|
||||
|
||||
g_free (app->casefolded_name);
|
||||
g_free (app->casefolded_generic_name);
|
||||
g_free (app->name_collation_key);
|
||||
g_free (app->casefolded_exec);
|
||||
g_strfreev (app->casefolded_keywords);
|
||||
|
@ -1693,43 +1693,3 @@ shell_global_get_session_mode (ShellGlobal *global)
|
||||
|
||||
return global->session_mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_global_create_xrootpmap_texture:
|
||||
* @global: The #ShellGlobal
|
||||
*
|
||||
* This returns the _XROOTPMAP_ID pixmap that gdm should have stuffed
|
||||
* in the root window. The goal here is to allow a smooth fade between
|
||||
* plymouth and the shell greeter. This is also a workaround for gjs not
|
||||
* supporting raw xlib types.
|
||||
*
|
||||
* Returns: (transfer floating): A #ClutterActor that represents the
|
||||
* _XROOTPMAP_ID pixmap property from the root window.
|
||||
*/
|
||||
ClutterActor *
|
||||
shell_global_create_xrootpmap_texture (ShellGlobal *global)
|
||||
{
|
||||
Atom res_type;
|
||||
int res_format;
|
||||
unsigned long res_nitems, bytesafter;
|
||||
unsigned char *data;
|
||||
Pixmap root_pixmap_id = None;
|
||||
|
||||
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
|
||||
|
||||
if (XGetWindowProperty (global->xdisplay,
|
||||
DefaultRootWindow (global->xdisplay),
|
||||
XInternAtom (global->xdisplay, "_XROOTPMAP_ID", False),
|
||||
0, G_MAXLONG, False, XA_PIXMAP,
|
||||
&res_type, &res_format, &res_nitems, &bytesafter, &data) == Success)
|
||||
{
|
||||
if (res_type == XA_PIXMAP && res_format == 32 && res_nitems == 1)
|
||||
root_pixmap_id = * (Pixmap *) data;
|
||||
XFree (data);
|
||||
}
|
||||
|
||||
if (root_pixmap_id != None)
|
||||
return clutter_x11_texture_pixmap_new_with_pixmap (root_pixmap_id);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
@ -136,8 +136,6 @@ void shell_global_reexec_self (ShellGlobal *global);
|
||||
|
||||
const char * shell_global_get_session_mode (ShellGlobal *global);
|
||||
|
||||
ClutterActor * shell_global_create_xrootpmap_texture (ShellGlobal *global);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __SHELL_GLOBAL_H__ */
|
||||
|
@ -37,10 +37,11 @@
|
||||
|
||||
#define ISO_3166_COUNTRY_CODES DATADIR "/zoneinfo/iso3166.tab"
|
||||
|
||||
|
||||
static ShellCountryMobileProvider *country_mobile_provider_new (const char *country_code,
|
||||
const gchar *country_name);
|
||||
|
||||
static GHashTable *
|
||||
read_country_codes (void)
|
||||
read_country_codes (const gchar *country_codes)
|
||||
{
|
||||
GHashTable *table;
|
||||
GIOChannel *channel;
|
||||
@ -48,18 +49,21 @@ read_country_codes (void)
|
||||
GError *error = NULL;
|
||||
GIOStatus status;
|
||||
|
||||
channel = g_io_channel_new_file (ISO_3166_COUNTRY_CODES, "r", &error);
|
||||
channel = g_io_channel_new_file (country_codes, "r", &error);
|
||||
if (!channel) {
|
||||
if (error) {
|
||||
g_warning ("Could not read " ISO_3166_COUNTRY_CODES ": %s", error->message);
|
||||
g_warning ("Could not read %s: %s", country_codes, error->message);
|
||||
g_error_free (error);
|
||||
} else
|
||||
g_warning ("Could not read " ISO_3166_COUNTRY_CODES ": Unknown error");
|
||||
g_warning ("Could not read %s: Unknown error", country_codes);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
||||
table = g_hash_table_new_full (g_str_hash,
|
||||
g_str_equal,
|
||||
g_free,
|
||||
(GDestroyNotify)shell_country_mobile_provider_unref);
|
||||
buffer = g_string_sized_new (32);
|
||||
|
||||
status = G_IO_STATUS_NORMAL;
|
||||
@ -69,6 +73,7 @@ read_country_codes (void)
|
||||
switch (status) {
|
||||
case G_IO_STATUS_NORMAL:
|
||||
if (buffer->str[0] != '#') {
|
||||
ShellCountryMobileProvider *country_provider;
|
||||
char **pieces;
|
||||
|
||||
pieces = g_strsplit (buffer->str, "\t", 2);
|
||||
@ -80,7 +85,8 @@ read_country_codes (void)
|
||||
pieces[1] = g_strdup (_("United Kingdom"));
|
||||
}
|
||||
|
||||
g_hash_table_insert (table, pieces[0], pieces[1]);
|
||||
country_provider = country_mobile_provider_new (pieces[0], pieces[1]);
|
||||
g_hash_table_insert (table, pieces[0], country_provider);
|
||||
g_free (pieces);
|
||||
}
|
||||
|
||||
@ -117,7 +123,6 @@ typedef enum {
|
||||
} MobileContextState;
|
||||
|
||||
typedef struct {
|
||||
GHashTable *country_codes;
|
||||
GHashTable *table;
|
||||
|
||||
char *current_country;
|
||||
@ -276,6 +281,86 @@ shell_mobile_provider_get_type (void)
|
||||
return type;
|
||||
}
|
||||
|
||||
static ShellCountryMobileProvider *
|
||||
country_mobile_provider_new (const char *country_code,
|
||||
const gchar *country_name)
|
||||
{
|
||||
ShellCountryMobileProvider *country_provider;
|
||||
|
||||
country_provider = g_slice_new0 (ShellCountryMobileProvider);
|
||||
country_provider->refs = 1;
|
||||
country_provider->country_code = g_strdup (country_code);
|
||||
country_provider->country_name = g_strdup (country_name);
|
||||
return country_provider;
|
||||
}
|
||||
|
||||
ShellCountryMobileProvider *
|
||||
shell_country_mobile_provider_ref (ShellCountryMobileProvider *country_provider)
|
||||
{
|
||||
country_provider->refs++;
|
||||
|
||||
return country_provider;
|
||||
}
|
||||
|
||||
void
|
||||
shell_country_mobile_provider_unref (ShellCountryMobileProvider *country_provider)
|
||||
{
|
||||
if (--country_provider->refs == 0) {
|
||||
g_free (country_provider->country_code);
|
||||
g_free (country_provider->country_name);
|
||||
g_slist_free_full (country_provider->providers,
|
||||
(GDestroyNotify) shell_mobile_provider_unref);
|
||||
g_slice_free (ShellCountryMobileProvider, country_provider);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_country_mobile_provider_get_country_code:
|
||||
*
|
||||
* Returns: (transfer none): the code of the country.
|
||||
*/
|
||||
const gchar *
|
||||
shell_country_mobile_provider_get_country_code (ShellCountryMobileProvider *country_provider)
|
||||
{
|
||||
return country_provider->country_code;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_country_mobile_provider_get_country_name:
|
||||
*
|
||||
* Returns: (transfer none): the name of the country.
|
||||
*/
|
||||
const gchar *
|
||||
shell_country_mobile_provider_get_country_name (ShellCountryMobileProvider *country_provider)
|
||||
{
|
||||
return country_provider->country_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_country_mobile_provider_get_providers:
|
||||
*
|
||||
* Returns: (element-type Shell.MobileProvider) (transfer none): the
|
||||
* list of #ShellMobileProvider this country exposes.
|
||||
*/
|
||||
GSList *
|
||||
shell_country_mobile_provider_get_providers (ShellCountryMobileProvider *country_provider)
|
||||
{
|
||||
return country_provider->providers;
|
||||
}
|
||||
|
||||
GType
|
||||
shell_country_mobile_provider_get_type (void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
if (G_UNLIKELY (type == 0)) {
|
||||
type = g_boxed_type_register_static ("ShellCountryMobileProvider",
|
||||
(GBoxedCopyFunc) shell_country_mobile_provider_ref,
|
||||
(GBoxedFreeFunc) shell_country_mobile_provider_unref);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
static void
|
||||
provider_list_free (gpointer data)
|
||||
{
|
||||
@ -310,15 +395,17 @@ parser_toplevel_start (MobileParser *parser,
|
||||
for (i = 0; attribute_names && attribute_names[i]; i++) {
|
||||
if (!strcmp (attribute_names[i], "code")) {
|
||||
char *country_code;
|
||||
char *country;
|
||||
ShellCountryMobileProvider *country_provider;
|
||||
|
||||
country_code = g_ascii_strup (attribute_values[i], -1);
|
||||
country = g_hash_table_lookup (parser->country_codes, country_code);
|
||||
if (country) {
|
||||
parser->current_country = g_strdup (country);
|
||||
g_free (country_code);
|
||||
} else
|
||||
parser->current_country = country_code;
|
||||
country_provider = g_hash_table_lookup (parser->table, country_code);
|
||||
/* Ensure we have a country provider for this country code */
|
||||
if (!country_provider) {
|
||||
g_warning ("%s: adding providers for unknown country '%s'", __func__, country_code);
|
||||
country_provider = country_mobile_provider_new (country_code, NULL);
|
||||
g_hash_table_insert (parser->table, country_code, country_provider);
|
||||
}
|
||||
parser->current_country = country_code;
|
||||
|
||||
parser->state = PARSER_COUNTRY;
|
||||
break;
|
||||
@ -455,7 +542,13 @@ parser_country_end (MobileParser *parser,
|
||||
const char *name)
|
||||
{
|
||||
if (!strcmp (name, "country")) {
|
||||
g_hash_table_insert (parser->table, parser->current_country, parser->current_providers);
|
||||
ShellCountryMobileProvider *country_provider;
|
||||
|
||||
country_provider = g_hash_table_lookup (parser->table, parser->current_country);
|
||||
if (country_provider)
|
||||
/* Store providers for this country */
|
||||
country_provider->providers = parser->current_providers;
|
||||
|
||||
parser->current_country = NULL;
|
||||
parser->current_providers = NULL;
|
||||
parser->text_buffer = NULL;
|
||||
@ -616,15 +709,16 @@ static const GMarkupParser mobile_parser = {
|
||||
|
||||
/**
|
||||
* shell_mobile_providers_parse:
|
||||
* @out_ccs: (out) (allow-none): (element-type utf8 utf8): a #GHashTable containing
|
||||
* country codes
|
||||
* @country_codes: (allow-none) File with the list of country codes.
|
||||
* @service_providers: (allow-none) File with the list of service providers.
|
||||
*
|
||||
* Returns: (element-type utf8 GList) (transfer container): a
|
||||
* hash table where keys are country names #gchar, values are a #GSList
|
||||
* of #ShellMobileProvider. Everything is destroyed with g_hash_table_destroy().
|
||||
*/
|
||||
* Returns: (element-type utf8 Shell.CountryMobileProvider) (transfer full): a
|
||||
* hash table where keys are country names #gchar and values are #ShellCountryMobileProvider.
|
||||
* Everything is destroyed with g_hash_table_destroy().
|
||||
*/
|
||||
GHashTable *
|
||||
shell_mobile_providers_parse (GHashTable **out_ccs)
|
||||
shell_mobile_providers_parse (const gchar *country_codes,
|
||||
const gchar *service_providers)
|
||||
{
|
||||
GMarkupParseContext *ctx;
|
||||
GIOChannel *channel;
|
||||
@ -634,24 +728,29 @@ shell_mobile_providers_parse (GHashTable **out_ccs)
|
||||
GIOStatus status;
|
||||
gsize len = 0;
|
||||
|
||||
/* Use default paths if none given */
|
||||
if (!country_codes)
|
||||
country_codes = ISO_3166_COUNTRY_CODES;
|
||||
if (!service_providers)
|
||||
service_providers = MOBILE_BROADBAND_PROVIDER_INFO;
|
||||
|
||||
memset (&parser, 0, sizeof (MobileParser));
|
||||
|
||||
parser.country_codes = read_country_codes ();
|
||||
if (!parser.country_codes)
|
||||
parser.table = read_country_codes (country_codes);
|
||||
if (!parser.table)
|
||||
goto out;
|
||||
|
||||
channel = g_io_channel_new_file (MOBILE_BROADBAND_PROVIDER_INFO, "r", &error);
|
||||
channel = g_io_channel_new_file (service_providers, "r", &error);
|
||||
if (!channel) {
|
||||
if (error) {
|
||||
g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": %s", error->message);
|
||||
g_warning ("Could not read %s: %s", service_providers, error->message);
|
||||
g_error_free (error);
|
||||
} else
|
||||
g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": Unknown error");
|
||||
g_warning ("Could not read %s: Unknown error", service_providers);
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
parser.table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, provider_list_free);
|
||||
parser.state = PARSER_TOPLEVEL;
|
||||
|
||||
ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL);
|
||||
@ -696,13 +795,7 @@ shell_mobile_providers_parse (GHashTable **out_ccs)
|
||||
g_free (parser.current_country);
|
||||
g_free (parser.text_buffer);
|
||||
|
||||
out:
|
||||
if (parser.country_codes) {
|
||||
if (out_ccs)
|
||||
*out_ccs = parser.country_codes;
|
||||
else
|
||||
g_hash_table_destroy (parser.country_codes);
|
||||
}
|
||||
out:
|
||||
|
||||
return parser.table;
|
||||
}
|
||||
@ -744,12 +837,17 @@ dump_gsm (ShellMobileAccessMethod *method)
|
||||
static void
|
||||
dump_country (gpointer key, gpointer value, gpointer user_data)
|
||||
{
|
||||
GSList *citer, *miter;
|
||||
GSList *miter, *citer;
|
||||
ShellCountryMobileProvider *country_provider = value;
|
||||
|
||||
for (citer = value; citer; citer = g_slist_next (citer)) {
|
||||
g_print ("Country: %s (%s)\n",
|
||||
country_provider->country_code,
|
||||
country_provider->country_name);
|
||||
|
||||
for (citer = country_provider->providers; citer; citer = g_slist_next (citer)) {
|
||||
ShellMobileProvider *provider = citer->data;
|
||||
|
||||
g_print ("Provider: %s (%s)\n", provider->name, (const char *) key);
|
||||
g_print (" Provider: %s (%s)\n", provider->name, (const char *) key);
|
||||
for (miter = provider->methods; miter; miter = g_slist_next (miter)) {
|
||||
ShellMobileAccessMethod *method = miter->data;
|
||||
GSList *liter;
|
||||
@ -779,10 +877,10 @@ dump_country (gpointer key, gpointer value, gpointer user_data)
|
||||
}
|
||||
|
||||
void
|
||||
shell_mobile_providers_dump (GHashTable *providers)
|
||||
shell_mobile_providers_dump (GHashTable *country_providers)
|
||||
{
|
||||
g_return_if_fail (providers != NULL);
|
||||
g_hash_table_foreach (providers, dump_country, NULL);
|
||||
g_return_if_fail (country_providers != NULL);
|
||||
g_hash_table_foreach (country_providers, dump_country, NULL);
|
||||
}
|
||||
|
||||
/* All the following don't exist in nm-applet, because C doesn't need
|
||||
|
@ -76,10 +76,19 @@ typedef struct {
|
||||
gint refs;
|
||||
} ShellMobileProvider;
|
||||
|
||||
typedef struct {
|
||||
char *country_code;
|
||||
char *country_name;
|
||||
GSList *providers;
|
||||
|
||||
gint refs;
|
||||
} ShellCountryMobileProvider;
|
||||
|
||||
|
||||
GType shell_gsm_mcc_mnc_get_type (void); /* added in porting */
|
||||
GType shell_mobile_provider_get_type (void);
|
||||
GType shell_mobile_access_method_get_type (void);
|
||||
GType shell_mobile_provider_get_type (void);
|
||||
GType shell_country_mobile_provider_get_type (void);
|
||||
|
||||
ShellMobileProvider *shell_mobile_provider_ref (ShellMobileProvider *provider);
|
||||
void shell_mobile_provider_unref (ShellMobileProvider *provider);
|
||||
@ -89,8 +98,14 @@ GSList * shell_mobile_provider_get_cdma_sid (ShellMobileProvider *pr
|
||||
ShellMobileAccessMethod *shell_mobile_access_method_ref (ShellMobileAccessMethod *method);
|
||||
void shell_mobile_access_method_unref (ShellMobileAccessMethod *method);
|
||||
|
||||
GHashTable *shell_mobile_providers_parse (GHashTable **out_ccs);
|
||||
ShellCountryMobileProvider *shell_country_mobile_provider_ref (ShellCountryMobileProvider *country_provider);
|
||||
void shell_country_mobile_provider_unref (ShellCountryMobileProvider *country_provider);
|
||||
const gchar *shell_country_mobile_provider_get_country_code (ShellCountryMobileProvider *country_provider);
|
||||
const gchar *shell_country_mobile_provider_get_country_name (ShellCountryMobileProvider *country_provider);
|
||||
GSList *shell_country_mobile_provider_get_providers (ShellCountryMobileProvider *country_provider);
|
||||
|
||||
void shell_mobile_providers_dump (GHashTable *providers);
|
||||
GHashTable *shell_mobile_providers_parse (const gchar *country_codes,
|
||||
const gchar *service_providers);
|
||||
void shell_mobile_providers_dump (GHashTable *country_providers);
|
||||
|
||||
#endif /* SHELL_MOBILE_PROVIDERS_H */
|
||||
|
@ -11,6 +11,8 @@
|
||||
#define GST_USE_UNSTABLE_API
|
||||
#include <gst/gst.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
#include "shell-recorder-src.h"
|
||||
#include "shell-recorder.h"
|
||||
#include "shell-screen-grabber.h"
|
||||
@ -65,7 +67,7 @@ struct _ShellRecorder {
|
||||
|
||||
int framerate;
|
||||
char *pipeline_description;
|
||||
char *filename;
|
||||
char *file_template;
|
||||
|
||||
/* We might have multiple pipelines that are finishing encoding
|
||||
* to go along with the current pipeline where we are recording.
|
||||
@ -90,6 +92,7 @@ struct _RecorderPipeline
|
||||
GstElement *pipeline;
|
||||
GstElement *src;
|
||||
int outfile;
|
||||
char *filename;
|
||||
};
|
||||
|
||||
static void recorder_set_stage (ShellRecorder *recorder,
|
||||
@ -98,8 +101,8 @@ static void recorder_set_framerate (ShellRecorder *recorder,
|
||||
int framerate);
|
||||
static void recorder_set_pipeline (ShellRecorder *recorder,
|
||||
const char *pipeline);
|
||||
static void recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename);
|
||||
static void recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template);
|
||||
|
||||
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
|
||||
static void recorder_pipeline_closed (RecorderPipeline *pipeline);
|
||||
@ -109,7 +112,7 @@ enum {
|
||||
PROP_STAGE,
|
||||
PROP_FRAMERATE,
|
||||
PROP_PIPELINE,
|
||||
PROP_FILENAME
|
||||
PROP_FILE_TEMPLATE
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
|
||||
@ -269,18 +272,6 @@ static void
|
||||
shell_recorder_finalize (GObject *object)
|
||||
{
|
||||
ShellRecorder *recorder = SHELL_RECORDER (object);
|
||||
GSList *l;
|
||||
|
||||
for (l = recorder->pipelines; l; l = l->next)
|
||||
{
|
||||
RecorderPipeline *pipeline = l->data;
|
||||
|
||||
/* Remove the back-reference. The pipeline will be freed
|
||||
* when it finishes. (Or when the process exits, but that's
|
||||
* out of our control.)
|
||||
*/
|
||||
pipeline->recorder = NULL;
|
||||
}
|
||||
|
||||
if (recorder->update_memory_used_timeout)
|
||||
g_source_remove (recorder->update_memory_used_timeout);
|
||||
@ -290,7 +281,7 @@ shell_recorder_finalize (GObject *object)
|
||||
|
||||
recorder_set_stage (recorder, NULL);
|
||||
recorder_set_pipeline (recorder, NULL);
|
||||
recorder_set_filename (recorder, NULL);
|
||||
recorder_set_file_template (recorder, NULL);
|
||||
|
||||
g_object_unref (recorder->grabber);
|
||||
|
||||
@ -917,22 +908,22 @@ recorder_set_pipeline (ShellRecorder *recorder,
|
||||
}
|
||||
|
||||
static void
|
||||
recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename)
|
||||
recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template)
|
||||
{
|
||||
if (filename == recorder->filename ||
|
||||
(filename && recorder->filename && strcmp (recorder->filename, filename) == 0))
|
||||
if (file_template == recorder->file_template ||
|
||||
(file_template && recorder->file_template && strcmp (recorder->file_template, file_template) == 0))
|
||||
return;
|
||||
|
||||
if (recorder->current_pipeline)
|
||||
shell_recorder_close (recorder);
|
||||
|
||||
if (recorder->filename)
|
||||
g_free (recorder->filename);
|
||||
if (recorder->file_template)
|
||||
g_free (recorder->file_template);
|
||||
|
||||
recorder->filename = g_strdup (filename);
|
||||
recorder->file_template = g_strdup (file_template);
|
||||
|
||||
g_object_notify (G_OBJECT (recorder), "filename");
|
||||
g_object_notify (G_OBJECT (recorder), "file-template");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -954,8 +945,8 @@ shell_recorder_set_property (GObject *object,
|
||||
case PROP_PIPELINE:
|
||||
recorder_set_pipeline (recorder, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_FILENAME:
|
||||
recorder_set_filename (recorder, g_value_get_string (value));
|
||||
case PROP_FILE_TEMPLATE:
|
||||
recorder_set_file_template (recorder, g_value_get_string (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -982,8 +973,8 @@ shell_recorder_get_property (GObject *object,
|
||||
case PROP_PIPELINE:
|
||||
g_value_set_string (value, recorder->pipeline_description);
|
||||
break;
|
||||
case PROP_FILENAME:
|
||||
g_value_set_string (value, recorder->filename);
|
||||
case PROP_FILE_TEMPLATE:
|
||||
g_value_set_string (value, recorder->file_template);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -1027,9 +1018,9 @@ shell_recorder_class_init (ShellRecorderClass *klass)
|
||||
G_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_FILENAME,
|
||||
g_param_spec_string ("filename",
|
||||
"Filename",
|
||||
PROP_FILE_TEMPLATE,
|
||||
g_param_spec_string ("file-template",
|
||||
"File Template",
|
||||
"The filename template to use for output files",
|
||||
NULL,
|
||||
G_PARAM_READWRITE));
|
||||
@ -1149,13 +1140,14 @@ get_absolute_path (char *maybe_relative)
|
||||
* be opened.
|
||||
*/
|
||||
static int
|
||||
recorder_open_outfile (ShellRecorder *recorder)
|
||||
recorder_open_outfile (ShellRecorder *recorder,
|
||||
char **outfilename)
|
||||
{
|
||||
const char *pattern;
|
||||
int flags;
|
||||
int outfile = -1;
|
||||
|
||||
pattern = recorder->filename;
|
||||
pattern = recorder->file_template;
|
||||
if (!pattern)
|
||||
return -1;
|
||||
|
||||
@ -1230,8 +1222,12 @@ recorder_open_outfile (ShellRecorder *recorder)
|
||||
{
|
||||
g_printerr ("Recording to %s\n", path);
|
||||
|
||||
if (outfilename != NULL)
|
||||
*outfilename = path;
|
||||
else
|
||||
g_free (path);
|
||||
g_string_free (filename, TRUE);
|
||||
g_free (path);
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -1269,7 +1265,8 @@ recorder_pipeline_add_sink (RecorderPipeline *pipeline)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
pipeline->outfile = recorder_open_outfile (pipeline->recorder);
|
||||
pipeline->outfile = recorder_open_outfile (pipeline->recorder,
|
||||
&pipeline->filename);
|
||||
if (pipeline->outfile == -1)
|
||||
goto out;
|
||||
|
||||
@ -1344,6 +1341,10 @@ recorder_pipeline_free (RecorderPipeline *pipeline)
|
||||
if (pipeline->outfile != -1)
|
||||
close (pipeline->outfile);
|
||||
|
||||
g_free (pipeline->filename);
|
||||
|
||||
g_clear_object (&pipeline->recorder);
|
||||
|
||||
g_free (pipeline);
|
||||
}
|
||||
|
||||
@ -1393,6 +1394,10 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
|
||||
|
||||
if (pipeline->recorder)
|
||||
{
|
||||
GtkRecentManager *recent_manager;
|
||||
GFile *file;
|
||||
char *uri;
|
||||
|
||||
ShellRecorder *recorder = pipeline->recorder;
|
||||
if (pipeline == recorder->current_pipeline)
|
||||
{
|
||||
@ -1401,6 +1406,15 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
|
||||
shell_recorder_close (recorder);
|
||||
}
|
||||
|
||||
recent_manager = gtk_recent_manager_get_default ();
|
||||
|
||||
file = g_file_new_for_path (pipeline->filename);
|
||||
uri = g_file_get_uri (file);
|
||||
gtk_recent_manager_add_item (recent_manager,
|
||||
uri);
|
||||
g_free (uri);
|
||||
g_object_unref (file);
|
||||
|
||||
recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline);
|
||||
}
|
||||
|
||||
@ -1452,7 +1466,7 @@ recorder_open_pipeline (ShellRecorder *recorder)
|
||||
GstBus *bus;
|
||||
|
||||
pipeline = g_new0(RecorderPipeline, 1);
|
||||
pipeline->recorder = recorder;
|
||||
pipeline->recorder = g_object_ref (recorder);
|
||||
pipeline->outfile = - 1;
|
||||
|
||||
pipeline_description = recorder->pipeline_description;
|
||||
@ -1555,10 +1569,10 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_recorder_set_filename:
|
||||
* shell_recorder_set_file_template:
|
||||
* @recorder: the #ShellRecorder
|
||||
* @filename: the filename template to use for output files,
|
||||
* or %NULL for the defalt value.
|
||||
* @file_template: the filename template to use for output files,
|
||||
* or %NULL for the defalt value.
|
||||
*
|
||||
* Sets the filename that will be used when creating output
|
||||
* files. This is only used if the configured pipeline has an
|
||||
@ -1573,12 +1587,12 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||
* The default value is 'shell-%d%u-%c.ogg'.
|
||||
*/
|
||||
void
|
||||
shell_recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename)
|
||||
shell_recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template)
|
||||
{
|
||||
g_return_if_fail (SHELL_IS_RECORDER (recorder));
|
||||
|
||||
recorder_set_filename (recorder, filename);
|
||||
recorder_set_file_template (recorder, file_template);
|
||||
|
||||
}
|
||||
|
||||
@ -1593,7 +1607,7 @@ shell_recorder_set_filename (ShellRecorder *recorder,
|
||||
* should have an unconnected sink pad where the recorded
|
||||
* video is recorded. It will normally have a unconnected
|
||||
* source pad; output from that pad will be written into the
|
||||
* output file. (See shell_recorder_set_filename().) However
|
||||
* output file. (See shell_recorder_set_file_template().) However
|
||||
* the pipeline can also take care of its own output - this
|
||||
* might be used to send the output to an icecast server
|
||||
* via shout2send or similar.
|
||||
|
@ -32,8 +32,8 @@ ShellRecorder *shell_recorder_new (ClutterStage *stage);
|
||||
|
||||
void shell_recorder_set_framerate (ShellRecorder *recorder,
|
||||
int framerate);
|
||||
void shell_recorder_set_filename (ShellRecorder *recorder,
|
||||
const char *filename);
|
||||
void shell_recorder_set_file_template (ShellRecorder *recorder,
|
||||
const char *file_template);
|
||||
void shell_recorder_set_pipeline (ShellRecorder *recorder,
|
||||
const char *pipeline);
|
||||
gboolean shell_recorder_record (ShellRecorder *recorder);
|
||||
|
@ -65,6 +65,10 @@
|
||||
#include "st-clipboard.h"
|
||||
#include "st-private.h"
|
||||
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/cursorfont.h>
|
||||
|
||||
#include "st-widget-accessible.h"
|
||||
|
||||
#define HAS_FOCUS(actor) (clutter_actor_get_stage (actor) && clutter_stage_get_key_focus ((ClutterStage *) clutter_actor_get_stage (actor)) == actor)
|
||||
@ -613,6 +617,38 @@ st_entry_key_focus_in (ClutterActor *actor)
|
||||
clutter_actor_grab_key_focus (priv->entry);
|
||||
}
|
||||
|
||||
static void
|
||||
st_entry_set_cursor (StEntry *entry,
|
||||
gboolean use_ibeam)
|
||||
{
|
||||
Display *dpy;
|
||||
ClutterActor *stage, *actor = CLUTTER_ACTOR (entry);
|
||||
Window wid;
|
||||
static Cursor ibeam = None;
|
||||
|
||||
dpy = clutter_x11_get_default_display ();
|
||||
stage = clutter_actor_get_stage (actor);
|
||||
wid = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
|
||||
|
||||
if (ibeam == None)
|
||||
ibeam = XCreateFontCursor (dpy, XC_xterm);
|
||||
|
||||
if (use_ibeam)
|
||||
XDefineCursor (dpy, wid, ibeam);
|
||||
else
|
||||
XUndefineCursor (dpy, wid);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
st_entry_crossing_event (ClutterActor *actor,
|
||||
ClutterCrossingEvent *event)
|
||||
{
|
||||
if (event->source == ST_ENTRY (actor)->priv->entry && event->related != NULL)
|
||||
st_entry_set_cursor (ST_ENTRY (actor), (event->type == CLUTTER_ENTER));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
st_entry_class_init (StEntryClass *klass)
|
||||
{
|
||||
@ -635,6 +671,9 @@ st_entry_class_init (StEntryClass *klass)
|
||||
actor_class->key_press_event = st_entry_key_press_event;
|
||||
actor_class->key_focus_in = st_entry_key_focus_in;
|
||||
|
||||
actor_class->enter_event = st_entry_crossing_event;
|
||||
actor_class->leave_event = st_entry_crossing_event;
|
||||
|
||||
widget_class->style_changed = st_entry_style_changed;
|
||||
widget_class->navigate_focus = st_entry_navigate_focus;
|
||||
widget_class->get_accessible_type = st_entry_accessible_get_type;
|
||||
|
@ -450,26 +450,26 @@ static gboolean
|
||||
string_in_list (GString *stryng,
|
||||
const char *list)
|
||||
{
|
||||
const char *cur;
|
||||
char *cur;
|
||||
char *l = g_strdup (list);
|
||||
char *temp;
|
||||
gboolean found = FALSE;
|
||||
|
||||
for (cur = list; *cur;)
|
||||
cur = strtok_r (l, " \t\f\r\n", &temp);
|
||||
while (cur != NULL)
|
||||
{
|
||||
while (*cur && cr_utils_is_white_space (*cur))
|
||||
cur++;
|
||||
|
||||
if (strncmp (cur, stryng->str, stryng->len) == 0)
|
||||
if (!strqcmp (cur, stryng->str, stryng->len))
|
||||
{
|
||||
cur += stryng->len;
|
||||
if ((!*cur) || cr_utils_is_white_space (*cur))
|
||||
return TRUE;
|
||||
found = TRUE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* skip to next whitespace character */
|
||||
while (*cur && !cr_utils_is_white_space (*cur))
|
||||
cur++;
|
||||
cur = strtok_r (NULL, " \t\f\r\n", &temp);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
out:
|
||||
g_free (l);
|
||||
return found;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -3,6 +3,7 @@
|
||||
#define GST_USE_UNSTABLE_API
|
||||
#include "shell-recorder.h"
|
||||
#include <clutter/clutter.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gst/gst.h>
|
||||
|
||||
/* Very simple test of the ShellRecorder class; shows some text strings
|
||||
@ -11,23 +12,34 @@
|
||||
static ShellRecorder *recorder = NULL;
|
||||
|
||||
static gboolean
|
||||
stop_recording_timeout (gpointer data)
|
||||
stop_recording_timeout (ClutterActor *stage)
|
||||
{
|
||||
if (recorder)
|
||||
{
|
||||
shell_recorder_close (recorder);
|
||||
|
||||
/* quit when the recorder finishes closing
|
||||
*/
|
||||
g_object_weak_ref (G_OBJECT (recorder),
|
||||
(GWeakNotify)
|
||||
clutter_actor_destroy,
|
||||
stage);
|
||||
|
||||
g_object_unref (recorder);
|
||||
}
|
||||
|
||||
clutter_main_quit ();
|
||||
else
|
||||
{
|
||||
clutter_actor_destroy (stage);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_animation_completed (ClutterAnimation *animation)
|
||||
on_animation_completed (ClutterAnimation *animation,
|
||||
ClutterStage *stage)
|
||||
{
|
||||
g_timeout_add (1000, stop_recording_timeout, NULL);
|
||||
g_timeout_add (1000, (GSourceFunc) stop_recording_timeout, stage);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -35,7 +47,7 @@ on_stage_realized (ClutterActor *stage,
|
||||
gpointer data)
|
||||
{
|
||||
recorder = shell_recorder_new (CLUTTER_STAGE (stage));
|
||||
shell_recorder_set_filename (recorder, "test-recorder.ogg");
|
||||
shell_recorder_set_file_template (recorder, "test-recorder.ogg");
|
||||
shell_recorder_record (recorder);
|
||||
}
|
||||
|
||||
@ -46,6 +58,7 @@ int main (int argc, char **argv)
|
||||
ClutterAnimation *animation;
|
||||
ClutterColor red, green, blue;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
gst_init (&argc, &argv);
|
||||
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
|
||||
return 1;
|
||||
@ -69,7 +82,7 @@ int main (int argc, char **argv)
|
||||
"y", 240.0,
|
||||
NULL);
|
||||
g_signal_connect (animation, "completed",
|
||||
G_CALLBACK (on_animation_completed), NULL);
|
||||
G_CALLBACK (on_animation_completed), stage);
|
||||
|
||||
text = g_object_new (CLUTTER_TYPE_TEXT,
|
||||
"text", "Blue",
|
||||
@ -110,7 +123,5 @@ int main (int argc, char **argv)
|
||||
|
||||
clutter_main ();
|
||||
|
||||
g_object_unref (stage);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ TEST_JS = \
|
||||
interactive/scrolling.js \
|
||||
interactive/scroll-view-sizing.js \
|
||||
interactive/table.js \
|
||||
interactive/test-title.js \
|
||||
interactive/transitions.js \
|
||||
testcommon/100-200.svg \
|
||||
testcommon/200-100.svg \
|
||||
@ -25,11 +26,14 @@ TEST_JS = \
|
||||
testcommon/border-image.png \
|
||||
testcommon/face-plain.png \
|
||||
testcommon/ui.js \
|
||||
testcommon/iso3166-test.tab \
|
||||
testcommon/serviceproviders-test.xml \
|
||||
unit/format.js \
|
||||
unit/insertSorted.js \
|
||||
unit/markup.js \
|
||||
unit/jsParse.js \
|
||||
unit/url.js
|
||||
unit/url.js \
|
||||
unit/mobileProviders.js
|
||||
EXTRA_DIST += $(TEST_JS)
|
||||
|
||||
TEST_MISC = \
|
||||
|
34
tests/interactive/test-title.js
Executable file
34
tests/interactive/test-title.js
Executable file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env gjs
|
||||
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Mainloop = imports.mainloop;
|
||||
|
||||
function nextTitle() {
|
||||
let length = Math.random() * 20;
|
||||
let str = '';
|
||||
|
||||
for (let i = 0; i < length; i++) {
|
||||
// 97 == 'a'
|
||||
str += String.fromCharCode(97 + Math.random() * 26);
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
function main() {
|
||||
Gtk.init(null);
|
||||
|
||||
let win = new Gtk.Window({ title: nextTitle() });
|
||||
win.connect('destroy', Gtk.main_quit);
|
||||
win.present();
|
||||
|
||||
Mainloop.timeout_add(5000, function() {
|
||||
win.title = nextTitle();
|
||||
return true;
|
||||
});
|
||||
|
||||
Gtk.main();
|
||||
}
|
||||
|
||||
main();
|
||||
|
3
tests/testcommon/iso3166-test.tab
Normal file
3
tests/testcommon/iso3166-test.tab
Normal file
@ -0,0 +1,3 @@
|
||||
# Test country list
|
||||
ES Spain
|
||||
US United States
|
44
tests/testcommon/serviceproviders-test.xml
Normal file
44
tests/testcommon/serviceproviders-test.xml
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version="1.0"?>
|
||||
|
||||
<!-- -*- Mode: XML; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- -->
|
||||
|
||||
<!DOCTYPE serviceproviders SYSTEM "serviceproviders.2.dtd">
|
||||
|
||||
<serviceproviders format="2.0">
|
||||
|
||||
<!-- United States -->
|
||||
<country code="us">
|
||||
<provider>
|
||||
<name>AT&T</name>
|
||||
<gsm>
|
||||
<network-id mcc="310" mnc="038"/>
|
||||
<network-id mcc="310" mnc="090"/>
|
||||
<network-id mcc="310" mnc="150"/>
|
||||
</gsm>
|
||||
</provider>
|
||||
<provider>
|
||||
<name>Verizon</name>
|
||||
<gsm>
|
||||
<network-id mcc="310" mnc="995"/>
|
||||
<network-id mcc="311" mnc="480"/>
|
||||
</gsm>
|
||||
<cdma>
|
||||
<sid value="2"/>
|
||||
<sid value="4"/>
|
||||
<sid value="5"/>
|
||||
</cdma>
|
||||
</provider>
|
||||
</country>
|
||||
|
||||
<!-- Spain -->
|
||||
<country code="es">
|
||||
<provider>
|
||||
<name>Movistar (Telefónica)</name>
|
||||
<gsm>
|
||||
<network-id mcc="214" mnc="05"/>
|
||||
<network-id mcc="214" mnc="07"/>
|
||||
</gsm>
|
||||
</provider>
|
||||
</country>
|
||||
|
||||
</serviceproviders>
|
78
tests/unit/mobileProviders.js
Normal file
78
tests/unit/mobileProviders.js
Normal file
@ -0,0 +1,78 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const GLib = imports.gi.GLib;
|
||||
const Shell = imports.gi.Shell;
|
||||
const JsUnit = imports.jsUnit;
|
||||
const ModemManager = imports.misc.modemManager;
|
||||
const Environment = imports.ui.environment;
|
||||
|
||||
Environment.init();
|
||||
|
||||
// Load test providers table
|
||||
let countrycodesPath = GLib.getenv("GNOME_SHELL_TESTSDIR") + "/testcommon/iso3166-test.tab";
|
||||
let serviceprovidersPath = GLib.getenv("GNOME_SHELL_TESTSDIR") + "/testcommon/serviceproviders-test.xml";
|
||||
let providersTable = Shell.mobile_providers_parse(countrycodesPath, serviceprovidersPath);
|
||||
|
||||
function assertCountryFound(country_code, expected_country_name) {
|
||||
let country = providersTable[country_code];
|
||||
JsUnit.assertNotUndefined(country);
|
||||
JsUnit.assertEquals(country.get_country_name(), expected_country_name);
|
||||
}
|
||||
|
||||
function assertCountryNotFound(country_code) {
|
||||
let country = providersTable[country_code];
|
||||
JsUnit.assertUndefined(country);
|
||||
}
|
||||
|
||||
function assertProviderFoundForMCCMNC(mccmnc, expected_provider_name) {
|
||||
let provider_name = ModemManager.findProviderForMCCMNC(providersTable, mccmnc);
|
||||
JsUnit.assertEquals(provider_name, expected_provider_name);
|
||||
}
|
||||
|
||||
function assertProviderNotFoundForMCCMNC(mccmnc) {
|
||||
let provider_name = ModemManager.findProviderForMCCMNC(providersTable, mccmnc);
|
||||
JsUnit.assertNull(provider_name);
|
||||
}
|
||||
|
||||
function assertProviderFoundForSid(sid, expected_provider_name) {
|
||||
let provider_name = ModemManager.findProviderForSid(providersTable, sid);
|
||||
JsUnit.assertEquals(provider_name, expected_provider_name);
|
||||
}
|
||||
|
||||
function assertProviderNotFoundForSid(sid) {
|
||||
let provider_name = ModemManager.findProviderForSid(providersTable, sid);
|
||||
JsUnit.assertNull(provider_name);
|
||||
}
|
||||
|
||||
// TEST:
|
||||
// * Both 'US' and 'ES' country info should be loaded
|
||||
assertCountryFound("ES", "Spain");
|
||||
assertCountryFound("US", "United States");
|
||||
|
||||
// TEST:
|
||||
// * Country info for 'FR' not given
|
||||
assertCountryNotFound("FR");
|
||||
|
||||
// TEST:
|
||||
// * Ensure operator names are found for the given MCC/MNC codes
|
||||
assertProviderFoundForMCCMNC("21405", "Movistar (Telefónica)");
|
||||
assertProviderFoundForMCCMNC("21407", "Movistar (Telefónica)");
|
||||
assertProviderFoundForMCCMNC("310038", "AT&T");
|
||||
assertProviderFoundForMCCMNC("310090", "AT&T");
|
||||
assertProviderFoundForMCCMNC("310150", "AT&T");
|
||||
assertProviderFoundForMCCMNC("310995", "Verizon");
|
||||
assertProviderFoundForMCCMNC("311480", "Verizon");
|
||||
|
||||
// TEST:
|
||||
// * Ensure NULL is given for unexpected MCC/MNC codes
|
||||
assertProviderNotFoundForMCCMNC("12345");
|
||||
|
||||
// TEST:
|
||||
// * Ensure operator names are found for the given SID codes
|
||||
assertProviderFoundForSid(2, "Verizon");
|
||||
assertProviderFoundForSid(4, "Verizon");
|
||||
assertProviderFoundForSid(5, "Verizon");
|
||||
|
||||
// TEST:
|
||||
// * Ensure NULL is given for unexpected SID codes
|
||||
assertProviderNotFoundForSid(1);
|
Reference in New Issue
Block a user