Compare commits
77 Commits
wip/screen
...
3.5.2
Author | SHA1 | Date | |
---|---|---|---|
06febdce22 | |||
c31d9d5e3d | |||
cda8a545f1 | |||
f850e92524 | |||
cc9d53e038 | |||
7b048fc092 | |||
4ba4a501fd | |||
2b2cce6896 | |||
c1f51a7bf3 | |||
465556f0d8 | |||
db7ac5208a | |||
cfcd1bc014 | |||
e63f7e8779 | |||
7911154bad | |||
ec0730f3e5 | |||
76005f5adf | |||
94493cde35 | |||
a1f68720e5 | |||
022376dd56 | |||
934e5aacab | |||
35b142f23f | |||
41c3795a7b | |||
95d7099133 | |||
33dc9abb9b | |||
5e4edac14d | |||
cb5ae92986 | |||
ebbd295ebe | |||
65d23fb9a3 | |||
ad6d986172 | |||
985641cc2e | |||
de0a714081 | |||
3f942302d1 | |||
96396163cf | |||
0c736c4561 | |||
33ad9d1035 | |||
d57658d059 | |||
031206cf1f | |||
12c7cc278d | |||
9d3750b9b8 | |||
ba4b9f229e | |||
850fe98cbb | |||
8a9e3e0df2 | |||
a277569d31 | |||
7ed9516884 | |||
ecff2fa2b7 | |||
e49b94658c | |||
e4f1572a3a | |||
b5b13322d8 | |||
c25e7f3c41 | |||
f6a2c92bfa | |||
ed17418101 | |||
5264f39209 | |||
de69c719fb | |||
ab3173487d | |||
a3fcb8c284 | |||
ba92cfa064 | |||
6bee51ed33 | |||
122bca49ea | |||
19318a1eeb | |||
a7a46bbe1c | |||
3d26224180 | |||
940ddb104c | |||
5617f91281 | |||
a9a863aab4 | |||
ca26347dea | |||
41a14e808e | |||
6452501275 | |||
b61ada72cc | |||
ace42d845c | |||
850b6f28e5 | |||
3c81e9f0e7 | |||
e20ea19f34 | |||
ce041a3190 | |||
3a01aaf7fb | |||
ec4a2aae95 | |||
de8a66d4ce | |||
dc3d3acb3b |
71
NEWS
71
NEWS
@ -1,3 +1,74 @@
|
||||
3.5.2
|
||||
=====
|
||||
* main: Move 'toggle-recording' binding into the shell [Florian; #674377]
|
||||
* popupMenu: make sure to break the grab when the slider is not visible
|
||||
[Stefano; #672713]
|
||||
* st-theme-node-drawing: Don't use GL types [Neil; #672711]
|
||||
* Mirror Evolution calendar settings into our own schema [Owen; #674424]
|
||||
* shell-network-agent: don't crash if a request isn't found [Dan; #674961]
|
||||
* notificationDaemon: Match app based on WM_CLASS [Jasper; #673761]
|
||||
* NetworkMenu: use network-offline while loading [Giovanni; #674426]
|
||||
* lookingGlass: Remove the Errors tab [Jasper; #675104]
|
||||
* searchDisplay: Reset keyboard focus after displaying async results
|
||||
[Rui; #675078]
|
||||
* gdm: don't fail if fprintd is unavailable [Ray; #675006]
|
||||
* messageTray: Fix scrolling up [Jasper; #661615]
|
||||
* main: Close the recorder instead of pausing it [Rui; #675128]
|
||||
* Accessibility [Alejandro]
|
||||
- Use the proper label_actor for date menu on top panel [#675307]
|
||||
- Set the proper role/label_actor for SearchResult.content [#672242]
|
||||
- do not expose a label text if 'hidden' style class is used [#675341]
|
||||
* Magnifier: Add brightness and contrast functionality [Joseph; #639851]
|
||||
* theme: use a smaller border-radius for top bar [Jakub; #672430]
|
||||
* placeDisplay: use new bookmark file location [Matthias; #675443]
|
||||
* port all synchronous search providers to the async API [Jasper, Rui; #675328]
|
||||
* NetworkAgent: disallow multiple requests for the same connection/setting
|
||||
[Giovanni; #674961]
|
||||
* userMenu: Update to latest mockups [Florian; #675802]
|
||||
* util: Don't double-fork when spawning from Alt-F2 [Colin; #675789]
|
||||
* messageTray: Make Source usable without subclassing [Jasper; #661236]
|
||||
* panel: Check for appMenu button's reactivity before opening [Florian; #676316]
|
||||
* Fix formatting of bluetooth passkey [Florian; #651251]
|
||||
* notificationDaemon: Filter out file-transfer notifications [Jasper; #676175]
|
||||
* Don't use global.log() [Jasper; #675790]
|
||||
* Fix broken extension loading in some distributions [Owen, Alexandre; #670477]
|
||||
* shell-app: Raise windows in reverse order to preserve the stacking
|
||||
[Rui; #676371]
|
||||
* Generalize gdm-mode [Florian; #676156]
|
||||
* Switch string formatting to the one inside gjs [Jasper; #675479]
|
||||
* extensionUtils: Support subdirectories in getCurrentExtension
|
||||
[Jasper; #677001]
|
||||
* panel: Refuse to add (legacy) status icons not part of the session mode
|
||||
[Florian; #677058]
|
||||
* Add an initial-setup mode [Matthias; #676697]
|
||||
* status/keyboard: Port to the new input sources settings [Rui; #641531]
|
||||
* NetworkMenu: show notifications for failed VPN connections [Giovanni; #676330]
|
||||
* userMenu: Indicate progress on status changes [Florian; #659067]
|
||||
* recorder: Honor "disable-save-to-disk" lockdown key [Rūdolfs; #673630]
|
||||
* searchDisplay: Use the rowLimit we pass to the IconGrid [Christian; #675527]
|
||||
* endSessionDialog: Factor out _updateDescription from _updateContent
|
||||
[Alejandro; #674210]
|
||||
* Fix empathy's appMenu freezing the shell [Alban; #676447]
|
||||
* Code cleanups [Florian, Giovanni, Jasper; #672807, #672413, #676837, #676850,
|
||||
#672272]
|
||||
* Misc bug fixes [Alban, Florian, Giovanni, Guillaume, Jasper, Piotr, Rico,
|
||||
Ron, Rui, Stefano; #659968, #672192, #673177, #673198, #674323, #675301,
|
||||
#675370, #676347, #676806, #677097]
|
||||
|
||||
Contributors:
|
||||
Alban Browaeys, Giovanni Campagna, Matthias Clasen, Guillaume Desmottes,
|
||||
Piotr Drąg, Stefano Facchini, Rui Matos, Rūdolfs Mazurs, Florian Müllner,
|
||||
Alejandro Piñeiro, Neil Roberts, Alexandre Rostovtsev, Joseph Scheuhammer,
|
||||
Jakub Steiner, Jasper St. Pierre, Ray Strode, Owen Taylor, Rico Tzschichholz,
|
||||
Colin Walters, Dan Winship, Ron Yorston
|
||||
|
||||
Translations:
|
||||
OKANO Takayoshi [ja], Daniel Mustieles [es], Changwoo Ryu [ko],
|
||||
Yaron Shahrabani [he], Fran Diéguez [gl], Jonh Wendell [pt_BR],
|
||||
Kjartan Maraas [nb], Luca Ferretti [it], Tom Tryfonidis [el],
|
||||
Sandeep Sheshrao Shedmake [mr], Takanori MATSUURA [ja], Dirgita [id],
|
||||
Mantas Kriaučiūnas [lt], Matej Urbančič [sl], Jiro Matsuzawa [ja]
|
||||
|
||||
3.4.1
|
||||
=====
|
||||
* Fix crash that occurred when an icon theme change caused unexpected
|
||||
|
@ -41,7 +41,7 @@
|
||||
"It can be used only by extensions.gnome.org"
|
||||
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
|
||||
|
||||
#define PLUGIN_API_VERSION 3
|
||||
#define PLUGIN_API_VERSION 4
|
||||
|
||||
typedef struct {
|
||||
GDBusProxy *proxy;
|
||||
@ -163,6 +163,7 @@ NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
||||
plugin->newp = NPP_New;
|
||||
plugin->destroy = NPP_Destroy;
|
||||
plugin->getvalue = NPP_GetValue;
|
||||
plugin->setwindow = NPP_SetWindow;
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
@ -267,6 +268,7 @@ typedef struct {
|
||||
NPObject parent;
|
||||
NPP instance;
|
||||
GDBusProxy *proxy;
|
||||
GSettings *settings;
|
||||
NPObject *listener;
|
||||
NPObject *restart_listener;
|
||||
gint signal_id;
|
||||
@ -323,6 +325,9 @@ on_shell_appeared (GDBusConnection *connection,
|
||||
}
|
||||
}
|
||||
|
||||
#define SHELL_SCHEMA "org.gnome.shell"
|
||||
#define ENABLED_EXTENSIONS_KEY "enabled-extensions"
|
||||
|
||||
static NPObject *
|
||||
plugin_object_allocate (NPP instance,
|
||||
NPClass *klass)
|
||||
@ -332,6 +337,7 @@ plugin_object_allocate (NPP instance,
|
||||
|
||||
obj->instance = instance;
|
||||
obj->proxy = g_object_ref (data->proxy);
|
||||
obj->settings = g_settings_new (SHELL_SCHEMA);
|
||||
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
||||
G_CALLBACK (on_shell_signal), obj);
|
||||
|
||||
@ -492,7 +498,61 @@ plugin_enable_extension (PluginObject *obj,
|
||||
NPString uuid,
|
||||
gboolean enabled)
|
||||
{
|
||||
gboolean ret;
|
||||
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
|
||||
gsize length;
|
||||
gchar **uuids;
|
||||
const gchar **new_uuids;
|
||||
|
||||
if (!uuid_is_valid (uuid_str))
|
||||
{
|
||||
g_free (uuid_str);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
uuids = g_settings_get_strv (obj->settings, ENABLED_EXTENSIONS_KEY);
|
||||
length = g_strv_length (uuids);
|
||||
|
||||
if (enabled)
|
||||
{
|
||||
new_uuids = g_new (const gchar *, length + 2); /* New key, NULL */
|
||||
memcpy (new_uuids, uuids, length * sizeof (*new_uuids));
|
||||
new_uuids[length] = uuid_str;
|
||||
new_uuids[length + 1] = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
gsize i = 0, j = 0;
|
||||
new_uuids = g_new (const gchar *, length);
|
||||
for (i = 0; i < length; i ++)
|
||||
{
|
||||
if (g_str_equal (uuids[i], uuid_str))
|
||||
continue;
|
||||
|
||||
new_uuids[j] = uuids[i];
|
||||
j++;
|
||||
}
|
||||
|
||||
new_uuids[j] = NULL;
|
||||
}
|
||||
|
||||
ret = g_settings_set_strv (obj->settings,
|
||||
ENABLED_EXTENSIONS_KEY,
|
||||
new_uuids);
|
||||
|
||||
g_strfreev (uuids);
|
||||
g_free (new_uuids);
|
||||
g_free (uuid_str);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
plugin_install_extension (PluginObject *obj,
|
||||
NPString uuid)
|
||||
{
|
||||
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
|
||||
|
||||
if (!uuid_is_valid (uuid_str))
|
||||
{
|
||||
g_free (uuid_str);
|
||||
@ -500,7 +560,7 @@ plugin_enable_extension (PluginObject *obj,
|
||||
}
|
||||
|
||||
g_dbus_proxy_call (obj->proxy,
|
||||
(enabled ? "EnableExtension" : "DisableExtension"),
|
||||
"InstallRemoteExtension",
|
||||
g_variant_new ("(s)", uuid_str),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, /* timeout */
|
||||
@ -513,40 +573,6 @@ plugin_enable_extension (PluginObject *obj,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
plugin_install_extension (PluginObject *obj,
|
||||
NPString uuid,
|
||||
NPString version_tag)
|
||||
{
|
||||
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
|
||||
gchar *version_tag_str;
|
||||
|
||||
if (!uuid_is_valid (uuid_str))
|
||||
{
|
||||
g_free (uuid_str);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
version_tag_str = g_strndup (version_tag.UTF8Characters,
|
||||
version_tag.UTF8Length);
|
||||
|
||||
g_dbus_proxy_call (obj->proxy,
|
||||
"InstallRemoteExtension",
|
||||
g_variant_new ("(ss)",
|
||||
uuid_str,
|
||||
version_tag_str),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, /* timeout */
|
||||
NULL, /* cancellable */
|
||||
NULL, /* callback */
|
||||
NULL /* user_data */);
|
||||
|
||||
g_free (uuid_str);
|
||||
g_free (version_tag_str);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
plugin_uninstall_extension (PluginObject *obj,
|
||||
NPString uuid,
|
||||
@ -771,11 +797,9 @@ plugin_object_invoke (NPObject *npobj,
|
||||
else if (name == install_extension_id)
|
||||
{
|
||||
if (!NPVARIANT_IS_STRING(args[0])) return FALSE;
|
||||
if (!NPVARIANT_IS_STRING(args[1])) return FALSE;
|
||||
|
||||
return plugin_install_extension (obj,
|
||||
NPVARIANT_TO_STRING(args[0]),
|
||||
NPVARIANT_TO_STRING(args[1]));
|
||||
NPVARIANT_TO_STRING(args[0]));
|
||||
}
|
||||
else if (name == uninstall_extension_id)
|
||||
{
|
||||
@ -946,3 +970,12 @@ NPP_GetValue(NPP instance,
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
/* Opera tries to call NPP_SetWindow without checking the
|
||||
* NULL pointer beforehand. */
|
||||
NPError
|
||||
NPP_SetWindow(NPP instance,
|
||||
NPWindow *window)
|
||||
{
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
35
configure.ac
35
configure.ac
@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.4.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[3.5.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||
CLUTTER_MIN_VERSION=1.9.16
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||
GJS_MIN_VERSION=1.29.18
|
||||
MUTTER_MIN_VERSION=3.4.1
|
||||
MUTTER_MIN_VERSION=3.5.2
|
||||
FOLKS_MIN_VERSION=0.5.2
|
||||
GTK_MIN_VERSION=3.3.9
|
||||
GIO_MIN_VERSION=2.31.6
|
||||
@ -75,6 +75,7 @@ TELEPATHY_LOGGER_MIN_VERSION=0.2.4
|
||||
POLKIT_MIN_VERSION=0.100
|
||||
STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
||||
GCR_MIN_VERSION=3.3.90
|
||||
GNOME_DESKTOP_REQUIRED_VERSION=3.5.1
|
||||
|
||||
# Collect more than 20 libraries for a prize!
|
||||
PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
@ -95,7 +96,8 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||
libnm-glib libnm-util gnome-keyring-1
|
||||
gcr-3 >= $GCR_MIN_VERSION)
|
||||
gcr-3 >= $GCR_MIN_VERSION
|
||||
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
|
||||
|
||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||
|
||||
@ -121,7 +123,7 @@ 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.2 x11)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 0.1.7)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.1)
|
||||
|
||||
AC_MSG_CHECKING([for bluetooth support])
|
||||
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||
@ -237,31 +239,6 @@ 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)
|
||||
AM_CONDITIONAL(USE_JHBUILD_WRAPPER_SCRIPT, test "x$enable_jhbuild_wrapper_script" = xyes)
|
||||
|
||||
AC_MSG_CHECKING([location of system Certificate Authority list])
|
||||
AC_ARG_WITH(ca-certificates,
|
||||
[AC_HELP_STRING([--with-ca-certificates=@<:@path@:>@],
|
||||
[path to system Certificate Authority list])])
|
||||
|
||||
if test "$with_ca_certificates" = "no"; then
|
||||
AC_MSG_RESULT([disabled])
|
||||
else
|
||||
if test -z "$with_ca_certificates"; then
|
||||
for f in /etc/pki/tls/certs/ca-bundle.crt \
|
||||
/etc/ssl/certs/ca-certificates.crt; do
|
||||
if test -f "$f"; then
|
||||
with_ca_certificates="$f"
|
||||
fi
|
||||
done
|
||||
if test -z "$with_ca_certificates"; then
|
||||
AC_MSG_ERROR([could not find. Use --with-ca-certificates=path to set, or --without-ca-certificates to disable])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_MSG_RESULT($with_ca_certificates)
|
||||
AC_DEFINE_UNQUOTED(SHELL_SYSTEM_CA_FILE, ["$with_ca_certificates"], [The system TLS CA list])
|
||||
fi
|
||||
AC_SUBST(SHELL_SYSTEM_CA_FILE,["$with_ca_certificates"])
|
||||
|
||||
BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
|
||||
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
|
||||
|
||||
|
@ -1948,10 +1948,12 @@ StScrollBar StButton#vhandle:hover
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
/* intentionally left transparent to avoid dialog changing size */
|
||||
.hidden {
|
||||
color: rgba(0,0,0,0);
|
||||
}
|
||||
|
||||
.prompt-dialog-null-label {
|
||||
font-size: 10pt;
|
||||
color: rgba(0,0,0,0);
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,6 @@ nobase_dist_js_DATA = \
|
||||
misc/config.js \
|
||||
misc/extensionUtils.js \
|
||||
misc/fileUtils.js \
|
||||
misc/format.js \
|
||||
misc/gnomeSession.js \
|
||||
misc/history.js \
|
||||
misc/jsParse.js \
|
||||
@ -67,6 +66,7 @@ nobase_dist_js_DATA = \
|
||||
ui/messageTray.js \
|
||||
ui/modalDialog.js \
|
||||
ui/networkAgent.js \
|
||||
ui/sessionMode.js \
|
||||
ui/shellEntry.js \
|
||||
ui/shellMountOperation.js \
|
||||
ui/notificationDaemon.js \
|
||||
|
@ -6,11 +6,11 @@ const GObject = imports.gi.GObject;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Format = imports.format;
|
||||
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const Format = imports.misc.format;
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
|
||||
|
||||
@ -210,7 +210,7 @@ const Application = new Lang.Class({
|
||||
try {
|
||||
extension = ExtensionUtils.createExtensionObject(uuid, dir, type);
|
||||
} catch(e) {
|
||||
global.logError('' + e);
|
||||
logError(e, 'Could not create extensions object');
|
||||
return;
|
||||
}
|
||||
|
||||
@ -257,7 +257,7 @@ function initEnvironment() {
|
||||
},
|
||||
|
||||
logError: function(s) {
|
||||
global.log('ERROR: ' + s);
|
||||
log('ERROR: ' + s);
|
||||
},
|
||||
|
||||
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
|
||||
|
@ -8,8 +8,6 @@ const PACKAGE_VERSION = '@PACKAGE_VERSION@';
|
||||
const GJS_VERSION = '@GJS_VERSION@';
|
||||
/* 1 if gnome-bluetooth is available, 0 otherwise */
|
||||
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
|
||||
/* The system TLS CA list */
|
||||
const SHELL_SYSTEM_CA_FILE = '@SHELL_SYSTEM_CA_FILE@';
|
||||
/* gettext package */
|
||||
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
|
||||
/* locale dir */
|
||||
|
@ -40,13 +40,18 @@ function getCurrentExtension() {
|
||||
throw new Error('Could not find current extension');
|
||||
|
||||
let path = match[1];
|
||||
let uuid = GLib.path_get_basename(GLib.path_get_dirname(path));
|
||||
let file = Gio.File.new_for_path(path);
|
||||
|
||||
let extension = extensions[uuid];
|
||||
if (extension === undefined)
|
||||
throw new Error('Could not find current extension');
|
||||
// Walk up the directory tree, looking for an extesion with
|
||||
// the same UUID as a directory name.
|
||||
while (file != null) {
|
||||
let extension = extensions[file.get_basename()];
|
||||
if (extension !== undefined)
|
||||
return extension;
|
||||
file = file.get_parent();
|
||||
}
|
||||
|
||||
return extension;
|
||||
throw new Error('Could not find current extension');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -120,7 +125,7 @@ function createExtensionObject(uuid, dir, type) {
|
||||
|
||||
// Encourage people to add this
|
||||
if (!meta.url) {
|
||||
global.log('Warning: Missing "url" property in metadata.json');
|
||||
log('Warning: Missing "url" property in %s/metadata.json'.format(uuid));
|
||||
}
|
||||
|
||||
if (uuid != meta.uuid) {
|
||||
@ -157,7 +162,7 @@ function init() {
|
||||
if (!userExtensionsDir.query_exists(null))
|
||||
userExtensionsDir.make_directory_with_parents(null);
|
||||
} catch (e) {
|
||||
global.logError('' + e);
|
||||
logError(e, 'Could not create extensions directory');
|
||||
}
|
||||
}
|
||||
|
||||
@ -167,7 +172,7 @@ function scanExtensionsInDirectory(callback, dir, type) {
|
||||
try {
|
||||
fileEnum = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
|
||||
} catch(e) {
|
||||
global.logError('' + e);
|
||||
logError(e, 'Could not enumerate extensions directory');
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,71 +0,0 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const ShellJS = imports.gi.ShellJS;
|
||||
|
||||
/*
|
||||
* This function is intended to extend the String object and provide
|
||||
* an String.format API for string formatting.
|
||||
* It has to be set up using String.prototype.format = Format.format;
|
||||
* Usage:
|
||||
* "somestring %s %d".format('hello', 5);
|
||||
* It supports %s, %d, %x and %f, for %f it also support precisions like
|
||||
* "%.2f".format(1.526). All specifiers can be prefixed with a minimum
|
||||
* field width, e.g. "%5s".format("foo"). Unless the width is prefixed
|
||||
* with '0', the formatted string will be padded with spaces.
|
||||
*/
|
||||
|
||||
function format() {
|
||||
let str = this;
|
||||
let i = 0;
|
||||
let args = arguments;
|
||||
|
||||
return str.replace(/%(I+)?([0-9]+)?(?:\.([0-9]+))?(.)/g, function (str, flagsGroup, widthGroup, precisionGroup, genericGroup) {
|
||||
|
||||
if (precisionGroup != '' && genericGroup != 'f')
|
||||
throw new Error("Precision can only be specified for 'f'");
|
||||
|
||||
let hasAlternativeIntFlag = (flagsGroup.indexOf('I') != -1);
|
||||
|
||||
if (hasAlternativeIntFlag && genericGroup != 'd')
|
||||
throw new Error("Alternative output digits can only be specfied for 'd'");
|
||||
|
||||
let fillChar = (widthGroup[0] == '0') ? '0' : ' ';
|
||||
let width = parseInt(widthGroup, 10) || 0;
|
||||
|
||||
function fillWidth(s, c, w) {
|
||||
let fill = '';
|
||||
for (let i = 0; i < w; i++)
|
||||
fill += c;
|
||||
return fill.substr(s.length) + s;
|
||||
}
|
||||
|
||||
let s = '';
|
||||
switch (genericGroup) {
|
||||
case '%':
|
||||
return '%';
|
||||
break;
|
||||
case 's':
|
||||
s = args[i++].toString();
|
||||
break;
|
||||
case 'd':
|
||||
let intV = parseInt(args[i++]);
|
||||
if (hasAlternativeIntFlag)
|
||||
s = ShellJS.format_int_alternative_output(intV);
|
||||
else
|
||||
s = intV.toString();
|
||||
break;
|
||||
case 'x':
|
||||
s = parseInt(args[i++]).toString(16);
|
||||
break;
|
||||
case 'f':
|
||||
if (precisionGroup == '')
|
||||
s = parseFloat(args[i++]).toString();
|
||||
else
|
||||
s = parseFloat(args[i++]).toFixed(parseInt(precisionGroup));
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unsupported conversion character %' + genericGroup);
|
||||
}
|
||||
return fillWidth(s, fillChar, width);
|
||||
});
|
||||
}
|
@ -63,7 +63,7 @@ const Contact = new Lang.Class({
|
||||
this.individual.full_name ||
|
||||
this.individual.nickname ||
|
||||
email ||
|
||||
_("Unknown");
|
||||
C_("contact", "Unknown");
|
||||
let aliasLabel = new St.Label({ text: aliasText,
|
||||
style_class: 'contact-details-alias' });
|
||||
details.add(aliasLabel, { x_fill: true,
|
||||
|
@ -45,9 +45,7 @@ const DateMenuButton = new Lang.Class({
|
||||
Name: 'DateMenuButton',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function(params) {
|
||||
params = Params.parse(params, { showEvents: true });
|
||||
|
||||
_init: function() {
|
||||
let item;
|
||||
let hbox;
|
||||
let vbox;
|
||||
@ -79,7 +77,7 @@ const DateMenuButton = new Lang.Class({
|
||||
this._date.style_class = 'datemenu-date-label';
|
||||
vbox.add(this._date);
|
||||
|
||||
if (params.showEvents) {
|
||||
if (Main.sessionMode.showCalendarEvents) {
|
||||
this._eventSource = new Calendar.DBusEventSource();
|
||||
this._eventList = new Calendar.EventsList(this._eventSource);
|
||||
} else {
|
||||
@ -110,7 +108,7 @@ const DateMenuButton = new Lang.Class({
|
||||
item.actor.reparent(vbox);
|
||||
}
|
||||
|
||||
if (params.showEvents) {
|
||||
if (Main.sessionMode.showCalendarEvents) {
|
||||
// Add vertical separator
|
||||
|
||||
item = new St.DrawingArea({ style_class: 'calendar-vertical-separator',
|
||||
|
@ -342,7 +342,7 @@ const EndSessionDialog = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_updateContent: function() {
|
||||
_updateDescription: function() {
|
||||
if (this.state != ModalDialog.State.OPENING &&
|
||||
this.state != ModalDialog.State.OPENED)
|
||||
return;
|
||||
@ -352,17 +352,6 @@ const EndSessionDialog = new Lang.Class({
|
||||
let subject = dialogContent.subject;
|
||||
let description;
|
||||
|
||||
if (this._user.is_loaded && !dialogContent.iconName) {
|
||||
let iconFile = this._user.get_icon_file();
|
||||
if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
|
||||
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
|
||||
else
|
||||
this._setIconFromName('avatar-default', dialogContent.iconStyleClass);
|
||||
} else if (dialogContent.iconName) {
|
||||
this._setIconFromName(dialogContent.iconName,
|
||||
dialogContent.iconStyleClass);
|
||||
}
|
||||
|
||||
if (this._inhibitors.length > 0) {
|
||||
this._stopTimer();
|
||||
description = dialogContent.inhibitedDescription;
|
||||
@ -395,6 +384,27 @@ const EndSessionDialog = new Lang.Class({
|
||||
_setLabelText(this._descriptionLabel, description);
|
||||
},
|
||||
|
||||
_updateContent: function() {
|
||||
if (this.state != ModalDialog.State.OPENING &&
|
||||
this.state != ModalDialog.State.OPENED)
|
||||
return;
|
||||
|
||||
let dialogContent = DialogContent[this._type];
|
||||
|
||||
if (this._user.is_loaded && !dialogContent.iconName) {
|
||||
let iconFile = this._user.get_icon_file();
|
||||
if (GLib.file_test(iconFile, GLib.FileTest.EXISTS))
|
||||
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
|
||||
else
|
||||
this._setIconFromName('avatar-default', dialogContent.iconStyleClass);
|
||||
} else if (dialogContent.iconName) {
|
||||
this._setIconFromName(dialogContent.iconName,
|
||||
dialogContent.iconStyleClass);
|
||||
}
|
||||
|
||||
this._updateDescription();
|
||||
},
|
||||
|
||||
_updateButtons: function() {
|
||||
let dialogContent = DialogContent[this._type];
|
||||
let buttons = [{ action: Lang.bind(this, this.cancel),
|
||||
@ -441,7 +451,7 @@ const EndSessionDialog = new Lang.Class({
|
||||
{ _secondsLeft: 0,
|
||||
time: this._secondsLeft,
|
||||
transition: 'linear',
|
||||
onUpdate: Lang.bind(this, this._updateContent),
|
||||
onUpdate: Lang.bind(this, this._updateDescription),
|
||||
onComplete: Lang.bind(this, function() {
|
||||
let dialogContent = DialogContent[this._type];
|
||||
let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1];
|
||||
|
@ -90,7 +90,7 @@ function init() {
|
||||
}
|
||||
|
||||
// OK, now things are initialized enough that we can import shell JS
|
||||
const Format = imports.misc.format;
|
||||
const Format = imports.format;
|
||||
const Tweener = imports.ui.tweener;
|
||||
|
||||
Tweener.init();
|
||||
|
@ -34,24 +34,11 @@ const REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
|
||||
const REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
|
||||
const REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/';
|
||||
|
||||
const _httpSession = new Soup.SessionAsync();
|
||||
const _httpSession = new Soup.SessionAsync({ ssl_use_system_ca_file: true });
|
||||
|
||||
// The unfortunate state of gjs, gobject-introspection and libsoup
|
||||
// means that I have to do a hack to add a feature.
|
||||
// See: https://bugzilla.gnome.org/show_bug.cgi?id=655189 for context.
|
||||
|
||||
if (Soup.Session.prototype.add_feature != null)
|
||||
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
|
||||
|
||||
function _getCertFile() {
|
||||
let localCert = GLib.build_filenamev([global.userdatadir, 'extensions.gnome.org.crt']);
|
||||
if (GLib.file_test(localCert, GLib.FileTest.EXISTS))
|
||||
return localCert;
|
||||
else
|
||||
return Config.SHELL_SYSTEM_CA_FILE;
|
||||
}
|
||||
|
||||
_httpSession.ssl_ca_file = _getCertFile();
|
||||
// _httpSession.add_feature(new Soup.ProxyResolverDefault());
|
||||
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
|
||||
|
||||
// Arrays of uuids
|
||||
var enabledExtensions;
|
||||
@ -69,18 +56,16 @@ const disconnect = Lang.bind(_signals, _signals.disconnect);
|
||||
|
||||
const ENABLED_EXTENSIONS_KEY = 'enabled-extensions';
|
||||
|
||||
function installExtensionFromUUID(uuid, version_tag) {
|
||||
function installExtensionFromUUID(uuid) {
|
||||
let params = { uuid: uuid,
|
||||
version_tag: version_tag,
|
||||
shell_version: Config.PACKAGE_VERSION,
|
||||
api_version: API_VERSION.toString() };
|
||||
shell_version: Config.PACKAGE_VERSION };
|
||||
|
||||
let message = Soup.form_request_new_from_hash('GET', REPOSITORY_URL_INFO, params);
|
||||
|
||||
_httpSession.queue_message(message,
|
||||
function(session, message) {
|
||||
let info = JSON.parse(message.response_body.data);
|
||||
let dialog = new InstallExtensionDialog(uuid, version_tag, info.name);
|
||||
let dialog = new InstallExtensionDialog(uuid, info);
|
||||
dialog.open(global.get_current_time());
|
||||
});
|
||||
}
|
||||
@ -115,21 +100,13 @@ function gotExtensionZipFile(session, message, uuid) {
|
||||
return;
|
||||
}
|
||||
|
||||
// FIXME: use a GFile mkstemp-type method once one exists
|
||||
let fd, tmpzip;
|
||||
try {
|
||||
[fd, tmpzip] = GLib.file_open_tmp('XXXXXX.shell-extension.zip');
|
||||
} catch (e) {
|
||||
logExtensionError(uuid, 'tempfile: ' + e.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
let stream = new Gio.UnixOutputStream({ fd: fd });
|
||||
let [file, stream] = Gio.File.new_tmp('XXXXXX.shell-extension.zip');
|
||||
let dir = ExtensionUtils.userExtensionsDir.get_child(uuid);
|
||||
Shell.write_soup_message_to_stream(stream, message);
|
||||
let contents = message.response_body.flatten().as_bytes();
|
||||
stream.output_stream.write_bytes(contents, null);
|
||||
stream.close(null);
|
||||
let [success, pid] = GLib.spawn_async(null,
|
||||
['unzip', '-uod', dir.get_path(), '--', tmpzip],
|
||||
['unzip', '-uod', dir.get_path(), '--', file.get_path()],
|
||||
null,
|
||||
GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD,
|
||||
null);
|
||||
@ -237,7 +214,7 @@ function logExtensionError(uuid, message, state) {
|
||||
extension.errors = [];
|
||||
|
||||
extension.errors.push(message);
|
||||
global.logError('Extension "%s" had error: %s'.format(uuid, message));
|
||||
log('Extension "%s" had error: %s'.format(uuid, message));
|
||||
state = state || ExtensionState.ERROR;
|
||||
_signals.emit('extension-state-changed', { uuid: uuid,
|
||||
error: message,
|
||||
@ -249,7 +226,7 @@ function loadExtension(dir, type, enabled) {
|
||||
let extension;
|
||||
|
||||
if (ExtensionUtils.extensions[uuid] != undefined) {
|
||||
global.logError('Extension "%s" is already loaded'.format(uuid));
|
||||
log('Extension "%s" is already loaded'.format(uuid));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -278,7 +255,6 @@ function loadExtension(dir, type, enabled) {
|
||||
}
|
||||
|
||||
_signals.emit('extension-state-changed', extension);
|
||||
global.log('Loaded extension ' + uuid);
|
||||
}
|
||||
|
||||
function initExtension(uuid) {
|
||||
@ -390,12 +366,11 @@ const InstallExtensionDialog = new Lang.Class({
|
||||
Name: 'InstallExtensionDialog',
|
||||
Extends: ModalDialog.ModalDialog,
|
||||
|
||||
_init: function(uuid, version_tag, name) {
|
||||
_init: function(uuid, info) {
|
||||
this.parent({ styleClass: 'extension-dialog' });
|
||||
|
||||
this._uuid = uuid;
|
||||
this._version_tag = version_tag;
|
||||
this._name = name;
|
||||
this._info = info;
|
||||
|
||||
this.setButtons([{ label: _("Cancel"),
|
||||
action: Lang.bind(this, this._onCancelButtonPressed),
|
||||
@ -405,13 +380,17 @@ const InstallExtensionDialog = new Lang.Class({
|
||||
action: Lang.bind(this, this._onInstallButtonPressed)
|
||||
}]);
|
||||
|
||||
let message = _("Download and install '%s' from extensions.gnome.org?").format(name);
|
||||
let message = _("Download and install '%s' from extensions.gnome.org?").format(info.name);
|
||||
|
||||
this._descriptionLabel = new St.Label({ text: message });
|
||||
let box = new St.BoxLayout();
|
||||
this.contentLayout.add(box);
|
||||
|
||||
this.contentLayout.add(this._descriptionLabel,
|
||||
{ y_fill: true,
|
||||
y_align: St.Align.START });
|
||||
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_uri(REPOSITORY_URL_BASE + info.icon) })
|
||||
let icon = new St.Icon({ gicon: gicon });
|
||||
box.add(icon);
|
||||
|
||||
let label = new St.Label({ text: message });
|
||||
box.add(label);
|
||||
},
|
||||
|
||||
_onCancelButtonPressed: function(button, event) {
|
||||
@ -435,9 +414,7 @@ const InstallExtensionDialog = new Lang.Class({
|
||||
|
||||
_signals.emit('extension-state-changed', state);
|
||||
|
||||
let params = { version_tag: this._version_tag,
|
||||
shell_version: Config.PACKAGE_VERSION,
|
||||
api_version: API_VERSION.toString() };
|
||||
let params = { shell_version: Config.PACKAGE_VERSION };
|
||||
|
||||
let url = REPOSITORY_URL_DOWNLOAD.format(this._uuid);
|
||||
let message = Soup.form_request_new_from_hash('GET', url, params);
|
||||
|
@ -282,6 +282,10 @@ const IconGrid = new Lang.Class({
|
||||
return this._computeLayout(rowWidth)[0];
|
||||
},
|
||||
|
||||
getRowLimit: function() {
|
||||
return this._rowLimit;
|
||||
},
|
||||
|
||||
_computeLayout: function (forWidth) {
|
||||
let nColumns = 0;
|
||||
let usedWidth = 0;
|
||||
|
108
js/ui/main.js
108
js/ui/main.js
@ -30,6 +30,7 @@ const NetworkAgent = imports.ui.networkAgent;
|
||||
const NotificationDaemon = imports.ui.notificationDaemon;
|
||||
const WindowAttentionHandler = imports.ui.windowAttentionHandler;
|
||||
const Scripting = imports.ui.scripting;
|
||||
const SessionMode = imports.ui.sessionMode;
|
||||
const ShellDBus = imports.ui.shellDBus;
|
||||
const TelepathyClient = imports.ui.telepathyClient;
|
||||
const WindowManager = imports.ui.windowManager;
|
||||
@ -56,6 +57,7 @@ let windowAttentionHandler = null;
|
||||
let telepathyClient = null;
|
||||
let ctrlAltTabManager = null;
|
||||
let recorder = null;
|
||||
let sessionMode = null;
|
||||
let shellDBusService = null;
|
||||
let modalCount = 0;
|
||||
let modalActorFocusStack = [];
|
||||
@ -69,12 +71,11 @@ let networkAgent = null;
|
||||
let _startDate;
|
||||
let _defaultCssStylesheet = null;
|
||||
let _cssStylesheet = null;
|
||||
let _gdmCssStylesheet = null;
|
||||
let _overridesSettings = null;
|
||||
|
||||
let background = null;
|
||||
|
||||
function _createUserSession() {
|
||||
function createUserSession() {
|
||||
// Load the calendar server. Note that we are careful about
|
||||
// not loading any events until the user presses the clock
|
||||
global.launch_calendar_server();
|
||||
@ -83,9 +84,11 @@ function _createUserSession() {
|
||||
automountManager = new AutomountManager.AutomountManager();
|
||||
autorunManager = new AutorunManager.AutorunManager();
|
||||
networkAgent = new NetworkAgent.NetworkAgent();
|
||||
|
||||
_initRecorder();
|
||||
}
|
||||
|
||||
function _createGDMSession() {
|
||||
function createGDMSession() {
|
||||
// We do this this here instead of at the top to prevent GDM
|
||||
// related code from getting loaded in normal user sessions
|
||||
const LoginDialog = imports.gdm.loginDialog;
|
||||
@ -96,8 +99,13 @@ function _createGDMSession() {
|
||||
});
|
||||
}
|
||||
|
||||
function createInitialSetupSession() {
|
||||
networkAgent = new NetworkAgent.NetworkAgent();
|
||||
}
|
||||
|
||||
function _initRecorder() {
|
||||
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
|
||||
let desktopLockdownSettings = new Gio.Settings({ schema: 'org.gnome.desktop.lockdown' });
|
||||
let bindingSettings = new Gio.Settings({ schema: 'org.gnome.shell.keybindings' });
|
||||
|
||||
global.display.add_keybinding('toggle-recording',
|
||||
@ -110,7 +118,7 @@ function _initRecorder() {
|
||||
if (recorder.is_recording()) {
|
||||
recorder.close();
|
||||
Meta.enable_unredirect_for_screen(global.screen);
|
||||
} else {
|
||||
} else if (!desktopLockdownSettings.get_boolean('disable-save-to-disk')) {
|
||||
// read the parameters from GSettings always in case they have changed
|
||||
recorder.set_framerate(recorderSettings.get_int('framerate'));
|
||||
/* Translators: this is a filename used for screencast recording */
|
||||
@ -129,26 +137,6 @@ function _initRecorder() {
|
||||
});
|
||||
}
|
||||
|
||||
function _initUserSession() {
|
||||
_initRecorder();
|
||||
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT, false, -1, 1);
|
||||
|
||||
ExtensionSystem.init();
|
||||
ExtensionSystem.loadExtensions();
|
||||
|
||||
Meta.keybindings_set_custom_handler('panel-run-dialog', function() {
|
||||
getRunDialog().open();
|
||||
});
|
||||
|
||||
Meta.keybindings_set_custom_handler('panel-main-menu', function () {
|
||||
overview.toggle();
|
||||
});
|
||||
|
||||
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
|
||||
|
||||
}
|
||||
|
||||
function start() {
|
||||
// These are here so we don't break compatibility.
|
||||
global.logError = window.log;
|
||||
@ -159,6 +147,7 @@ function start() {
|
||||
|
||||
Gio.DesktopAppInfo.set_desktop_env('GNOME');
|
||||
|
||||
sessionMode = new SessionMode.SessionMode();
|
||||
shellDBusService = new ShellDBus.GnomeShell();
|
||||
|
||||
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
||||
@ -181,7 +170,6 @@ function start() {
|
||||
global.stage.no_clear_hint = true;
|
||||
|
||||
_defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css';
|
||||
_gdmCssStylesheet = global.datadir + '/theme/gdm.css';
|
||||
loadTheme();
|
||||
|
||||
// Set up stage hierarchy to group all UI actors under one container.
|
||||
@ -209,8 +197,7 @@ function start() {
|
||||
layoutManager = new Layout.LayoutManager();
|
||||
xdndHandler = new XdndHandler.XdndHandler();
|
||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||
// This overview object is just a stub for non-user sessions
|
||||
overview = new Overview.Overview({ isDummy: global.session_type != Shell.SessionType.USER });
|
||||
overview = new Overview.Overview();
|
||||
magnifier = new Magnifier.Magnifier();
|
||||
statusIconDispatcher = new StatusIconDispatcher.StatusIconDispatcher();
|
||||
panel = new Panel.Panel();
|
||||
@ -220,10 +207,7 @@ function start() {
|
||||
notificationDaemon = new NotificationDaemon.NotificationDaemon();
|
||||
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
|
||||
|
||||
if (global.session_type == Shell.SessionType.USER)
|
||||
_createUserSession();
|
||||
else if (global.session_type == Shell.SessionType.GDM)
|
||||
_createGDMSession();
|
||||
sessionMode.createSession();
|
||||
|
||||
panel.startStatusArea();
|
||||
|
||||
@ -231,8 +215,30 @@ function start() {
|
||||
keyboard.init();
|
||||
overview.init();
|
||||
|
||||
if (global.session_type == Shell.SessionType.USER)
|
||||
_initUserSession();
|
||||
if (sessionMode.hasWorkspaces)
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||
false, -1, 1);
|
||||
|
||||
if (sessionMode.allowExtensions) {
|
||||
ExtensionSystem.init();
|
||||
ExtensionSystem.loadExtensions();
|
||||
}
|
||||
|
||||
if (sessionMode.hasRunDialog) {
|
||||
Meta.keybindings_set_custom_handler('panel-run-dialog', function() {
|
||||
getRunDialog().open();
|
||||
});
|
||||
}
|
||||
|
||||
if (sessionMode.hasOverview) {
|
||||
Meta.keybindings_set_custom_handler('panel-main-menu', function () {
|
||||
overview.toggle();
|
||||
});
|
||||
|
||||
global.display.connect('overlay-key',
|
||||
Lang.bind(overview, overview.toggle));
|
||||
}
|
||||
|
||||
statusIconDispatcher.start(messageTray.actor);
|
||||
|
||||
// Provide the bus object for gnome-session to
|
||||
@ -491,8 +497,8 @@ function loadTheme() {
|
||||
|
||||
let theme = new St.Theme ({ application_stylesheet: cssStylesheet });
|
||||
|
||||
if (global.session_type == Shell.SessionType.GDM)
|
||||
theme.load_stylesheet(_gdmCssStylesheet);
|
||||
if (sessionMode.extraStylesheet)
|
||||
theme.load_stylesheet(sessionMode.extraStylesheet);
|
||||
|
||||
if (previousTheme) {
|
||||
let customStylesheets = previousTheme.get_custom_stylesheets();
|
||||
@ -556,6 +562,11 @@ function _globalKeyPressHandler(actor, event) {
|
||||
if (event.type() != Clutter.EventType.KEY_PRESS)
|
||||
return false;
|
||||
|
||||
if (!sessionMode.allowKeybindingsWhenModal) {
|
||||
if (modalCount > (overview.visible ? 1 : 0))
|
||||
return false;
|
||||
}
|
||||
|
||||
let symbol = event.get_key_symbol();
|
||||
let keyCode = event.get_key_code();
|
||||
let ignoredModifiers = global.display.get_ignored_modifier_mask();
|
||||
@ -564,11 +575,6 @@ function _globalKeyPressHandler(actor, event) {
|
||||
// This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType
|
||||
let action = global.display.get_keybinding_action(keyCode, modifierState);
|
||||
|
||||
// Other bindings are only available to the user session when the overview is up and
|
||||
// no modal dialog is present.
|
||||
if (global.session_type == Shell.SessionType.USER && (!overview.visible || modalCount > 1))
|
||||
return false;
|
||||
|
||||
// This isn't a Meta.KeyBindingAction yet
|
||||
if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) {
|
||||
overview.hide();
|
||||
@ -581,28 +587,39 @@ function _globalKeyPressHandler(actor, event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// None of the other bindings are relevant outside of the user's session
|
||||
if (global.session_type != Shell.SessionType.USER)
|
||||
return false;
|
||||
|
||||
switch (action) {
|
||||
// left/right would effectively act as synonyms for up/down if we enabled them;
|
||||
// but that could be considered confusing; we also disable them in the main view.
|
||||
//
|
||||
// case Meta.KeyBindingAction.WORKSPACE_LEFT:
|
||||
// if (!sessionMode.hasWorkspaces)
|
||||
// return false;
|
||||
//
|
||||
// wm.actionMoveWorkspaceLeft();
|
||||
// return true;
|
||||
// case Meta.KeyBindingAction.WORKSPACE_RIGHT:
|
||||
// if (!sessionMode.hasWorkspaces)
|
||||
// return false;
|
||||
//
|
||||
// wm.actionMoveWorkspaceRight();
|
||||
// return true;
|
||||
case Meta.KeyBindingAction.WORKSPACE_UP:
|
||||
if (!sessionMode.hasWorkspaces)
|
||||
return false;
|
||||
|
||||
wm.actionMoveWorkspaceUp();
|
||||
return true;
|
||||
case Meta.KeyBindingAction.WORKSPACE_DOWN:
|
||||
if (!sessionMode.hasWorkspaces)
|
||||
return false;
|
||||
|
||||
wm.actionMoveWorkspaceDown();
|
||||
return true;
|
||||
case Meta.KeyBindingAction.PANEL_RUN_DIALOG:
|
||||
case Meta.KeyBindingAction.COMMAND_2:
|
||||
if (!sessionMode.hasRunDialog)
|
||||
return false;
|
||||
|
||||
getRunDialog().open();
|
||||
return true;
|
||||
case Meta.KeyBindingAction.PANEL_MAIN_MENU:
|
||||
@ -875,7 +892,8 @@ function initializeDeferredWork(actor, callback, props) {
|
||||
function queueDeferredWork(workId) {
|
||||
let data = _deferredWorkData[workId];
|
||||
if (!data) {
|
||||
global.logError('invalid work id ', workId);
|
||||
let message = 'Invalid work id %d'.format(workId);
|
||||
logError(new Error(message), message);
|
||||
return;
|
||||
}
|
||||
if (_deferredWorkQueue.indexOf(workId) < 0)
|
||||
|
@ -221,12 +221,19 @@ const NotificationDaemon = new Lang.Class({
|
||||
let [appName, replacesId, icon, summary, body, actions, hints, timeout] = params;
|
||||
let id;
|
||||
|
||||
for (let hint in hints) {
|
||||
// unpack the variants
|
||||
hints[hint] = hints[hint].deep_unpack();
|
||||
}
|
||||
|
||||
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
|
||||
|
||||
// Filter out chat, presence, calls and invitation notifications from
|
||||
// Empathy, since we handle that information from telepathyClient.js
|
||||
if (appName == 'Empathy' && (hints['category'] == 'im.received' ||
|
||||
hints['category'] == 'x-empathy.im.room-invitation' ||
|
||||
hints['category'] == 'x-empathy.call.incoming' ||
|
||||
hints['category'] == 'x-empathy.call.incoming"' ||
|
||||
hints['category'] == 'x-empathy.transfer.incoming' ||
|
||||
hints['category'] == 'x-empathy.im.subscription-request' ||
|
||||
hints['category'] == 'presence.online' ||
|
||||
hints['category'] == 'presence.offline')) {
|
||||
@ -249,13 +256,6 @@ const NotificationDaemon = new Lang.Class({
|
||||
}
|
||||
}
|
||||
|
||||
for (let hint in hints) {
|
||||
// unpack the variants
|
||||
hints[hint] = hints[hint].deep_unpack();
|
||||
}
|
||||
|
||||
hints = Params.parse(hints, { urgency: Urgency.NORMAL }, true);
|
||||
|
||||
// Be compatible with the various hints for image data and image path
|
||||
// 'image-data' and 'image-path' are the latest name of these hints, introduced in 1.2
|
||||
|
||||
@ -483,7 +483,7 @@ const NotificationDaemon = new Lang.Class({
|
||||
},
|
||||
|
||||
_onTrayIconAdded: function(o, icon) {
|
||||
let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null, null, icon);
|
||||
let source = this._getSource(icon.title || icon.wm_class || C_("program", "Unknown"), icon.pid, null, null, icon);
|
||||
},
|
||||
|
||||
_onTrayIconRemoved: function(o, icon) {
|
||||
|
@ -99,10 +99,8 @@ const ShellInfo = new Lang.Class({
|
||||
const Overview = new Lang.Class({
|
||||
Name: 'Overview',
|
||||
|
||||
_init : function(params) {
|
||||
params = Params.parse(params, { isDummy: false });
|
||||
|
||||
this.isDummy = params.isDummy;
|
||||
_init : function() {
|
||||
this.isDummy = !Main.sessionMode.hasOverview;
|
||||
|
||||
// We only have an overview in user sessions, so
|
||||
// create a dummy overview in other cases
|
||||
|
@ -14,7 +14,6 @@ const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const DND = imports.ui.dnd;
|
||||
const Layout = imports.ui.layout;
|
||||
@ -32,33 +31,6 @@ const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
|
||||
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
|
||||
const SPINNER_ANIMATION_TIME = 0.2;
|
||||
|
||||
const STANDARD_STATUS_AREA_ORDER = ['a11y', 'keyboard', 'volume', 'bluetooth', 'network', 'battery', 'userMenu'];
|
||||
const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.XKBIndicator,
|
||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||
};
|
||||
|
||||
if (Config.HAVE_BLUETOOTH)
|
||||
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
|
||||
|
||||
try {
|
||||
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['network'] = imports.ui.status.network.NMApplet;
|
||||
} catch(e) {
|
||||
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
|
||||
}
|
||||
|
||||
const GDM_STATUS_AREA_ORDER = ['a11y', 'display', 'keyboard', 'volume', 'battery', 'powerMenu'];
|
||||
const GDM_STATUS_AREA_SHELL_IMPLEMENTATION = {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.XKBIndicator,
|
||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
|
||||
};
|
||||
|
||||
// To make sure the panel corners blend nicely with the panel,
|
||||
// we draw background and borders the same way, e.g. drawing
|
||||
// them as filled shapes from the outside inwards instead of
|
||||
@ -962,7 +934,7 @@ const Panel = new Lang.Class({
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||
|
||||
/* Button on the left side of the panel. */
|
||||
if (global.session_type == Shell.SessionType.USER) {
|
||||
if (Main.sessionMode.hasOverview) {
|
||||
this._activitiesButton = new ActivitiesButton();
|
||||
this._activities = this._activitiesButton.actor;
|
||||
this._leftBox.add(this._activities);
|
||||
@ -970,28 +942,19 @@ const Panel = new Lang.Class({
|
||||
// The activities button has a pretend menu, so as to integrate
|
||||
// more cleanly with the rest of the panel
|
||||
this._menus.addMenu(this._activitiesButton.menu);
|
||||
}
|
||||
|
||||
if (Main.sessionMode.hasAppMenu) {
|
||||
this._appMenu = new AppMenuButton(this._menus);
|
||||
this._leftBox.add(this._appMenu.actor);
|
||||
}
|
||||
|
||||
/* center */
|
||||
if (global.session_type == Shell.SessionType.USER)
|
||||
this._dateMenu = new DateMenu.DateMenuButton({ showEvents: true });
|
||||
else
|
||||
this._dateMenu = new DateMenu.DateMenuButton({ showEvents: false });
|
||||
this._dateMenu = new DateMenu.DateMenuButton();
|
||||
this._centerBox.add(this._dateMenu.actor, { y_fill: true });
|
||||
this._menus.addMenu(this._dateMenu.menu);
|
||||
|
||||
/* right */
|
||||
if (global.session_type == Shell.SessionType.GDM) {
|
||||
this._status_area_order = GDM_STATUS_AREA_ORDER;
|
||||
this._status_area_shell_implementation = GDM_STATUS_AREA_SHELL_IMPLEMENTATION;
|
||||
} else {
|
||||
this._status_area_order = STANDARD_STATUS_AREA_ORDER;
|
||||
this._status_area_shell_implementation = STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION;
|
||||
}
|
||||
|
||||
Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
||||
Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
||||
|
||||
@ -1123,9 +1086,9 @@ const Panel = new Lang.Class({
|
||||
},
|
||||
|
||||
startStatusArea: function() {
|
||||
for (let i = 0; i < this._status_area_order.length; i++) {
|
||||
let role = this._status_area_order[i];
|
||||
let constructor = this._status_area_shell_implementation[role];
|
||||
for (let i = 0; i < Main.sessionMode.statusArea.order.length; i++) {
|
||||
let role = Main.sessionMode.statusArea.order[i];
|
||||
let constructor = Main.sessionMode.statusArea.implementation[role];
|
||||
if (!constructor) {
|
||||
// This icon is not implemented (this is a bug)
|
||||
continue;
|
||||
@ -1175,18 +1138,21 @@ const Panel = new Lang.Class({
|
||||
},
|
||||
|
||||
_onTrayIconAdded: function(o, icon, role) {
|
||||
if (this._status_area_shell_implementation[role]) {
|
||||
if (Main.sessionMode.statusArea.implementation[role]) {
|
||||
// This icon is legacy, and replaced by a Shell version
|
||||
// Hide it
|
||||
return;
|
||||
}
|
||||
|
||||
if (Main.sessionMode.statusArea.order.indexOf(role) == -1)
|
||||
return;
|
||||
|
||||
icon.height = PANEL_ICON_SIZE;
|
||||
let buttonBox = new PanelMenu.ButtonBox();
|
||||
let box = buttonBox.actor;
|
||||
box.add_actor(icon);
|
||||
|
||||
this._insertStatusItem(box, this._status_area_order.indexOf(role));
|
||||
this._insertStatusItem(box, Main.sessionMode.statusArea.order.indexOf(role));
|
||||
},
|
||||
|
||||
_onTrayIconRemoved: function(o, icon) {
|
||||
|
@ -167,6 +167,7 @@ const AuthenticationDialog = new Lang.Class({
|
||||
*/
|
||||
this._nullMessageLabel = new St.Label({ style_class: 'prompt-dialog-null-label',
|
||||
text: 'abc'});
|
||||
this._nullMessageLabel.add_style_class_name('hidden');
|
||||
this._nullMessageLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||
this._nullMessageLabel.clutter_text.line_wrap = true;
|
||||
messageBox.add(this._nullMessageLabel);
|
||||
|
@ -888,8 +888,7 @@ const PopupMenuBase = new Lang.Class({
|
||||
},
|
||||
|
||||
addSettingsAction: function(title, desktopFile) {
|
||||
// Don't allow user settings to get edited unless we're in a user session
|
||||
if (global.session_type != Shell.SessionType.USER)
|
||||
if (!Main.sessionMode.allowSettings)
|
||||
return null;
|
||||
|
||||
let menuItem = this.addAction(title, function() {
|
||||
@ -1921,7 +1920,7 @@ const RemoteMenu = new Lang.Class({
|
||||
while (k0 < currentItems.length && currentItems[k0]._ignored)
|
||||
k0++;
|
||||
// find the right menu item matching the model item
|
||||
for (j0 = 0; j0 < position; j0++, k0++) {
|
||||
for (j0 = 0; k0 < currentItems.length && j0 < position; j0++, k0++) {
|
||||
if (currentItems[k0]._ignored)
|
||||
k0++;
|
||||
}
|
||||
@ -1931,7 +1930,7 @@ const RemoteMenu = new Lang.Class({
|
||||
for (k = k0; k < currentItems.length; k++)
|
||||
currentItems[k].destroy();
|
||||
} else {
|
||||
for (j = j0, k = k0; j < j0 + removed; j++, k++) {
|
||||
for (j = j0, k = k0; k < currentItems.length && j < j0 + removed; j++, k++) {
|
||||
currentItems[k].destroy();
|
||||
|
||||
if (currentItems[k]._ignored)
|
||||
@ -1962,8 +1961,9 @@ const RemoteMenu = new Lang.Class({
|
||||
k++;
|
||||
}
|
||||
} else if (changeSignal) {
|
||||
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function() {
|
||||
this.actionGroup.disconnect(signalId);
|
||||
let signalId = this.actionGroup.connect(changeSignal, Lang.bind(this, function(actionGroup, actionName) {
|
||||
actionGroup.disconnect(signalId);
|
||||
if (this._actions[actionName]) return;
|
||||
|
||||
// force a full update
|
||||
this._modelChanged(model, 0, -1, model.get_n_items(), target);
|
||||
|
@ -354,7 +354,7 @@ const SearchSystem = new Lang.Class({
|
||||
results.push([provider, []]);
|
||||
provider.getSubsearchResultSet(previousResults, terms);
|
||||
} catch (error) {
|
||||
global.log ('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
|
||||
log('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -364,7 +364,7 @@ const SearchSystem = new Lang.Class({
|
||||
results.push([provider, []]);
|
||||
provider.getInitialResultSet(terms);
|
||||
} catch (error) {
|
||||
global.log ('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
|
||||
log('A ' + error.name + ' has occured in ' + provider.title + ': ' + error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ const Lang = imports.lang;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Meta = imports.gi.Meta;
|
||||
const St = imports.gi.St;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
const DND = imports.ui.dnd;
|
||||
const IconGrid = imports.ui.iconGrid;
|
||||
@ -33,12 +34,13 @@ const SearchResult = new Lang.Class({
|
||||
content = new St.Bin({ style_class: 'search-result-content',
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
track_hover: true });
|
||||
track_hover: true,
|
||||
accessible_role: Atk.Role.PUSH_BUTTON });
|
||||
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
|
||||
{ createIcon: this.metaInfo['createIcon'] });
|
||||
content.set_child(icon.actor);
|
||||
this._dragActorSource = icon.icon;
|
||||
this.actor.label_actor = icon.label;
|
||||
content.label_actor = icon.label;
|
||||
} else {
|
||||
if (content._delegate && content._delegate.getDragActorSource)
|
||||
this._dragActorSource = content._delegate.getDragActorSource();
|
||||
@ -129,7 +131,7 @@ const GridSearchResults = new Lang.Class({
|
||||
|
||||
getResultsForDisplay: function() {
|
||||
let alreadyVisible = this._pendingClear ? 0 : this._grid.visibleItemsCount();
|
||||
let canDisplay = this._grid.childrenInRow(this._width) * MAX_SEARCH_RESULTS_ROWS
|
||||
let canDisplay = this._grid.childrenInRow(this._width) * this._grid.getRowLimit()
|
||||
- alreadyVisible;
|
||||
|
||||
let numResults = Math.min(this._notDisplayedResult.length, canDisplay);
|
||||
|
124
js/ui/sessionMode.js
Normal file
124
js/ui/sessionMode.js
Normal file
@ -0,0 +1,124 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Lang = imports.lang;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
|
||||
const STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION = {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'userMenu': imports.ui.userMenu.UserMenuButton
|
||||
};
|
||||
|
||||
if (Config.HAVE_BLUETOOTH)
|
||||
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['bluetooth'] =
|
||||
imports.ui.status.bluetooth.Indicator;
|
||||
|
||||
try {
|
||||
STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION['network'] =
|
||||
imports.ui.status.network.NMApplet;
|
||||
} catch(e) {
|
||||
log('NMApplet is not supported. It is possible that your NetworkManager version is too old');
|
||||
}
|
||||
|
||||
|
||||
const DEFAULT_MODE = 'user';
|
||||
|
||||
const _modes = {
|
||||
'gdm': { hasOverview: false,
|
||||
hasAppMenu: false,
|
||||
showCalendarEvents: false,
|
||||
allowSettings: false,
|
||||
allowExtensions: false,
|
||||
allowKeybindingsWhenModal: true,
|
||||
hasRunDialog: false,
|
||||
hasWorkspaces: false,
|
||||
createSession: Main.createGDMSession,
|
||||
extraStylesheet: global.datadir + '/theme/gdm.css',
|
||||
statusArea: {
|
||||
order: [
|
||||
'a11y', 'display', 'keyboard',
|
||||
'volume', 'battery', 'powerMenu'
|
||||
],
|
||||
implementation: {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator,
|
||||
'battery': imports.ui.status.power.Indicator,
|
||||
'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
|
||||
'powerMenu': imports.gdm.powerMenu.PowerMenuButton
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
'initial-setup': { hasOverview: false,
|
||||
hasAppMenu: false,
|
||||
showCalendarEvents: false,
|
||||
allowSettings: false,
|
||||
allowExtensions: false,
|
||||
allowKeybindingsWhenModal: false,
|
||||
hasRunDialog: false,
|
||||
hasWorkspaces: false,
|
||||
createSession: Main.createInitialSetupSession,
|
||||
extraStylesheet: null,
|
||||
statusArea: {
|
||||
order: [
|
||||
'a11y', 'keyboard', 'volume'
|
||||
],
|
||||
implementation: {
|
||||
'a11y': imports.ui.status.accessibility.ATIndicator,
|
||||
'keyboard': imports.ui.status.keyboard.XKBIndicator,
|
||||
'volume': imports.ui.status.volume.Indicator
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
'user': { hasOverview: true,
|
||||
hasAppMenu: true,
|
||||
showCalendarEvents: true,
|
||||
allowSettings: true,
|
||||
allowExtensions: true,
|
||||
allowKeybindingsWhenModal: false,
|
||||
hasRunDialog: true,
|
||||
hasWorkspaces: true,
|
||||
createSession: Main.createUserSession,
|
||||
extraStylesheet: null,
|
||||
statusArea: {
|
||||
order: [
|
||||
'input-method', 'a11y', 'keyboard', 'volume', 'bluetooth',
|
||||
'network', 'battery', 'userMenu'
|
||||
],
|
||||
implementation: STANDARD_STATUS_AREA_SHELL_IMPLEMENTATION
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function listModes() {
|
||||
let modes = Object.getOwnPropertyNames(_modes);
|
||||
for (let i = 0; i < modes.length; i++)
|
||||
print(modes[i]);
|
||||
}
|
||||
|
||||
const SessionMode = new Lang.Class({
|
||||
Name: 'SessionMode',
|
||||
|
||||
_init: function() {
|
||||
let params = _modes[global.session_mode];
|
||||
|
||||
params = Params.parse(params, _modes[DEFAULT_MODE]);
|
||||
|
||||
this._createSession = params.createSession;
|
||||
delete params.createSession;
|
||||
|
||||
Lang.copyProperties(params, this);
|
||||
},
|
||||
|
||||
createSession: function() {
|
||||
if (this._createSession)
|
||||
this._createSession();
|
||||
}
|
||||
});
|
@ -56,15 +56,8 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
|
||||
<arg type="i" direction="in" name="width"/>
|
||||
<arg type="i" direction="in" name="height"/>
|
||||
</method>
|
||||
<method name="EnableExtension">
|
||||
<arg type="s" direction="in" name="uuid"/>
|
||||
</method>
|
||||
<method name="DisableExtension">
|
||||
<arg type="s" direction="in" name="uuid"/>
|
||||
</method>
|
||||
<method name="InstallRemoteExtension">
|
||||
<arg type="s" direction="in" name="uuid"/>
|
||||
<arg type="s" direction="in" name="version"/>
|
||||
</method>
|
||||
<method name="UninstallExtension">
|
||||
<arg type="s" direction="in" name="uuid"/>
|
||||
@ -260,22 +253,8 @@ const GnomeShell = new Lang.Class({
|
||||
return extension.errors;
|
||||
},
|
||||
|
||||
EnableExtension: function(uuid) {
|
||||
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
|
||||
if (enabledExtensions.indexOf(uuid) == -1)
|
||||
enabledExtensions.push(uuid);
|
||||
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
|
||||
},
|
||||
|
||||
DisableExtension: function(uuid) {
|
||||
let enabledExtensions = global.settings.get_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY);
|
||||
while (enabledExtensions.indexOf(uuid) != -1)
|
||||
enabledExtensions.splice(enabledExtensions.indexOf(uuid), 1);
|
||||
global.settings.set_strv(ExtensionSystem.ENABLED_EXTENSIONS_KEY, enabledExtensions);
|
||||
},
|
||||
|
||||
InstallRemoteExtension: function(uuid, version_tag) {
|
||||
ExtensionSystem.installExtensionFromUUID(uuid, version_tag);
|
||||
InstallRemoteExtension: function(uuid) {
|
||||
ExtensionSystem.installExtensionFromUUID(uuid);
|
||||
},
|
||||
|
||||
UninstallExtension: function(uuid) {
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GdkPixbuf = imports.gi.GdkPixbuf;
|
||||
const Gkbd = imports.gi.Gkbd;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GnomeDesktop = imports.gi.GnomeDesktop;
|
||||
const Lang = imports.lang;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
@ -14,30 +14,28 @@ const PopupMenu = imports.ui.popupMenu;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
|
||||
const KEY_CURRENT_INPUT_SOURCE = 'current';
|
||||
const KEY_INPUT_SOURCES = 'sources';
|
||||
|
||||
const INPUT_SOURCE_TYPE_XKB = 'xkb';
|
||||
|
||||
const LayoutMenuItem = new Lang.Class({
|
||||
Name: 'LayoutMenuItem',
|
||||
Extends: PopupMenu.PopupBaseMenuItem,
|
||||
|
||||
_init: function(config, id, indicator, long_name) {
|
||||
_init: function(displayName, shortName) {
|
||||
this.parent();
|
||||
|
||||
this._config = config;
|
||||
this._id = id;
|
||||
this.label = new St.Label({ text: long_name });
|
||||
this.indicator = indicator;
|
||||
this.label = new St.Label({ text: displayName });
|
||||
this.indicator = new St.Label({ text: shortName });
|
||||
this.addActor(this.label);
|
||||
this.addActor(this.indicator);
|
||||
},
|
||||
|
||||
activate: function(event) {
|
||||
this.parent(event);
|
||||
|
||||
this._config.lock_group(this._id);
|
||||
}
|
||||
});
|
||||
|
||||
const XKBIndicator = new Lang.Class({
|
||||
Name: 'XKBIndicator',
|
||||
const InputSourceIndicator = new Lang.Class({
|
||||
Name: 'InputSourceIndicator',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function() {
|
||||
@ -50,122 +48,144 @@ const XKBIndicator = new Lang.Class({
|
||||
this.actor.add_actor(this._container);
|
||||
this.actor.add_style_class_name('panel-status-button');
|
||||
|
||||
this._iconActor = new St.Icon({ icon_name: 'keyboard', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });
|
||||
this._container.add_actor(this._iconActor);
|
||||
this._labelActors = [ ];
|
||||
this._layoutItems = [ ];
|
||||
this._labelActors = {};
|
||||
this._layoutItems = {};
|
||||
|
||||
this._showFlags = false;
|
||||
this._config = Gkbd.Configuration.get();
|
||||
this._config.connect('changed', Lang.bind(this, this._syncConfig));
|
||||
this._config.connect('group-changed', Lang.bind(this, this._syncGroup));
|
||||
this._config.start_listen();
|
||||
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
|
||||
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
|
||||
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
|
||||
|
||||
this._syncConfig();
|
||||
this._currentSourceIndex = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
|
||||
this._xkbInfo = new GnomeDesktop.XkbInfo();
|
||||
|
||||
if (global.session_type == Shell.SessionType.USER) {
|
||||
this._inputSourcesChanged();
|
||||
|
||||
// re-using "allowSettings" for the keyboard layout is a bit shady,
|
||||
// but at least for now it is used as "allow popping up windows
|
||||
// from shell menus"; we can always add a separate sessionMode
|
||||
// option if need arises.
|
||||
if (Main.sessionMode.allowSettings) {
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, function() {
|
||||
Main.overview.hide();
|
||||
Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]);
|
||||
}));
|
||||
this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
|
||||
}
|
||||
this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop');
|
||||
},
|
||||
|
||||
_adjustGroupNames: function(names) {
|
||||
// Disambiguate duplicate names with a subscript
|
||||
// This is O(N^2) to avoid sorting names
|
||||
// but N <= 4 so who cares?
|
||||
_currentInputSourceChanged: function() {
|
||||
let nVisibleSources = Object.keys(this._layoutItems).length;
|
||||
if (nVisibleSources < 2)
|
||||
return;
|
||||
|
||||
for (let i = 0; i < names.length; i++) {
|
||||
let name = names[i];
|
||||
let cnt = 0;
|
||||
for (let j = i + 1; j < names.length; j++) {
|
||||
if (names[j] == name) {
|
||||
cnt++;
|
||||
// U+2081 SUBSCRIPT ONE
|
||||
names[j] = name + String.fromCharCode(0x2081 + cnt);
|
||||
}
|
||||
}
|
||||
if (cnt != 0)
|
||||
names[i] = name + '\u2081';
|
||||
let nSources = this._settings.get_value(KEY_INPUT_SOURCES).n_children();
|
||||
let newCurrentSourceIndex = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
|
||||
if (newCurrentSourceIndex >= nSources)
|
||||
return;
|
||||
|
||||
if (!this._layoutItems[newCurrentSourceIndex]) {
|
||||
// This source index is invalid as we weren't able to
|
||||
// build a menu item for it, so we hide ourselves since we
|
||||
// can't fix it here. *shrug*
|
||||
this.menu.close();
|
||||
this.actor.hide();
|
||||
return;
|
||||
} else {
|
||||
this.actor.show();
|
||||
}
|
||||
|
||||
return names;
|
||||
if (this._layoutItems[this._currentSourceIndex]) {
|
||||
this._layoutItems[this._currentSourceIndex].setShowDot(false);
|
||||
this._container.set_skip_paint(this._labelActors[this._currentSourceIndex], true);
|
||||
}
|
||||
|
||||
this._layoutItems[newCurrentSourceIndex].setShowDot(true);
|
||||
this._container.set_skip_paint(this._labelActors[newCurrentSourceIndex], false);
|
||||
|
||||
this._currentSourceIndex = newCurrentSourceIndex;
|
||||
},
|
||||
|
||||
_syncConfig: function() {
|
||||
this._showFlags = this._config.if_flags_shown();
|
||||
if (this._showFlags) {
|
||||
this._container.set_skip_paint(this._iconActor, false);
|
||||
} else {
|
||||
this._container.set_skip_paint(this._iconActor, true);
|
||||
_inputSourcesChanged: function() {
|
||||
let sources = this._settings.get_value(KEY_INPUT_SOURCES);
|
||||
let nSources = sources.n_children();
|
||||
|
||||
for (let i in this._layoutItems)
|
||||
this._layoutItems[i].destroy();
|
||||
|
||||
for (let i in this._labelActors)
|
||||
this._labelActors[i].destroy();
|
||||
|
||||
this._layoutItems = {};
|
||||
this._labelActors = {};
|
||||
|
||||
let infos = [];
|
||||
let infosByShortName = {};
|
||||
|
||||
for (let i = 0; i < nSources; i++) {
|
||||
let [type, id] = sources.get_child_value(i).deep_unpack();
|
||||
if (type != INPUT_SOURCE_TYPE_XKB)
|
||||
continue;
|
||||
|
||||
let info = {};
|
||||
[info.exists, info.displayName, info.shortName, , ] =
|
||||
this._xkbInfo.get_layout_info(id);
|
||||
|
||||
if (!info.exists)
|
||||
continue;
|
||||
|
||||
info.sourceIndex = i;
|
||||
|
||||
if (!(info.shortName in infosByShortName))
|
||||
infosByShortName[info.shortName] = [];
|
||||
infosByShortName[info.shortName].push(info);
|
||||
infos.push(info);
|
||||
}
|
||||
|
||||
let groups = this._config.get_group_names();
|
||||
if (groups.length > 1) {
|
||||
if (infos.length > 1) {
|
||||
this.actor.show();
|
||||
} else {
|
||||
this.menu.close();
|
||||
this.actor.hide();
|
||||
}
|
||||
|
||||
for (let i = 0; i < this._layoutItems.length; i++)
|
||||
this._layoutItems[i].destroy();
|
||||
for (let i = 0; i < infos.length; i++) {
|
||||
let info = infos[i];
|
||||
if (infosByShortName[info.shortName].length > 1) {
|
||||
let sub = infosByShortName[info.shortName].indexOf(info) + 1;
|
||||
info.shortName += String.fromCharCode(0x2080 + sub);
|
||||
}
|
||||
|
||||
for (let i = 0; i < this._labelActors.length; i++)
|
||||
this._labelActors[i].destroy();
|
||||
|
||||
let short_names = this._adjustGroupNames(this._config.get_short_group_names());
|
||||
|
||||
this._selectedLayout = null;
|
||||
this._layoutItems = [ ];
|
||||
this._selectedLabel = null;
|
||||
this._labelActors = [ ];
|
||||
for (let i = 0; i < groups.length; i++) {
|
||||
let icon_name = this._config.get_group_name(i);
|
||||
let actor;
|
||||
if (this._showFlags)
|
||||
actor = new St.Icon({ icon_name: icon_name, icon_type: St.IconType.SYMBOLIC, style_class: 'popup-menu-icon' });
|
||||
else
|
||||
actor = new St.Label({ text: short_names[i] });
|
||||
let item = new LayoutMenuItem(this._config, i, actor, groups[i]);
|
||||
item._short_group_name = short_names[i];
|
||||
item._icon_name = icon_name;
|
||||
this._layoutItems.push(item);
|
||||
let item = new LayoutMenuItem(info.displayName, info.shortName);
|
||||
this._layoutItems[info.sourceIndex] = item;
|
||||
this.menu.addMenuItem(item, i);
|
||||
item.connect('activate', Lang.bind(this, function() {
|
||||
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
|
||||
GLib.Variant.new_uint32(info.sourceIndex));
|
||||
}));
|
||||
|
||||
let shortLabel = new St.Label({ text: short_names[i] });
|
||||
this._labelActors.push(shortLabel);
|
||||
let shortLabel = new St.Label({ text: info.shortName });
|
||||
this._labelActors[info.sourceIndex] = shortLabel;
|
||||
this._container.add_actor(shortLabel);
|
||||
this._container.set_skip_paint(shortLabel, true);
|
||||
}
|
||||
|
||||
this._syncGroup();
|
||||
this._currentInputSourceChanged();
|
||||
},
|
||||
|
||||
_syncGroup: function() {
|
||||
let selected = this._config.get_current_group();
|
||||
_showLayout: function() {
|
||||
Main.overview.hide();
|
||||
|
||||
if (this._selectedLayout) {
|
||||
this._selectedLayout.setShowDot(false);
|
||||
this._selectedLayout = null;
|
||||
}
|
||||
let sources = this._settings.get_value(KEY_INPUT_SOURCES);
|
||||
let current = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
|
||||
let id = sources.get_child_value(current).deep_unpack()[1];
|
||||
let [, , , xkbLayout, xkbVariant] = this._xkbInfo.get_layout_info(id);
|
||||
|
||||
if (this._selectedLabel) {
|
||||
this._container.set_skip_paint(this._selectedLabel, true);
|
||||
this._selectedLabel = null;
|
||||
}
|
||||
if (!xkbLayout || xkbLayout.length == 0)
|
||||
return;
|
||||
|
||||
let item = this._layoutItems[selected];
|
||||
item.setShowDot(true);
|
||||
let description = xkbLayout;
|
||||
if (xkbVariant.length > 0)
|
||||
description = description + '\t' + xkbVariant;
|
||||
|
||||
this._iconActor.icon_name = item._icon_name;
|
||||
this._selectedLabel = this._labelActors[selected];
|
||||
this._container.set_skip_paint(this._selectedLabel, this._showFlags);
|
||||
|
||||
this._selectedLayout = item;
|
||||
Util.spawn(['gkbd-keyboard-display', '-l', description]);
|
||||
},
|
||||
|
||||
_containerGetPreferredWidth: function(container, for_height, alloc) {
|
||||
@ -173,15 +193,11 @@ const XKBIndicator = new Lang.Class({
|
||||
// for the height of all children, but we ignore the results
|
||||
// for those we don't actually display.
|
||||
let max_min_width = 0, max_natural_width = 0;
|
||||
if (this._showFlags)
|
||||
[max_min_width, max_natural_width] = this._iconActor.get_preferred_width(for_height);
|
||||
|
||||
for (let i = 0; i < this._labelActors.length; i++) {
|
||||
for (let i in this._labelActors) {
|
||||
let [min_width, natural_width] = this._labelActors[i].get_preferred_width(for_height);
|
||||
if (!this._showFlags) {
|
||||
max_min_width = Math.max(max_min_width, min_width);
|
||||
max_natural_width = Math.max(max_natural_width, natural_width);
|
||||
}
|
||||
max_min_width = Math.max(max_min_width, min_width);
|
||||
max_natural_width = Math.max(max_natural_width, natural_width);
|
||||
}
|
||||
|
||||
alloc.min_size = max_min_width;
|
||||
@ -190,15 +206,11 @@ const XKBIndicator = new Lang.Class({
|
||||
|
||||
_containerGetPreferredHeight: function(container, for_width, alloc) {
|
||||
let max_min_height = 0, max_natural_height = 0;
|
||||
if (this._showFlags)
|
||||
[max_min_height, max_natural_height] = this._iconActor.get_preferred_height(for_width);
|
||||
|
||||
for (let i = 0; i < this._labelActors.length; i++) {
|
||||
|
||||
for (let i in this._labelActors) {
|
||||
let [min_height, natural_height] = this._labelActors[i].get_preferred_height(for_width);
|
||||
if (!this._showFlags) {
|
||||
max_min_height = Math.max(max_min_height, min_height);
|
||||
max_natural_height = Math.max(max_natural_height, natural_height);
|
||||
}
|
||||
max_min_height = Math.max(max_min_height, min_height);
|
||||
max_natural_height = Math.max(max_natural_height, natural_height);
|
||||
}
|
||||
|
||||
alloc.min_size = max_min_height;
|
||||
@ -212,8 +224,7 @@ const XKBIndicator = new Lang.Class({
|
||||
box.y2 -= box.y1;
|
||||
box.y1 = 0;
|
||||
|
||||
this._iconActor.allocate_align_fill(box, 0.5, 0, false, false, flags);
|
||||
for (let i = 0; i < this._labelActors.length; i++)
|
||||
for (let i in this._labelActors)
|
||||
this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
|
||||
}
|
||||
});
|
||||
|
@ -304,9 +304,10 @@ const NMDevice = new Lang.Class({
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connections[i],
|
||||
name: connections[i]._name,
|
||||
uuid: connections[i]._uuid,
|
||||
name: connections[i].get_id(),
|
||||
uuid: connections[i].get_uuid(),
|
||||
timestamp: connections[i]._timestamp,
|
||||
item: null,
|
||||
};
|
||||
this._connections.push(obj);
|
||||
}
|
||||
@ -401,48 +402,46 @@ const NMDevice = new Lang.Class({
|
||||
},
|
||||
|
||||
checkConnection: function(connection) {
|
||||
let pos = this._findConnection(connection._uuid);
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
let exists = pos != -1;
|
||||
let valid = this.connectionValid(connection);
|
||||
let similar = false;
|
||||
if (exists) {
|
||||
let existing = this._connections[pos];
|
||||
|
||||
if (exists && !valid)
|
||||
this.removeConnection(connection);
|
||||
else if (!exists && valid)
|
||||
this.addConnection(connection);
|
||||
else if (exists && valid) {
|
||||
// propagate changes and update the UI
|
||||
|
||||
if (this._connections[pos].timestamp != connection._timestamp) {
|
||||
this._connections[pos].timestamp = connection._timestamp;
|
||||
this._connections.sort(this._connectionSortFunction);
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
}
|
||||
// Check if connection changed name or id
|
||||
similar = existing.name == connection.get_id() &&
|
||||
existing.timestamp == connection._timestamp;
|
||||
}
|
||||
|
||||
if (exists && valid && similar) {
|
||||
// Nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (exists)
|
||||
this.removeConnection(connection);
|
||||
if (valid)
|
||||
this.addConnection(connection);
|
||||
},
|
||||
|
||||
addConnection: function(connection) {
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connection,
|
||||
name: connection._name,
|
||||
uuid: connection._uuid,
|
||||
name: connection.get_id(),
|
||||
uuid: connection.get_uuid(),
|
||||
timestamp: connection._timestamp,
|
||||
item: null,
|
||||
};
|
||||
this._connections.push(obj);
|
||||
this._connections.sort(this._connectionSortFunction);
|
||||
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
|
||||
|
||||
this._clearSection();
|
||||
this._queueCreateSection();
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
if (!connection._uuid) {
|
||||
log('Cannot remove a connection without an UUID');
|
||||
return;
|
||||
}
|
||||
let pos = this._findConnection(connection._uuid);
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
if (pos == -1) {
|
||||
// this connection was never added, nothing to do here
|
||||
return;
|
||||
@ -712,10 +711,10 @@ const NMDeviceWired = new Lang.Class({
|
||||
|
||||
_createAutomaticConnection: function() {
|
||||
let connection = new NetworkManager.Connection();
|
||||
connection._uuid = NetworkManager.utils_uuid_generate();
|
||||
let uuid = NetworkManager.utils_uuid_generate();
|
||||
connection.add_setting(new NetworkManager.SettingWired());
|
||||
connection.add_setting(new NetworkManager.SettingConnection({
|
||||
uuid: connection._uuid,
|
||||
uuid: uuid,
|
||||
id: this._autoConnectionName,
|
||||
type: NetworkManager.SETTING_WIRED_SETTING_NAME,
|
||||
autoconnect: true
|
||||
@ -859,10 +858,10 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
|
||||
_createAutomaticConnection: function() {
|
||||
let connection = new NetworkManager.Connection;
|
||||
connection._uuid = NetworkManager.utils_uuid_generate();
|
||||
let uuid = NetworkManager.utils_uuid_generate();
|
||||
connection.add_setting(new NetworkManager.SettingBluetooth);
|
||||
connection.add_setting(new NetworkManager.SettingConnection({
|
||||
uuid: connection._uuid,
|
||||
uuid: uuid,
|
||||
id: this._autoConnectionName,
|
||||
type: NetworkManager.SETTING_BLUETOOTH_SETTING_NAME,
|
||||
autoconnect: false
|
||||
@ -897,12 +896,12 @@ const NMDeviceVPN = new Lang.Class({
|
||||
Name: 'NMDeviceVPN',
|
||||
Extends: NMDevice,
|
||||
|
||||
_init: function(client) {
|
||||
_init: function(client, device, connections) {
|
||||
// Disable autoconnections
|
||||
this._autoConnectionName = null;
|
||||
this.category = NMConnectionCategory.VPN;
|
||||
|
||||
this.parent(client, null, [ ]);
|
||||
this.parent(client, null, connections);
|
||||
},
|
||||
|
||||
connectionValid: function(connection) {
|
||||
@ -914,13 +913,24 @@ const NMDeviceVPN = new Lang.Class({
|
||||
},
|
||||
|
||||
get connected() {
|
||||
return !!this._activeConnection;
|
||||
if (!this._activeConnection)
|
||||
return false;
|
||||
|
||||
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
|
||||
},
|
||||
|
||||
setActiveConnection: function(activeConnection) {
|
||||
if (this._stateChangeId)
|
||||
this._activeConnection.disconnect(this._stateChangeId);
|
||||
this._stateChangeId = 0;
|
||||
|
||||
this.parent(activeConnection);
|
||||
|
||||
this.emit('active-connection-changed');
|
||||
if (this._activeConnection)
|
||||
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
|
||||
Lang.bind(this, this._connectionStateChanged));
|
||||
|
||||
this.emit('state-changed');
|
||||
},
|
||||
|
||||
_shouldShowConnectionList: function() {
|
||||
@ -933,7 +943,39 @@ const NMDeviceVPN = new Lang.Class({
|
||||
},
|
||||
|
||||
getStatusLabel: function() {
|
||||
return null;
|
||||
if (!this._activeConnection) // Same as DISCONNECTED
|
||||
return null;
|
||||
|
||||
switch(this._activeConnection.vpn_state) {
|
||||
case NetworkManager.VPNConnectionState.DISCONNECTED:
|
||||
case NetworkManager.VPNConnectionState.ACTIVATED:
|
||||
return null;
|
||||
case NetworkManager.VPNConnectionState.PREPARE:
|
||||
case NetworkManager.VPNConnectionState.CONNECT:
|
||||
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
|
||||
return _("connecting...");
|
||||
case NetworkManager.VPNConnectionState.NEED_AUTH:
|
||||
/* Translators: this is for network connections that require some kind of key or password */
|
||||
return _("authentication required");
|
||||
case NetworkManager.VPNConnectionState.FAILED:
|
||||
return _("connection failed");
|
||||
default:
|
||||
log('VPN connection state invalid, is %d'.format(this.device.state));
|
||||
return 'invalid';
|
||||
}
|
||||
},
|
||||
|
||||
_connectionStateChanged: function(connection, newstate, reason) {
|
||||
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
|
||||
// FIXME: if we ever want to show something based on reason,
|
||||
// we need to convert from NetworkManager.VPNConnectionStateReason
|
||||
// to NetworkManager.DeviceStateReason
|
||||
this.emit('activation-failed', reason);
|
||||
}
|
||||
|
||||
// Differently from real NMDevices, there is no need to queue
|
||||
// an update of the menu section, contents wouldn't change anyway
|
||||
this.emit('state-changed');
|
||||
}
|
||||
});
|
||||
|
||||
@ -1323,9 +1365,7 @@ const NMDeviceWireless = new Lang.Class({
|
||||
},
|
||||
|
||||
removeConnection: function(connection) {
|
||||
if (!connection._uuid)
|
||||
return;
|
||||
let pos = this._findConnection(connection._uuid);
|
||||
let pos = this._findConnection(connection.get_uuid());
|
||||
if (pos == -1) {
|
||||
// removing connection that was never added
|
||||
return;
|
||||
@ -1339,7 +1379,7 @@ const NMDeviceWireless = new Lang.Class({
|
||||
let apObj = this._networks[i];
|
||||
let connections = apObj.connections;
|
||||
for (let k = 0; k < connections.length; k++) {
|
||||
if (connections[k]._uuid == connection._uuid) {
|
||||
if (connections[k].get_uuid() == connection.get_uuid()) {
|
||||
// remove the connection from the access point group
|
||||
connections.splice(k);
|
||||
forceupdate = forceupdate || connections.length == 0;
|
||||
@ -1355,7 +1395,7 @@ const NMDeviceWireless = new Lang.Class({
|
||||
forceupdate = true;
|
||||
} else {
|
||||
for (let j = 0; j < items.length; j++) {
|
||||
if (items[j]._connection._uuid == connection._uuid) {
|
||||
if (items[j]._connection.get_uuid() == connection.get_uuid()) {
|
||||
items[j].destroy();
|
||||
break;
|
||||
}
|
||||
@ -1382,8 +1422,8 @@ const NMDeviceWireless = new Lang.Class({
|
||||
// record the connection
|
||||
let obj = {
|
||||
connection: connection,
|
||||
name: connection._name,
|
||||
uuid: connection._uuid,
|
||||
name: connection.get_id(),
|
||||
uuid: connection.get_uuid(),
|
||||
};
|
||||
this._connections.push(obj);
|
||||
|
||||
@ -1544,6 +1584,15 @@ const NMApplet = new Lang.Class({
|
||||
this.menu.addMenuItem(this._statusSection);
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
|
||||
this._activeConnections = [ ];
|
||||
this._connections = [ ];
|
||||
|
||||
this._mainConnection = null;
|
||||
this._activeAccessPointUpdateId = 0;
|
||||
this._activeAccessPoint = null;
|
||||
this._mobileUpdateId = 0;
|
||||
this._mobileUpdateDevice = null;
|
||||
|
||||
this._devices = { };
|
||||
|
||||
this._devices.wired = {
|
||||
@ -1579,13 +1628,9 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
this._devices.vpn = {
|
||||
section: new PopupMenu.PopupMenuSection(),
|
||||
device: new NMDeviceVPN(this._client),
|
||||
device: this._makeWrapperDevice(NMDeviceVPN, null),
|
||||
item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
|
||||
};
|
||||
this._devices.vpn.device.connect('active-connection-changed', Lang.bind(this, function() {
|
||||
this._devices.vpn.item.updateForDevice(this._devices.vpn.device);
|
||||
}));
|
||||
this._devices.vpn.item.updateForDevice(this._devices.vpn.device);
|
||||
this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
|
||||
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
|
||||
this._devices.vpn.section.actor.hide();
|
||||
@ -1593,15 +1638,6 @@ const NMApplet = new Lang.Class({
|
||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
|
||||
|
||||
this._activeConnections = [ ];
|
||||
this._connections = [ ];
|
||||
|
||||
this._mainConnection = null;
|
||||
this._activeAccessPointUpdateId = 0;
|
||||
this._activeAccessPoint = null;
|
||||
this._mobileUpdateId = 0;
|
||||
this._mobileUpdateDevice = null;
|
||||
|
||||
// Device types
|
||||
this._dtypes = { };
|
||||
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
|
||||
@ -1668,6 +1704,18 @@ const NMApplet = new Lang.Class({
|
||||
},
|
||||
|
||||
_syncSectionTitle: function(category) {
|
||||
if (category == NMConnectionCategory.VPN) {
|
||||
// Special case VPN: it's only one device (and a fake one
|
||||
// actually), and we don't show it if empty
|
||||
let device = this._devices.vpn.device;
|
||||
let section = this._devices.vpn.section;
|
||||
let item = this._devices.vpn.item;
|
||||
|
||||
section.actor.visible = !device.empty;
|
||||
item.updateForDevice(device);
|
||||
return;
|
||||
}
|
||||
|
||||
let devices = this._devices[category].devices;
|
||||
let item = this._devices[category].item;
|
||||
let section = this._devices[category].section;
|
||||
@ -1718,6 +1766,29 @@ const NMApplet = new Lang.Class({
|
||||
this._source.notify(device._notification);
|
||||
},
|
||||
|
||||
_makeWrapperDevice: function(wrapperClass, device) {
|
||||
let wrapper = new wrapperClass(this._client, device, this._connections);
|
||||
|
||||
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
|
||||
// XXX: nm-applet has no special text depending on reason
|
||||
// but I'm not sure of this generic message
|
||||
this._notifyForDevice(device, 'network-error',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
}));
|
||||
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;
|
||||
},
|
||||
|
||||
_deviceAdded: function(client, device) {
|
||||
if (device._delegate) {
|
||||
// already seen, not adding again
|
||||
@ -1725,24 +1796,8 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
let wrapperClass = this._dtypes[device.get_device_type()];
|
||||
if (wrapperClass) {
|
||||
let wrapper = new wrapperClass(this._client, device, this._connections);
|
||||
let wrapper = this._makeWrapperDevice(wrapperClass, device);
|
||||
|
||||
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) {
|
||||
// XXX: nm-applet has no special text depending on reason
|
||||
// but I'm not sure of this generic message
|
||||
this._notifyForDevice(device, 'network-error',
|
||||
_("Connection failed"),
|
||||
_("Activation of network connection failed"),
|
||||
MessageTray.Urgency.HIGH);
|
||||
}));
|
||||
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;
|
||||
let devices = this._devices[wrapper.category].devices;
|
||||
|
||||
@ -1878,7 +1933,7 @@ const NMApplet = new Lang.Class({
|
||||
let connections = this._settings.list_connections();
|
||||
for (let i = 0; i < connections.length; i++) {
|
||||
let connection = connections[i];
|
||||
if (connection._uuid) {
|
||||
if (connection._updatedId) {
|
||||
// connection was already seen (for example because NetworkManager was restarted)
|
||||
continue;
|
||||
}
|
||||
@ -1891,7 +1946,7 @@ const NMApplet = new Lang.Class({
|
||||
},
|
||||
|
||||
_newConnection: function(settings, connection) {
|
||||
if (connection._uuid) {
|
||||
if (connection._updatedId) {
|
||||
// connection was already seen
|
||||
return;
|
||||
}
|
||||
@ -1914,35 +1969,31 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
this._devices.vpn.device.removeConnection(connection);
|
||||
if (this._devices.vpn.device.empty)
|
||||
this._devices.vpn.section.actor.hide();
|
||||
this._syncSectionTitle(section);
|
||||
} else if (section != NMConnectionCategory.INVALID) {
|
||||
let devices = this._devices[section].devices;
|
||||
for (let i = 0; i < devices.length; i++)
|
||||
devices[i].removeConnection(connection);
|
||||
}
|
||||
|
||||
connection._uuid = null;
|
||||
connection.disconnect(connection._removedId);
|
||||
connection.disconnect(connection._updatedId);
|
||||
connection._removedId = connection._updatedId = 0;
|
||||
},
|
||||
|
||||
_updateConnection: function(connection) {
|
||||
let connectionSettings = connection.get_setting_by_name(NetworkManager.SETTING_CONNECTION_SETTING_NAME);
|
||||
connection._type = connectionSettings.type;
|
||||
|
||||
connection._section = this._ctypes[connection._type] || NMConnectionCategory.INVALID;
|
||||
connection._name = connectionSettings.id;
|
||||
connection._uuid = connectionSettings.uuid;
|
||||
connection._timestamp = connectionSettings.timestamp;
|
||||
|
||||
let section = connection._section;
|
||||
|
||||
if (connection._section == NMConnectionCategory.INVALID)
|
||||
if (section == NMConnectionCategory.INVALID)
|
||||
return;
|
||||
if (section == NMConnectionCategory.VPN) {
|
||||
this._devices.vpn.device.checkConnection(connection);
|
||||
this._devices.vpn.section.actor.show();
|
||||
this._syncSectionTitle(section);
|
||||
} else {
|
||||
let devices = this._devices[section].devices;
|
||||
for (let i = 0; i < devices.length; i++) {
|
||||
@ -1965,12 +2016,10 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
this._statusSection.actor.hide();
|
||||
|
||||
this._syncSectionTitle('wired');
|
||||
this._syncSectionTitle('wireless');
|
||||
this._syncSectionTitle('wwan');
|
||||
|
||||
if (!this._devices.vpn.device.empty)
|
||||
this._devices.vpn.section.actor.show();
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRED);
|
||||
this._syncSectionTitle(NMConnectionCategory.WIRELESS);
|
||||
this._syncSectionTitle(NMConnectionCategory.WWAN);
|
||||
this._syncSectionTitle(NMConnectionCategory.VPN);
|
||||
},
|
||||
|
||||
_syncNMState: function() {
|
||||
|
@ -212,7 +212,7 @@ const DeviceItem = new Lang.Class({
|
||||
case UPDeviceType.COMPUTER:
|
||||
return _("Computer");
|
||||
default:
|
||||
return _("Unknown");
|
||||
return C_("device", "Unknown");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -420,14 +420,13 @@ const ChatSource = new Lang.Class({
|
||||
Extends: MessageTray.Source,
|
||||
|
||||
_init: function(account, conn, channel, contact, client) {
|
||||
this.isChat = true;
|
||||
|
||||
this._account = account;
|
||||
this._contact = contact;
|
||||
this._client = client;
|
||||
|
||||
this.parent(contact.get_alias());
|
||||
|
||||
this.isChat = true;
|
||||
this._pendingMessages = [];
|
||||
|
||||
this._conn = conn;
|
||||
@ -510,10 +509,10 @@ const ChatSource = new Lang.Class({
|
||||
_getLogMessages: function() {
|
||||
let logManager = Tpl.LogManager.dup_singleton();
|
||||
let entity = Tpl.Entity.new_from_tp_contact(this._contact, Tpl.EntityType.CONTACT);
|
||||
Shell.get_contact_events(logManager,
|
||||
this._account, entity,
|
||||
SCROLLBACK_HISTORY_LINES,
|
||||
Lang.bind(this, this._displayPendingMessages));
|
||||
|
||||
logManager.get_filtered_events_async(this._account, entity,
|
||||
Tpl.EventTypeMask.TEXT, SCROLLBACK_HISTORY_LINES,
|
||||
null, Lang.bind(this, this._displayPendingMessages));
|
||||
},
|
||||
|
||||
_displayPendingMessages: function(logManager, result) {
|
||||
|
@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const AccountsService = imports.gi.AccountsService;
|
||||
const GdmGreeter = imports.gi.GdmGreeter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
@ -473,13 +474,22 @@ const UserMenuButton = new Lang.Class({
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._idleIcon = new St.Icon({ icon_name: 'user-idle',
|
||||
style_class: 'popup-menu-icon' });
|
||||
this._pendingIcon = new St.Icon({ icon_name: 'user-status-pending',
|
||||
style_class: 'popup-menu-icon' });
|
||||
|
||||
this._accountMgr.connect('most-available-presence-changed',
|
||||
Lang.bind(this, this._updatePresenceIcon));
|
||||
this._accountMgr.connect('account-enabled',
|
||||
Lang.bind(this, this._onAccountEnabled));
|
||||
this._accountMgr.connect('account-disabled',
|
||||
Lang.bind(this, this._onAccountDisabled));
|
||||
this._accountMgr.connect('account-removed',
|
||||
Lang.bind(this, this._onAccountDisabled));
|
||||
this._accountMgr.prepare_async(null, Lang.bind(this,
|
||||
function(mgr) {
|
||||
let [presence, s, msg] = mgr.get_most_available_presence();
|
||||
this._updatePresenceIcon(mgr, presence, s, msg);
|
||||
this._setupAccounts();
|
||||
}));
|
||||
|
||||
this._name = new St.Label();
|
||||
@ -549,14 +559,20 @@ const UserMenuButton = new Lang.Class({
|
||||
|
||||
_updateSwitchUser: function() {
|
||||
let allowSwitch = !this._lockdownSettings.get_boolean(DISABLE_USER_SWITCH_KEY);
|
||||
this._loginScreenItem.actor.visible = allowSwitch &&
|
||||
this._userManager.can_switch() &&
|
||||
this._userManager.has_multiple_users;
|
||||
let multiUser = this._userManager.can_switch() && this._userManager.has_multiple_users;
|
||||
let multiSession = GdmGreeter.get_session_ids().length > 1;
|
||||
|
||||
this._loginScreenItem.label.set_text(multiUser ? _("Switch User")
|
||||
: _("Switch Session"));
|
||||
this._loginScreenItem.actor.visible = allowSwitch && (multiUser || multiSession);
|
||||
},
|
||||
|
||||
_updateLogout: function() {
|
||||
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
|
||||
this._logoutItem.actor.visible = allowLogout && this._userManager.has_multiple_users;
|
||||
let multiUser = this._userManager.has_multiple_users;
|
||||
let multiSession = GdmGreeter.get_session_ids().length > 1;
|
||||
|
||||
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession);
|
||||
},
|
||||
|
||||
_updateLockScreen: function() {
|
||||
@ -613,11 +629,52 @@ const UserMenuButton = new Lang.Class({
|
||||
this._iconBox.child = this._offlineIcon;
|
||||
},
|
||||
|
||||
_setupAccounts: function() {
|
||||
let accounts = this._accountMgr.get_valid_accounts();
|
||||
for (let i = 0; i < accounts.length; i++) {
|
||||
accounts[i]._changingId = accounts[i].connect('notify::connection-status',
|
||||
Lang.bind(this, this._updateChangingPresence));
|
||||
}
|
||||
this._updateChangingPresence();
|
||||
},
|
||||
|
||||
_onAccountEnabled: function(accountMgr, account) {
|
||||
if (!account._changingId)
|
||||
account._changingId = account.connect('notify::connection-status',
|
||||
Lang.bind(this, this._updateChangingPresence));
|
||||
this._updateChangingPresence();
|
||||
},
|
||||
|
||||
_onAccountDisabled: function(accountMgr, account) {
|
||||
account.disconnect(account._changingId);
|
||||
account._changingId = 0;
|
||||
this._updateChangingPresence();
|
||||
},
|
||||
|
||||
_updateChangingPresence: function() {
|
||||
let accounts = this._accountMgr.get_valid_accounts();
|
||||
let changing = false;
|
||||
for (let i = 0; i < accounts.length; i++) {
|
||||
if (accounts[i].connection_status == Tp.ConnectionStatus.CONNECTING) {
|
||||
changing = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (changing) {
|
||||
this._iconBox.child = this._pendingIcon;
|
||||
} else {
|
||||
let [presence, s, msg] = this._accountMgr.get_most_available_presence();
|
||||
this._updatePresenceIcon(this._accountMgr, presence, s, msg);
|
||||
}
|
||||
},
|
||||
|
||||
_createSubMenu: function() {
|
||||
let item;
|
||||
|
||||
item = new IMStatusChooserItem();
|
||||
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
|
||||
if (Main.sessionMode.allowSettings)
|
||||
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
this._statusChooser = item;
|
||||
|
||||
@ -629,9 +686,11 @@ const UserMenuButton = new Lang.Class({
|
||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||
this.menu.addMenuItem(item);
|
||||
|
||||
item = new PopupMenu.PopupMenuItem(_("System Settings"));
|
||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
if (Main.sessionMode.allowSettings) {
|
||||
item = new PopupMenu.PopupMenuItem(_("System Settings"));
|
||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
||||
this.menu.addMenuItem(item);
|
||||
}
|
||||
|
||||
item = new PopupMenu.PopupAlternatingMenuItem(_("Power Off"),
|
||||
_("Suspend"));
|
||||
|
@ -529,9 +529,11 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
this._updateAlwaysZoom();
|
||||
}));
|
||||
|
||||
global.screen.connect('notify::n-workspaces',
|
||||
Lang.bind(this, this._workspacesChanged));
|
||||
|
||||
this._switchWorkspaceNotifyId = 0;
|
||||
|
||||
this._nWorkspacesChangedId = 0;
|
||||
this._itemDragBeginId = 0;
|
||||
this._itemDragCancelledId = 0;
|
||||
this._itemDragEndId = 0;
|
||||
@ -570,9 +572,6 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
global.screen.connect('restacked',
|
||||
Lang.bind(this, this._onRestacked));
|
||||
|
||||
if (this._nWorkspacesChangedId == 0)
|
||||
this._nWorkspacesChangedId = global.screen.connect('notify::n-workspaces',
|
||||
Lang.bind(this, this._workspacesChanged));
|
||||
if (this._itemDragBeginId == 0)
|
||||
this._itemDragBeginId = Main.overview.connect('item-drag-begin',
|
||||
Lang.bind(this, this._dragBegin));
|
||||
@ -925,19 +924,16 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
},
|
||||
|
||||
_workspacesChanged: function() {
|
||||
let oldNumWorkspaces = this._workspaces[0].length;
|
||||
let newNumWorkspaces = global.screen.n_workspaces;
|
||||
let active = global.screen.get_active_workspace_index();
|
||||
|
||||
if (oldNumWorkspaces == newNumWorkspaces)
|
||||
return;
|
||||
|
||||
this._updateAlwaysZoom();
|
||||
this._updateZoom();
|
||||
|
||||
if (this._workspacesViews == null)
|
||||
return;
|
||||
|
||||
let oldNumWorkspaces = this._workspaces[0].length;
|
||||
let newNumWorkspaces = global.screen.n_workspaces;
|
||||
let active = global.screen.get_active_workspace_index();
|
||||
|
||||
let lostWorkspaces = [];
|
||||
if (newNumWorkspaces > oldNumWorkspaces) {
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
|
351
po/gl.po
351
po/gl.po
@ -12,8 +12,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-05-11 11:31+0200\n"
|
||||
"PO-Revision-Date: 2012-05-11 11:31+0200\n"
|
||||
"POT-Creation-Date: 2012-06-03 15:02+0200\n"
|
||||
"PO-Revision-Date: 2012-06-03 15:02+0200\n"
|
||||
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
|
||||
"Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
|
||||
"Language: gl\n"
|
||||
@ -21,7 +21,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||
"X-Generator: Lokalize 1.2\n"
|
||||
"X-Generator: Gtranslator 2.91.4\n"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
@ -269,8 +269,8 @@ msgid "Not listed?"
|
||||
msgstr "Non está na lista?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
|
||||
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:459
|
||||
#: ../js/ui/extensionSystem.js:375 ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:431
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
@ -283,8 +283,8 @@ msgstr "Iniciar sesión"
|
||||
msgid "Login Window"
|
||||
msgstr "Xanela de inicio de sesión"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:588
|
||||
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:637
|
||||
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:604
|
||||
#: ../js/ui/userMenu.js:608 ../js/ui/userMenu.js:696
|
||||
msgid "Suspend"
|
||||
msgstr "Suspender"
|
||||
|
||||
@ -292,8 +292,8 @@ msgstr "Suspender"
|
||||
msgid "Restart"
|
||||
msgstr "Reiniciar"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:590
|
||||
#: ../js/ui/userMenu.js:592 ../js/ui/userMenu.js:636
|
||||
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:606
|
||||
#: ../js/ui/userMenu.js:608 ../js/ui/userMenu.js:695
|
||||
msgid "Power Off"
|
||||
msgstr "Apagar"
|
||||
|
||||
@ -351,12 +351,12 @@ msgstr "%s foi eliminado dos seus favoritos."
|
||||
msgid "Removable Devices"
|
||||
msgstr "Dispositivos extraíbeis"
|
||||
|
||||
#: ../js/ui/autorunManager.js:560
|
||||
#: ../js/ui/autorunManager.js:553
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Abrir con %s"
|
||||
|
||||
#: ../js/ui/autorunManager.js:586
|
||||
#: ../js/ui/autorunManager.js:579
|
||||
msgid "Eject"
|
||||
msgstr "Expulsar"
|
||||
|
||||
@ -506,20 +506,20 @@ msgstr "Esta semana"
|
||||
msgid "Next week"
|
||||
msgstr "A vindeira semana"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:66 ../js/ui/notificationDaemon.js:486
|
||||
#: ../js/ui/status/power.js:215 ../src/shell-app.c:374
|
||||
#: ../js/ui/contactDisplay.js:66
|
||||
msgctxt "contact"
|
||||
msgid "Unknown"
|
||||
msgstr "Descoñecido"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:129
|
||||
#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:130
|
||||
msgid "Available"
|
||||
msgstr "Dispoñíbel"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:138
|
||||
#: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:139
|
||||
msgid "Away"
|
||||
msgstr "Ausente"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:98 ../js/ui/userMenu.js:132
|
||||
#: ../js/ui/contactDisplay.js:98 ../js/ui/userMenu.js:133
|
||||
msgid "Busy"
|
||||
msgstr "Ocupado"
|
||||
|
||||
@ -531,62 +531,62 @@ msgstr "Desconectado"
|
||||
msgid "CONTACTS"
|
||||
msgstr "CONTACTOS"
|
||||
|
||||
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1209
|
||||
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1239
|
||||
msgid "Remove"
|
||||
msgstr "Quitar"
|
||||
|
||||
#: ../js/ui/dateMenu.js:103
|
||||
#: ../js/ui/dateMenu.js:101
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Preferencias de data e hora"
|
||||
|
||||
#: ../js/ui/dateMenu.js:129
|
||||
#: ../js/ui/dateMenu.js:127
|
||||
msgid "Open Calendar"
|
||||
msgstr "Abrir o calendario"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/dateMenu.js:187
|
||||
#: ../js/ui/dateMenu.js:185
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e de %b, %R:%S"
|
||||
|
||||
#: ../js/ui/dateMenu.js:188
|
||||
#: ../js/ui/dateMenu.js:186
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e de %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/dateMenu.js:192
|
||||
#: ../js/ui/dateMenu.js:190
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R:%S"
|
||||
|
||||
#: ../js/ui/dateMenu.js:193
|
||||
#: ../js/ui/dateMenu.js:191
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/dateMenu.js:200
|
||||
#: ../js/ui/dateMenu.js:198
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e de %b, %l:%M:%S"
|
||||
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
#: ../js/ui/dateMenu.js:199
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e de %b, %l:%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
#: ../js/ui/dateMenu.js:203
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l:%M:%S %p"
|
||||
|
||||
#: ../js/ui/dateMenu.js:206
|
||||
#: ../js/ui/dateMenu.js:204
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l:%M %p"
|
||||
|
||||
#. 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:217
|
||||
#: ../js/ui/dateMenu.js:215
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%a, %e de %B, %Y"
|
||||
|
||||
@ -680,11 +680,11 @@ msgstr[1] "O seu computador reiniciarase automaticamente en %d segundos."
|
||||
msgid "Restarting the system."
|
||||
msgstr "Reiniciando o sistema."
|
||||
|
||||
#: ../js/ui/extensionSystem.js:404
|
||||
#: ../js/ui/extensionSystem.js:379
|
||||
msgid "Install"
|
||||
msgstr "Instalar"
|
||||
|
||||
#: ../js/ui/extensionSystem.js:408
|
||||
#: ../js/ui/extensionSystem.js:383
|
||||
#, c-format
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Desexa descargar e instalar «%s» desde extensions.gnome.org?"
|
||||
@ -693,7 +693,7 @@ msgstr "Desexa descargar e instalar «%s» desde extensions.gnome.org?"
|
||||
msgid "tray"
|
||||
msgstr "área de notificación"
|
||||
|
||||
#: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
|
||||
#: ../js/ui/keyboard.js:545 ../js/ui/status/keyboard.js:42
|
||||
#: ../js/ui/status/power.js:203
|
||||
msgid "Keyboard"
|
||||
msgstr "Teclado"
|
||||
@ -755,24 +755,24 @@ msgid "Web Page"
|
||||
msgstr "Páxina web"
|
||||
|
||||
#. Translators: this is a filename used for screencast recording
|
||||
#: ../js/ui/main.js:118
|
||||
#: ../js/ui/main.js:126
|
||||
#, no-c-format
|
||||
msgid "Screencast from %d %t"
|
||||
msgstr "Screencast desde %d %t"
|
||||
|
||||
#: ../js/ui/messageTray.js:1202
|
||||
#: ../js/ui/messageTray.js:1232
|
||||
msgid "Open"
|
||||
msgstr "Abrir"
|
||||
|
||||
#: ../js/ui/messageTray.js:1219
|
||||
#: ../js/ui/messageTray.js:1249
|
||||
msgid "Unmute"
|
||||
msgstr "Desactivar silencio"
|
||||
|
||||
#: ../js/ui/messageTray.js:1219
|
||||
#: ../js/ui/messageTray.js:1249
|
||||
msgid "Mute"
|
||||
msgstr "Silenciar"
|
||||
|
||||
#: ../js/ui/messageTray.js:2492
|
||||
#: ../js/ui/messageTray.js:2522
|
||||
msgid "System Information"
|
||||
msgstr "Información do sistema"
|
||||
|
||||
@ -857,39 +857,44 @@ msgstr "Contrasinal da rede de banda larga móbil"
|
||||
msgid "A password is required to connect to '%s'."
|
||||
msgstr "Requírese un contrasinal para conectarse a «%s»."
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:486 ../src/shell-app.c:374
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Descoñecido"
|
||||
|
||||
#: ../js/ui/overview.js:90
|
||||
msgid "Undo"
|
||||
msgstr "Desfacer"
|
||||
|
||||
#: ../js/ui/overview.js:132
|
||||
#: ../js/ui/overview.js:130
|
||||
msgid "Overview"
|
||||
msgstr "Vista xeral"
|
||||
|
||||
#: ../js/ui/overview.js:202
|
||||
#: ../js/ui/overview.js:200
|
||||
msgid "Windows"
|
||||
msgstr "Xanelas"
|
||||
|
||||
#: ../js/ui/overview.js:205
|
||||
#: ../js/ui/overview.js:203
|
||||
msgid "Applications"
|
||||
msgstr "Aplicativos"
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/overview.js:231
|
||||
#: ../js/ui/overview.js:229
|
||||
msgid "Dash"
|
||||
msgstr "Taboleiro"
|
||||
|
||||
#: ../js/ui/panel.js:592
|
||||
#: ../js/ui/panel.js:564
|
||||
msgid "Quit"
|
||||
msgstr "Saír"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:624
|
||||
#: ../js/ui/panel.js:596
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#: ../js/ui/panel.js:999
|
||||
#: ../js/ui/panel.js:962
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
@ -943,11 +948,11 @@ msgstr "toggle-switch-intl"
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Escriba unha orde:"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:321
|
||||
#: ../js/ui/searchDisplay.js:323
|
||||
msgid "Searching..."
|
||||
msgstr "Buscando…"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:374
|
||||
#: ../js/ui/searchDisplay.js:376
|
||||
msgid "No matching results."
|
||||
msgstr "Non hai resultados que coincidan."
|
||||
|
||||
@ -967,7 +972,7 @@ msgstr "Mostrar texto"
|
||||
msgid "Hide Text"
|
||||
msgstr "Ocultar texto"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:271
|
||||
#: ../js/ui/shellMountOperation.js:272
|
||||
msgid "Wrong password, please try again"
|
||||
msgstr "Contrasinal incorrecto, ténteo de novo"
|
||||
|
||||
@ -1019,9 +1024,9 @@ msgid "Large Text"
|
||||
msgstr "Texto grande"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
|
||||
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:338
|
||||
#: ../js/ui/status/bluetooth.js:368 ../js/ui/status/bluetooth.js:404
|
||||
#: ../js/ui/status/bluetooth.js:433 ../js/ui/status/network.js:890
|
||||
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:308
|
||||
#: ../js/ui/status/bluetooth.js:339 ../js/ui/status/bluetooth.js:375
|
||||
#: ../js/ui/status/bluetooth.js:404 ../js/ui/status/network.js:889
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@ -1050,11 +1055,12 @@ msgstr "hardware desactivado"
|
||||
msgid "Connection"
|
||||
msgstr "Conexión"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:491
|
||||
#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:490
|
||||
msgid "disconnecting..."
|
||||
msgstr "desconectando…"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:497
|
||||
#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:496
|
||||
#: ../js/ui/status/network.js:956
|
||||
msgid "connecting..."
|
||||
msgstr "conectando…"
|
||||
|
||||
@ -1087,69 +1093,69 @@ msgstr "Preferencias do rato"
|
||||
msgid "Sound Settings"
|
||||
msgstr "Preferencias do son"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:369
|
||||
#: ../js/ui/status/bluetooth.js:340
|
||||
#, c-format
|
||||
msgid "Authorization request from %s"
|
||||
msgstr "Solicitude de autorización de %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:375
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
#, c-format
|
||||
msgid "Device %s wants access to the service '%s'"
|
||||
msgstr "O dispositivo %s quere acceder ao servizo «%s»"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:377
|
||||
#: ../js/ui/status/bluetooth.js:348
|
||||
msgid "Always grant access"
|
||||
msgstr "Conceder acceso sempre"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:378
|
||||
#: ../js/ui/status/bluetooth.js:349
|
||||
msgid "Grant this time only"
|
||||
msgstr "Conceder só esta vez"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:379 ../js/ui/telepathyClient.js:1093
|
||||
#: ../js/ui/status/bluetooth.js:350 ../js/ui/telepathyClient.js:1090
|
||||
msgid "Reject"
|
||||
msgstr "Rexeitar"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:405
|
||||
#: ../js/ui/status/bluetooth.js:376
|
||||
#, c-format
|
||||
msgid "Pairing confirmation for %s"
|
||||
msgstr "Confirmación de emparellado para «%s»"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:441
|
||||
#: ../js/ui/status/bluetooth.js:382 ../js/ui/status/bluetooth.js:412
|
||||
#, c-format
|
||||
msgid "Device %s wants to pair with this computer"
|
||||
msgstr "O dispositivo «%s» quere emparellarse con este equipo"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:412
|
||||
#: ../js/ui/status/bluetooth.js:383
|
||||
#, c-format
|
||||
msgid "Please confirm whether the PIN '%s' matches the one on the device."
|
||||
msgstr "Confirme que o PIN mostrado en «%s» coincide co do dispositivo."
|
||||
msgid "Please confirm whether the PIN '%06d' matches the one on the device."
|
||||
msgstr "Confirme que o PIN «%06d» coincide co mostrado no dispositivo."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:414
|
||||
#: ../js/ui/status/bluetooth.js:385
|
||||
msgid "Matches"
|
||||
msgstr "Coincide"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:415
|
||||
#: ../js/ui/status/bluetooth.js:386
|
||||
msgid "Does not match"
|
||||
msgstr "Non coincide"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:434
|
||||
#: ../js/ui/status/bluetooth.js:405
|
||||
#, c-format
|
||||
msgid "Pairing request for %s"
|
||||
msgstr "Solicitude de emparellamento para «%s»"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:442
|
||||
#: ../js/ui/status/bluetooth.js:413
|
||||
msgid "Please enter the PIN mentioned on the device."
|
||||
msgstr "Escriba o PIN mencionado no dispositivo."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:458
|
||||
#: ../js/ui/status/bluetooth.js:430
|
||||
msgid "OK"
|
||||
msgstr "Aceptar"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:68
|
||||
#: ../js/ui/status/keyboard.js:69
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Mostrar a distribución do teclado"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:73
|
||||
#: ../js/ui/status/keyboard.js:71
|
||||
msgid "Region and Language Settings"
|
||||
msgstr "Configuración rexional e de idioma"
|
||||
|
||||
@ -1164,116 +1170,116 @@ 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:489
|
||||
#: ../js/ui/status/network.js:488
|
||||
msgid "unmanaged"
|
||||
msgstr "non xestionada"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: ../js/ui/status/network.js:500
|
||||
#: ../js/ui/status/network.js:499 ../js/ui/status/network.js:959
|
||||
msgid "authentication required"
|
||||
msgstr "requírese autenticación"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing
|
||||
#: ../js/ui/status/network.js:510
|
||||
#: ../js/ui/status/network.js:509
|
||||
msgid "firmware missing"
|
||||
msgstr "falta o «firmware»"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:517
|
||||
#: ../js/ui/status/network.js:516
|
||||
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:522
|
||||
#: ../js/ui/status/network.js:521
|
||||
msgid "unavailable"
|
||||
msgstr "non dispoñíbel"
|
||||
|
||||
#: ../js/ui/status/network.js:524
|
||||
#: ../js/ui/status/network.js:523 ../js/ui/status/network.js:961
|
||||
msgid "connection failed"
|
||||
msgstr "conexión fallida"
|
||||
|
||||
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1497
|
||||
#: ../js/ui/status/network.js:584 ../js/ui/status/network.js:1537
|
||||
msgid "More..."
|
||||
msgstr "Máis…"
|
||||
|
||||
#. 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:621 ../js/ui/status/network.js:1432
|
||||
#: ../js/ui/status/network.js:620 ../js/ui/status/network.js:1472
|
||||
msgid "Connected (private)"
|
||||
msgstr "Conectada (privada)"
|
||||
|
||||
#: ../js/ui/status/network.js:696
|
||||
#: ../js/ui/status/network.js:695
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Ethernet automática"
|
||||
|
||||
#: ../js/ui/status/network.js:754
|
||||
#: ../js/ui/status/network.js:753
|
||||
msgid "Auto broadband"
|
||||
msgstr "Banda larga automática"
|
||||
|
||||
#: ../js/ui/status/network.js:757
|
||||
#: ../js/ui/status/network.js:756
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Marcado automático"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:876 ../js/ui/status/network.js:1444
|
||||
#: ../js/ui/status/network.js:875 ../js/ui/status/network.js:1484
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "%s automática"
|
||||
|
||||
#: ../js/ui/status/network.js:878
|
||||
#: ../js/ui/status/network.js:877
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Bluetooth automática"
|
||||
|
||||
#: ../js/ui/status/network.js:1446
|
||||
#: ../js/ui/status/network.js:1486
|
||||
msgid "Auto wireless"
|
||||
msgstr "Sen fíos automática"
|
||||
|
||||
#: ../js/ui/status/network.js:1533
|
||||
#: ../js/ui/status/network.js:1573
|
||||
msgid "Network"
|
||||
msgstr "Rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1540
|
||||
#: ../js/ui/status/network.js:1580
|
||||
msgid "Enable networking"
|
||||
msgstr "Activar rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1552
|
||||
#: ../js/ui/status/network.js:1601
|
||||
msgid "Wired"
|
||||
msgstr "Con fíos"
|
||||
|
||||
#: ../js/ui/status/network.js:1563
|
||||
#: ../js/ui/status/network.js:1612
|
||||
msgid "Wireless"
|
||||
msgstr "Sen fíos"
|
||||
|
||||
#: ../js/ui/status/network.js:1573
|
||||
#: ../js/ui/status/network.js:1622
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Banda larga móbil"
|
||||
|
||||
#: ../js/ui/status/network.js:1583
|
||||
#: ../js/ui/status/network.js:1632
|
||||
msgid "VPN Connections"
|
||||
msgstr "Conexións VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1594
|
||||
#: ../js/ui/status/network.js:1639
|
||||
msgid "Network Settings"
|
||||
msgstr "Preferencias da rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1731
|
||||
#: ../js/ui/status/network.js:1683
|
||||
msgid "Network Manager"
|
||||
msgstr "Xestor da rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1776
|
||||
msgid "Connection failed"
|
||||
msgstr "Produciuse un fallo na conexión"
|
||||
|
||||
#: ../js/ui/status/network.js:1732
|
||||
#: ../js/ui/status/network.js:1777
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Produciuse un fallo na activación da conexión de rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1985
|
||||
#: ../js/ui/status/network.js:2037
|
||||
msgid "Networking is disabled"
|
||||
msgstr "A rede está desactivada"
|
||||
|
||||
#: ../js/ui/status/network.js:2109
|
||||
msgid "Network Manager"
|
||||
msgstr "Xestor da rede"
|
||||
|
||||
#: ../js/ui/status/power.js:59
|
||||
msgid "Battery"
|
||||
msgstr "Batería"
|
||||
@ -1366,6 +1372,11 @@ msgstr "Tablet"
|
||||
msgid "Computer"
|
||||
msgstr "Equipo"
|
||||
|
||||
#: ../js/ui/status/power.js:215
|
||||
msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "Descoñecido"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:39
|
||||
msgid "Volume"
|
||||
@ -1391,7 +1402,7 @@ msgstr "Chamar"
|
||||
msgid "File Transfer"
|
||||
msgstr "Transferencia de ficheiro"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:369
|
||||
#: ../js/ui/telepathyClient.js:368
|
||||
msgid "Subscription request"
|
||||
msgstr "Solicitude de autorización"
|
||||
|
||||
@ -1399,22 +1410,22 @@ msgstr "Solicitude de autorización"
|
||||
msgid "Connection error"
|
||||
msgstr "Erro de conexión"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:663
|
||||
#: ../js/ui/telepathyClient.js:662
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s está conectado/a."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:667
|
||||
#: ../js/ui/telepathyClient.js:666
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s está desconectado/a."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:671
|
||||
#: ../js/ui/telepathyClient.js:670
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "%s está ausente."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:674
|
||||
#: ../js/ui/telepathyClient.js:673
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s está ocupado/a."
|
||||
@ -1422,35 +1433,35 @@ msgstr "%s está ocupado/a."
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/telepathyClient.js:889
|
||||
#: ../js/ui/telepathyClient.js:888
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Enviado ás <b>%X</b> o <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/telepathyClient.js:895
|
||||
#: ../js/ui/telepathyClient.js:894
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Enviado ás <b>%X</b> o <b>%B %d</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/telepathyClient.js:900
|
||||
#: ../js/ui/telepathyClient.js:899
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Enviado ás <b>%X</b> o <b>%B %d</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/telepathyClient.js:942
|
||||
#: ../js/ui/telepathyClient.js:941
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "Agora %s chámase %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1044
|
||||
#: ../js/ui/telepathyClient.js:1041
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Convite a %s"
|
||||
@ -1458,35 +1469,35 @@ msgstr "Convite a %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/telepathyClient.js:1052
|
||||
#: ../js/ui/telepathyClient.js:1049
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s estalle convidando a unirse a %s"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
|
||||
#: ../js/ui/telepathyClient.js:1231
|
||||
#: ../js/ui/telepathyClient.js:1051 ../js/ui/telepathyClient.js:1130
|
||||
#: ../js/ui/telepathyClient.js:1194
|
||||
msgid "Decline"
|
||||
msgstr "Rexeitar"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
|
||||
#: ../js/ui/telepathyClient.js:1232
|
||||
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131
|
||||
#: ../js/ui/telepathyClient.js:1195
|
||||
msgid "Accept"
|
||||
msgstr "Aceptar"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1085
|
||||
#: ../js/ui/telepathyClient.js:1082
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videochamada de %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1088
|
||||
#: ../js/ui/telepathyClient.js:1085
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Chamada de %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/telepathyClient.js:1095
|
||||
#: ../js/ui/telepathyClient.js:1092
|
||||
msgid "Answer"
|
||||
msgstr "Responder"
|
||||
|
||||
@ -1495,112 +1506,112 @@ msgstr "Responder"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/telepathyClient.js:1127
|
||||
#: ../js/ui/telepathyClient.js:1124
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s esta enviándolle %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/telepathyClient.js:1196
|
||||
#: ../js/ui/telepathyClient.js:1159
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s solicítalle permiso para ver cando está en liña"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1289
|
||||
#: ../js/ui/telepathyClient.js:1252
|
||||
msgid "Network error"
|
||||
msgstr "Erro da rede"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1291
|
||||
#: ../js/ui/telepathyClient.js:1254
|
||||
msgid "Authentication failed"
|
||||
msgstr "Fallou a autenticación"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1293
|
||||
#: ../js/ui/telepathyClient.js:1256
|
||||
msgid "Encryption error"
|
||||
msgstr "Erro de cifrado"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1295
|
||||
#: ../js/ui/telepathyClient.js:1258
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Certificado non fornecido"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1297
|
||||
#: ../js/ui/telepathyClient.js:1260
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Non se confía no certificado"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1299
|
||||
#: ../js/ui/telepathyClient.js:1262
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certificado caducado"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1301
|
||||
#: ../js/ui/telepathyClient.js:1264
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Certificado non activado"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1303
|
||||
#: ../js/ui/telepathyClient.js:1266
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "O nome do servidor do certificado non coincide"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1305
|
||||
#: ../js/ui/telepathyClient.js:1268
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "A pegada do certificado non coincide"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1307
|
||||
#: ../js/ui/telepathyClient.js:1270
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Certificado autoasinado"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1309
|
||||
#: ../js/ui/telepathyClient.js:1272
|
||||
msgid "Status is set to offline"
|
||||
msgstr "O estado está definido a «desconectado»"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1311
|
||||
#: ../js/ui/telepathyClient.js:1274
|
||||
msgid "Encryption is not available"
|
||||
msgstr "O cifrado non está dispoñíbel"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1313
|
||||
#: ../js/ui/telepathyClient.js:1276
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "O certificado non é válido"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1315
|
||||
#: ../js/ui/telepathyClient.js:1278
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Rexeitouse a conexión"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1317
|
||||
#: ../js/ui/telepathyClient.js:1280
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Non é posíbel estabelecer a conexión"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1319
|
||||
#: ../js/ui/telepathyClient.js:1282
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Perdeuse a conexión"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1321
|
||||
#: ../js/ui/telepathyClient.js:1284
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Esta cuenta xa está conectada ao servidor"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1323
|
||||
#: ../js/ui/telepathyClient.js:1286
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"Substituíuse a conexión por unha nova conexión empregando o mesmo recurso"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1325
|
||||
#: ../js/ui/telepathyClient.js:1288
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Esta conta xa existe no servidor"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1327
|
||||
#: ../js/ui/telepathyClient.js:1290
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr ""
|
||||
"Nestes intres o servidor está moi ocupado tentando xestionar a conexión"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1329
|
||||
#: ../js/ui/telepathyClient.js:1292
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Revogouse o certificado"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1331
|
||||
#: ../js/ui/telepathyClient.js:1294
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"O certificado usa un algoritmo de cifrado inseguro ou é criptográficamente "
|
||||
"débil"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1333
|
||||
#: ../js/ui/telepathyClient.js:1296
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -1609,66 +1620,70 @@ msgstr ""
|
||||
"certificado do servidor excede os límites impostos pola biblioteca de "
|
||||
"criptografía."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1335
|
||||
#: ../js/ui/telepathyClient.js:1298
|
||||
msgid "Internal error"
|
||||
msgstr "Erro interno"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1345
|
||||
#: ../js/ui/telepathyClient.js:1308
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Fallou a conexión a %s"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1354
|
||||
#: ../js/ui/telepathyClient.js:1317
|
||||
msgid "Reconnect"
|
||||
msgstr "Reconectar"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1355
|
||||
#: ../js/ui/telepathyClient.js:1318
|
||||
msgid "Edit account"
|
||||
msgstr "Editar conta"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1401
|
||||
#: ../js/ui/telepathyClient.js:1364
|
||||
msgid "Unknown reason"
|
||||
msgstr "Razón descoñecida"
|
||||
|
||||
#: ../js/ui/userMenu.js:135
|
||||
#: ../js/ui/userMenu.js:136
|
||||
msgid "Hidden"
|
||||
msgstr "Oculto"
|
||||
|
||||
#: ../js/ui/userMenu.js:141
|
||||
#: ../js/ui/userMenu.js:142
|
||||
msgid "Idle"
|
||||
msgstr "Inactivo"
|
||||
|
||||
#: ../js/ui/userMenu.js:144
|
||||
#: ../js/ui/userMenu.js:145
|
||||
msgid "Unavailable"
|
||||
msgstr "Non dispoñíbel"
|
||||
|
||||
#: ../js/ui/userMenu.js:624
|
||||
msgid "Notifications"
|
||||
msgstr "Notificacións"
|
||||
|
||||
#: ../js/ui/userMenu.js:632
|
||||
msgid "System Settings"
|
||||
msgstr "Preferencias do sistema"
|
||||
|
||||
#: ../js/ui/userMenu.js:646
|
||||
#: ../js/ui/userMenu.js:565 ../js/ui/userMenu.js:705
|
||||
msgid "Switch User"
|
||||
msgstr "Cambiar de usuario"
|
||||
|
||||
#: ../js/ui/userMenu.js:651
|
||||
#: ../js/ui/userMenu.js:566
|
||||
msgid "Switch Session"
|
||||
msgstr "Cambiar de sesión"
|
||||
|
||||
#: ../js/ui/userMenu.js:681
|
||||
msgid "Notifications"
|
||||
msgstr "Notificacións"
|
||||
|
||||
#: ../js/ui/userMenu.js:690
|
||||
msgid "System Settings"
|
||||
msgstr "Preferencias do sistema"
|
||||
|
||||
#: ../js/ui/userMenu.js:710
|
||||
msgid "Log Out"
|
||||
msgstr "Saír da sesión"
|
||||
|
||||
#: ../js/ui/userMenu.js:659
|
||||
#: ../js/ui/userMenu.js:718
|
||||
msgid "Lock"
|
||||
msgstr "Bloquear"
|
||||
|
||||
#: ../js/ui/userMenu.js:677
|
||||
#: ../js/ui/userMenu.js:736
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "O seu estado do chat estabelecerase a «ocupado»"
|
||||
|
||||
#: ../js/ui/userMenu.js:678
|
||||
#: ../js/ui/userMenu.js:737
|
||||
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."
|
||||
@ -1734,15 +1749,25 @@ msgstr[1] "%u entradas"
|
||||
msgid "System Sounds"
|
||||
msgstr "Sons do sistema"
|
||||
|
||||
#: ../src/main.c:255
|
||||
#: ../src/main.c:313
|
||||
msgid "Print version"
|
||||
msgstr "Imprimir versión"
|
||||
|
||||
#: ../src/main.c:261
|
||||
#: ../src/main.c:319
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Modo usado por GDM para a pantalla de inicio"
|
||||
|
||||
#: ../src/shell-app.c:619
|
||||
#: ../src/main.c:325
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr ""
|
||||
"Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de "
|
||||
"sesión"
|
||||
|
||||
#: ../src/main.c:331
|
||||
msgid "List possible modes"
|
||||
msgstr "Listar os modos posíbeis"
|
||||
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "Produciuse un fallo ao iniciar «%s»"
|
||||
|
44
po/ko.po
44
po/ko.po
@ -13,7 +13,7 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2012-04-19 21:14+0000\n"
|
||||
"PO-Revision-Date: 2012-04-26 01:05+0900\n"
|
||||
"PO-Revision-Date: 2012-05-19 22:57+0900\n"
|
||||
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
|
||||
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -51,7 +51,7 @@ msgstr "Alt-F2 대화 상자에서 내부 디버깅 및 감시 기능에 접근
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||
msgid "Uuids of extensions to enable"
|
||||
msgstr "사용할 확장 기능의 UUID 목록"
|
||||
msgstr "사용할 확장의 UUID 목록"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||
msgid ""
|
||||
@ -71,11 +71,7 @@ msgid ""
|
||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"셸에서는 최근에 사용한 프로그램을 (실행 메뉴 등에서) 표시하는 목적으로, 현재 "
|
||||
"사용 중인 프로그램을 감시합니다. 이 데이터는 비공개 데이터이지만 사생활 문제"
|
||||
"가 걱정된다면 이 기능을 끌 수도 있습니다. 단 이 기능을 사용하지 않더라도 이"
|
||||
"미 저장된 데이터를 제거하지는 않습니다."
|
||||
msgstr "셸에서는 최근에 사용한 프로그램을(실행 메뉴 등에서) 표시하는 목적으로, 현재 사용 중인 프로그램을 감시합니다. 이 데이터는 비공개 데이터이지만 사생활 문제가 걱정된다면 이 기능을 끌 수도 있습니다. 단 이 기능을 사용하지 않더라도 이미 저장된 데이터를 제거하지는 않습니다."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
@ -93,7 +89,7 @@ msgstr "사용하지 않는 OpenSearch 서비스"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||
msgid "History for command (Alt-F2) dialog"
|
||||
msgstr "명령어 대화 상자에 (Alt-F2) 기록 기능"
|
||||
msgstr "명령어 대화 상자에(Alt-F2) 기록 기능"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||
msgid "History for the looking glass dialog"
|
||||
@ -166,7 +162,7 @@ msgid "The gstreamer pipeline used to encode the screencast"
|
||||
msgstr "스크린 방송 인코딩에 사용할 gstreamer 파이프라인"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:28
|
||||
#, no-c-format, fuzzy
|
||||
#, no-c-format
|
||||
msgid ""
|
||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||
"used for gst-launch. The pipeline should have an unconnected sink pad where "
|
||||
@ -178,45 +174,31 @@ msgid ""
|
||||
"'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM "
|
||||
"using the VP8 codec. %T is used as a placeholder for a guess at the optimal "
|
||||
"thread count on the system."
|
||||
msgstr ""
|
||||
"녹화 인코딩에 사용할 GStreamer 파이프라인을 지정합니다. gst-launch에 사용하"
|
||||
"는 문법을 따릅니다. 파이프라인은 녹화한 영상이 있는 싱크 패드를 연결하지 않"
|
||||
"은 상태여야 합니다. 보통 소스 패드와 연결하지 않았을 것입니다. 이 패드의 출력"
|
||||
"은 출력 파일에 기록할 것입니다. 그러나 파이프라인은 이 출력을 다룰 수 있기도 "
|
||||
"합니다 - 아마 shout2send와 같은 것을 통해 icecast 서버로 출력을 보내는데 사용"
|
||||
"할지도 모릅니다. 만약 설정을 취소하거나 빈 값으로 설정한다면, 기본 파이프라인"
|
||||
"을 사용할 것입니다. 이것은 현재 'vp8enc quality=8 speed=6 threads=%T ! "
|
||||
"queue ! webmmux' 이며 VP8 코덱을 사용하여 WEBM으로 녹화합니다. %T는 시스템 상"
|
||||
"의 최적의 스레드 수를 추측하기 위해 대체기호로 사용합니다."
|
||||
msgstr "녹화 인코딩에 사용할 GStreamer 파이프라인을 지정합니다. gst-launch 프로그램에 사용하는 문법을 따릅니다. 녹화한 영상이 입력되는 싱크 패드는 이 파이프라인에 연결하지 않은 상태여야 합니다. 보통은 소스 패드도 연결하지 않고, 소스 패드의 출력을 출력 파일에 기록합니다. 하지만 파이프라인에서 이 출력을 처리할 수도 있습니다. shout2send 같은 프로그램을 이용해 아이스캐스트 서버로 출력을 보내거나 하는 용도로 사용할 수 있습니다. 설정을 취소하거나 빈 값으로 설정하면, 기본 파이프라인을 사용합니다. 기본 파이프라인은 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux'이고 VP8 코덱을 사용해 WEBM 형식으로 녹화합니다. '%T' 기호는 시스템에서 최적으로 생각되는 스레드 수로 대체됩니다."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:29
|
||||
msgid "File extension used for storing the screencast"
|
||||
msgstr "스크린 방송을 저장할 때 사용할 파일 확장자"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:30
|
||||
#, fuzzy
|
||||
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 "
|
||||
"a different container format."
|
||||
msgstr ""
|
||||
"스크린 방송 녹화 파일 이름은 현재 날짜와 이 확장자를 사용해서 결정됩니다. 녹"
|
||||
"화할 때 다른 형식으로 바꿀 수도 있습니다."
|
||||
msgstr "녹화한 스크린 방송 영상 파일은, 현재 날짜와 여기서 설정하는 확장자를 붙여 파일 이름을 만듭니다. 다른 컨테이너 형식으로 녹화하려면 이 값을 바꿔야 합니다."
|
||||
|
||||
#: ../js/extensionPrefs/main.js:125
|
||||
#, c-format, fuzzy
|
||||
#, c-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "%s에 대한 기본 설정 대화상자를 불러오는데 오류가 발생했습니다:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:165
|
||||
#, fuzzy
|
||||
msgid "<b>Extension</b>"
|
||||
msgstr "<b>확장</b>"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:189
|
||||
#, fuzzy
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "위의 콤보상자를 사용하여 설정할 확장을 선택하십시오."
|
||||
msgstr "위의 콤보상자를 사용해 설정할 확장을 선택하십시오."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:627
|
||||
msgid "Session..."
|
||||
@ -674,13 +656,13 @@ msgstr "다시 입력하십시오:"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:732
|
||||
msgid "No extensions installed"
|
||||
msgstr "확장 기능을 설치하지 않았습니다"
|
||||
msgstr "확장을 설치하지 않았습니다"
|
||||
|
||||
#. Translators: argument is an extension UUID.
|
||||
#: ../js/ui/lookingGlass.js:786
|
||||
#, c-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s이(가) 발생한 에러가 없습니다."
|
||||
msgstr "%s에서 발생한 에러가 없습니다."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:792
|
||||
msgid "Hide Errors"
|
||||
@ -1167,7 +1149,7 @@ msgstr "더 보기..."
|
||||
#. and we cannot access its settings (including the name)
|
||||
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
|
||||
msgid "Connected (private)"
|
||||
msgstr "연결됨 (개인)"
|
||||
msgstr "연결됨(개인)"
|
||||
|
||||
#: ../js/ui/status/network.js:696
|
||||
msgid "Auto Ethernet"
|
||||
@ -1573,7 +1555,7 @@ msgstr "내부 오류"
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1345
|
||||
#, c-format, fuzzy
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "%s에 연결이 실패했습니다"
|
||||
|
||||
|
159
po/lt.po
159
po/lt.po
@ -3,19 +3,20 @@
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Žygimantas Beručka <zygis@gnome.org>, 2010, 2011, 2012.
|
||||
# Algimantas Margevičius <gymka@mail.ru>, 2011.
|
||||
# Mantas Kriaučiūnas <mantas@akl.lt>, 2012.
|
||||
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-03-30 17:59+0000\n"
|
||||
"POT-Creation-Date: 2012-05-19 13:58+0000\n"
|
||||
"PO-Revision-Date: 2012-04-05 15:14+0300\n"
|
||||
"Last-Translator: Žygimantas Beručka <zygis@gnome.org>\n"
|
||||
"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
|
||||
"Language-Team: Lithuanian\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: lt\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%"
|
||||
"100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: Virtaal 0.7.0\n"
|
||||
@ -23,7 +24,7 @@ msgstr ""
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
msgstr "GNOME Shell aplinka"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
@ -79,10 +80,11 @@ msgid ""
|
||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||
"remove already saved data."
|
||||
msgstr ""
|
||||
"Apvalkalas paprastai stebi aktyvias programas siekiant pateikti dažniausiai "
|
||||
"naudojamas (pvz., leistukuose). Nors šie duomenys konfidencialiai saugomi, "
|
||||
"jei norite, saugumo sumetimais galite šią funkciją išjungti. Atminkite, kad "
|
||||
"tai padarius jau įrašyti duomenys jau nebus įrašyti."
|
||||
"Įprastai GNOME aplinka stebi aktyvias programas siekiant pateikti "
|
||||
"dažniausiai naudojamas (pvz., leistukuose). Nors šie duomenys "
|
||||
"konfidencialiai saugomi, jei norite, saugumo sumetimais galite šią funkciją "
|
||||
"išjungti. Atminkite, kad išjungus šią funkciją anksčiau įrašyti duomenys "
|
||||
"nebus pašalinti."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||
msgid "List of desktop file IDs for favorite applications"
|
||||
@ -222,7 +224,7 @@ msgstr ""
|
||||
#: ../js/extensionPrefs/main.js:125
|
||||
#, c-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "Kilo klaida įkeliant %s nustatymų dialogą:"
|
||||
msgstr "Įvyko klaida įkeliant %s nustatymų dialogą:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:165
|
||||
msgid "<b>Extension</b>"
|
||||
@ -232,40 +234,40 @@ msgstr "<b>Plėtinys</b>"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Išskleidžiamajame sąraše pasirinkite konfigūruotiną plėtinį."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:624
|
||||
#: ../js/gdm/loginDialog.js:627
|
||||
msgid "Session..."
|
||||
msgstr "Seansas..."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:786
|
||||
#: ../js/gdm/loginDialog.js:789
|
||||
msgctxt "title"
|
||||
msgid "Sign In"
|
||||
msgstr "Prisijungti"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/loginDialog.js:831
|
||||
#: ../js/gdm/loginDialog.js:834
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(arba perbraukite pirštu)"
|
||||
|
||||
#. 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:852
|
||||
#: ../js/gdm/loginDialog.js:855
|
||||
msgid "Not listed?"
|
||||
msgstr "Nėra sąraše?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:401
|
||||
#: ../js/ui/extensionSystem.js:399 ../js/ui/networkAgent.js:153
|
||||
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
|
||||
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
|
||||
msgid "Cancel"
|
||||
msgstr "Atšaukti"
|
||||
msgstr "Atsisakyti"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1025
|
||||
#: ../js/gdm/loginDialog.js:1028
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Prisijungti"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1377
|
||||
#: ../js/gdm/loginDialog.js:1380
|
||||
msgid "Login Window"
|
||||
msgstr "Prisijungimo langas"
|
||||
|
||||
@ -673,11 +675,11 @@ msgstr[2] "Sistema bus paleista iš naujo po %d sekundžių."
|
||||
msgid "Restarting the system."
|
||||
msgstr "Sistema paleidžiama iš naujo."
|
||||
|
||||
#: ../js/ui/extensionSystem.js:403
|
||||
#: ../js/ui/extensionSystem.js:404
|
||||
msgid "Install"
|
||||
msgstr "Įdiegti"
|
||||
|
||||
#: ../js/ui/extensionSystem.js:407
|
||||
#: ../js/ui/extensionSystem.js:408
|
||||
#, c-format
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Atsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
|
||||
@ -686,7 +688,8 @@ msgstr "Atsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
|
||||
msgid "tray"
|
||||
msgstr "dėklas"
|
||||
|
||||
#: ../js/ui/keyboard.js:544 ../js/ui/status/power.js:203
|
||||
#: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
|
||||
#: ../js/ui/status/power.js:203
|
||||
msgid "Keyboard"
|
||||
msgstr "Klaviatūra"
|
||||
|
||||
@ -722,7 +725,7 @@ msgstr "Įjungta"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1093
|
||||
#: ../js/ui/lookingGlass.js:808 ../src/gvc/gvc-mixer-control.c:1082
|
||||
msgid "Disabled"
|
||||
msgstr "Išjungta"
|
||||
|
||||
@ -939,7 +942,7 @@ msgstr "Įveskite komandą:"
|
||||
msgid "Searching..."
|
||||
msgstr "Ieškoma..."
|
||||
|
||||
#: ../js/ui/searchDisplay.js:414
|
||||
#: ../js/ui/searchDisplay.js:415
|
||||
msgid "No matching results."
|
||||
msgstr "Nerasta atitikmenų."
|
||||
|
||||
@ -1097,7 +1100,7 @@ msgstr "Visada leisti prieigą"
|
||||
msgid "Grant this time only"
|
||||
msgstr "Leisti tik šį kartą"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1091
|
||||
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
|
||||
msgid "Reject"
|
||||
msgstr "Atmesti"
|
||||
|
||||
@ -1174,7 +1177,7 @@ msgstr "Trūksta integruotos programinės įrangos (firmware)"
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:517
|
||||
msgid "cable unplugged"
|
||||
msgstr "kabelis neįjungtas"
|
||||
msgstr "atjungtas laidas"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage
|
||||
@ -1188,7 +1191,7 @@ msgstr "nepavyko prisijungti"
|
||||
|
||||
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
|
||||
msgid "More..."
|
||||
msgstr "Daugiau..."
|
||||
msgstr "Rodyti daugiau tinklų..."
|
||||
|
||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||
#. and we cannot access its settings (including the name)
|
||||
@ -1385,7 +1388,7 @@ msgstr "Skambutis"
|
||||
#. We got the TpContact
|
||||
#: ../js/ui/telepathyClient.js:287
|
||||
msgid "File Transfer"
|
||||
msgstr "Failo perdavimas"
|
||||
msgstr "Failo persiuntimas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:369
|
||||
msgid "Subscription request"
|
||||
@ -1418,35 +1421,35 @@ msgstr "%s yra užsiėmęs (-usi)."
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/telepathyClient.js:887
|
||||
#: ../js/ui/telepathyClient.js:889
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Išsiųsta <b>%X</b> <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/telepathyClient.js:893
|
||||
#: ../js/ui/telepathyClient.js:895
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Išsiųsta <b>%B %d</b>, <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/telepathyClient.js:898
|
||||
#: ../js/ui/telepathyClient.js:900
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Išsiųsta %Y <b>%B %d</b>, <b>%A</b>"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/telepathyClient.js:940
|
||||
#: ../js/ui/telepathyClient.js:942
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s nuo šiol vadinasi %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1042
|
||||
#: ../js/ui/telepathyClient.js:1044
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Kvietimas į %s"
|
||||
@ -1454,35 +1457,35 @@ msgstr "Kvietimas į %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/telepathyClient.js:1050
|
||||
#: ../js/ui/telepathyClient.js:1052
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s jus kviečia prisijungti prie %s"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131
|
||||
#: ../js/ui/telepathyClient.js:1229
|
||||
#: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
|
||||
#: ../js/ui/telepathyClient.js:1231
|
||||
msgid "Decline"
|
||||
msgstr "Atmesti"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1053 ../js/ui/telepathyClient.js:1132
|
||||
#: ../js/ui/telepathyClient.js:1230
|
||||
#: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
|
||||
#: ../js/ui/telepathyClient.js:1232
|
||||
msgid "Accept"
|
||||
msgstr "Priimti"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1083
|
||||
#: ../js/ui/telepathyClient.js:1085
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Vaizdo skambutis nuo %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1086
|
||||
#: ../js/ui/telepathyClient.js:1088
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Skambutis nuo %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/telepathyClient.js:1093
|
||||
#: ../js/ui/telepathyClient.js:1095
|
||||
msgid "Answer"
|
||||
msgstr "Atsiliepti"
|
||||
|
||||
@ -1491,110 +1494,110 @@ msgstr "Atsiliepti"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/telepathyClient.js:1125
|
||||
#: ../js/ui/telepathyClient.js:1127
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s jums siunčia %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/telepathyClient.js:1194
|
||||
#: ../js/ui/telepathyClient.js:1196
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s pageidauja matyti, kai esate prisijungę prie interneto"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1287
|
||||
#: ../js/ui/telepathyClient.js:1289
|
||||
msgid "Network error"
|
||||
msgstr "Tinklo klaida"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1289
|
||||
#: ../js/ui/telepathyClient.js:1291
|
||||
msgid "Authentication failed"
|
||||
msgstr "Nepavyko patvirtinti tapatybės"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1291
|
||||
#: ../js/ui/telepathyClient.js:1293
|
||||
msgid "Encryption error"
|
||||
msgstr "Šifravimo klaida"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1293
|
||||
#: ../js/ui/telepathyClient.js:1295
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Liudijimas nepateiktas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1295
|
||||
#: ../js/ui/telepathyClient.js:1297
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Liudijimas nepatikimas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1297
|
||||
#: ../js/ui/telepathyClient.js:1299
|
||||
msgid "Certificate expired"
|
||||
msgstr "Liudijimo galiojimas pasibaigęs"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1299
|
||||
#: ../js/ui/telepathyClient.js:1301
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Liudijimas neaktyvuotas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1301
|
||||
#: ../js/ui/telepathyClient.js:1303
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Liudijimo serverio vardo nesutapimas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1303
|
||||
#: ../js/ui/telepathyClient.js:1305
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Liudijimo piršto atspaudo nesutapimas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1305
|
||||
#: ../js/ui/telepathyClient.js:1307
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Liudijimas pačių pasirašytas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1307
|
||||
#: ../js/ui/telepathyClient.js:1309
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Nustatyta atsijungimo būsena"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1309
|
||||
#: ../js/ui/telepathyClient.js:1311
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Šifravimas negalimas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1311
|
||||
#: ../js/ui/telepathyClient.js:1313
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Liudijimas netinkamas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1313
|
||||
#: ../js/ui/telepathyClient.js:1315
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Ryšys atmestas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1315
|
||||
#: ../js/ui/telepathyClient.js:1317
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Nepavyko užmegzti ryšio"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1317
|
||||
#: ../js/ui/telepathyClient.js:1319
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Ryšys nutrūko"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1319
|
||||
#: ../js/ui/telepathyClient.js:1321
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Ši paskyra jau prijungta prie serverio"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1321
|
||||
#: ../js/ui/telepathyClient.js:1323
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Ryšys pakeistas nauju ryšiu naudojant tą patį išteklių"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1323
|
||||
#: ../js/ui/telepathyClient.js:1325
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Tokia paskyra serveryje jau yra"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1325
|
||||
#: ../js/ui/telepathyClient.js:1327
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Šiuo metu serveris per daug užimtas šiai užklausai apdoroti"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1327
|
||||
#: ../js/ui/telepathyClient.js:1329
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Liudijimas atšauktas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1329
|
||||
#: ../js/ui/telepathyClient.js:1331
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Liudijimui naudojamas nesaugus šifravimo algoritmas arba jis kriptografiškai "
|
||||
"silpnas"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1331
|
||||
#: ../js/ui/telepathyClient.js:1333
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -1602,26 +1605,26 @@ msgstr ""
|
||||
"Serverio liudijimo ilgis arba liudijimų eilės dydis viršija kriptografijos "
|
||||
"bibliotekos apribojimus"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1333
|
||||
#: ../js/ui/telepathyClient.js:1335
|
||||
msgid "Internal error"
|
||||
msgstr "Vidinė klaida"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1343
|
||||
#: ../js/ui/telepathyClient.js:1345
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Nepavyko prisijungti prie %s"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1352
|
||||
#: ../js/ui/telepathyClient.js:1354
|
||||
msgid "Reconnect"
|
||||
msgstr "Prisijungti iš naujo"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1353
|
||||
#: ../js/ui/telepathyClient.js:1355
|
||||
msgid "Edit account"
|
||||
msgstr "Taisyti paskyrą"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1399
|
||||
#: ../js/ui/telepathyClient.js:1401
|
||||
msgid "Unknown reason"
|
||||
msgstr "Nežinoma priežastis"
|
||||
|
||||
@ -1647,7 +1650,7 @@ msgstr "Pranešimai"
|
||||
|
||||
#: ../js/ui/userMenu.js:639
|
||||
msgid "Online Accounts"
|
||||
msgstr "Tinklo paskyros"
|
||||
msgstr "Interneto paskyros"
|
||||
|
||||
#: ../js/ui/userMenu.js:643
|
||||
msgid "System Settings"
|
||||
@ -1706,7 +1709,7 @@ msgstr "Orakulė sako %s"
|
||||
|
||||
#: ../js/ui/wanda.js:168
|
||||
msgid "Your favorite Easter Egg"
|
||||
msgstr "Jūsų mėgstamiausias vėlykinis kiaušinis"
|
||||
msgstr "Jūsų mėgstamiausias Velykinis kiaušinis"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:19
|
||||
#, c-format
|
||||
@ -1715,7 +1718,7 @@ msgstr "„%s“ yra pasirengusi"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1100
|
||||
#: ../src/gvc/gvc-mixer-control.c:1089
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@ -1725,7 +1728,7 @@ msgstr[2] "%u išvestys"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1110
|
||||
#: ../src/gvc/gvc-mixer-control.c:1099
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
@ -1733,15 +1736,15 @@ msgstr[0] "%u įvestis"
|
||||
msgstr[1] "%u įvestys"
|
||||
msgstr[2] "%u įvestys"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:1408
|
||||
#: ../src/gvc/gvc-mixer-control.c:1397
|
||||
msgid "System Sounds"
|
||||
msgstr "Sistemos garsai"
|
||||
|
||||
#: ../src/main.c:255
|
||||
#: ../src/main.c:256
|
||||
msgid "Print version"
|
||||
msgstr "Išvesti versijos numerį"
|
||||
|
||||
#: ../src/main.c:261
|
||||
#: ../src/main.c:262
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Veiksena, naudojama GDM prisijungimo ekrane"
|
||||
|
||||
@ -1774,7 +1777,7 @@ msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą"
|
||||
#. * nautilus
|
||||
#: ../src/shell-util.c:97
|
||||
msgid "Home"
|
||||
msgstr "Namai"
|
||||
msgstr "Namų aplankas"
|
||||
|
||||
#. Translators: this is the same string as the one found in
|
||||
#. * nautilus
|
||||
|
367
po/nb.po
367
po/nb.po
@ -8,8 +8,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 3.5.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2012-04-30 11:12+0200\n"
|
||||
"PO-Revision-Date: 2012-04-30 11:13+0200\n"
|
||||
"POT-Creation-Date: 2012-05-30 14:16+0200\n"
|
||||
"PO-Revision-Date: 2012-05-30 14:19+0200\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||
"Language: \n"
|
||||
@ -246,8 +246,8 @@ msgid "Not listed?"
|
||||
msgstr "Ikke listet?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1023 ../js/ui/endSessionDialog.js:401
|
||||
#: ../js/ui/extensionSystem.js:400 ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
|
||||
#: ../js/ui/extensionSystem.js:375 ../js/ui/networkAgent.js:153
|
||||
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:431
|
||||
msgid "Cancel"
|
||||
msgstr "Avbryt"
|
||||
|
||||
@ -260,30 +260,31 @@ msgstr "Logg inn"
|
||||
msgid "Login Window"
|
||||
msgstr "Innloggingsvindu"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:155 ../js/ui/userMenu.js:597
|
||||
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:668
|
||||
#: ../js/gdm/powerMenu.js:130 ../js/ui/userMenu.js:595
|
||||
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:647
|
||||
msgid "Suspend"
|
||||
msgstr "Hvilemodus"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:160
|
||||
#: ../js/gdm/powerMenu.js:135
|
||||
msgid "Restart"
|
||||
msgstr "Start på nytt"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:165
|
||||
#: ../js/gdm/powerMenu.js:140 ../js/ui/userMenu.js:597
|
||||
#: ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:646
|
||||
msgid "Power Off"
|
||||
msgstr "Slå av"
|
||||
|
||||
#: ../js/misc/util.js:92
|
||||
#: ../js/misc/util.js:93
|
||||
msgid "Command not found"
|
||||
msgstr "Kommando ikke funnet"
|
||||
|
||||
#. Replace "Error invoking GLib.shell_parse_argv: " with
|
||||
#. something nicer
|
||||
#: ../js/misc/util.js:119
|
||||
#: ../js/misc/util.js:124
|
||||
msgid "Could not parse command:"
|
||||
msgstr "Klarte ikke å lese kommando:"
|
||||
|
||||
#: ../js/misc/util.js:127
|
||||
#: ../js/misc/util.js:132
|
||||
#, c-format
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Kjøring av «%s» feilet:"
|
||||
@ -297,19 +298,19 @@ msgstr "Alle"
|
||||
msgid "APPLICATIONS"
|
||||
msgstr "PROGRAMMER"
|
||||
|
||||
#: ../js/ui/appDisplay.js:375
|
||||
#: ../js/ui/appDisplay.js:374
|
||||
msgid "SETTINGS"
|
||||
msgstr "INNSTILLINGER"
|
||||
|
||||
#: ../js/ui/appDisplay.js:680
|
||||
#: ../js/ui/appDisplay.js:679
|
||||
msgid "New Window"
|
||||
msgstr "Nytt vindu"
|
||||
|
||||
#: ../js/ui/appDisplay.js:683
|
||||
#: ../js/ui/appDisplay.js:682
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Fjern fra favoritter"
|
||||
|
||||
#: ../js/ui/appDisplay.js:684
|
||||
#: ../js/ui/appDisplay.js:683
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Legg til i favoritter"
|
||||
|
||||
@ -327,12 +328,12 @@ msgstr "%s ble fjernet fra dine favoritter."
|
||||
msgid "Removable Devices"
|
||||
msgstr "Avtagbare enheter"
|
||||
|
||||
#: ../js/ui/autorunManager.js:560
|
||||
#: ../js/ui/autorunManager.js:553
|
||||
#, c-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Åpne med %s"
|
||||
|
||||
#: ../js/ui/autorunManager.js:586
|
||||
#: ../js/ui/autorunManager.js:579
|
||||
msgid "Eject"
|
||||
msgstr "Løs ut"
|
||||
|
||||
@ -487,15 +488,15 @@ msgstr "Neste uke"
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:129
|
||||
#: ../js/ui/contactDisplay.js:89 ../js/ui/userMenu.js:130
|
||||
msgid "Available"
|
||||
msgstr "Tilgjengelig"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:138
|
||||
#: ../js/ui/contactDisplay.js:94 ../js/ui/userMenu.js:139
|
||||
msgid "Away"
|
||||
msgstr "Borte"
|
||||
|
||||
#: ../js/ui/contactDisplay.js:98 ../js/ui/userMenu.js:132
|
||||
#: ../js/ui/contactDisplay.js:98 ../js/ui/userMenu.js:133
|
||||
msgid "Busy"
|
||||
msgstr "Opptatt"
|
||||
|
||||
@ -507,62 +508,62 @@ msgstr "Frakoblet"
|
||||
msgid "CONTACTS"
|
||||
msgstr "KONTAKTER"
|
||||
|
||||
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1207
|
||||
#: ../js/ui/dash.js:239 ../js/ui/messageTray.js:1239
|
||||
msgid "Remove"
|
||||
msgstr "Fjern"
|
||||
|
||||
#: ../js/ui/dateMenu.js:103
|
||||
#: ../js/ui/dateMenu.js:101
|
||||
msgid "Date and Time Settings"
|
||||
msgstr "Innstillinger for dato og klokkeslett"
|
||||
|
||||
#: ../js/ui/dateMenu.js:129
|
||||
#: ../js/ui/dateMenu.js:127
|
||||
msgid "Open Calendar"
|
||||
msgstr "Åpne kalender"
|
||||
|
||||
#. Translators: This is the time format with date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/dateMenu.js:187
|
||||
#: ../js/ui/dateMenu.js:185
|
||||
msgid "%a %b %e, %R:%S"
|
||||
msgstr "%a %e %b, %R.%S"
|
||||
|
||||
#: ../js/ui/dateMenu.js:188
|
||||
#: ../js/ui/dateMenu.js:186
|
||||
msgid "%a %b %e, %R"
|
||||
msgstr "%a %e %b, %R"
|
||||
|
||||
#. Translators: This is the time format without date used
|
||||
#. in 24-hour mode.
|
||||
#: ../js/ui/dateMenu.js:192
|
||||
#: ../js/ui/dateMenu.js:190
|
||||
msgid "%a %R:%S"
|
||||
msgstr "%a %R.%S"
|
||||
|
||||
#: ../js/ui/dateMenu.js:193
|
||||
#: ../js/ui/dateMenu.js:191
|
||||
msgid "%a %R"
|
||||
msgstr "%a %R"
|
||||
|
||||
#. Translators: This is a time format with date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/dateMenu.js:200
|
||||
#: ../js/ui/dateMenu.js:198
|
||||
msgid "%a %b %e, %l:%M:%S %p"
|
||||
msgstr "%a %e %b, %l.%M.%S %p"
|
||||
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
#: ../js/ui/dateMenu.js:199
|
||||
msgid "%a %b %e, %l:%M %p"
|
||||
msgstr "%a %e %b, %l.%M %p"
|
||||
|
||||
#. Translators: This is a time format without date used
|
||||
#. for AM/PM.
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
#: ../js/ui/dateMenu.js:203
|
||||
msgid "%a %l:%M:%S %p"
|
||||
msgstr "%a %l.%M.%S %p"
|
||||
|
||||
#: ../js/ui/dateMenu.js:206
|
||||
#: ../js/ui/dateMenu.js:204
|
||||
msgid "%a %l:%M %p"
|
||||
msgstr "%a %l.%M %p"
|
||||
|
||||
#. 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:217
|
||||
#: ../js/ui/dateMenu.js:215
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%a %e %B, %Y"
|
||||
|
||||
@ -658,11 +659,11 @@ msgstr[1] "Systemet vil starte på nytt automatisk om %d sekunder."
|
||||
msgid "Restarting the system."
|
||||
msgstr "Starter systemet på nytt."
|
||||
|
||||
#: ../js/ui/extensionSystem.js:404
|
||||
#: ../js/ui/extensionSystem.js:379
|
||||
msgid "Install"
|
||||
msgstr "Installer"
|
||||
|
||||
#: ../js/ui/extensionSystem.js:408
|
||||
#: ../js/ui/extensionSystem.js:383
|
||||
#, c-format
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Last ned og installer «%s» fra extensions.gnome.org?"
|
||||
@ -671,7 +672,7 @@ msgstr "Last ned og installer «%s» fra extensions.gnome.org?"
|
||||
msgid "tray"
|
||||
msgstr "varslingsområde"
|
||||
|
||||
#: ../js/ui/keyboard.js:544 ../js/ui/status/keyboard.js:44
|
||||
#: ../js/ui/keyboard.js:545 ../js/ui/status/keyboard.js:44
|
||||
#: ../js/ui/status/power.js:203
|
||||
msgid "Keyboard"
|
||||
msgstr "Tastatur"
|
||||
@ -733,24 +734,24 @@ msgid "Web Page"
|
||||
msgstr "Nettside"
|
||||
|
||||
#. Translators: this is a filename used for screencast recording
|
||||
#: ../js/ui/main.js:120
|
||||
#: ../js/ui/main.js:121
|
||||
#, no-c-format
|
||||
msgid "Screencast from %d %t"
|
||||
msgstr "Skjermvideo fra %d %t"
|
||||
|
||||
#: ../js/ui/messageTray.js:1200
|
||||
#: ../js/ui/messageTray.js:1232
|
||||
msgid "Open"
|
||||
msgstr "Åpne"
|
||||
|
||||
#: ../js/ui/messageTray.js:1217
|
||||
#: ../js/ui/messageTray.js:1249
|
||||
msgid "Unmute"
|
||||
msgstr "Fjern demping"
|
||||
|
||||
#: ../js/ui/messageTray.js:1217
|
||||
#: ../js/ui/messageTray.js:1249
|
||||
msgid "Mute"
|
||||
msgstr "Demp"
|
||||
|
||||
#: ../js/ui/messageTray.js:2490
|
||||
#: ../js/ui/messageTray.js:2522
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformasjon"
|
||||
|
||||
@ -839,35 +840,35 @@ msgstr "Et passord kreves for å koble til «%s»."
|
||||
msgid "Undo"
|
||||
msgstr "Angre"
|
||||
|
||||
#: ../js/ui/overview.js:132
|
||||
#: ../js/ui/overview.js:130
|
||||
msgid "Overview"
|
||||
msgstr "Oversikt"
|
||||
|
||||
#: ../js/ui/overview.js:202
|
||||
#: ../js/ui/overview.js:200
|
||||
msgid "Windows"
|
||||
msgstr "Vinduer"
|
||||
|
||||
#: ../js/ui/overview.js:205
|
||||
#: ../js/ui/overview.js:203
|
||||
msgid "Applications"
|
||||
msgstr "Programmer"
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/overview.js:231
|
||||
#: ../js/ui/overview.js:229
|
||||
msgid "Dash"
|
||||
msgstr "Favoritter"
|
||||
|
||||
#: ../js/ui/panel.js:592
|
||||
#: ../js/ui/panel.js:564
|
||||
msgid "Quit"
|
||||
msgstr "Avslutt"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:624
|
||||
#: ../js/ui/panel.js:596
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
|
||||
#: ../js/ui/panel.js:999
|
||||
#: ../js/ui/panel.js:962
|
||||
msgid "Top Bar"
|
||||
msgstr "Topp-panel"
|
||||
|
||||
@ -921,11 +922,11 @@ msgstr "toggle-switch-intl"
|
||||
msgid "Please enter a command:"
|
||||
msgstr "Oppgi en kommando:"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:332
|
||||
#: ../js/ui/searchDisplay.js:321
|
||||
msgid "Searching..."
|
||||
msgstr "Søker …"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:422
|
||||
#: ../js/ui/searchDisplay.js:374
|
||||
msgid "No matching results."
|
||||
msgstr "Ingen treff."
|
||||
|
||||
@ -945,7 +946,7 @@ msgstr "Vis tekst"
|
||||
msgid "Hide Text"
|
||||
msgstr "Skjul tekst"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:271
|
||||
#: ../js/ui/shellMountOperation.js:272
|
||||
msgid "Wrong password, please try again"
|
||||
msgstr "Feil passord. Prøv igjen"
|
||||
|
||||
@ -997,9 +998,9 @@ msgid "Large Text"
|
||||
msgstr "Stor tekst"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
|
||||
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
|
||||
#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
|
||||
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
|
||||
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/bluetooth.js:308
|
||||
#: ../js/ui/status/bluetooth.js:339 ../js/ui/status/bluetooth.js:375
|
||||
#: ../js/ui/status/bluetooth.js:404 ../js/ui/status/network.js:890
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@ -1024,110 +1025,110 @@ msgstr "Innstillinger for Bluetooth"
|
||||
msgid "hardware disabled"
|
||||
msgstr "maskinvare slått av"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:203
|
||||
#: ../js/ui/status/bluetooth.js:200
|
||||
msgid "Connection"
|
||||
msgstr "Tilkobling"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
|
||||
#: ../js/ui/status/bluetooth.js:211 ../js/ui/status/network.js:491
|
||||
msgid "disconnecting..."
|
||||
msgstr "kobler fra …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497
|
||||
#: ../js/ui/status/bluetooth.js:224 ../js/ui/status/network.js:497
|
||||
msgid "connecting..."
|
||||
msgstr "kobler til …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:245
|
||||
#: ../js/ui/status/bluetooth.js:242
|
||||
msgid "Send Files..."
|
||||
msgstr "Send filer …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:250
|
||||
#: ../js/ui/status/bluetooth.js:247
|
||||
msgid "Browse Files..."
|
||||
msgstr "Bla gjennom filer …"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:259
|
||||
#: ../js/ui/status/bluetooth.js:256
|
||||
msgid "Error browsing device"
|
||||
msgstr "Feil under lesing av enhet"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:260
|
||||
#: ../js/ui/status/bluetooth.js:257
|
||||
#, c-format
|
||||
msgid "The requested device cannot be browsed, error is '%s'"
|
||||
msgstr "Kan ikke bla gjennom forespurt enhet. Feilen er «%s»"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:268
|
||||
#: ../js/ui/status/bluetooth.js:265
|
||||
msgid "Keyboard Settings"
|
||||
msgstr "Innstillinger for tastatur"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:271
|
||||
#: ../js/ui/status/bluetooth.js:268
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Innstillinger for mus"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:276 ../js/ui/status/volume.js:59
|
||||
#: ../js/ui/status/bluetooth.js:273 ../js/ui/status/volume.js:59
|
||||
msgid "Sound Settings"
|
||||
msgstr "Innstillinger for lyd"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:372
|
||||
#: ../js/ui/status/bluetooth.js:340
|
||||
#, c-format
|
||||
msgid "Authorization request from %s"
|
||||
msgstr "Forespørsel om autorisering fra %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:378
|
||||
#: ../js/ui/status/bluetooth.js:346
|
||||
#, c-format
|
||||
msgid "Device %s wants access to the service '%s'"
|
||||
msgstr "Enhet %s vil ha tilgang til tjenesten «%s»"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:380
|
||||
#: ../js/ui/status/bluetooth.js:348
|
||||
msgid "Always grant access"
|
||||
msgstr "Alltid gi tilgang"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:381
|
||||
#: ../js/ui/status/bluetooth.js:349
|
||||
msgid "Grant this time only"
|
||||
msgstr "Gi tilgang kun denne ene gangen"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1093
|
||||
#: ../js/ui/status/bluetooth.js:350 ../js/ui/telepathyClient.js:1090
|
||||
msgid "Reject"
|
||||
msgstr "Avvis"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:408
|
||||
#: ../js/ui/status/bluetooth.js:376
|
||||
#, c-format
|
||||
msgid "Pairing confirmation for %s"
|
||||
msgstr "Bekreftelse for tilkobling for %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:444
|
||||
#: ../js/ui/status/bluetooth.js:382 ../js/ui/status/bluetooth.js:412
|
||||
#, c-format
|
||||
msgid "Device %s wants to pair with this computer"
|
||||
msgstr "Enhet %s vil koble seg sammen med denne datamaskinen"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:415
|
||||
#: ../js/ui/status/bluetooth.js:383
|
||||
#, c-format
|
||||
msgid "Please confirm whether the PIN '%s' matches the one on the device."
|
||||
msgstr "Vennligst bekreft om PIN «%s» er lik den som brukes på enheten."
|
||||
msgid "Please confirm whether the PIN '%06d' matches the one on the device."
|
||||
msgstr "Vennligst bekreft om PIN «%06d» er lik den som brukes på enheten."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:417
|
||||
#: ../js/ui/status/bluetooth.js:385
|
||||
msgid "Matches"
|
||||
msgstr "Stemmer overens"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:418
|
||||
#: ../js/ui/status/bluetooth.js:386
|
||||
msgid "Does not match"
|
||||
msgstr "Stemmer ikke overens"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:437
|
||||
#: ../js/ui/status/bluetooth.js:405
|
||||
#, c-format
|
||||
msgid "Pairing request for %s"
|
||||
msgstr "Forespørsel om tilkobling for %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:445
|
||||
#: ../js/ui/status/bluetooth.js:413
|
||||
msgid "Please enter the PIN mentioned on the device."
|
||||
msgstr "Vennligst oppgi PIN som oppgitt på enheten."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:461
|
||||
#: ../js/ui/status/bluetooth.js:430
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:68
|
||||
#: ../js/ui/status/keyboard.js:72
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Vis tastaturutforming"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:73
|
||||
#: ../js/ui/status/keyboard.js:77
|
||||
msgid "Region and Language Settings"
|
||||
msgstr "Innstillinger for region og språk"
|
||||
|
||||
@ -1172,13 +1173,13 @@ msgstr "ikke tilgjengelig"
|
||||
msgid "connection failed"
|
||||
msgstr "tilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
|
||||
#: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1497
|
||||
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:621 ../js/ui/status/network.js:1440
|
||||
#: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1432
|
||||
msgid "Connected (private)"
|
||||
msgstr "Tilkoblet (privat)"
|
||||
|
||||
@ -1186,72 +1187,72 @@ msgstr "Tilkoblet (privat)"
|
||||
msgid "Auto Ethernet"
|
||||
msgstr "Automatisk Ethernet"
|
||||
|
||||
#: ../js/ui/status/network.js:757
|
||||
#: ../js/ui/status/network.js:754
|
||||
msgid "Auto broadband"
|
||||
msgstr "Automatisk bredbånd"
|
||||
|
||||
#: ../js/ui/status/network.js:760
|
||||
#: ../js/ui/status/network.js:757
|
||||
msgid "Auto dial-up"
|
||||
msgstr "Automatisk oppringt"
|
||||
|
||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||
#: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
|
||||
#: ../js/ui/status/network.js:876 ../js/ui/status/network.js:1444
|
||||
#, c-format
|
||||
msgid "Auto %s"
|
||||
msgstr "Automatisk %s"
|
||||
|
||||
#: ../js/ui/status/network.js:881
|
||||
#: ../js/ui/status/network.js:878
|
||||
msgid "Auto bluetooth"
|
||||
msgstr "Automatisk Bluetooth"
|
||||
|
||||
#: ../js/ui/status/network.js:1454
|
||||
#: ../js/ui/status/network.js:1446
|
||||
msgid "Auto wireless"
|
||||
msgstr "Automatisk trådløst"
|
||||
|
||||
#: ../js/ui/status/network.js:1541
|
||||
#: ../js/ui/status/network.js:1533
|
||||
msgid "Network"
|
||||
msgstr "Nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1548
|
||||
#: ../js/ui/status/network.js:1540
|
||||
msgid "Enable networking"
|
||||
msgstr "Slå på nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1560
|
||||
#: ../js/ui/status/network.js:1552
|
||||
msgid "Wired"
|
||||
msgstr "Kablet"
|
||||
|
||||
#: ../js/ui/status/network.js:1571
|
||||
#: ../js/ui/status/network.js:1563
|
||||
msgid "Wireless"
|
||||
msgstr "Trådløst"
|
||||
|
||||
#: ../js/ui/status/network.js:1581
|
||||
#: ../js/ui/status/network.js:1573
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Mobilt bredbånd"
|
||||
|
||||
#: ../js/ui/status/network.js:1591
|
||||
#: ../js/ui/status/network.js:1583
|
||||
msgid "VPN Connections"
|
||||
msgstr "VPN-tilkoblinger"
|
||||
|
||||
#: ../js/ui/status/network.js:1602
|
||||
#: ../js/ui/status/network.js:1594
|
||||
msgid "Network Settings"
|
||||
msgstr "Innstillinger for nettverk"
|
||||
|
||||
#: ../js/ui/status/network.js:1739
|
||||
#: ../js/ui/status/network.js:1647
|
||||
msgid "Network Manager"
|
||||
msgstr "Nettverkshåndtering"
|
||||
|
||||
#: ../js/ui/status/network.js:1734
|
||||
msgid "Connection failed"
|
||||
msgstr "Tilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:1740
|
||||
#: ../js/ui/status/network.js:1735
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivering av nettverkstilkobling feilet"
|
||||
|
||||
#: ../js/ui/status/network.js:1993
|
||||
#: ../js/ui/status/network.js:1988
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Nettverk er slått av"
|
||||
|
||||
#: ../js/ui/status/network.js:2117
|
||||
msgid "Network Manager"
|
||||
msgstr "Nettverkshåndtering"
|
||||
|
||||
#: ../js/ui/status/power.js:59
|
||||
msgid "Battery"
|
||||
msgstr "Batteri"
|
||||
@ -1369,7 +1370,7 @@ msgstr "Ring"
|
||||
msgid "File Transfer"
|
||||
msgstr "Filoverføring"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:369
|
||||
#: ../js/ui/telepathyClient.js:368
|
||||
msgid "Subscription request"
|
||||
msgstr "Forespørsel om abbonering"
|
||||
|
||||
@ -1377,22 +1378,22 @@ msgstr "Forespørsel om abbonering"
|
||||
msgid "Connection error"
|
||||
msgstr "Feil ved tilkobling"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:663
|
||||
#: ../js/ui/telepathyClient.js:662
|
||||
#, c-format
|
||||
msgid "%s is online."
|
||||
msgstr "%s er tilkoblet."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:667
|
||||
#: ../js/ui/telepathyClient.js:666
|
||||
#, c-format
|
||||
msgid "%s is offline."
|
||||
msgstr "%s er frakoblet."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:671
|
||||
#: ../js/ui/telepathyClient.js:670
|
||||
#, c-format
|
||||
msgid "%s is away."
|
||||
msgstr "«%s» er borte."
|
||||
|
||||
#: ../js/ui/telepathyClient.js:674
|
||||
#: ../js/ui/telepathyClient.js:673
|
||||
#, c-format
|
||||
msgid "%s is busy."
|
||||
msgstr "%s er opptatt."
|
||||
@ -1400,35 +1401,35 @@ msgstr "%s er opptatt."
|
||||
#. Translators: this is a time format string followed by a date.
|
||||
#. If applicable, replace %X with a strftime format valid for your
|
||||
#. locale, without seconds.
|
||||
#: ../js/ui/telepathyClient.js:889
|
||||
#: ../js/ui/telepathyClient.js:888
|
||||
#, no-c-format
|
||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
||||
msgstr "Sendt <b>%X</b> på <b>%A</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
||||
#. shown when you get a chat message in the same year.
|
||||
#: ../js/ui/telepathyClient.js:895
|
||||
#: ../js/ui/telepathyClient.js:894
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
||||
msgstr "Sendt <b>%A</b>, <b>%B %d</b>"
|
||||
|
||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
||||
#. shown when you get a chat message in a different year.
|
||||
#: ../js/ui/telepathyClient.js:900
|
||||
#: ../js/ui/telepathyClient.js:899
|
||||
#, no-c-format
|
||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
msgstr "Sendt <b>%A</b>, <b>%B %d</b>, %Y"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/telepathyClient.js:942
|
||||
#: ../js/ui/telepathyClient.js:941
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s er nå kjent som %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1044
|
||||
#: ../js/ui/telepathyClient.js:1041
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Invitasjon til %s"
|
||||
@ -1436,35 +1437,35 @@ msgstr "Invitasjon til %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/telepathyClient.js:1052
|
||||
#: ../js/ui/telepathyClient.js:1049
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s inviterer deg til å bli med i %s"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1054 ../js/ui/telepathyClient.js:1133
|
||||
#: ../js/ui/telepathyClient.js:1231
|
||||
#: ../js/ui/telepathyClient.js:1051 ../js/ui/telepathyClient.js:1130
|
||||
#: ../js/ui/telepathyClient.js:1194
|
||||
msgid "Decline"
|
||||
msgstr "Avslå"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1055 ../js/ui/telepathyClient.js:1134
|
||||
#: ../js/ui/telepathyClient.js:1232
|
||||
#: ../js/ui/telepathyClient.js:1052 ../js/ui/telepathyClient.js:1131
|
||||
#: ../js/ui/telepathyClient.js:1195
|
||||
msgid "Accept"
|
||||
msgstr "Godta"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1085
|
||||
#: ../js/ui/telepathyClient.js:1082
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videosamtale fra %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/telepathyClient.js:1088
|
||||
#: ../js/ui/telepathyClient.js:1085
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Samtale fra %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/telepathyClient.js:1095
|
||||
#: ../js/ui/telepathyClient.js:1092
|
||||
msgid "Answer"
|
||||
msgstr "Svar"
|
||||
|
||||
@ -1473,110 +1474,110 @@ msgstr "Svar"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/telepathyClient.js:1127
|
||||
#: ../js/ui/telepathyClient.js:1124
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s sender deg %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/telepathyClient.js:1196
|
||||
#: ../js/ui/telepathyClient.js:1159
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s vil ha rettigheter til å se når du er tilkoblet"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1289
|
||||
#: ../js/ui/telepathyClient.js:1252
|
||||
msgid "Network error"
|
||||
msgstr "Nettverksfeil"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1291
|
||||
#: ../js/ui/telepathyClient.js:1254
|
||||
msgid "Authentication failed"
|
||||
msgstr "Autentisering feilet"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1293
|
||||
#: ../js/ui/telepathyClient.js:1256
|
||||
msgid "Encryption error"
|
||||
msgstr "Feil ved kryptering"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1295
|
||||
#: ../js/ui/telepathyClient.js:1258
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Sertifikat ikke oppgitt"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1297
|
||||
#: ../js/ui/telepathyClient.js:1260
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Stoler ikke på sertifikatet"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1299
|
||||
#: ../js/ui/telepathyClient.js:1262
|
||||
msgid "Certificate expired"
|
||||
msgstr "Sertifikatet er utløpt"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1301
|
||||
#: ../js/ui/telepathyClient.js:1264
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Sertifikatet er ikke aktivert"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1303
|
||||
#: ../js/ui/telepathyClient.js:1266
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Feil vertsnavn for sertifikat"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1305
|
||||
#: ../js/ui/telepathyClient.js:1268
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Feil fingeravtrykk for sertifikat"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1307
|
||||
#: ../js/ui/telepathyClient.js:1270
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sertifikatet er selvsignert"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1309
|
||||
#: ../js/ui/telepathyClient.js:1272
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Status er satt til frakoblet"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1311
|
||||
#: ../js/ui/telepathyClient.js:1274
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Kryptering er ikke tilgjengelig"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1313
|
||||
#: ../js/ui/telepathyClient.js:1276
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Sertifikatet er ugyldig"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1315
|
||||
#: ../js/ui/telepathyClient.js:1278
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Tilkobling ble nektet"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1317
|
||||
#: ../js/ui/telepathyClient.js:1280
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Tilkobling kan ikke etableres"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1319
|
||||
#: ../js/ui/telepathyClient.js:1282
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Tilkobling tapt"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1321
|
||||
#: ../js/ui/telepathyClient.js:1284
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Denne kontoen er allerede koblet til tjeneren"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1323
|
||||
#: ../js/ui/telepathyClient.js:1286
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1325
|
||||
#: ../js/ui/telepathyClient.js:1288
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Kontoen eksisterer allerede på tjeneren"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1327
|
||||
#: ../js/ui/telepathyClient.js:1290
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Tjener er for opptatt til å håndtere tilkoblingen"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1329
|
||||
#: ../js/ui/telepathyClient.js:1292
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Sertifikatet er tilbaketrukket"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1331
|
||||
#: ../js/ui/telepathyClient.js:1294
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1333
|
||||
#: ../js/ui/telepathyClient.js:1296
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -1584,74 +1585,70 @@ msgstr ""
|
||||
"Lengden eller dybden på tjenersertifikatet oversteg grensen som er satt i "
|
||||
"kryptografibiblioteket"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1335
|
||||
#: ../js/ui/telepathyClient.js:1298
|
||||
msgid "Internal error"
|
||||
msgstr "Intern feil"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/telepathyClient.js:1345
|
||||
#: ../js/ui/telepathyClient.js:1308
|
||||
#, c-format
|
||||
msgid "Connection to %s failed"
|
||||
msgstr "Tilkobling til %s feilet"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1354
|
||||
#: ../js/ui/telepathyClient.js:1317
|
||||
msgid "Reconnect"
|
||||
msgstr "Koble til på nytt"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1355
|
||||
#: ../js/ui/telepathyClient.js:1318
|
||||
msgid "Edit account"
|
||||
msgstr "Rediger konto"
|
||||
|
||||
#: ../js/ui/telepathyClient.js:1401
|
||||
#: ../js/ui/telepathyClient.js:1364
|
||||
msgid "Unknown reason"
|
||||
msgstr "Ukjent årsak"
|
||||
|
||||
#: ../js/ui/userMenu.js:135
|
||||
#: ../js/ui/userMenu.js:136
|
||||
msgid "Hidden"
|
||||
msgstr "Skjult"
|
||||
|
||||
#: ../js/ui/userMenu.js:141
|
||||
#: ../js/ui/userMenu.js:142
|
||||
msgid "Idle"
|
||||
msgstr "Ledig"
|
||||
|
||||
#: ../js/ui/userMenu.js:144
|
||||
#: ../js/ui/userMenu.js:145
|
||||
msgid "Unavailable"
|
||||
msgstr "Ikke tilgjengelig"
|
||||
|
||||
#: ../js/ui/userMenu.js:595 ../js/ui/userMenu.js:599 ../js/ui/userMenu.js:669
|
||||
msgid "Power Off..."
|
||||
msgstr "Slå av …"
|
||||
|
||||
#: ../js/ui/userMenu.js:631
|
||||
msgid "Notifications"
|
||||
msgstr "Varslinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:639
|
||||
msgid "Online Accounts"
|
||||
msgstr "Kontoer på nettet"
|
||||
|
||||
#: ../js/ui/userMenu.js:643
|
||||
msgid "System Settings"
|
||||
msgstr "Systeminnstillinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:650
|
||||
msgid "Lock Screen"
|
||||
msgstr "Lås skjerm"
|
||||
|
||||
#: ../js/ui/userMenu.js:655
|
||||
#: ../js/ui/userMenu.js:556 ../js/ui/userMenu.js:656
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#: ../js/ui/userMenu.js:660
|
||||
msgid "Log Out..."
|
||||
msgstr "Logg ut …"
|
||||
#: ../js/ui/userMenu.js:557
|
||||
msgid "Switch Session"
|
||||
msgstr "Bytt økt"
|
||||
|
||||
#: ../js/ui/userMenu.js:688
|
||||
#: ../js/ui/userMenu.js:632
|
||||
msgid "Notifications"
|
||||
msgstr "Varslinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:641
|
||||
msgid "System Settings"
|
||||
msgstr "Systeminnstillinger"
|
||||
|
||||
#: ../js/ui/userMenu.js:661
|
||||
msgid "Log Out"
|
||||
msgstr "Logg ut"
|
||||
|
||||
#: ../js/ui/userMenu.js:669
|
||||
msgid "Lock"
|
||||
msgstr "Lås"
|
||||
|
||||
#: ../js/ui/userMenu.js:687
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Din pratestatus vil bli satt til opptatt"
|
||||
|
||||
#: ../js/ui/userMenu.js:689
|
||||
#: ../js/ui/userMenu.js:688
|
||||
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."
|
||||
@ -1717,15 +1714,23 @@ msgstr[1] "%u innganger"
|
||||
msgid "System Sounds"
|
||||
msgstr "Systemlyder"
|
||||
|
||||
#: ../src/main.c:255
|
||||
#: ../src/main.c:313
|
||||
msgid "Print version"
|
||||
msgstr "Skriv ut versjon"
|
||||
|
||||
#: ../src/main.c:261
|
||||
#: ../src/main.c:319
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Modus som brukes av GDM for innloggingsskjermen"
|
||||
|
||||
#: ../src/shell-app.c:619
|
||||
#: ../src/main.c:325
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
|
||||
|
||||
#: ../src/main.c:331
|
||||
msgid "List possible modes"
|
||||
msgstr "Vis mulige modi"
|
||||
|
||||
#: ../src/shell-app.c:622
|
||||
#, c-format
|
||||
msgid "Failed to launch '%s'"
|
||||
msgstr "Klarte ikke å starte «%s»"
|
||||
|
@ -93,7 +93,8 @@ gnome_shell_cflags = \
|
||||
-DGNOME_SHELL_LIBEXECDIR=\"$(libexecdir)\" \
|
||||
-DGNOME_SHELL_DATADIR=\"$(pkgdatadir)\" \
|
||||
-DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\" \
|
||||
-DJSDIR=\"$(pkgdatadir)/js\"
|
||||
-DJSDIR=\"$(pkgdatadir)/js\" \
|
||||
-DMUTTER_TYPELIB_DIR=\"$(MUTTER_TYPELIB_DIR)\"
|
||||
|
||||
privlibdir = $(pkglibdir)
|
||||
privlib_LTLIBRARIES = libgnome-shell.la libgnome-shell-js.la
|
||||
@ -193,7 +194,7 @@ libgnome_shell_la_gir_sources = \
|
||||
gnome_shell_real_SOURCES = \
|
||||
main.c
|
||||
gnome_shell_real_CPPFLAGS = $(gnome_shell_cflags)
|
||||
gnome_shell_real_LDADD = libgnome-shell.la $(libgnome_shell_la_LIBADD)
|
||||
gnome_shell_real_LDADD = libgnome-shell.la libgnome-shell-js.la $(libgnome_shell_la_LIBADD)
|
||||
gnome_shell_real_DEPENDENCIES = libgnome-shell.la
|
||||
|
||||
EXTRA_DIST += test-gapplication.js
|
||||
|
101
src/main.c
101
src/main.c
@ -24,9 +24,12 @@
|
||||
#include "shell-a11y.h"
|
||||
#include "shell-global.h"
|
||||
#include "shell-global-private.h"
|
||||
#include "shell-js.h"
|
||||
#include "shell-perf-log.h"
|
||||
#include "st.h"
|
||||
|
||||
#include <jsapi.h>
|
||||
|
||||
extern GType gnome_shell_plugin_get_type (void);
|
||||
|
||||
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
|
||||
@ -35,6 +38,7 @@ extern GType gnome_shell_plugin_get_type (void);
|
||||
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
|
||||
|
||||
static gboolean is_gdm_mode = FALSE;
|
||||
static char *session_mode = NULL;
|
||||
|
||||
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
|
||||
#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
|
||||
@ -173,6 +177,18 @@ shell_prefs_init (void)
|
||||
OVERRIDES_SCHEMA);
|
||||
}
|
||||
|
||||
static void
|
||||
shell_introspection_init (void)
|
||||
{
|
||||
|
||||
g_irepository_prepend_search_path (MUTTER_TYPELIB_DIR);
|
||||
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
|
||||
#if HAVE_BLUETOOTH
|
||||
g_irepository_prepend_search_path (BLUETOOTH_DIR);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
malloc_statistics_callback (ShellPerfLog *perf_log,
|
||||
gpointer data)
|
||||
@ -238,6 +254,48 @@ default_log_handler (const char *log_domain,
|
||||
g_log_default_handler (log_domain, log_level, message, data);
|
||||
}
|
||||
|
||||
static void
|
||||
shut_up (const char *domain,
|
||||
GLogLevelFlags level,
|
||||
const char *message,
|
||||
gpointer user_data)
|
||||
{
|
||||
}
|
||||
|
||||
static gboolean
|
||||
list_modes (const char *option_name,
|
||||
const char *value,
|
||||
gpointer data,
|
||||
GError **error)
|
||||
{
|
||||
ShellGlobal *global;
|
||||
GjsContext *context;
|
||||
const char *script;
|
||||
int status;
|
||||
|
||||
/* Many of our imports require global to be set, so rather than
|
||||
* tayloring our imports carefully here to avoid that dependency,
|
||||
* we just set it.
|
||||
* ShellGlobal has some GTK+ dependencies, so initialize GTK+; we
|
||||
* don't really care if it fails though (e.g. when running from a tty),
|
||||
* so we mute all warnings */
|
||||
g_log_set_default_handler (shut_up, NULL);
|
||||
gtk_init_check (NULL, NULL);
|
||||
|
||||
_shell_global_init (NULL);
|
||||
global = shell_global_get ();
|
||||
context = _shell_global_get_gjs_context (global);
|
||||
|
||||
shell_introspection_init ();
|
||||
|
||||
script = "imports.ui.environment.init();"
|
||||
"imports.ui.sessionMode.listModes();";
|
||||
if (!gjs_context_eval (context, script, -1, "<main>", &status, NULL))
|
||||
g_message ("Retrieving list of available modes failed.");
|
||||
|
||||
exit (status);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
print_version (const gchar *option_name,
|
||||
const gchar *value,
|
||||
@ -256,11 +314,23 @@ GOptionEntry gnome_shell_options[] = {
|
||||
NULL
|
||||
},
|
||||
{
|
||||
"gdm-mode", 0, 0, G_OPTION_ARG_NONE,
|
||||
"gdm-mode", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE,
|
||||
&is_gdm_mode,
|
||||
N_("Mode used by GDM for login screen"),
|
||||
NULL
|
||||
},
|
||||
{
|
||||
"mode", 0, 0, G_OPTION_ARG_STRING,
|
||||
&session_mode,
|
||||
N_("Use a specific mode, e.g. \"gdm\" for login screen"),
|
||||
"MODE"
|
||||
},
|
||||
{
|
||||
"list-modes", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
|
||||
list_modes,
|
||||
N_("List possible modes"),
|
||||
NULL
|
||||
},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
@ -269,7 +339,6 @@ main (int argc, char **argv)
|
||||
{
|
||||
GOptionContext *ctx;
|
||||
GError *error = NULL;
|
||||
ShellSessionType session_type;
|
||||
int ecode;
|
||||
TpDebugSender *sender;
|
||||
|
||||
@ -308,11 +377,7 @@ main (int argc, char **argv)
|
||||
shell_a11y_init ();
|
||||
shell_perf_log_init ();
|
||||
shell_prefs_init ();
|
||||
|
||||
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
|
||||
#if HAVE_BLUETOOTH
|
||||
g_irepository_prepend_search_path (BLUETOOTH_DIR);
|
||||
#endif
|
||||
shell_introspection_init ();
|
||||
|
||||
/* Turn on telepathy-glib debugging but filter it out in
|
||||
* default_log_handler. This handler also exposes all the logs over D-Bus
|
||||
@ -323,12 +388,10 @@ main (int argc, char **argv)
|
||||
g_log_set_default_handler (default_log_handler, sender);
|
||||
|
||||
/* Initialize the global object */
|
||||
if (is_gdm_mode)
|
||||
session_type = SHELL_SESSION_GDM;
|
||||
else
|
||||
session_type = SHELL_SESSION_USER;
|
||||
if (session_mode == NULL)
|
||||
session_mode = is_gdm_mode ? "gdm" : "user";
|
||||
|
||||
_shell_global_init ("session-type", session_type, NULL);
|
||||
_shell_global_init ("session-mode", session_mode, NULL);
|
||||
|
||||
ecode = meta_run ();
|
||||
|
||||
@ -342,3 +405,17 @@ main (int argc, char **argv)
|
||||
|
||||
return ecode;
|
||||
}
|
||||
|
||||
/* HACK:
|
||||
Add a dummy function that calls into libgnome-shell-js.so to ensure it's
|
||||
linked to /usr/bin/gnome-shell even when linking with --as-needed.
|
||||
This function is never actually called.
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=670477
|
||||
*/
|
||||
void _shell_link_to_shell_js (void);
|
||||
|
||||
void
|
||||
_shell_link_to_shell_js (void)
|
||||
{
|
||||
shell_js_add_extension_importer (NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ shell_app_get_name (ShellApp *app)
|
||||
|
||||
name = meta_window_get_wm_class (window);
|
||||
if (!name)
|
||||
name = _("Unknown");
|
||||
name = C_("program", "Unknown");
|
||||
return name;
|
||||
}
|
||||
}
|
||||
@ -493,7 +493,7 @@ shell_app_activate_window (ShellApp *app,
|
||||
return;
|
||||
else
|
||||
{
|
||||
GSList *iter;
|
||||
GSList *windows_reversed, *iter;
|
||||
ShellGlobal *global = shell_global_get ();
|
||||
MetaScreen *screen = shell_global_get_screen (global);
|
||||
MetaDisplay *display = meta_screen_get_display (screen);
|
||||
@ -511,13 +511,16 @@ shell_app_activate_window (ShellApp *app,
|
||||
/* Now raise all the other windows for the app that are on
|
||||
* the same workspace, in reverse order to preserve the stacking.
|
||||
*/
|
||||
for (iter = windows; iter; iter = iter->next)
|
||||
windows_reversed = g_slist_copy (windows);
|
||||
windows_reversed = g_slist_reverse (windows_reversed);
|
||||
for (iter = windows_reversed; iter; iter = iter->next)
|
||||
{
|
||||
MetaWindow *other_window = iter->data;
|
||||
|
||||
if (other_window != window)
|
||||
meta_window_raise (other_window);
|
||||
}
|
||||
g_slist_free (windows_reversed);
|
||||
|
||||
/* If we have a transient that the user's interacted with more recently than
|
||||
* the window, pick that.
|
||||
|
@ -16,7 +16,4 @@ GjsContext *_shell_global_get_gjs_context (ShellGlobal *global);
|
||||
gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
|
||||
XEvent *xev);
|
||||
|
||||
void _shell_global_set_session_type (ShellGlobal *global,
|
||||
ShellSessionType session_type);
|
||||
|
||||
#endif /* __SHELL_GLOBAL_PRIVATE_H__ */
|
||||
|
@ -59,7 +59,7 @@ struct _ShellGlobal {
|
||||
MetaScreen *meta_screen;
|
||||
GdkScreen *gdk_screen;
|
||||
|
||||
ShellSessionType session_type;
|
||||
char *session_mode;
|
||||
|
||||
/* We use this window to get a notification from GTK+ when
|
||||
* a widget in our process does a GTK+ grab. See
|
||||
@ -97,7 +97,7 @@ struct _ShellGlobal {
|
||||
enum {
|
||||
PROP_0,
|
||||
|
||||
PROP_SESSION_TYPE,
|
||||
PROP_SESSION_MODE,
|
||||
PROP_OVERLAY_GROUP,
|
||||
PROP_SCREEN,
|
||||
PROP_GDK_SCREEN,
|
||||
@ -143,8 +143,9 @@ shell_global_set_property(GObject *object,
|
||||
case PROP_STAGE_INPUT_MODE:
|
||||
shell_global_set_stage_input_mode (global, g_value_get_enum (value));
|
||||
break;
|
||||
case PROP_SESSION_TYPE:
|
||||
global->session_type = g_value_get_enum (value);
|
||||
case PROP_SESSION_MODE:
|
||||
g_clear_pointer (&global->session_mode, g_free);
|
||||
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
@ -162,8 +163,8 @@ shell_global_get_property(GObject *object,
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_SESSION_TYPE:
|
||||
g_value_set_enum (value, shell_global_get_session_type (global));
|
||||
case PROP_SESSION_MODE:
|
||||
g_value_set_string (value, shell_global_get_session_mode (global));
|
||||
break;
|
||||
case PROP_OVERLAY_GROUP:
|
||||
g_value_set_object (value, meta_get_overlay_group_for_screen (global->meta_screen));
|
||||
@ -343,13 +344,12 @@ shell_global_class_init (ShellGlobalClass *klass)
|
||||
G_TYPE_STRING);
|
||||
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_SESSION_TYPE,
|
||||
g_param_spec_enum ("session-type",
|
||||
"Session Type",
|
||||
"The type of session",
|
||||
SHELL_TYPE_SESSION_TYPE,
|
||||
SHELL_SESSION_USER,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
PROP_SESSION_MODE,
|
||||
g_param_spec_string ("session-mode",
|
||||
"Session Mode",
|
||||
"The session mode to use",
|
||||
"user",
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_OVERLAY_GROUP,
|
||||
g_param_spec_object ("overlay-group",
|
||||
@ -805,90 +805,9 @@ global_stage_after_paint (ClutterStage *stage,
|
||||
"clutter.stagePaintDone");
|
||||
}
|
||||
|
||||
static void
|
||||
update_font_options (GtkSettings *settings,
|
||||
ClutterStage *stage)
|
||||
{
|
||||
StThemeContext *context;
|
||||
ClutterBackend *backend;
|
||||
gint dpi;
|
||||
gint hinting;
|
||||
gchar *hint_style_str;
|
||||
cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_NONE;
|
||||
gint antialias;
|
||||
cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_NONE;
|
||||
cairo_font_options_t *options;
|
||||
|
||||
g_object_get (settings,
|
||||
"gtk-xft-dpi", &dpi,
|
||||
"gtk-xft-antialias", &antialias,
|
||||
"gtk-xft-hinting", &hinting,
|
||||
"gtk-xft-hintstyle", &hint_style_str,
|
||||
NULL);
|
||||
|
||||
context = st_theme_context_get_for_stage (stage);
|
||||
|
||||
if (dpi != -1)
|
||||
/* GTK stores resolution as 1024 * dots/inch */
|
||||
st_theme_context_set_resolution (context, dpi / 1024);
|
||||
else
|
||||
st_theme_context_set_default_resolution (context);
|
||||
|
||||
/* Clutter (as of 0.9) passes comprehensively wrong font options
|
||||
* override whatever set_font_flags() did above.
|
||||
*
|
||||
* http://bugzilla.openedhand.com/show_bug.cgi?id=1456
|
||||
*/
|
||||
backend = clutter_get_default_backend ();
|
||||
options = cairo_font_options_create ();
|
||||
|
||||
cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON);
|
||||
|
||||
if (hinting >= 0 && !hinting)
|
||||
{
|
||||
hint_style = CAIRO_HINT_STYLE_NONE;
|
||||
}
|
||||
else if (hint_style_str)
|
||||
{
|
||||
if (strcmp (hint_style_str, "hintnone") == 0)
|
||||
hint_style = CAIRO_HINT_STYLE_NONE;
|
||||
else if (strcmp (hint_style_str, "hintslight") == 0)
|
||||
hint_style = CAIRO_HINT_STYLE_SLIGHT;
|
||||
else if (strcmp (hint_style_str, "hintmedium") == 0)
|
||||
hint_style = CAIRO_HINT_STYLE_MEDIUM;
|
||||
else if (strcmp (hint_style_str, "hintfull") == 0)
|
||||
hint_style = CAIRO_HINT_STYLE_FULL;
|
||||
}
|
||||
|
||||
g_free (hint_style_str);
|
||||
|
||||
cairo_font_options_set_hint_style (options, hint_style);
|
||||
|
||||
/* We don't want to turn on subpixel anti-aliasing; since Clutter
|
||||
* doesn't currently have the code to support ARGB masks,
|
||||
* generating them then squashing them back to A8 is pointless.
|
||||
*/
|
||||
antialias_mode = (antialias < 0 || antialias) ? CAIRO_ANTIALIAS_GRAY
|
||||
: CAIRO_ANTIALIAS_NONE;
|
||||
|
||||
cairo_font_options_set_antialias (options, antialias_mode);
|
||||
|
||||
clutter_backend_set_font_options (backend, options);
|
||||
cairo_font_options_destroy (options);
|
||||
}
|
||||
|
||||
static void
|
||||
settings_notify_cb (GtkSettings *settings,
|
||||
GParamSpec *pspec,
|
||||
gpointer data)
|
||||
{
|
||||
update_font_options (settings, CLUTTER_STAGE (data));
|
||||
}
|
||||
|
||||
static void
|
||||
shell_fonts_init (ClutterStage *stage)
|
||||
{
|
||||
GtkSettings *settings;
|
||||
CoglPangoFontMap *fontmap;
|
||||
|
||||
/* Disable text mipmapping; it causes problems on pre-GEM Intel
|
||||
@ -898,19 +817,6 @@ shell_fonts_init (ClutterStage *stage)
|
||||
*/
|
||||
fontmap = COGL_PANGO_FONT_MAP (clutter_get_font_map ());
|
||||
cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE);
|
||||
|
||||
settings = gtk_settings_get_default ();
|
||||
g_object_connect (settings,
|
||||
"signal::notify::gtk-xft-dpi",
|
||||
G_CALLBACK (settings_notify_cb), stage,
|
||||
"signal::notify::gtk-xft-antialias",
|
||||
G_CALLBACK (settings_notify_cb), stage,
|
||||
"signal::notify::gtk-xft-hinting",
|
||||
G_CALLBACK (settings_notify_cb), stage,
|
||||
"signal::notify::gtk-xft-hintstyle",
|
||||
G_CALLBACK (settings_notify_cb), stage,
|
||||
NULL);
|
||||
update_font_options (settings, stage);
|
||||
}
|
||||
|
||||
/* This is an IBus workaround. The flow of events with IBus is that every time
|
||||
@ -1870,31 +1776,10 @@ shell_global_launch_calendar_server (ShellGlobal *global)
|
||||
g_free (calendar_server_exe);
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_global_get_session_type:
|
||||
* @global: The #ShellGlobal.
|
||||
*
|
||||
* Gets the type of session gnome-shell provides.
|
||||
*
|
||||
* The type determines what UI elements are displayed,
|
||||
* what keybindings work, and generally how the shell
|
||||
* behaves.
|
||||
*
|
||||
* A session type of #SHELL_SESSION_USER means gnome-shell
|
||||
* will enable the activities overview, status menu, run dialog,
|
||||
* etc. This is the default.
|
||||
*
|
||||
* A session type of #SHELL_SESSION_GDM means gnome-shell
|
||||
* will enable a login dialog and run in a more confined
|
||||
* way. This type is suitable for the display manager.
|
||||
*
|
||||
* Returns: the type of session gnome-shell is providing.
|
||||
*/
|
||||
ShellSessionType
|
||||
shell_global_get_session_type (ShellGlobal *global)
|
||||
const char *
|
||||
shell_global_get_session_mode (ShellGlobal *global)
|
||||
{
|
||||
g_return_val_if_fail (SHELL_IS_GLOBAL (global),
|
||||
SHELL_SESSION_USER);
|
||||
g_return_val_if_fail (SHELL_IS_GLOBAL (global), "user");
|
||||
|
||||
return global->session_type;
|
||||
return global->session_mode;
|
||||
}
|
||||
|
@ -141,12 +141,7 @@ void shell_global_reexec_self (ShellGlobal *global);
|
||||
|
||||
void shell_global_launch_calendar_server (ShellGlobal *global);
|
||||
|
||||
typedef enum {
|
||||
SHELL_SESSION_USER,
|
||||
SHELL_SESSION_GDM
|
||||
} ShellSessionType;
|
||||
|
||||
ShellSessionType shell_global_get_session_type (ShellGlobal *global);
|
||||
const char * shell_global_get_session_mode (ShellGlobal *global);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -79,15 +79,3 @@ shell_js_add_extension_importer (const char *target_object_script,
|
||||
JS_EndRequest (context);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_js_format_int_alternative_output:
|
||||
* @intval:
|
||||
*
|
||||
* Returns: (transfer full):
|
||||
*/
|
||||
gchar *
|
||||
shell_js_format_int_alternative_output (gint intval)
|
||||
{
|
||||
return g_strdup_printf ("%Id", intval);
|
||||
}
|
||||
|
@ -11,8 +11,6 @@ gboolean shell_js_add_extension_importer (const char *target_object_script,
|
||||
const char *directory,
|
||||
GError **error);
|
||||
|
||||
gchar *shell_js_format_int_alternative_output (gint intval);
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#endif /* __SHELL_JS_H__ */
|
||||
|
@ -330,34 +330,6 @@ shell_tp_client_grab_contact_list_changed (ShellTpClient *self,
|
||||
|
||||
/* Telepathy utility functions */
|
||||
|
||||
|
||||
/**
|
||||
* shell_get_contact_events:
|
||||
* @log_manager: A #TplLogManager
|
||||
* @account: A #TpAccount
|
||||
* @entity: A #TplEntity
|
||||
* @num_events: The number of events to retrieve
|
||||
* @callback: (scope async): User callback to run when the contact is ready
|
||||
*
|
||||
* Wrap tpl_log_manager_get_filtered_events_async because gjs cannot support
|
||||
* multiple callbacks in the same function call.
|
||||
*/
|
||||
void
|
||||
shell_get_contact_events (TplLogManager *log_manager,
|
||||
TpAccount *account,
|
||||
TplEntity *entity,
|
||||
guint num_events,
|
||||
GAsyncReadyCallback callback)
|
||||
{
|
||||
tpl_log_manager_get_filtered_events_async (log_manager,
|
||||
account,
|
||||
entity,
|
||||
TPL_EVENT_MASK_TEXT,
|
||||
num_events,
|
||||
NULL, NULL,
|
||||
callback, NULL);
|
||||
}
|
||||
|
||||
/* gjs doesn't allow us to craft a GError so we need a C wrapper */
|
||||
void
|
||||
shell_decline_dispatch_op (TpAddDispatchOperationContext *context,
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include <glib-object.h>
|
||||
|
||||
#include <telepathy-glib/telepathy-glib.h>
|
||||
#include <telepathy-logger/telepathy-logger.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@ -103,12 +102,6 @@ void shell_tp_client_grab_contact_list_changed (ShellTpClient *self,
|
||||
|
||||
/* Telepathy utility functions */
|
||||
|
||||
void shell_get_contact_events (TplLogManager *log_manager,
|
||||
TpAccount *account,
|
||||
TplEntity *entity,
|
||||
guint num_events,
|
||||
GAsyncReadyCallback callback);
|
||||
|
||||
void shell_decline_dispatch_op (TpAddDispatchOperationContext *context,
|
||||
const gchar *message);
|
||||
|
||||
|
@ -592,29 +592,6 @@ shell_util_get_week_start ()
|
||||
return week_start;
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_write_soup_message_to_stream:
|
||||
* @stream: a #GOutputStream
|
||||
* @message: a #SoupMessage
|
||||
* @error: location to store GError
|
||||
*
|
||||
* Write a string to a GOutputStream as binary data. This is a
|
||||
* workaround for the lack of proper binary strings in GJS.
|
||||
*/
|
||||
void
|
||||
shell_write_soup_message_to_stream (GOutputStream *stream,
|
||||
SoupMessage *message,
|
||||
GError **error)
|
||||
{
|
||||
SoupMessageBody *body;
|
||||
|
||||
body = message->response_body;
|
||||
|
||||
g_output_stream_write_all (stream,
|
||||
body->data, body->length,
|
||||
NULL, NULL, error);
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_write_string_to_stream:
|
||||
* @stream: a #GOutputStream
|
||||
|
@ -25,10 +25,6 @@ char *shell_util_normalize_and_casefold (const char *str);
|
||||
char *shell_util_format_date (const char *format,
|
||||
gint64 time_ms);
|
||||
|
||||
void shell_write_soup_message_to_stream (GOutputStream *stream,
|
||||
SoupMessage *message,
|
||||
GError **error);
|
||||
|
||||
gboolean shell_write_string_to_stream (GOutputStream *stream,
|
||||
const char *str,
|
||||
GError **error);
|
||||
|
@ -490,7 +490,7 @@ st_label_accessible_get_name (AtkObject *obj)
|
||||
|
||||
actor = CLUTTER_ACTOR (atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (obj)));
|
||||
|
||||
if (actor == NULL) /* State is defunct */
|
||||
if (actor == NULL || st_widget_has_style_class_name (ST_WIDGET (actor), "hidden"))
|
||||
name = NULL;
|
||||
else
|
||||
name = st_label_get_text (ST_LABEL (actor));
|
||||
|
@ -28,7 +28,6 @@
|
||||
struct _StThemeContext {
|
||||
GObject parent;
|
||||
|
||||
double resolution;
|
||||
PangoFontDescription *font;
|
||||
StThemeNode *root_node;
|
||||
StTheme *theme;
|
||||
@ -38,7 +37,6 @@ struct _StThemeContextClass {
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
#define DEFAULT_RESOLUTION 96.
|
||||
#define DEFAULT_FONT "sans-serif 10"
|
||||
|
||||
enum
|
||||
@ -93,7 +91,6 @@ st_theme_context_class_init (StThemeContextClass *klass)
|
||||
static void
|
||||
st_theme_context_init (StThemeContext *context)
|
||||
{
|
||||
context->resolution = DEFAULT_RESOLUTION;
|
||||
context->font = pango_font_description_from_string (DEFAULT_FONT);
|
||||
|
||||
g_signal_connect (st_texture_cache_get_default (),
|
||||
@ -232,66 +229,6 @@ st_theme_context_get_theme (StThemeContext *context)
|
||||
return context->theme;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_theme_context_set_resolution:
|
||||
* @context: a #StThemeContext
|
||||
* @resolution: resolution of the context (number of pixels in an "inch")
|
||||
*
|
||||
* Sets the resolution of the theme context. This is the scale factor
|
||||
* used to convert between points and the length units pt, in, and cm.
|
||||
* This does not necessarily need to correspond to the actual number
|
||||
* resolution of the device. A value of 72. means that points and
|
||||
* pixels are identical. The default value is 96.
|
||||
*/
|
||||
void
|
||||
st_theme_context_set_resolution (StThemeContext *context,
|
||||
double resolution)
|
||||
{
|
||||
g_return_if_fail (ST_IS_THEME_CONTEXT (context));
|
||||
|
||||
if (resolution == context->resolution)
|
||||
return;
|
||||
|
||||
context->resolution = resolution;
|
||||
st_theme_context_changed (context);
|
||||
}
|
||||
|
||||
/**
|
||||
* st_theme_context_set_default_resolution:
|
||||
* @context: a #StThemeContext
|
||||
*
|
||||
* Sets the resolution of the theme context to the default value of 96.
|
||||
* See st_theme_context_set_resolution().
|
||||
*/
|
||||
void
|
||||
st_theme_context_set_default_resolution (StThemeContext *context)
|
||||
{
|
||||
g_return_if_fail (ST_IS_THEME_CONTEXT (context));
|
||||
|
||||
if (context->resolution == DEFAULT_RESOLUTION)
|
||||
return;
|
||||
|
||||
context->resolution = DEFAULT_RESOLUTION;
|
||||
st_theme_context_changed (context);
|
||||
}
|
||||
|
||||
/**
|
||||
* st_theme_context_get_resolution:
|
||||
* @context: a #StThemeContext
|
||||
*
|
||||
* Gets the current resolution of the theme context.
|
||||
* See st_theme_context_set_resolution().
|
||||
*
|
||||
* Return value: the resolution (in dots-per-"inch")
|
||||
*/
|
||||
double
|
||||
st_theme_context_get_resolution (StThemeContext *context)
|
||||
{
|
||||
g_return_val_if_fail (ST_IS_THEME_CONTEXT (context), DEFAULT_RESOLUTION);
|
||||
|
||||
return context->resolution;
|
||||
}
|
||||
|
||||
/**
|
||||
* st_theme_context_set_font:
|
||||
* @context: a #StThemeContext
|
||||
|
@ -56,10 +56,6 @@ void st_theme_context_set_theme (StThemeContext
|
||||
StTheme *theme);
|
||||
StTheme * st_theme_context_get_theme (StThemeContext *context);
|
||||
|
||||
void st_theme_context_set_resolution (StThemeContext *context,
|
||||
gdouble resolution);
|
||||
void st_theme_context_set_default_resolution (StThemeContext *context);
|
||||
double st_theme_context_get_resolution (StThemeContext *context);
|
||||
void st_theme_context_set_font (StThemeContext *context,
|
||||
const PangoFontDescription *font);
|
||||
const PangoFontDescription *st_theme_context_get_font (StThemeContext *context);
|
||||
|
@ -820,7 +820,7 @@ get_length_from_term (StThemeNode *node,
|
||||
break;
|
||||
case POINTS:
|
||||
{
|
||||
double resolution = st_theme_context_get_resolution (node->context);
|
||||
double resolution = clutter_backend_get_resolution (clutter_get_default_backend ());
|
||||
*length = num->val * multiplier * (resolution / 72.);
|
||||
}
|
||||
break;
|
||||
@ -842,7 +842,7 @@ get_length_from_term (StThemeNode *node,
|
||||
}
|
||||
else
|
||||
{
|
||||
double resolution = st_theme_context_get_resolution (node->context);
|
||||
double resolution = clutter_backend_get_resolution (clutter_get_default_backend ());
|
||||
*length = num->val * multiplier * (resolution / 72.) * font_size;
|
||||
}
|
||||
}
|
||||
@ -2139,7 +2139,7 @@ font_size_from_term (StThemeNode *node,
|
||||
{
|
||||
if (term->type == TERM_IDENT)
|
||||
{
|
||||
double resolution = st_theme_context_get_resolution (node->context);
|
||||
double resolution = clutter_backend_get_resolution (clutter_get_default_backend ());
|
||||
/* We work in integers to avoid double comparisons when converting back
|
||||
* from a size in pixels to a logical size.
|
||||
*/
|
||||
@ -2346,7 +2346,7 @@ st_theme_node_get_font (StThemeNode *node)
|
||||
parent_size = pango_font_description_get_size (node->font_desc);
|
||||
if (!pango_font_description_get_size_is_absolute (node->font_desc))
|
||||
{
|
||||
double resolution = st_theme_context_get_resolution (node->context);
|
||||
double resolution = clutter_backend_get_resolution (clutter_get_default_backend ());
|
||||
parent_size *= (resolution / 72.);
|
||||
}
|
||||
|
||||
|
@ -435,7 +435,6 @@ main (int argc, char **argv)
|
||||
stage = clutter_stage_new ();
|
||||
context = st_theme_context_get_for_stage (CLUTTER_STAGE (stage));
|
||||
st_theme_context_set_theme (context, theme);
|
||||
st_theme_context_set_resolution (context, 96.);
|
||||
st_theme_context_set_font (context,
|
||||
pango_font_description_from_string ("sans-serif 12"));
|
||||
|
||||
|
Reference in New Issue
Block a user