Compare commits
113 Commits
3.7.4
...
wip/gcampa
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3e79d293f7 | ||
![]() |
d457073c10 | ||
![]() |
8b2864ee70 | ||
![]() |
af1c799246 | ||
![]() |
f6aa0ee532 | ||
![]() |
b0e22a795e | ||
![]() |
f91671498b | ||
![]() |
443f02cd92 | ||
![]() |
b682c8e052 | ||
![]() |
d07c8dcd9c | ||
![]() |
9bcce4f271 | ||
![]() |
eab497a814 | ||
![]() |
a8c8df6ee8 | ||
![]() |
b3549f421d | ||
![]() |
ae0accb5a4 | ||
![]() |
d367566db9 | ||
![]() |
35812208e7 | ||
![]() |
afaff724f6 | ||
![]() |
ec8dfb0cad | ||
![]() |
7798da8dff | ||
![]() |
89a49ce72e | ||
![]() |
655dce6a4b | ||
![]() |
2cf403a3e9 | ||
![]() |
4351ad2414 | ||
![]() |
fd2944fa8d | ||
![]() |
f4626cf8ad | ||
![]() |
65bf0d20e7 | ||
![]() |
2f496de98a | ||
![]() |
644b8304ab | ||
![]() |
5c4570fcaa | ||
![]() |
ac0bd3b116 | ||
![]() |
7ad881d0ec | ||
![]() |
9a25224890 | ||
![]() |
3f6f597093 | ||
![]() |
9ab22fe551 | ||
![]() |
9794e71a86 | ||
![]() |
8cb3884fae | ||
![]() |
098bd4509b | ||
![]() |
4dc5bac72f | ||
![]() |
b150869b51 | ||
![]() |
daf8be9f78 | ||
![]() |
d14cf1e80b | ||
![]() |
605d34008e | ||
![]() |
d3135414cc | ||
![]() |
b3f29b46cf | ||
![]() |
4545719e18 | ||
![]() |
cc60afa31a | ||
![]() |
85743ede7e | ||
![]() |
8e231cb2ec | ||
![]() |
72405cd43f | ||
![]() |
a9ad9d5e6d | ||
![]() |
2d79c7333f | ||
![]() |
7a79cfd76b | ||
![]() |
6600d6b6d9 | ||
![]() |
8ca25aed8b | ||
![]() |
1db353a0fc | ||
![]() |
2d384eb546 | ||
![]() |
5d1de33026 | ||
![]() |
f2ba49fa35 | ||
![]() |
772ae1cae4 | ||
![]() |
1d267f2642 | ||
![]() |
cba299160a | ||
![]() |
ea33193e73 | ||
![]() |
ef69c228fd | ||
![]() |
7ba0f07732 | ||
![]() |
07696086a2 | ||
![]() |
426581eb1e | ||
![]() |
fe88811a40 | ||
![]() |
30aaa6e26c | ||
![]() |
4bd071bf3c | ||
![]() |
309ac65447 | ||
![]() |
fe246470ce | ||
![]() |
660cfe707c | ||
![]() |
a0d7d7bc4b | ||
![]() |
758764ea75 | ||
![]() |
6935c62a61 | ||
![]() |
a34d4d9124 | ||
![]() |
c49bb5aa03 | ||
![]() |
427750d6af | ||
![]() |
b9ad5f8727 | ||
![]() |
c776826425 | ||
![]() |
a8ede18db5 | ||
![]() |
9aa84ec54a | ||
![]() |
91a6520c3b | ||
![]() |
45fde4888e | ||
![]() |
484ef5f2f6 | ||
![]() |
cdd354739a | ||
![]() |
420f544bf3 | ||
![]() |
15b33189ae | ||
![]() |
685a9f36f6 | ||
![]() |
3b57812e29 | ||
![]() |
d583c48992 | ||
![]() |
0e636ea67e | ||
![]() |
c9ce1bd30f | ||
![]() |
f2cbc3192c | ||
![]() |
56d76791f1 | ||
![]() |
df2cab877f | ||
![]() |
27ad8305e5 | ||
![]() |
c97b4dd48e | ||
![]() |
59ecd610b1 | ||
![]() |
42c1285ead | ||
![]() |
622c1c9236 | ||
![]() |
2d88508f9d | ||
![]() |
86efba4ecc | ||
![]() |
90fae00aa6 | ||
![]() |
d497ed4040 | ||
![]() |
c4a21ae5ad | ||
![]() |
5e5798bee9 | ||
![]() |
d793077b91 | ||
![]() |
3e826f9249 | ||
![]() |
2adfb60dc4 | ||
![]() |
f7212cf80c | ||
![]() |
69556643bb |
14
NEWS
14
NEWS
@@ -1,3 +1,17 @@
|
||||
3.7.4.1
|
||||
=======
|
||||
* userMenu: Use show-full-name-in-top-bar setting [Bastien; #689561]
|
||||
* dateMenu: Add "Open Clocks" entry [Mathieu; #644390]
|
||||
* screenshot: Immediately show the flash spot [Jasper; #691875]
|
||||
* Misc. bug fixes [Rico, Jeremy]
|
||||
|
||||
Contributors:
|
||||
Jeremy Bicha, Mathieu Bridon, Bastien Nocera, Jasper St. Pierre,
|
||||
Rico Tzschichholz
|
||||
|
||||
Translations:
|
||||
Ihar Hrachyshka [be]
|
||||
|
||||
3.7.4
|
||||
=====
|
||||
* Make menu separators crisp [Giovanni, Allan; #641745]
|
||||
|
85
configure.ac
85
configure.ac
@@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.7.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[3.7.4.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@@ -16,8 +16,6 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
# Needed for per-target cflags, like in gnomeshell-taskpanel
|
||||
AM_PROG_CC_C_O
|
||||
|
||||
# Initialize libtool
|
||||
LT_PREREQ([2.2.6])
|
||||
@@ -62,15 +60,14 @@ fi
|
||||
|
||||
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||
|
||||
CLUTTER_MIN_VERSION=1.11.11
|
||||
CLUTTER_MIN_VERSION=1.13.4
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||
GJS_MIN_VERSION=1.33.2
|
||||
GJS_MIN_VERSION=1.35.4
|
||||
MUTTER_MIN_VERSION=3.7.4
|
||||
GTK_MIN_VERSION=3.3.9
|
||||
GIO_MIN_VERSION=2.35.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
LIBEDATASERVER_MIN_VERSION=3.5.3
|
||||
LIBEDATASERVERUI_MIN_VERSION=3.5.3
|
||||
TELEPATHY_GLIB_MIN_VERSION=0.17.5
|
||||
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
||||
POLKIT_MIN_VERSION=0.100
|
||||
@@ -96,7 +93,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
||||
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
||||
libcanberra
|
||||
libcanberra libcanberra-gtk3
|
||||
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
||||
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||
@@ -104,30 +101,14 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
||||
gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION)
|
||||
|
||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||
|
||||
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
||||
|
||||
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
|
||||
|
||||
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
|
||||
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
|
||||
|
||||
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
||||
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LIBS=$LIBS
|
||||
CFLAGS=$GNOME_SHELL_CFLAGS
|
||||
LIBS=$GNOME_SHELL_LIBS
|
||||
AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LIBS=$saved_LIBS
|
||||
|
||||
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
||||
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.2.2)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4)
|
||||
|
||||
AC_MSG_CHECKING([for bluetooth support])
|
||||
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||
@@ -174,6 +155,19 @@ if test "x$use_systemd" = "xyes"; then
|
||||
AC_DEFINE(WITH_SYSTEMD, 1, [systemd support])
|
||||
fi
|
||||
|
||||
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
|
||||
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
|
||||
|
||||
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
|
||||
|
||||
saved_CFLAGS=$CFLAGS
|
||||
saved_LIBS=$LIBS
|
||||
CFLAGS=$GNOME_SHELL_CFLAGS
|
||||
LIBS=$GNOME_SHELL_LIBS
|
||||
AC_CHECK_FUNCS(XFixesCreatePointerBarrier)
|
||||
CFLAGS=$saved_CFLAGS
|
||||
LIBS=$saved_LIBS
|
||||
|
||||
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
|
||||
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
|
||||
AC_SUBST(MUTTER_GIR_DIR)
|
||||
@@ -199,16 +193,6 @@ fi
|
||||
|
||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||
AM_PATH_GLIB_2_0()
|
||||
G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
|
||||
AC_SUBST(G_IR_SCANNER)
|
||||
G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
|
||||
AC_SUBST(G_IR_COMPILER)
|
||||
G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
|
||||
AC_SUBST(G_IR_GENERATE)
|
||||
GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
|
||||
AC_SUBST(GIRDIR)
|
||||
TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
|
||||
AC_SUBST(TYPELIBDIR)
|
||||
|
||||
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||
|
||||
@@ -224,32 +208,7 @@ if test "$enable_man" != no; then
|
||||
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,
|
||||
AS_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],[Turn on compiler warnings]),,
|
||||
enable_compile_warnings=error)
|
||||
|
||||
changequote(,)dnl
|
||||
if test "$enable_compile_warnings" != no ; then
|
||||
if test "x$GCC" = "xyes"; then
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wall[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wall" ;;
|
||||
esac
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Wmissing-prototypes[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wmissing-prototypes" ;;
|
||||
esac
|
||||
if test "$enable_compile_warnings" = error ; then
|
||||
case " $CFLAGS " in
|
||||
*[\ \ ]-Werror[\ \ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
changequote([,])dnl
|
||||
GNOME_COMPILE_WARNINGS([error])
|
||||
|
||||
AC_ARG_ENABLE(jhbuild-wrapper-script,
|
||||
AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no)
|
||||
|
@@ -65,11 +65,6 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
|
||||
menuitem in single-user, single-session situations.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="show-full-name" type="b">
|
||||
<default>true</default>
|
||||
<_summary>Show full name in the user menu</_summary>
|
||||
<_description>Whether the users full name is shown in the user menu or not.</_description>
|
||||
</key>
|
||||
<key name="remember-mount-password" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary>
|
||||
|
@@ -727,6 +727,10 @@ StScrollBar StButton#vhandle:active {
|
||||
-vertical-spacing: 32px;
|
||||
}
|
||||
|
||||
.window-picker.external-monitor {
|
||||
padding: 32px;
|
||||
}
|
||||
|
||||
/* Dash */
|
||||
|
||||
#dash {
|
||||
@@ -751,10 +755,6 @@ StScrollBar StButton#vhandle:active {
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
#viewSelector {
|
||||
spacing: 1em;
|
||||
}
|
||||
|
||||
/* Search Box */
|
||||
|
||||
#searchEntry {
|
||||
@@ -779,6 +779,10 @@ StScrollBar StButton#vhandle:active {
|
||||
spacing: 18px;
|
||||
}
|
||||
|
||||
#searchResultsBin {
|
||||
max-width: 1000px;
|
||||
}
|
||||
|
||||
#searchResultsContent {
|
||||
padding-right: 20px;
|
||||
spacing: 16px;
|
||||
@@ -959,7 +963,8 @@ StScrollBar StButton#vhandle:active {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.show-apps:checked > .overview-icon {
|
||||
.show-apps:checked > .overview-icon,
|
||||
.show-apps:active > .overview-icon {
|
||||
background-gradient-start: rgba(255, 255, 255, .05);
|
||||
background-gradient-end: rgba(255, 255, 255, .15);
|
||||
background-gradient-direction: vertical;
|
||||
@@ -1313,7 +1318,6 @@ StScrollBar StButton#vhandle:active {
|
||||
#message-tray {
|
||||
background: #2e3436 url(message-tray-background.png);
|
||||
background-repeat: repeat;
|
||||
transition-duration: 250ms;
|
||||
height: 72px;
|
||||
}
|
||||
|
||||
@@ -2413,6 +2417,7 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.screen-shield-notifications-box {
|
||||
spacing: 18px;
|
||||
max-width: 34em;
|
||||
}
|
||||
|
||||
.screen-shield-notification-source {
|
||||
|
@@ -66,4 +66,11 @@ its dependencies to build from tarballs.</description>
|
||||
<gnome:userid>fmuellner</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
<maintainer>
|
||||
<foaf:Person>
|
||||
<foaf:name>Ray Strode</foaf:name>
|
||||
<foaf:mbox rdf:resource="mailto:halfline@gmail.com" />
|
||||
<gnome:userid>halfline</gnome:userid>
|
||||
</foaf:Person>
|
||||
</maintainer>
|
||||
</Project>
|
||||
|
@@ -28,6 +28,7 @@ nobase_dist_js_DATA = \
|
||||
misc/extensionUtils.js \
|
||||
misc/fileUtils.js \
|
||||
misc/gnomeSession.js \
|
||||
misc/hash.js \
|
||||
misc/history.js \
|
||||
misc/jsParse.js \
|
||||
misc/loginManager.js \
|
||||
|
@@ -128,6 +128,7 @@ const UserListItem = new Lang.Class({
|
||||
|
||||
let layout = new St.BoxLayout({ vertical: false });
|
||||
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
can_focus: true,
|
||||
child: layout,
|
||||
reactive: true,
|
||||
@@ -492,6 +493,7 @@ const SessionListItem = new Lang.Class({
|
||||
this.id = id;
|
||||
|
||||
this.actor = new St.Button({ style_class: 'login-dialog-session-list-item',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
can_focus: true,
|
||||
reactive: true,
|
||||
x_fill: true,
|
||||
@@ -552,6 +554,7 @@ const SessionList = new Lang.Class({
|
||||
this.actor.child = this._box;
|
||||
|
||||
this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
can_focus: true,
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
@@ -674,7 +677,7 @@ const LoginDialog = new Lang.Class({
|
||||
this.parent({ shellReactive: true,
|
||||
styleClass: 'login-dialog',
|
||||
parentActor: parentActor,
|
||||
keybindingMode: Main.KeybindingMode.LOGIN_SCREEN,
|
||||
keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN,
|
||||
shouldFadeIn: false });
|
||||
this.connect('destroy',
|
||||
Lang.bind(this, this._onDestroy));
|
||||
@@ -787,6 +790,7 @@ const LoginDialog = new Lang.Class({
|
||||
let notListedLabel = new St.Label({ text: _("Not listed?"),
|
||||
style_class: 'login-dialog-not-listed-label' });
|
||||
this._notListedButton = new St.Button({ style_class: 'login-dialog-not-listed-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
can_focus: true,
|
||||
child: notListedLabel,
|
||||
reactive: true,
|
||||
|
141
js/misc/hash.js
Normal file
141
js/misc/hash.js
Normal file
@@ -0,0 +1,141 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Lang = imports.lang;
|
||||
const System = imports.system;
|
||||
|
||||
const Params = imports.misc.params;
|
||||
|
||||
// This is an implementation of EcmaScript SameValue algorithm,
|
||||
// which returns true if two values are not observably distinguishable.
|
||||
// It was taken from http://wiki.ecmascript.org/doku.php?id=harmony:egal
|
||||
//
|
||||
// In the future, we may want to use the 'is' operator instead.
|
||||
function _sameValue(x, y) {
|
||||
if (x === y) {
|
||||
// 0 === -0, but they are not identical
|
||||
return x !== 0 || 1 / x === 1 / y;
|
||||
}
|
||||
|
||||
// NaN !== NaN, but they are identical.
|
||||
// NaNs are the only non-reflexive value, i.e., if x !== x,
|
||||
// then x is a NaN.
|
||||
// isNaN is broken: it converts its argument to number, so
|
||||
// isNaN("foo") => true
|
||||
return x !== x && y !== y;
|
||||
}
|
||||
|
||||
const _hashers = {
|
||||
object: function(o) { return o ? System.addressOf(o) : 'null'; },
|
||||
function: function(f) { return System.addressOf(f); },
|
||||
string: function(s) { return s; },
|
||||
number: function(n) { return String(n); },
|
||||
undefined: function() { return 'undefined'; },
|
||||
};
|
||||
|
||||
/* Map is meant to be similar in usage to ES6 Map, which is
|
||||
described at http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets,
|
||||
without requiring more than ES5 + Gjs extensions.
|
||||
|
||||
Known differences from other implementations:
|
||||
Polyfills around the web usually implement HashMaps for
|
||||
primitive values and reversed WeakMaps for object keys,
|
||||
but we want real maps with real O(1) semantics in all cases,
|
||||
and the easiest way is to have different hashers for different
|
||||
types.
|
||||
|
||||
Known differences from the ES6 specification:
|
||||
- Map is a Lang.Class, not a ES6 class, so inheritance,
|
||||
prototype, sealing, etc. work differently.
|
||||
- items(), keys() and values() don't return iterators,
|
||||
they return actual arrays, so they incur a full copy everytime
|
||||
they're called, and they don't see changes if you mutate
|
||||
the table while iterating
|
||||
(admittedly, the ES6 spec is a bit unclear on this, and
|
||||
the reference code would just blow up)
|
||||
*/
|
||||
const Map = new Lang.Class({
|
||||
Name: 'Map',
|
||||
|
||||
_init: function(iterable) {
|
||||
this._pool = { };
|
||||
|
||||
if (iterable) {
|
||||
for (let i = 0; i < iterable.length; i++) {
|
||||
let [key, value] = iterable[i];
|
||||
this.set(key, value);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_hashKey: function(key) {
|
||||
let type = typeof(key);
|
||||
return type + ':' + _hashers[type](key);
|
||||
},
|
||||
|
||||
_internalGet: function(key) {
|
||||
let hash = this._hashKey(key);
|
||||
let node = this._pool[hash];
|
||||
|
||||
if (node && _sameValue(node.key, key))
|
||||
return [true, node.value];
|
||||
else
|
||||
return [false, null];
|
||||
},
|
||||
|
||||
get: function(key) {
|
||||
return this._internalGet(key)[1];
|
||||
},
|
||||
|
||||
has: function(key) {
|
||||
return this._internalGet(key)[0];
|
||||
},
|
||||
|
||||
set: function(key, value) {
|
||||
let hash = this._hashKey(key);
|
||||
let node = this._pool[hash];
|
||||
|
||||
if (node) {
|
||||
node.key = key;
|
||||
node.value = value;
|
||||
} else {
|
||||
this._pool[hash] = { key: key, value: value };
|
||||
}
|
||||
},
|
||||
|
||||
delete: function(key) {
|
||||
let hash = this._hashKey(key);
|
||||
let node = this._pool[hash];
|
||||
|
||||
if (node && _sameValue(node.key, key)) {
|
||||
delete this._pool[hash];
|
||||
return [node.key, node.value];
|
||||
} else {
|
||||
return [null, null];
|
||||
}
|
||||
},
|
||||
|
||||
keys: function() {
|
||||
let pool = this._pool;
|
||||
return Object.getOwnPropertyNames(pool).map(function(hash) {
|
||||
return pool[hash].key;
|
||||
});
|
||||
},
|
||||
|
||||
values: function() {
|
||||
let pool = this._pool;
|
||||
return Object.getOwnPropertyNames(pool).map(function(hash) {
|
||||
return pool[hash].value;
|
||||
});
|
||||
},
|
||||
|
||||
items: function() {
|
||||
let pool = this._pool;
|
||||
return Object.getOwnPropertyNames(pool).map(function(hash) {
|
||||
return [pool[hash].key, pool[hash].value];
|
||||
});
|
||||
},
|
||||
|
||||
size: function() {
|
||||
return Object.getOwnPropertyNames(this._pool).length;
|
||||
},
|
||||
});
|
@@ -153,6 +153,7 @@ const ViewByCategories = new Lang.Class({
|
||||
y_fill: false,
|
||||
style_class: 'vfade' });
|
||||
this._categoryScroll.add_actor(this._categoryBox);
|
||||
this._categoryScroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
this.actor.add(this._view.actor, { expand: true, x_fill: true, y_fill: true });
|
||||
this.actor.add(this._categoryScroll, { expand: false, y_fill: false, y_align: St.Align.START });
|
||||
|
||||
|
@@ -88,7 +88,9 @@ const AutomountManager = new Lang.Class({
|
||||
if (!this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
global.play_theme_sound(0, 'device-added-media');
|
||||
global.play_theme_sound(0, 'device-added-media',
|
||||
_("External drive connected"),
|
||||
null);
|
||||
},
|
||||
|
||||
_onDriveDisconnected: function() {
|
||||
@@ -97,7 +99,9 @@ const AutomountManager = new Lang.Class({
|
||||
if (!this._loginManager.sessionActive)
|
||||
return;
|
||||
|
||||
global.play_theme_sound(0, 'device-removed-media');
|
||||
global.play_theme_sound(0, 'device-removed-media',
|
||||
_("External drive disconnected"),
|
||||
null);
|
||||
},
|
||||
|
||||
_onDriveEjectButton: function(monitor, drive) {
|
||||
|
@@ -293,7 +293,6 @@ const AutorunResidentSource = new Lang.Class({
|
||||
|
||||
_init: function(manager) {
|
||||
this.parent(_("Removable Devices"), 'media-removable');
|
||||
this.showInLockScreen = false;
|
||||
|
||||
this._mounts = [];
|
||||
|
||||
@@ -301,6 +300,10 @@ const AutorunResidentSource = new Lang.Class({
|
||||
this._notification = new AutorunResidentNotification(this._manager, this);
|
||||
},
|
||||
|
||||
_createPolicy: function() {
|
||||
return new MessageTray.NotificationPolicy({ showInLockScreen: false });
|
||||
},
|
||||
|
||||
buildRightClickMenu: function() {
|
||||
return null;
|
||||
},
|
||||
|
@@ -20,8 +20,8 @@ const Recorder = new Lang.Class({
|
||||
Main.wm.addKeybinding('toggle-recording',
|
||||
this._bindingSettings,
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._toggleRecorder));
|
||||
},
|
||||
|
||||
|
@@ -13,6 +13,7 @@ const Tp = imports.gi.TelepathyGLib;
|
||||
const History = imports.misc.history;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||
const Params = imports.misc.params;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
@@ -415,6 +416,8 @@ const TelepathyClient = new Lang.Class({
|
||||
_ensureAppSource: function() {
|
||||
if (this._appSource == null) {
|
||||
this._appSource = new MessageTray.Source(_("Chat"), 'empathy');
|
||||
this._appSource.policy = new NotificationDaemon.NotificationApplicationPolicy('empathy');
|
||||
|
||||
Main.messageTray.add(this._appSource);
|
||||
this._appSource.connect('destroy', Lang.bind(this, function () {
|
||||
this._appSource = null;
|
||||
@@ -484,6 +487,10 @@ const ChatSource = new Lang.Class({
|
||||
return rightClickMenu;
|
||||
},
|
||||
|
||||
_createPolicy: function() {
|
||||
return new NotificationDaemon.NotificationApplicationPolicy('empathy');
|
||||
},
|
||||
|
||||
_updateAlias: function() {
|
||||
let oldAlias = this.title;
|
||||
let newAlias = this._contact.get_alias();
|
||||
@@ -1048,6 +1055,10 @@ const ApproverSource = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_createPolicy: function() {
|
||||
return new NotificationDaemon.NotificationApplicationPolicy('empathy');
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._invalidId != 0) {
|
||||
this._dispatchOp.disconnect(this._invalidId);
|
||||
|
@@ -84,12 +84,26 @@ const DateMenuButton = new Lang.Class({
|
||||
}));
|
||||
vbox.add(this._calendar.actor);
|
||||
|
||||
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
||||
separator.setColumnWidths(1);
|
||||
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
|
||||
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
|
||||
this._openCalendarItem.actor.can_focus = false;
|
||||
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
this._openClocksItem = new PopupMenu.PopupMenuItem(_("Open Clocks"));
|
||||
this._openClocksItem.connect('activate', Lang.bind(this, this._onOpenClocksActivate));
|
||||
this._openClocksItem.actor.can_focus = false;
|
||||
vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
Shell.AppSystem.get_default().connect('installed-changed',
|
||||
Lang.bind(this, this._appInstalledChanged));
|
||||
this._appInstalledChanged();
|
||||
|
||||
item = this.menu.addSettingsAction(_("Date and Time Settings"), 'gnome-datetime-panel.desktop');
|
||||
if (item) {
|
||||
let separator = new PopupMenu.PopupSeparatorMenuItem();
|
||||
separator.setColumnWidths(1);
|
||||
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
item.actor.show_on_set_parent = false;
|
||||
item.actor.can_focus = false;
|
||||
item.actor.reparent(vbox);
|
||||
@@ -109,11 +123,6 @@ const DateMenuButton = new Lang.Class({
|
||||
// Event list
|
||||
vbox.add(this._eventList.actor, { expand: true });
|
||||
|
||||
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
|
||||
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
|
||||
this._openCalendarItem.actor.can_focus = false;
|
||||
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
|
||||
|
||||
// Whenever the menu is opened, select today
|
||||
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
|
||||
if (isOpen) {
|
||||
@@ -147,6 +156,11 @@ const DateMenuButton = new Lang.Class({
|
||||
this._sessionUpdated();
|
||||
},
|
||||
|
||||
_appInstalledChanged: function() {
|
||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
|
||||
this._openClocksItem.actor.visible = app !== null;
|
||||
},
|
||||
|
||||
_setEventsVisibility: function(visible) {
|
||||
this._openCalendarItem.actor.visible = visible;
|
||||
this._separator.visible = visible;
|
||||
@@ -198,5 +212,11 @@ const DateMenuButton = new Lang.Class({
|
||||
|
||||
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
|
||||
app.launch([], global.create_app_launch_context());
|
||||
},
|
||||
|
||||
_onOpenClocksActivate: function() {
|
||||
this.menu.close();
|
||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
|
||||
app.activate();
|
||||
}
|
||||
});
|
||||
|
@@ -142,7 +142,6 @@ const Keyboard = new Lang.Class({
|
||||
this._focusInExtendedKeys = false;
|
||||
|
||||
this._timestamp = global.display.get_current_time_roundtrip();
|
||||
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._redraw));
|
||||
|
||||
this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA });
|
||||
this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged));
|
||||
@@ -161,9 +160,8 @@ const Keyboard = new Lang.Class({
|
||||
}));
|
||||
this._keyboardRequested = false;
|
||||
this._keyboardRestingId = 0;
|
||||
},
|
||||
|
||||
init: function () {
|
||||
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._redraw));
|
||||
this._redraw();
|
||||
},
|
||||
|
||||
@@ -637,11 +635,7 @@ const KeyboardSource = new Lang.Class({
|
||||
this.keepTrayOnSummaryClick = true;
|
||||
},
|
||||
|
||||
handleSummaryClick: function() {
|
||||
let event = Clutter.get_current_event();
|
||||
if (event.type() != Clutter.EventType.BUTTON_RELEASE)
|
||||
return false;
|
||||
|
||||
handleSummaryClick: function(button) {
|
||||
this.open();
|
||||
return true;
|
||||
},
|
||||
|
1043
js/ui/layout.js
1043
js/ui/layout.js
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,7 @@
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Params = imports.misc.params;
|
||||
@@ -101,6 +102,7 @@ const Lightbox = new Lang.Class({
|
||||
},
|
||||
|
||||
show: function() {
|
||||
Tweener.removeTweens(this.actor);
|
||||
if (this._fadeInTime) {
|
||||
this.shown = false;
|
||||
this.actor.opacity = 0;
|
||||
@@ -110,17 +112,20 @@ const Lightbox = new Lang.Class({
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.shown = true;
|
||||
this.emit('shown');
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.actor.opacity = 255 * this._fadeFactor;
|
||||
this.shown = true;
|
||||
this.emit('shown');
|
||||
}
|
||||
this.actor.show();
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
this.shown = false;
|
||||
Tweener.removeTweens(this.actor);
|
||||
if (this._fadeOutTime) {
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
@@ -197,3 +202,4 @@ const Lightbox = new Lang.Class({
|
||||
this.highlight(null);
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(Lightbox.prototype);
|
||||
|
@@ -1133,7 +1133,7 @@ const LookingGlass = new Lang.Class({
|
||||
if (this._open)
|
||||
return;
|
||||
|
||||
if (!Main.pushModal(this._entry, { keybindingMode: Main.KeybindingMode.LOOKING_GLASS }))
|
||||
if (!Main.pushModal(this._entry, { keybindingMode: Shell.KeyBindingMode.LOOKING_GLASS }))
|
||||
return;
|
||||
|
||||
this._notebook.selectIndex(0);
|
||||
|
@@ -38,20 +38,6 @@ const XdndHandler = imports.ui.xdndHandler;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
|
||||
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||
|
||||
const KeybindingMode = {
|
||||
NONE: 0, // block all keybindings
|
||||
NORMAL: 1 << 0, // window mode
|
||||
OVERVIEW: 1 << 1,
|
||||
LOCK_SCREEN: 1 << 2,
|
||||
UNLOCK_SCREEN: 1 << 3,
|
||||
LOGIN_SCREEN: 1 << 4,
|
||||
MESSAGE_TRAY: 1 << 5,
|
||||
SYSTEM_MODAL: 1 << 6,
|
||||
LOOKING_GLASS: 1 << 7,
|
||||
ALL: ~0,
|
||||
};
|
||||
|
||||
let componentManager = null;
|
||||
let panel = null;
|
||||
@@ -69,13 +55,14 @@ let shellDBusService = null;
|
||||
let shellMountOpDBusService = null;
|
||||
let screenSaverDBus = null;
|
||||
let modalCount = 0;
|
||||
let keybindingMode = KeybindingMode.NORMAL;
|
||||
let keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||
let modalActorFocusStack = [];
|
||||
let uiGroup = null;
|
||||
let magnifier = null;
|
||||
let xdndHandler = null;
|
||||
let keyboard = null;
|
||||
let layoutManager = null;
|
||||
let background = null;
|
||||
let _startDate;
|
||||
let _defaultCssStylesheet = null;
|
||||
let _cssStylesheet = null;
|
||||
@@ -83,15 +70,15 @@ let _overridesSettings = null;
|
||||
|
||||
function _sessionUpdated() {
|
||||
wm.setCustomKeybindingHandler('panel-main-menu',
|
||||
KeybindingMode.NORMAL |
|
||||
KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
sessionMode.hasOverview ? Lang.bind(overview, overview.toggle) : null);
|
||||
wm.allowKeybinding('overlay-key', KeybindingMode.NORMAL |
|
||||
KeybindingMode.OVERVIEW);
|
||||
wm.allowKeybinding('overlay-key', Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW);
|
||||
|
||||
wm.setCustomKeybindingHandler('panel-run-dialog',
|
||||
KeybindingMode.NORMAL |
|
||||
KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
sessionMode.hasRunDialog ? openRunDialog : null);
|
||||
if (sessionMode.isGreeter)
|
||||
screenShield.showDialog();
|
||||
@@ -124,38 +111,17 @@ function start() {
|
||||
|
||||
tracker.connect('startup-sequence-changed', _queueCheckWorkspaces);
|
||||
|
||||
// The stage is always covered so Clutter doesn't need to clear it; however
|
||||
// the color is used as the default contents for the Mutter root background
|
||||
// actor so set it anyways.
|
||||
global.stage.color = DEFAULT_BACKGROUND_COLOR;
|
||||
global.stage.no_clear_hint = true;
|
||||
// Setup the stage hierarchy early
|
||||
layoutManager = new Layout.LayoutManager();
|
||||
// For backward compatibility
|
||||
uiGroup = layoutManager.uiGroup;
|
||||
|
||||
let backgroundActor = global.window_group.background;
|
||||
background = backgroundActor.settings;
|
||||
|
||||
_defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css';
|
||||
loadTheme();
|
||||
|
||||
// Set up stage hierarchy to group all UI actors under one container.
|
||||
uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
||||
uiGroup.connect('allocate',
|
||||
function (actor, box, flags) {
|
||||
let children = uiGroup.get_children();
|
||||
for (let i = 0; i < children.length; i++)
|
||||
children[i].allocate_preferred_size(flags);
|
||||
});
|
||||
uiGroup.connect('get-preferred-width',
|
||||
function(actor, forHeight, alloc) {
|
||||
let width = global.stage.width;
|
||||
[alloc.min_size, alloc.natural_size] = [width, width];
|
||||
});
|
||||
uiGroup.connect('get-preferred-height',
|
||||
function(actor, forWidth, alloc) {
|
||||
let height = global.stage.height;
|
||||
[alloc.min_size, alloc.natural_size] = [height, height];
|
||||
});
|
||||
global.window_group.reparent(uiGroup);
|
||||
global.overlay_group.reparent(uiGroup);
|
||||
global.stage.add_actor(uiGroup);
|
||||
|
||||
layoutManager = new Layout.LayoutManager();
|
||||
xdndHandler = new XdndHandler.XdndHandler();
|
||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||
overview = new Overview.Overview();
|
||||
@@ -173,7 +139,6 @@ function start() {
|
||||
componentManager = new Components.ComponentManager();
|
||||
|
||||
layoutManager.init();
|
||||
keyboard.init();
|
||||
overview.init();
|
||||
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||
@@ -210,6 +175,14 @@ function start() {
|
||||
|
||||
ExtensionDownloader.init();
|
||||
ExtensionSystem.init();
|
||||
|
||||
// Run the startup animation as soon as the mainloop is idle enough
|
||||
// This is necessary to have it smooth and without interruptions from
|
||||
// completed IO tasks
|
||||
GLib.idle_add(GLib.PRIORITY_LOW, function() {
|
||||
layoutManager.startupAnimation();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
let _workspaces = [];
|
||||
@@ -518,7 +491,7 @@ function isInModalStack(actor) {
|
||||
* - options: Meta.ModalOptions flags to indicate that the pointer is
|
||||
* already grabbed
|
||||
*
|
||||
* - keybindingMode: used to set the current Main.KeybindingMode to filter
|
||||
* - keybindingMode: used to set the current Shell.KeyBindingMode to filter
|
||||
* global keybindings; the default of NONE will filter
|
||||
* out all keybindings
|
||||
*
|
||||
@@ -527,7 +500,7 @@ function isInModalStack(actor) {
|
||||
function pushModal(actor, params) {
|
||||
params = Params.parse(params, { timestamp: global.get_current_time(),
|
||||
options: 0,
|
||||
keybindingMode: KeybindingMode.NONE });
|
||||
keybindingMode: Shell.KeyBindingMode.NONE });
|
||||
|
||||
if (modalCount == 0) {
|
||||
if (!global.begin_modal(params.timestamp, params.options)) {
|
||||
@@ -588,7 +561,7 @@ function popModal(actor, timestamp) {
|
||||
global.stage.set_key_focus(null);
|
||||
global.end_modal(timestamp);
|
||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
||||
keybindingMode = KeybindingMode.NORMAL;
|
||||
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||
|
||||
throw new Error('incorrect pop');
|
||||
}
|
||||
@@ -637,7 +610,7 @@ function popModal(actor, timestamp) {
|
||||
global.end_modal(timestamp);
|
||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
||||
Meta.enable_unredirect_for_screen(global.screen);
|
||||
keybindingMode = KeybindingMode.NORMAL;
|
||||
keybindingMode = Shell.KeyBindingMode.NORMAL;
|
||||
}
|
||||
|
||||
function createLookingGlass() {
|
||||
|
@@ -18,6 +18,7 @@ const BoxPointer = imports.ui.boxpointer;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const GrabHelper = imports.ui.grabHelper;
|
||||
const Hash = imports.misc.hash;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
const Main = imports.ui.main;
|
||||
const PointerWatcher = imports.ui.pointerWatcher;
|
||||
@@ -243,6 +244,36 @@ function makeCloseButton() {
|
||||
return closeButton;
|
||||
}
|
||||
|
||||
function strHasSuffix(string, suffix) {
|
||||
return string.substr(-suffix.length) == suffix;
|
||||
}
|
||||
|
||||
// NotificationPolicy:
|
||||
// An object that holds all bits of configurable policy related to a notification
|
||||
// source, such as whether to play sound or honour the critical bit.
|
||||
//
|
||||
// A notification without a policy object will inherit the default one.
|
||||
const NotificationPolicy = new Lang.Class({
|
||||
Name: 'NotificationPolicy',
|
||||
|
||||
_init: function(params) {
|
||||
params = Params.parse(params, { enable: true,
|
||||
enableSound: true,
|
||||
showBanners: true,
|
||||
forceExpanded: false,
|
||||
showInLockScreen: true,
|
||||
detailsInLockScreen: false
|
||||
});
|
||||
Lang.copyProperties(params, this);
|
||||
},
|
||||
|
||||
// Do nothing for the default policy. These methods are only useful for the
|
||||
// GSettings policy.
|
||||
store: function() { },
|
||||
destroy: function() { }
|
||||
});
|
||||
Signals.addSignalMethods(NotificationPolicy.prototype);
|
||||
|
||||
// Notification:
|
||||
// @source: the notification's Source
|
||||
// @title: the title
|
||||
@@ -314,6 +345,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.isMusic = false;
|
||||
this.forFeedback = false;
|
||||
this.expanded = false;
|
||||
this.focused = false;
|
||||
@@ -321,8 +353,8 @@ const Notification = new Lang.Class({
|
||||
this._destroyed = false;
|
||||
this._useActionIcons = false;
|
||||
this._customContent = false;
|
||||
this._bannerBodyText = null;
|
||||
this._bannerBodyMarkup = false;
|
||||
this.bannerBodyText = null;
|
||||
this.bannerBodyMarkup = false;
|
||||
this._titleFitsInBannerMode = true;
|
||||
this._titleDirection = Clutter.TextDirection.DEFAULT;
|
||||
this._spacing = 0;
|
||||
@@ -429,7 +461,7 @@ const Notification = new Lang.Class({
|
||||
this._actionArea = null;
|
||||
this._buttonBox = null;
|
||||
}
|
||||
if (this._imageBin && params.clear)
|
||||
if (params.clear)
|
||||
this.unsetImage();
|
||||
|
||||
if (!this._scrollArea && !this._actionArea && !this._imageBin)
|
||||
@@ -474,12 +506,12 @@ const Notification = new Lang.Class({
|
||||
// is done correctly automatically.
|
||||
this._table.set_text_direction(this._titleDirection);
|
||||
|
||||
// Unless the notification has custom content, we save this._bannerBodyText
|
||||
// Unless the notification has custom content, we save this.bannerBodyText
|
||||
// to add it to the content of the notification if the notification is
|
||||
// expandable due to other elements in its content area or due to the banner
|
||||
// not fitting fully in the single-line mode.
|
||||
this._bannerBodyText = this._customContent ? null : banner;
|
||||
this._bannerBodyMarkup = params.bannerMarkup;
|
||||
this.bannerBodyText = this._customContent ? null : banner;
|
||||
this.bannerBodyMarkup = params.bannerMarkup;
|
||||
|
||||
banner = banner ? banner.replace(/\n/g, ' ') : '';
|
||||
|
||||
@@ -487,7 +519,7 @@ const Notification = new Lang.Class({
|
||||
this._bannerLabel.queue_relayout();
|
||||
|
||||
// Add the bannerBody now if we know for sure we'll need it
|
||||
if (this._bannerBodyText && this._bannerBodyText.indexOf('\n') > -1)
|
||||
if (this.bannerBodyText && this.bannerBodyText.indexOf('\n') > -1)
|
||||
this._addBannerBody();
|
||||
|
||||
if (params.body)
|
||||
@@ -511,7 +543,8 @@ const Notification = new Lang.Class({
|
||||
this._table.add_style_class_name('multi-line-notification');
|
||||
this._scrollArea = new St.ScrollView({ style_class: 'notification-scrollview',
|
||||
vscrollbar_policy: this._scrollPolicy,
|
||||
hscrollbar_policy: Gtk.PolicyType.NEVER });
|
||||
hscrollbar_policy: Gtk.PolicyType.NEVER,
|
||||
visible: this.expanded });
|
||||
this._table.add(this._scrollArea, { row: 1,
|
||||
col: 2 });
|
||||
this._updateLastColumnSettings();
|
||||
@@ -552,10 +585,10 @@ const Notification = new Lang.Class({
|
||||
},
|
||||
|
||||
_addBannerBody: function() {
|
||||
if (this._bannerBodyText) {
|
||||
let text = this._bannerBodyText;
|
||||
this._bannerBodyText = null;
|
||||
this.addBody(text, this._bannerBodyMarkup);
|
||||
if (this.bannerBodyText) {
|
||||
let text = this.bannerBodyText;
|
||||
this.bannerBodyText = null;
|
||||
this.addBody(text, this.bannerBodyMarkup);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -587,6 +620,7 @@ const Notification = new Lang.Class({
|
||||
this._addBannerBody();
|
||||
}
|
||||
this._actionArea = actor;
|
||||
this._actionArea.visible = this.expanded;
|
||||
|
||||
if (!props)
|
||||
props = {};
|
||||
@@ -609,13 +643,15 @@ const Notification = new Lang.Class({
|
||||
},
|
||||
|
||||
setImage: function(image) {
|
||||
if (this._imageBin)
|
||||
this.unsetImage();
|
||||
this.unsetImage();
|
||||
|
||||
if (!image)
|
||||
return;
|
||||
this._imageBin = new St.Bin();
|
||||
this._imageBin.child = image;
|
||||
this._imageBin.opacity = 230;
|
||||
|
||||
this._imageBin = new St.Bin({ opacity: 230,
|
||||
child: image,
|
||||
visible: this.expanded });
|
||||
|
||||
this._table.add_style_class_name('multi-line-notification');
|
||||
this._table.add_style_class_name('notification-with-image');
|
||||
this._addBannerBody();
|
||||
@@ -665,9 +701,10 @@ const Notification = new Lang.Class({
|
||||
let button = new St.Button({ can_focus: true });
|
||||
button._actionId = id;
|
||||
|
||||
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) {
|
||||
let iconName = strHasSuffix(id, '-symbolic') ? id : id + '-symbolic';
|
||||
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(iconName)) {
|
||||
button.add_style_class_name('notification-icon-button');
|
||||
button.child = new St.Icon({ icon_name: id });
|
||||
button.child = new St.Icon({ icon_name: iconName });
|
||||
} else {
|
||||
button.add_style_class_name('notification-button');
|
||||
button.label = label;
|
||||
@@ -843,7 +880,7 @@ const Notification = new Lang.Class({
|
||||
},
|
||||
|
||||
_canExpandContent: function() {
|
||||
return this._bannerBodyText ||
|
||||
return this.bannerBodyText ||
|
||||
(!this._titleFitsInBannerMode && !this._table.has_style_class_name('multi-line-notification'));
|
||||
},
|
||||
|
||||
@@ -856,6 +893,14 @@ const Notification = new Lang.Class({
|
||||
this.expanded = true;
|
||||
this.actor.remove_style_class_name('notification-unexpanded');
|
||||
|
||||
// Show additional content that we keep hidden in banner mode
|
||||
if (this._imageBin)
|
||||
this._imageBin.show();
|
||||
if (this._actionArea)
|
||||
this._actionArea.show();
|
||||
if (this._scrollArea)
|
||||
this._scrollArea.show();
|
||||
|
||||
// The banner is never shown when the title did not fit, so this
|
||||
// can be an if-else statement.
|
||||
if (!this._titleFitsInBannerMode) {
|
||||
@@ -887,12 +932,23 @@ const Notification = new Lang.Class({
|
||||
if (this._destroyed)
|
||||
return;
|
||||
this.expanded = false;
|
||||
|
||||
// Hide additional content that we keep hidden in banner mode
|
||||
if (this._imageBin)
|
||||
this._imageBin.hide();
|
||||
if (this._actionArea)
|
||||
this._actionArea.hide();
|
||||
if (this._scrollArea)
|
||||
this._scrollArea.hide();
|
||||
|
||||
// Make sure we don't line wrap the title, and ellipsize it instead.
|
||||
this._titleLabel.clutter_text.line_wrap = false;
|
||||
this._titleLabel.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||
|
||||
// Restore banner opacity in case the notification is shown in the
|
||||
// banner mode again on update.
|
||||
this._bannerLabel.opacity = 255;
|
||||
|
||||
// Restore height requisition
|
||||
this.actor.add_style_class_name('notification-unexpanded');
|
||||
this.emit('collapsed');
|
||||
@@ -1060,10 +1116,11 @@ const Source = new Lang.Class({
|
||||
this.isTransient = false;
|
||||
this.isChat = false;
|
||||
this.isMuted = false;
|
||||
this.showInLockScreen = true;
|
||||
this.keepTrayOnSummaryClick = false;
|
||||
|
||||
this.notifications = [];
|
||||
|
||||
this.policy = this._createPolicy();
|
||||
},
|
||||
|
||||
get count() {
|
||||
@@ -1082,6 +1139,10 @@ const Source = new Lang.Class({
|
||||
this.emit('count-updated');
|
||||
},
|
||||
|
||||
_createPolicy: function() {
|
||||
return new NotificationPolicy();
|
||||
},
|
||||
|
||||
buildRightClickMenu: function() {
|
||||
let item;
|
||||
let rightClickMenu = new St.BoxLayout({ name: 'summary-right-click-menu',
|
||||
@@ -1171,11 +1232,13 @@ const Source = new Lang.Class({
|
||||
notify: function(notification) {
|
||||
notification.acknowledged = false;
|
||||
this.pushNotification(notification);
|
||||
if (!this.isMuted)
|
||||
this.emit('notify', notification);
|
||||
|
||||
if (!this.isMuted && this.policy.showBanners)
|
||||
this.emit('notify', notification);
|
||||
},
|
||||
|
||||
destroy: function(reason) {
|
||||
this.policy.destroy();
|
||||
this.emit('destroy', reason);
|
||||
},
|
||||
|
||||
@@ -1217,7 +1280,16 @@ const Source = new Lang.Class({
|
||||
|
||||
hasResidentNotification: function() {
|
||||
return this.notifications.some(function(n) { return n.resident; });
|
||||
}
|
||||
},
|
||||
|
||||
getMusicNotification: function() {
|
||||
for (let i = 0; i < this.notifications.length; i++) {
|
||||
if (this.notifications[i].isMusic)
|
||||
return this.notifications[i];
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(Source.prototype);
|
||||
|
||||
@@ -1271,6 +1343,14 @@ const SummaryItem = new Lang.Class({
|
||||
global.focus_manager.add_group(this.rightClickMenu);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
// remove the actor from the summary item so it doesn't get destroyed
|
||||
// with us
|
||||
this._sourceBox.remove_actor(this._sourceIcon);
|
||||
|
||||
this.actor.destroy();
|
||||
},
|
||||
|
||||
_onKeyPress: function(actor, event) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Up) {
|
||||
actor.emit('clicked', 1);
|
||||
@@ -1455,7 +1535,7 @@ const MessageTray = new Lang.Class({
|
||||
this.idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||
|
||||
this._grabHelper = new GrabHelper.GrabHelper(this.actor,
|
||||
{ keybindingMode: Main.KeybindingMode.MESSAGE_TRAY });
|
||||
{ keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
|
||||
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
||||
this._grabHelper.addActor(this.actor);
|
||||
if (Main.panel.statusArea.activities)
|
||||
@@ -1515,7 +1595,6 @@ const MessageTray = new Lang.Class({
|
||||
function() {
|
||||
this._overviewVisible = false;
|
||||
this._escapeTray();
|
||||
this.actor.remove_style_pseudo_class('overview');
|
||||
this._updateState();
|
||||
}));
|
||||
|
||||
@@ -1524,19 +1603,19 @@ const MessageTray = new Lang.Class({
|
||||
Main.wm.addKeybinding('toggle-message-tray',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.MESSAGE_TRAY |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.MESSAGE_TRAY |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this.toggleAndNavigate));
|
||||
Main.wm.addKeybinding('focus-active-notification',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.MESSAGE_TRAY |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.MESSAGE_TRAY |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._expandActiveNotification));
|
||||
|
||||
this._summaryItems = [];
|
||||
this._sources = new Hash.Map();
|
||||
this._chatSummaryItemsCount = 0;
|
||||
|
||||
let pointerWatcher = PointerWatcher.getPointerWatcher();
|
||||
@@ -1546,22 +1625,19 @@ const MessageTray = new Lang.Class({
|
||||
this._trayDwellUserTime = 0;
|
||||
|
||||
this._sessionUpdated();
|
||||
|
||||
this._noMessages = new St.Label({ text: _("No Messages"),
|
||||
style_class: 'no-messages-label',
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
x_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
y_expand: true });
|
||||
this.actor.add_actor(this._noMessages);
|
||||
this._updateNoMessagesLabel();
|
||||
},
|
||||
|
||||
_updateNoMessagesLabel: function() {
|
||||
if (this._summaryItems.length == 0 && !this._noMessages) {
|
||||
this._noMessages = new St.Label({ text: _("No Messages"),
|
||||
style_class: 'no-messages-label',
|
||||
x_align: Clutter.ActorAlign.CENTER,
|
||||
x_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER,
|
||||
y_expand: true });
|
||||
this.actor.add_actor(this._noMessages);
|
||||
} else if (this._summaryItems.length > 0 && this._noMessages) {
|
||||
this._noMessages.destroy();
|
||||
this._noMessages = null;
|
||||
}
|
||||
this._noMessages.visible = this._sources.size() == 0;
|
||||
},
|
||||
|
||||
_sessionUpdated: function() {
|
||||
@@ -1630,10 +1706,7 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
_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) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
|
||||
this._closeNotification();
|
||||
return true;
|
||||
}
|
||||
@@ -1651,15 +1724,7 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
contains: function(source) {
|
||||
return this._getIndexOfSummaryItemForSource(source) >= 0;
|
||||
},
|
||||
|
||||
_getIndexOfSummaryItemForSource: function(source) {
|
||||
for (let i = 0; i < this._summaryItems.length; i++) {
|
||||
if (this._summaryItems[i].source == source)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
return this._sources.has(source);
|
||||
},
|
||||
|
||||
add: function(source) {
|
||||
@@ -1668,7 +1733,23 @@ const MessageTray = new Lang.Class({
|
||||
return;
|
||||
}
|
||||
|
||||
let summaryItem = new SummaryItem(source);
|
||||
// Register that we got a notification for this source
|
||||
source.policy.store();
|
||||
|
||||
source.policy.connect('enable-changed', Lang.bind(this, this._onSourceEnableChanged, source));
|
||||
source.policy.connect('policy-changed', Lang.bind(this, this._updateState));
|
||||
this._onSourceEnableChanged(source.policy, source);
|
||||
},
|
||||
|
||||
_addSource: function(source) {
|
||||
let obj = {
|
||||
source: source,
|
||||
summaryItem: new SummaryItem(source),
|
||||
notifyId: 0,
|
||||
destroyId: 0,
|
||||
mutedChangedId: 0
|
||||
};
|
||||
let summaryItem = obj.summaryItem;
|
||||
|
||||
if (source.isChat) {
|
||||
this._summary.insert_child_at_index(summaryItem.actor, 0);
|
||||
@@ -1677,11 +1758,11 @@ const MessageTray = new Lang.Class({
|
||||
this._summary.insert_child_at_index(summaryItem.actor, this._chatSummaryItemsCount);
|
||||
}
|
||||
|
||||
this._summaryItems.push(summaryItem);
|
||||
this._sources.set(source, obj);
|
||||
|
||||
source.connect('notify', Lang.bind(this, this._onNotify));
|
||||
|
||||
source.connect('muted-changed', Lang.bind(this,
|
||||
obj.notifyId = source.connect('notify', Lang.bind(this, this._onNotify));
|
||||
obj.destroyId = source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
|
||||
obj.mutedChangedId = source.connect('muted-changed', Lang.bind(this,
|
||||
function () {
|
||||
if (source.isMuted)
|
||||
this._notificationQueue = this._notificationQueue.filter(function(notification) {
|
||||
@@ -1700,35 +1781,28 @@ const MessageTray = new Lang.Class({
|
||||
this._onSummaryItemClicked(summaryItem, 3);
|
||||
}));
|
||||
|
||||
source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
|
||||
|
||||
// We need to display the newly-added summary item, but if the
|
||||
// caller is about to post a notification, we want to show that
|
||||
// *first* and not show the summary item until after it hides.
|
||||
// So postpone calling _updateState() a tiny bit.
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; }));
|
||||
|
||||
this.emit('summary-item-added', summaryItem);
|
||||
this.emit('source-added', source);
|
||||
|
||||
this._updateNoMessagesLabel();
|
||||
},
|
||||
|
||||
getSummaryItems: function() {
|
||||
return this._summaryItems;
|
||||
},
|
||||
|
||||
_onSourceDestroy: function(source) {
|
||||
let index = this._getIndexOfSummaryItemForSource(source);
|
||||
if (index == -1)
|
||||
return;
|
||||
|
||||
let summaryItemToRemove = this._summaryItems[index];
|
||||
|
||||
this._summaryItems.splice(index, 1);
|
||||
_removeSource: function(source) {
|
||||
let [, obj] = this._sources.delete(source);
|
||||
let summaryItem = obj.summaryItem;
|
||||
|
||||
if (source.isChat)
|
||||
this._chatSummaryItemsCount--;
|
||||
|
||||
source.disconnect(obj.notifyId);
|
||||
source.disconnect(obj.destroyId);
|
||||
source.disconnect(obj.mutedChangedId);
|
||||
|
||||
let needUpdate = false;
|
||||
|
||||
if (this._notification && this._notification.source == source) {
|
||||
@@ -1736,12 +1810,12 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationRemoved = true;
|
||||
needUpdate = true;
|
||||
}
|
||||
if (this._clickedSummaryItem == summaryItemToRemove) {
|
||||
if (this._clickedSummaryItem == summaryItem) {
|
||||
this._setClickedSummaryItem(null);
|
||||
needUpdate = true;
|
||||
}
|
||||
|
||||
summaryItemToRemove.actor.destroy();
|
||||
summaryItem.destroy();
|
||||
|
||||
this._updateNoMessagesLabel();
|
||||
|
||||
@@ -1749,6 +1823,26 @@ const MessageTray = new Lang.Class({
|
||||
this._updateState();
|
||||
},
|
||||
|
||||
getSources: function() {
|
||||
return this._sources.keys();
|
||||
},
|
||||
|
||||
_onSourceEnableChanged: function(policy, source) {
|
||||
let wasEnabled = this.contains(source);
|
||||
let shouldBeEnabled = policy.enable;
|
||||
|
||||
if (wasEnabled != shouldBeEnabled) {
|
||||
if (shouldBeEnabled)
|
||||
this._addSource(source);
|
||||
else
|
||||
this._removeSource(source);
|
||||
}
|
||||
},
|
||||
|
||||
_onSourceDestroy: function(source) {
|
||||
this._removeSource(source);
|
||||
},
|
||||
|
||||
_onNotificationDestroy: function(notification) {
|
||||
if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) {
|
||||
this._updateNotificationTimeout(0);
|
||||
@@ -1834,7 +1928,7 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
_onSummaryItemClicked: function(summaryItem, button) {
|
||||
if (summaryItem.source.handleSummaryClick()) {
|
||||
if (summaryItem.source.handleSummaryClick(button)) {
|
||||
if (summaryItem.source.keepTrayOnSummaryClick)
|
||||
this._setClickedSummaryItem(null);
|
||||
else
|
||||
@@ -2193,7 +2287,9 @@ const MessageTray = new Lang.Class({
|
||||
this._tween(this.actor, '_trayState', State.HIDDEN,
|
||||
{ y: 0,
|
||||
time: ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._onTrayHidden,
|
||||
onCompleteScope: this
|
||||
});
|
||||
|
||||
// Note that we might have entered here without a grab,
|
||||
@@ -2203,6 +2299,11 @@ const MessageTray = new Lang.Class({
|
||||
this._lightbox.hide();
|
||||
},
|
||||
|
||||
_onTrayHidden: function() {
|
||||
if (!this._overviewVisible)
|
||||
this.actor.remove_style_pseudo_class('overview');
|
||||
},
|
||||
|
||||
_hideDesktopClone: function(now) {
|
||||
this._tween(this._desktopClone, '_desktopCloneState', State.HIDDEN,
|
||||
{ y: 0,
|
||||
@@ -2239,7 +2340,7 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
this._notificationClickedId = this._notification.connect('done-displaying',
|
||||
Lang.bind(this, this._escapeTray));
|
||||
this._notification.connect('unfocused', Lang.bind(this, function() {
|
||||
this._notificationUnfocusedId = this._notification.connect('unfocused', Lang.bind(this, function() {
|
||||
this._updateState();
|
||||
}));
|
||||
this._notificationBin.child = this._notification.actor;
|
||||
@@ -2268,8 +2369,10 @@ const MessageTray = new Lang.Class({
|
||||
_updateShowingNotification: function() {
|
||||
this._notification.acknowledged = true;
|
||||
|
||||
// We auto-expand notifications with CRITICAL urgency.
|
||||
if (this._notification.urgency == Urgency.CRITICAL)
|
||||
// We auto-expand notifications with CRITICAL urgency, or for which the relevant setting
|
||||
// is on in the control center.
|
||||
if (this._notification.urgency == Urgency.CRITICAL ||
|
||||
this._notification.source.policy.forceExpanded)
|
||||
this._expandNotification(true);
|
||||
|
||||
// We tween all notifications to full opacity. This ensures that both new notifications and
|
||||
@@ -2353,11 +2456,18 @@ const MessageTray = new Lang.Class({
|
||||
this.idleMonitor.disconnect(this._idleMonitorBecameActiveId);
|
||||
this._idleMonitorBecameActiveId = 0;
|
||||
}
|
||||
|
||||
if (this._notificationExpandedId) {
|
||||
this._notification.disconnect(this._notificationExpandedId);
|
||||
this._notificationExpandedId = 0;
|
||||
}
|
||||
if (this._notificationClickedId) {
|
||||
this._notification.disconnect(this._notificationClickedId);
|
||||
this._notificationClickedId = 0;
|
||||
}
|
||||
if (this._notificationUnfocusedId) {
|
||||
this._notification.disconnect(this._notificationUnfocusedId);
|
||||
this._notificationUnfocusedId = 0;
|
||||
}
|
||||
|
||||
if (this._notificationRemoved) {
|
||||
Tweener.removeTweens(this._notificationWidget);
|
||||
@@ -2379,19 +2489,19 @@ const MessageTray = new Lang.Class({
|
||||
},
|
||||
|
||||
_hideNotificationCompleted: function() {
|
||||
this._notificationRemoved = false;
|
||||
this._notificationWidget.hide();
|
||||
this._closeButton.hide();
|
||||
this._pointerInTray = false;
|
||||
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
|
||||
this._notificationBin.child = null;
|
||||
this._notification.collapseCompleted();
|
||||
this._notification.disconnect(this._notificationClickedId);
|
||||
this._notificationClickedId = 0;
|
||||
|
||||
let notification = this._notification;
|
||||
this._notification = null;
|
||||
if (notification.isTransient)
|
||||
notification.destroy(NotificationDestroyedReason.EXPIRED);
|
||||
|
||||
this._notificationRemoved = false;
|
||||
this._closeButton.hide();
|
||||
this._pointerInTray = false;
|
||||
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
|
||||
this._notificationBin.child = null;
|
||||
this._notificationWidget.hide();
|
||||
},
|
||||
|
||||
_expandActiveNotification: function() {
|
||||
@@ -2579,6 +2689,20 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
_onSummaryBoxPointerUngrabbed: function() {
|
||||
this._summaryBoxPointerState = State.HIDING;
|
||||
|
||||
if (this._summaryBoxPointerContentUpdatedId) {
|
||||
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
|
||||
this._summaryBoxPointerContentUpdatedId = 0;
|
||||
}
|
||||
if (this._summaryBoxPointerCloseClickedId != 0) {
|
||||
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
|
||||
this._summaryBoxPointerCloseClickedId = 0;
|
||||
}
|
||||
if (this._sourceDoneDisplayingId) {
|
||||
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
|
||||
this._sourceDoneDisplayingId = 0;
|
||||
}
|
||||
|
||||
this._unlock();
|
||||
|
||||
if (this._summaryBoxPointerItem.source.notifications.length == 0) {
|
||||
@@ -2601,14 +2725,6 @@ const MessageTray = new Lang.Class({
|
||||
|
||||
this._summaryBoxPointerState = State.HIDDEN;
|
||||
this._summaryBoxPointer.bin.child = null;
|
||||
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
|
||||
this._summaryBoxPointerContentUpdatedId = 0;
|
||||
if (this._summaryBoxPointerCloseClickedId != 0) {
|
||||
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
|
||||
this._summaryBoxPointerCloseClickedId = 0;
|
||||
}
|
||||
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
|
||||
this._summaryBoxPointerDoneDisplayingId = 0;
|
||||
|
||||
let sourceNotificationStackDoneShowing = null;
|
||||
if (doneShowingNotificationStack) {
|
||||
|
@@ -37,7 +37,7 @@ const ModalDialog = new Lang.Class({
|
||||
params = Params.parse(params, { shellReactive: false,
|
||||
styleClass: null,
|
||||
parentActor: Main.uiGroup,
|
||||
keybindingMode: Main.KeybindingMode.SYSTEM_MODAL,
|
||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||
shouldFadeIn: true });
|
||||
|
||||
this.state = State.CLOSED;
|
||||
@@ -157,6 +157,7 @@ const ModalDialog = new Lang.Class({
|
||||
keys = [];
|
||||
|
||||
let button = new St.Button({ style_class: 'modal-dialog-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
label: label });
|
||||
|
@@ -103,6 +103,126 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
|
||||
'ibus-ui-gtk': 'keyboard'
|
||||
};
|
||||
|
||||
const NotificationGenericPolicy = new Lang.Class({
|
||||
Name: 'NotificationGenericPolicy',
|
||||
Extends: MessageTray.NotificationPolicy,
|
||||
|
||||
_init: function() {
|
||||
// Don't chain to parent, it would try setting
|
||||
// our properties to the defaults
|
||||
|
||||
this.id = 'generic';
|
||||
|
||||
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
|
||||
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
||||
},
|
||||
|
||||
store: function() { },
|
||||
|
||||
destroy: function() {
|
||||
this._masterSettings.run_dispose();
|
||||
},
|
||||
|
||||
_changed: function(settings, key) {
|
||||
this.emit('policy-changed', key);
|
||||
},
|
||||
|
||||
get enable() {
|
||||
return true;
|
||||
},
|
||||
|
||||
get enableSound() {
|
||||
return true;
|
||||
},
|
||||
|
||||
get showBanners() {
|
||||
return this._masterSettings.get_boolean('show-banners');
|
||||
},
|
||||
|
||||
get forceExpanded() {
|
||||
return false;
|
||||
},
|
||||
|
||||
get showInLockScreen() {
|
||||
return this._masterSettings.get_boolean('show-in-lock-screen');
|
||||
},
|
||||
|
||||
get detailsInLockScreen() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
const NotificationApplicationPolicy = new Lang.Class({
|
||||
Name: 'NotificationApplicationPolicy',
|
||||
Extends: MessageTray.NotificationPolicy,
|
||||
|
||||
_init: function(id) {
|
||||
// Don't chain to parent, it would try setting
|
||||
// our properties to the defaults
|
||||
|
||||
this.id = id;
|
||||
this._canonicalId = this._canonicalizeId(id)
|
||||
|
||||
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
|
||||
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
|
||||
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
|
||||
|
||||
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
||||
this._settings.connect('changed', Lang.bind(this, this._changed));
|
||||
},
|
||||
|
||||
store: function() {
|
||||
this._settings.set_string('application-id', this.id + '.desktop');
|
||||
|
||||
let apps = this._masterSettings.get_strv('application-children');
|
||||
if (apps.indexOf(this._canonicalId) < 0) {
|
||||
apps.push(this._canonicalId);
|
||||
this._masterSettings.set_strv('application-children', apps);
|
||||
}
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this._masterSettings.run_dispose();
|
||||
this._settings.run_dispose();
|
||||
},
|
||||
|
||||
_changed: function(settings, key) {
|
||||
this.emit('policy-changed', key);
|
||||
},
|
||||
|
||||
_canonicalizeId: function(id) {
|
||||
// Keys are restricted to lowercase alphanumeric characters and dash,
|
||||
// and two dashes cannot be in succession
|
||||
return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
|
||||
},
|
||||
|
||||
get enable() {
|
||||
return this._settings.get_boolean('enable');
|
||||
},
|
||||
|
||||
get enableSound() {
|
||||
return this._settings.get_boolean('enable-sound-alerts');
|
||||
},
|
||||
|
||||
get showBanners() {
|
||||
return this._masterSettings.get_boolean('show-banners') &&
|
||||
this._settings.get_boolean('show-banners');
|
||||
},
|
||||
|
||||
get forceExpanded() {
|
||||
return this._settings.get_boolean('force-expanded');
|
||||
},
|
||||
|
||||
get showInLockScreen() {
|
||||
return this._masterSettings.get_boolean('show-in-lock-screen') &&
|
||||
this._settings.get_boolean('show-in-lock-screen');
|
||||
},
|
||||
|
||||
get detailsInLockScreen() {
|
||||
return this._settings.get_boolean('details-in-lock-screen');
|
||||
}
|
||||
});
|
||||
|
||||
const NotificationDaemon = new Lang.Class({
|
||||
Name: 'NotificationDaemon',
|
||||
|
||||
@@ -213,7 +333,7 @@ const NotificationDaemon = new Lang.Class({
|
||||
}
|
||||
}
|
||||
|
||||
let source = new Source(title, pid, sender, trayIcon);
|
||||
let source = new Source(title, pid, sender, trayIcon, ndata ? ndata.hints['desktop-entry'] : null);
|
||||
source.setTransient(isForTransientNotification);
|
||||
|
||||
if (!isForTransientNotification) {
|
||||
@@ -381,6 +501,9 @@ const NotificationDaemon = new Lang.Class({
|
||||
}));
|
||||
}
|
||||
|
||||
// Mark music notifications so they can be shown in the screen shield
|
||||
notification.isMusic = (ndata.hints['category'] == 'x-gnome.music');
|
||||
|
||||
let gicon = this._iconForNotificationData(icon, hints);
|
||||
let gimage = this._imageForNotificationData(hints);
|
||||
|
||||
@@ -395,17 +518,17 @@ const NotificationDaemon = new Lang.Class({
|
||||
// one of 'image-data' or 'image-path' are specified, we show both an icon and
|
||||
// a large image.
|
||||
if (gicon && gimage)
|
||||
image = new St.Icon({ gicon: gimage });
|
||||
image = new St.Icon({ gicon: gimage,
|
||||
icon_size: notification.IMAGE_SIZE });
|
||||
else if (!gicon && gimage)
|
||||
gicon = gimage;
|
||||
else if (!gicon)
|
||||
gicon = this._fallbackIconForNotificationData(hints);
|
||||
|
||||
notification.setImage(image);
|
||||
|
||||
notification.update(summary, body, { gicon: gicon,
|
||||
bannerMarkup: true,
|
||||
clear: true });
|
||||
notification.setImage(image);
|
||||
|
||||
if (actions.length) {
|
||||
notification.setUseActionIcons(hints['action-icons'] == true);
|
||||
@@ -515,12 +638,22 @@ const Source = new Lang.Class({
|
||||
Name: 'NotificationDaemonSource',
|
||||
Extends: MessageTray.Source,
|
||||
|
||||
_init: function(title, pid, sender, trayIcon) {
|
||||
_init: function(title, pid, sender, trayIcon, appId) {
|
||||
// Need to set the app before chaining up, so
|
||||
// methods called from the parent constructor can find it
|
||||
this.trayIcon = trayIcon;
|
||||
this.pid = pid;
|
||||
this.app = this._getApp(appId);
|
||||
|
||||
this.parent(title);
|
||||
|
||||
this.initialTitle = title;
|
||||
|
||||
this.pid = pid;
|
||||
if (this.app)
|
||||
this.title = this.app.get_name();
|
||||
else
|
||||
this.useNotificationIcon = true;
|
||||
|
||||
if (sender)
|
||||
this._nameWatcherId = Gio.DBus.session.watch_name(sender,
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
@@ -529,16 +662,19 @@ const Source = new Lang.Class({
|
||||
else
|
||||
this._nameWatcherId = 0;
|
||||
|
||||
this._setApp();
|
||||
if (this.app)
|
||||
this.title = this.app.get_name();
|
||||
else
|
||||
this.useNotificationIcon = true;
|
||||
|
||||
this.trayIcon = trayIcon;
|
||||
if (this.trayIcon) {
|
||||
this._setSummaryIcon(this.trayIcon);
|
||||
this.useNotificationIcon = false;
|
||||
// Try again finding the app, using the WM_CLASS from the tray icon
|
||||
this._setSummaryIcon(this.trayIcon);
|
||||
this.useNotificationIcon = false;
|
||||
}
|
||||
},
|
||||
|
||||
_createPolicy: function() {
|
||||
if (this.app) {
|
||||
let id = this.app.get_id().replace(/\.desktop$/,'');
|
||||
return new NotificationApplicationPolicy(id);
|
||||
} else {
|
||||
return new NotificationGenericPolicy();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -565,19 +701,17 @@ const Source = new Lang.Class({
|
||||
this.notify(notification);
|
||||
},
|
||||
|
||||
handleSummaryClick: function() {
|
||||
handleSummaryClick: function(button) {
|
||||
if (!this.trayIcon)
|
||||
return false;
|
||||
|
||||
let event = Clutter.get_current_event();
|
||||
if (event.type() != Clutter.EventType.BUTTON_RELEASE)
|
||||
return false;
|
||||
|
||||
// Left clicks are passed through only where there aren't unacknowledged
|
||||
// notifications, so it possible to open them in summary mode; right
|
||||
// clicks are always forwarded, as the right click menu is not useful for
|
||||
// tray icons
|
||||
if (event.get_button() == 1 &&
|
||||
if (button == 1 &&
|
||||
this.notifications.length > 0)
|
||||
return false;
|
||||
|
||||
@@ -590,7 +724,7 @@ const Source = new Lang.Class({
|
||||
return true;
|
||||
},
|
||||
|
||||
_getApp: function() {
|
||||
_getApp: function(appId) {
|
||||
let app;
|
||||
|
||||
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
|
||||
@@ -598,7 +732,13 @@ const Source = new Lang.Class({
|
||||
return app;
|
||||
|
||||
if (this.trayIcon) {
|
||||
app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wmclass);
|
||||
app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wm_class);
|
||||
if (app != null)
|
||||
return app;
|
||||
}
|
||||
|
||||
if (appId) {
|
||||
app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
|
||||
if (app != null)
|
||||
return app;
|
||||
}
|
||||
@@ -606,11 +746,11 @@ const Source = new Lang.Class({
|
||||
return null;
|
||||
},
|
||||
|
||||
_setApp: function() {
|
||||
_setApp: function(appId) {
|
||||
if (this.app)
|
||||
return;
|
||||
|
||||
this.app = this._getApp();
|
||||
this.app = this._getApp(appId);
|
||||
if (!this.app)
|
||||
return;
|
||||
|
||||
|
@@ -122,7 +122,8 @@ const Overview = new Lang.Class({
|
||||
// one. Instances of this class share a single CoglTexture behind the
|
||||
// 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 = new Meta.BackgroundActor({ screen: global.screen,
|
||||
settings: Main.background });
|
||||
this._background.add_glsl_snippet(Meta.SnippetHook.FRAGMENT,
|
||||
GLSL_DIM_EFFECT_DECLARATIONS,
|
||||
GLSL_DIM_EFFECT_CODE,
|
||||
@@ -576,7 +577,7 @@ const Overview = new Lang.Class({
|
||||
if (this._shown) {
|
||||
if (!this._modal) {
|
||||
if (Main.pushModal(this._overview,
|
||||
{ keybindingMode: Main.KeybindingMode.OVERVIEW }))
|
||||
{ keybindingMode: Shell.KeyBindingMode.OVERVIEW }))
|
||||
this._modal = true;
|
||||
else
|
||||
this.hide();
|
||||
|
@@ -315,7 +315,7 @@ const AppMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if (this._visible || Main.screenShield.locked)
|
||||
if (this._visible)
|
||||
return;
|
||||
|
||||
this._visible = true;
|
||||
@@ -644,7 +644,7 @@ const ActivitiesButton = new Lang.Class({
|
||||
|
||||
this.actor.label_actor = this._label;
|
||||
|
||||
this.hotCorner = new Layout.HotCorner();
|
||||
this.hotCorner = new Layout.HotCorner(Main.layoutManager);
|
||||
container.add_actor(this.hotCorner.actor);
|
||||
|
||||
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
||||
|
@@ -41,10 +41,10 @@ const PointerWatcher = new Lang.Class({
|
||||
Name: 'PointerWatcher',
|
||||
|
||||
_init: function() {
|
||||
let idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||
idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
|
||||
idleMonitor.add_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle));
|
||||
this._idle = idleMonitor.get_idletime() > IDLE_TIME;
|
||||
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||
this._idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
|
||||
this._idleMonitor.add_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle));
|
||||
this._idle = this._idleMonitor.get_idletime() > IDLE_TIME;
|
||||
this._watches = [];
|
||||
this.pointerX = null;
|
||||
this.pointerY = null;
|
||||
|
@@ -889,7 +889,7 @@ const PopupMenuBase = new Lang.Class({
|
||||
|
||||
addSettingsAction: function(title, desktopFile) {
|
||||
let menuItem = this.addAction(title, function() {
|
||||
let app = Shell.AppSystem.get_default().lookup_setting(desktopFile);
|
||||
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
||||
|
||||
if (!app) {
|
||||
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
||||
|
@@ -137,8 +137,12 @@ function remoteProvidersLoaded(loadState) {
|
||||
idxB = sortOrder.indexOf(appIdB);
|
||||
|
||||
// if no provider is found in the order, use alphabetical order
|
||||
if ((idxA == -1) && (idxB == -1))
|
||||
return GLib.utf8_collate(providerA.title, providerB.title);
|
||||
if ((idxA == -1) && (idxB == -1)) {
|
||||
let nameA = providerA.appInfo.get_name();
|
||||
let nameB = providerB.appInfo.get_name();
|
||||
|
||||
return GLib.utf8_collate(nameA, nameB);
|
||||
}
|
||||
|
||||
if (numSorted > 1) {
|
||||
// if providerA is the last, it goes after everything
|
||||
@@ -217,7 +221,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
Lang.bind(this, this._getResultsFinished),
|
||||
this._cancellable);
|
||||
} catch(e) {
|
||||
log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString()));
|
||||
log('Error calling GetInitialResultSet for provider %s: %s'.format(this.id, e.toString()));
|
||||
this.searchSystem.pushResults(this, []);
|
||||
}
|
||||
},
|
||||
@@ -230,7 +234,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
Lang.bind(this, this._getResultsFinished),
|
||||
this._cancellable);
|
||||
} catch(e) {
|
||||
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString()));
|
||||
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.id, e.toString()));
|
||||
this.searchSystem.pushResults(this, []);
|
||||
}
|
||||
},
|
||||
@@ -261,7 +265,7 @@ const RemoteSearchProvider = new Lang.Class({
|
||||
Lang.bind(this, this._getResultMetasFinished, callback),
|
||||
this._cancellable);
|
||||
} catch(e) {
|
||||
log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString()));
|
||||
log('Error calling GetResultMetas for provider %s: %s'.format(this.id, e.toString()));
|
||||
callback([]);
|
||||
}
|
||||
},
|
||||
|
@@ -8,11 +8,13 @@ const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
const TweenerEquations = imports.tweener.equations;
|
||||
|
||||
const GnomeSession = imports.misc.gnomeSession;
|
||||
const Hash = imports.misc.hash;
|
||||
const Layout = imports.ui.layout;
|
||||
const LoginManager = imports.misc.loginManager;
|
||||
const Lightbox = imports.ui.lightbox;
|
||||
@@ -50,36 +52,16 @@ const SUMMARY_ICON_SIZE = 48;
|
||||
const STANDARD_FADE_TIME = 10;
|
||||
const SHORT_FADE_TIME = 0.3;
|
||||
|
||||
function sample(offx, offy) {
|
||||
return 'texel += texture2D (sampler, tex_coord.st + pixel_step * ' +
|
||||
'vec2 (' + offx + ',' + offy + '));\n'
|
||||
}
|
||||
const GLSL_BLUR_EFFECT_DECLARATIONS = ' \
|
||||
uniform vec2 pixel_step;\n \
|
||||
uniform float desaturation;\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(+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 \
|
||||
const GLSL_EFFECT_DECLARATIONS = ' \
|
||||
uniform float desaturation; \n \
|
||||
vec3 desaturate (const vec3 color)\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);\n';
|
||||
const GLSL_EFFECT_CODE = ' \
|
||||
cogl_color_out.rgb = desaturate(cogl_color_out.rgb);\n';
|
||||
|
||||
|
||||
const Clock = new Lang.Class({
|
||||
@@ -127,49 +109,48 @@ const NotificationsBox = new Lang.Class({
|
||||
name: 'screenShieldNotifications',
|
||||
style_class: 'screen-shield-notifications-box' });
|
||||
|
||||
this._residentNotificationBox = new St.BoxLayout({ vertical: true,
|
||||
style_class: 'screen-shield-notifications-box' });
|
||||
let scrollView = new St.ScrollView({ x_fill: false, x_align: St.Align.START });
|
||||
this._persistentNotificationBox = new St.BoxLayout({ vertical: true,
|
||||
style_class: 'screen-shield-notifications-box' });
|
||||
scrollView.add_actor(this._persistentNotificationBox);
|
||||
this._musicBin = new St.Bin({ style_class: 'screen-shield-notifications-box',
|
||||
visible: false });
|
||||
|
||||
this.actor.add(this._residentNotificationBox, { x_fill: true });
|
||||
let scrollView = new St.ScrollView({ x_fill: false, x_align: St.Align.START });
|
||||
this._notificationBox = new St.BoxLayout({ vertical: true,
|
||||
style_class: 'screen-shield-notifications-box' });
|
||||
scrollView.add_actor(this._notificationBox);
|
||||
|
||||
this.actor.add(this._musicBin);
|
||||
this.actor.add(scrollView, { x_fill: true, x_align: St.Align.START });
|
||||
|
||||
this._items = [];
|
||||
Main.messageTray.getSummaryItems().forEach(Lang.bind(this, function(item) {
|
||||
this._summaryItemAdded(Main.messageTray, item, true);
|
||||
this._sources = new Hash.Map();
|
||||
Main.messageTray.getSources().forEach(Lang.bind(this, function(source) {
|
||||
this._sourceAdded(Main.messageTray, source, true);
|
||||
}));
|
||||
this._updateVisibility();
|
||||
|
||||
this._summaryAddedId = Main.messageTray.connect('summary-item-added', Lang.bind(this, this._summaryItemAdded));
|
||||
this._sourceAddedId = Main.messageTray.connect('source-added', Lang.bind(this, this._sourceAdded));
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._summaryAddedId) {
|
||||
Main.messageTray.disconnect(this._summaryAddedId);
|
||||
this._summaryAddedId = 0;
|
||||
if (this._sourceAddedId) {
|
||||
Main.messageTray.disconnect(this._sourceAddedId);
|
||||
this._sourceAddedId = 0;
|
||||
}
|
||||
|
||||
for (let i = 0; i < this._items.length; i++)
|
||||
this._removeItem(this._items[i]);
|
||||
this._items = [];
|
||||
let items = this._sources.items();
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
let [source, obj] = items[i];
|
||||
this._removeSource(source, obj);
|
||||
}
|
||||
|
||||
this.actor.destroy();
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
this._residentNotificationBox.visible = this._residentNotificationBox.get_n_children() > 0;
|
||||
this._persistentNotificationBox.visible = this._persistentNotificationBox.get_children().some(function(a) {
|
||||
this._musicBin.visible = this._musicBin.child != null && this._musicBin.child.visible;
|
||||
this._notificationBox.visible = this._notificationBox.get_children().some(function(a) {
|
||||
return a.visible;
|
||||
});
|
||||
|
||||
this.actor.visible = this._residentNotificationBox.visible || this._persistentNotificationBox.visible;
|
||||
},
|
||||
|
||||
_sourceIsResident: function(source) {
|
||||
return source.hasResidentNotification() && !source.isChat;
|
||||
this.actor.visible = this._musicBin.visible || this._notificationBox.visible;
|
||||
},
|
||||
|
||||
_makeNotificationCountText: function(count, isChat) {
|
||||
@@ -179,18 +160,16 @@ const NotificationsBox = new Lang.Class({
|
||||
return ngettext("%d new notification", "%d new notifications", count).format(count);
|
||||
},
|
||||
|
||||
_makeNotificationSource: function(source) {
|
||||
let box = new St.BoxLayout({ style_class: 'screen-shield-notification-source' });
|
||||
|
||||
_makeNotificationSource: function(source, box) {
|
||||
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
|
||||
box.add(sourceActor.actor, { y_fill: true });
|
||||
|
||||
let textBox = new St.BoxLayout({ vertical: true });
|
||||
box.add(textBox, { y_fill: false, y_align: St.Align.START });
|
||||
|
||||
let label = new St.Label({ text: source.title,
|
||||
let title = new St.Label({ text: source.title,
|
||||
style_class: 'screen-shield-notification-label' });
|
||||
textBox.add(label);
|
||||
textBox.add(title);
|
||||
|
||||
let count = source.unseenCount;
|
||||
let countLabel = new St.Label({ text: this._makeNotificationCountText(count, source.isChat),
|
||||
@@ -198,118 +177,179 @@ const NotificationsBox = new Lang.Class({
|
||||
textBox.add(countLabel);
|
||||
|
||||
box.visible = count != 0;
|
||||
return [box, countLabel];
|
||||
return [title, countLabel];
|
||||
},
|
||||
|
||||
_summaryItemAdded: function(tray, item, dontUpdateVisibility) {
|
||||
// Ignore transient sources, or sources explicitly marked not to show
|
||||
// in the lock screen
|
||||
if (item.source.isTransient || !item.source.showInLockScreen)
|
||||
_makeNotificationDetailedSource: function(source, box) {
|
||||
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
|
||||
box.add(sourceActor.actor, { y_fill: true });
|
||||
|
||||
let textBox = new St.BoxLayout({ vertical: true });
|
||||
box.add(textBox, { y_fill: false, y_align: St.Align.START });
|
||||
|
||||
let title = new St.Label({ text: source.title,
|
||||
style_class: 'screen-shield-notification-label' });
|
||||
textBox.add(title);
|
||||
|
||||
let visible = false;
|
||||
for (let i = 0; i < source.notifications.length; i++) {
|
||||
let n = source.notifications[i];
|
||||
|
||||
if (n.acknowledged || n.isMusic)
|
||||
continue;
|
||||
|
||||
let body = '';
|
||||
if (n.bannerBodyText) {
|
||||
body = n.bannerBodyMarkup ? n.bannerBodyText :
|
||||
GLib.markup_escape_text(n.bannerBodyMarkup, -1);
|
||||
}
|
||||
|
||||
let label = new St.Label({ style_class: 'screen-shield-notification-count-text' });
|
||||
label.clutter_text.set_markup('<b>' + n.title + '</b> ' + body);
|
||||
textBox.add(label);
|
||||
|
||||
visible = true;
|
||||
}
|
||||
|
||||
box.visible = visible;
|
||||
return [title, null];
|
||||
},
|
||||
|
||||
_showSource: function(source, obj, box) {
|
||||
let musicNotification = source.getMusicNotification();
|
||||
|
||||
if (musicNotification != null &&
|
||||
this._musicBin.child == null) {
|
||||
if (musicNotification.actor.get_parent() != null)
|
||||
musicNotification.actor.get_parent().remove_actor(musicNotification.actor);
|
||||
this._musicBin.child = musicNotification.actor;
|
||||
this._musicBin.child.visible = obj.visible;
|
||||
|
||||
musicNotification.expand(false /* animate */);
|
||||
|
||||
obj.musicNotification = musicNotification;
|
||||
}
|
||||
|
||||
if (obj.detailed) {
|
||||
[obj.titleLabel, obj.countLabel] = this._makeNotificationDetailedSource(source, box);
|
||||
} else {
|
||||
[obj.titleLabel, obj.countLabel] = this._makeNotificationSource(source, box);
|
||||
}
|
||||
|
||||
box.visible = obj.visible &&
|
||||
(source.unseenCount > (musicNotification ? 1 : 0));
|
||||
},
|
||||
|
||||
_sourceAdded: function(tray, source, dontUpdateVisibility) {
|
||||
// Ignore transient sources
|
||||
if (source.isTransient)
|
||||
return;
|
||||
|
||||
let obj = {
|
||||
item: item,
|
||||
source: item.source,
|
||||
resident: this._sourceIsResident(item.source),
|
||||
contentUpdatedId: 0,
|
||||
visible: source.policy.showInLockScreen,
|
||||
detailed: source.policy.detailsInLockScreen,
|
||||
sourceDestroyId: 0,
|
||||
sourceCountChangedId: 0,
|
||||
sourceTitleChangedId: 0,
|
||||
sourceUpdatedId: 0,
|
||||
musicNotification: null,
|
||||
sourceBox: null,
|
||||
titleLabel: null,
|
||||
countLabel: null,
|
||||
};
|
||||
|
||||
if (obj.resident) {
|
||||
this._residentNotificationBox.add(item.notificationStackWidget);
|
||||
item.closeButton.hide();
|
||||
item.prepareNotificationStackForShowing();
|
||||
} else {
|
||||
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
|
||||
this._persistentNotificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START });
|
||||
}
|
||||
obj.sourceBox = new St.BoxLayout({ style_class: 'screen-shield-notification-source' });
|
||||
this._showSource(source, obj, obj.sourceBox);
|
||||
this._notificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START });
|
||||
|
||||
obj.contentUpdatedId = item.connect('content-updated', Lang.bind(this, this._onItemContentUpdated));
|
||||
obj.sourceCountChangedId = item.source.connect('count-updated', Lang.bind(this, this._onSourceChanged));
|
||||
obj.sourceTitleChangedId = item.source.connect('title-changed', Lang.bind(this, this._onSourceChanged));
|
||||
obj.sourceDestroyId = item.source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
|
||||
this._items.push(obj);
|
||||
obj.sourceCountChangedId = source.connect('count-updated', Lang.bind(this, function(source) {
|
||||
this._countChanged(source, obj);
|
||||
}));
|
||||
obj.sourceTitleChangedId = source.connect('title-changed', Lang.bind(this, function(source) {
|
||||
this._titleChanged(source, obj);
|
||||
}));
|
||||
obj.policyChangedId = source.policy.connect('policy-changed', Lang.bind(this, function(policy, key) {
|
||||
if (key == 'show-in-lock-screen')
|
||||
this._visibleChanged(source, obj);
|
||||
else
|
||||
this._detailedChanged(source, obj);
|
||||
}));
|
||||
obj.sourceDestroyId = source.connect('destroy', Lang.bind(this, function(source) {
|
||||
this._onSourceDestroy(source, obj);
|
||||
}));
|
||||
|
||||
this._sources.set(source, obj);
|
||||
|
||||
if (!dontUpdateVisibility)
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_findSource: function(source) {
|
||||
for (let i = 0; i < this._items.length; i++) {
|
||||
if (this._items[i].source == source)
|
||||
return i;
|
||||
_titleChanged: function(source, obj) {
|
||||
obj.titleLabel.text = source.title;
|
||||
},
|
||||
|
||||
_countChanged: function(source, obj) {
|
||||
if (obj.detailed) {
|
||||
// A new notification was pushed, or a previous notification was destroyed.
|
||||
// Give up, and build the list again.
|
||||
|
||||
obj.sourceBox.destroy_all_children();
|
||||
obj.titleLabel = obj.countLabel = null;
|
||||
this._showSource(source, obj, obj.sourceBox);
|
||||
} else {
|
||||
let count = source.unseenCount;
|
||||
obj.countLabel.text = this._makeNotificationCountText(count, source.isChat);
|
||||
}
|
||||
|
||||
return -1;
|
||||
obj.sourceBox.visible = obj.visible &&
|
||||
(source.unseenCount > (obj.musicNotification ? 1 : 0));
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_onItemContentUpdated: function(item) {
|
||||
let obj = this._items[this._findSource(item.source)];
|
||||
this._updateItem(obj);
|
||||
},
|
||||
|
||||
_onSourceChanged: function(source) {
|
||||
let obj = this._items[this._findSource(source)];
|
||||
this._updateItem(obj);
|
||||
},
|
||||
|
||||
_updateItem: function(obj) {
|
||||
let itemShouldBeResident = this._sourceIsResident(obj.source);
|
||||
|
||||
if (itemShouldBeResident && obj.resident) {
|
||||
// Nothing to do here, the actor is already updated
|
||||
_visibleChanged: function(source, obj) {
|
||||
if (obj.visible == source.policy.showInLockScreen)
|
||||
return;
|
||||
}
|
||||
|
||||
if (obj.resident && !itemShouldBeResident) {
|
||||
// make into a regular item
|
||||
obj.item.doneShowingNotificationStack();
|
||||
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
|
||||
|
||||
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(obj.source);
|
||||
this._persistentNotificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START });
|
||||
} else if (itemShouldBeResident && !obj.resident) {
|
||||
// make into a resident item
|
||||
obj.sourceBox.destroy();
|
||||
obj.sourceBox = obj.countLabel = null;
|
||||
obj.resident = true;
|
||||
|
||||
this._residentNotificationBox.add(obj.item.notificationStackWidget);
|
||||
obj.item.closeButton.hide();
|
||||
obj.item.prepareNotificationStackForShowing();
|
||||
} else {
|
||||
// just update the counter
|
||||
let count = obj.source.unseenCount;
|
||||
obj.countLabel.text = this._makeNotificationCountText(count, obj.source.isChat);
|
||||
obj.sourceBox.visible = count != 0;
|
||||
}
|
||||
obj.visible = source.policy.showInLockScreen;
|
||||
if (obj.musicNotification)
|
||||
obj.musicNotification.actor.visible = obj.visible;
|
||||
obj.sourceBox.visible = obj.visible &&
|
||||
source.unseenCount > (obj.musicNotification ? 1 : 0);
|
||||
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_onSourceDestroy: function(source) {
|
||||
let idx = this._findSource(source);
|
||||
_detailedChanged: function(source, obj) {
|
||||
if (obj.detailed == source.policy.detailsInLockScreen)
|
||||
return;
|
||||
|
||||
this._removeItem(this._items[idx]);
|
||||
this._items.splice(idx, 1);
|
||||
obj.detailed = source.policy.detailsInLockScreen;
|
||||
|
||||
obj.sourceBox.destroy_all_children();
|
||||
obj.titleLabel = obj.countLabel = null;
|
||||
this._showSource(source, obj, obj.sourceBox);
|
||||
},
|
||||
|
||||
_onSourceDestroy: function(source, obj) {
|
||||
this._removeSource(source, obj);
|
||||
this._updateVisibility();
|
||||
},
|
||||
|
||||
_removeItem: function(obj) {
|
||||
if (obj.resident) {
|
||||
obj.item.doneShowingNotificationStack();
|
||||
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
|
||||
} else {
|
||||
obj.sourceBox.destroy();
|
||||
_removeSource: function(source, obj) {
|
||||
obj.sourceBox.destroy();
|
||||
obj.sourceBox = obj.titleLabel = obj.countLabel = null;
|
||||
|
||||
if (obj.musicNotification) {
|
||||
this._musicBin.child = null;
|
||||
obj.musicNotification = null;
|
||||
}
|
||||
|
||||
obj.item.disconnect(obj.contentUpdatedId);
|
||||
obj.source.disconnect(obj.sourceDestroyId);
|
||||
obj.source.disconnect(obj.sourceCountChangedId);
|
||||
obj.source.disconnect(obj.sourceTitleChangedId);
|
||||
source.disconnect(obj.sourceDestroyId);
|
||||
source.disconnect(obj.sourceCountChangedId);
|
||||
source.disconnect(obj.sourceTitleChangedId);
|
||||
source.policy.disconnect(obj.policyChangedId);
|
||||
|
||||
this._sources.delete(source);
|
||||
},
|
||||
});
|
||||
|
||||
@@ -395,6 +435,7 @@ const ScreenShield = new Lang.Class({
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
name: 'lockScreenGroup',
|
||||
visible: false,
|
||||
});
|
||||
this._lockScreenGroup.connect('key-release-event',
|
||||
Lang.bind(this, this._onLockScreenKeyRelease));
|
||||
@@ -406,16 +447,16 @@ 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._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
||||
|
||||
let backgroundActor = new Meta.BackgroundActor({ screen: global.screen,
|
||||
settings: this._settings });
|
||||
backgroundActor.add_glsl_snippet(Meta.SnippetHook.FRAGMENT,
|
||||
GLSL_EFFECT_DECLARATIONS,
|
||||
GLSL_EFFECT_CODE,
|
||||
false);
|
||||
backgroundActor.set_uniform_float('desaturation',
|
||||
1, 1, [0.6]);
|
||||
backgroundActor.connect('notify::size', function(actor) {
|
||||
actor.set_uniform_float('pixel_step', 2, 1, [1/actor.width, 1/actor.height]);
|
||||
});
|
||||
|
||||
this._background = new St.Bin({ style_class: 'screen-shield-background',
|
||||
child: backgroundActor });
|
||||
@@ -468,25 +509,36 @@ const ScreenShield = new Lang.Class({
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
this._loginSession = this._loginManager.getCurrentSessionProxy();
|
||||
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
|
||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); }));
|
||||
|
||||
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
||||
|
||||
this._isModal = false;
|
||||
this._hasLockScreen = false;
|
||||
this._isGreeter = false;
|
||||
this._isActive = false;
|
||||
this._isLocked = false;
|
||||
this._inUnlockAnimation = false;
|
||||
this._activationTime = 0;
|
||||
this._becameActiveId = 0;
|
||||
this._lockTimeoutId = 0;
|
||||
|
||||
this._lightbox = new Lightbox.Lightbox(Main.uiGroup,
|
||||
{ inhibitEvents: true,
|
||||
fadeInTime: STANDARD_FADE_TIME,
|
||||
fadeFactor: 1 });
|
||||
this._lightbox.connect('shown', Lang.bind(this, this._onLightboxShown));
|
||||
|
||||
this.idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||
},
|
||||
|
||||
_liftShield: function(onPrimary, velocity) {
|
||||
if (this._isLocked) {
|
||||
this._ensureUnlockDialog(onPrimary, true /* allowCancel */);
|
||||
this._hideLockScreen(true /* animate */, velocity);
|
||||
} else {
|
||||
this.deactivate(true /* animate */);
|
||||
}
|
||||
},
|
||||
|
||||
_onLockScreenKeyRelease: function(actor, event) {
|
||||
let symbol = event.get_key_symbol();
|
||||
|
||||
@@ -504,8 +556,7 @@ const ScreenShield = new Lang.Class({
|
||||
if (symbol == Clutter.KEY_Escape ||
|
||||
symbol == Clutter.KEY_Return ||
|
||||
symbol == Clutter.KEY_KP_Enter) {
|
||||
this._ensureUnlockDialog(true, true);
|
||||
this._hideLockScreen(true, 0);
|
||||
this._liftShield(false, 0);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -527,8 +578,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
// 7 standard scrolls to lift up
|
||||
if (this._lockScreenScrollCounter > 35) {
|
||||
this._ensureUnlockDialog(false, true);
|
||||
this._hideLockScreen(true, 0);
|
||||
this._liftShield(true, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -559,7 +609,9 @@ const ScreenShield = new Lang.Class({
|
||||
_onDragBegin: function() {
|
||||
Tweener.removeTweens(this._lockScreenGroup);
|
||||
this._lockScreenState = MessageTray.State.HIDING;
|
||||
this._ensureUnlockDialog(false, false);
|
||||
|
||||
if (this._isLocked)
|
||||
this._ensureUnlockDialog(false, false);
|
||||
|
||||
return true;
|
||||
},
|
||||
@@ -580,8 +632,7 @@ const ScreenShield = new Lang.Class({
|
||||
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
|
||||
// Complete motion automatically
|
||||
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
|
||||
this._hideLockScreen(true, -velocityY);
|
||||
this._ensureUnlockDialog(false, true);
|
||||
this._liftShield(true, -velocityY);
|
||||
} else {
|
||||
// restore the lock screen to its original place
|
||||
// try to use the same speed as the normal animation
|
||||
@@ -621,39 +672,81 @@ const ScreenShield = new Lang.Class({
|
||||
}
|
||||
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
|
||||
Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
if (this._lightbox.actor.visible ||
|
||||
this._isActive) {
|
||||
// We're either shown and active, or in the process of
|
||||
// showing.
|
||||
// The latter is a very unlikely condition (it requires
|
||||
// idle-delay < 20), but in any case we have nothing
|
||||
// to do at this point: either isActive is true, or
|
||||
// it will soon be.
|
||||
// isActive can also be true if the lightbox is hidden,
|
||||
// in case the shield is down and the user hasn't unlocked yet
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this._isActive) {
|
||||
this._lightbox.show();
|
||||
this._lightbox.show();
|
||||
|
||||
if (this._activationTime == 0)
|
||||
this._activationTime = GLib.get_monotonic_time();
|
||||
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);
|
||||
if (this._becameActiveId == 0)
|
||||
this._becameActiveId = this.idleMonitor.connect('became-active',
|
||||
Lang.bind(this, this._onUserBecameActive));
|
||||
|
||||
let lightboxWasShown = this._lightbox.shown;
|
||||
this._lightbox.hide();
|
||||
let shouldLock = this._settings.get_boolean(LOCK_ENABLED_KEY) && !this._isLocked;
|
||||
|
||||
// GLib.get_monotonic_time() returns microseconds, convert to seconds
|
||||
let elapsedTime = (GLib.get_monotonic_time() - this._activationTime) / 1000000;
|
||||
let shouldLock = lightboxWasShown &&
|
||||
this._settings.get_boolean(LOCK_ENABLED_KEY) &&
|
||||
(elapsedTime >= this._settings.get_uint(LOCK_DELAY_KEY));
|
||||
if (shouldLock || this._isLocked) {
|
||||
this.lock(false);
|
||||
} else if (this._isActive) {
|
||||
this.unlock();
|
||||
}
|
||||
}));
|
||||
|
||||
this._isActive = true;
|
||||
this.emit('lock-status-changed');
|
||||
if (shouldLock) {
|
||||
let lockTimeout = Math.max(STANDARD_FADE_TIME, this._settings.get_uint(LOCK_DELAY_KEY));
|
||||
this._lockTimeoutId = Mainloop.timeout_add(lockTimeout * 1000,
|
||||
Lang.bind(this, function() {
|
||||
this._lockTimeoutId = 0;
|
||||
this.lock(true);
|
||||
return false;
|
||||
}));
|
||||
}
|
||||
},
|
||||
|
||||
_onUserBecameActive: function() {
|
||||
// This function gets called here when the user becomes active
|
||||
// after gnome-session changed the status to IDLE
|
||||
// There are four possibilities here:
|
||||
// - we're called when already locked; isActive and isLocked are true,
|
||||
// we just go back to the lock screen curtain
|
||||
// - we're called before the lightbox is fully shown; at this point
|
||||
// isActive is false, so we just hide the ligthbox, reset the activationTime
|
||||
// and go back to the unlocked desktop
|
||||
// - we're called after showing the lightbox, but before the lock
|
||||
// delay; this is mostly like the case above, but isActive is true now
|
||||
// so we need to notify gnome-settings-daemon to go back to the normal
|
||||
// policies for blanking
|
||||
// (they're handled by the same code, and we emit one extra ActiveChanged
|
||||
// signal in the case above)
|
||||
// - we're called after showing the lightbox and after lock-delay; the
|
||||
// session is effectivelly locked now, it's time to build and show
|
||||
// the lock screen
|
||||
|
||||
this.idleMonitor.disconnect(this._becameActiveId);
|
||||
this._becameActiveId = 0;
|
||||
|
||||
let lightboxWasShown = this._lightbox.shown;
|
||||
this._lightbox.hide();
|
||||
|
||||
// Shortcircuit in case the mouse was moved before the fade completed
|
||||
if (!lightboxWasShown) {
|
||||
this.deactivate(false);
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
_onLightboxShown: function() {
|
||||
this.activate(false);
|
||||
},
|
||||
|
||||
showDialog: function() {
|
||||
// Ensure that the stage window is mapped, before taking a grab
|
||||
// otherwise X errors out
|
||||
@@ -668,6 +761,7 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this.actor.show();
|
||||
this._isGreeter = Main.sessionMode.isGreeter;
|
||||
this._isLocked = true;
|
||||
this._ensureUnlockDialog(true, true);
|
||||
this._hideLockScreen(false, 0);
|
||||
},
|
||||
@@ -688,6 +782,9 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
_hideLockScreen: function(animate, velocity) {
|
||||
if (this._lockScreenState == MessageTray.State.HIDDEN)
|
||||
return;
|
||||
|
||||
this._lockScreenState = MessageTray.State.HIDING;
|
||||
|
||||
if (animate) {
|
||||
@@ -729,7 +826,7 @@ const ScreenShield = new Lang.Class({
|
||||
let constructor = Main.sessionMode.unlockDialog;
|
||||
if (!constructor) {
|
||||
// This session mode has no locking capabilities
|
||||
this.unlock();
|
||||
this.deactivate(true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -739,8 +836,10 @@ const ScreenShield = new Lang.Class({
|
||||
let time = global.get_current_time();
|
||||
this._dialog.connect('loaded', Lang.bind(this, function() {
|
||||
if (!this._dialog.open(time, onPrimary)) {
|
||||
// This is kind of an impossible error: we're already modal
|
||||
// by the time we reach this...
|
||||
log('Could not open login dialog: failed to acquire grab');
|
||||
this.unlock();
|
||||
this.deactivate(true);
|
||||
}
|
||||
}));
|
||||
|
||||
@@ -756,12 +855,15 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
_onUnlockSucceded: function() {
|
||||
this._tweenUnlocked();
|
||||
this.deactivate(true);
|
||||
},
|
||||
|
||||
_resetLockScreen: function(animateLockScreen, animateLockDialog) {
|
||||
if (this._lockScreenState == MessageTray.State.SHOWING ||
|
||||
this._lockScreenState == MessageTray.State.SHOWN)
|
||||
// Don't reset the lock screen unless it is completely hidden
|
||||
// This prevents the shield going down if the lock-delay timeout
|
||||
// fires while the user is dragging (which has the potential
|
||||
// to confuse our state)
|
||||
if (this._lockScreenState != MessageTray.State.HIDDEN)
|
||||
return;
|
||||
|
||||
this._ensureLockScreen();
|
||||
@@ -830,6 +932,12 @@ const ScreenShield = new Lang.Class({
|
||||
this._lockScreenGroup.fixed_position_set = false;
|
||||
this._lockScreenScrollCounter = 0;
|
||||
|
||||
let prevIsActive = this._isActive;
|
||||
this._isActive = true;
|
||||
|
||||
if (prevIsActive != this._isActive)
|
||||
this.emit('active-changed');
|
||||
|
||||
this.emit('lock-screen-shown');
|
||||
},
|
||||
|
||||
@@ -851,12 +959,10 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._lockScreenContents.add_actor(this._lockScreenContentsBox);
|
||||
|
||||
if (this._settings.get_boolean('show-notifications')) {
|
||||
this._notificationsBox = new NotificationsBox();
|
||||
this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true,
|
||||
y_fill: true,
|
||||
expand: true });
|
||||
}
|
||||
this._notificationsBox = new NotificationsBox();
|
||||
this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true,
|
||||
y_fill: true,
|
||||
expand: true });
|
||||
|
||||
this._hasLockScreen = true;
|
||||
},
|
||||
@@ -881,6 +987,10 @@ const ScreenShield = new Lang.Class({
|
||||
},
|
||||
|
||||
get locked() {
|
||||
return this._isLocked;
|
||||
},
|
||||
|
||||
get active() {
|
||||
return this._isActive;
|
||||
},
|
||||
|
||||
@@ -888,27 +998,20 @@ const ScreenShield = new Lang.Class({
|
||||
return this._activationTime;
|
||||
},
|
||||
|
||||
_tweenUnlocked: function() {
|
||||
this._inUnlockAnimation = true;
|
||||
this.unlock();
|
||||
deactivate: function(animate) {
|
||||
this._hideLockScreen(animate, 0);
|
||||
|
||||
Tweener.addTween(this._lockDialogGroup, {
|
||||
scale_x: 0,
|
||||
scale_y: 0,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
time: animate ? Overview.ANIMATION_TIME : 0,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
if (this._dialog) {
|
||||
this._dialog.destroy();
|
||||
this._dialog = null;
|
||||
}
|
||||
this.actor.hide();
|
||||
this._inUnlockAnimation = false;
|
||||
},
|
||||
onComplete: Lang.bind(this, this._completeDeactivate),
|
||||
onCompleteScope: this
|
||||
});
|
||||
},
|
||||
|
||||
unlock: function() {
|
||||
_completeDeactivate: function() {
|
||||
if (this._hasLockScreen)
|
||||
this._clearLockScreen();
|
||||
|
||||
@@ -924,26 +1027,31 @@ const ScreenShield = new Lang.Class({
|
||||
this._isModal = false;
|
||||
}
|
||||
|
||||
if (!this._inUnlockAnimation)
|
||||
this.actor.hide();
|
||||
this.actor.hide();
|
||||
|
||||
if (Main.sessionMode.currentMode == 'lock-screen')
|
||||
Main.sessionMode.popMode('lock-screen');
|
||||
if (Main.sessionMode.currentMode == 'unlock-dialog')
|
||||
Main.sessionMode.popMode('unlock-dialog');
|
||||
|
||||
if (this._becameActiveId != 0) {
|
||||
this.idleMonitor.disconnect(this._becameActiveId);
|
||||
this._becameActiveId = 0;
|
||||
}
|
||||
|
||||
if (this._lockTimeoutId != 0) {
|
||||
Mainloop.source_remove(this._lockTimeoutId);
|
||||
this._lockTimeoutId = 0;
|
||||
}
|
||||
|
||||
this._activationTime = 0;
|
||||
this._isActive = false;
|
||||
this._isLocked = false;
|
||||
this.emit('lock-status-changed');
|
||||
this.emit('active-changed');
|
||||
this.emit('locked-changed');
|
||||
},
|
||||
|
||||
lock: function(animate) {
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
activate: function(animate) {
|
||||
if (this._activationTime == 0)
|
||||
this._activationTime = GLib.get_monotonic_time();
|
||||
|
||||
@@ -958,9 +1066,28 @@ const ScreenShield = new Lang.Class({
|
||||
|
||||
this._resetLockScreen(animate, animate);
|
||||
|
||||
this._isActive = true;
|
||||
// We used to set isActive and emit active-changed here,
|
||||
// but now we do that from lockScreenShown, which means
|
||||
// there is a 0.3 seconds window during which the lock
|
||||
// screen is effectively visible and the screen is locked, but
|
||||
// the DBus interface reports the screensaver is off.
|
||||
// This is because when we emit ActiveChanged(true),
|
||||
// gnome-settings-daemon blanks the screen, and we don't want
|
||||
// blank during the animation.
|
||||
// This is not a problem for the idle fade case, because we
|
||||
// activate without animation in that case.
|
||||
},
|
||||
|
||||
lock: function(animate) {
|
||||
if (!this._isModal) {
|
||||
Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
|
||||
this._isModal = true;
|
||||
}
|
||||
|
||||
this._isLocked = true;
|
||||
this.emit('lock-status-changed');
|
||||
this.activate(animate);
|
||||
|
||||
this.emit('locked-changed');
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(ScreenShield.prototype);
|
||||
@@ -994,13 +1121,13 @@ const ScreenShieldFallback = new Lang.Class({
|
||||
else
|
||||
this._locked = false;
|
||||
|
||||
this.emit('lock-status-changed', this._locked);
|
||||
this.emit('active-changed', this._locked);
|
||||
},
|
||||
|
||||
_onSignal: function(proxy, senderName, signalName, params) {
|
||||
if (signalName == 'ActiveChanged') {
|
||||
[this._locked] = params.deep_unpack();
|
||||
this.emit('lock-status-changed', this._locked);
|
||||
this.emit('active-changed', this._locked);
|
||||
}
|
||||
},
|
||||
|
||||
|
@@ -242,7 +242,7 @@ const SelectArea = new Lang.Class({
|
||||
});
|
||||
Signals.addSignalMethods(SelectArea.prototype);
|
||||
|
||||
const FLASHSPOT_ANIMATION_TIME = 0.25; // seconds
|
||||
const FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds
|
||||
|
||||
const Flashspot = new Lang.Class({
|
||||
Name: 'Flashspot',
|
||||
@@ -258,21 +258,12 @@ const Flashspot = new Lang.Class({
|
||||
},
|
||||
|
||||
fire: function() {
|
||||
this.actor.opacity = 0;
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 255,
|
||||
time: FLASHSPOT_ANIMATION_TIME,
|
||||
transition: 'linear',
|
||||
onComplete: Lang.bind(this, this._onFireShowComplete)
|
||||
});
|
||||
this.actor.show();
|
||||
},
|
||||
|
||||
_onFireShowComplete: function() {
|
||||
this.actor.opacity = 255;
|
||||
Tweener.addTween(this.actor,
|
||||
{ opacity: 0,
|
||||
time: FLASHSPOT_ANIMATION_TIME,
|
||||
transition: 'linear',
|
||||
time: FLASHSPOT_ANIMATION_OUT_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this, function() {
|
||||
this.destroy();
|
||||
})
|
||||
|
@@ -17,6 +17,26 @@ const Search = imports.ui.search;
|
||||
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
|
||||
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
|
||||
|
||||
const MaxWidthBin = new Lang.Class({
|
||||
Name: 'MaxWidthBin',
|
||||
Extends: St.Bin,
|
||||
|
||||
vfunc_allocate: function(box, flags) {
|
||||
let themeNode = this.get_theme_node();
|
||||
let maxWidth = themeNode.get_max_width();
|
||||
let availWidth = box.x2 - box.x1;
|
||||
let adjustedBox = box;
|
||||
|
||||
if (availWidth > maxWidth) {
|
||||
let excessWidth = availWidth - maxWidth;
|
||||
adjustedBox.x1 += Math.floor(excessWidth / 2);
|
||||
adjustedBox.x2 -= Math.floor(excessWidth / 2);
|
||||
}
|
||||
|
||||
this.parent(adjustedBox, flags);
|
||||
}
|
||||
});
|
||||
|
||||
const SearchResult = new Lang.Class({
|
||||
Name: 'SearchResult',
|
||||
|
||||
@@ -178,7 +198,7 @@ const ListSearchResults = new Lang.Class({
|
||||
|
||||
this._content = new St.BoxLayout({ style_class: 'list-search-results',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._content);
|
||||
this.actor.add(this._content, { expand: true });
|
||||
|
||||
this._notDisplayedResult = [];
|
||||
this._terms = [];
|
||||
@@ -301,12 +321,19 @@ const SearchResults = new Lang.Class({
|
||||
|
||||
this._content = new St.BoxLayout({ name: 'searchResultsContent',
|
||||
vertical: true });
|
||||
this._contentBin = new MaxWidthBin({ name: 'searchResultsBin',
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
child: this._content });
|
||||
|
||||
let scrollChild = new St.BoxLayout();
|
||||
scrollChild.add(this._contentBin, { expand: true });
|
||||
|
||||
this._scrollView = new St.ScrollView({ x_fill: true,
|
||||
y_fill: false,
|
||||
style_class: 'vfade' });
|
||||
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||
this._scrollView.add_actor(this._content);
|
||||
this._scrollView.add_actor(scrollChild);
|
||||
let action = new Clutter.PanAction({ interpolate: true });
|
||||
action.connect('pan', Lang.bind(this, this._onPan));
|
||||
this._scrollView.add_action(action);
|
||||
|
@@ -247,8 +247,8 @@ const ScreenSaverDBus = new Lang.Class({
|
||||
this.parent();
|
||||
|
||||
this._screenShield = screenShield;
|
||||
screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) {
|
||||
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.locked]));
|
||||
screenShield.connect('active-changed', Lang.bind(this, function(shield) {
|
||||
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
|
||||
}));
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
|
||||
@@ -269,13 +269,13 @@ const ScreenSaverDBus = new Lang.Class({
|
||||
|
||||
SetActive: function(active) {
|
||||
if (active)
|
||||
this._screenShield.lock(true);
|
||||
this._screenShield.activate(true);
|
||||
else
|
||||
this._screenShield.unlock();
|
||||
this._screenShield.unlock(false);
|
||||
},
|
||||
|
||||
GetActive: function() {
|
||||
return this._screenShield.locked;
|
||||
return this._screenShield.active;
|
||||
},
|
||||
|
||||
GetActiveTime: function() {
|
||||
|
@@ -9,6 +9,7 @@ const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
|
||||
@@ -286,6 +287,7 @@ const Indicator = new Lang.Class({
|
||||
_ensureSource: function() {
|
||||
if (!this._source) {
|
||||
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active');
|
||||
this._source.policy = new NotificationDaemon.NotificationApplicationPolicy('gnome-bluetooth-panel');
|
||||
Main.messageTray.add(this._source);
|
||||
}
|
||||
},
|
||||
|
@@ -115,9 +115,14 @@ const IBusManager = new Lang.Class({
|
||||
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
|
||||
// If an engine is already active we need to get its properties
|
||||
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
|
||||
let engine = this._ibus.get_global_engine_async_finish(result);
|
||||
if (!engine)
|
||||
let engine;
|
||||
try {
|
||||
engine = this._ibus.get_global_engine_async_finish(result);
|
||||
if (!engine)
|
||||
return;
|
||||
} catch(e) {
|
||||
return;
|
||||
}
|
||||
this._engineChanged(this._ibus, engine.get_name());
|
||||
}));
|
||||
this._updateReadiness();
|
||||
@@ -332,14 +337,14 @@ const InputSourceIndicator = new Lang.Class({
|
||||
Main.wm.addKeybinding('switch-input-source',
|
||||
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
|
||||
Meta.KeyBindingFlags.REVERSES,
|
||||
Main.KeybindingMode.ALL,
|
||||
Shell.KeyBindingMode.ALL,
|
||||
Lang.bind(this, this._switchInputSource));
|
||||
this._keybindingActionBackward =
|
||||
Main.wm.addKeybinding('switch-input-source-backward',
|
||||
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
|
||||
Meta.KeyBindingFlags.REVERSES |
|
||||
Meta.KeyBindingFlags.REVERSED,
|
||||
Main.KeybindingMode.ALL,
|
||||
Shell.KeyBindingMode.ALL,
|
||||
Lang.bind(this, this._switchInputSource));
|
||||
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
|
||||
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
|
||||
|
@@ -20,12 +20,14 @@ const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||
const ModemManager = imports.misc.modemManager;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const NMConnectionCategory = {
|
||||
INVALID: 'invalid',
|
||||
WIRED: 'wired',
|
||||
VIRTUAL: 'virtual',
|
||||
WIRELESS: 'wireless',
|
||||
WWAN: 'wwan',
|
||||
VPN: 'vpn'
|
||||
@@ -307,13 +309,10 @@ const NMDevice = new Lang.Class({
|
||||
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._setDevice(device);
|
||||
this.parent(connections);
|
||||
|
||||
this._activeConnection = null;
|
||||
this._activeConnectionItem = null;
|
||||
this._autoConnectionItem = null;
|
||||
@@ -338,23 +337,12 @@ const NMDevice = new Lang.Class({
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this.device)
|
||||
this.device._delegate = null;
|
||||
this._setDevice(null);
|
||||
|
||||
if (this._stateChangedId) {
|
||||
// Need to go through GObject.Object.prototype because
|
||||
// nm_device_disconnect conflicts with g_signal_disconnect
|
||||
GObject.Object.prototype.disconnect.call(this.device, this._stateChangedId);
|
||||
this._stateChangedId = 0;
|
||||
}
|
||||
if (this._carrierChangedId) {
|
||||
// see above for why this is needed
|
||||
GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId);
|
||||
this._carrierChangedId = 0;
|
||||
}
|
||||
if (this._firmwareChangedId) {
|
||||
GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId);
|
||||
this._firmwareChangedId = 0;
|
||||
if (this._deferredWorkId) {
|
||||
// Just clear out, the actual removal is handled when the
|
||||
// actor is destroyed
|
||||
this._deferredWorkId = 0;
|
||||
}
|
||||
|
||||
this._clearSection();
|
||||
@@ -363,6 +351,33 @@ const NMDevice = new Lang.Class({
|
||||
this.section.destroy();
|
||||
},
|
||||
|
||||
_setDevice: function(device) {
|
||||
if (device) {
|
||||
this.device = device;
|
||||
this.device._delegate = this;
|
||||
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||
} else if (this.device) {
|
||||
this.device._delegate = null;
|
||||
|
||||
if (this._stateChangedId) {
|
||||
// Need to go through GObject.Object.prototype because
|
||||
// nm_device_disconnect conflicts with g_signal_disconnect
|
||||
GObject.Object.prototype.disconnect.call(this.device, this._stateChangedId);
|
||||
this._stateChangedId = 0;
|
||||
}
|
||||
if (this._carrierChangedId) {
|
||||
GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId);
|
||||
this._carrierChangedId = 0;
|
||||
}
|
||||
if (this._firmwareChangedId) {
|
||||
GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId);
|
||||
this._firmwareChangedId = 0;
|
||||
}
|
||||
|
||||
this.device = null;
|
||||
}
|
||||
},
|
||||
|
||||
deactivate: function() {
|
||||
this.device.disconnect(null);
|
||||
return true;
|
||||
@@ -377,7 +392,7 @@ const NMDevice = new Lang.Class({
|
||||
// Otherwise, if no connection is currently configured,
|
||||
// try automatic configuration (or summon the config dialog)
|
||||
if (this._connections.length == 1) {
|
||||
this._client.activate_connection(this._connections[0].connection, this.device, null, null);
|
||||
this._client.activate_connection(this._connections[0].connection, this.device || null, null, null);
|
||||
return true;
|
||||
} else if (this._connections.length == 0) {
|
||||
return this._activateAutomaticConnection();
|
||||
@@ -397,7 +412,7 @@ const NMDevice = new Lang.Class({
|
||||
},
|
||||
|
||||
get connected() {
|
||||
return this.device.state == NetworkManager.DeviceState.ACTIVATED;
|
||||
return this.device && this.device.state == NetworkManager.DeviceState.ACTIVATED;
|
||||
},
|
||||
|
||||
clearActiveConnection: function(activeConnection) {
|
||||
@@ -417,7 +432,6 @@ const NMDevice = new Lang.Class({
|
||||
|
||||
this._activeConnection = activeConnection;
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
@@ -431,6 +445,9 @@ const NMDevice = new Lang.Class({
|
||||
},
|
||||
|
||||
getStatusLabel: function() {
|
||||
if (!this.device)
|
||||
return null;
|
||||
|
||||
switch(this.device.state) {
|
||||
case NetworkManager.DeviceState.DISCONNECTED:
|
||||
case NetworkManager.DeviceState.ACTIVATED:
|
||||
@@ -481,7 +498,7 @@ const NMDevice = new Lang.Class({
|
||||
},
|
||||
|
||||
syncDescription: function() {
|
||||
if (this.device._description)
|
||||
if (this.device && this.device._description)
|
||||
this.statusItem.label.text = this.device._description;
|
||||
},
|
||||
|
||||
@@ -491,8 +508,10 @@ const NMDevice = new Lang.Class({
|
||||
},
|
||||
|
||||
_queueCreateSection: function() {
|
||||
this._clearSection();
|
||||
Main.queueDeferredWork(this._deferredWorkId);
|
||||
if (this._deferredWorkId) {
|
||||
this._clearSection();
|
||||
Main.queueDeferredWork(this._deferredWorkId);
|
||||
}
|
||||
},
|
||||
|
||||
_clearSection: function() {
|
||||
@@ -592,7 +611,6 @@ const NMDevice = new Lang.Class({
|
||||
|
||||
this._updateStatusItem();
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
this.emit('state-changed');
|
||||
},
|
||||
@@ -836,7 +854,6 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
_updateAutoConnectionName: function() {
|
||||
this._autoConnectionName = this._makeConnectionName(this.device);
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
this._updateStatusItem();
|
||||
}
|
||||
@@ -1098,10 +1115,8 @@ const NMDeviceWireless = new Lang.Class({
|
||||
this._networks.splice(res.network, 1);
|
||||
let newPos = Util.insertSorted(this._networks, network, Lang.bind(this, this._networkSortFunction));
|
||||
|
||||
if (newPos != res.network) {
|
||||
this._clearSection();
|
||||
if (newPos != res.network)
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
|
||||
_accessPointAdded: function(device, accessPoint) {
|
||||
@@ -1154,10 +1169,8 @@ const NMDeviceWireless = new Lang.Class({
|
||||
let newPos = Util.insertSorted(this._networks, apObj, this._networkSortFunction);
|
||||
|
||||
// Queue an update of the UI if we changed the order
|
||||
if (newPos != pos) {
|
||||
this._clearSection();
|
||||
if (newPos != pos)
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
|
||||
_accessPointRemoved: function(device, accessPoint) {
|
||||
@@ -1217,12 +1230,10 @@ const NMDeviceWireless = new Lang.Class({
|
||||
if (res.network < this._networks.length-1)
|
||||
okNext = this._networkSortFunction(this._networks[res.network + 1], apObj) <= 0;
|
||||
|
||||
if (!okPrev || !okNext) {
|
||||
this._clearSection();
|
||||
if (!okPrev || !okNext)
|
||||
this._queueCreateSection();
|
||||
} else if (apObj.item) {
|
||||
else if (apObj.item)
|
||||
apObj.item.updateBestAP(apObj.accessPoints[0]);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1298,7 +1309,6 @@ const NMDeviceWireless = new Lang.Class({
|
||||
|
||||
if (forceupdate) {
|
||||
this._networks.sort(this._networkSortFunction);
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
@@ -1331,7 +1341,6 @@ const NMDeviceWireless = new Lang.Class({
|
||||
|
||||
if (forceupdate) {
|
||||
this._networks.sort(this._networkSortFunction);
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
}
|
||||
},
|
||||
@@ -1442,6 +1451,56 @@ const NMDeviceWireless = new Lang.Class({
|
||||
},
|
||||
});
|
||||
|
||||
const NMDeviceVirtual = new Lang.Class({
|
||||
Name: 'NMDeviceVirtual',
|
||||
Extends: NMDeviceSimple,
|
||||
|
||||
_init: function(client, iface, connections) {
|
||||
this.iface = iface;
|
||||
this.parent(client, null, connections);
|
||||
this.category = NMConnectionCategory.VIRTUAL;
|
||||
},
|
||||
|
||||
_shouldShowConnectionList: function() {
|
||||
return this.hasConnections();
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
return connection.get_virtual_iface_name() == this.iface;
|
||||
},
|
||||
|
||||
addConnection: function(connection) {
|
||||
if (!this.device && !this.hasConnections())
|
||||
this.statusItem.label.text = NMGtk.utils_get_connection_device_name(connection);
|
||||
|
||||
this.parent(connection);
|
||||
},
|
||||
|
||||
adoptDevice: function(device) {
|
||||
if (device.get_iface() == this.iface) {
|
||||
this._setDevice(device);
|
||||
if (device._description)
|
||||
this.syncDescription();
|
||||
this._updateStatusItem();
|
||||
this.emit('state-changed');
|
||||
return true;
|
||||
} else
|
||||
return false;
|
||||
},
|
||||
|
||||
removeDevice: function(device) {
|
||||
if (device == this.device) {
|
||||
this._setDevice(null);
|
||||
this._updateStatusItem();
|
||||
this.emit('state-changed');
|
||||
}
|
||||
},
|
||||
|
||||
hasConnections: function() {
|
||||
return this._connections.length != 0;
|
||||
}
|
||||
});
|
||||
|
||||
const NMVPNSection = new Lang.Class({
|
||||
Name: 'NMVPNSection',
|
||||
Extends: NMConnectionBased,
|
||||
@@ -1622,6 +1681,7 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
this._nmDevices = [];
|
||||
this._devices = { };
|
||||
this._virtualDevices = [ ];
|
||||
|
||||
this._devices.wired = {
|
||||
section: new PopupMenu.PopupMenuSection(),
|
||||
@@ -1632,6 +1692,15 @@ const NMApplet = new Lang.Class({
|
||||
this.menu.addMenuItem(this._devices.wired.section);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._devices.virtual = {
|
||||
section: new PopupMenu.PopupMenuSection(),
|
||||
devices: [ ],
|
||||
};
|
||||
|
||||
this._devices.virtual.section.actor.hide();
|
||||
this.menu.addMenuItem(this._devices.virtual.section);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._devices.wireless = {
|
||||
section: new PopupMenu.PopupMenuSection(),
|
||||
devices: [ ],
|
||||
@@ -1665,6 +1734,14 @@ const NMApplet = new Lang.Class({
|
||||
this._dtypes[NetworkManager.DeviceType.INFINIBAND] = NMDeviceSimple;
|
||||
// TODO: WiMax support
|
||||
|
||||
// Virtual device types
|
||||
this._vtypes = { };
|
||||
if (NMGtk) {
|
||||
this._vtypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMDeviceVirtual;
|
||||
this._vtypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMDeviceVirtual;
|
||||
this._vtypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMDeviceVirtual;
|
||||
}
|
||||
|
||||
// Connection types
|
||||
this._ctypes = { };
|
||||
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
|
||||
@@ -1675,6 +1752,11 @@ const NMApplet = new Lang.Class({
|
||||
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
|
||||
this._ctypes[NetworkManager.SETTING_INFINIBAND_SETTING_NAME] = NMConnectionCategory.WIRED;
|
||||
if (NMGtk) {
|
||||
this._ctypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
|
||||
this._ctypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
|
||||
this._ctypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
|
||||
}
|
||||
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
|
||||
|
||||
this._settings = NMClient.RemoteSettings.new(null);
|
||||
@@ -1702,6 +1784,7 @@ const NMApplet = new Lang.Class({
|
||||
if (!this._source) {
|
||||
this._source = new MessageTray.Source(_("Network Manager"),
|
||||
'network-transmit-receive');
|
||||
this._source.policy = new NotificationDaemon.NotificationApplicationPolicy('gnome-network-panel');
|
||||
|
||||
this._source.connect('destroy', Lang.bind(this, function() {
|
||||
this._source = null;
|
||||
@@ -1726,7 +1809,14 @@ const NMApplet = new Lang.Class({
|
||||
let devices = this._devices[category].devices;
|
||||
let item = this._devices[category].item;
|
||||
let section = this._devices[category].section;
|
||||
if (devices.length == 0)
|
||||
|
||||
let visible;
|
||||
if (category == NMConnectionCategory.VIRTUAL)
|
||||
visible = !section.isEmpty();
|
||||
else
|
||||
visible = devices.length > 0;
|
||||
|
||||
if (!visible)
|
||||
section.actor.hide();
|
||||
else {
|
||||
section.actor.show();
|
||||
@@ -1787,30 +1877,14 @@ const NMApplet = new Lang.Class({
|
||||
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, this._onActivationFailed));
|
||||
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
|
||||
this._syncSectionTitle(dev.category);
|
||||
}));
|
||||
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
|
||||
wrapper.disconnect(wrapper._activationFailedId);
|
||||
wrapper.disconnect(wrapper._deviceStateChangedId);
|
||||
wrapper.disconnect(wrapper._destroyId);
|
||||
});
|
||||
|
||||
return wrapper;
|
||||
},
|
||||
|
||||
_syncDeviceNames: function() {
|
||||
if (NMGtk) {
|
||||
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
|
||||
for (let i = 0; i < this._nmDevices.length; i++) {
|
||||
let device = this._nmDevices[i];
|
||||
device._description = names[i];
|
||||
device._delegate.syncDescription();
|
||||
if (device._delegate)
|
||||
device._delegate.syncDescription();
|
||||
}
|
||||
} else {
|
||||
for (let i = 0; i < this._nmDevices.length; i++) {
|
||||
@@ -1825,41 +1899,75 @@ const NMApplet = new Lang.Class({
|
||||
// already seen, not adding again
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < this._virtualDevices.length; i++) {
|
||||
if (this._virtualDevices[i].adoptDevice(device)) {
|
||||
this._nmDevices.push(device);
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let wrapperClass = this._dtypes[device.get_device_type()];
|
||||
if (wrapperClass) {
|
||||
let wrapper = this._makeWrapperDevice(wrapperClass, device);
|
||||
let section = this._devices[wrapper.category].section;
|
||||
let devices = this._devices[wrapper.category].devices;
|
||||
|
||||
section.addMenuItem(wrapper.statusItem);
|
||||
section.addMenuItem(wrapper.section);
|
||||
devices.push(wrapper);
|
||||
let wrapper = new wrapperClass(this._client, device, this._connections);
|
||||
this._addDeviceWrapper(wrapper);
|
||||
|
||||
this._nmDevices.push(device);
|
||||
if (!skipSyncDeviceNames)
|
||||
this._syncDeviceNames();
|
||||
|
||||
this._syncSectionTitle(wrapper.category);
|
||||
}
|
||||
},
|
||||
|
||||
_addDeviceWrapper: function(wrapper) {
|
||||
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);
|
||||
}));
|
||||
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
|
||||
wrapper.disconnect(wrapper._activationFailedId);
|
||||
wrapper.disconnect(wrapper._deviceStateChangedId);
|
||||
wrapper.disconnect(wrapper._destroyId);
|
||||
});
|
||||
|
||||
let section = this._devices[wrapper.category].section;
|
||||
section.addMenuItem(wrapper.statusItem);
|
||||
section.addMenuItem(wrapper.section);
|
||||
|
||||
let devices = this._devices[wrapper.category].devices;
|
||||
devices.push(wrapper);
|
||||
|
||||
this._syncSectionTitle(wrapper.category);
|
||||
},
|
||||
|
||||
_deviceRemoved: function(client, device) {
|
||||
if (!device._delegate) {
|
||||
let pos = this._nmDevices.indexOf(device);
|
||||
if (pos != -1) {
|
||||
this._nmDevices.splice(pos, 1);
|
||||
this._syncDeviceNames();
|
||||
}
|
||||
|
||||
let wrapper = device._delegate;
|
||||
if (!wrapper) {
|
||||
log('Removing a network device that was not added');
|
||||
return;
|
||||
}
|
||||
|
||||
let wrapper = device._delegate;
|
||||
if (wrapper instanceof NMDeviceVirtual)
|
||||
wrapper.removeDevice(device);
|
||||
else
|
||||
this._removeDeviceWrapper(wrapper);
|
||||
},
|
||||
|
||||
_removeDeviceWrapper: function(wrapper) {
|
||||
wrapper.destroy();
|
||||
|
||||
let devices = this._devices[wrapper.category].devices;
|
||||
let pos = devices.indexOf(wrapper);
|
||||
devices.splice(pos, 1);
|
||||
|
||||
pos = this._nmDevices.indexOf(device);
|
||||
this._nmDevices.splice(pos, 1);
|
||||
this._syncDeviceNames();
|
||||
|
||||
this._syncSectionTitle(wrapper.category)
|
||||
},
|
||||
|
||||
@@ -2054,6 +2162,13 @@ const NMApplet = new Lang.Class({
|
||||
devices[i].removeConnection(connection);
|
||||
}
|
||||
|
||||
if (section == NMConnectionCategory.VIRTUAL) {
|
||||
let iface = connection.get_virtual_iface_name();
|
||||
let wrapper = this._findVirtualDevice(iface);
|
||||
if (wrapper && !wrapper.hasConnections())
|
||||
this._removeDeviceWrapper(wrapper);
|
||||
}
|
||||
|
||||
connection.disconnect(connection._removedId);
|
||||
connection.disconnect(connection._updatedId);
|
||||
connection._removedId = connection._updatedId = 0;
|
||||
@@ -2067,6 +2182,27 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
let section = connection._section;
|
||||
|
||||
if (section == NMConnectionCategory.VIRTUAL) {
|
||||
let wrapperClass = this._vtypes[connection._type];
|
||||
if (!wrapperClass)
|
||||
return;
|
||||
|
||||
let iface = connection.get_virtual_iface_name();
|
||||
let wrapper = this._findVirtualDevice(iface);
|
||||
if (!wrapper) {
|
||||
wrapper = new wrapperClass(this._client, iface, this._connections);
|
||||
this._addDeviceWrapper(wrapper);
|
||||
this._virtualDevices.push(wrapper);
|
||||
|
||||
// We might already have a device for this connection
|
||||
for (let i = 0; i < this._nmDevices.length; i++) {
|
||||
let device = this._nmDevices[i];
|
||||
if (wrapper.adoptDevice(device))
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (section == NMConnectionCategory.INVALID)
|
||||
return;
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
@@ -2079,6 +2215,15 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_findVirtualDevice: function(iface) {
|
||||
for (let i = 0; i < this._virtualDevices.length; i++) {
|
||||
if (this._virtualDevices[i].iface == iface)
|
||||
return this._virtualDevices[i];
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
_hideDevices: function() {
|
||||
this._devicesHidden = true;
|
||||
|
||||
@@ -2094,6 +2239,7 @@ const NMApplet = new Lang.Class({
|
||||
this._statusSection.actor.hide();
|
||||
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRED);
|
||||
this._syncSectionTitle(NMConnectionCategory.VIRTUAL);
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRELESS);
|
||||
this._syncSectionTitle(NMConnectionCategory.WWAN);
|
||||
},
|
||||
@@ -2131,6 +2277,7 @@ const NMApplet = new Lang.Class({
|
||||
this.setIcon('network-wireless-acquiring-symbolic');
|
||||
break;
|
||||
case NMConnectionCategory.WIRED:
|
||||
case NMConnectionCategory.VIRTUAL:
|
||||
this.setIcon('network-wired-acquiring-symbolic');
|
||||
break;
|
||||
default:
|
||||
@@ -2170,6 +2317,7 @@ const NMApplet = new Lang.Class({
|
||||
break;
|
||||
}
|
||||
case NMConnectionCategory.WIRED:
|
||||
case NMConnectionCategory.VIRTUAL:
|
||||
this.setIcon('network-wired-symbolic');
|
||||
break;
|
||||
case NMConnectionCategory.WWAN:
|
||||
|
@@ -54,7 +54,16 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent('battery-missing-symbolic', _("Battery"));
|
||||
|
||||
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
|
||||
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
|
||||
Lang.bind(this, function(proxy, error) {
|
||||
if (error) {
|
||||
log(error.message);
|
||||
return;
|
||||
}
|
||||
this._proxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._devicesChanged));
|
||||
this._devicesChanged();
|
||||
}));
|
||||
|
||||
this._deviceItems = [ ];
|
||||
this._hasPrimary = false;
|
||||
@@ -70,10 +79,6 @@ const Indicator = new Lang.Class({
|
||||
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop');
|
||||
|
||||
this._proxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._devicesChanged));
|
||||
this._devicesChanged();
|
||||
},
|
||||
|
||||
_readPrimaryDevice: function() {
|
||||
|
@@ -119,7 +119,10 @@ const StreamSlider = new Lang.Class({
|
||||
|
||||
_notifyVolumeChange: function() {
|
||||
global.cancel_theme_sound(VOLUME_NOTIFY_ID);
|
||||
global.play_theme_sound(VOLUME_NOTIFY_ID, 'audio-volume-change');
|
||||
global.play_theme_sound(VOLUME_NOTIFY_ID,
|
||||
'audio-volume-change',
|
||||
_("Volume changed"),
|
||||
Clutter.get_current_event ());
|
||||
},
|
||||
|
||||
_updateVolume: function() {
|
||||
@@ -166,9 +169,8 @@ const OutputStreamSlider = new Lang.Class({
|
||||
// a bit hackish, but ALSA/PulseAudio have a number
|
||||
// of different identifiers for headphones, and I could
|
||||
// not find the complete list
|
||||
let port = sink.get_port();
|
||||
if (port)
|
||||
return port.port.indexOf('headphone') >= 0;
|
||||
if (sink.get_ports().length > 0)
|
||||
return sink.get_port().port.indexOf('headphone') >= 0;
|
||||
|
||||
return false;
|
||||
},
|
||||
|
@@ -46,7 +46,8 @@ const SwitcherPopup = new Lang.Class({
|
||||
this._selectedIndex = 0;
|
||||
|
||||
this.actor = new Shell.GenericContainer({ style_class: 'switcher-popup',
|
||||
reactive: true });
|
||||
reactive: true,
|
||||
visible: false });
|
||||
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
|
||||
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
|
||||
this.actor.connect('allocate', Lang.bind(this, this._allocate));
|
||||
|
@@ -115,7 +115,7 @@ const UnlockDialog = new Lang.Class({
|
||||
_init: function(parentActor) {
|
||||
this.parent({ shellReactive: true,
|
||||
styleClass: 'login-dialog',
|
||||
keybindingMode: Main.KeybindingMode.UNLOCK_SCREEN,
|
||||
keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN,
|
||||
parentActor: parentActor
|
||||
});
|
||||
|
||||
|
@@ -22,12 +22,13 @@ const Util = imports.misc.util;
|
||||
|
||||
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
|
||||
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
|
||||
const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy'
|
||||
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 SHOW_FULL_NAME_KEY = 'show-full-name';
|
||||
const SHOW_FULL_NAME_IN_TOP_BAR_KEY = 'show-full-name-in-top-bar';
|
||||
|
||||
const DIALOG_ICON_SIZE = 64;
|
||||
|
||||
@@ -477,6 +478,7 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
||||
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
||||
this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA });
|
||||
|
||||
this._userManager = AccountsService.UserManager.get_default();
|
||||
|
||||
@@ -553,10 +555,12 @@ const UserMenuButton = new Lang.Class({
|
||||
Lang.bind(this, this._updateLogout));
|
||||
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
||||
Lang.bind(this, this._updateLockScreen));
|
||||
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_KEY,
|
||||
global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
|
||||
Lang.bind(this, this._updateLogout));
|
||||
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_IN_TOP_BAR_KEY,
|
||||
Lang.bind(this, this._updateUserName));
|
||||
global.settings.connect('changed::' + SHOW_FULL_NAME_KEY,
|
||||
Lang.bind(this, this._updateUserName));
|
||||
this._privacySettings.connect('changed::' + SHOW_FULL_NAME_IN_TOP_BAR_KEY,
|
||||
Lang.bind(this, this._updateUserName));
|
||||
this._updateSwitchUser();
|
||||
this._updateLogout();
|
||||
this._updateLockScreen();
|
||||
@@ -581,6 +585,7 @@ const UserMenuButton = new Lang.Class({
|
||||
Lang.bind(this, this._updateHaveShutdown));
|
||||
|
||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||
Main.screenShield.connect('locked-changed', Lang.bind(this, this._updatePresenceIcon));
|
||||
this._sessionUpdated();
|
||||
},
|
||||
|
||||
@@ -602,10 +607,10 @@ const UserMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateUserName: function() {
|
||||
let settings = global.settings;
|
||||
let settings = this._privacySettings;
|
||||
if (Main.sessionMode.isLocked)
|
||||
settings = this._screenSaverSettings;
|
||||
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_KEY))
|
||||
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_IN_TOP_BAR_KEY))
|
||||
this._name.set_text(this._user.get_real_name());
|
||||
else
|
||||
this._name.set_text("");
|
||||
@@ -700,6 +705,11 @@ const UserMenuButton = new Lang.Class({
|
||||
this._iconBox.child = this._idleIcon;
|
||||
else
|
||||
this._iconBox.child = this._offlineIcon;
|
||||
|
||||
if (Main.sessionMode.isLocked)
|
||||
this._iconBox.visible = Main.screenShield.locked;
|
||||
else
|
||||
this._iconBox.visible = true;
|
||||
},
|
||||
|
||||
_setupAccounts: function() {
|
||||
@@ -820,7 +830,7 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
_onMyAccountActivate: function() {
|
||||
Main.overview.hide();
|
||||
let app = Shell.AppSystem.get_default().lookup_setting('gnome-user-accounts-panel.desktop');
|
||||
let app = Shell.AppSystem.get_default().lookup_app('gnome-user-accounts-panel.desktop');
|
||||
app.activate();
|
||||
},
|
||||
|
||||
|
@@ -12,6 +12,7 @@ const St = imports.gi.St;
|
||||
|
||||
const AppDisplay = imports.ui.appDisplay;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const RemoteSearch = imports.ui.remoteSearch;
|
||||
const Search = imports.ui.search;
|
||||
const SearchDisplay = imports.ui.searchDisplay;
|
||||
@@ -46,8 +47,7 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
this._activePage = null;
|
||||
|
||||
this.active = false;
|
||||
this._searchPending = false;
|
||||
this._searchActive = false;
|
||||
this._searchTimeoutId = 0;
|
||||
|
||||
this._searchSystem = new Search.SearchSystem();
|
||||
@@ -77,16 +77,17 @@ const ViewSelector = new Lang.Class({
|
||||
this._capturedEventId = 0;
|
||||
|
||||
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
|
||||
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null,
|
||||
this._workspacesPage = this._addPage(this._workspacesDisplay.actor,
|
||||
_("Windows"), 'emblem-documents-symbolic');
|
||||
|
||||
this._appDisplay = new AppDisplay.AllAppDisplay();
|
||||
this._appsPage = this._addPage(this._appDisplay.actor, null,
|
||||
this._appsPage = this._addPage(this._appDisplay.actor,
|
||||
_("Applications"), 'view-grid-symbolic');
|
||||
|
||||
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
|
||||
this._searchPage = this._addPage(this._searchResults.actor, this._entry,
|
||||
_("Search"), 'edit-find-symbolic');
|
||||
this._searchPage = this._addPage(this._searchResults.actor,
|
||||
_("Search"), 'edit-find-symbolic',
|
||||
{ a11yFocus: this._entry });
|
||||
|
||||
this._searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
|
||||
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
|
||||
@@ -135,8 +136,8 @@ const ViewSelector = new Lang.Class({
|
||||
Main.wm.addKeybinding('toggle-application-view',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._toggleAppsPage));
|
||||
},
|
||||
|
||||
@@ -169,14 +170,16 @@ const ViewSelector = new Lang.Class({
|
||||
this._workspacesDisplay.hide();
|
||||
},
|
||||
|
||||
_addPage: function(actor, a11yFocus, name, a11yIcon) {
|
||||
_addPage: function(actor, name, a11yIcon, params) {
|
||||
params = Params.parse(params, { a11yFocus: null });
|
||||
|
||||
let page = new St.Bin({ child: actor,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.START,
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
if (a11yFocus)
|
||||
Main.ctrlAltTabManager.addGroup(a11yFocus, name, a11yIcon);
|
||||
if (params.a11yFocus)
|
||||
Main.ctrlAltTabManager.addGroup(params.a11yFocus, name, a11yIcon);
|
||||
else
|
||||
Main.ctrlAltTabManager.addGroup(actor, name, a11yIcon,
|
||||
{ proxy: this.actor,
|
||||
@@ -220,7 +223,7 @@ const ViewSelector = new Lang.Class({
|
||||
},
|
||||
|
||||
_onShowAppsButtonToggled: function() {
|
||||
if (this.active)
|
||||
if (this._searchActive)
|
||||
this.reset();
|
||||
else
|
||||
this._showPage(this._showAppsButton.checked ? this._appsPage
|
||||
@@ -241,7 +244,7 @@ const ViewSelector = new Lang.Class({
|
||||
let symbol = event.get_key_symbol();
|
||||
|
||||
if (symbol == Clutter.Escape) {
|
||||
if (this.active)
|
||||
if (this._searchActive)
|
||||
this.reset();
|
||||
else if (this._showAppsButton.checked)
|
||||
this._resetShowAppsButton();
|
||||
@@ -249,9 +252,9 @@ const ViewSelector = new Lang.Class({
|
||||
Main.overview.hide();
|
||||
return true;
|
||||
} else if (Clutter.keysym_to_unicode(symbol) ||
|
||||
(symbol == Clutter.BackSpace && this.active)) {
|
||||
(symbol == Clutter.BackSpace && this._searchActive)) {
|
||||
this.startSearch(event);
|
||||
} else if (!this.active) {
|
||||
} else if (!this._searchActive) {
|
||||
if (symbol == Clutter.Tab || symbol == Clutter.Down) {
|
||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
return true;
|
||||
@@ -325,39 +328,37 @@ const ViewSelector = new Lang.Class({
|
||||
},
|
||||
|
||||
_onTextChanged: function (se, prop) {
|
||||
let searchPreviouslyActive = this.active;
|
||||
this.active = this._entry.get_text() != '';
|
||||
this._searchPending = this.active && !searchPreviouslyActive;
|
||||
if (this._searchPending) {
|
||||
let searchPreviouslyActive = this._searchActive;
|
||||
this._searchActive = this._entry.get_text() != '';
|
||||
|
||||
let startSearch = this._searchActive && !searchPreviouslyActive;
|
||||
if (startSearch)
|
||||
this._searchResults.startingSearch();
|
||||
}
|
||||
if (this.active) {
|
||||
|
||||
if (this._searchActive) {
|
||||
this._entry.set_secondary_icon(this._activeIcon);
|
||||
|
||||
if (this._iconClickedId == 0) {
|
||||
if (this._iconClickedId == 0)
|
||||
this._iconClickedId = this._entry.connect('secondary-icon-clicked',
|
||||
Lang.bind(this, function() {
|
||||
this.reset();
|
||||
}));
|
||||
}
|
||||
} else {
|
||||
if (this._iconClickedId > 0)
|
||||
this._entry.disconnect(this._iconClickedId);
|
||||
this._iconClickedId = 0;
|
||||
Lang.bind(this, this.reset));
|
||||
|
||||
if (this._searchTimeoutId == 0)
|
||||
this._searchTimeoutId = Mainloop.timeout_add(150,
|
||||
Lang.bind(this, this._doSearch));
|
||||
} else {
|
||||
if (this._iconClickedId > 0) {
|
||||
this._entry.disconnect(this._iconClickedId);
|
||||
this._iconClickedId = 0;
|
||||
}
|
||||
|
||||
this._entry.set_secondary_icon(this._inactiveIcon);
|
||||
this._searchCancelled();
|
||||
}
|
||||
if (!this.active) {
|
||||
if (this._searchTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._searchTimeoutId);
|
||||
this._searchTimeoutId = 0;
|
||||
}
|
||||
return;
|
||||
|
||||
this._entry.set_secondary_icon(this._inactiveIcon);
|
||||
this._searchCancelled();
|
||||
}
|
||||
if (this._searchTimeoutId > 0)
|
||||
return;
|
||||
this._searchTimeoutId = Mainloop.timeout_add(150, Lang.bind(this, this._doSearch));
|
||||
},
|
||||
|
||||
_onKeyPress: function(entry, event) {
|
||||
@@ -367,16 +368,7 @@ const ViewSelector = new Lang.Class({
|
||||
this.reset();
|
||||
return true;
|
||||
}
|
||||
} else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
||||
// We can't connect to 'activate' here because search providers
|
||||
// might want to do something with the modifiers in activateDefault.
|
||||
if (this._searchTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._searchTimeoutId);
|
||||
this._doSearch();
|
||||
}
|
||||
this._searchResults.activateDefault();
|
||||
return true;
|
||||
} else if (this.active) {
|
||||
} else if (this._searchActive) {
|
||||
let arrowNext, nextDirection;
|
||||
if (entry.get_text_direction() == Clutter.TextDirection.RTL) {
|
||||
arrowNext = Clutter.Left;
|
||||
@@ -400,6 +392,15 @@ const ViewSelector = new Lang.Class({
|
||||
} else if (symbol == arrowNext && this._text.position == -1) {
|
||||
this._searchResults.navigateFocus(nextDirection);
|
||||
return true;
|
||||
} else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
|
||||
// We can't connect to 'activate' here because search providers
|
||||
// might want to do something with the modifiers in activateDefault.
|
||||
if (this._searchTimeoutId > 0) {
|
||||
Mainloop.source_remove(this._searchTimeoutId);
|
||||
this._doSearch();
|
||||
}
|
||||
this._searchResults.activateDefault();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@@ -105,74 +105,74 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
this._workspaceSwitcherPopup = null;
|
||||
this.setCustomKeybindingHandler('switch-to-workspace-left',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-to-workspace-right',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-to-workspace-up',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-to-workspace-down',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('move-to-workspace-left',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('move-to-workspace-right',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('move-to-workspace-up',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('move-to-workspace-down',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-applications',
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-group',
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-applications-backward',
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-group-backward',
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-windows',
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._startWindowSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-windows-backward',
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._startWindowSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-panels',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW |
|
||||
Main.KeybindingMode.LOCK_SCREEN |
|
||||
Main.KeybindingMode.UNLOCK_SCREEN |
|
||||
Main.KeybindingMode.LOGIN_SCREEN,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW |
|
||||
Shell.KeyBindingMode.LOCK_SCREEN |
|
||||
Shell.KeyBindingMode.UNLOCK_SCREEN |
|
||||
Shell.KeyBindingMode.LOGIN_SCREEN,
|
||||
Lang.bind(this, this._startA11ySwitcher));
|
||||
this.setCustomKeybindingHandler('switch-panels-backward',
|
||||
Main.KeybindingMode.NORMAL |
|
||||
Main.KeybindingMode.OVERVIEW |
|
||||
Main.KeybindingMode.LOCK_SCREEN |
|
||||
Main.KeybindingMode.UNLOCK_SCREEN |
|
||||
Main.KeybindingMode.LOGIN_SCREEN,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW |
|
||||
Shell.KeyBindingMode.LOCK_SCREEN |
|
||||
Shell.KeyBindingMode.UNLOCK_SCREEN |
|
||||
Shell.KeyBindingMode.LOGIN_SCREEN,
|
||||
Lang.bind(this, this._startA11ySwitcher));
|
||||
|
||||
this.addKeybinding('open-application-menu',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Main.KeybindingMode.NORMAL,
|
||||
Shell.KeyBindingMode.NORMAL,
|
||||
Lang.bind(this, this._openAppMenu));
|
||||
|
||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||
@@ -199,7 +199,7 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
removeKeybinding: function(name) {
|
||||
if (global.display.remove_keybinding(name))
|
||||
this.allowKeybinding(name, Main.KeybindingMode.NONE);
|
||||
this.allowKeybinding(name, Shell.KeyBindingMode.NONE);
|
||||
},
|
||||
|
||||
allowKeybinding: function(name, modes) {
|
||||
@@ -242,22 +242,30 @@ const WindowManager = new Lang.Class({
|
||||
}
|
||||
|
||||
actor.set_scale(1.0, 1.0);
|
||||
actor.move_anchor_point_from_gravity(Clutter.Gravity.CENTER);
|
||||
|
||||
/* scale window down to 0x0.
|
||||
* maybe TODO: get icon geometry passed through and move the window towards it?
|
||||
*/
|
||||
this._minimizing.push(actor);
|
||||
|
||||
let monitor = Main.layoutManager.findMonitorForWindow(actor.meta_window);
|
||||
let xDest = monitor.x;
|
||||
let yDest = monitor.y;
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
xDest += monitor.width;
|
||||
let xDest, yDest, xScale, yScale;
|
||||
let [success, geom] = actor.meta_window.get_icon_geometry();
|
||||
if (success) {
|
||||
xDest = geom.x;
|
||||
yDest = geom.y;
|
||||
xScale = geom.width / actor.width;
|
||||
yScale = geom.height / actor.height;
|
||||
} else {
|
||||
/* scale window down to 0x0. */
|
||||
let monitor = Main.layoutManager.findMonitorForWindow(actor.meta_window);
|
||||
xDest = monitor.x;
|
||||
yDest = monitor.y;
|
||||
xScale = 0.0;
|
||||
yScale = 0.0;
|
||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
|
||||
xDest += monitor.width;
|
||||
}
|
||||
|
||||
Tweener.addTween(actor,
|
||||
{ scale_x: 0.0,
|
||||
scale_y: 0.0,
|
||||
{ scale_x: xScale,
|
||||
scale_y: yScale,
|
||||
x: xDest,
|
||||
y: yDest,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
@@ -494,14 +502,14 @@ const WindowManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_filterKeybinding: function(shellwm, binding) {
|
||||
if (Main.keybindingMode == Main.KeybindingMode.NONE)
|
||||
if (Main.keybindingMode == Shell.KeyBindingMode.NONE)
|
||||
return true;
|
||||
|
||||
// There's little sense in implementing a keybinding in mutter and
|
||||
// not having it work in NORMAL mode; handle this case generically
|
||||
// so we don't have to explicitly allow all builtin keybindings in
|
||||
// NORMAL mode.
|
||||
if (Main.keybindingMode == Main.KeybindingMode.NORMAL &&
|
||||
if (Main.keybindingMode == Shell.KeyBindingMode.NORMAL &&
|
||||
binding.is_builtin())
|
||||
return false;
|
||||
|
||||
|
@@ -746,11 +746,10 @@ const LayoutStrategy = new Lang.Class({
|
||||
Name: 'LayoutStrategy',
|
||||
Abstract: true,
|
||||
|
||||
_init: function(monitor, rowSpacing, columnSpacing, bottomPadding) {
|
||||
_init: function(monitor, rowSpacing, columnSpacing) {
|
||||
this._monitor = monitor;
|
||||
this._rowSpacing = rowSpacing;
|
||||
this._columnSpacing = columnSpacing;
|
||||
this._bottomPadding = bottomPadding;
|
||||
},
|
||||
|
||||
_newRow: function() {
|
||||
@@ -775,24 +774,23 @@ const LayoutStrategy = new Lang.Class({
|
||||
windows: [] };
|
||||
},
|
||||
|
||||
// Compute the size and fancy scale for @window using the
|
||||
// Computes and returns a fancy scale for @window using the
|
||||
// base scale, @scale.
|
||||
//
|
||||
// Returns a list structure: [ scaledWidth, scaledHeight, fancyScale ]
|
||||
// where scaledWidth and scaledHeight are the window's
|
||||
// width and height, scaled by fancyScale for convenience.
|
||||
_computeWindowSizeAndScale: function(window, scale) {
|
||||
let width = window.actor.width;
|
||||
let height = window.actor.height;
|
||||
let ratio;
|
||||
_computeWindowScale: function(window, scale) {
|
||||
// Since we align windows next to each other, the height of the
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
// them, so two windows with equal height, but maybe differering
|
||||
// widths line up.
|
||||
let ratio = window.actor.height / this._monitor.height;
|
||||
|
||||
if (width > height)
|
||||
ratio = width / this._monitor.width;
|
||||
else
|
||||
ratio = height / this._monitor.height;
|
||||
// The purpose of this manipulation here is to prevent windows
|
||||
// from getting too small. For something like a calculator window,
|
||||
// we need to bump up the size just a bit to make sure it looks
|
||||
// good. We'll use a multiplier of 1.5 for this.
|
||||
|
||||
let fancyScale = (2 / (1 + ratio)) * scale;
|
||||
return [width * fancyScale, height * fancyScale, fancyScale];
|
||||
// Map from [0, 1] to [1.5, 1]
|
||||
let fancyScale = _interpolate(1.5, 1, ratio) * scale;
|
||||
return fancyScale;
|
||||
},
|
||||
|
||||
// Compute the size of each row, by assigning to the properties
|
||||
@@ -830,7 +828,7 @@ const LayoutStrategy = new Lang.Class({
|
||||
let area = layout.area;
|
||||
|
||||
let hspacing = (layout.maxColumns - 1) * this._columnSpacing;
|
||||
let vspacing = (layout.numRows - 1) * this._rowSpacing + this._bottomPadding;
|
||||
let vspacing = (layout.numRows - 1) * this._rowSpacing;
|
||||
|
||||
let spacedWidth = area.width - hspacing;
|
||||
let spacedHeight = area.height - vspacing;
|
||||
@@ -864,7 +862,7 @@ const LayoutStrategy = new Lang.Class({
|
||||
y += row.height + this._rowSpacing;
|
||||
}
|
||||
|
||||
let height = y - this._rowSpacing + this._bottomPadding;
|
||||
let height = y - this._rowSpacing;
|
||||
let baseY = (area.height - height) / 2;
|
||||
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
@@ -874,7 +872,10 @@ const LayoutStrategy = new Lang.Class({
|
||||
for (let j = 0; j < row.windows.length; j++) {
|
||||
let window = row.windows[j];
|
||||
|
||||
let [width, height, s] = this._computeWindowSizeAndScale(window, scale);
|
||||
let s = this._computeWindowScale(window, scale);
|
||||
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
|
||||
let width = window.actor.width * s;
|
||||
let height = window.actor.height * s;
|
||||
let y = row.y + row.height - height;
|
||||
|
||||
let x = baseX;
|
||||
@@ -935,7 +936,9 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
|
||||
for (; windowIdx < windows.length; windowIdx++) {
|
||||
let window = windows[windowIdx];
|
||||
let [width, height] = this._computeWindowSizeAndScale(window, 1);
|
||||
let s = this._computeWindowScale(window, 1);
|
||||
let width = window.actor.width * s;
|
||||
let height = window.actor.height * s;
|
||||
row.fullHeight = Math.max(row.fullHeight, height);
|
||||
|
||||
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
|
||||
@@ -1001,9 +1004,9 @@ const GridLayoutStrategy = new Lang.Class({
|
||||
let window = windows[windowIdx];
|
||||
row.windows.push(window);
|
||||
|
||||
let [width, height] = this._computeWindowSizeAndScale(window, 1);
|
||||
maxWindowWidth = Math.max(maxWindowWidth, width);
|
||||
maxWindowHeight = Math.max(maxWindowHeight, height);
|
||||
let s = this._computeWindowScale(window, 1);
|
||||
maxWindowWidth = Math.max(maxWindowWidth, window.actor.width * s);
|
||||
maxWindowHeight = Math.max(maxWindowHeight, window.actor.height * s);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1038,6 +1041,8 @@ const Workspace = new Lang.Class({
|
||||
this._windowOverlaysGroup.set_size(0, 0);
|
||||
|
||||
this.actor = new St.Widget({ style_class: 'window-picker' });
|
||||
if (monitorIndex != Main.layoutManager.primaryIndex)
|
||||
this.actor.add_style_class_name('external-monitor');
|
||||
this.actor.set_size(0, 0);
|
||||
|
||||
this._dropRect = new Clutter.Rectangle({ opacity: 0 });
|
||||
@@ -1202,7 +1207,7 @@ const Workspace = new Lang.Class({
|
||||
|
||||
// Make the window slightly transparent to indicate it's hidden
|
||||
Tweener.addTween(clone.actor,
|
||||
{ opacity: 255,
|
||||
{ opacity: 128,
|
||||
time: Overview.ANIMATION_TIME,
|
||||
transition: 'easeInQuad'
|
||||
});
|
||||
@@ -1624,7 +1629,7 @@ const Workspace = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_computeLayout: function(windows, area, rowSpacing, columnSpacing, bottomPadding) {
|
||||
_computeLayout: function(windows, area, rowSpacing, columnSpacing) {
|
||||
// We look for the largest scale that allows us to fit the
|
||||
// largest row/tallest column on the workspace.
|
||||
|
||||
@@ -1640,7 +1645,7 @@ const Workspace = new Lang.Class({
|
||||
break;
|
||||
|
||||
let strategyClass = numRows > 2 ? GridLayoutStrategy : UnalignedLayoutStrategy;
|
||||
let strategy = new strategyClass(this._monitor, rowSpacing, columnSpacing, bottomPadding);
|
||||
let strategy = new strategyClass(this._monitor, rowSpacing, columnSpacing);
|
||||
|
||||
let layout = { area: area, strategy: strategy, numRows: numRows, numColumns: numColumns };
|
||||
strategy.computeLayout(windows, layout);
|
||||
@@ -1672,6 +1677,12 @@ const Workspace = new Lang.Class({
|
||||
// Window grid spacing
|
||||
let columnSpacing = node.get_length('-horizontal-spacing');
|
||||
let rowSpacing = node.get_length('-vertical-spacing');
|
||||
let padding = {
|
||||
left: node.get_padding(St.Side.LEFT),
|
||||
top: node.get_padding(St.Side.TOP),
|
||||
bottom: node.get_padding(St.Side.BOTTOM),
|
||||
right: node.get_padding(St.Side.RIGHT),
|
||||
};
|
||||
|
||||
if (!totalWindows)
|
||||
return [];
|
||||
@@ -1686,19 +1697,25 @@ const Workspace = new Lang.Class({
|
||||
[leftBorder, rightBorder] = overlay.chromeWidths();
|
||||
} else {
|
||||
[closeButtonHeight, captionHeight] = [0, 0];
|
||||
[leftBorder, rightBorder] = [0, 0];
|
||||
}
|
||||
|
||||
rowSpacing += captionHeight;
|
||||
columnSpacing += rightBorder;
|
||||
columnSpacing += (rightBorder + leftBorder) / 2;
|
||||
padding.top += closeButtonHeight;
|
||||
padding.bottom += captionHeight;
|
||||
padding.left += leftBorder;
|
||||
padding.right += rightBorder;
|
||||
|
||||
let area = { x: this._x, y: this._y, width: this._width, height: this._height };
|
||||
area.y += closeButtonHeight;
|
||||
area.height -= closeButtonHeight;
|
||||
area.x += leftBorder;
|
||||
area.width -= leftBorder;
|
||||
let area = {
|
||||
x: this._x + padding.left,
|
||||
y: this._y + padding.top,
|
||||
width: this._width - padding.left - padding.right,
|
||||
height: this._height - padding.top - padding.bottom,
|
||||
};
|
||||
|
||||
if (!this._currentLayout)
|
||||
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight);
|
||||
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing);
|
||||
|
||||
let layout = this._currentLayout;
|
||||
let strategy = layout.strategy;
|
||||
|
@@ -170,7 +170,8 @@ const WorkspaceThumbnail = new Lang.Class({
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
this._background = Meta.BackgroundActor.new_for_screen(global.screen);
|
||||
this._background = new Meta.BackgroundActor({ screen: global.screen,
|
||||
settings: Main.background });
|
||||
this._contents.add_actor(this._background);
|
||||
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
|
@@ -21,6 +21,7 @@ eu
|
||||
fa
|
||||
fi
|
||||
fr
|
||||
fur
|
||||
ga
|
||||
gl
|
||||
gu
|
||||
|
@@ -11,6 +11,7 @@ js/misc/util.js
|
||||
js/ui/appDisplay.js
|
||||
js/ui/appFavorites.js
|
||||
js/ui/calendar.js
|
||||
js/ui/components/automountManager.js
|
||||
js/ui/components/autorunManager.js
|
||||
js/ui/components/keyring.js
|
||||
js/ui/components/networkAgent.js
|
||||
|
378
po/de.po
378
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-12-21 18:33+0000\n"
|
||||
"PO-Revision-Date: 2013-01-01 22:44+0100\n"
|
||||
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
|
||||
"POT-Creation-Date: 2013-01-24 17:07+0000\n"
|
||||
"PO-Revision-Date: 2013-01-19 21:35+0100\n"
|
||||
"Last-Translator: Tobias111 <tobiasendrigkeit@googlemail.com>\n"
|
||||
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
|
||||
"Language: de_DE\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -170,21 +170,13 @@ msgstr ""
|
||||
"»Abmelden« in Einzelbenutzer, Einzelsitzungssituationen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show full name in the user menu"
|
||||
msgstr "Den vollen Namen im Benutzermenü anzeigen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "Whether the users full name is shown in the user menu or not."
|
||||
msgstr "Legt fest, ob der vollständige Name im Benutzermenü angezeigt wird."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Legt fest, ob Passwörter für eingehängte, verschlüsselte oder ferne "
|
||||
"Dateisysteme gespeichert werden"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@@ -197,76 +189,76 @@ msgstr ""
|
||||
"angeboten. Dieser Schlüssel stellt den Standardstatus für dieses Ankreuzfeld "
|
||||
"ein."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Wochentag im Kalender anzeigen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
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:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Tastenkombination zum Öffnen der »Zeige Anwendungen«-Ansicht"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Tastenkombination zum Öffnen der »Zeige Anwendungen«-Ansicht der "
|
||||
"Aktivitätenübersicht."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
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:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
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:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Tastenkombination zum Umschalten des Bildschirmaufzeichners"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
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:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Zu verwendende Tastatur"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Der Typ der zu verwendenden Tastatur"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@@ -275,11 +267,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:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
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:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@@ -307,11 +299,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:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Die Dateiendung zum Speichern des Screencast"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
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 "
|
||||
@@ -322,11 +314,11 @@ msgstr ""
|
||||
"Dateiname sollte geändert werden, wenn Sie in einem anderen Containerformat "
|
||||
"aufnehmen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "The application icon mode."
|
||||
msgstr "Der Modus der Anwendungssymbole."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@@ -336,22 +328,22 @@ msgstr ""
|
||||
"»thumbnail-only« (Vorschaubilder der Fenster werden angezeigt), »app-icon-"
|
||||
"only« (Nur das Anwendungssymbol wird angezeigt) oder »both« (beides)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Modalen Dialog an übergeordnetes Fenster binden"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Dieser Schlüssel überschreibt den Schlüssel in org.gnome.mutter, wenn die "
|
||||
"GNOME-Shell läuft."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Anordnung der Knöpfe auf der Titelleiste"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
@@ -359,15 +351,17 @@ msgstr ""
|
||||
"Dieser Schlüssel überschreibt den Schlüssel in org.gnome.desktop.wm."
|
||||
"preferences, wenn die GNOME-Shell läuft."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#, fuzzy
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Größenanpassung aktivieren, wenn Fenster in die Ecken verschoben werden"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbeitsflächen dynamisch verwalten"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Arbeitsflächen nur auf dem primären Bildschirm."
|
||||
|
||||
@@ -384,11 +378,11 @@ msgstr "Erweiterung"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:565
|
||||
#: ../js/gdm/loginDialog.js:569
|
||||
msgid "Session..."
|
||||
msgstr "Sitzung …"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:722
|
||||
#: ../js/gdm/loginDialog.js:726
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Anmelden"
|
||||
@@ -396,35 +390,35 @@ msgstr "Anmelden"
|
||||
#. 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:786
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
msgid "Not listed?"
|
||||
msgstr "Nicht aufgeführt?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:962 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:967 ../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:399
|
||||
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:978
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Anmelden"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:978
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
msgid "Next"
|
||||
msgstr "Nächstes"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:1086 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Benutzername:"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1382
|
||||
#: ../js/gdm/loginDialog.js:1387
|
||||
msgid "Login Window"
|
||||
msgstr "Anmeldefenster"
|
||||
|
||||
@@ -433,8 +427,8 @@ msgstr "Anmeldefenster"
|
||||
msgid "Power"
|
||||
msgstr "Ausschalten"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:790
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
|
||||
#: ../js/ui/userMenu.js:792
|
||||
msgid "Suspend"
|
||||
msgstr "Bereitschaft"
|
||||
|
||||
@@ -442,8 +436,8 @@ msgstr "Bereitschaft"
|
||||
msgid "Restart"
|
||||
msgstr "Neu starten"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
|
||||
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
|
||||
msgid "Power Off"
|
||||
msgstr "Ausschalten"
|
||||
|
||||
@@ -654,6 +648,14 @@ msgstr "Diese Woche"
|
||||
msgid "Next week"
|
||||
msgstr "Nächste Woche"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:92
|
||||
msgid "External drive connected"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/components/automountManager.js:103
|
||||
msgid "External drive disconnected"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:295
|
||||
msgid "Removable Devices"
|
||||
msgstr "Wechseldatenträger"
|
||||
@@ -667,11 +669,11 @@ msgstr "Öffnen mit %s"
|
||||
msgid "Eject"
|
||||
msgstr "Auswerfen"
|
||||
|
||||
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260
|
||||
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
|
||||
msgid "Password:"
|
||||
msgstr "Passwort:"
|
||||
|
||||
#: ../js/ui/components/keyring.js:105
|
||||
#: ../js/ui/components/keyring.js:101
|
||||
msgid "Type again:"
|
||||
msgstr "Erneut eingeben:"
|
||||
|
||||
@@ -759,7 +761,7 @@ msgstr "Legitimierung erforderlich"
|
||||
msgid "Administrator"
|
||||
msgstr "Systemverwalter"
|
||||
|
||||
#: ../js/ui/components/polkitAgent.js:166
|
||||
#: ../js/ui/components/polkitAgent.js:165
|
||||
msgid "Authenticate"
|
||||
msgstr "Legitimieren"
|
||||
|
||||
@@ -767,7 +769,7 @@ msgstr "Legitimieren"
|
||||
#. * requested authentication was not gained; this can happen
|
||||
#. * because of an authentication error (like invalid password),
|
||||
#. * for instance.
|
||||
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:383
|
||||
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
|
||||
msgid "Sorry, that didn't work. Please try again."
|
||||
msgstr "Entschuldigung, das hat nicht geklappt. Bitte versuchen Sie es erneut."
|
||||
|
||||
@@ -1016,7 +1018,7 @@ msgstr "Verbindung zu %s fehlgeschlagen"
|
||||
msgid "View account"
|
||||
msgstr "Konto anzeigen"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
msgid "Unknown reason"
|
||||
msgstr "Unbekannter Grund"
|
||||
|
||||
@@ -1028,18 +1030,22 @@ msgstr "Fenster"
|
||||
msgid "Show Applications"
|
||||
msgstr "Anwendungen anzeigen"
|
||||
|
||||
#: ../js/ui/dateMenu.js:86
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Einstellungen für Datum und Uhrzeit"
|
||||
|
||||
#: ../js/ui/dateMenu.js:111
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
msgid "Open Calendar"
|
||||
msgstr "Kalender öffnen"
|
||||
|
||||
#: ../js/ui/dateMenu.js:96
|
||||
msgid "Open Clocks"
|
||||
msgstr "Uhren öffnen"
|
||||
|
||||
#: ../js/ui/dateMenu.js:105
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Einstellungen für Datum und Uhrzeit"
|
||||
|
||||
#. 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:201
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e. %B %Y"
|
||||
|
||||
@@ -1146,78 +1152,80 @@ msgstr "Installieren"
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
|
||||
|
||||
#: ../js/ui/keyboard.js:308
|
||||
#: ../js/ui/keyboard.js:291
|
||||
msgid "tray"
|
||||
msgstr "Benachrichtigungsfeld"
|
||||
|
||||
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309
|
||||
#: ../js/ui/status/power.js:205
|
||||
#: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
|
||||
#: ../js/ui/status/power.js:206
|
||||
msgid "Keyboard"
|
||||
msgstr "Tastatur"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:691
|
||||
#: ../js/ui/lookingGlass.js:692
|
||||
msgid "No extensions installed"
|
||||
msgstr "Keine Erweiterungen installiert"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: ../js/ui/lookingGlass.js:745
|
||||
#: ../js/ui/lookingGlass.js:746
|
||||
#, c-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s hat keine Fehler ausgegeben."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:751
|
||||
#: ../js/ui/lookingGlass.js:752
|
||||
msgid "Hide Errors"
|
||||
msgstr "Fehler verbergen"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815
|
||||
#: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
|
||||
msgid "Show Errors"
|
||||
msgstr "Fehler anzeigen"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:764
|
||||
#: ../js/ui/lookingGlass.js:765
|
||||
msgid "Enabled"
|
||||
msgstr "Aktiviert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:767
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Deaktiviert"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:769
|
||||
#: ../js/ui/lookingGlass.js:770
|
||||
msgid "Error"
|
||||
msgstr "Fehler"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:771
|
||||
#: ../js/ui/lookingGlass.js:772
|
||||
msgid "Out of date"
|
||||
msgstr "Veraltet"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:773
|
||||
#: ../js/ui/lookingGlass.js:774
|
||||
msgid "Downloading"
|
||||
msgstr "Herunterladen"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:797
|
||||
#: ../js/ui/lookingGlass.js:798
|
||||
msgid "View Source"
|
||||
msgstr "Quelle zeigen"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:806
|
||||
#: ../js/ui/lookingGlass.js:807
|
||||
msgid "Web Page"
|
||||
msgstr "Webseite"
|
||||
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
#: ../js/ui/messageTray.js:1118
|
||||
msgid "Open"
|
||||
msgstr "Öffnen"
|
||||
|
||||
#: ../js/ui/messageTray.js:1095
|
||||
#: ../js/ui/messageTray.js:1125
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: ../js/ui/messageTray.js:1552
|
||||
#: ../js/ui/messageTray.js:1581
|
||||
msgid "No Messages"
|
||||
msgstr "Keine Nachrichten"
|
||||
|
||||
#: ../js/ui/messageTray.js:1570
|
||||
#: ../js/ui/messageTray.js:1599
|
||||
msgid "Message Tray"
|
||||
msgstr "Benachrichtigungsfeld"
|
||||
|
||||
#: ../js/ui/messageTray.js:2639
|
||||
#: ../js/ui/messageTray.js:2672
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformationen"
|
||||
|
||||
@@ -1249,17 +1257,17 @@ msgstr "Suchbegriff eingeben …"
|
||||
msgid "Dash"
|
||||
msgstr "Dash"
|
||||
|
||||
#: ../js/ui/panel.js:608
|
||||
#: ../js/ui/panel.js:613
|
||||
msgid "Quit"
|
||||
msgstr "Beenden"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:637
|
||||
#: ../js/ui/panel.js:642
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitäten"
|
||||
|
||||
#: ../js/ui/panel.js:980
|
||||
#: ../js/ui/panel.js:976
|
||||
msgid "Top Bar"
|
||||
msgstr "Obere Leiste"
|
||||
|
||||
@@ -1268,7 +1276,7 @@ msgstr "Obere Leiste"
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: ../js/ui/popupMenu.js:725
|
||||
#: ../js/ui/popupMenu.js:727
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
@@ -1285,33 +1293,33 @@ msgstr "Schließen"
|
||||
# %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:112
|
||||
#: ../js/ui/screenShield.js:113
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d. %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:176
|
||||
#: ../js/ui/screenShield.js:177
|
||||
#, 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:178
|
||||
#: ../js/ui/screenShield.js:179
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d neue Benachrichtigung"
|
||||
msgstr[1] "%d neue Benachrichtigungen"
|
||||
|
||||
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
|
||||
msgid "Lock"
|
||||
msgstr "Sperren"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:403
|
||||
#: ../js/ui/searchDisplay.js:430
|
||||
msgid "Searching..."
|
||||
msgstr "Suche läuft …"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:451
|
||||
#: ../js/ui/searchDisplay.js:478
|
||||
msgid "No results."
|
||||
msgstr "Keine Ergebnisse."
|
||||
|
||||
@@ -1394,6 +1402,7 @@ msgstr "Große Schrift"
|
||||
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
|
||||
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
|
||||
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
|
||||
#: ../js/ui/status/network.js:813
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@@ -1414,7 +1423,7 @@ msgid "Bluetooth Settings"
|
||||
msgstr "Bluetooth-Einstellungen"
|
||||
|
||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
|
||||
msgid "hardware disabled"
|
||||
msgstr "Hardware deaktiviert"
|
||||
|
||||
@@ -1422,12 +1431,12 @@ msgstr "Hardware deaktiviert"
|
||||
msgid "Connection"
|
||||
msgstr "Verbindung"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
|
||||
msgid "disconnecting..."
|
||||
msgstr "Verbindungsabbau …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
|
||||
#: ../js/ui/status/network.js:1464
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
|
||||
#: ../js/ui/status/network.js:1533
|
||||
msgid "connecting..."
|
||||
msgstr "Verbindungsaufbau …"
|
||||
|
||||
@@ -1443,7 +1452,7 @@ msgstr "Tastatureinstellungen"
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Maus-Einstellungen"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
|
||||
msgid "Sound Settings"
|
||||
msgstr "Klangeinstellungen"
|
||||
|
||||
@@ -1520,109 +1529,117 @@ msgstr "Einstellungen für Region und Sprache"
|
||||
msgid "Volume, network, battery"
|
||||
msgstr "Lautstärke, Netzwerk, Batterie"
|
||||
|
||||
#: ../js/ui/status/network.js:95
|
||||
#: ../js/ui/status/network.js:103
|
||||
msgid "<unknown>"
|
||||
msgstr "<Unbekannt>"
|
||||
|
||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||
#: ../js/ui/status/network.js:191
|
||||
#: ../js/ui/status/network.js:199
|
||||
msgid "disabled"
|
||||
msgstr "Deaktiviert"
|
||||
|
||||
#. 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:434
|
||||
#: ../js/ui/status/network.js:457
|
||||
msgid "unmanaged"
|
||||
msgstr "nicht verwaltet"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
|
||||
#: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
|
||||
msgid "authentication required"
|
||||
msgstr "Legitimierung erforderlich"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing
|
||||
#: ../js/ui/status/network.js:455
|
||||
#: ../js/ui/status/network.js:478
|
||||
msgid "firmware missing"
|
||||
msgstr "Firmware fehlt"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:462
|
||||
#: ../js/ui/status/network.js:485
|
||||
msgid "cable unplugged"
|
||||
msgstr "Kabel nicht angeschlossen"
|
||||
|
||||
#. 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:467
|
||||
#: ../js/ui/status/network.js:490
|
||||
msgid "unavailable"
|
||||
msgstr "nicht verfügbar"
|
||||
|
||||
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
|
||||
#: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
|
||||
msgid "connection failed"
|
||||
msgstr "Verbindung gescheitert"
|
||||
|
||||
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
|
||||
#: ../js/ui/status/network.js:1545
|
||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
|
||||
#: ../js/ui/status/network.js:1614
|
||||
msgid "More..."
|
||||
msgstr "Mehr …"
|
||||
|
||||
#. 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:561 ../js/ui/status/network.js:1333
|
||||
#: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
|
||||
msgid "Connected (private)"
|
||||
msgstr "Verbunden (privat)"
|
||||
|
||||
#: ../js/ui/status/network.js:641
|
||||
#: ../js/ui/status/network.js:666
|
||||
msgid "Wired"
|
||||
msgstr "Kabelgebunden"
|
||||
|
||||
#: ../js/ui/status/network.js:667
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Ethernet (automatisch)"
|
||||
|
||||
#: ../js/ui/status/network.js:688
|
||||
#: ../js/ui/status/network.js:694
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Mobiles Breitband"
|
||||
|
||||
#: ../js/ui/status/network.js:715
|
||||
msgid "Auto broadband"
|
||||
msgstr "Mobiles Breitband (automatisch)"
|
||||
|
||||
#: ../js/ui/status/network.js:691
|
||||
#: ../js/ui/status/network.js:718
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Einwählverbindung (automatisch)"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
|
||||
#: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "%s (automatisch)"
|
||||
|
||||
#: ../js/ui/status/network.js:822
|
||||
#: ../js/ui/status/network.js:850
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Bluetooth (automatisch)"
|
||||
|
||||
#: ../js/ui/status/network.js:1352
|
||||
#: ../js/ui/status/network.js:1371
|
||||
msgid "Auto wireless"
|
||||
msgstr "Drahtlos (automatisch)"
|
||||
|
||||
#: ../js/ui/status/network.js:1595
|
||||
#: ../js/ui/status/network.js:1664
|
||||
msgid "Enable networking"
|
||||
msgstr "Netzwerk aktivieren"
|
||||
|
||||
#: ../js/ui/status/network.js:1627
|
||||
#: ../js/ui/status/network.js:1706
|
||||
msgid "Wi-Fi"
|
||||
msgstr "WLAN"
|
||||
|
||||
#: ../js/ui/status/network.js:1646
|
||||
#: ../js/ui/status/network.js:1725
|
||||
msgid "Network Settings"
|
||||
msgstr "Netzwerkeinstellungen"
|
||||
|
||||
#: ../js/ui/status/network.js:1692
|
||||
#: ../js/ui/status/network.js:1784
|
||||
msgid "Network Manager"
|
||||
msgstr "Netzwerk-Verwaltung"
|
||||
|
||||
#: ../js/ui/status/network.js:1774
|
||||
#: ../js/ui/status/network.js:1873
|
||||
msgid "Connection failed"
|
||||
msgstr "Verbindung gescheitert"
|
||||
|
||||
#: ../js/ui/status/network.js:1775
|
||||
#: ../js/ui/status/network.js:1874
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
|
||||
|
||||
#: ../js/ui/status/network.js:2092
|
||||
#: ../js/ui/status/network.js:2252
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Netzwerk ist deaktiviert"
|
||||
|
||||
@@ -1678,117 +1695,123 @@ msgctxt "percent of battery remaining"
|
||||
msgid "%d%%"
|
||||
msgstr "%d%%"
|
||||
|
||||
#: ../js/ui/status/power.js:195
|
||||
#: ../js/ui/status/power.js:196
|
||||
msgid "AC adapter"
|
||||
msgstr "Netzteil"
|
||||
|
||||
#: ../js/ui/status/power.js:197
|
||||
#: ../js/ui/status/power.js:198
|
||||
msgid "Laptop battery"
|
||||
msgstr "Laptop-Akku"
|
||||
|
||||
#: ../js/ui/status/power.js:199
|
||||
#: ../js/ui/status/power.js:200
|
||||
msgid "UPS"
|
||||
msgstr "Notstromversorgung"
|
||||
|
||||
#: ../js/ui/status/power.js:201
|
||||
#: ../js/ui/status/power.js:202
|
||||
msgid "Monitor"
|
||||
msgstr "Bildschirm"
|
||||
|
||||
#: ../js/ui/status/power.js:203
|
||||
#: ../js/ui/status/power.js:204
|
||||
msgid "Mouse"
|
||||
msgstr "Maus"
|
||||
|
||||
#: ../js/ui/status/power.js:207
|
||||
#: ../js/ui/status/power.js:208
|
||||
msgid "PDA"
|
||||
msgstr "PDA"
|
||||
|
||||
#: ../js/ui/status/power.js:209
|
||||
#: ../js/ui/status/power.js:210
|
||||
msgid "Cell phone"
|
||||
msgstr "Mobiltelefon"
|
||||
|
||||
#: ../js/ui/status/power.js:211
|
||||
#: ../js/ui/status/power.js:212
|
||||
msgid "Media player"
|
||||
msgstr "Medienwiedergabegerät"
|
||||
|
||||
#: ../js/ui/status/power.js:213
|
||||
#: ../js/ui/status/power.js:214
|
||||
msgid "Tablet"
|
||||
msgstr "Tablet"
|
||||
|
||||
#: ../js/ui/status/power.js:215
|
||||
#: ../js/ui/status/power.js:216
|
||||
msgid "Computer"
|
||||
msgstr "Rechner"
|
||||
|
||||
#: ../js/ui/status/power.js:217
|
||||
#: ../js/ui/status/power.js:218
|
||||
msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "Unbekannt"
|
||||
|
||||
#: ../js/ui/status/volume.js:124
|
||||
#, fuzzy
|
||||
#| msgid "Volume"
|
||||
msgid "Volume changed"
|
||||
msgstr "Lautstärke"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
|
||||
#: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
|
||||
msgid "Volume"
|
||||
msgstr "Lautstärke"
|
||||
|
||||
#: ../js/ui/status/volume.js:256
|
||||
#: ../js/ui/status/volume.js:259
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:201
|
||||
#: ../js/ui/unlockDialog.js:203
|
||||
msgid "Log in as another user"
|
||||
msgstr "Als anderer Benutzer anmelden"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:224
|
||||
#: ../js/ui/unlockDialog.js:229
|
||||
msgid "Unlock Window"
|
||||
msgstr "Fenster entsperren"
|
||||
|
||||
#: ../js/ui/userMenu.js:177
|
||||
#: ../js/ui/userMenu.js:178
|
||||
msgid "Available"
|
||||
msgstr "Verfügbar"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Busy"
|
||||
msgstr "Beschäftigt"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Invisible"
|
||||
msgstr "Unsichtbar"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Away"
|
||||
msgstr "Abwesend"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Idle"
|
||||
msgstr "Untätig"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Offline"
|
||||
msgstr "Abgemeldet"
|
||||
|
||||
#: ../js/ui/userMenu.js:755
|
||||
#: ../js/ui/userMenu.js:757
|
||||
msgid "Notifications"
|
||||
msgstr "Benachrichtigungen"
|
||||
|
||||
#: ../js/ui/userMenu.js:763
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
#: ../js/ui/userMenu.js:771
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Switch User"
|
||||
msgstr "Benutzer wechseln"
|
||||
|
||||
#: ../js/ui/userMenu.js:776
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Log Out"
|
||||
msgstr "Abmelden"
|
||||
|
||||
#: ../js/ui/userMenu.js:796
|
||||
#: ../js/ui/userMenu.js:798
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Aktualisierungen installieren und neustarten"
|
||||
|
||||
#: ../js/ui/userMenu.js:814
|
||||
#: ../js/ui/userMenu.js:816
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Ihr Anwesenheitsstatus wird auf »Beschäftigt« gesetzt"
|
||||
|
||||
#: ../js/ui/userMenu.js:815
|
||||
#: ../js/ui/userMenu.js:817
|
||||
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."
|
||||
@@ -1828,20 +1851,42 @@ msgstr "»%s« ist bereit"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Evolution-Kalender"
|
||||
|
||||
#: ../src/main.c:332
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
msgstr[0] "%u Ausgang"
|
||||
msgstr[1] "%u Ausgänge"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u Eingang"
|
||||
msgstr[1] "%u Eingänge"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
msgid "System Sounds"
|
||||
msgstr "Systemklänge"
|
||||
|
||||
#: ../src/main.c:347
|
||||
msgid "Print version"
|
||||
msgstr "Version ausgeben"
|
||||
|
||||
#: ../src/main.c:338
|
||||
#: ../src/main.c:353
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Der durch GDM im Anmeldefenster verwendete Modus"
|
||||
|
||||
#: ../src/main.c:344
|
||||
#: ../src/main.c:359
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr ""
|
||||
"Einen spezifischen Modus nutzen, wie z.B. »gdm» für den Anmeldebildschirm"
|
||||
|
||||
#: ../src/main.c:350
|
||||
#: ../src/main.c:365
|
||||
msgid "List possible modes"
|
||||
msgstr "Die möglichen Modi auflisten"
|
||||
|
||||
@@ -1870,6 +1915,12 @@ msgstr "Vorgabe"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
|
||||
|
||||
#~ msgid "Show full name in the user menu"
|
||||
#~ msgstr "Den vollen Namen im Benutzermenü anzeigen"
|
||||
|
||||
#~ msgid "Whether the users full name is shown in the user menu or not."
|
||||
#~ msgstr "Legt fest, ob der vollständige Name im Benutzermenü angezeigt wird."
|
||||
|
||||
#~ msgid "APPLICATIONS"
|
||||
#~ msgstr "ANWENDUNGEN"
|
||||
|
||||
@@ -1905,15 +1956,9 @@ msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
|
||||
#~ "Das angesprochene Gerät kann nicht durchsucht werden. Der Fehler lautet "
|
||||
#~ "»%s«"
|
||||
|
||||
#~ msgid "Wired"
|
||||
#~ msgstr "Kabelgebunden"
|
||||
|
||||
#~ msgid "Wireless"
|
||||
#~ msgstr "Drahtlos"
|
||||
|
||||
#~ msgid "Mobile broadband"
|
||||
#~ msgstr "Mobiles Breitband"
|
||||
|
||||
#~ msgid "VPN Connections"
|
||||
#~ msgstr "VPN-Verbindungen"
|
||||
|
||||
@@ -1926,19 +1971,6 @@ msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
|
||||
#~ msgid "Your favorite Easter Egg"
|
||||
#~ msgstr "Ihr Lieblings-Osterei"
|
||||
|
||||
#~ msgid "%u Output"
|
||||
#~ msgid_plural "%u Outputs"
|
||||
#~ msgstr[0] "%u Ausgang"
|
||||
#~ msgstr[1] "%u Ausgänge"
|
||||
|
||||
#~ msgid "%u Input"
|
||||
#~ msgid_plural "%u Inputs"
|
||||
#~ msgstr[0] "%u Eingang"
|
||||
#~ msgstr[1] "%u Eingänge"
|
||||
|
||||
#~ msgid "System Sounds"
|
||||
#~ msgstr "Systemklänge"
|
||||
|
||||
#~ msgid "Switch Session"
|
||||
#~ msgstr "Sitzung wechseln"
|
||||
|
||||
|
383
po/es.po
383
po/es.po
@@ -3,15 +3,15 @@
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
|
||||
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
|
||||
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011, 2012.
|
||||
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011, 2012, 2013.
|
||||
#
|
||||
msgid ""
|
||||
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-12-19 14:51+0000\n"
|
||||
"PO-Revision-Date: 2012-12-26 11:38+0100\n"
|
||||
"POT-Creation-Date: 2013-01-22 15:41+0000\n"
|
||||
"PO-Revision-Date: 2013-01-24 16:32+0100\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: Español <gnome-es-list@gnome.org>\n"
|
||||
"Language: \n"
|
||||
@@ -164,22 +164,13 @@ msgstr ""
|
||||
"sesión» en situaciones de un único usuario o de una única sesión."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show full name in the user menu"
|
||||
msgstr "Mostrar el nombre completo en el menú del usuario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "Whether the users full name is shown in the user menu or not."
|
||||
msgstr ""
|
||||
"Indica si se muestra el nombre del usuario en el menú del usuario o no."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Indica si se debe recordar la contraseña para montar sistemas de archivos "
|
||||
"remotos o cifrados"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@@ -191,72 +182,70 @@ msgstr ""
|
||||
"en un futuro, se mostrará la casilla «Recordar contraseña». Esta clave "
|
||||
"establece el valor predeterminado de la casilla."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Mostrar la fecha de la semana en el calendario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Si es cierta, muestra la fecha de semana ISO en el calendario."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Asociación de teclas para abrir el menú de la aplicación"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Asociación de teclas para abrir el menú de la aplicación."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista "
|
||||
"de actividades."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#| msgid "Keybinding to open the application menu"
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Asociación de teclas para dar el foco a la notificación activa"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#| msgid "Keybinding to open the application menu."
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Asociación de teclas para dar el foco a la notificación activa."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Asociación de teclas cambiar el grabador de pantalla"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Qué teclado usar"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "El tipo de teclado que usar."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Tasa de fotogramas usada para grabar «screencast»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@@ -264,11 +253,11 @@ msgstr ""
|
||||
"La tasa de fotogramas de la grabación resultante grabada por el grabador de "
|
||||
"«screencast» de GNOME Shell, en fotogramas por segundo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "La tubería de gstreamer usada para codificar el «screencast»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@@ -294,11 +283,11 @@ msgstr ""
|
||||
"threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T "
|
||||
"como marcador de posición para el número de hilos óptimos en el sistema."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Extensión de archivo que usar para almacenar los «screencast»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
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 "
|
||||
@@ -308,11 +297,11 @@ msgstr ""
|
||||
"basado en la fecha actual y usará esta extensión. Se debería cambiar al "
|
||||
"grabar en otro formato contenedor diferente."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "The application icon mode."
|
||||
msgstr "El modo de icono de la aplicación."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@@ -322,21 +311,21 @@ msgstr ""
|
||||
"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-"
|
||||
"only» (sólo muestra el icono de la aplicación) «both»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Acoplar un diálogo modal a la ventana padre"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Esta clave sobreescribe la clave en org.gnome.mutter al ejecutar GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Orden de los botones en la barra de título"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
@@ -344,17 +333,17 @@ msgstr ""
|
||||
"Esta clave sobreescribe la clave en org.gnome.desktop.wm.preferences al "
|
||||
"ejecutar GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la "
|
||||
"ventana"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Las áreas de trabajo se gestionan dinámicamente"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Áreas de trabajo solo en la pantalla principal"
|
||||
|
||||
@@ -372,11 +361,11 @@ msgid "Select an extension to configure using the combobox above."
|
||||
msgstr ""
|
||||
"Seleccione una extensión que configurar usando la caja combinada de arriba."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:565
|
||||
#: ../js/gdm/loginDialog.js:566
|
||||
msgid "Session..."
|
||||
msgstr "Sesión…"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:722
|
||||
#: ../js/gdm/loginDialog.js:723
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Iniciar sesión"
|
||||
@@ -384,35 +373,35 @@ msgstr "Iniciar sesión"
|
||||
#. 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:786
|
||||
#: ../js/gdm/loginDialog.js:787
|
||||
msgid "Not listed?"
|
||||
msgstr "¿No está en la lista?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:962 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:963 ../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:399
|
||||
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:978
|
||||
#: ../js/gdm/loginDialog.js:979
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Iniciar sesión"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:978
|
||||
#: ../js/gdm/loginDialog.js:979
|
||||
msgid "Next"
|
||||
msgstr "Siguiente"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:1086 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Nombre de usuario:"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1382
|
||||
#: ../js/gdm/loginDialog.js:1383
|
||||
msgid "Login Window"
|
||||
msgstr "Ventana de inicio de sesión"
|
||||
|
||||
@@ -421,8 +410,8 @@ msgstr "Ventana de inicio de sesión"
|
||||
msgid "Power"
|
||||
msgstr "Energía"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:790
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
|
||||
#: ../js/ui/userMenu.js:792
|
||||
msgid "Suspend"
|
||||
msgstr "Suspender"
|
||||
|
||||
@@ -430,8 +419,8 @@ msgstr "Suspender"
|
||||
msgid "Restart"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
|
||||
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
|
||||
msgid "Power Off"
|
||||
msgstr "Apagar"
|
||||
|
||||
@@ -638,6 +627,14 @@ msgstr "Esta semana"
|
||||
msgid "Next week"
|
||||
msgstr "La semana que viene"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:92
|
||||
msgid "External drive connected"
|
||||
msgstr "Dispositivo externo conectado"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:103
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Dispositivo externo desconectado"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:295
|
||||
msgid "Removable Devices"
|
||||
msgstr "Dispositivos extraíbles"
|
||||
@@ -651,11 +648,11 @@ msgstr "Abrir con %s"
|
||||
msgid "Eject"
|
||||
msgstr "Expulsar"
|
||||
|
||||
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260
|
||||
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
|
||||
msgid "Password:"
|
||||
msgstr "Contraseña:"
|
||||
|
||||
#: ../js/ui/components/keyring.js:105
|
||||
#: ../js/ui/components/keyring.js:101
|
||||
msgid "Type again:"
|
||||
msgstr "Escriba de nuevo:"
|
||||
|
||||
@@ -743,7 +740,7 @@ msgstr "Se necesita autenticación"
|
||||
msgid "Administrator"
|
||||
msgstr "Administrador"
|
||||
|
||||
#: ../js/ui/components/polkitAgent.js:166
|
||||
#: ../js/ui/components/polkitAgent.js:165
|
||||
msgid "Authenticate"
|
||||
msgstr "Autenticar"
|
||||
|
||||
@@ -751,7 +748,7 @@ msgstr "Autenticar"
|
||||
#. * requested authentication was not gained; this can happen
|
||||
#. * because of an authentication error (like invalid password),
|
||||
#. * for instance.
|
||||
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:383
|
||||
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
|
||||
msgid "Sorry, that didn't work. Please try again."
|
||||
msgstr "Inténtelo de nuevo,"
|
||||
|
||||
@@ -999,11 +996,11 @@ msgstr "No se pudo conectar a %s"
|
||||
msgid "View account"
|
||||
msgstr "Ver cuenta"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
msgid "Unknown reason"
|
||||
msgstr "Razón desconocida"
|
||||
|
||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
|
||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:82
|
||||
msgid "Windows"
|
||||
msgstr "Ventanas"
|
||||
|
||||
@@ -1011,18 +1008,22 @@ msgstr "Ventanas"
|
||||
msgid "Show Applications"
|
||||
msgstr "Mostrar aplicaciones"
|
||||
|
||||
#: ../js/ui/dateMenu.js:86
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Ajustes de hora y fecha"
|
||||
|
||||
#: ../js/ui/dateMenu.js:111
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
msgid "Open Calendar"
|
||||
msgstr "Abrir calendario"
|
||||
|
||||
#: ../js/ui/dateMenu.js:96
|
||||
msgid "Open Clocks"
|
||||
msgstr "Abrir Relojes"
|
||||
|
||||
#: ../js/ui/dateMenu.js:105
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Ajustes de hora y fecha"
|
||||
|
||||
#. 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:201
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e de %B de %Y"
|
||||
|
||||
@@ -1126,78 +1127,80 @@ msgstr "Instalar"
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:308
|
||||
#: ../js/ui/keyboard.js:291
|
||||
msgid "tray"
|
||||
msgstr "bandeja"
|
||||
|
||||
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309
|
||||
#: ../js/ui/status/power.js:205
|
||||
#: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
|
||||
#: ../js/ui/status/power.js:206
|
||||
msgid "Keyboard"
|
||||
msgstr "Teclado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:691
|
||||
#: ../js/ui/lookingGlass.js:692
|
||||
msgid "No extensions installed"
|
||||
msgstr "No hay extensiones instaladas"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: ../js/ui/lookingGlass.js:745
|
||||
#: ../js/ui/lookingGlass.js:746
|
||||
#, c-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s no ha generado ningún error."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:751
|
||||
#: ../js/ui/lookingGlass.js:752
|
||||
msgid "Hide Errors"
|
||||
msgstr "Ocultar errores"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815
|
||||
#: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
|
||||
msgid "Show Errors"
|
||||
msgstr "Mostrar errores"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:764
|
||||
#: ../js/ui/lookingGlass.js:765
|
||||
msgid "Enabled"
|
||||
msgstr "Activado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:767
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Desactivado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:769
|
||||
#: ../js/ui/lookingGlass.js:770
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:771
|
||||
#: ../js/ui/lookingGlass.js:772
|
||||
msgid "Out of date"
|
||||
msgstr "Caducado"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:773
|
||||
#: ../js/ui/lookingGlass.js:774
|
||||
msgid "Downloading"
|
||||
msgstr "Descargando"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:797
|
||||
#: ../js/ui/lookingGlass.js:798
|
||||
msgid "View Source"
|
||||
msgstr "Ver fuente"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:806
|
||||
#: ../js/ui/lookingGlass.js:807
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: ../js/ui/messageTray.js:1088
|
||||
#: ../js/ui/messageTray.js:1118
|
||||
msgid "Open"
|
||||
msgstr "Abrir"
|
||||
|
||||
#: ../js/ui/messageTray.js:1095
|
||||
#: ../js/ui/messageTray.js:1125
|
||||
msgid "Remove"
|
||||
msgstr "Quitar"
|
||||
|
||||
#: ../js/ui/messageTray.js:1552
|
||||
#: ../js/ui/messageTray.js:1581
|
||||
msgid "No Messages"
|
||||
msgstr "No hay mensajes"
|
||||
|
||||
#: ../js/ui/messageTray.js:1570
|
||||
#: ../js/ui/messageTray.js:1599
|
||||
msgid "Message Tray"
|
||||
msgstr "Bandeja de mensajes"
|
||||
|
||||
#: ../js/ui/messageTray.js:2639
|
||||
#: ../js/ui/messageTray.js:2672
|
||||
msgid "System Information"
|
||||
msgstr "Información del sistema"
|
||||
|
||||
@@ -1228,17 +1231,17 @@ msgstr "Teclear para buscar…"
|
||||
msgid "Dash"
|
||||
msgstr "Tablero"
|
||||
|
||||
#: ../js/ui/panel.js:608
|
||||
#: ../js/ui/panel.js:613
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:637
|
||||
#: ../js/ui/panel.js:642
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#: ../js/ui/panel.js:980
|
||||
#: ../js/ui/panel.js:976
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
@@ -1247,7 +1250,7 @@ msgstr "Barra superior"
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: ../js/ui/popupMenu.js:711
|
||||
#: ../js/ui/popupMenu.js:727
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
@@ -1261,25 +1264,25 @@ msgstr "Cerrar"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format
|
||||
#: ../js/ui/screenShield.js:112
|
||||
#: ../js/ui/screenShield.js:113
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d de %B"
|
||||
|
||||
#: ../js/ui/screenShield.js:176
|
||||
#: ../js/ui/screenShield.js:177
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
msgstr[0] "%d mensaje nuevo"
|
||||
msgstr[1] "%d mensajes nuevos"
|
||||
|
||||
#: ../js/ui/screenShield.js:178
|
||||
#: ../js/ui/screenShield.js:179
|
||||
#, c-format
|
||||
msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d notificación nueva"
|
||||
msgstr[1] "%d notificaciones nuevas"
|
||||
|
||||
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
|
||||
msgid "Lock"
|
||||
msgstr "Bloquear"
|
||||
|
||||
@@ -1370,6 +1373,7 @@ msgstr "Texto grande"
|
||||
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
|
||||
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
|
||||
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
|
||||
#: ../js/ui/status/network.js:813
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@@ -1390,7 +1394,7 @@ msgid "Bluetooth Settings"
|
||||
msgstr "Configuración de Bluetooth"
|
||||
|
||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
|
||||
msgid "hardware disabled"
|
||||
msgstr "hardware desactivado"
|
||||
|
||||
@@ -1398,12 +1402,12 @@ msgstr "hardware desactivado"
|
||||
msgid "Connection"
|
||||
msgstr "Conexión"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
|
||||
msgid "disconnecting..."
|
||||
msgstr "deconectando…"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
|
||||
#: ../js/ui/status/network.js:1464
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
|
||||
#: ../js/ui/status/network.js:1533
|
||||
msgid "connecting..."
|
||||
msgstr "conectando…"
|
||||
|
||||
@@ -1419,7 +1423,7 @@ msgstr "Configuración del teclado"
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Ajustes del ratón…"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
|
||||
msgid "Sound Settings"
|
||||
msgstr "Configuración del sonido"
|
||||
|
||||
@@ -1491,113 +1495,121 @@ msgstr "Mostrar la distribución del teclado"
|
||||
msgid "Region and Language Settings"
|
||||
msgstr "Configuración de región e idioma"
|
||||
|
||||
#: ../js/ui/status/lockScreenMenu.js:18
|
||||
#: ../js/ui/status/lockScreenMenu.js:43
|
||||
msgid "Volume, network, battery"
|
||||
msgstr "Volumen, red, batería"
|
||||
|
||||
#: ../js/ui/status/network.js:95
|
||||
#: ../js/ui/status/network.js:103
|
||||
msgid "<unknown>"
|
||||
msgstr "<desconocido>"
|
||||
|
||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||
#: ../js/ui/status/network.js:191
|
||||
#: ../js/ui/status/network.js:199
|
||||
msgid "disabled"
|
||||
msgstr "desactivada"
|
||||
|
||||
#. 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:434
|
||||
#: ../js/ui/status/network.js:457
|
||||
msgid "unmanaged"
|
||||
msgstr "no gestionada"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
|
||||
#: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
|
||||
msgid "authentication required"
|
||||
msgstr "se necesita autenticación"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing
|
||||
#: ../js/ui/status/network.js:455
|
||||
#: ../js/ui/status/network.js:478
|
||||
msgid "firmware missing"
|
||||
msgstr "falta el «firmware»"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:462
|
||||
#: ../js/ui/status/network.js:485
|
||||
msgid "cable unplugged"
|
||||
msgstr "cable desconectado"
|
||||
|
||||
#. 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:467
|
||||
#: ../js/ui/status/network.js:490
|
||||
msgid "unavailable"
|
||||
msgstr "no disponible"
|
||||
|
||||
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
|
||||
#: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
|
||||
msgid "connection failed"
|
||||
msgstr "falló la conexión"
|
||||
|
||||
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
|
||||
#: ../js/ui/status/network.js:1545
|
||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
|
||||
#: ../js/ui/status/network.js:1614
|
||||
msgid "More..."
|
||||
msgstr "Más…"
|
||||
|
||||
#. 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:561 ../js/ui/status/network.js:1333
|
||||
#: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
|
||||
msgid "Connected (private)"
|
||||
msgstr "Conectada (privada)"
|
||||
|
||||
#: ../js/ui/status/network.js:641
|
||||
#: ../js/ui/status/network.js:666
|
||||
msgid "Wired"
|
||||
msgstr "Cableada"
|
||||
|
||||
#: ../js/ui/status/network.js:667
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Ethernet automática"
|
||||
|
||||
#: ../js/ui/status/network.js:688
|
||||
#: ../js/ui/status/network.js:694
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Banda ancha móvil"
|
||||
|
||||
#: ../js/ui/status/network.js:715
|
||||
msgid "Auto broadband"
|
||||
msgstr "Banda ancha automática"
|
||||
|
||||
#: ../js/ui/status/network.js:691
|
||||
#: ../js/ui/status/network.js:718
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Marcado automático"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
|
||||
#: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "%s automática"
|
||||
|
||||
#: ../js/ui/status/network.js:822
|
||||
#: ../js/ui/status/network.js:850
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Bluetooth automático"
|
||||
|
||||
#: ../js/ui/status/network.js:1352
|
||||
#: ../js/ui/status/network.js:1371
|
||||
msgid "Auto wireless"
|
||||
msgstr "Inalámbrica automática"
|
||||
|
||||
#: ../js/ui/status/network.js:1595
|
||||
#: ../js/ui/status/network.js:1664
|
||||
msgid "Enable networking"
|
||||
msgstr "Activar red"
|
||||
|
||||
#: ../js/ui/status/network.js:1627
|
||||
#: ../js/ui/status/network.js:1706
|
||||
msgid "Wi-Fi"
|
||||
msgstr "Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1646
|
||||
#: ../js/ui/status/network.js:1725
|
||||
msgid "Network Settings"
|
||||
msgstr "Configuración de la red"
|
||||
|
||||
#: ../js/ui/status/network.js:1692
|
||||
#: ../js/ui/status/network.js:1784
|
||||
msgid "Network Manager"
|
||||
msgstr "Gestor de la red"
|
||||
|
||||
#: ../js/ui/status/network.js:1774
|
||||
#: ../js/ui/status/network.js:1873
|
||||
msgid "Connection failed"
|
||||
msgstr "Falló la conexión"
|
||||
|
||||
#: ../js/ui/status/network.js:1775
|
||||
#: ../js/ui/status/network.js:1874
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Falló la activación de la conexión de red"
|
||||
|
||||
#: ../js/ui/status/network.js:2092
|
||||
#: ../js/ui/status/network.js:2252
|
||||
msgid "Networking is disabled"
|
||||
msgstr "La red está desactivada"
|
||||
|
||||
@@ -1653,117 +1665,122 @@ msgctxt "percent of battery remaining"
|
||||
msgid "%d%%"
|
||||
msgstr "%d%%"
|
||||
|
||||
#: ../js/ui/status/power.js:195
|
||||
#: ../js/ui/status/power.js:196
|
||||
msgid "AC adapter"
|
||||
msgstr "Adaptador de corriente"
|
||||
|
||||
#: ../js/ui/status/power.js:197
|
||||
#: ../js/ui/status/power.js:198
|
||||
msgid "Laptop battery"
|
||||
msgstr "Batería del portátil"
|
||||
|
||||
#: ../js/ui/status/power.js:199
|
||||
#: ../js/ui/status/power.js:200
|
||||
msgid "UPS"
|
||||
msgstr "SAI"
|
||||
|
||||
#: ../js/ui/status/power.js:201
|
||||
#: ../js/ui/status/power.js:202
|
||||
msgid "Monitor"
|
||||
msgstr "Monitor"
|
||||
|
||||
#: ../js/ui/status/power.js:203
|
||||
#: ../js/ui/status/power.js:204
|
||||
msgid "Mouse"
|
||||
msgstr "Ratón"
|
||||
|
||||
#: ../js/ui/status/power.js:207
|
||||
#: ../js/ui/status/power.js:208
|
||||
msgid "PDA"
|
||||
msgstr "PDA"
|
||||
|
||||
#: ../js/ui/status/power.js:209
|
||||
#: ../js/ui/status/power.js:210
|
||||
msgid "Cell phone"
|
||||
msgstr "Teléfono móvil"
|
||||
|
||||
#: ../js/ui/status/power.js:211
|
||||
#: ../js/ui/status/power.js:212
|
||||
msgid "Media player"
|
||||
msgstr "Reproductor multimedia"
|
||||
|
||||
#: ../js/ui/status/power.js:213
|
||||
#: ../js/ui/status/power.js:214
|
||||
msgid "Tablet"
|
||||
msgstr "Tableta"
|
||||
|
||||
#: ../js/ui/status/power.js:215
|
||||
#: ../js/ui/status/power.js:216
|
||||
msgid "Computer"
|
||||
msgstr "Equipo"
|
||||
|
||||
#: ../js/ui/status/power.js:217
|
||||
#: ../js/ui/status/power.js:218
|
||||
msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocido"
|
||||
|
||||
#: ../js/ui/status/volume.js:124
|
||||
#| msgid "Volume"
|
||||
msgid "Volume changed"
|
||||
msgstr "Volumen modificado"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:50 ../js/ui/status/volume.js:251
|
||||
#: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
|
||||
msgid "Volume"
|
||||
msgstr "Volumen"
|
||||
|
||||
#: ../js/ui/status/volume.js:62
|
||||
#: ../js/ui/status/volume.js:259
|
||||
msgid "Microphone"
|
||||
msgstr "Micrófono"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:201
|
||||
#: ../js/ui/unlockDialog.js:203
|
||||
msgid "Log in as another user"
|
||||
msgstr "Iniciar sesión como otro usuario"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:224
|
||||
#: ../js/ui/unlockDialog.js:229
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloquear ventana"
|
||||
|
||||
#: ../js/ui/userMenu.js:177
|
||||
#: ../js/ui/userMenu.js:178
|
||||
msgid "Available"
|
||||
msgstr "Disponible"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Busy"
|
||||
msgstr "Ocupado"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Invisible"
|
||||
msgstr "Invisible"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Away"
|
||||
msgstr "Ausente"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Idle"
|
||||
msgstr "Inactivo"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Offline"
|
||||
msgstr "Desconectado"
|
||||
|
||||
#: ../js/ui/userMenu.js:755
|
||||
#: ../js/ui/userMenu.js:757
|
||||
msgid "Notifications"
|
||||
msgstr "Notificaciones"
|
||||
|
||||
#: ../js/ui/userMenu.js:763
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Settings"
|
||||
msgstr "Configuración"
|
||||
|
||||
#: ../js/ui/userMenu.js:771
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Switch User"
|
||||
msgstr "Cambiar de usuario"
|
||||
|
||||
#: ../js/ui/userMenu.js:776
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Log Out"
|
||||
msgstr "Cerrar la sesión"
|
||||
|
||||
#: ../js/ui/userMenu.js:796
|
||||
#: ../js/ui/userMenu.js:798
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Instalar actualizaciones y reiniciar"
|
||||
|
||||
#: ../js/ui/userMenu.js:814
|
||||
#: ../js/ui/userMenu.js:816
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Su estado del chat se establecerá a «ocupado»"
|
||||
|
||||
#: ../js/ui/userMenu.js:815
|
||||
#: ../js/ui/userMenu.js:817
|
||||
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."
|
||||
@@ -1772,11 +1789,11 @@ msgstr ""
|
||||
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
|
||||
"leer sus mensajes."
|
||||
|
||||
#: ../js/ui/viewSelector.js:85
|
||||
#: ../js/ui/viewSelector.js:86
|
||||
msgid "Applications"
|
||||
msgstr "Aplicaciones"
|
||||
|
||||
#: ../js/ui/viewSelector.js:89
|
||||
#: ../js/ui/viewSelector.js:90
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
@@ -1803,21 +1820,43 @@ msgstr "«%s» está preparado"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Calendario de Evolution"
|
||||
|
||||
#: ../src/main.c:332
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
msgstr[0] "%u salida"
|
||||
msgstr[1] "%u salidas"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u entrada"
|
||||
msgstr[1] "%u entradas"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
msgid "System Sounds"
|
||||
msgstr "Sonidos del sistema"
|
||||
|
||||
#: ../src/main.c:347
|
||||
msgid "Print version"
|
||||
msgstr "Imprimir versión"
|
||||
|
||||
#: ../src/main.c:338
|
||||
#: ../src/main.c:353
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Modo usado por GDM para la pantalla de inicio"
|
||||
|
||||
#: ../src/main.c:344
|
||||
#: ../src/main.c:359
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr ""
|
||||
"Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de "
|
||||
"sesión"
|
||||
|
||||
#: ../src/main.c:350
|
||||
#: ../src/main.c:365
|
||||
msgid "List possible modes"
|
||||
msgstr "Listar los modos posibles"
|
||||
|
||||
@@ -1846,6 +1885,13 @@ msgstr "Predeterminada"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "El usuario rechazó el diálogo de autenticación"
|
||||
|
||||
#~ msgid "Show full name in the user menu"
|
||||
#~ msgstr "Mostrar el nombre completo en el menú del usuario"
|
||||
|
||||
#~ msgid "Whether the users full name is shown in the user menu or not."
|
||||
#~ msgstr ""
|
||||
#~ "Indica si se muestra el nombre del usuario en el menú del usuario o no."
|
||||
|
||||
#~ msgid "APPLICATIONS"
|
||||
#~ msgstr "APLICACIONES"
|
||||
|
||||
@@ -1882,15 +1928,9 @@ msgstr "El usuario rechazó el diálogo de autenticación"
|
||||
#~ msgid "The requested device cannot be browsed, error is '%s'"
|
||||
#~ msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»"
|
||||
|
||||
#~ msgid "Wired"
|
||||
#~ msgstr "Cableada"
|
||||
|
||||
#~ msgid "Wireless"
|
||||
#~ msgstr "Inalámbrica"
|
||||
|
||||
#~ msgid "Mobile broadband"
|
||||
#~ msgstr "Banda ancha móvil"
|
||||
|
||||
#~ msgid "VPN Connections"
|
||||
#~ msgstr "Conexiones VPN"
|
||||
|
||||
@@ -1900,19 +1940,6 @@ msgstr "El usuario rechazó el diálogo de autenticación"
|
||||
#~ msgid "System Settings"
|
||||
#~ msgstr "Configuración del sistema"
|
||||
|
||||
#~ msgid "%u Output"
|
||||
#~ msgid_plural "%u Outputs"
|
||||
#~ msgstr[0] "%u salida"
|
||||
#~ msgstr[1] "%u salidas"
|
||||
|
||||
#~ msgid "%u Input"
|
||||
#~ msgid_plural "%u Inputs"
|
||||
#~ msgstr[0] "%u entrada"
|
||||
#~ msgstr[1] "%u entradas"
|
||||
|
||||
#~ msgid "System Sounds"
|
||||
#~ msgstr "Sonidos del sistema"
|
||||
|
||||
#~ msgid "Switch Session"
|
||||
#~ msgstr "Cambiar de sesión"
|
||||
|
||||
|
309
po/nb.po
309
po/nb.po
@@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 3.7.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-01-14 11:20+0100\n"
|
||||
"PO-Revision-Date: 2013-01-14 11:21+0100\n"
|
||||
"POT-Creation-Date: 2013-01-29 18:29+0100\n"
|
||||
"PO-Revision-Date: 2013-01-29 18:29+0100\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||
"Language: \n"
|
||||
@@ -150,19 +150,11 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show full name in the user menu"
|
||||
msgstr "Vis fullt navn i brukermenyen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "Whether the users full name is shown in the user menu or not."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@@ -170,69 +162,69 @@ msgid ""
|
||||
"state of the checkbox."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Vis dato for uken i kalender"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
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:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Tastaturbinding som åpner programmenyen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Tastaturbinding som åpner programmenyen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Tastaturbinding som åpner visningen «Vis programmer»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Tastaturbinding som åpner visningen «Vis programmer» i aktivitetsoversikten."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
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:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
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:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Tastaturbinding som fokuserer aktiv varsling"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Tastaturbinding som fokuserer aktiv varsling."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Tastaturbinding som slår av/på skjermopptak"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
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:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Tastatur som skal brukes"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Type tastatur som skal brukes."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Bildefrekvens i bruk ved lagring av skjermvideoer."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@@ -240,11 +232,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:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
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:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#, fuzzy, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@@ -261,11 +253,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:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
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:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
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 "
|
||||
@@ -275,45 +267,45 @@ 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:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "The application icon mode."
|
||||
msgstr "Ikonmodus for programmet."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr ""
|
||||
msgstr "Fest modal dialog til opphavsvinduet"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr ""
|
||||
msgstr "Plassering av knappene på tittellinjen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
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:46
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbeidsområder håndteres dynamisk"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Arbeidsområder vises kun på hovedskjerm"
|
||||
|
||||
@@ -330,11 +322,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:566
|
||||
#: ../js/gdm/loginDialog.js:569
|
||||
msgid "Session..."
|
||||
msgstr "Økt …"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:723
|
||||
#: ../js/gdm/loginDialog.js:726
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Logg inn"
|
||||
@@ -342,35 +334,35 @@ 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:787
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
msgid "Not listed?"
|
||||
msgstr "Ikke listet?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:967 ../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:399
|
||||
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
|
||||
msgid "Cancel"
|
||||
msgstr "Avbryt"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:979
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Logg inn"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:979
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
msgid "Next"
|
||||
msgstr "Neste"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Brukernavn: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1383
|
||||
#: ../js/gdm/loginDialog.js:1387
|
||||
msgid "Login Window"
|
||||
msgstr "Innloggingsvindu"
|
||||
|
||||
@@ -379,8 +371,8 @@ msgstr "Innloggingsvindu"
|
||||
msgid "Power"
|
||||
msgstr "Strøm"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:790
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
|
||||
#: ../js/ui/userMenu.js:792
|
||||
msgid "Suspend"
|
||||
msgstr "Hvilemodus"
|
||||
|
||||
@@ -388,8 +380,8 @@ msgstr "Hvilemodus"
|
||||
msgid "Restart"
|
||||
msgstr "Start på nytt"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
|
||||
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
|
||||
msgid "Power Off"
|
||||
msgstr "Slå av"
|
||||
|
||||
@@ -424,19 +416,19 @@ msgid "Execution of '%s' failed:"
|
||||
msgstr "Kjøring av «%s» feilet:"
|
||||
|
||||
#. Translators: Filter to display all applications
|
||||
#: ../js/ui/appDisplay.js:258
|
||||
#: ../js/ui/appDisplay.js:259
|
||||
msgid "All"
|
||||
msgstr "Alle"
|
||||
|
||||
#: ../js/ui/appDisplay.js:666
|
||||
#: ../js/ui/appDisplay.js:667
|
||||
msgid "New Window"
|
||||
msgstr "Nytt vindu"
|
||||
|
||||
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
|
||||
#: ../js/ui/appDisplay.js:670 ../js/ui/dash.js:289
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../js/ui/appDisplay.js:670
|
||||
#: ../js/ui/appDisplay.js:671
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Legg til i favoritter"
|
||||
|
||||
@@ -596,6 +588,14 @@ msgstr "Denne uken"
|
||||
msgid "Next week"
|
||||
msgstr "Neste uke"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:92
|
||||
msgid "External drive connected"
|
||||
msgstr "Ekstern stasjon koblet til"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:103
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Ekstern stasjon koblet fra"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:295
|
||||
msgid "Removable Devices"
|
||||
msgstr "Avtagbare enheter"
|
||||
@@ -761,15 +761,15 @@ msgstr "<b>%A</b>, <b>%H.%M</b>"
|
||||
|
||||
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
|
||||
#: ../js/ui/components/telepathyClient.js:942
|
||||
#, fuzzy, no-c-format
|
||||
#, no-c-format
|
||||
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
|
||||
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||
msgstr "<b>%d</b>, <b>%B</b>, <b>%H.%M</b>"
|
||||
|
||||
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
|
||||
#: ../js/ui/components/telepathyClient.js:946
|
||||
#, fuzzy, no-c-format
|
||||
#, no-c-format
|
||||
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
|
||||
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||
msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H.%M</b> "
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
@@ -966,18 +966,22 @@ msgstr "Vinduer"
|
||||
msgid "Show Applications"
|
||||
msgstr "Vis programmer"
|
||||
|
||||
#: ../js/ui/dateMenu.js:87
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Innstillinger for dato og klokkeslett"
|
||||
|
||||
#: ../js/ui/dateMenu.js:112
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
msgid "Open Calendar"
|
||||
msgstr "Åpne kalender"
|
||||
|
||||
#: ../js/ui/dateMenu.js:96
|
||||
msgid "Open Clocks"
|
||||
msgstr "Åpne Klokker"
|
||||
|
||||
#: ../js/ui/dateMenu.js:105
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Innstillinger for dato og klokkeslett"
|
||||
|
||||
#. 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:191
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%a %e %B, %Y"
|
||||
|
||||
@@ -1082,12 +1086,12 @@ 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:291
|
||||
#: ../js/ui/keyboard.js:289
|
||||
msgid "tray"
|
||||
msgstr "varslingsområde"
|
||||
|
||||
#: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
|
||||
#: ../js/ui/status/power.js:206
|
||||
#: ../js/ui/keyboard.js:634 ../js/ui/status/keyboard.js:309
|
||||
#: ../js/ui/status/power.js:211
|
||||
msgid "Keyboard"
|
||||
msgstr "Tastatur"
|
||||
|
||||
@@ -1139,23 +1143,23 @@ msgstr "Vis kildekode"
|
||||
msgid "Web Page"
|
||||
msgstr "Nettside"
|
||||
|
||||
#: ../js/ui/messageTray.js:1090
|
||||
#: ../js/ui/messageTray.js:1118
|
||||
msgid "Open"
|
||||
msgstr "Åpne"
|
||||
|
||||
#: ../js/ui/messageTray.js:1097
|
||||
#: ../js/ui/messageTray.js:1125
|
||||
msgid "Remove"
|
||||
msgstr "Fjern"
|
||||
|
||||
#: ../js/ui/messageTray.js:1554
|
||||
#: ../js/ui/messageTray.js:1581
|
||||
msgid "No Messages"
|
||||
msgstr "Ingen meldinger"
|
||||
|
||||
#: ../js/ui/messageTray.js:1572
|
||||
#: ../js/ui/messageTray.js:1599
|
||||
msgid "Message Tray"
|
||||
msgstr "Meldingstrau"
|
||||
|
||||
#: ../js/ui/messageTray.js:2641
|
||||
#: ../js/ui/messageTray.js:2685
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformasjon"
|
||||
|
||||
@@ -1237,15 +1241,15 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d ny varsling"
|
||||
msgstr[1] "%d nye varslinger"
|
||||
|
||||
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
|
||||
msgid "Lock"
|
||||
msgstr "Lås"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:403
|
||||
#: ../js/ui/searchDisplay.js:430
|
||||
msgid "Searching..."
|
||||
msgstr "Søker …"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:451
|
||||
#: ../js/ui/searchDisplay.js:478
|
||||
msgid "No results."
|
||||
msgstr "Ingen resultater."
|
||||
|
||||
@@ -1328,6 +1332,7 @@ msgstr "Stor tekst"
|
||||
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
|
||||
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
|
||||
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
|
||||
#: ../js/ui/status/network.js:813
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@@ -1348,7 +1353,7 @@ msgid "Bluetooth Settings"
|
||||
msgstr "Innstillinger for Bluetooth"
|
||||
|
||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
|
||||
msgid "hardware disabled"
|
||||
msgstr "maskinvare slått av"
|
||||
|
||||
@@ -1356,12 +1361,12 @@ msgstr "maskinvare slått av"
|
||||
msgid "Connection"
|
||||
msgstr "Tilkobling"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
|
||||
msgid "disconnecting..."
|
||||
msgstr "kobler fra …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
|
||||
#: ../js/ui/status/network.js:1464
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
|
||||
#: ../js/ui/status/network.js:1533
|
||||
msgid "connecting..."
|
||||
msgstr "kobler til …"
|
||||
|
||||
@@ -1377,7 +1382,7 @@ msgstr "Innstillinger for tastatur"
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Innstillinger for mus"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
|
||||
msgid "Sound Settings"
|
||||
msgstr "Innstillinger for lyd"
|
||||
|
||||
@@ -1453,109 +1458,117 @@ msgstr "Innstillinger for region og språk"
|
||||
msgid "Volume, network, battery"
|
||||
msgstr "Volum, nettverk, batteri"
|
||||
|
||||
#: ../js/ui/status/network.js:95
|
||||
#: ../js/ui/status/network.js:103
|
||||
msgid "<unknown>"
|
||||
msgstr "<ukjent>"
|
||||
|
||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||
#: ../js/ui/status/network.js:191
|
||||
#: ../js/ui/status/network.js:199
|
||||
msgid "disabled"
|
||||
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:434
|
||||
#: ../js/ui/status/network.js:457
|
||||
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:445 ../js/ui/status/network.js:1467
|
||||
#: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
|
||||
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:455
|
||||
#: ../js/ui/status/network.js:478
|
||||
msgid "firmware missing"
|
||||
msgstr "fastvare mangler"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:462
|
||||
#: ../js/ui/status/network.js:485
|
||||
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:467
|
||||
#: ../js/ui/status/network.js:490
|
||||
msgid "unavailable"
|
||||
msgstr "ikke tilgjengelig"
|
||||
|
||||
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
|
||||
#: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
|
||||
msgid "connection failed"
|
||||
msgstr "tilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
|
||||
#: ../js/ui/status/network.js:1545
|
||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
|
||||
#: ../js/ui/status/network.js:1614
|
||||
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:561 ../js/ui/status/network.js:1333
|
||||
#: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
|
||||
msgid "Connected (private)"
|
||||
msgstr "Tilkoblet (privat)"
|
||||
|
||||
#: ../js/ui/status/network.js:641
|
||||
#: ../js/ui/status/network.js:666
|
||||
msgid "Wired"
|
||||
msgstr "Kablet"
|
||||
|
||||
#: ../js/ui/status/network.js:667
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Automatisk Ethernet"
|
||||
|
||||
#: ../js/ui/status/network.js:688
|
||||
#: ../js/ui/status/network.js:694
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Mobilt bredbånd"
|
||||
|
||||
#: ../js/ui/status/network.js:715
|
||||
msgid "Auto broadband"
|
||||
msgstr "Automatisk bredbånd"
|
||||
|
||||
#: ../js/ui/status/network.js:691
|
||||
#: ../js/ui/status/network.js:718
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Automatisk oppringt"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
|
||||
#: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "Automatisk %s"
|
||||
|
||||
#: ../js/ui/status/network.js:822
|
||||
#: ../js/ui/status/network.js:850
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Automatisk Bluetooth"
|
||||
|
||||
#: ../js/ui/status/network.js:1352
|
||||
#: ../js/ui/status/network.js:1371
|
||||
msgid "Auto wireless"
|
||||
msgstr "Automatisk trådløst"
|
||||
|
||||
#: ../js/ui/status/network.js:1595
|
||||
#: ../js/ui/status/network.js:1664
|
||||
msgid "Enable networking"
|
||||
msgstr "Slå på nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1627
|
||||
#: ../js/ui/status/network.js:1706
|
||||
msgid "Wi-Fi"
|
||||
msgstr "Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1646
|
||||
#: ../js/ui/status/network.js:1725
|
||||
msgid "Network Settings"
|
||||
msgstr "Innstillinger for nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1692
|
||||
#: ../js/ui/status/network.js:1784
|
||||
msgid "Network Manager"
|
||||
msgstr "Nettverkshåndtering"
|
||||
|
||||
#: ../js/ui/status/network.js:1774
|
||||
#: ../js/ui/status/network.js:1873
|
||||
msgid "Connection failed"
|
||||
msgstr "Tilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:1775
|
||||
#: ../js/ui/status/network.js:1874
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivering av nettverkstilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:2092
|
||||
#: ../js/ui/status/network.js:2252
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Nettverk er slått av"
|
||||
|
||||
@@ -1563,17 +1576,17 @@ msgstr "Nettverk er slått av"
|
||||
msgid "Battery"
|
||||
msgstr "Batteri"
|
||||
|
||||
#: ../js/ui/status/power.js:72
|
||||
#: ../js/ui/status/power.js:81
|
||||
msgid "Power Settings"
|
||||
msgstr "Innstillinger for strøm"
|
||||
|
||||
#. 0 is reported when UPower does not have enough data
|
||||
#. to estimate battery life
|
||||
#: ../js/ui/status/power.js:94
|
||||
#: ../js/ui/status/power.js:99
|
||||
msgid "Estimating..."
|
||||
msgstr "Estimerer …"
|
||||
|
||||
#: ../js/ui/status/power.js:101
|
||||
#: ../js/ui/status/power.js:106
|
||||
#, c-format
|
||||
msgid "%d hour remaining"
|
||||
msgid_plural "%d hours remaining"
|
||||
@@ -1581,87 +1594,91 @@ msgstr[0] "%d time gjenstår"
|
||||
msgstr[1] "%d timer gjenstår"
|
||||
|
||||
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
|
||||
#: ../js/ui/status/power.js:104
|
||||
#: ../js/ui/status/power.js:109
|
||||
#, c-format
|
||||
msgid "%d %s %d %s remaining"
|
||||
msgstr "%d %s %d %s gjenstår"
|
||||
|
||||
#: ../js/ui/status/power.js:106
|
||||
#: ../js/ui/status/power.js:111
|
||||
msgid "hour"
|
||||
msgid_plural "hours"
|
||||
msgstr[0] "time"
|
||||
msgstr[1] "timer"
|
||||
|
||||
#: ../js/ui/status/power.js:106
|
||||
#: ../js/ui/status/power.js:111
|
||||
msgid "minute"
|
||||
msgid_plural "minutes"
|
||||
msgstr[0] "minutt"
|
||||
msgstr[1] "minutter"
|
||||
|
||||
#: ../js/ui/status/power.js:109
|
||||
#: ../js/ui/status/power.js:114
|
||||
#, c-format
|
||||
msgid "%d minute remaining"
|
||||
msgid_plural "%d minutes remaining"
|
||||
msgstr[0] "%d minutt gjenstår"
|
||||
msgstr[1] "%d minutter gjenstår"
|
||||
|
||||
#: ../js/ui/status/power.js:112 ../js/ui/status/power.js:186
|
||||
#: ../js/ui/status/power.js:117 ../js/ui/status/power.js:191
|
||||
#, c-format
|
||||
msgctxt "percent of battery remaining"
|
||||
msgid "%d%%"
|
||||
msgstr "%d%%"
|
||||
|
||||
#: ../js/ui/status/power.js:196
|
||||
#: ../js/ui/status/power.js:201
|
||||
msgid "AC adapter"
|
||||
msgstr "Strømadapter"
|
||||
|
||||
#: ../js/ui/status/power.js:198
|
||||
#: ../js/ui/status/power.js:203
|
||||
msgid "Laptop battery"
|
||||
msgstr "Batteri på bærbar"
|
||||
|
||||
#: ../js/ui/status/power.js:200
|
||||
#: ../js/ui/status/power.js:205
|
||||
msgid "UPS"
|
||||
msgstr "UPS"
|
||||
|
||||
#: ../js/ui/status/power.js:202
|
||||
#: ../js/ui/status/power.js:207
|
||||
msgid "Monitor"
|
||||
msgstr "Skjerm"
|
||||
|
||||
#: ../js/ui/status/power.js:204
|
||||
#: ../js/ui/status/power.js:209
|
||||
msgid "Mouse"
|
||||
msgstr "Mus"
|
||||
|
||||
#: ../js/ui/status/power.js:208
|
||||
#: ../js/ui/status/power.js:213
|
||||
msgid "PDA"
|
||||
msgstr "PDA"
|
||||
|
||||
#: ../js/ui/status/power.js:210
|
||||
#: ../js/ui/status/power.js:215
|
||||
msgid "Cell phone"
|
||||
msgstr "Mobiltelefon"
|
||||
|
||||
#: ../js/ui/status/power.js:212
|
||||
#: ../js/ui/status/power.js:217
|
||||
msgid "Media player"
|
||||
msgstr "Medieavspiller"
|
||||
|
||||
#: ../js/ui/status/power.js:214
|
||||
#: ../js/ui/status/power.js:219
|
||||
msgid "Tablet"
|
||||
msgstr "Nettbrett"
|
||||
|
||||
#: ../js/ui/status/power.js:216
|
||||
#: ../js/ui/status/power.js:221
|
||||
msgid "Computer"
|
||||
msgstr "Datamaskin"
|
||||
|
||||
#: ../js/ui/status/power.js:218
|
||||
#: ../js/ui/status/power.js:223
|
||||
msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: ../js/ui/status/volume.js:124
|
||||
msgid "Volume changed"
|
||||
msgstr "Volum endret"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
|
||||
#: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
|
||||
msgid "Volume"
|
||||
msgstr "Volum"
|
||||
|
||||
#: ../js/ui/status/volume.js:256
|
||||
#: ../js/ui/status/volume.js:259
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
@@ -1673,55 +1690,55 @@ msgstr "Logg inn som en annen bruker"
|
||||
msgid "Unlock Window"
|
||||
msgstr "Lås opp vindu"
|
||||
|
||||
#: ../js/ui/userMenu.js:177
|
||||
#: ../js/ui/userMenu.js:178
|
||||
msgid "Available"
|
||||
msgstr "Tilgjengelig"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Busy"
|
||||
msgstr "Opptatt"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Invisible"
|
||||
msgstr "Usynlig"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Away"
|
||||
msgstr "Borte"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Idle"
|
||||
msgstr "Ledig"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Offline"
|
||||
msgstr "Frakoblet"
|
||||
|
||||
#: ../js/ui/userMenu.js:755
|
||||
#: ../js/ui/userMenu.js:757
|
||||
msgid "Notifications"
|
||||
msgstr "Varslinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:763
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Settings"
|
||||
msgstr "Innstillinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:771
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#: ../js/ui/userMenu.js:776
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Log Out"
|
||||
msgstr "Logg ut"
|
||||
|
||||
#: ../js/ui/userMenu.js:796
|
||||
#: ../js/ui/userMenu.js:798
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Installer oppdateringer og start på nytt"
|
||||
|
||||
#: ../js/ui/userMenu.js:814
|
||||
#: ../js/ui/userMenu.js:816
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Din pratestatus vil bli satt til opptatt"
|
||||
|
||||
#: ../js/ui/userMenu.js:815
|
||||
#: ../js/ui/userMenu.js:817
|
||||
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."
|
||||
@@ -1783,19 +1800,19 @@ msgstr[1] "%u innganger"
|
||||
msgid "System Sounds"
|
||||
msgstr "Systemlyder"
|
||||
|
||||
#: ../src/main.c:332
|
||||
#: ../src/main.c:347
|
||||
msgid "Print version"
|
||||
msgstr "Skriv ut versjon"
|
||||
|
||||
#: ../src/main.c:338
|
||||
#: ../src/main.c:353
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Modus som brukes av GDM for innloggingsskjermen"
|
||||
|
||||
#: ../src/main.c:344
|
||||
#: ../src/main.c:359
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
|
||||
|
||||
#: ../src/main.c:350
|
||||
#: ../src/main.c:365
|
||||
msgid "List possible modes"
|
||||
msgstr "Vis mulige modi"
|
||||
|
||||
|
314
po/sl.po
314
po/sl.po
@@ -9,8 +9,8 @@ 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: 2013-01-08 22:40+0000\n"
|
||||
"PO-Revision-Date: 2013-01-12 22:48+0100\n"
|
||||
"POT-Creation-Date: 2013-01-26 03:10+0000\n"
|
||||
"PO-Revision-Date: 2013-01-26 20:01+0100\n"
|
||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||
"Language: Slovenian\n"
|
||||
@@ -161,21 +161,13 @@ msgstr ""
|
||||
"enouporabniški in enosejni namestitvi."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid "Show full name in the user menu"
|
||||
msgstr "Pokaži polno ime v meniju uporabnika"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid "Whether the users full name is shown in the user menu or not."
|
||||
msgstr "Ali naj bo prikazano uporabnikovo polno ime v meniju uporabnika."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Ali naj se geslo za priklapljanje šifriranih in oddaljenih datotečnih "
|
||||
"sistemov shrani"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@@ -186,71 +178,71 @@ msgstr ""
|
||||
"izbiri možnosti zahtevano geslo. Na pogovornem oknu bo prikazana možnost "
|
||||
"'Shrani geslo'. S tem bo nastavljeno privzeto stanje za uporabo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Pokaži tedenski datum v koledarju"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Izbrana možnost določa prikaz ISO tedenski datum v koledarju."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Tipkovna bližnjica, ki odpre meni programov"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Tipkovna bližnjica, ki odpre meni programov."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\" v pregledu "
|
||||
"dejavnosti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid "Keybinding to toggle the visibility of the message tray"
|
||||
msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to toggle the visibility of the message tray."
|
||||
msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the screen recorder"
|
||||
msgstr "Tipkovna bližnjica za preklop snemalnika zaslona"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||
msgstr ""
|
||||
"Tipkovna bližnjica za začetek in ustavitev vgrajenega snemalnika zaslona"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Katera tipkovnica naj bo uporabljena?"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Vrsta tipkovnice za uporabo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Framerate used for recording screencasts."
|
||||
msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid ""
|
||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||
"screencast recorder in frames-per-second."
|
||||
@@ -258,11 +250,11 @@ msgstr ""
|
||||
"Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na "
|
||||
"sekundo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
@@ -288,11 +280,11 @@ msgstr ""
|
||||
"WEBM z uporabo kodeka VP8. Vrednost %T se uporablja kot ročnik za ugibanje "
|
||||
"najustreznejšega števila niti na sistemu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
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 "
|
||||
@@ -301,11 +293,11 @@ msgstr ""
|
||||
"Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan datum "
|
||||
"in določena pripona. Pripona mora ustrezati zapisu zabojnika."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "The application icon mode."
|
||||
msgstr "Ikonski način programa."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@@ -315,21 +307,21 @@ msgstr ""
|
||||
"sličice' (pokaže le sličice oken), 'le ikona' (pokaže ikono programa) in pa "
|
||||
"možnost 'oboje'."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Pripni modalno pogovorno okno na glavno okno"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Ključ prepiše vrednost v org.gnome.mutter med zaganjanjem lupine GNOME."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Arrangement of buttons on the titlebar"
|
||||
msgstr "Razporeditev gumbov v nazivni vrstici"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||
"GNOME Shell."
|
||||
@@ -337,15 +329,15 @@ msgstr ""
|
||||
"Ključ prepiše vrednost v org.gnome.desktop.wm.preferences med zaganjanjem "
|
||||
"lupine GNOME."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Omogoči utripanje črte med spuščanjem okna na robove zaslona"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Delovne površine se obravnavajo dinamično"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Delovne površine so le na osnovnem zaslonu"
|
||||
|
||||
@@ -363,11 +355,11 @@ msgid "Select an extension to configure using the combobox above."
|
||||
msgstr ""
|
||||
"Razširitev za nastavljanje je mogoče izbrati iz spustnega seznama zgoraj."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:566
|
||||
#: ../js/gdm/loginDialog.js:569
|
||||
msgid "Session..."
|
||||
msgstr "Seja ..."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:723
|
||||
#: ../js/gdm/loginDialog.js:726
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Prijava"
|
||||
@@ -375,35 +367,35 @@ msgstr "Prijava"
|
||||
#. 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:787
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
msgid "Not listed?"
|
||||
msgstr "Ali je ni na seznamu?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:967 ../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:399
|
||||
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
|
||||
msgid "Cancel"
|
||||
msgstr "Prekliči"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:979
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Prijava"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:979
|
||||
#: ../js/gdm/loginDialog.js:983
|
||||
msgid "Next"
|
||||
msgstr "Naslednji"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Uporabniško ime: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1383
|
||||
#: ../js/gdm/loginDialog.js:1387
|
||||
msgid "Login Window"
|
||||
msgstr "Prijavno okno"
|
||||
|
||||
@@ -412,8 +404,8 @@ msgstr "Prijavno okno"
|
||||
msgid "Power"
|
||||
msgstr "Napajanje"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:790
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
|
||||
#: ../js/ui/userMenu.js:792
|
||||
msgid "Suspend"
|
||||
msgstr "Zaustavi"
|
||||
|
||||
@@ -421,8 +413,8 @@ msgstr "Zaustavi"
|
||||
msgid "Restart"
|
||||
msgstr "Zaženi znova"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
|
||||
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
|
||||
#: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
|
||||
msgid "Power Off"
|
||||
msgstr "Izklop"
|
||||
|
||||
@@ -457,19 +449,19 @@ msgid "Execution of '%s' failed:"
|
||||
msgstr "Izvedba '%s' je spodletela:"
|
||||
|
||||
#. Translators: Filter to display all applications
|
||||
#: ../js/ui/appDisplay.js:258
|
||||
#: ../js/ui/appDisplay.js:259
|
||||
msgid "All"
|
||||
msgstr "Vse"
|
||||
|
||||
#: ../js/ui/appDisplay.js:666
|
||||
#: ../js/ui/appDisplay.js:667
|
||||
msgid "New Window"
|
||||
msgstr "Novo okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
|
||||
#: ../js/ui/appDisplay.js:670 ../js/ui/dash.js:289
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odstrani iz priljubljenih"
|
||||
|
||||
#: ../js/ui/appDisplay.js:670
|
||||
#: ../js/ui/appDisplay.js:671
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Dodaj med priljubljene"
|
||||
|
||||
@@ -629,6 +621,14 @@ msgstr "Ta teden"
|
||||
msgid "Next week"
|
||||
msgstr "Naslednji teden"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:92
|
||||
msgid "External drive connected"
|
||||
msgstr "Zunanji pogon je priklopljen"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:103
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Zunanji pogon je odklopljen"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:295
|
||||
msgid "Removable Devices"
|
||||
msgstr "Odstranljive naprave"
|
||||
@@ -986,7 +986,7 @@ msgstr "Povezava z %s ni mogoča."
|
||||
msgid "View account"
|
||||
msgstr "Poglej račun"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
msgid "Unknown reason"
|
||||
msgstr "Neznan vzrok"
|
||||
|
||||
@@ -998,18 +998,22 @@ msgstr "Okna"
|
||||
msgid "Show Applications"
|
||||
msgstr "Pokaži programe"
|
||||
|
||||
#: ../js/ui/dateMenu.js:87
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Nastavitve časa in datuma"
|
||||
|
||||
#: ../js/ui/dateMenu.js:112
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
msgid "Open Calendar"
|
||||
msgstr "Odpri koledar"
|
||||
|
||||
#: ../js/ui/dateMenu.js:96
|
||||
msgid "Open Clocks"
|
||||
msgstr "Odpri ure"
|
||||
|
||||
#: ../js/ui/dateMenu.js:105
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Nastavitve časa in datuma"
|
||||
|
||||
#. 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:191
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%a, %e. %b., %R"
|
||||
|
||||
@@ -1152,7 +1156,9 @@ msgstr "Pokaži napake"
|
||||
msgid "Enabled"
|
||||
msgstr "Omogočeno"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:768
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Onemogočeno"
|
||||
|
||||
@@ -1176,23 +1182,23 @@ msgstr "Poglej vir"
|
||||
msgid "Web Page"
|
||||
msgstr "Spletna stran"
|
||||
|
||||
#: ../js/ui/messageTray.js:1090
|
||||
#: ../js/ui/messageTray.js:1118
|
||||
msgid "Open"
|
||||
msgstr "Odpri"
|
||||
|
||||
#: ../js/ui/messageTray.js:1097
|
||||
#: ../js/ui/messageTray.js:1125
|
||||
msgid "Remove"
|
||||
msgstr "Odstrani"
|
||||
|
||||
#: ../js/ui/messageTray.js:1554
|
||||
#: ../js/ui/messageTray.js:1581
|
||||
msgid "No Messages"
|
||||
msgstr "Ni sporočil"
|
||||
|
||||
#: ../js/ui/messageTray.js:1572
|
||||
#: ../js/ui/messageTray.js:1599
|
||||
msgid "Message Tray"
|
||||
msgstr "Vrstica sporočanja"
|
||||
|
||||
#: ../js/ui/messageTray.js:2641
|
||||
#: ../js/ui/messageTray.js:2672
|
||||
msgid "System Information"
|
||||
msgstr "Podrobnosti sistema"
|
||||
|
||||
@@ -1278,15 +1284,15 @@ msgstr[1] "%d novo obvestilo"
|
||||
msgstr[2] "%d novi obvestili"
|
||||
msgstr[3] "%d nova obvestila"
|
||||
|
||||
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
|
||||
msgid "Lock"
|
||||
msgstr "Zakleni"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:403
|
||||
#: ../js/ui/searchDisplay.js:430
|
||||
msgid "Searching..."
|
||||
msgstr "Iskanje ..."
|
||||
|
||||
#: ../js/ui/searchDisplay.js:451
|
||||
#: ../js/ui/searchDisplay.js:478
|
||||
msgid "No results."
|
||||
msgstr "Ni najdenih zadetkov."
|
||||
|
||||
@@ -1369,6 +1375,7 @@ msgstr "Veliko besedilo"
|
||||
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
|
||||
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
|
||||
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
|
||||
#: ../js/ui/status/network.js:813
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@@ -1389,7 +1396,7 @@ msgid "Bluetooth Settings"
|
||||
msgstr "Nastavitve za Bluetooth"
|
||||
|
||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169
|
||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
|
||||
msgid "hardware disabled"
|
||||
msgstr "strojno onemogočen"
|
||||
|
||||
@@ -1397,12 +1404,12 @@ msgstr "strojno onemogočen"
|
||||
msgid "Connection"
|
||||
msgstr "Povezava"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436
|
||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
|
||||
msgid "disconnecting..."
|
||||
msgstr "prekinjanje povezave ..."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
|
||||
#: ../js/ui/status/network.js:1464
|
||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
|
||||
#: ../js/ui/status/network.js:1533
|
||||
msgid "connecting..."
|
||||
msgstr "povezovanje ..."
|
||||
|
||||
@@ -1418,7 +1425,7 @@ msgstr "Nastavitve tipkovnice"
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Nastavitve miške"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
|
||||
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
|
||||
msgid "Sound Settings"
|
||||
msgstr "Nastavitve zvoka"
|
||||
|
||||
@@ -1494,109 +1501,117 @@ msgstr "Nastavitve območja in jezika"
|
||||
msgid "Volume, network, battery"
|
||||
msgstr "Nosilec, omrežje, baterija"
|
||||
|
||||
#: ../js/ui/status/network.js:95
|
||||
#: ../js/ui/status/network.js:103
|
||||
msgid "<unknown>"
|
||||
msgstr "<neznano>"
|
||||
|
||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||
#: ../js/ui/status/network.js:191
|
||||
#: ../js/ui/status/network.js:199
|
||||
msgid "disabled"
|
||||
msgstr "onemogočeno"
|
||||
|
||||
#. 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:434
|
||||
#: ../js/ui/status/network.js:457
|
||||
msgid "unmanaged"
|
||||
msgstr "neupravljano"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
|
||||
#: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
|
||||
msgid "authentication required"
|
||||
msgstr "zahtevana je overitev"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing
|
||||
#: ../js/ui/status/network.js:455
|
||||
#: ../js/ui/status/network.js:478
|
||||
msgid "firmware missing"
|
||||
msgstr "manjka strojna programska oprema"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:462
|
||||
#: ../js/ui/status/network.js:485
|
||||
msgid "cable unplugged"
|
||||
msgstr "kabel ni priklopljen"
|
||||
|
||||
#. 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:467
|
||||
#: ../js/ui/status/network.js:490
|
||||
msgid "unavailable"
|
||||
msgstr "ni na voljo"
|
||||
|
||||
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
|
||||
#: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
|
||||
msgid "connection failed"
|
||||
msgstr "povezovanje je spodletelo"
|
||||
|
||||
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
|
||||
#: ../js/ui/status/network.js:1545
|
||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
|
||||
#: ../js/ui/status/network.js:1614
|
||||
msgid "More..."
|
||||
msgstr "Več ..."
|
||||
|
||||
#. 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:561 ../js/ui/status/network.js:1333
|
||||
#: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
|
||||
msgid "Connected (private)"
|
||||
msgstr "Povezano (zasebna povezava)"
|
||||
|
||||
#: ../js/ui/status/network.js:641
|
||||
#: ../js/ui/status/network.js:666
|
||||
msgid "Wired"
|
||||
msgstr "Žično"
|
||||
|
||||
#: ../js/ui/status/network.js:667
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Samodejni eternet"
|
||||
|
||||
#: ../js/ui/status/network.js:688
|
||||
#: ../js/ui/status/network.js:694
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Mobilni širokopasovni dostop"
|
||||
|
||||
#: ../js/ui/status/network.js:715
|
||||
msgid "Auto broadband"
|
||||
msgstr "Samodejni širokopasovni dostop"
|
||||
|
||||
#: ../js/ui/status/network.js:691
|
||||
#: ../js/ui/status/network.js:718
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Samodejni klicni dostop"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
|
||||
#: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "Samodejna povezava z %s"
|
||||
|
||||
#: ../js/ui/status/network.js:822
|
||||
#: ../js/ui/status/network.js:850
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Samodejna povezava z Bluetooth"
|
||||
|
||||
#: ../js/ui/status/network.js:1352
|
||||
#: ../js/ui/status/network.js:1371
|
||||
msgid "Auto wireless"
|
||||
msgstr "Samodejni brezžični dostop"
|
||||
|
||||
#: ../js/ui/status/network.js:1595
|
||||
#: ../js/ui/status/network.js:1664
|
||||
msgid "Enable networking"
|
||||
msgstr "Omogoči omrežje"
|
||||
|
||||
#: ../js/ui/status/network.js:1627
|
||||
#: ../js/ui/status/network.js:1706
|
||||
msgid "Wi-Fi"
|
||||
msgstr "Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1646
|
||||
#: ../js/ui/status/network.js:1725
|
||||
msgid "Network Settings"
|
||||
msgstr "Omrežne nastavitve"
|
||||
|
||||
#: ../js/ui/status/network.js:1692
|
||||
#: ../js/ui/status/network.js:1784
|
||||
msgid "Network Manager"
|
||||
msgstr "Upravljalnik omrežij"
|
||||
|
||||
#: ../js/ui/status/network.js:1774
|
||||
#: ../js/ui/status/network.js:1873
|
||||
msgid "Connection failed"
|
||||
msgstr "Povezava je spodletela"
|
||||
|
||||
#: ../js/ui/status/network.js:1775
|
||||
#: ../js/ui/status/network.js:1874
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Omogočanje omrežne povezave je spodletelo."
|
||||
|
||||
#: ../js/ui/status/network.js:2092
|
||||
#: ../js/ui/status/network.js:2252
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Omrežje je onemogočeno"
|
||||
|
||||
@@ -1705,12 +1720,16 @@ msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "Neznano"
|
||||
|
||||
#: ../js/ui/status/volume.js:124
|
||||
msgid "Volume changed"
|
||||
msgstr "Glasnost je spremenjena"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
|
||||
#: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
|
||||
msgid "Volume"
|
||||
msgstr "Glasnost"
|
||||
|
||||
#: ../js/ui/status/volume.js:256
|
||||
#: ../js/ui/status/volume.js:259
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
@@ -1722,55 +1741,55 @@ msgstr "Prijava kot drug uporabnik"
|
||||
msgid "Unlock Window"
|
||||
msgstr "Odkleni okno"
|
||||
|
||||
#: ../js/ui/userMenu.js:177
|
||||
#: ../js/ui/userMenu.js:178
|
||||
msgid "Available"
|
||||
msgstr "Na voljo"
|
||||
|
||||
#: ../js/ui/userMenu.js:180
|
||||
#: ../js/ui/userMenu.js:181
|
||||
msgid "Busy"
|
||||
msgstr "Zaposleno"
|
||||
|
||||
#: ../js/ui/userMenu.js:183
|
||||
#: ../js/ui/userMenu.js:184
|
||||
msgid "Invisible"
|
||||
msgstr "Nevidno"
|
||||
|
||||
#: ../js/ui/userMenu.js:186
|
||||
#: ../js/ui/userMenu.js:187
|
||||
msgid "Away"
|
||||
msgstr "Odsotno"
|
||||
|
||||
#: ../js/ui/userMenu.js:189
|
||||
#: ../js/ui/userMenu.js:190
|
||||
msgid "Idle"
|
||||
msgstr "Nedejavno"
|
||||
|
||||
#: ../js/ui/userMenu.js:192
|
||||
#: ../js/ui/userMenu.js:193
|
||||
msgid "Offline"
|
||||
msgstr "Nepovezano"
|
||||
|
||||
#: ../js/ui/userMenu.js:755
|
||||
#: ../js/ui/userMenu.js:757
|
||||
msgid "Notifications"
|
||||
msgstr "Obvestila"
|
||||
|
||||
#: ../js/ui/userMenu.js:763
|
||||
#: ../js/ui/userMenu.js:765
|
||||
msgid "Settings"
|
||||
msgstr "Nastavitve"
|
||||
|
||||
#: ../js/ui/userMenu.js:771
|
||||
#: ../js/ui/userMenu.js:773
|
||||
msgid "Switch User"
|
||||
msgstr "Preklopi uporabnika"
|
||||
|
||||
#: ../js/ui/userMenu.js:776
|
||||
#: ../js/ui/userMenu.js:778
|
||||
msgid "Log Out"
|
||||
msgstr "Odjava"
|
||||
|
||||
#: ../js/ui/userMenu.js:796
|
||||
#: ../js/ui/userMenu.js:798
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Namesti posodobitve in ponovno zaženi"
|
||||
|
||||
#: ../js/ui/userMenu.js:814
|
||||
#: ../js/ui/userMenu.js:816
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno"
|
||||
|
||||
#: ../js/ui/userMenu.js:815
|
||||
#: ../js/ui/userMenu.js:817
|
||||
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."
|
||||
@@ -1810,19 +1829,45 @@ msgstr "'%s' storitev je pripravljena"
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Koledar Evolution "
|
||||
|
||||
#: ../src/main.c:332
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
msgstr[0] "%u odvodov naprave"
|
||||
msgstr[1] "%u odvod naprave"
|
||||
msgstr[2] "%u odvoda naprave"
|
||||
msgstr[3] "%u odvodi naprave"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u dovodov naprave"
|
||||
msgstr[1] "%u dovod naprave"
|
||||
msgstr[2] "%u dovoda naprave"
|
||||
msgstr[3] "%u dovodi naprave"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
msgid "System Sounds"
|
||||
msgstr "Sistemski zvoki"
|
||||
|
||||
#: ../src/main.c:347
|
||||
msgid "Print version"
|
||||
msgstr "Izpiši različico"
|
||||
|
||||
#: ../src/main.c:338
|
||||
#: ../src/main.c:353
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Način uporabljen v GDM za prijavni naslov"
|
||||
|
||||
#: ../src/main.c:344
|
||||
#: ../src/main.c:359
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Uporabi poseben način, npr.: \"gdm\" za prijavni zaslon"
|
||||
|
||||
#: ../src/main.c:350
|
||||
#: ../src/main.c:365
|
||||
msgid "List possible modes"
|
||||
msgstr "Seznam mogočih načinov"
|
||||
|
||||
@@ -1851,6 +1896,12 @@ msgstr "Privzeto"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Uporabnik je zavrnil pogovorno okno overitve"
|
||||
|
||||
#~ msgid "Show full name in the user menu"
|
||||
#~ msgstr "Pokaži polno ime v meniju uporabnika"
|
||||
|
||||
#~ msgid "Whether the users full name is shown in the user menu or not."
|
||||
#~ msgstr "Ali naj bo prikazano uporabnikovo polno ime v meniju uporabnika."
|
||||
|
||||
#~ msgid "APPLICATIONS"
|
||||
#~ msgstr "Programi"
|
||||
|
||||
@@ -1887,15 +1938,9 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
|
||||
#~ msgid "The requested device cannot be browsed, error is '%s'"
|
||||
#~ msgstr "Po zahtevani naprave ni mogoče brskati, napaka je '%s'"
|
||||
|
||||
#~ msgid "Wired"
|
||||
#~ msgstr "Žično"
|
||||
|
||||
#~ msgid "Wireless"
|
||||
#~ msgstr "Brezžično"
|
||||
|
||||
#~ msgid "Mobile broadband"
|
||||
#~ msgstr "Mobilni širokopasovni dostop"
|
||||
|
||||
#~ msgid "VPN Connections"
|
||||
#~ msgstr "Povezave VPN"
|
||||
|
||||
@@ -1905,23 +1950,6 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
|
||||
#~ msgid "System Settings"
|
||||
#~ msgstr "Sistemske nastavitve"
|
||||
|
||||
#~ msgid "%u Output"
|
||||
#~ msgid_plural "%u Outputs"
|
||||
#~ msgstr[0] "%u odvodov naprave"
|
||||
#~ msgstr[1] "%u odvod naprave"
|
||||
#~ msgstr[2] "%u odvoda naprave"
|
||||
#~ msgstr[3] "%u odvodi naprave"
|
||||
|
||||
#~ msgid "%u Input"
|
||||
#~ msgid_plural "%u Inputs"
|
||||
#~ msgstr[0] "%u dovodov naprave"
|
||||
#~ msgstr[1] "%u dovod naprave"
|
||||
#~ msgstr[2] "%u dovoda naprave"
|
||||
#~ msgstr[3] "%u dovodi naprave"
|
||||
|
||||
#~ msgid "System Sounds"
|
||||
#~ msgstr "Sistemski zvoki"
|
||||
|
||||
#~ msgid "Switch Session"
|
||||
#~ msgstr "Preklopi sejo"
|
||||
|
||||
|
846
po/sr@latin.po
846
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
891
po/zh_HK.po
891
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
898
po/zh_TW.po
898
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -115,6 +115,7 @@ shell_public_headers_h = \
|
||||
shell-gtk-embed.h \
|
||||
shell-global.h \
|
||||
shell-invert-lightness-effect.h \
|
||||
shell-keybinding-modes.h \
|
||||
shell-mobile-providers.h \
|
||||
shell-mount-operation.h \
|
||||
shell-network-agent.h \
|
||||
@@ -291,7 +292,7 @@ libgnome_shell_la_LIBADD = \
|
||||
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
|
||||
|
||||
Shell-0.1.gir: libgnome-shell.la St-1.0.gir
|
||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2 Soup-2.4 GMenu-3.0 NetworkManager-1.0 NMClient-1.0
|
||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2 Soup-2.4 GMenu-3.0 NetworkManager-1.0 NMClient-1.0 xlib-2.0
|
||||
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
|
||||
Shell_0_1_gir_LIBS = libgnome-shell.la
|
||||
Shell_0_1_gir_FILES = $(libgnome_shell_la_gir_sources)
|
||||
|
@@ -1,12 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -n "$GI_TYPELIB_PATH" ]; then
|
||||
if [ -z "$GI_TYPELIB_PATH" ]; then
|
||||
export GI_TYPELIB_PATH=@pkglibdir@
|
||||
else
|
||||
export GI_TYPELIB_PATH=@pkglibdir@:$GI_TYPELIB_PATH
|
||||
fi
|
||||
|
||||
if [ -n "$LD_LIBRARY_PATH" ] ; then
|
||||
if [ -z "$LD_LIBRARY_PATH" ] ; then
|
||||
export LD_LIBRARY_PATH=@pkglibdir@
|
||||
else
|
||||
export LD_LIBRARY_PATH=@pkglibdir@:$LD_LIBRARY_PATH
|
||||
|
16
src/main.c
16
src/main.c
@@ -8,6 +8,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <cogl-pango/cogl-pango.h>
|
||||
#include <clutter/clutter.h>
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
#include <gdk/gdk.h>
|
||||
@@ -194,6 +195,20 @@ shell_introspection_init (void)
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
shell_fonts_init (void)
|
||||
{
|
||||
CoglPangoFontMap *fontmap;
|
||||
|
||||
/* Disable text mipmapping; it causes problems on pre-GEM Intel
|
||||
* drivers and we should just be rendering text at the right
|
||||
* size rather than scaling it. If we do effects where we dynamically
|
||||
* zoom labels, then we might want to reconsider.
|
||||
*/
|
||||
fontmap = COGL_PANGO_FONT_MAP (clutter_get_font_map ());
|
||||
cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
malloc_statistics_callback (ShellPerfLog *perf_log,
|
||||
gpointer data)
|
||||
@@ -396,6 +411,7 @@ main (int argc, char **argv)
|
||||
shell_perf_log_init ();
|
||||
shell_prefs_init ();
|
||||
shell_introspection_init ();
|
||||
shell_fonts_init ();
|
||||
|
||||
/* Turn on telepathy-glib debugging but filter it out in
|
||||
* default_log_handler. This handler also exposes all the logs over D-Bus
|
||||
|
@@ -457,38 +457,6 @@ shell_app_system_get_tree (ShellAppSystem *self)
|
||||
return self->priv->apps_tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_app_system_get_settings_tree:
|
||||
*
|
||||
* Return Value: (transfer none): The #GMenuTree for apps
|
||||
*/
|
||||
GMenuTree *
|
||||
shell_app_system_get_settings_tree (ShellAppSystem *self)
|
||||
{
|
||||
return self->priv->settings_tree;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_app_system_lookup_setting:
|
||||
* @system:
|
||||
* @id: desktop file id
|
||||
*
|
||||
* Returns: (transfer none): Application in gnomecc.menu, or %NULL if none
|
||||
*/
|
||||
ShellApp *
|
||||
shell_app_system_lookup_setting (ShellAppSystem *self,
|
||||
const char *id)
|
||||
{
|
||||
ShellApp *app;
|
||||
|
||||
/* Actually defer to the main app set if there's overlap */
|
||||
app = shell_app_system_lookup_app (self, id);
|
||||
if (app != NULL)
|
||||
return app;
|
||||
|
||||
return g_hash_table_lookup (self->priv->setting_id_to_app, id);
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_app_system_get_default:
|
||||
*
|
||||
|
@@ -60,13 +60,7 @@ GSList *shell_app_system_subsearch (ShellAppSystem *sys
|
||||
GSList *previous_results,
|
||||
GSList *terms);
|
||||
|
||||
GMenuTree *shell_app_system_get_settings_tree (ShellAppSystem *system);
|
||||
|
||||
GSList *shell_app_system_search_settings (ShellAppSystem *system,
|
||||
GSList *terms);
|
||||
|
||||
ShellApp *shell_app_system_lookup_setting (ShellAppSystem *system,
|
||||
const char *id);
|
||||
|
||||
|
||||
#endif /* __SHELL_APP_SYSTEM_H__ */
|
||||
|
@@ -13,10 +13,11 @@
|
||||
#ifdef HAVE_SYS_RESOURCE_H
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
#include <locale.h>
|
||||
|
||||
#include <X11/extensions/Xfixes.h>
|
||||
#include <cogl-pango/cogl-pango.h>
|
||||
#include <canberra.h>
|
||||
#include <canberra-gtk.h>
|
||||
#include <clutter/glx/clutter-glx.h>
|
||||
#include <clutter/x11/clutter-x11.h>
|
||||
#include <gdk/gdkx.h>
|
||||
@@ -266,8 +267,13 @@ shell_global_init (ShellGlobal *global)
|
||||
|
||||
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
|
||||
|
||||
ca_context_create (&global->sound_context);
|
||||
ca_context_change_props (global->sound_context, CA_PROP_APPLICATION_NAME, PACKAGE_NAME, CA_PROP_APPLICATION_ID, "org.gnome.Shell", NULL);
|
||||
global->sound_context = ca_gtk_context_get ();
|
||||
ca_context_change_props (global->sound_context,
|
||||
CA_PROP_APPLICATION_NAME, "GNOME Shell",
|
||||
CA_PROP_APPLICATION_ID, "org.gnome.Shell",
|
||||
CA_PROP_APPLICATION_ICON_NAME, "start-here",
|
||||
CA_PROP_APPLICATION_LANGUAGE, setlocale (LC_MESSAGES, NULL),
|
||||
NULL);
|
||||
ca_context_open (global->sound_context);
|
||||
|
||||
if (!shell_js)
|
||||
@@ -811,20 +817,6 @@ global_stage_after_paint (ClutterStage *stage,
|
||||
"clutter.stagePaintDone");
|
||||
}
|
||||
|
||||
static void
|
||||
shell_fonts_init (ClutterStage *stage)
|
||||
{
|
||||
CoglPangoFontMap *fontmap;
|
||||
|
||||
/* Disable text mipmapping; it causes problems on pre-GEM Intel
|
||||
* drivers and we should just be rendering text at the right
|
||||
* size rather than scaling it. If we do effects where we dynamically
|
||||
* zoom labels, then we might want to reconsider.
|
||||
*/
|
||||
fontmap = COGL_PANGO_FONT_MAP (clutter_get_font_map ());
|
||||
cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE);
|
||||
}
|
||||
|
||||
/* This is an IBus workaround. The flow of events with IBus is that every time
|
||||
* it gets gets a key event, it:
|
||||
*
|
||||
@@ -963,8 +955,6 @@ _shell_global_set_plugin (ShellGlobal *global,
|
||||
g_signal_connect (global->meta_display, "notify::focus-window",
|
||||
G_CALLBACK (focus_window_changed), global);
|
||||
|
||||
shell_fonts_init (global->stage);
|
||||
|
||||
gdk_event_handler_set (gnome_shell_gdk_event_handler, global->stage, NULL);
|
||||
|
||||
global->focus_manager = st_focus_manager_get_for_stage (global->stage);
|
||||
@@ -1594,21 +1584,99 @@ shell_global_run_at_leisure (ShellGlobal *global,
|
||||
schedule_leisure_functions (global);
|
||||
}
|
||||
|
||||
static void
|
||||
build_ca_proplist_for_event (ca_proplist *props,
|
||||
const char *event_id,
|
||||
const char *event_description,
|
||||
ClutterEvent *for_event)
|
||||
{
|
||||
ca_proplist_sets (props, CA_PROP_EVENT_ID, event_id);
|
||||
ca_proplist_sets (props, CA_PROP_EVENT_DESCRIPTION, event_description);
|
||||
ca_proplist_sets (props, CA_PROP_CANBERRA_CACHE_CONTROL, "volatile");
|
||||
|
||||
if (for_event)
|
||||
{
|
||||
if (clutter_event_type (for_event) != CLUTTER_KEY_PRESS &&
|
||||
clutter_event_type (for_event) != CLUTTER_KEY_RELEASE)
|
||||
{
|
||||
ClutterPoint point;
|
||||
|
||||
clutter_event_get_position (for_event, &point);
|
||||
|
||||
ca_proplist_setf (props, CA_PROP_EVENT_MOUSE_X, "%d", (int)point.x);
|
||||
ca_proplist_setf (props, CA_PROP_EVENT_MOUSE_Y, "%d", (int)point.y);
|
||||
}
|
||||
|
||||
if (clutter_event_type (for_event) == CLUTTER_BUTTON_PRESS ||
|
||||
clutter_event_type (for_event) == CLUTTER_BUTTON_RELEASE)
|
||||
{
|
||||
gint button;
|
||||
|
||||
button = clutter_event_get_button (for_event);
|
||||
ca_proplist_setf (props, CA_PROP_EVENT_MOUSE_BUTTON, "%d", button);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_global_play_theme_sound:
|
||||
* @global: the #ShellGlobal
|
||||
* @id: an id, used to cancel later (0 if not needed)
|
||||
* @name: the sound name
|
||||
* @for_event: (allow-none): a #ClutterEvent in response to which the sound is played
|
||||
*
|
||||
* Plays a simple sound picked according to Freedesktop sound theme.
|
||||
* Really just a workaround for libcanberra not being introspected.
|
||||
*/
|
||||
void
|
||||
shell_global_play_theme_sound (ShellGlobal *global,
|
||||
guint id,
|
||||
const char *name)
|
||||
shell_global_play_theme_sound (ShellGlobal *global,
|
||||
guint id,
|
||||
const char *name,
|
||||
const char *description,
|
||||
ClutterEvent *for_event)
|
||||
{
|
||||
ca_context_play (global->sound_context, id, CA_PROP_EVENT_ID, name, NULL);
|
||||
ca_proplist *props;
|
||||
|
||||
ca_proplist_create (&props);
|
||||
build_ca_proplist_for_event (props, name, description, for_event);
|
||||
|
||||
ca_context_play_full (global->sound_context, id, props, NULL, NULL);
|
||||
|
||||
ca_proplist_destroy (props);
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_global_play_theme_sound_full:
|
||||
* @global: the #ShellGlobal
|
||||
* @id: an id, used to cancel later (0 if not needed)
|
||||
* @name: the sound name
|
||||
* @description: the localized description of the event that triggered this alert
|
||||
* @for_event: (allow-none): a #ClutterEvent in response to which the sound is played
|
||||
* @application_id: application on behalf of which the sound is played
|
||||
* @application_name:
|
||||
*
|
||||
* Plays a simple sound picked according to Freedesktop sound theme.
|
||||
* Really just a workaround for libcanberra not being introspected.
|
||||
*/
|
||||
void
|
||||
shell_global_play_theme_sound_full (ShellGlobal *global,
|
||||
guint id,
|
||||
const char *name,
|
||||
const char *description,
|
||||
ClutterEvent *for_event,
|
||||
const char *application_id,
|
||||
const char *application_name)
|
||||
{
|
||||
ca_proplist *props;
|
||||
|
||||
ca_proplist_create (&props);
|
||||
build_ca_proplist_for_event (props, name, description, for_event);
|
||||
ca_proplist_sets (props, CA_PROP_APPLICATION_ID, application_id);
|
||||
ca_proplist_sets (props, CA_PROP_APPLICATION_NAME, application_name);
|
||||
|
||||
ca_context_play_full (global->sound_context, id, props, NULL, NULL);
|
||||
|
||||
ca_proplist_destroy (props);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -121,9 +121,18 @@ void shell_global_sync_pointer (ShellGlobal *global);
|
||||
GAppLaunchContext *
|
||||
shell_global_create_app_launch_context (ShellGlobal *global);
|
||||
|
||||
void shell_global_play_theme_sound (ShellGlobal *global,
|
||||
void shell_global_play_theme_sound (ShellGlobal *global,
|
||||
guint id,
|
||||
const char *name,
|
||||
const char *description,
|
||||
ClutterEvent *for_event);
|
||||
void shell_global_play_theme_sound_full (ShellGlobal *global,
|
||||
guint id,
|
||||
const char *name);
|
||||
const char *name,
|
||||
const char *description,
|
||||
ClutterEvent *for_event,
|
||||
const char *application_id,
|
||||
const char *application_name);
|
||||
void shell_global_cancel_theme_sound (ShellGlobal *global,
|
||||
guint id);
|
||||
|
||||
|
35
src/shell-keybinding-modes.h
Normal file
35
src/shell-keybinding-modes.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* ShellKeyBindingMode:
|
||||
* @SHELL_KEYBINDING_MODE_NONE: block keybinding
|
||||
* @SHELL_KEYBINDING_MODE_NORMAL: allow keybinding when in window mode,
|
||||
* e.g. when the focus is in an application window
|
||||
* @SHELL_KEYBINDING_MODE_OVERVIEW: allow keybinding while the overview
|
||||
* is active
|
||||
* @SHELL_KEYBINDING_MODE_LOCK_SCREEN: allow keybinding when the screen
|
||||
* is locked, e.g. when the screen shield is shown
|
||||
* @SHELL_KEYBINDING_MODE_UNLOCK_SCREEN: allow keybinding in the unlock
|
||||
* dialog
|
||||
* @SHELL_KEYBINDING_MODE_LOGIN_SCREEN: allow keybinding in the login screen
|
||||
* @SHELL_KEYBINDING_MODE_MESSAGE_TRAY: allow keybinding while the message
|
||||
* tray is popped up
|
||||
* @SHELL_KEYBINDING_MODE_SYSTEM_MODAL: allow keybinding when a system modal
|
||||
* dialog (e.g. authentification or session dialogs) is open
|
||||
* @SHELL_KEYBINDING_MODE_LOOKING_GLASS: allow keybinding in looking glass
|
||||
* @SHELL_KEYBINDING_MODE_ALL: always allow keybinding
|
||||
*
|
||||
* Controls in which GNOME Shell states a keybinding should be handled.
|
||||
*/
|
||||
typedef enum {
|
||||
SHELL_KEYBINDING_MODE_NONE = 0,
|
||||
SHELL_KEYBINDING_MODE_NORMAL = 1 << 0,
|
||||
SHELL_KEYBINDING_MODE_OVERVIEW = 1 << 1,
|
||||
SHELL_KEYBINDING_MODE_LOCK_SCREEN = 1 << 2,
|
||||
SHELL_KEYBINDING_MODE_UNLOCK_SCREEN = 1 << 3,
|
||||
SHELL_KEYBINDING_MODE_LOGIN_SCREEN = 1 << 4,
|
||||
SHELL_KEYBINDING_MODE_MESSAGE_TRAY = 1 << 5,
|
||||
SHELL_KEYBINDING_MODE_SYSTEM_MODAL = 1 << 6,
|
||||
SHELL_KEYBINDING_MODE_LOOKING_GLASS = 1 << 7,
|
||||
|
||||
SHELL_KEYBINDING_MODE_ALL = ~SHELL_KEYBINDING_MODE_NONE
|
||||
} ShellKeyBindingMode;
|
||||
|
@@ -180,6 +180,7 @@ void
|
||||
shell_tray_icon_click (ShellTrayIcon *icon,
|
||||
ClutterEvent *event)
|
||||
{
|
||||
XKeyEvent xkevent;
|
||||
XButtonEvent xbevent;
|
||||
XCrossingEvent xcevent;
|
||||
GdkWindow *remote_window;
|
||||
@@ -187,8 +188,10 @@ shell_tray_icon_click (ShellTrayIcon *icon,
|
||||
int x_root, y_root;
|
||||
Display *xdisplay;
|
||||
Window xwindow, xrootwindow;
|
||||
ClutterEventType event_type = clutter_event_type (event);
|
||||
|
||||
g_return_if_fail (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE);
|
||||
g_return_if_fail (event_type == CLUTTER_BUTTON_RELEASE ||
|
||||
event_type == CLUTTER_KEY_RELEASE);
|
||||
|
||||
gdk_error_trap_push ();
|
||||
|
||||
@@ -215,22 +218,44 @@ shell_tray_icon_click (ShellTrayIcon *icon,
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xcevent);
|
||||
|
||||
/* Now do the click */
|
||||
xbevent.type = ButtonPress;
|
||||
xbevent.window = xwindow;
|
||||
xbevent.root = xrootwindow;
|
||||
xbevent.subwindow = None;
|
||||
xbevent.time = xcevent.time;
|
||||
xbevent.x = xcevent.x;
|
||||
xbevent.y = xcevent.y;
|
||||
xbevent.x_root = xcevent.x_root;
|
||||
xbevent.y_root = xcevent.y_root;
|
||||
xbevent.state = clutter_event_get_state (event);
|
||||
xbevent.button = clutter_event_get_button (event);
|
||||
xbevent.same_screen = True;
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
|
||||
if (event_type == CLUTTER_BUTTON_RELEASE)
|
||||
{
|
||||
xbevent.window = xwindow;
|
||||
xbevent.root = xrootwindow;
|
||||
xbevent.subwindow = None;
|
||||
xbevent.time = xcevent.time;
|
||||
xbevent.x = xcevent.x;
|
||||
xbevent.y = xcevent.y;
|
||||
xbevent.x_root = xcevent.x_root;
|
||||
xbevent.y_root = xcevent.y_root;
|
||||
xbevent.state = clutter_event_get_state (event);
|
||||
xbevent.same_screen = True;
|
||||
xbevent.type = ButtonPress;
|
||||
xbevent.button = clutter_event_get_button (event);
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
|
||||
|
||||
xbevent.type = ButtonRelease;
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
|
||||
xbevent.type = ButtonRelease;
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
|
||||
}
|
||||
else
|
||||
{
|
||||
xkevent.window = xwindow;
|
||||
xkevent.root = xrootwindow;
|
||||
xkevent.subwindow = None;
|
||||
xkevent.time = xcevent.time;
|
||||
xkevent.x = xcevent.x;
|
||||
xkevent.y = xcevent.y;
|
||||
xkevent.x_root = xcevent.x_root;
|
||||
xkevent.y_root = xcevent.y_root;
|
||||
xkevent.state = clutter_event_get_state (event);
|
||||
xkevent.same_screen = True;
|
||||
xkevent.type = KeyPress;
|
||||
xkevent.keycode = clutter_event_get_key_code (event);
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xkevent);
|
||||
|
||||
xkevent.type = KeyRelease;
|
||||
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xkevent);
|
||||
}
|
||||
|
||||
/* And move the pointer back out */
|
||||
xcevent.type = LeaveNotify;
|
||||
|
@@ -9,6 +9,8 @@
|
||||
#include <glib/gi18n-lib.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
#include <gdk/gdkx.h>
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
#ifdef HAVE__NL_TIME_FIRST_WEEKDAY
|
||||
#include <langinfo.h>
|
||||
@@ -430,3 +432,56 @@ shell_util_create_pixbuf_from_data (const guchar *data,
|
||||
bits_per_sample, width, height, rowstride,
|
||||
(GdkPixbufDestroyNotify) g_free, NULL);
|
||||
}
|
||||
|
||||
Pixmap
|
||||
shell_util_get_root_background (void)
|
||||
{
|
||||
Display *display;
|
||||
Pixmap pixmap;
|
||||
Window rootwin;
|
||||
Atom xrootpmap;
|
||||
Atom actual_type;
|
||||
int actual_format;
|
||||
unsigned long n_items;
|
||||
unsigned long bytes_after;
|
||||
unsigned char *buffer;
|
||||
|
||||
display = gdk_x11_get_default_xdisplay ();
|
||||
|
||||
xrootpmap = gdk_x11_atom_to_xatom (gdk_atom_intern_static_string ("_XROOTPMAP_ID"));
|
||||
rootwin = gdk_x11_get_default_root_xwindow ();
|
||||
|
||||
gdk_error_trap_push ();
|
||||
actual_type = None;
|
||||
buffer = NULL;
|
||||
if (XGetWindowProperty (display, rootwin, xrootpmap,
|
||||
0, G_MAXLONG,
|
||||
False, XA_PIXMAP, &actual_type, &actual_format,
|
||||
&n_items,
|
||||
&bytes_after,
|
||||
&buffer) != Success ||
|
||||
actual_type == None)
|
||||
{
|
||||
if (buffer)
|
||||
XFree (buffer);
|
||||
gdk_error_trap_pop_ignored ();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (gdk_error_trap_pop () != Success ||
|
||||
n_items == 0 ||
|
||||
actual_type != XA_PIXMAP ||
|
||||
actual_format != 32)
|
||||
{
|
||||
if (buffer)
|
||||
XFree (buffer);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pixmap = *((Pixmap*) buffer);
|
||||
|
||||
XFree (buffer);
|
||||
return pixmap;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include <clutter/clutter.h>
|
||||
#include <libsoup/soup.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -46,6 +47,8 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data,
|
||||
int height,
|
||||
int rowstride);
|
||||
|
||||
Pixmap shell_util_get_root_background (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __SHELL_UTIL_H__ */
|
||||
|
@@ -316,10 +316,6 @@ key_event_to_gdk (ClutterKeyEvent *event_clutter)
|
||||
* doesn't support XKB; we'll just end up with group == 0 */
|
||||
event_gdk->group = XkbGroupForCoreState (event_gdk->state);
|
||||
|
||||
gdk_keymap_translate_keyboard_state (keymap, event_gdk->hardware_keycode,
|
||||
event_gdk->state, event_gdk->group,
|
||||
&event_gdk->keyval, NULL, NULL, NULL);
|
||||
|
||||
if (event_clutter->unicode_value)
|
||||
{
|
||||
/* This is not particularly close to what GDK does - event_gdk->string
|
||||
|
@@ -50,8 +50,8 @@
|
||||
*
|
||||
* The second simplification that we make that allows us to implement
|
||||
* a straighforward height-for-width negotiation without multiple
|
||||
* allocate passes is that when the vertical scrollbar policy is
|
||||
* AUTO, we always reserve space for the vertical scrollbar in the
|
||||
* allocate passes is that when the scrollbar policy is
|
||||
* AUTO, we always reserve space for the scrollbar in the
|
||||
* reported minimum and natural size.
|
||||
*
|
||||
* See https://bugzilla.gnome.org/show_bug.cgi?id=611740 for a more
|
||||
@@ -451,7 +451,11 @@ st_scroll_view_get_preferred_height (ClutterActor *actor,
|
||||
account_for_hscrollbar = TRUE;
|
||||
break;
|
||||
case GTK_POLICY_AUTOMATIC:
|
||||
account_for_hscrollbar = for_width < child_min_width;
|
||||
/* For automatic scrollbars, we always request space for the horizontal
|
||||
* scrollbar; we won't know whether we actually need one until our
|
||||
* width is assigned in allocate().
|
||||
*/
|
||||
account_for_hscrollbar = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -622,12 +626,14 @@ st_scroll_view_allocate (ClutterActor *actor,
|
||||
clutter_actor_allocate (priv->hscroll, &child_box, flags);
|
||||
}
|
||||
|
||||
/* Now fold visibility into the scrollbar sizes to simplify the rest
|
||||
* of the computations.
|
||||
/* In case the scrollbar policy is NEVER, we don't trim the content
|
||||
* box allocation by the scrollbar size.
|
||||
* Fold this into the scrollbar sizes to simplify the rest of the
|
||||
* computations.
|
||||
*/
|
||||
if (!hscrollbar_visible)
|
||||
if (priv->hscrollbar_policy == GTK_POLICY_NEVER)
|
||||
sb_height = 0;
|
||||
if (!vscrollbar_visible)
|
||||
if (priv->vscrollbar_policy == GTK_POLICY_NEVER)
|
||||
sb_width = 0;
|
||||
|
||||
/* Child */
|
||||
|
@@ -61,6 +61,14 @@ st_theme_node_class_init (StThemeNodeClass *klass)
|
||||
object_class->finalize = st_theme_node_finalize;
|
||||
}
|
||||
|
||||
static void
|
||||
on_custom_stylesheets_changed (StTheme *theme,
|
||||
gpointer data)
|
||||
{
|
||||
StThemeNode *node = data;
|
||||
node->properties_computed = FALSE;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
st_theme_node_dispose (GObject *gobject)
|
||||
@@ -85,6 +93,10 @@ st_theme_node_dispose (GObject *gobject)
|
||||
node->icon_colors = NULL;
|
||||
}
|
||||
|
||||
if (node->theme)
|
||||
g_signal_handlers_disconnect_by_func (node->theme,
|
||||
on_custom_stylesheets_changed, node);
|
||||
|
||||
g_clear_object (&node->theme);
|
||||
|
||||
G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
|
||||
@@ -221,10 +233,11 @@ st_theme_node_new (StThemeContext *context,
|
||||
theme = parent_node->theme;
|
||||
|
||||
if (theme != NULL)
|
||||
node->theme = theme;
|
||||
|
||||
if (node->theme != NULL)
|
||||
g_object_ref (node->theme);
|
||||
{
|
||||
node->theme = g_object_ref (theme);
|
||||
g_signal_connect (node->theme, "custom-stylesheets-changed",
|
||||
G_CALLBACK (on_custom_stylesheets_changed), node);
|
||||
}
|
||||
|
||||
node->element_type = element_type;
|
||||
node->element_id = g_strdup (element_id);
|
||||
|
@@ -87,6 +87,14 @@ enum
|
||||
PROP_DEFAULT_STYLESHEET
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
STYLESHEETS_CHANGED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0, };
|
||||
|
||||
G_DEFINE_TYPE (StTheme, st_theme, G_TYPE_OBJECT)
|
||||
|
||||
/* Quick strcmp. Test only for == 0 or != 0, not < 0 or > 0. */
|
||||
@@ -153,6 +161,13 @@ st_theme_class_init (StThemeClass *klass)
|
||||
NULL,
|
||||
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
signals[STYLESHEETS_CHANGED] =
|
||||
g_signal_new ("custom-stylesheets-changed",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0, /* no default handler slot */
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
}
|
||||
|
||||
static CRStyleSheet *
|
||||
@@ -238,6 +253,7 @@ st_theme_load_stylesheet (StTheme *theme,
|
||||
insert_stylesheet (theme, path, stylesheet);
|
||||
cr_stylesheet_ref (stylesheet);
|
||||
theme->custom_stylesheets = g_slist_prepend (theme->custom_stylesheets, stylesheet);
|
||||
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -259,6 +275,7 @@ st_theme_unload_stylesheet (StTheme *theme,
|
||||
g_hash_table_remove (theme->stylesheets_by_filename, path);
|
||||
g_hash_table_remove (theme->filenames_by_stylesheet, stylesheet);
|
||||
cr_stylesheet_unref (stylesheet);
|
||||
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user