Compare commits
1 Commits
3.21.2
...
wip/halfli
Author | SHA1 | Date | |
---|---|---|---|
832240a80b |
6
.gitignore
vendored
6
.gitignore
vendored
@ -17,8 +17,10 @@ config.status
|
||||
config
|
||||
configure
|
||||
data/50-gnome-shell-*.xml
|
||||
data/org.gnome.Shell.desktop
|
||||
data/org.gnome.Shell.desktop.in
|
||||
data/gnome-shell.desktop
|
||||
data/gnome-shell.desktop.in
|
||||
data/gnome-shell-wayland.desktop
|
||||
data/gnome-shell-wayland.desktop.in
|
||||
data/gnome-shell-extension-prefs.desktop
|
||||
data/gnome-shell-extension-prefs.desktop.in
|
||||
data/gnome-shell-theme.gresource
|
||||
|
204
NEWS
204
NEWS
@ -1,207 +1,3 @@
|
||||
3.21.2
|
||||
======
|
||||
* Fix sorting of hidden apps in app switcher [Florian; #766238]
|
||||
* Set logind's LockedHint property when locked [Victor; #764773]
|
||||
* Allocate framebuffers early to fix a crash on NVIDIA [Martin; #764898]
|
||||
* Fix cycle-windows/cycle-group keybindings [Florian; #730739]
|
||||
* Switch to shared desktop schema for calendar settings [Iain; #766318]
|
||||
* Misc. bug fixes [Florian, Cosimo, Michele; #766325, #758471, #757556,
|
||||
#757019, #766598]
|
||||
|
||||
Contributors:
|
||||
Cosimo Cecchi, Michele Gaio, Iain Lane, Florian Müllner, Martin Szulecki,
|
||||
Victor Toso
|
||||
|
||||
Translations:
|
||||
Tiago Santos [pt], Kjartan Maraas [nb], Jiro Matsuzawa [ja],
|
||||
Cédric Valmary [oc], Sveinn í Felli [is]
|
||||
|
||||
3.21.1
|
||||
======
|
||||
* Save screencasts in HOME if XDG_VIDEO_DIR doesn't exist [Florian; #765015]
|
||||
* Don't show orientation lock when g-s-d won't rotate [Florian; #765267]
|
||||
* Misc. bug fixes [Heiher, Florian, Marek, Rui; #722752, #765061, #763068,
|
||||
#765607, #757676, #760439]
|
||||
|
||||
Contributors:
|
||||
Heiher, Marek Chalupa, Rui Matos, Florian Müllner
|
||||
|
||||
Translations:
|
||||
Arash Mousavi [fa], Kristjan SCHMIDT [eo], GNOME Translation Robot [gd]
|
||||
|
||||
3.20.1
|
||||
======
|
||||
* Plug a memory leak [Aaron; #735705]
|
||||
|
||||
Contributors:
|
||||
Aaron Plattner
|
||||
|
||||
Translations:
|
||||
Daniel Korostil [uk], Matej Urbančič [sl], Inaki Larranaga Murgoitio [eu],
|
||||
Cheng-Chia Tseng [zh_TW], Fabio Tomat [fur], Trần Ngọc Quân [vi],
|
||||
YunQiang Su [zh_CN], Marek Černocký [cs], Arash Mousavi [fa],
|
||||
Alexander Shopov [bg], Khaled Hosny [ar]
|
||||
|
||||
3.20.0
|
||||
======
|
||||
|
||||
Translations:
|
||||
Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Milo Casagrande [it],
|
||||
Anders Jonsson [sv], Muhammet Kara [tr], Alexandre Franke [fr],
|
||||
Rūdolfs Mazurs [lv], Ask Hjorth Larsen [da], Jiro Matsuzawa [ja]
|
||||
|
||||
3.19.92
|
||||
=======
|
||||
* Update location dialog according to latest mockups [Zeeshan; #762480]
|
||||
* Fix deleting chat notifications in calendar [Florian; #747991]
|
||||
|
||||
Contributors:
|
||||
Zeeshan Ali (Khattak), Florian Müllner
|
||||
|
||||
Translations:
|
||||
Rūdolfs Mazurs [lv], Changwoo Ryu [ko], Matej Urbančič [sl],
|
||||
Justin van Steijn [nl], Fabio Tomat [fur], Kris Thomsen [da],
|
||||
Marek Černocký [cs], Piotr Drąg [pl], Dušan Kazik [sk],
|
||||
Мирослав Николић [sr, sr@latin], Balázs Úr [hu], Yosef Or Boczko [he],
|
||||
Daniel Mustieles [es], Fran Dieguez [gl], Bernd Homuth [de],
|
||||
Tom Tryfonidis [el], Jiri Grönroos [fi], Gil Forcada [ca],
|
||||
Artur Morais [pt_BR], Aurimas Černius [lt], Stas Solovey [ru]
|
||||
|
||||
3.19.91
|
||||
=======
|
||||
* location: Ask user only once [Zeeshan; #762559]
|
||||
* Fix jiggling when auto-hiding legacy tray [Florian; #747957]
|
||||
* Misc. bug fixes [Florian, Michael, Ting-Wei; #762475, #762507, #755659]
|
||||
|
||||
Contributors:
|
||||
Zeeshan Ali (Khattak), Michael Catanzaro, Ting-Wei Lan, Florian Müllner
|
||||
|
||||
Translations:
|
||||
Мирослав Николић [sr, sr@latin], Piotr Drąg [pl], A S Alam [pa],
|
||||
Artur de Aquino Morais [pt_BR], Daniel Mustieles [es],
|
||||
Chao-Hsiung Liao [zh_TW], Daniel Korostil [uk], Fran Dieguez [gl],
|
||||
Tom Tryfonidis [el], Bernd Homuth [de], Sebastian Rasmussen [sv],
|
||||
Jordi Mas [ca], Piotr Drąg [ga], Cédric Valmary [oc], Gábor Kelemen [hu],
|
||||
Baurzhan Muftakhidinov [kk], Friedel Wolff [af], Marek Černocký [cs],
|
||||
Mingye Wang (Arthur2e5) [zh_CN], Aron Xu [zh_CN], Khaled Hosny [ar],
|
||||
Aurimas Černius [lt], Stas Solovey [ru], Yosef Or Boczko [he]
|
||||
|
||||
3.19.90
|
||||
=======
|
||||
* Correctly identify VPN secret requests [Lubomir; #760999]
|
||||
* Improve week number presentation [Jakub; #683245]
|
||||
* Add audio device selection dialog [Florian; #760284]
|
||||
* Add media controls to the time and date drop down [Florian; #756491]
|
||||
* Fix IBus candidate popup position under wayland [Rui; #753476]
|
||||
* Ask user to grant applications access to location [Zeeshan; #762119]
|
||||
* Misc. bug fixes [Mario, Jakub, Florian; #761208, #761772, #762270]
|
||||
|
||||
Contributors:
|
||||
Zeeshan Ali (Khattak), Michael Catanzaro, Rui Matos, Florian Müllner,
|
||||
Lubomir Rintel, Mario Sanchez Prada, Jakub Steiner
|
||||
|
||||
Translations:
|
||||
Alexander Shopov [bg], Balázs Meskó [hu], Fabio Tomat [fur],
|
||||
Dušan Kazik [sk], Piotr Drąg [pl], Alexandre Franke [fr],
|
||||
Mario Blättermann [de], Milo Casagrande [it], Jordi Mas [ca]
|
||||
|
||||
3.19.4
|
||||
======
|
||||
* gdm: Do not allow bypassing disabled Sign In button [Michael; #746180]
|
||||
* Style week numbers in calendar [Jakub; #683245]
|
||||
* Misc. bug fixes [Christophe, Jakub, Rui; #759708, #760577, #760945]
|
||||
|
||||
Contributors:
|
||||
Michael Catanzaro, Marek Černocký, Christophe Fergeau, Rui Matos,
|
||||
Jakub Steiner
|
||||
|
||||
Translations:
|
||||
Aurimas Černius [lt], Enrico Nicoletto [pt_BR], Andika Triwidada [id],
|
||||
Mario Blättermann [de], Marek Černocký [cs], Kjartan Maraas [nb],
|
||||
Muhammet Kara [tr], Stas Solovey [ru]
|
||||
|
||||
3.19.3
|
||||
======
|
||||
* Fix thumbnail scaling in window switcher on HiDPI [Florian; #758676]
|
||||
* Update animated backgrounds on timezone changes [Florian; #758939]
|
||||
* loginDialog: Update user list on user changes [Michael; #758568]
|
||||
* Fix touch interaction on wayland [Carlos; #756748]
|
||||
|
||||
Contributors:
|
||||
Michael Catanzaro, Carlos Garnacho, Kalev Lember, Florian Müllner
|
||||
|
||||
Translations:
|
||||
Daniel Korostil [uk], Muhammet Kara [tr], Dušan Kazik [sk],
|
||||
Baurzhan Muftakhidinov [kk], Marek Černocký [cs]
|
||||
|
||||
3.19.2
|
||||
======
|
||||
* Make gnome-shell DBus activatable [Ray; #741666]
|
||||
* Fix browser plugin crash in Firefox [Carlos; #737932, #757940]
|
||||
* Optionally show battery percentage in system status area [Bastien; #735771]
|
||||
* Misc. bug fixes [Kalev, Florian, Bastien; #757418, #757668, #757779, #757816,
|
||||
#745626, #758220]
|
||||
|
||||
Contributors:
|
||||
Michael Biebl, Michael Catanzaro, Piotr Drąg, Carlos Garcia Campos,
|
||||
Kalev Lember, Florian Müllner, Bastien Nocera, Ray Strode
|
||||
|
||||
Translations:
|
||||
Pedro Albuquerque [pt], liushuyu [zh_CN], Yosef Or Boczko [he],
|
||||
Jiri Grönroos [fi], Kjartan Maraas [nb], GNOME Translation Robot [gd],
|
||||
Daniel Mustieles [es], Marek Černocký [cs], Kristjan SCHMIDT [eo],
|
||||
Stas Solovey [ru]
|
||||
|
||||
3.19.1
|
||||
======
|
||||
* Respect text-scaling factor under wayland [Owen; #756447]
|
||||
* Show the Bluetooth submenu when there were setup devices [Bastien; #723848]
|
||||
* Misc. bug fixes [Florian, Cosimo, Rui, Ray, Owen, Jakub, Bastien;
|
||||
#756697, #756714, #756605, #754814, #738942, #756983, #756925,
|
||||
#757011, #673235, #757150]
|
||||
|
||||
Contributors:
|
||||
Cosimo Cecchi, Rui Matos, Florian Müllner, Bastien Nocera, Jakub Steiner,
|
||||
Ray Strode, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Kjartan Maraas [nb], Khaled Hosny [ar], Balázs Meskó [hu],
|
||||
Daniel Șerbănescu [ro], Marek Černocký [cs]
|
||||
|
||||
3.18.1
|
||||
======
|
||||
* Fix screen freezes when a notification is pushed [Carlos; #755425]
|
||||
* Fix overzealous ellipsization in system status menu [Adel, Florian; #708472]
|
||||
* Hide app menu when disabled by setting [Florian; #745919]
|
||||
* Fix lightbox effect when animations are disabled [Rui; #755827]
|
||||
* Do not mark hotplug notifications as critical [Florian; #657923]
|
||||
* Fix icons getting cut off in dash [Florian; #745649]
|
||||
* Animate fullscreen/unfullscreen operations [Cosimo; #707248]
|
||||
* Misc. bug fixes [Florian, Owen; #748919, #674799, #754581]
|
||||
|
||||
Contributors:
|
||||
Emmanuele Bassi, Michael Catanzaro, Cosimo Cecchi, Matthias Clasen,
|
||||
Adel Gadllah, Carlos Garnacho, Ekaterina Gerasimova, Rui Matos,
|
||||
Florian Müllner, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Марко Костић [sr], Милош Поповић [sr@latin], Khaled Hosny [ar],
|
||||
Trần Ngọc Quân [vi], Petr Kovar [cs], Alexandre Franke [fr],
|
||||
Fran Dieguez [gl], Anders Jonsson [sv], Piotr Drąg [pl], Dušan Kazik [sk],
|
||||
Milo Casagrande [it], Changwoo Ryu [ko], Stas Solovey [ru],
|
||||
Rafael Fontenelle [pt_BR], Tom Tryfonidis [el], Aurimas Černius [lt],
|
||||
Seán de Búrca [ga], Christian Kirbach [de], Jiri Grönroos [fi],
|
||||
Pedro Albuquerque [pt], Baurzhan Muftakhidinov [kk], Daniel Mustieles [es],
|
||||
Marek Černocký [cs], Ask Hjorth Larsen [da], Inaki Larranaga Murgoitio [eu]
|
||||
|
||||
3.18.0
|
||||
======
|
||||
|
||||
Translations:
|
||||
Sendy Aditya Suryana [id], Kris Thomsen [da], Seán de Búrca [ga],
|
||||
Andika Triwidada [id], Enrico Nicoletto [pt_BR], Anders Jonsson [sv],
|
||||
Rūdolfs Mazurs [lv]
|
||||
|
||||
3.17.92
|
||||
=======
|
||||
* Fix race when loading multiple background animations [Josselin; #741453]
|
||||
|
@ -3,10 +3,7 @@ mozillalibdir = $(BROWSER_PLUGIN_DIR)
|
||||
|
||||
mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la
|
||||
|
||||
# Browsers can unload and reload the module while browsing, which is not supported by GObject.
|
||||
# We pass -Wl,-z,nodelete to the linker to ensure the module is never unloaded.
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=737932
|
||||
libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined -Wl,-z,nodelete
|
||||
libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined
|
||||
|
||||
libgnome_shell_browser_plugin_la_LIBADD = \
|
||||
$(BROWSER_PLUGIN_LIBS)
|
||||
|
@ -33,16 +33,20 @@
|
||||
#include <json-glib/json-glib.h>
|
||||
|
||||
#define ORIGIN "extensions.gnome.org"
|
||||
#define PLUGIN_NAME "GNOME Shell Integration"
|
||||
#define PLUGIN_DESCRIPTION "This plugin provides integration with GNOME Shell " \
|
||||
#define PLUGIN_NAME "Gnome Shell Integration"
|
||||
#define PLUGIN_DESCRIPTION "This plugin provides integration with Gnome Shell " \
|
||||
"for live extension enabling and disabling. " \
|
||||
"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_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
|
||||
|
||||
#define PLUGIN_API_VERSION 5
|
||||
|
||||
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
|
||||
|
||||
typedef struct {
|
||||
GDBusProxy *proxy;
|
||||
} PluginData;
|
||||
|
||||
static NPNetscapeFuncs funcs;
|
||||
|
||||
static inline gchar *
|
||||
@ -141,6 +145,121 @@ check_origin_and_protocol (NPP instance)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* =============== public entry points =================== */
|
||||
|
||||
NPError
|
||||
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
||||
{
|
||||
/* global initialization routine, called once when plugin
|
||||
is loaded */
|
||||
|
||||
g_debug ("plugin loaded");
|
||||
|
||||
memcpy (&funcs, pfuncs, sizeof (funcs));
|
||||
|
||||
plugin->size = sizeof(NPPluginFuncs);
|
||||
plugin->newp = NPP_New;
|
||||
plugin->destroy = NPP_Destroy;
|
||||
plugin->getvalue = NPP_GetValue;
|
||||
plugin->setwindow = NPP_SetWindow;
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NP_Shutdown(void)
|
||||
{
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
const char*
|
||||
NP_GetMIMEDescription(void)
|
||||
{
|
||||
return PLUGIN_MIME_STRING;
|
||||
}
|
||||
|
||||
NPError
|
||||
NP_GetValue(void *instance,
|
||||
NPPVariable variable,
|
||||
void *value)
|
||||
{
|
||||
switch (variable) {
|
||||
case NPPVpluginNameString:
|
||||
*(char**)value = PLUGIN_NAME;
|
||||
break;
|
||||
case NPPVpluginDescriptionString:
|
||||
*(char**)value = PLUGIN_DESCRIPTION;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NPP_New(NPMIMEType mimetype,
|
||||
NPP instance,
|
||||
uint16_t mode,
|
||||
int16_t argc,
|
||||
char **argn,
|
||||
char **argv,
|
||||
NPSavedData *saved)
|
||||
{
|
||||
/* instance initialization function */
|
||||
PluginData *data;
|
||||
GError *error = NULL;
|
||||
|
||||
g_debug ("plugin created");
|
||||
|
||||
if (!check_origin_and_protocol (instance))
|
||||
return NPERR_GENERIC_ERROR;
|
||||
|
||||
data = g_slice_new (PluginData);
|
||||
instance->pdata = data;
|
||||
|
||||
data->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
NULL, /* interface info */
|
||||
"org.gnome.Shell",
|
||||
"/org/gnome/Shell",
|
||||
"org.gnome.Shell.Extensions",
|
||||
NULL, /* GCancellable */
|
||||
&error);
|
||||
if (!data->proxy)
|
||||
{
|
||||
/* ignore error if the shell is not running, otherwise warn */
|
||||
if (error->domain != G_DBUS_ERROR ||
|
||||
error->code != G_DBUS_ERROR_NAME_HAS_NO_OWNER)
|
||||
{
|
||||
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
||||
}
|
||||
g_clear_error (&error);
|
||||
return NPERR_GENERIC_ERROR;
|
||||
}
|
||||
|
||||
g_debug ("plugin created successfully");
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NPP_Destroy(NPP instance,
|
||||
NPSavedData **saved)
|
||||
{
|
||||
/* instance finalization function */
|
||||
|
||||
PluginData *data = instance->pdata;
|
||||
|
||||
g_debug ("plugin destroyed");
|
||||
|
||||
g_object_unref (data->proxy);
|
||||
|
||||
g_slice_free (PluginData, data);
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
/* =================== scripting interface =================== */
|
||||
|
||||
typedef struct {
|
||||
@ -211,18 +330,45 @@ static NPObject *
|
||||
plugin_object_allocate (NPP instance,
|
||||
NPClass *klass)
|
||||
{
|
||||
PluginObject *obj = (PluginObject *) funcs.memalloc (sizeof (PluginObject));
|
||||
PluginData *data = instance->pdata;
|
||||
PluginObject *obj = g_slice_new0 (PluginObject);
|
||||
|
||||
memset (obj, 0, sizeof (PluginObject));
|
||||
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);
|
||||
|
||||
return (NPObject*) obj;
|
||||
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
||||
"org.gnome.Shell",
|
||||
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
||||
on_shell_appeared,
|
||||
NULL,
|
||||
obj,
|
||||
NULL);
|
||||
|
||||
g_debug ("plugin object created");
|
||||
|
||||
return (NPObject*)obj;
|
||||
}
|
||||
|
||||
static void
|
||||
plugin_object_deallocate (NPObject *npobj)
|
||||
{
|
||||
funcs.memfree (npobj);
|
||||
PluginObject *obj = (PluginObject*)npobj;
|
||||
|
||||
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
||||
g_object_unref (obj->proxy);
|
||||
|
||||
if (obj->listener)
|
||||
funcs.releaseobject (obj->listener);
|
||||
|
||||
if (obj->watch_name_id)
|
||||
g_bus_unwatch_name (obj->watch_name_id);
|
||||
|
||||
g_debug ("plugin object destroyed");
|
||||
|
||||
g_slice_free (PluginObject, obj);
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
@ -873,149 +1019,6 @@ init_methods_and_properties (void)
|
||||
onextension_changed_id = funcs.getstringidentifier ("onchange");
|
||||
}
|
||||
|
||||
/* =============== public entry points =================== */
|
||||
|
||||
NPError
|
||||
NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
|
||||
{
|
||||
/* global initialization routine, called once when plugin
|
||||
is loaded */
|
||||
|
||||
g_debug ("plugin loaded");
|
||||
|
||||
memcpy (&funcs, pfuncs, sizeof (funcs));
|
||||
|
||||
plugin->size = sizeof(NPPluginFuncs);
|
||||
plugin->newp = NPP_New;
|
||||
plugin->destroy = NPP_Destroy;
|
||||
plugin->getvalue = NPP_GetValue;
|
||||
plugin->setwindow = NPP_SetWindow;
|
||||
plugin->event = NPP_HandleEvent;
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NP_Shutdown(void)
|
||||
{
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
const char*
|
||||
NP_GetMIMEDescription(void)
|
||||
{
|
||||
return PLUGIN_MIME_STRING;
|
||||
}
|
||||
|
||||
NPError
|
||||
NP_GetValue(void *instance,
|
||||
NPPVariable variable,
|
||||
void *value)
|
||||
{
|
||||
switch (variable) {
|
||||
case NPPVpluginNameString:
|
||||
*(char**)value = PLUGIN_NAME;
|
||||
break;
|
||||
case NPPVpluginDescriptionString:
|
||||
*(char**)value = PLUGIN_DESCRIPTION;
|
||||
break;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NPP_New(NPMIMEType mimetype,
|
||||
NPP instance,
|
||||
uint16_t mode,
|
||||
int16_t argc,
|
||||
char **argn,
|
||||
char **argv,
|
||||
NPSavedData *saved)
|
||||
{
|
||||
/* instance initialization function */
|
||||
PluginObject *obj;
|
||||
GError *error = NULL;
|
||||
|
||||
g_debug ("plugin created");
|
||||
|
||||
if (!check_origin_and_protocol (instance))
|
||||
return NPERR_GENERIC_ERROR;
|
||||
|
||||
/* set windowless mode */
|
||||
funcs.setvalue(instance, NPPVpluginWindowBool, NULL);
|
||||
|
||||
g_debug ("creating scriptable object");
|
||||
init_methods_and_properties ();
|
||||
obj = (PluginObject *) funcs.createobject (instance, &plugin_class);
|
||||
instance->pdata = obj;
|
||||
|
||||
obj->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
NULL, /* interface info */
|
||||
"org.gnome.Shell",
|
||||
"/org/gnome/Shell",
|
||||
"org.gnome.Shell.Extensions",
|
||||
NULL, /* GCancellable */
|
||||
&error);
|
||||
if (!obj->proxy)
|
||||
{
|
||||
/* ignore error if the shell is not running, otherwise warn */
|
||||
if (!g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER))
|
||||
{
|
||||
g_warning ("Failed to set up Shell proxy: %s", error->message);
|
||||
}
|
||||
g_clear_error (&error);
|
||||
return NPERR_GENERIC_ERROR;
|
||||
}
|
||||
|
||||
obj->settings = g_settings_new (SHELL_SCHEMA);
|
||||
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
|
||||
G_CALLBACK (on_shell_signal), obj);
|
||||
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
|
||||
"org.gnome.Shell",
|
||||
G_BUS_NAME_WATCHER_FLAGS_NONE,
|
||||
on_shell_appeared,
|
||||
NULL,
|
||||
obj,
|
||||
NULL);
|
||||
|
||||
g_debug ("plugin created successfully");
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NPP_Destroy(NPP instance,
|
||||
NPSavedData **saved)
|
||||
{
|
||||
/* instance finalization function */
|
||||
PluginObject *obj = (PluginObject *) instance->pdata;
|
||||
|
||||
if (!obj)
|
||||
return NPERR_INVALID_INSTANCE_ERROR;
|
||||
|
||||
g_debug ("plugin destroyed");
|
||||
|
||||
g_signal_handler_disconnect (obj->proxy, obj->signal_id);
|
||||
g_object_unref (obj->proxy);
|
||||
|
||||
if (obj->listener)
|
||||
funcs.releaseobject (obj->listener);
|
||||
|
||||
if (obj->restart_listener)
|
||||
funcs.releaseobject (obj->restart_listener);
|
||||
|
||||
if (obj->watch_name_id)
|
||||
g_bus_unwatch_name (obj->watch_name_id);
|
||||
|
||||
funcs.releaseobject((NPObject *)obj);
|
||||
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
NPError
|
||||
NPP_GetValue(NPP instance,
|
||||
NPPVariable variable,
|
||||
@ -1026,10 +1029,13 @@ NPP_GetValue(NPP instance,
|
||||
switch (variable) {
|
||||
case NPPVpluginScriptableNPObject:
|
||||
g_debug ("creating scriptable object");
|
||||
if (!instance->pdata)
|
||||
return NPERR_INVALID_INSTANCE_ERROR;
|
||||
init_methods_and_properties ();
|
||||
|
||||
*(NPObject**)value = instance->pdata;
|
||||
*(NPObject**)value = funcs.createobject (instance, &plugin_class);
|
||||
break;
|
||||
|
||||
case NPPVpluginNeedsXEmbed:
|
||||
*(bool *)value = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -1047,11 +1053,3 @@ NPP_SetWindow(NPP instance,
|
||||
{
|
||||
return NPERR_NO_ERROR;
|
||||
}
|
||||
|
||||
int16_t
|
||||
NPP_HandleEvent(NPP instance,
|
||||
void *event)
|
||||
{
|
||||
/* Ignore the event */
|
||||
return FALSE;
|
||||
}
|
||||
|
21
configure.ac
21
configure.ac
@ -1,6 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.21.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AX_IS_RELEASE([git-directory])
|
||||
AC_INIT([gnome-shell],[3.17.92],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||
@ -52,7 +51,7 @@ if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
|
||||
AC_MSG_RESULT(yes)
|
||||
build_recorder=true
|
||||
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
|
||||
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules mutter-clutter-1.0)
|
||||
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
fi
|
||||
@ -77,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
|
||||
CLUTTER_MIN_VERSION=1.21.5
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4
|
||||
GJS_MIN_VERSION=1.39.0
|
||||
MUTTER_MIN_VERSION=3.21.2
|
||||
MUTTER_MIN_VERSION=3.17.92
|
||||
GTK_MIN_VERSION=3.15.0
|
||||
GIO_MIN_VERSION=2.45.3
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
@ -98,8 +97,8 @@ SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||
gjs-internals-1.0 >= $GJS_MIN_VERSION
|
||||
$recorder_modules
|
||||
gdk-x11-3.0 libsoup-2.4
|
||||
mutter-clutter-1.0 >= $CLUTTER_MIN_VERSION
|
||||
mutter-cogl-pango-1.0
|
||||
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
|
||||
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
|
||||
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
|
||||
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
|
||||
libcanberra libcanberra-gtk3
|
||||
@ -114,12 +113,12 @@ PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
|
||||
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
|
||||
|
||||
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
||||
PKG_CHECK_MODULES(ST, mutter-clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
|
||||
PKG_CHECK_MODULES(TRAY, mutter-clutter-1.0 gtk+-3.0)
|
||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.21.2)
|
||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.13.1)
|
||||
|
||||
AC_ARG_ENABLE(browser-plugin,
|
||||
[AS_HELP_STRING([--enable-browser-plugin],
|
||||
@ -221,7 +220,7 @@ if test "$enable_man" != no; then
|
||||
fi
|
||||
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
|
||||
|
||||
AX_COMPILER_FLAGS()
|
||||
GNOME_COMPILE_WARNINGS([error])
|
||||
case "$WARN_CFLAGS" in
|
||||
*-Werror*)
|
||||
WARN_CFLAGS="$WARN_CFLAGS -Wno-error=deprecated-declarations"
|
||||
@ -270,7 +269,7 @@ Build configuration:
|
||||
Prefix: ${prefix}
|
||||
Source code location: ${srcdir}
|
||||
Compiler: ${CC}
|
||||
Compiler Warnings: $ax_enable_compile_warnings
|
||||
Compiler Warnings: $enable_compile_warnings
|
||||
|
||||
Support for NetworkManager: $have_networkmanager
|
||||
Support for GStreamer recording: $build_recorder
|
||||
|
@ -2,7 +2,7 @@ CLEANFILES =
|
||||
NULL =
|
||||
|
||||
desktopdir=$(datadir)/applications
|
||||
desktop_DATA = org.gnome.Shell.desktop gnome-shell-extension-prefs.desktop
|
||||
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop
|
||||
|
||||
if HAVE_NETWORKMANAGER
|
||||
desktop_DATA += org.gnome.Shell.PortalHelper.desktop
|
||||
@ -104,7 +104,8 @@ convertdir = $(datadir)/GConf/gsettings
|
||||
convert_DATA = gnome-shell-overrides.convert
|
||||
|
||||
EXTRA_DIST = \
|
||||
org.gnome.Shell.desktop.in.in \
|
||||
gnome-shell.desktop.in.in \
|
||||
gnome-shell-wayland.desktop.in.in \
|
||||
gnome-shell-extension-prefs.desktop.in.in \
|
||||
$(introspection_DATA) \
|
||||
$(menu_DATA) \
|
||||
@ -120,7 +121,8 @@ EXTRA_DIST = \
|
||||
$(NULL)
|
||||
|
||||
CLEANFILES += \
|
||||
org.gnome.Shell.desktop.in \
|
||||
gnome-shell.desktop.in \
|
||||
gnome-shell-wayland.desktop.in \
|
||||
gnome-shell-extension-prefs.in \
|
||||
$(desktop_DATA) \
|
||||
$(keys_DATA) \
|
||||
|
15
data/gnome-shell-wayland.desktop.in.in
Normal file
15
data/gnome-shell-wayland.desktop.in.in
Normal file
@ -0,0 +1,15 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
_Name=GNOME Shell (wayland compositor)
|
||||
_Comment=Window management and application launching
|
||||
Exec=@bindir@/gnome-shell --wayland --display-server
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-shell
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
X-GNOME-Bugzilla-Version=@VERSION@
|
||||
Categories=GNOME;GTK;Core;
|
||||
OnlyShowIn=GNOME;
|
||||
NoDisplay=true
|
||||
X-GNOME-Autostart-Phase=DisplayServer
|
||||
X-GNOME-Autostart-Notify=true
|
||||
X-GNOME-AutoRestart=false
|
@ -10,7 +10,7 @@ X-GNOME-Bugzilla-Version=@VERSION@
|
||||
Categories=GNOME;GTK;Core;
|
||||
OnlyShowIn=GNOME;
|
||||
NoDisplay=true
|
||||
X-GNOME-Autostart-Phase=DisplayServer
|
||||
X-GNOME-Autostart-Phase=WindowManager
|
||||
X-GNOME-Provides=panel;windowmanager;
|
||||
X-GNOME-Autostart-Notify=true
|
||||
X-GNOME-AutoRestart=false
|
@ -72,20 +72,22 @@
|
||||
This key sets the default state of the checkbox.
|
||||
</_description>
|
||||
</key>
|
||||
<key name="had-bluetooth-devices-setup" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Whether the default Bluetooth adapter had set up devices associated to it</_summary>
|
||||
<_description>
|
||||
The shell will only show a Bluetooth menu item if a Bluetooth
|
||||
adapter is powered, or if there were devices set up associated
|
||||
with the default adapter. This will be reset if the default
|
||||
adapter is ever seen not to have devices associated to it.
|
||||
</_description>
|
||||
</key>
|
||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="show-weekdate" type="b">
|
||||
<default>false</default>
|
||||
<_summary>Show the week date in the calendar</_summary>
|
||||
<_description>
|
||||
If true, display the ISO week date in the calendar.
|
||||
</_description>
|
||||
</key>
|
||||
</schema>
|
||||
|
||||
<schema id="org.gnome.shell.keybindings" path="/org/gnome/shell/keybindings/"
|
||||
gettext-domain="@GETTEXT_PACKAGE@">
|
||||
<key name="open-application-menu" type="as">
|
||||
|
@ -199,7 +199,7 @@ StScrollBar {
|
||||
border-radius: 9px;
|
||||
color: #eeeeec;
|
||||
background-color: rgba(23, 25, 26, 0.95);
|
||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
||||
border: 3px solid rgba(238, 238, 236, 0.5); }
|
||||
.modal-dialog .modal-dialog-content-box {
|
||||
padding: 24px; }
|
||||
.modal-dialog .run-dialog-entry {
|
||||
@ -224,7 +224,7 @@ StScrollBar {
|
||||
/* End Session Dialog */
|
||||
.end-session-dialog {
|
||||
spacing: 42px;
|
||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
||||
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||
|
||||
.end-session-dialog-list {
|
||||
padding-top: 20px; }
|
||||
@ -399,54 +399,6 @@ StScrollBar {
|
||||
width: 48px;
|
||||
height: 48px; }
|
||||
|
||||
/* Audio selection dialog */
|
||||
.audio-device-selection-dialog {
|
||||
spacing: 30px; }
|
||||
|
||||
.audio-selection-content {
|
||||
spacing: 20px;
|
||||
padding: 24px; }
|
||||
|
||||
.audio-selection-title {
|
||||
font-weight: bold;
|
||||
text-align: center; }
|
||||
|
||||
.audio-selection-box {
|
||||
spacing: 20px; }
|
||||
|
||||
.audio-selection-device {
|
||||
border: 1px solid rgba(238, 238, 236, 0.2);
|
||||
border-radius: 12px; }
|
||||
.audio-selection-device:active, .audio-selection-device:hover, .audio-selection-device:focus {
|
||||
background-color: #215d9c; }
|
||||
|
||||
.audio-selection-device-box {
|
||||
padding: 20px;
|
||||
spacing: 20px; }
|
||||
|
||||
.audio-selection-device-icon {
|
||||
icon-size: 64px; }
|
||||
|
||||
/* Geolocation Dialog */
|
||||
.geolocation-dialog {
|
||||
spacing: 30px; }
|
||||
|
||||
.geolocation-dialog-main-layout {
|
||||
spacing: 12px; }
|
||||
|
||||
.geolocation-dialog-content {
|
||||
spacing: 20px; }
|
||||
|
||||
.geolocation-dialog-icon {
|
||||
icon-size: 48px; }
|
||||
|
||||
.geolocation-dialog-title {
|
||||
font-weight: bold; }
|
||||
|
||||
.geolocation-dialog-reason {
|
||||
color: #999999;
|
||||
font-weight: bold; }
|
||||
|
||||
/* Network Agent Dialog */
|
||||
.network-dialog-secret-table {
|
||||
spacing-rows: 15px;
|
||||
@ -456,9 +408,9 @@ StScrollBar {
|
||||
spacing-rows: 15px;
|
||||
spacing-columns: 1em; }
|
||||
|
||||
/* Popovers/Menus */
|
||||
/* Popvers/Menus */
|
||||
.popup-menu {
|
||||
min-width: 15em; }
|
||||
min-width: 200px; }
|
||||
.popup-menu .popup-sub-menu {
|
||||
background-color: black;
|
||||
box-shadow: inset 0 -1px 0px #0d0d0d; }
|
||||
@ -535,9 +487,6 @@ StScrollBar {
|
||||
border-radius: 0.3em;
|
||||
background-color: rgba(11, 12, 13, 0.5);
|
||||
color: #eeeeec; }
|
||||
.osd-window .level-bar {
|
||||
background-color: #eeeeec;
|
||||
border-radius: 0.3em; }
|
||||
|
||||
/* App Switcher */
|
||||
.switcher-popup {
|
||||
@ -676,8 +625,6 @@ StScrollBar {
|
||||
#panel .panel-status-indicators-box,
|
||||
#panel .panel-status-menu-box {
|
||||
spacing: 2px; }
|
||||
#panel .power-status.panel-status-indicators-box {
|
||||
spacing: 0; }
|
||||
#panel .screencast-indicator {
|
||||
color: #f57900; }
|
||||
|
||||
@ -803,20 +750,9 @@ StScrollBar {
|
||||
color: rgba(255, 255, 255, 0.15);
|
||||
opacity: 0.5; }
|
||||
|
||||
.calendar-week-number {
|
||||
font-size: 70%;
|
||||
font-weight: bold;
|
||||
width: 2.3em;
|
||||
height: 1.8em;
|
||||
border-radius: 2px;
|
||||
padding: 0.5em 0 0;
|
||||
margin: 6px;
|
||||
background-color: rgba(255, 255, 255, 0.3);
|
||||
color: #000; }
|
||||
|
||||
/* Message list */
|
||||
.message-list {
|
||||
width: 31.5em; }
|
||||
width: 420px; }
|
||||
|
||||
.message-list-sections {
|
||||
spacing: 1.5em; }
|
||||
@ -872,23 +808,6 @@ StScrollBar {
|
||||
padding: 8px;
|
||||
font-size: .9em; }
|
||||
|
||||
.message-media-control {
|
||||
padding: 6px; }
|
||||
.message-media-control:last-child:ltr {
|
||||
padding-right: 18px; }
|
||||
.message-media-control:last-child:rtl {
|
||||
padding-left: 18px; }
|
||||
|
||||
.media-message-cover-icon {
|
||||
icon-size: 32px; }
|
||||
.media-message-cover-icon.fallback {
|
||||
color: #1a1a1a;
|
||||
background-color: #000;
|
||||
border: 2px solid #000;
|
||||
border-radius: 2px;
|
||||
icon-size: 16px;
|
||||
padding: 8px; }
|
||||
|
||||
.system-switch-user-submenu-icon.user-icon {
|
||||
icon-size: 20px;
|
||||
padding: 0 2px; }
|
||||
@ -904,7 +823,7 @@ StScrollBar {
|
||||
color: transparent; }
|
||||
|
||||
.aggregate-menu {
|
||||
min-width: 21em; }
|
||||
width: 360px; }
|
||||
.aggregate-menu .popup-menu-icon {
|
||||
padding: 0 4px; }
|
||||
|
||||
@ -1041,14 +960,10 @@ StScrollBar {
|
||||
.search-entry {
|
||||
width: 320px;
|
||||
padding: 7px 9px;
|
||||
border-radius: 6px;
|
||||
border-color: #747467;
|
||||
color: #eeeeec;
|
||||
background-color: #2e3436; }
|
||||
border-radius: 6px; }
|
||||
.search-entry:focus {
|
||||
padding: 6px 8px;
|
||||
border-width: 2px;
|
||||
border-color: #215d9c; }
|
||||
border-width: 2px; }
|
||||
.search-entry .search-entry-icon {
|
||||
icon-size: 1em;
|
||||
padding: 0 4px;
|
||||
|
Submodule data/theme/gnome-shell-sass updated: 31aac7f7b5...034d0b775b
@ -199,7 +199,7 @@ StScrollBar {
|
||||
border-radius: 9px;
|
||||
color: #eeeeec;
|
||||
background-color: rgba(23, 25, 26, 0.95);
|
||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
||||
border: 3px solid rgba(238, 238, 236, 0.5); }
|
||||
.modal-dialog .modal-dialog-content-box {
|
||||
padding: 24px; }
|
||||
.modal-dialog .run-dialog-entry {
|
||||
@ -224,7 +224,7 @@ StScrollBar {
|
||||
/* End Session Dialog */
|
||||
.end-session-dialog {
|
||||
spacing: 42px;
|
||||
border: 1px solid rgba(238, 238, 236, 0.2); }
|
||||
border: 3px solid rgba(238, 238, 236, 0.2); }
|
||||
|
||||
.end-session-dialog-list {
|
||||
padding-top: 20px; }
|
||||
@ -399,54 +399,6 @@ StScrollBar {
|
||||
width: 48px;
|
||||
height: 48px; }
|
||||
|
||||
/* Audio selection dialog */
|
||||
.audio-device-selection-dialog {
|
||||
spacing: 30px; }
|
||||
|
||||
.audio-selection-content {
|
||||
spacing: 20px;
|
||||
padding: 24px; }
|
||||
|
||||
.audio-selection-title {
|
||||
font-weight: bold;
|
||||
text-align: center; }
|
||||
|
||||
.audio-selection-box {
|
||||
spacing: 20px; }
|
||||
|
||||
.audio-selection-device {
|
||||
border: 1px solid rgba(238, 238, 236, 0.2);
|
||||
border-radius: 12px; }
|
||||
.audio-selection-device:active, .audio-selection-device:hover, .audio-selection-device:focus {
|
||||
background-color: #215d9c; }
|
||||
|
||||
.audio-selection-device-box {
|
||||
padding: 20px;
|
||||
spacing: 20px; }
|
||||
|
||||
.audio-selection-device-icon {
|
||||
icon-size: 64px; }
|
||||
|
||||
/* Geolocation Dialog */
|
||||
.geolocation-dialog {
|
||||
spacing: 30px; }
|
||||
|
||||
.geolocation-dialog-main-layout {
|
||||
spacing: 12px; }
|
||||
|
||||
.geolocation-dialog-content {
|
||||
spacing: 20px; }
|
||||
|
||||
.geolocation-dialog-icon {
|
||||
icon-size: 48px; }
|
||||
|
||||
.geolocation-dialog-title {
|
||||
font-weight: bold; }
|
||||
|
||||
.geolocation-dialog-reason {
|
||||
color: #8e8e80;
|
||||
font-weight: bold; }
|
||||
|
||||
/* Network Agent Dialog */
|
||||
.network-dialog-secret-table {
|
||||
spacing-rows: 15px;
|
||||
@ -456,9 +408,9 @@ StScrollBar {
|
||||
spacing-rows: 15px;
|
||||
spacing-columns: 1em; }
|
||||
|
||||
/* Popovers/Menus */
|
||||
/* Popvers/Menus */
|
||||
.popup-menu {
|
||||
min-width: 15em; }
|
||||
min-width: 200px; }
|
||||
.popup-menu .popup-sub-menu {
|
||||
background-color: #343a3a;
|
||||
box-shadow: inset 0 -1px 0px #282c2c; }
|
||||
@ -535,9 +487,6 @@ StScrollBar {
|
||||
border-radius: 0.3em;
|
||||
background-color: rgba(11, 12, 13, 0.5);
|
||||
color: #eeeeec; }
|
||||
.osd-window .level-bar {
|
||||
background-color: #eeeeec;
|
||||
border-radius: 0.3em; }
|
||||
|
||||
/* App Switcher */
|
||||
.switcher-popup {
|
||||
@ -676,8 +625,6 @@ StScrollBar {
|
||||
#panel .panel-status-indicators-box,
|
||||
#panel .panel-status-menu-box {
|
||||
spacing: 2px; }
|
||||
#panel .power-status.panel-status-indicators-box {
|
||||
spacing: 0; }
|
||||
#panel .screencast-indicator {
|
||||
color: #f57900; }
|
||||
|
||||
@ -803,20 +750,9 @@ StScrollBar {
|
||||
color: rgba(238, 238, 236, 0.15);
|
||||
opacity: 0.5; }
|
||||
|
||||
.calendar-week-number {
|
||||
font-size: 70%;
|
||||
font-weight: bold;
|
||||
width: 2.3em;
|
||||
height: 1.8em;
|
||||
border-radius: 2px;
|
||||
padding: 0.5em 0 0;
|
||||
margin: 6px;
|
||||
background-color: rgba(238, 238, 236, 0.3);
|
||||
color: #393f3f; }
|
||||
|
||||
/* Message list */
|
||||
.message-list {
|
||||
width: 31.5em; }
|
||||
width: 420px; }
|
||||
|
||||
.message-list-sections {
|
||||
spacing: 1.5em; }
|
||||
@ -872,23 +808,6 @@ StScrollBar {
|
||||
padding: 8px;
|
||||
font-size: .9em; }
|
||||
|
||||
.message-media-control {
|
||||
padding: 6px; }
|
||||
.message-media-control:last-child:ltr {
|
||||
padding-right: 18px; }
|
||||
.message-media-control:last-child:rtl {
|
||||
padding-left: 18px; }
|
||||
|
||||
.media-message-cover-icon {
|
||||
icon-size: 32px; }
|
||||
.media-message-cover-icon.fallback {
|
||||
color: #515a5a;
|
||||
background-color: #393f3f;
|
||||
border: 2px solid #393f3f;
|
||||
border-radius: 2px;
|
||||
icon-size: 16px;
|
||||
padding: 8px; }
|
||||
|
||||
.system-switch-user-submenu-icon.user-icon {
|
||||
icon-size: 20px;
|
||||
padding: 0 2px; }
|
||||
@ -904,7 +823,7 @@ StScrollBar {
|
||||
color: transparent; }
|
||||
|
||||
.aggregate-menu {
|
||||
min-width: 21em; }
|
||||
width: 280px; }
|
||||
.aggregate-menu .popup-menu-icon {
|
||||
padding: 0 4px; }
|
||||
|
||||
@ -1041,14 +960,10 @@ StScrollBar {
|
||||
.search-entry {
|
||||
width: 320px;
|
||||
padding: 7px 9px;
|
||||
border-radius: 6px;
|
||||
border-color: #747467;
|
||||
color: #eeeeec;
|
||||
background-color: #2e3436; }
|
||||
border-radius: 6px; }
|
||||
.search-entry:focus {
|
||||
padding: 6px 8px;
|
||||
border-width: 2px;
|
||||
border-color: #215d9c; }
|
||||
border-width: 2px; }
|
||||
.search-entry .search-entry-icon {
|
||||
icon-size: 1em;
|
||||
padding: 0 4px;
|
||||
|
@ -113,7 +113,7 @@ expand_content_files=
|
||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||
GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS)
|
||||
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell-base.la $(top_builddir)/src/libgnome-shell.la -rpath $(MUTTER_TYPELIB_DIR)
|
||||
GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(top_builddir)/src/libgnome-shell-menu.la $(top_builddir)/src/libgnome-shell-base.la $(top_builddir)/src/libgnome-shell.la
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
@ -78,7 +78,7 @@ expand_content_files=
|
||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||
GTKDOC_CFLAGS=
|
||||
GTKDOC_LIBS=$(top_builddir)/src/libst-1.0.la -rpath $(MUTTER_TYPELIB_DIR)
|
||||
GTKDOC_LIBS=$(top_builddir)/src/libst-1.0.la
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
@ -23,6 +23,11 @@ const GnomeShellIface = '<node> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const customCss = '.prefs-button { \
|
||||
padding: 8px; \
|
||||
border-radius: 20px; \
|
||||
}';
|
||||
|
||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||
|
||||
function stripPrefix(string, prefix) {
|
||||
@ -171,6 +176,21 @@ const Application = new Lang.Class({
|
||||
this._window.show_all();
|
||||
},
|
||||
|
||||
_addCustomStyle: function() {
|
||||
let provider = new Gtk.CssProvider();
|
||||
|
||||
try {
|
||||
provider.load_from_data(customCss, -1);
|
||||
} catch(e) {
|
||||
log('Failed to add application style');
|
||||
return;
|
||||
}
|
||||
|
||||
let screen = this._window.window.get_screen();
|
||||
let priority = Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION;
|
||||
Gtk.StyleContext.add_provider_for_screen(screen, provider, priority);
|
||||
},
|
||||
|
||||
_sortList: function(row1, row2) {
|
||||
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
|
||||
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
|
||||
@ -219,6 +239,7 @@ const Application = new Lang.Class({
|
||||
|
||||
_onStartup: function(app) {
|
||||
this._buildUI(app);
|
||||
this._addCustomStyle();
|
||||
this._scanExtensions();
|
||||
},
|
||||
|
||||
@ -295,7 +316,7 @@ const ExtensionRow = new Lang.Class({
|
||||
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
|
||||
icon_size: Gtk.IconSize.BUTTON,
|
||||
visible: true }));
|
||||
button.get_style_context().add_class('circular');
|
||||
button.get_style_context().add_class('prefs-button');
|
||||
hbox.add(button);
|
||||
|
||||
this.prefsButton = button;
|
||||
|
@ -189,8 +189,7 @@ const AuthPrompt = new Lang.Class({
|
||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
||||
}));
|
||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
||||
if (this.nextButton.reactive)
|
||||
this.emit('next');
|
||||
this.emit('next');
|
||||
}));
|
||||
},
|
||||
|
||||
|
@ -16,34 +16,6 @@
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* In order for transformation animations to look good, they need to be
|
||||
* incremental and have some order to them (e.g., fade out hidden items,
|
||||
* then shrink to close the void left over). Chaining animations in this way can
|
||||
* be error-prone and wordy using just Tweener callbacks.
|
||||
*
|
||||
* The classes in this file help with this:
|
||||
*
|
||||
* - Task. encapsulates schedulable work to be run in a specific scope.
|
||||
*
|
||||
* - ConsecutiveBatch. runs a series of tasks in order and completes
|
||||
* when the last in the series finishes.
|
||||
*
|
||||
* - ConcurrentBatch. runs a set of tasks at the same time and completes
|
||||
* when the last to finish completes.
|
||||
*
|
||||
* - Hold. prevents a batch from completing the pending task until
|
||||
* the hold is released.
|
||||
*
|
||||
* The tasks associated with a batch are specified in a list at batch
|
||||
* construction time as either task objects or plain functions.
|
||||
* Batches are task objects, themselves, so they can be nested.
|
||||
*
|
||||
* These classes aren't specific to GDM, but were found to be unintuitive and so
|
||||
* are not used elsewhere. These APIs may ultimately get dropped entirely and
|
||||
* replaced by something else.
|
||||
*/
|
||||
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
|
||||
|
@ -96,7 +96,7 @@ const UserListItem = new Lang.Class({
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this.user.disconnect(this._userChangedId);
|
||||
this._user.disconnect(this._userChangedId);
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
@ -212,10 +212,6 @@ const UserList = new Lang.Class({
|
||||
return item;
|
||||
},
|
||||
|
||||
containsUser: function(user) {
|
||||
return this._items[user.get_user_name()] != null;
|
||||
},
|
||||
|
||||
addUser: function(user) {
|
||||
if (!user.is_loaded)
|
||||
return;
|
||||
@ -928,7 +924,11 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
onUpdateScope: this,
|
||||
onComplete: function() {
|
||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||
let id = Mainloop.idle_add(Lang.bind(this, function() {
|
||||
this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] this._greeter.call_start_session_when_ready_sync');
|
||||
},
|
||||
onCompleteScope: this });
|
||||
},
|
||||
@ -1130,10 +1130,6 @@ const LoginDialog = new Lang.Class({
|
||||
this._userManager.disconnect(this._userRemovedId);
|
||||
this._userRemovedId = 0;
|
||||
}
|
||||
if (this._userChangedId) {
|
||||
this._userManager.disconnect(this._userChangedId);
|
||||
this._userChangedId = 0;
|
||||
}
|
||||
this._textureCache.disconnect(this._updateLogoTextureId);
|
||||
Main.layoutManager.disconnect(this._startupCompleteId);
|
||||
if (this._settings) {
|
||||
@ -1180,14 +1176,6 @@ const LoginDialog = new Lang.Class({
|
||||
this._userList.removeUser(user);
|
||||
}));
|
||||
|
||||
this._userChangedId = this._userManager.connect('user-changed',
|
||||
Lang.bind(this, function(userManager, user) {
|
||||
if (this._userList.containsUser(user) && user.locked)
|
||||
this._userList.removeUser(user);
|
||||
else if (!this._userList.containsUser(user) && !user.locked)
|
||||
this._userList.addUser(user);
|
||||
}));
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
},
|
||||
|
||||
|
@ -35,7 +35,6 @@
|
||||
<file>ui/animation.js</file>
|
||||
<file>ui/appDisplay.js</file>
|
||||
<file>ui/appFavorites.js</file>
|
||||
<file>ui/audioDeviceSelection.js</file>
|
||||
<file>ui/backgroundMenu.js</file>
|
||||
<file>ui/background.js</file>
|
||||
<file>ui/boxpointer.js</file>
|
||||
@ -63,9 +62,7 @@
|
||||
<file>ui/magnifierDBus.js</file>
|
||||
<file>ui/main.js</file>
|
||||
<file>ui/messageTray.js</file>
|
||||
<file>ui/messageList.js</file>
|
||||
<file>ui/modalDialog.js</file>
|
||||
<file>ui/mpris.js</file>
|
||||
<file>ui/notificationDaemon.js</file>
|
||||
<file>ui/osdWindow.js</file>
|
||||
<file>ui/osdMonitorLabeler.js</file>
|
||||
|
@ -40,9 +40,6 @@ const SystemdLoginSessionIface = '<node> \
|
||||
<signal name="Lock" /> \
|
||||
<signal name="Unlock" /> \
|
||||
<property name="Active" type="b" access="read" /> \
|
||||
<method name="SetLockedHint"> \
|
||||
<arg type="b" direction="in"/> \
|
||||
</method> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
|
@ -354,59 +354,6 @@ const AppSwitcherPopup = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const CyclerPopup = new Lang.Class({
|
||||
Name: 'CyclerPopup',
|
||||
Extends: SwitcherPopup.SwitcherPopup,
|
||||
Abstract: true,
|
||||
|
||||
_init : function() {
|
||||
this.parent();
|
||||
|
||||
this._items = this._getWindows();
|
||||
|
||||
if (this._items.length == 0)
|
||||
return;
|
||||
|
||||
// We don't show an actual popup, so just provide what SwitcherPopup
|
||||
// expects instead of inheriting from SwitcherList
|
||||
this._switcherList = { actor: new St.Widget(),
|
||||
highlight: Lang.bind(this, this._highlightItem),
|
||||
connect: function() {} };
|
||||
},
|
||||
|
||||
_highlightItem: function(index, justOutline) {
|
||||
Main.activateWindow(this._items[index]);
|
||||
},
|
||||
|
||||
_finish: function() {
|
||||
this._highlightItem(this._selectedIndex);
|
||||
|
||||
this.parent();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const GroupCyclerPopup = new Lang.Class({
|
||||
Name: 'GroupCyclerPopup',
|
||||
Extends: CyclerPopup,
|
||||
|
||||
_getWindows: function() {
|
||||
let app = Shell.WindowTracker.get_default().focus_app;
|
||||
return app ? app.get_windows() : [];
|
||||
},
|
||||
|
||||
_keyPressHandler: function(keysym, action) {
|
||||
if (action == Meta.KeyBindingAction.CYCLE_GROUP)
|
||||
this._select(this._next());
|
||||
else if (action == Meta.KeyBindingAction.CYCLE_GROUP_BACKWARD)
|
||||
this._select(this._previous());
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
});
|
||||
|
||||
const WindowSwitcherPopup = new Lang.Class({
|
||||
Name: 'WindowSwitcherPopup',
|
||||
Extends: SwitcherPopup.SwitcherPopup,
|
||||
@ -454,32 +401,6 @@ const WindowSwitcherPopup = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const WindowCyclerPopup = new Lang.Class({
|
||||
Name: 'WindowCyclerPopup',
|
||||
Extends: CyclerPopup,
|
||||
|
||||
_init: function() {
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
|
||||
this.parent();
|
||||
},
|
||||
|
||||
_getWindows: function() {
|
||||
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
|
||||
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
||||
},
|
||||
|
||||
_keyPressHandler: function(keysym, action) {
|
||||
if (action == Meta.KeyBindingAction.CYCLE_WINDOWS)
|
||||
this._select(this._next());
|
||||
else if (action == Meta.KeyBindingAction.CYCLE_WINDOWS_BACKWARD)
|
||||
this._select(this._previous());
|
||||
else
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
});
|
||||
|
||||
const AppIcon = new Lang.Class({
|
||||
Name: 'AppIcon',
|
||||
|
||||
@ -527,6 +448,8 @@ const AppSwitcher = new Lang.Class({
|
||||
});
|
||||
if (appIcon.cachedWindows.length > 0)
|
||||
this._addIcon(appIcon);
|
||||
else if (workspace == null)
|
||||
throw new Error('%s appears to be running, but doesn\'t have any windows'.format(appIcon.app.get_name()));
|
||||
}
|
||||
|
||||
this._curApp = -1;
|
||||
@ -764,17 +687,15 @@ const WindowIcon = new Lang.Class({
|
||||
|
||||
this._icon.destroy_all_children();
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
|
||||
switch (mode) {
|
||||
case AppIconMode.THUMBNAIL_ONLY:
|
||||
size = WINDOW_PREVIEW_SIZE;
|
||||
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
|
||||
this._icon.add_actor(_createWindowClone(mutterWindow, WINDOW_PREVIEW_SIZE));
|
||||
break;
|
||||
|
||||
case AppIconMode.BOTH:
|
||||
size = WINDOW_PREVIEW_SIZE;
|
||||
this._icon.add_actor(_createWindowClone(mutterWindow, size * scaleFactor));
|
||||
this._icon.add_actor(_createWindowClone(mutterWindow, WINDOW_PREVIEW_SIZE));
|
||||
|
||||
if (this.app)
|
||||
this._icon.add_actor(this._createAppIcon(this.app,
|
||||
@ -786,7 +707,7 @@ const WindowIcon = new Lang.Class({
|
||||
this._icon.add_actor(this._createAppIcon(this.app, size));
|
||||
}
|
||||
|
||||
this._icon.set_size(size * scaleFactor, size * scaleFactor);
|
||||
this._icon.set_size(size, size);
|
||||
},
|
||||
|
||||
_createAppIcon: function(app, size) {
|
||||
|
@ -7,7 +7,7 @@ const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
const ANIMATED_ICON_UPDATE_TIMEOUT = 16;
|
||||
const ANIMATED_ICON_UPDATE_TIMEOUT = 14;
|
||||
|
||||
const Animation = new Lang.Class({
|
||||
Name: 'Animation',
|
||||
@ -33,7 +33,7 @@ const Animation = new Lang.Class({
|
||||
if (this._frame == 0)
|
||||
this._showFrame(0);
|
||||
|
||||
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_LOW, this._speed, Lang.bind(this, this._update));
|
||||
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
|
||||
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
|
||||
}
|
||||
|
||||
|
@ -1814,7 +1814,7 @@ const AppIconMenu = new Lang.Class({
|
||||
if (!source.actor.mapped)
|
||||
this.close();
|
||||
}));
|
||||
source.actor.connect('destroy', Lang.bind(this, this.destroy));
|
||||
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
|
||||
|
||||
Main.uiGroup.add_actor(this.actor);
|
||||
},
|
||||
|
@ -16,18 +16,16 @@ const RENAMED_DESKTOP_IDS = {
|
||||
'glchess.desktop': 'gnome-chess.desktop',
|
||||
'glines.desktop': 'five-or-more.desktop',
|
||||
'gnect.desktop': 'four-in-a-row.desktop',
|
||||
'gnibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||
'gnibbles.desktop': 'gnome-nibbles.desktop',
|
||||
'gnobots2.desktop': 'gnome-robots.desktop',
|
||||
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
|
||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
|
||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||
'gnome-nibbles.desktop': 'org.gnome.Nibbles.desktop',
|
||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||
'gnome-terminal.desktop': 'org.gnome.Terminal.desktop',
|
||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
||||
'gnomine.desktop': 'gnome-mines.desktop',
|
||||
'gnotravex.desktop': 'gnome-tetravex.desktop',
|
||||
|
@ -1,216 +0,0 @@
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
|
||||
const AudioDevice = {
|
||||
HEADPHONES: 1 << 0,
|
||||
HEADSET: 1 << 1,
|
||||
MICROPHONE: 1 << 2
|
||||
};
|
||||
|
||||
const AudioDeviceSelectionIface = '<node> \
|
||||
<interface name="org.gnome.Shell.AudioDeviceSelection"> \
|
||||
<method name="Open"> \
|
||||
<arg name="devices" direction="in" type="as" /> \
|
||||
</method> \
|
||||
<method name="Close"> \
|
||||
</method> \
|
||||
<signal name="DeviceSelected"> \
|
||||
<arg name="device" type="s" /> \
|
||||
</signal> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const AudioDeviceSelectionDialog = new Lang.Class({
|
||||
Name: 'AudioDeviceSelectionDialog',
|
||||
Extends: ModalDialog.ModalDialog,
|
||||
|
||||
_init: function(devices) {
|
||||
this.parent({ styleClass: 'audio-device-selection-dialog' });
|
||||
|
||||
this._deviceItems = {};
|
||||
|
||||
this._buildLayout();
|
||||
|
||||
if (devices & AudioDevice.HEADPHONES)
|
||||
this._addDevice(AudioDevice.HEADPHONES);
|
||||
if (devices & AudioDevice.HEADSET)
|
||||
this._addDevice(AudioDevice.HEADSET);
|
||||
if (devices & AudioDevice.MICROPHONE)
|
||||
this._addDevice(AudioDevice.MICROPHONE);
|
||||
|
||||
if (this._selectionBox.get_n_children() < 2)
|
||||
throw new Error('Too few devices for a selection');
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
this.parent();
|
||||
},
|
||||
|
||||
_buildLayout: function(devices) {
|
||||
let title = new St.Label({ style_class: 'audio-selection-title',
|
||||
text: _("Select Audio Device"),
|
||||
x_align: Clutter.ActorAlign.CENTER });
|
||||
|
||||
this.contentLayout.style_class = 'audio-selection-content';
|
||||
this.contentLayout.add(title);
|
||||
|
||||
this._selectionBox = new St.BoxLayout({ style_class: 'audio-selection-box' });
|
||||
this.contentLayout.add(this._selectionBox, { expand: true });
|
||||
|
||||
this.addButton({ action: Lang.bind(this, this._openSettings),
|
||||
label: _("Sound Settings") });
|
||||
this.addButton({ action: Lang.bind(this, this.close),
|
||||
label: _("Cancel"),
|
||||
key: Clutter.Escape });
|
||||
},
|
||||
|
||||
_getDeviceLabel: function(device) {
|
||||
switch(device) {
|
||||
case AudioDevice.HEADPHONES:
|
||||
return _("Headphones");
|
||||
case AudioDevice.HEADSET:
|
||||
return _("Headset");
|
||||
case AudioDevice.MICROPHONE:
|
||||
return _("Microphone");
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
_getDeviceIcon: function(device) {
|
||||
switch(device) {
|
||||
case AudioDevice.HEADPHONES:
|
||||
return 'audio-headphones-symbolic';
|
||||
case AudioDevice.HEADSET:
|
||||
return 'audio-headset-symbolic';
|
||||
case AudioDevice.MICROPHONE:
|
||||
return 'audio-input-microphone-symbolic';
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
_addDevice: function(device) {
|
||||
let box = new St.BoxLayout({ style_class: 'audio-selection-device-box',
|
||||
vertical: true });
|
||||
box.connect('notify::height',
|
||||
function() {
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||
function() {
|
||||
box.width = box.height;
|
||||
});
|
||||
});
|
||||
|
||||
let icon = new St.Icon({ style_class: 'audio-selection-device-icon',
|
||||
icon_name: this._getDeviceIcon(device) });
|
||||
box.add(icon);
|
||||
|
||||
let label = new St.Label({ style_class: 'audio-selection-device-label',
|
||||
text: this._getDeviceLabel(device),
|
||||
x_align: Clutter.ActorAlign.CENTER });
|
||||
box.add(label);
|
||||
|
||||
let button = new St.Button({ style_class: 'audio-selection-device',
|
||||
can_focus: true,
|
||||
child: box });
|
||||
this._selectionBox.add(button);
|
||||
|
||||
button.connect('clicked', Lang.bind(this,
|
||||
function() {
|
||||
this.emit('device-selected', device);
|
||||
this.close();
|
||||
Main.overview.hide();
|
||||
}));
|
||||
},
|
||||
|
||||
_openSettings: function() {
|
||||
let desktopFile = 'gnome-sound-panel.desktop'
|
||||
let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
|
||||
|
||||
if (!app) {
|
||||
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');
|
||||
return;
|
||||
}
|
||||
|
||||
this.close();
|
||||
Main.overview.hide();
|
||||
app.activate();
|
||||
}
|
||||
});
|
||||
|
||||
const AudioDeviceSelectionDBus = new Lang.Class({
|
||||
Name: 'AudioDeviceSelectionDBus',
|
||||
|
||||
_init: function() {
|
||||
this._audioSelectionDialog = null;
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AudioDeviceSelectionIface, this);
|
||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/AudioDeviceSelection');
|
||||
|
||||
Gio.DBus.session.own_name('org.gnome.Shell.AudioDeviceSelection', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||
},
|
||||
|
||||
_onDialogClosed: function() {
|
||||
this._audioSelectionDialog = null;
|
||||
},
|
||||
|
||||
_onDeviceSelected: function(dialog, device) {
|
||||
let connection = this._dbusImpl.get_connection();
|
||||
let info = this._dbusImpl.get_info();
|
||||
let deviceName = Object.keys(AudioDevice).filter(
|
||||
function(dev) {
|
||||
return AudioDevice[dev] == device;
|
||||
})[0].toLowerCase();
|
||||
connection.emit_signal(this._audioSelectionDialog._sender,
|
||||
this._dbusImpl.get_object_path(),
|
||||
info ? info.name : null,
|
||||
'DeviceSelected',
|
||||
GLib.Variant.new('(s)', [deviceName]));
|
||||
},
|
||||
|
||||
OpenAsync: function(params, invocation) {
|
||||
if (this._audioSelectionDialog) {
|
||||
invocation.return_value(null);
|
||||
return;
|
||||
}
|
||||
|
||||
let [deviceNames] = params;
|
||||
let devices = 0;
|
||||
deviceNames.forEach(function(n) {
|
||||
devices |= AudioDevice[n.toUpperCase()];
|
||||
});
|
||||
|
||||
let dialog;
|
||||
try {
|
||||
dialog = new AudioDeviceSelectionDialog(devices);
|
||||
} catch(e) {
|
||||
invocation.return_value(null);
|
||||
return;
|
||||
}
|
||||
dialog._sender = invocation.get_sender();
|
||||
|
||||
dialog.connect('closed', Lang.bind(this, this._onDialogClosed));
|
||||
dialog.connect('device-selected',
|
||||
Lang.bind(this, this._onDeviceSelected));
|
||||
dialog.open();
|
||||
|
||||
this._audioSelectionDialog = dialog;
|
||||
invocation.return_value(null);
|
||||
},
|
||||
|
||||
CloseAsync: function(params, invocation) {
|
||||
if (this._audioSelectionDialog &&
|
||||
this._audioSelectionDialog._sender == invocation.get_sender())
|
||||
this._audioSelectionDialog.close();
|
||||
|
||||
invocation.return_value(null);
|
||||
}
|
||||
});
|
@ -247,13 +247,6 @@ const Background = new Lang.Class({
|
||||
this._cancellable = new Gio.Cancellable();
|
||||
this.isLoaded = false;
|
||||
|
||||
this._clock = new GnomeDesktop.WallClock();
|
||||
this._timezoneChangedId = this._clock.connect('notify::timezone',
|
||||
Lang.bind(this, function() {
|
||||
if (this._animation)
|
||||
this._loadAnimation(this._animation.file);
|
||||
}));
|
||||
|
||||
this._settingsChangedSignalId = this._settings.connect('changed', Lang.bind(this, function() {
|
||||
this.emit('changed');
|
||||
}));
|
||||
@ -272,10 +265,6 @@ const Background = new Lang.Class({
|
||||
}
|
||||
this._fileWatches = null;
|
||||
|
||||
if (this._timezoneChangedId != 0)
|
||||
this._clock.disconnect(this._timezoneChangedId);
|
||||
this._timezoneChangedId = 0;
|
||||
|
||||
if (this._settingsChangedSignalId != 0)
|
||||
this._settings.disconnect(this._settingsChangedSignalId);
|
||||
this._settingsChangedSignalId = 0;
|
||||
|
@ -1,19 +1,23 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Atk = imports.gi.Atk;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Gettext_gtk30 = imports.gettext.domain('gtk30');
|
||||
const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const MessageList = imports.ui.messageList;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const Mpris = imports.ui.mpris;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
|
||||
@ -22,24 +26,28 @@ const ELLIPSIS_CHAR = '\u2026';
|
||||
|
||||
const MESSAGE_ICON_SIZE = 32;
|
||||
|
||||
const MESSAGE_ANIMATION_TIME = 0.1;
|
||||
|
||||
const DEFAULT_EXPAND_LINES = 6;
|
||||
|
||||
// alias to prevent xgettext from picking up strings translated in GTK+
|
||||
const gtk30_ = Gettext_gtk30.gettext;
|
||||
const NC_ = function(context, str) { return context + '\u0004' + str; };
|
||||
|
||||
function sameYear(dateA, dateB) {
|
||||
function _sameYear(dateA, dateB) {
|
||||
return (dateA.getYear() == dateB.getYear());
|
||||
}
|
||||
|
||||
function sameMonth(dateA, dateB) {
|
||||
return sameYear(dateA, dateB) && (dateA.getMonth() == dateB.getMonth());
|
||||
function _sameMonth(dateA, dateB) {
|
||||
return _sameYear(dateA, dateB) && (dateA.getMonth() == dateB.getMonth());
|
||||
}
|
||||
|
||||
function sameDay(dateA, dateB) {
|
||||
return sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate());
|
||||
function _sameDay(dateA, dateB) {
|
||||
return _sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate());
|
||||
}
|
||||
|
||||
function isToday(date) {
|
||||
return sameDay(new Date(), date);
|
||||
function _isToday(date) {
|
||||
return _sameDay(new Date(), date);
|
||||
}
|
||||
|
||||
function _isWorkDay(date) {
|
||||
@ -90,6 +98,148 @@ function _getCalendarDayAbbreviation(dayNumber) {
|
||||
return Shell.util_translate_time_string(abbreviations[dayNumber]);
|
||||
}
|
||||
|
||||
function _fixMarkup(text, allowMarkup) {
|
||||
if (allowMarkup) {
|
||||
// Support &, ", ', < and >, escape all other
|
||||
// occurrences of '&'.
|
||||
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&');
|
||||
|
||||
// Support <b>, <i>, and <u>, escape anything else
|
||||
// so it displays as raw markup.
|
||||
_text = _text.replace(/<(?!\/?[biu]>)/g, '<');
|
||||
|
||||
try {
|
||||
Pango.parse_markup(_text, -1, '');
|
||||
return _text;
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
// !allowMarkup, or invalid markup
|
||||
return GLib.markup_escape_text(text, -1);
|
||||
}
|
||||
|
||||
const URLHighlighter = new Lang.Class({
|
||||
Name: 'URLHighlighter',
|
||||
|
||||
_init: function(text, lineWrap, allowMarkup) {
|
||||
if (!text)
|
||||
text = '';
|
||||
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter',
|
||||
x_expand: true, x_align: Clutter.ActorAlign.START });
|
||||
this._linkColor = '#ccccff';
|
||||
this.actor.connect('style-changed', Lang.bind(this, function() {
|
||||
let [hasColor, color] = this.actor.get_theme_node().lookup_color('link-color', false);
|
||||
if (hasColor) {
|
||||
let linkColor = color.to_string().substr(0, 7);
|
||||
if (linkColor != this._linkColor) {
|
||||
this._linkColor = linkColor;
|
||||
this._highlightUrls();
|
||||
}
|
||||
}
|
||||
}));
|
||||
this.actor.clutter_text.line_wrap = lineWrap;
|
||||
this.actor.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
|
||||
|
||||
this.setMarkup(text, allowMarkup);
|
||||
this.actor.connect('button-press-event', Lang.bind(this, function(actor, event) {
|
||||
// Don't try to URL highlight when invisible.
|
||||
// The MessageTray doesn't actually hide us, so
|
||||
// we need to check for paint opacities as well.
|
||||
if (!actor.visible || actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
// Keep Notification.actor from seeing this and taking
|
||||
// a pointer grab, which would block our button-release-event
|
||||
// handler, if an URL is clicked
|
||||
return this._findUrlAtPos(event) != -1;
|
||||
}));
|
||||
this.actor.connect('button-release-event', Lang.bind(this, function (actor, event) {
|
||||
if (!actor.visible || actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let urlId = this._findUrlAtPos(event);
|
||||
if (urlId != -1) {
|
||||
let url = this._urls[urlId].url;
|
||||
if (url.indexOf(':') == -1)
|
||||
url = 'http://' + url;
|
||||
|
||||
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}));
|
||||
this.actor.connect('motion-event', Lang.bind(this, function(actor, event) {
|
||||
if (!actor.visible || actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let urlId = this._findUrlAtPos(event);
|
||||
if (urlId != -1 && !this._cursorChanged) {
|
||||
global.screen.set_cursor(Meta.Cursor.POINTING_HAND);
|
||||
this._cursorChanged = true;
|
||||
} else if (urlId == -1) {
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
this._cursorChanged = false;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}));
|
||||
this.actor.connect('leave-event', Lang.bind(this, function() {
|
||||
if (!this.actor.visible || this.actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (this._cursorChanged) {
|
||||
this._cursorChanged = false;
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}));
|
||||
},
|
||||
|
||||
setMarkup: function(text, allowMarkup) {
|
||||
text = text ? _fixMarkup(text, allowMarkup) : '';
|
||||
this._text = text;
|
||||
|
||||
this.actor.clutter_text.set_markup(text);
|
||||
/* clutter_text.text contain text without markup */
|
||||
this._urls = Util.findUrls(this.actor.clutter_text.text);
|
||||
this._highlightUrls();
|
||||
},
|
||||
|
||||
_highlightUrls: function() {
|
||||
// text here contain markup
|
||||
let urls = Util.findUrls(this._text);
|
||||
let markup = '';
|
||||
let pos = 0;
|
||||
for (let i = 0; i < urls.length; i++) {
|
||||
let url = urls[i];
|
||||
let str = this._text.substr(pos, url.pos - pos);
|
||||
markup += str + '<span foreground="' + this._linkColor + '"><u>' + url.url + '</u></span>';
|
||||
pos = url.pos + url.url.length;
|
||||
}
|
||||
markup += this._text.substr(pos);
|
||||
this.actor.clutter_text.set_markup(markup);
|
||||
},
|
||||
|
||||
_findUrlAtPos: function(event) {
|
||||
let success;
|
||||
let [x, y] = event.get_coords();
|
||||
[success, x, y] = this.actor.transform_stage_point(x, y);
|
||||
let find_pos = -1;
|
||||
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
|
||||
let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
|
||||
if (py > y || py + line_height < y || x < px)
|
||||
continue;
|
||||
find_pos = i;
|
||||
}
|
||||
if (find_pos != -1) {
|
||||
for (let i = 0; i < this._urls.length; i++)
|
||||
if (find_pos >= this._urls[i].pos &&
|
||||
this._urls[i].pos + this._urls[i].url.length > find_pos)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
});
|
||||
|
||||
// Abstraction for an appointment/event in a calendar
|
||||
|
||||
const CalendarEvent = new Lang.Class({
|
||||
@ -345,7 +495,7 @@ const Calendar = new Lang.Class({
|
||||
|
||||
_init: function() {
|
||||
this._weekStart = Shell.util_get_week_start();
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.calendar' });
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.calendar' });
|
||||
|
||||
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
|
||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||
@ -394,7 +544,7 @@ const Calendar = new Lang.Class({
|
||||
|
||||
// Sets the calendar to show a specific date
|
||||
setDate: function(date) {
|
||||
if (sameDay(date, this._selectedDate))
|
||||
if (_sameDay(date, this._selectedDate))
|
||||
return;
|
||||
|
||||
this._selectedDate = date;
|
||||
@ -575,8 +725,7 @@ const Calendar = new Lang.Class({
|
||||
// nRows here means 6 weeks + one header + one navbar
|
||||
let nRows = 8;
|
||||
while (row < 8) {
|
||||
// xgettext:no-javascript-format
|
||||
let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")),
|
||||
let button = new St.Button({ label: iter.getDate().toString(),
|
||||
can_focus: true });
|
||||
let rtl = button.get_text_direction() == Clutter.TextDirection.RTL;
|
||||
|
||||
@ -607,7 +756,7 @@ const Calendar = new Lang.Class({
|
||||
if (leftMost)
|
||||
styleClass = 'calendar-day-left ' + styleClass;
|
||||
|
||||
if (sameDay(now, iter))
|
||||
if (_sameDay(now, iter))
|
||||
styleClass += ' calendar-today';
|
||||
else if (iter.getMonth() != this._selectedDate.getMonth())
|
||||
styleClass += ' calendar-other-month-day';
|
||||
@ -650,16 +799,16 @@ const Calendar = new Lang.Class({
|
||||
_update: function() {
|
||||
let now = new Date();
|
||||
|
||||
if (sameYear(this._selectedDate, now))
|
||||
if (_sameYear(this._selectedDate, now))
|
||||
this._monthLabel.text = this._selectedDate.toLocaleFormat(this._headerFormatWithoutYear);
|
||||
else
|
||||
this._monthLabel.text = this._selectedDate.toLocaleFormat(this._headerFormat);
|
||||
|
||||
if (!this._calendarBegin || !sameMonth(this._selectedDate, this._calendarBegin) || !sameDay(now, this._markedAsToday))
|
||||
if (!this._calendarBegin || !_sameMonth(this._selectedDate, this._calendarBegin) || !_sameDay(now, this._markedAsToday))
|
||||
this._rebuildCalendar();
|
||||
|
||||
this._buttons.forEach(Lang.bind(this, function(button) {
|
||||
if (sameDay(button._date, this._selectedDate)) {
|
||||
if (_sameDay(button._date, this._selectedDate)) {
|
||||
button.add_style_pseudo_class('active');
|
||||
if (this._shouldDateGrabFocus)
|
||||
button.grab_key_focus();
|
||||
@ -671,9 +820,353 @@ const Calendar = new Lang.Class({
|
||||
});
|
||||
Signals.addSignalMethods(Calendar.prototype);
|
||||
|
||||
const ScaleLayout = new Lang.Class({
|
||||
Name: 'ScaleLayout',
|
||||
Extends: Clutter.BinLayout,
|
||||
|
||||
_connectContainer: function(container) {
|
||||
if (this._container == container)
|
||||
return;
|
||||
|
||||
if (this._container)
|
||||
for (let id of this._signals)
|
||||
this._container.disconnect(id);
|
||||
|
||||
this._container = container;
|
||||
this._signals = [];
|
||||
|
||||
if (this._container)
|
||||
for (let signal of ['notify::scale-x', 'notify::scale-y']) {
|
||||
let id = this._container.connect(signal, Lang.bind(this,
|
||||
function() {
|
||||
this.layout_changed();
|
||||
}));
|
||||
this._signals.push(id);
|
||||
}
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
this._connectContainer(container);
|
||||
|
||||
let [min, nat] = this.parent(container, forHeight);
|
||||
return [Math.floor(min * container.scale_x),
|
||||
Math.floor(nat * container.scale_x)];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
this._connectContainer(container);
|
||||
|
||||
let [min, nat] = this.parent(container, forWidth);
|
||||
return [Math.floor(min * container.scale_y),
|
||||
Math.floor(nat * container.scale_y)];
|
||||
}
|
||||
});
|
||||
|
||||
const LabelExpanderLayout = new Lang.Class({
|
||||
Name: 'LabelExpanderLayout',
|
||||
Extends: Clutter.LayoutManager,
|
||||
Properties: { 'expansion': GObject.ParamSpec.double('expansion',
|
||||
'Expansion',
|
||||
'Expansion of the layout, between 0 (collapsed) ' +
|
||||
'and 1 (fully expanded',
|
||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||
0, 1, 0)},
|
||||
|
||||
_init: function(params) {
|
||||
this._expansion = 0;
|
||||
this._expandLines = DEFAULT_EXPAND_LINES;
|
||||
|
||||
this.parent(params);
|
||||
},
|
||||
|
||||
get expansion() {
|
||||
return this._expansion;
|
||||
},
|
||||
|
||||
set expansion(v) {
|
||||
if (v == this._expansion)
|
||||
return;
|
||||
this._expansion = v;
|
||||
this.notify('expansion');
|
||||
|
||||
let visibleIndex = this._expansion > 0 ? 1 : 0;
|
||||
for (let i = 0; this._container && i < this._container.get_n_children(); i++)
|
||||
this._container.get_child_at_index(i).visible = (i == visibleIndex);
|
||||
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
set expandLines(v) {
|
||||
if (v == this._expandLines)
|
||||
return;
|
||||
this._expandLines = v;
|
||||
if (this._expansion > 0)
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
vfunc_set_container: function(container) {
|
||||
this._container = container;
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
let [min, nat] = [0, 0];
|
||||
|
||||
for (let i = 0; i < container.get_n_children(); i++) {
|
||||
if (i > 1)
|
||||
break; // we support one unexpanded + one expanded child
|
||||
|
||||
let child = container.get_child_at_index(i);
|
||||
let [childMin, childNat] = child.get_preferred_width(forHeight);
|
||||
[min, nat] = [Math.max(min, childMin), Math.max(nat, childNat)];
|
||||
}
|
||||
|
||||
return [min, nat];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
let [min, nat] = [0, 0];
|
||||
|
||||
let children = container.get_children();
|
||||
if (children[0])
|
||||
[min, nat] = children[0].get_preferred_height(forWidth);
|
||||
|
||||
if (children[1]) {
|
||||
let [min2, nat2] = children[1].get_preferred_height(forWidth);
|
||||
let [expMin, expNat] = [Math.min(min2, min * this._expandLines),
|
||||
Math.min(nat2, nat * this._expandLines)];
|
||||
[min, nat] = [min + this._expansion * (expMin - min),
|
||||
nat + this._expansion * (expNat - nat)];
|
||||
}
|
||||
|
||||
return [min, nat];
|
||||
},
|
||||
|
||||
vfunc_allocate: function(container, box, flags) {
|
||||
for (let i = 0; i < container.get_n_children(); i++) {
|
||||
let child = container.get_child_at_index(i);
|
||||
|
||||
if (child.visible)
|
||||
child.allocate(box, flags);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
const Message = new Lang.Class({
|
||||
Name: 'Message',
|
||||
|
||||
_init: function(title, body) {
|
||||
this.expanded = false;
|
||||
|
||||
this.actor = new St.Button({ style_class: 'message',
|
||||
accessible_role: Atk.Role.NOTIFICATION,
|
||||
can_focus: true,
|
||||
x_expand: true, x_fill: true });
|
||||
this.actor.connect('key-press-event',
|
||||
Lang.bind(this, this._onKeyPressed));
|
||||
|
||||
let vbox = new St.BoxLayout({ vertical: true });
|
||||
this.actor.set_child(vbox);
|
||||
|
||||
let hbox = new St.BoxLayout();
|
||||
vbox.add_actor(hbox);
|
||||
|
||||
this._actionBin = new St.Widget({ layout_manager: new ScaleLayout(),
|
||||
visible: false });
|
||||
vbox.add_actor(this._actionBin);
|
||||
|
||||
this._iconBin = new St.Bin({ style_class: 'message-icon-bin',
|
||||
y_expand: true,
|
||||
visible: false });
|
||||
hbox.add_actor(this._iconBin);
|
||||
|
||||
let contentBox = new St.BoxLayout({ style_class: 'message-content',
|
||||
vertical: true, x_expand: true });
|
||||
hbox.add_actor(contentBox);
|
||||
|
||||
let titleBox = new St.BoxLayout();
|
||||
contentBox.add_actor(titleBox);
|
||||
|
||||
this.titleLabel = new St.Label({ style_class: 'message-title',
|
||||
x_expand: true,
|
||||
x_align: Clutter.ActorAlign.START });
|
||||
this.setTitle(title);
|
||||
titleBox.add_actor(this.titleLabel);
|
||||
|
||||
this._secondaryBin = new St.Bin({ style_class: 'message-secondary-bin' });
|
||||
titleBox.add_actor(this._secondaryBin);
|
||||
|
||||
let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic',
|
||||
icon_size: 16 });
|
||||
this._closeButton = new St.Button({ child: closeIcon, visible: false });
|
||||
titleBox.add_actor(this._closeButton);
|
||||
|
||||
this._bodyStack = new St.Widget({ x_expand: true });
|
||||
this._bodyStack.layout_manager = new LabelExpanderLayout();
|
||||
contentBox.add_actor(this._bodyStack);
|
||||
|
||||
this.bodyLabel = new URLHighlighter('', false, this._useBodyMarkup);
|
||||
this.bodyLabel.actor.add_style_class_name('message-body');
|
||||
this._bodyStack.add_actor(this.bodyLabel.actor);
|
||||
this.setBody(body);
|
||||
|
||||
this._closeButton.connect('clicked', Lang.bind(this, this.close));
|
||||
this.actor.connect('notify::hover', Lang.bind(this, this._sync));
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
this._sync();
|
||||
},
|
||||
|
||||
close: function() {
|
||||
this.emit('close');
|
||||
},
|
||||
|
||||
setIcon: function(actor) {
|
||||
this._iconBin.child = actor;
|
||||
this._iconBin.visible = (actor != null);
|
||||
},
|
||||
|
||||
setSecondaryActor: function(actor) {
|
||||
this._secondaryBin.child = actor;
|
||||
},
|
||||
|
||||
setTitle: function(text) {
|
||||
let title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : '';
|
||||
this.titleLabel.clutter_text.set_markup(title);
|
||||
},
|
||||
|
||||
setBody: function(text) {
|
||||
this._bodyText = text;
|
||||
this.bodyLabel.setMarkup(text ? text.replace(/\n/g, ' ') : '',
|
||||
this._useBodyMarkup);
|
||||
if (this._expandedLabel)
|
||||
this._expandedLabel.setMarkup(text, this._useBodyMarkup);
|
||||
},
|
||||
|
||||
setUseBodyMarkup: function(enable) {
|
||||
if (this._useBodyMarkup === enable)
|
||||
return;
|
||||
this._useBodyMarkup = enable;
|
||||
if (this.bodyLabel)
|
||||
this.setBody(this._bodyText);
|
||||
},
|
||||
|
||||
setActionArea: function(actor) {
|
||||
if (actor == null) {
|
||||
if (this._actionBin.get_n_children() > 0)
|
||||
this._actionBin.get_child_at_index(0).destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._actionBin.get_n_children() > 0)
|
||||
throw new Error('Message already has an action area');
|
||||
|
||||
this._actionBin.add_actor(actor);
|
||||
this._actionBin.visible = this.expanded;
|
||||
},
|
||||
|
||||
setExpandedBody: function(actor) {
|
||||
if (actor == null) {
|
||||
if (this._bodyStack.get_n_children() > 1)
|
||||
this._bodyStack.get_child_at_index(1).destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._bodyStack.get_n_children() > 1)
|
||||
throw new Error('Message already has an expanded body actor');
|
||||
|
||||
this._bodyStack.insert_child_at_index(actor, 1);
|
||||
},
|
||||
|
||||
setExpandedLines: function(nLines) {
|
||||
this._bodyStack.layout_manager.expandLines = nLines;
|
||||
},
|
||||
|
||||
expand: function(animate) {
|
||||
this.expanded = true;
|
||||
|
||||
this._actionBin.visible = (this._actionBin.get_n_children() > 0);
|
||||
|
||||
if (this._bodyStack.get_n_children() < 2) {
|
||||
this._expandedLabel = new URLHighlighter(this._bodyText,
|
||||
true, this._useBodyMarkup);
|
||||
this.setExpandedBody(this._expandedLabel.actor);
|
||||
}
|
||||
|
||||
if (animate) {
|
||||
Tweener.addTween(this._bodyStack.layout_manager,
|
||||
{ expansion: 1,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
this._actionBin.scale_y = 0;
|
||||
Tweener.addTween(this._actionBin,
|
||||
{ scale_y: 1,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
} else {
|
||||
this._bodyStack.layout_manager.expansion = 1;
|
||||
this._actionBin.scale_y = 1;
|
||||
}
|
||||
|
||||
this.emit('expanded');
|
||||
},
|
||||
|
||||
unexpand: function(animate) {
|
||||
if (animate) {
|
||||
Tweener.addTween(this._bodyStack.layout_manager,
|
||||
{ expansion: 0,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
Tweener.addTween(this._actionBin,
|
||||
{ scale_y: 0,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onCompleteScope: this,
|
||||
onComplete: function() {
|
||||
this._actionBin.hide();
|
||||
this.expanded = false;
|
||||
}});
|
||||
} else {
|
||||
this._bodyStack.layout_manager.expansion = 0;
|
||||
this._actionBin.scale_y = 0;
|
||||
this.expanded = false;
|
||||
}
|
||||
|
||||
this.emit('unexpanded');
|
||||
},
|
||||
|
||||
canClose: function() {
|
||||
return true;
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let hovered = this.actor.hover;
|
||||
this._closeButton.visible = hovered && this.canClose();
|
||||
this._secondaryBin.visible = !hovered;
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
},
|
||||
|
||||
_onKeyPressed: function(a, event) {
|
||||
let keysym = event.get_key_symbol();
|
||||
|
||||
if (keysym == Clutter.KEY_Delete ||
|
||||
keysym == Clutter.KEY_KP_Delete) {
|
||||
this.close();
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(Message.prototype);
|
||||
|
||||
const EventMessage = new Lang.Class({
|
||||
Name: 'EventMessage',
|
||||
Extends: MessageList.Message,
|
||||
Extends: Message,
|
||||
|
||||
_init: function(event, date) {
|
||||
this._event = event;
|
||||
@ -716,13 +1209,13 @@ const EventMessage = new Lang.Class({
|
||||
},
|
||||
|
||||
canClose: function() {
|
||||
return isToday(this._date);
|
||||
return _isToday(this._date);
|
||||
}
|
||||
});
|
||||
|
||||
const NotificationMessage = new Lang.Class({
|
||||
Name: 'NotificationMessage',
|
||||
Extends: MessageList.Message,
|
||||
Extends: Message,
|
||||
|
||||
_init: function(notification) {
|
||||
this.notification = notification;
|
||||
@ -737,7 +1230,7 @@ const NotificationMessage = new Lang.Class({
|
||||
this._closed = true;
|
||||
this.notification.destroy(MessageTray.NotificationDestroyedReason.DISMISSED);
|
||||
}));
|
||||
this._destroyId = notification.connect('destroy', Lang.bind(this,
|
||||
notification.connect('destroy', Lang.bind(this,
|
||||
function() {
|
||||
if (!this._closed)
|
||||
this.close();
|
||||
@ -769,16 +1262,220 @@ const NotificationMessage = new Lang.Class({
|
||||
if (this._updatedId)
|
||||
this.notification.disconnect(this._updatedId);
|
||||
this._updatedId = 0;
|
||||
|
||||
if (this._destroyId)
|
||||
this.notification.disconnect(this._destroyId);
|
||||
this._destroyId = 0;
|
||||
}
|
||||
});
|
||||
|
||||
const MessageListSection = new Lang.Class({
|
||||
Name: 'MessageListSection',
|
||||
|
||||
_init: function(title) {
|
||||
this.actor = new St.BoxLayout({ style_class: 'message-list-section',
|
||||
clip_to_allocation: true,
|
||||
x_expand: true, vertical: true });
|
||||
let titleBox = new St.BoxLayout({ style_class: 'message-list-section-title-box' });
|
||||
this.actor.add_actor(titleBox);
|
||||
|
||||
this._title = new St.Button({ style_class: 'message-list-section-title',
|
||||
label: title,
|
||||
can_focus: true,
|
||||
x_expand: true,
|
||||
x_align: St.Align.START });
|
||||
titleBox.add_actor(this._title);
|
||||
|
||||
this._title.connect('clicked', Lang.bind(this, this._onTitleClicked));
|
||||
this._title.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
|
||||
|
||||
let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic' });
|
||||
this._closeButton = new St.Button({ style_class: 'message-list-section-close',
|
||||
child: closeIcon,
|
||||
accessible_name: _("Clear section"),
|
||||
can_focus: true });
|
||||
this._closeButton.set_x_align(Clutter.ActorAlign.END);
|
||||
titleBox.add_actor(this._closeButton);
|
||||
|
||||
this._closeButton.connect('clicked', Lang.bind(this, this.clear));
|
||||
|
||||
this._list = new St.BoxLayout({ style_class: 'message-list-section-list',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._list);
|
||||
|
||||
this._list.connect('actor-added', Lang.bind(this, this._sync));
|
||||
this._list.connect('actor-removed', Lang.bind(this, this._sync));
|
||||
|
||||
let id = Main.sessionMode.connect('updated',
|
||||
Lang.bind(this, this._sync));
|
||||
this.actor.connect('destroy', function() {
|
||||
Main.sessionMode.disconnect(id);
|
||||
});
|
||||
|
||||
this._messages = new Map();
|
||||
this._date = new Date();
|
||||
this.empty = true;
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_onTitleClicked: function() {
|
||||
Main.overview.hide();
|
||||
Main.panel.closeCalendar();
|
||||
},
|
||||
|
||||
_onKeyFocusIn: function(actor) {
|
||||
this.emit('key-focus-in', actor);
|
||||
},
|
||||
|
||||
get allowed() {
|
||||
return true;
|
||||
},
|
||||
|
||||
setDate: function(date) {
|
||||
if (_sameDay(date, this._date))
|
||||
return;
|
||||
this._date = date;
|
||||
this._sync();
|
||||
},
|
||||
|
||||
addMessage: function(message, animate) {
|
||||
this.addMessageAtIndex(message, -1, animate);
|
||||
},
|
||||
|
||||
addMessageAtIndex: function(message, index, animate) {
|
||||
let obj = {
|
||||
container: null,
|
||||
destroyId: 0,
|
||||
keyFocusId: 0,
|
||||
closeId: 0
|
||||
};
|
||||
let pivot = new Clutter.Point({ x: .5, y: .5 });
|
||||
let scale = animate ? 0 : 1;
|
||||
obj.container = new St.Widget({ layout_manager: new ScaleLayout(),
|
||||
pivot_point: pivot,
|
||||
scale_x: scale, scale_y: scale });
|
||||
obj.keyFocusId = message.actor.connect('key-focus-in',
|
||||
Lang.bind(this, this._onKeyFocusIn));
|
||||
obj.destroyId = message.actor.connect('destroy',
|
||||
Lang.bind(this, function() {
|
||||
this.removeMessage(message, false);
|
||||
}));
|
||||
obj.closeId = message.connect('close',
|
||||
Lang.bind(this, function() {
|
||||
this.removeMessage(message, true);
|
||||
}));
|
||||
|
||||
this._messages.set(message, obj);
|
||||
obj.container.add_actor(message.actor);
|
||||
|
||||
this._list.insert_child_at_index(obj.container, index);
|
||||
|
||||
if (animate)
|
||||
Tweener.addTween(obj.container, { scale_x: 1,
|
||||
scale_y: 1,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
},
|
||||
|
||||
moveMessage: function(message, index, animate) {
|
||||
let obj = this._messages.get(message);
|
||||
|
||||
if (!animate) {
|
||||
this._list.set_child_at_index(obj.container, index);
|
||||
return;
|
||||
}
|
||||
|
||||
let onComplete = Lang.bind(this, function() {
|
||||
this._list.set_child_at_index(obj.container, index);
|
||||
Tweener.addTween(obj.container, { scale_x: 1,
|
||||
scale_y: 1,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
});
|
||||
Tweener.addTween(obj.container, { scale_x: 0,
|
||||
scale_y: 0,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: onComplete });
|
||||
},
|
||||
|
||||
removeMessage: function(message, animate) {
|
||||
let obj = this._messages.get(message);
|
||||
|
||||
message.actor.disconnect(obj.destroyId);
|
||||
message.actor.disconnect(obj.keyFocusId);
|
||||
message.disconnect(obj.closeId);
|
||||
|
||||
this._messages.delete(message);
|
||||
|
||||
if (animate) {
|
||||
Tweener.addTween(obj.container, { scale_x: 0, scale_y: 0,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
obj.container.destroy();
|
||||
global.sync_pointer();
|
||||
}});
|
||||
} else {
|
||||
obj.container.destroy();
|
||||
global.sync_pointer();
|
||||
}
|
||||
},
|
||||
|
||||
clear: function() {
|
||||
let messages = [...this._messages.keys()].filter(function(message) {
|
||||
return message.canClose();
|
||||
});
|
||||
|
||||
// If there are few messages, letting them all zoom out looks OK
|
||||
if (messages.length < 2) {
|
||||
messages.forEach(function(message) {
|
||||
message.close();
|
||||
});
|
||||
} else {
|
||||
// Otherwise we slide them out one by one, and then zoom them
|
||||
// out "off-screen" in the end to smoothly shrink the parent
|
||||
let delay = MESSAGE_ANIMATION_TIME / Math.max(messages.length, 5);
|
||||
for (let i = 0; i < messages.length; i++) {
|
||||
let message = messages[i];
|
||||
let obj = this._messages.get(message);
|
||||
Tweener.addTween(obj.container,
|
||||
{ anchor_x: this._list.width,
|
||||
opacity: 0,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
delay: i * delay,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
message.close();
|
||||
}});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_canClear: function() {
|
||||
for (let message of this._messages.keys())
|
||||
if (message.canClose())
|
||||
return true;
|
||||
return false;
|
||||
},
|
||||
|
||||
_shouldShow: function() {
|
||||
return !this.empty;
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let empty = this._list.get_n_children() == 0;
|
||||
let changed = this.empty !== empty;
|
||||
this.empty = empty;
|
||||
|
||||
if (changed)
|
||||
this.emit('empty-changed');
|
||||
|
||||
this._closeButton.visible = this._canClear();
|
||||
this.actor.visible = this.allowed && this._shouldShow();
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(MessageListSection.prototype);
|
||||
|
||||
const EventsSection = new Lang.Class({
|
||||
Name: 'EventsSection',
|
||||
Extends: MessageList.MessageListSection,
|
||||
Extends: MessageListSection,
|
||||
|
||||
_init: function() {
|
||||
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
@ -817,14 +1514,14 @@ const EventsSection = new Lang.Class({
|
||||
},
|
||||
|
||||
_updateTitle: function() {
|
||||
if (isToday(this._date)) {
|
||||
if (_isToday(this._date)) {
|
||||
this._title.label = _("Events");
|
||||
return;
|
||||
}
|
||||
|
||||
let dayFormat;
|
||||
let now = new Date();
|
||||
if (sameYear(this._date, now))
|
||||
if (_sameYear(this._date, now))
|
||||
/* Translators: Shown on calendar heading when selected day occurs on current year */
|
||||
dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
|
||||
"%A, %B %d"));
|
||||
@ -900,7 +1597,7 @@ const EventsSection = new Lang.Class({
|
||||
},
|
||||
|
||||
_shouldShow: function() {
|
||||
return !this.empty || !isToday(this._date);
|
||||
return !this.empty || !_isToday(this._date);
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
@ -913,7 +1610,7 @@ const EventsSection = new Lang.Class({
|
||||
|
||||
const NotificationSection = new Lang.Class({
|
||||
Name: 'NotificationSection',
|
||||
Extends: MessageList.MessageListSection,
|
||||
Extends: MessageListSection,
|
||||
|
||||
_init: function() {
|
||||
this.parent(_("Notifications"));
|
||||
@ -1019,7 +1716,7 @@ const NotificationSection = new Lang.Class({
|
||||
},
|
||||
|
||||
_shouldShow: function() {
|
||||
return !this.empty && isToday(this._date);
|
||||
return !this.empty && _isToday(this._date);
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
@ -1052,20 +1749,20 @@ const Placeholder = new Lang.Class({
|
||||
},
|
||||
|
||||
setDate: function(date) {
|
||||
if (sameDay(this._date, date))
|
||||
if (_sameDay(this._date, date))
|
||||
return;
|
||||
this._date = date;
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let today = isToday(this._date);
|
||||
if (today && this._icon.gicon == this._todayIcon)
|
||||
let isToday = _isToday(this._date);
|
||||
if (isToday && this._icon.gicon == this._todayIcon)
|
||||
return;
|
||||
if (!today && this._icon.gicon == this._otherIcon)
|
||||
if (!isToday && this._icon.gicon == this._otherIcon)
|
||||
return;
|
||||
|
||||
if (today) {
|
||||
if (isToday) {
|
||||
this._icon.gicon = this._todayIcon;
|
||||
this._label.text = _("No Notifications");
|
||||
} else {
|
||||
@ -1075,8 +1772,8 @@ const Placeholder = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const CalendarMessageList = new Lang.Class({
|
||||
Name: 'CalendarMessageList',
|
||||
const MessageList = new Lang.Class({
|
||||
Name: 'MessageList',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.Widget({ style_class: 'message-list',
|
||||
@ -1100,9 +1797,6 @@ const CalendarMessageList = new Lang.Class({
|
||||
this._scrollView.add_actor(this._sectionList);
|
||||
this._sections = new Map();
|
||||
|
||||
this._mediaSection = new Mpris.MediaSection();
|
||||
this._addSection(this._mediaSection);
|
||||
|
||||
this._notificationSection = new NotificationSection();
|
||||
this._addSection(this._notificationSection);
|
||||
|
||||
|
@ -313,10 +313,6 @@ const AutorunSource = new Lang.Class({
|
||||
|
||||
getIcon: function() {
|
||||
return this.mount.get_icon();
|
||||
},
|
||||
|
||||
_createPolicy: function() {
|
||||
return new MessageTray.NotificationApplicationPolicy('org.gnome.Nautilus');
|
||||
}
|
||||
});
|
||||
|
||||
@ -329,6 +325,9 @@ const AutorunNotification = new Lang.Class({
|
||||
|
||||
this._manager = manager;
|
||||
this._mount = source.mount;
|
||||
|
||||
// set the notification to urgent, so that it expands out
|
||||
this.setUrgency(MessageTray.Urgency.CRITICAL);
|
||||
},
|
||||
|
||||
createBanner: function() {
|
||||
|
@ -12,9 +12,9 @@ const St = imports.gi.St;
|
||||
const Tpl = imports.gi.TelepathyLogger;
|
||||
const Tp = imports.gi.TelepathyGLib;
|
||||
|
||||
const Calendar = imports.ui.calendar;
|
||||
const History = imports.misc.history;
|
||||
const Main = imports.ui.main;
|
||||
const MessageList = imports.ui.messageList;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const Params = imports.misc.params;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
@ -469,7 +469,6 @@ const ChatSource = new Lang.Class({
|
||||
|
||||
destroy: function(reason) {
|
||||
if (this._client.is_handling_channel(this._channel)) {
|
||||
this._ackMessages();
|
||||
// The chat box has been destroyed so it can't
|
||||
// handle the channel any more.
|
||||
this._channel.close_async(function(channel, result) {
|
||||
@ -867,7 +866,7 @@ const ChatNotificationBanner = new Lang.Class({
|
||||
},
|
||||
|
||||
_addMessage: function(message) {
|
||||
let highlighter = new MessageList.URLHighlighter(message.body, true, true);
|
||||
let highlighter = new Calendar.URLHighlighter(message.body, true, true);
|
||||
let body = highlighter.actor;
|
||||
|
||||
let styles = message.styles;
|
||||
|
@ -259,7 +259,7 @@ const ShowAppsIcon = new Lang.Class({
|
||||
},
|
||||
|
||||
_createIcon: function(size) {
|
||||
this._iconActor = new St.Icon({ icon_name: 'view-app-grid-symbolic',
|
||||
this._iconActor = new St.Icon({ icon_name: 'view-grid-symbolic',
|
||||
icon_size: size,
|
||||
style_class: 'show-apps-icon',
|
||||
track_hover: true });
|
||||
@ -644,14 +644,15 @@ const Dash = new Lang.Class({
|
||||
let firstIcon = firstButton._delegate.icon;
|
||||
|
||||
let minHeight, natHeight;
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
|
||||
// Enforce the current icon size during the size request
|
||||
firstIcon.icon.ensure_style();
|
||||
let [currentWidth, currentHeight] = firstIcon.icon.get_size();
|
||||
firstIcon.icon.set_size(this.iconSize * scaleFactor, this.iconSize * scaleFactor);
|
||||
firstIcon.setIconSize(this.iconSize);
|
||||
[minHeight, natHeight] = firstButton.get_preferred_height(-1);
|
||||
firstIcon.icon.set_size(currentWidth, currentHeight);
|
||||
|
||||
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||
let iconSizes = baseIconSizes.map(function(s) {
|
||||
return s * scaleFactor;
|
||||
});
|
||||
|
||||
// Subtract icon padding and box spacing from the available height
|
||||
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
|
||||
@ -659,10 +660,6 @@ const Dash = new Lang.Class({
|
||||
|
||||
let availSize = availHeight / iconChildren.length;
|
||||
|
||||
let iconSizes = baseIconSizes.map(function(s) {
|
||||
return s * scaleFactor;
|
||||
});
|
||||
|
||||
let newIconSize = baseIconSizes[0];
|
||||
for (let i = 0; i < iconSizes.length; i++) {
|
||||
if (iconSizes[i] < availSize)
|
||||
|
@ -360,7 +360,7 @@ const DateMenuButton = new Lang.Class({
|
||||
}));
|
||||
|
||||
// Fill up the first column
|
||||
this._messageList = new Calendar.CalendarMessageList();
|
||||
this._messageList = new Calendar.MessageList();
|
||||
hbox.add(this._messageList.actor, { expand: true, y_fill: false, y_align: St.Align.START });
|
||||
|
||||
// Fill up the second column
|
||||
|
141
js/ui/dnd.js
141
js/ui/dnd.js
@ -79,12 +79,9 @@ const _Draggable = new Lang.Class({
|
||||
dragActorOpacity: undefined });
|
||||
|
||||
this.actor = actor;
|
||||
if (!params.manualMode) {
|
||||
if (!params.manualMode)
|
||||
this.actor.connect('button-press-event',
|
||||
Lang.bind(this, this._onButtonPress));
|
||||
this.actor.connect('touch-event',
|
||||
Lang.bind(this, this._onTouchEvent));
|
||||
}
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, function() {
|
||||
this._actorDestroyed = true;
|
||||
@ -124,50 +121,8 @@ const _Draggable = new Lang.Class({
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_onTouchEvent: function (actor, event) {
|
||||
if (event.type() != Clutter.EventType.TOUCH_BEGIN ||
|
||||
!global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (Tweener.getTweenCount(actor))
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
this._touchSequence = event.get_event_sequence();
|
||||
|
||||
this._buttonDown = true;
|
||||
this._grabActor();
|
||||
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._dragStartX = stageX;
|
||||
this._dragStartY = stageY;
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_grabDevice: function(actor) {
|
||||
let manager = Clutter.DeviceManager.get_default();
|
||||
let pointer = manager.get_core_device(Clutter.InputDeviceType.POINTER_DEVICE);
|
||||
|
||||
if (pointer && this._touchSequence)
|
||||
pointer.sequence_grab(this._touchSequence, actor);
|
||||
else if (pointer)
|
||||
pointer.grab (actor);
|
||||
|
||||
this._grabbedDevice = pointer;
|
||||
},
|
||||
|
||||
_ungrabDevice: function() {
|
||||
if (this._touchSequence)
|
||||
this._grabbedDevice.sequence_ungrab (this._touchSequence);
|
||||
else
|
||||
this._grabbedDevice.ungrab();
|
||||
|
||||
this._touchSequence = null;
|
||||
this._grabbedDevice = null;
|
||||
},
|
||||
|
||||
_grabActor: function() {
|
||||
this._grabDevice(this.actor);
|
||||
Clutter.grab_pointer(this.actor);
|
||||
this._onEventId = this.actor.connect('event',
|
||||
Lang.bind(this, this._onEvent));
|
||||
},
|
||||
@ -176,7 +131,7 @@ const _Draggable = new Lang.Class({
|
||||
if (!this._onEventId)
|
||||
return;
|
||||
|
||||
this._ungrabDevice();
|
||||
Clutter.ungrab_pointer();
|
||||
this.actor.disconnect(this._onEventId);
|
||||
this._onEventId = null;
|
||||
},
|
||||
@ -185,13 +140,13 @@ const _Draggable = new Lang.Class({
|
||||
if (!this._eventsGrabbed) {
|
||||
this._eventsGrabbed = Main.pushModal(_getEventHandlerActor());
|
||||
if (this._eventsGrabbed)
|
||||
this._grabDevice(_getEventHandlerActor());
|
||||
Clutter.grab_pointer(_getEventHandlerActor());
|
||||
}
|
||||
},
|
||||
|
||||
_ungrabEvents: function() {
|
||||
if (this._eventsGrabbed) {
|
||||
this._ungrabDevice();
|
||||
Clutter.ungrab_pointer();
|
||||
Main.popModal(_getEventHandlerActor());
|
||||
this._eventsGrabbed = false;
|
||||
}
|
||||
@ -202,9 +157,7 @@ const _Draggable = new Lang.Class({
|
||||
// didn't start the drag, to drop the draggable in case the drag was in progress, and
|
||||
// to complete the drag and ensure that whatever happens to be under the pointer does
|
||||
// not get triggered if the drag was cancelled with Esc.
|
||||
if (event.type() == Clutter.EventType.BUTTON_RELEASE ||
|
||||
(event.type() == Clutter.EventType.TOUCH_END &&
|
||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) {
|
||||
if (event.type() == Clutter.EventType.BUTTON_RELEASE) {
|
||||
this._buttonDown = false;
|
||||
if (this._dragInProgress) {
|
||||
return this._dragActorDropped(event);
|
||||
@ -219,9 +172,7 @@ const _Draggable = new Lang.Class({
|
||||
}
|
||||
// We intercept MOTION event to figure out if the drag has started and to draw
|
||||
// this._dragActor under the pointer when dragging is in progress
|
||||
} else if (event.type() == Clutter.EventType.MOTION ||
|
||||
(event.type() == Clutter.EventType.TOUCH_UPDATE &&
|
||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) {
|
||||
} else if (event.type() == Clutter.EventType.MOTION) {
|
||||
if (this._dragInProgress) {
|
||||
return this._updateDragPosition(event);
|
||||
} else if (this._dragActor == null) {
|
||||
@ -263,7 +214,7 @@ const _Draggable = new Lang.Class({
|
||||
* This function is useful to call if you've specified manualMode
|
||||
* for the draggable.
|
||||
*/
|
||||
startDrag: function (stageX, stageY, time, sequence) {
|
||||
startDrag: function (stageX, stageY, time) {
|
||||
currentDraggable = this;
|
||||
this._dragInProgress = true;
|
||||
|
||||
@ -277,8 +228,6 @@ const _Draggable = new Lang.Class({
|
||||
this.emit('drag-begin', time);
|
||||
if (this._onEventId)
|
||||
this._ungrabActor();
|
||||
|
||||
this._touchSequence = sequence;
|
||||
this._grabEvents();
|
||||
global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
|
||||
|
||||
@ -389,8 +338,8 @@ const _Draggable = new Lang.Class({
|
||||
let threshold = Gtk.Settings.get_default().gtk_dnd_drag_threshold;
|
||||
if ((Math.abs(stageX - this._dragStartX) > threshold ||
|
||||
Math.abs(stageY - this._dragStartY) > threshold)) {
|
||||
this.startDrag(stageX, stageY, event.get_time(), this._touchSequence);
|
||||
this._updateDragPosition(event);
|
||||
this.startDrag(stageX, stageY, event.get_time());
|
||||
this._updateDragPosition(event);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -571,13 +520,20 @@ const _Draggable = new Lang.Class({
|
||||
return;
|
||||
}
|
||||
|
||||
this._animateDragEnd(eventTime,
|
||||
{ x: snapBackX,
|
||||
y: snapBackY,
|
||||
scale_x: snapBackScale,
|
||||
scale_y: snapBackScale,
|
||||
time: SNAP_BACK_ANIMATION_TIME,
|
||||
});
|
||||
this._animationInProgress = true;
|
||||
// No target, so snap back
|
||||
Tweener.addTween(this._dragActor,
|
||||
{ x: snapBackX,
|
||||
y: snapBackY,
|
||||
scale_x: snapBackScale,
|
||||
scale_y: snapBackScale,
|
||||
opacity: this._dragOrigOpacity,
|
||||
time: SNAP_BACK_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._onAnimationComplete,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [this._dragActor, eventTime]
|
||||
});
|
||||
},
|
||||
|
||||
_restoreDragActor: function(eventTime) {
|
||||
@ -589,44 +545,18 @@ const _Draggable = new Lang.Class({
|
||||
this._dragActor.set_scale(restoreScale, restoreScale);
|
||||
this._dragActor.opacity = 0;
|
||||
|
||||
this._animateDragEnd(eventTime,
|
||||
{ time: REVERT_ANIMATION_TIME });
|
||||
},
|
||||
|
||||
_animateDragEnd: function (eventTime, params) {
|
||||
this._animationInProgress = true;
|
||||
|
||||
// finish animation if the actor gets destroyed
|
||||
// during it
|
||||
this._dragActorDestroyId =
|
||||
this._dragActor.connect('destroy',
|
||||
Lang.bind(this, this._finishAnimation));
|
||||
|
||||
params['opacity'] = this._dragOrigOpacity;
|
||||
params['transition'] = 'easeOutQuad';
|
||||
params['onComplete'] = this._onAnimationComplete;
|
||||
params['onCompleteScope'] = this;
|
||||
params['onCompleteParams'] = [this._dragActor, eventTime];
|
||||
|
||||
// start the animation
|
||||
Tweener.addTween(this._dragActor, params)
|
||||
},
|
||||
|
||||
_finishAnimation : function () {
|
||||
if (!this._animationInProgress)
|
||||
return
|
||||
|
||||
this._animationInProgress = false;
|
||||
if (!this._buttonDown)
|
||||
this._dragComplete();
|
||||
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
Tweener.addTween(this._dragActor,
|
||||
{ opacity: this._dragOrigOpacity,
|
||||
time: REVERT_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._onAnimationComplete,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [this._dragActor, eventTime]
|
||||
});
|
||||
},
|
||||
|
||||
_onAnimationComplete : function (dragActor, eventTime) {
|
||||
dragActor.disconnect(this._dragActorDestroyId);
|
||||
this._dragActorDestroyId = 0;
|
||||
|
||||
if (this._dragOrigParent) {
|
||||
Main.uiGroup.remove_child(this._dragActor);
|
||||
this._dragOrigParent.add_actor(this._dragActor);
|
||||
@ -635,9 +565,12 @@ const _Draggable = new Lang.Class({
|
||||
} else {
|
||||
dragActor.destroy();
|
||||
}
|
||||
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
this.emit('drag-end', eventTime, false);
|
||||
this._finishAnimation();
|
||||
|
||||
this._animationInProgress = false;
|
||||
if (!this._buttonDown)
|
||||
this._dragComplete();
|
||||
},
|
||||
|
||||
_dragComplete: function() {
|
||||
|
@ -334,7 +334,7 @@ function _sessionUpdated() {
|
||||
// from allowExtensions in the future
|
||||
if (Main.sessionMode.allowExtensions) {
|
||||
if (initted)
|
||||
enabledExtensions = getEnabledExtensions();
|
||||
onEnabledExtensionsChanged();
|
||||
enableAllExtensions();
|
||||
} else {
|
||||
disableAllExtensions();
|
||||
|
@ -158,22 +158,10 @@ const CandidatePopup = new Lang.Class({
|
||||
|
||||
panelService.connect('set-cursor-location',
|
||||
Lang.bind(this, function(ps, x, y, w, h) {
|
||||
this._setDummyCursorGeometry(x, y, w, h);
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
}));
|
||||
try {
|
||||
panelService.connect('set-cursor-location-relative',
|
||||
Lang.bind(this, function(ps, x, y, w, h) {
|
||||
if (!global.display.focus_window)
|
||||
return;
|
||||
let window = global.display.focus_window.get_compositor_private();
|
||||
this._setDummyCursorGeometry(window.x + x, window.y + y, w, h);
|
||||
}));
|
||||
} catch(e) {
|
||||
// Only recent IBus versions have support for this signal
|
||||
// which is used for wayland clients. In order to work
|
||||
// with older IBus versions we can silently ignore the
|
||||
// signal's absence.
|
||||
}
|
||||
panelService.connect('update-preedit-text',
|
||||
Lang.bind(this, function(ps, text, cursorPosition, visible) {
|
||||
this._preeditText.visible = visible;
|
||||
@ -258,12 +246,6 @@ const CandidatePopup = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
_setDummyCursorGeometry: function(x, y, w, h) {
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
},
|
||||
|
||||
_updateVisibility: function() {
|
||||
let isVisible = (this._preeditText.visible ||
|
||||
this._auxText.visible ||
|
||||
|
@ -50,14 +50,15 @@ const LegacyTray = new Lang.Class({
|
||||
this._slideLayout.translationX = 0;
|
||||
this._slideLayout.slideDirection = OverviewControls.SlideDirection.LEFT;
|
||||
|
||||
this._slider = new St.Widget({ x_expand: true, y_expand: true,
|
||||
this._slider = new St.Widget({ style_class: 'legacy-tray',
|
||||
x_expand: true, y_expand: true,
|
||||
x_align: Clutter.ActorAlign.START,
|
||||
y_align: Clutter.ActorAlign.END,
|
||||
layout_manager: this._slideLayout });
|
||||
this.actor.add_actor(this._slider);
|
||||
this._slider.connect('notify::allocation', Lang.bind(this, this._syncBarrier));
|
||||
|
||||
this._box = new St.BoxLayout({ style_class: 'legacy-tray' });
|
||||
this._box = new St.BoxLayout();
|
||||
this._slider.add_actor(this._box);
|
||||
|
||||
this._concealHandle = new St.Button({ style_class: 'legacy-tray-handle',
|
||||
|
@ -11,7 +11,6 @@ const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
|
||||
const Components = imports.ui.components;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
const EndSessionDialog = imports.ui.endSessionDialog;
|
||||
@ -63,7 +62,6 @@ let ctrlAltTabManager = null;
|
||||
let osdWindowManager = null;
|
||||
let osdMonitorLabeler = null;
|
||||
let sessionMode = null;
|
||||
let shellAudioSelectionDBusService = null;
|
||||
let shellDBusService = null;
|
||||
let shellMountOpDBusService = null;
|
||||
let screenSaverDBus = null;
|
||||
@ -80,7 +78,6 @@ let _startDate;
|
||||
let _defaultCssStylesheet = null;
|
||||
let _cssStylesheet = null;
|
||||
let _a11ySettings = null;
|
||||
let _themeResource = null;
|
||||
|
||||
function _sessionUpdated() {
|
||||
if (sessionMode.isPrimary)
|
||||
@ -122,7 +119,6 @@ function start() {
|
||||
_loadDefaultStylesheet);
|
||||
_initializeUI();
|
||||
|
||||
shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
|
||||
shellDBusService = new ShellDBus.GnomeShell();
|
||||
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
||||
|
||||
@ -141,7 +137,9 @@ function _initializeUI() {
|
||||
Shell.WindowTracker.get_default();
|
||||
Shell.AppUsage.get_default();
|
||||
|
||||
reloadThemeResource();
|
||||
let resource = Gio.Resource.load(global.datadir + '/gnome-shell-theme.gresource');
|
||||
resource._register();
|
||||
|
||||
_loadDefaultStylesheet();
|
||||
|
||||
// Setup the stage hierarchy early
|
||||
@ -292,14 +290,6 @@ function setThemeStylesheet(cssStylesheet) {
|
||||
_cssStylesheet = cssStylesheet ? Gio.File.new_for_path(cssStylesheet) : null;
|
||||
}
|
||||
|
||||
function reloadThemeResource() {
|
||||
if (_themeResource)
|
||||
_themeResource._unregister();
|
||||
|
||||
_themeResource = Gio.Resource.load(global.datadir + '/gnome-shell-theme.gresource');
|
||||
_themeResource._register();
|
||||
}
|
||||
|
||||
/**
|
||||
* loadTheme:
|
||||
*
|
||||
|
@ -1,726 +0,0 @@
|
||||
const Atk = imports.gi.Atk;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Lang = imports.lang;
|
||||
const Main = imports.ui.main;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Calendar = imports.ui.calendar;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const Util = imports.misc.util;
|
||||
|
||||
const MESSAGE_ANIMATION_TIME = 0.1;
|
||||
|
||||
const DEFAULT_EXPAND_LINES = 6;
|
||||
|
||||
function _fixMarkup(text, allowMarkup) {
|
||||
if (allowMarkup) {
|
||||
// Support &, ", ', < and >, escape all other
|
||||
// occurrences of '&'.
|
||||
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&');
|
||||
|
||||
// Support <b>, <i>, and <u>, escape anything else
|
||||
// so it displays as raw markup.
|
||||
_text = _text.replace(/<(?!\/?[biu]>)/g, '<');
|
||||
|
||||
try {
|
||||
Pango.parse_markup(_text, -1, '');
|
||||
return _text;
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
// !allowMarkup, or invalid markup
|
||||
return GLib.markup_escape_text(text, -1);
|
||||
}
|
||||
|
||||
const URLHighlighter = new Lang.Class({
|
||||
Name: 'URLHighlighter',
|
||||
|
||||
_init: function(text, lineWrap, allowMarkup) {
|
||||
if (!text)
|
||||
text = '';
|
||||
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter',
|
||||
x_expand: true, x_align: Clutter.ActorAlign.START });
|
||||
this._linkColor = '#ccccff';
|
||||
this.actor.connect('style-changed', Lang.bind(this, function() {
|
||||
let [hasColor, color] = this.actor.get_theme_node().lookup_color('link-color', false);
|
||||
if (hasColor) {
|
||||
let linkColor = color.to_string().substr(0, 7);
|
||||
if (linkColor != this._linkColor) {
|
||||
this._linkColor = linkColor;
|
||||
this._highlightUrls();
|
||||
}
|
||||
}
|
||||
}));
|
||||
this.actor.clutter_text.line_wrap = lineWrap;
|
||||
this.actor.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
|
||||
|
||||
this.setMarkup(text, allowMarkup);
|
||||
this.actor.connect('button-press-event', Lang.bind(this, function(actor, event) {
|
||||
// Don't try to URL highlight when invisible.
|
||||
// The MessageTray doesn't actually hide us, so
|
||||
// we need to check for paint opacities as well.
|
||||
if (!actor.visible || actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
// Keep Notification.actor from seeing this and taking
|
||||
// a pointer grab, which would block our button-release-event
|
||||
// handler, if an URL is clicked
|
||||
return this._findUrlAtPos(event) != -1;
|
||||
}));
|
||||
this.actor.connect('button-release-event', Lang.bind(this, function (actor, event) {
|
||||
if (!actor.visible || actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let urlId = this._findUrlAtPos(event);
|
||||
if (urlId != -1) {
|
||||
let url = this._urls[urlId].url;
|
||||
if (url.indexOf(':') == -1)
|
||||
url = 'http://' + url;
|
||||
|
||||
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}));
|
||||
this.actor.connect('motion-event', Lang.bind(this, function(actor, event) {
|
||||
if (!actor.visible || actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
let urlId = this._findUrlAtPos(event);
|
||||
if (urlId != -1 && !this._cursorChanged) {
|
||||
global.screen.set_cursor(Meta.Cursor.POINTING_HAND);
|
||||
this._cursorChanged = true;
|
||||
} else if (urlId == -1) {
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
this._cursorChanged = false;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}));
|
||||
this.actor.connect('leave-event', Lang.bind(this, function() {
|
||||
if (!this.actor.visible || this.actor.get_paint_opacity() == 0)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (this._cursorChanged) {
|
||||
this._cursorChanged = false;
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}));
|
||||
},
|
||||
|
||||
setMarkup: function(text, allowMarkup) {
|
||||
text = text ? _fixMarkup(text, allowMarkup) : '';
|
||||
this._text = text;
|
||||
|
||||
this.actor.clutter_text.set_markup(text);
|
||||
/* clutter_text.text contain text without markup */
|
||||
this._urls = Util.findUrls(this.actor.clutter_text.text);
|
||||
this._highlightUrls();
|
||||
},
|
||||
|
||||
_highlightUrls: function() {
|
||||
// text here contain markup
|
||||
let urls = Util.findUrls(this._text);
|
||||
let markup = '';
|
||||
let pos = 0;
|
||||
for (let i = 0; i < urls.length; i++) {
|
||||
let url = urls[i];
|
||||
let str = this._text.substr(pos, url.pos - pos);
|
||||
markup += str + '<span foreground="' + this._linkColor + '"><u>' + url.url + '</u></span>';
|
||||
pos = url.pos + url.url.length;
|
||||
}
|
||||
markup += this._text.substr(pos);
|
||||
this.actor.clutter_text.set_markup(markup);
|
||||
},
|
||||
|
||||
_findUrlAtPos: function(event) {
|
||||
let success;
|
||||
let [x, y] = event.get_coords();
|
||||
[success, x, y] = this.actor.transform_stage_point(x, y);
|
||||
let find_pos = -1;
|
||||
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
|
||||
let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
|
||||
if (py > y || py + line_height < y || x < px)
|
||||
continue;
|
||||
find_pos = i;
|
||||
}
|
||||
if (find_pos != -1) {
|
||||
for (let i = 0; i < this._urls.length; i++)
|
||||
if (find_pos >= this._urls[i].pos &&
|
||||
this._urls[i].pos + this._urls[i].url.length > find_pos)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
});
|
||||
|
||||
const ScaleLayout = new Lang.Class({
|
||||
Name: 'ScaleLayout',
|
||||
Extends: Clutter.BinLayout,
|
||||
|
||||
_connectContainer: function(container) {
|
||||
if (this._container == container)
|
||||
return;
|
||||
|
||||
if (this._container)
|
||||
for (let id of this._signals)
|
||||
this._container.disconnect(id);
|
||||
|
||||
this._container = container;
|
||||
this._signals = [];
|
||||
|
||||
if (this._container)
|
||||
for (let signal of ['notify::scale-x', 'notify::scale-y']) {
|
||||
let id = this._container.connect(signal, Lang.bind(this,
|
||||
function() {
|
||||
this.layout_changed();
|
||||
}));
|
||||
this._signals.push(id);
|
||||
}
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
this._connectContainer(container);
|
||||
|
||||
let [min, nat] = this.parent(container, forHeight);
|
||||
return [Math.floor(min * container.scale_x),
|
||||
Math.floor(nat * container.scale_x)];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
this._connectContainer(container);
|
||||
|
||||
let [min, nat] = this.parent(container, forWidth);
|
||||
return [Math.floor(min * container.scale_y),
|
||||
Math.floor(nat * container.scale_y)];
|
||||
}
|
||||
});
|
||||
|
||||
const LabelExpanderLayout = new Lang.Class({
|
||||
Name: 'LabelExpanderLayout',
|
||||
Extends: Clutter.LayoutManager,
|
||||
Properties: { 'expansion': GObject.ParamSpec.double('expansion',
|
||||
'Expansion',
|
||||
'Expansion of the layout, between 0 (collapsed) ' +
|
||||
'and 1 (fully expanded',
|
||||
GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
|
||||
0, 1, 0)},
|
||||
|
||||
_init: function(params) {
|
||||
this._expansion = 0;
|
||||
this._expandLines = DEFAULT_EXPAND_LINES;
|
||||
|
||||
this.parent(params);
|
||||
},
|
||||
|
||||
get expansion() {
|
||||
return this._expansion;
|
||||
},
|
||||
|
||||
set expansion(v) {
|
||||
if (v == this._expansion)
|
||||
return;
|
||||
this._expansion = v;
|
||||
this.notify('expansion');
|
||||
|
||||
let visibleIndex = this._expansion > 0 ? 1 : 0;
|
||||
for (let i = 0; this._container && i < this._container.get_n_children(); i++)
|
||||
this._container.get_child_at_index(i).visible = (i == visibleIndex);
|
||||
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
set expandLines(v) {
|
||||
if (v == this._expandLines)
|
||||
return;
|
||||
this._expandLines = v;
|
||||
if (this._expansion > 0)
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
vfunc_set_container: function(container) {
|
||||
this._container = container;
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
let [min, nat] = [0, 0];
|
||||
|
||||
for (let i = 0; i < container.get_n_children(); i++) {
|
||||
if (i > 1)
|
||||
break; // we support one unexpanded + one expanded child
|
||||
|
||||
let child = container.get_child_at_index(i);
|
||||
let [childMin, childNat] = child.get_preferred_width(forHeight);
|
||||
[min, nat] = [Math.max(min, childMin), Math.max(nat, childNat)];
|
||||
}
|
||||
|
||||
return [min, nat];
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
let [min, nat] = [0, 0];
|
||||
|
||||
let children = container.get_children();
|
||||
if (children[0])
|
||||
[min, nat] = children[0].get_preferred_height(forWidth);
|
||||
|
||||
if (children[1]) {
|
||||
let [min2, nat2] = children[1].get_preferred_height(forWidth);
|
||||
let [expMin, expNat] = [Math.min(min2, min * this._expandLines),
|
||||
Math.min(nat2, nat * this._expandLines)];
|
||||
[min, nat] = [min + this._expansion * (expMin - min),
|
||||
nat + this._expansion * (expNat - nat)];
|
||||
}
|
||||
|
||||
return [min, nat];
|
||||
},
|
||||
|
||||
vfunc_allocate: function(container, box, flags) {
|
||||
for (let i = 0; i < container.get_n_children(); i++) {
|
||||
let child = container.get_child_at_index(i);
|
||||
|
||||
if (child.visible)
|
||||
child.allocate(box, flags);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
const Message = new Lang.Class({
|
||||
Name: 'Message',
|
||||
|
||||
_init: function(title, body) {
|
||||
this.expanded = false;
|
||||
|
||||
this.actor = new St.Button({ style_class: 'message',
|
||||
accessible_role: Atk.Role.NOTIFICATION,
|
||||
can_focus: true,
|
||||
x_expand: true, x_fill: true });
|
||||
this.actor.connect('key-press-event',
|
||||
Lang.bind(this, this._onKeyPressed));
|
||||
|
||||
let vbox = new St.BoxLayout({ vertical: true });
|
||||
this.actor.set_child(vbox);
|
||||
|
||||
let hbox = new St.BoxLayout();
|
||||
vbox.add_actor(hbox);
|
||||
|
||||
this._actionBin = new St.Widget({ layout_manager: new ScaleLayout(),
|
||||
visible: false });
|
||||
vbox.add_actor(this._actionBin);
|
||||
|
||||
this._iconBin = new St.Bin({ style_class: 'message-icon-bin',
|
||||
y_expand: true,
|
||||
visible: false });
|
||||
hbox.add_actor(this._iconBin);
|
||||
|
||||
let contentBox = new St.BoxLayout({ style_class: 'message-content',
|
||||
vertical: true, x_expand: true });
|
||||
hbox.add_actor(contentBox);
|
||||
|
||||
this._mediaControls = new St.BoxLayout();
|
||||
hbox.add_actor(this._mediaControls);
|
||||
|
||||
let titleBox = new St.BoxLayout();
|
||||
contentBox.add_actor(titleBox);
|
||||
|
||||
this.titleLabel = new St.Label({ style_class: 'message-title',
|
||||
x_expand: true,
|
||||
x_align: Clutter.ActorAlign.START });
|
||||
this.setTitle(title);
|
||||
titleBox.add_actor(this.titleLabel);
|
||||
|
||||
this._secondaryBin = new St.Bin({ style_class: 'message-secondary-bin' });
|
||||
titleBox.add_actor(this._secondaryBin);
|
||||
|
||||
let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic',
|
||||
icon_size: 16 });
|
||||
this._closeButton = new St.Button({ child: closeIcon, visible: false });
|
||||
titleBox.add_actor(this._closeButton);
|
||||
|
||||
this._bodyStack = new St.Widget({ x_expand: true });
|
||||
this._bodyStack.layout_manager = new LabelExpanderLayout();
|
||||
contentBox.add_actor(this._bodyStack);
|
||||
|
||||
this.bodyLabel = new URLHighlighter('', false, this._useBodyMarkup);
|
||||
this.bodyLabel.actor.add_style_class_name('message-body');
|
||||
this._bodyStack.add_actor(this.bodyLabel.actor);
|
||||
this.setBody(body);
|
||||
|
||||
this._closeButton.connect('clicked', Lang.bind(this, this.close));
|
||||
this.actor.connect('notify::hover', Lang.bind(this, this._sync));
|
||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
this._sync();
|
||||
},
|
||||
|
||||
close: function() {
|
||||
this.emit('close');
|
||||
},
|
||||
|
||||
setIcon: function(actor) {
|
||||
this._iconBin.child = actor;
|
||||
this._iconBin.visible = (actor != null);
|
||||
},
|
||||
|
||||
setSecondaryActor: function(actor) {
|
||||
this._secondaryBin.child = actor;
|
||||
},
|
||||
|
||||
setTitle: function(text) {
|
||||
let title = text ? _fixMarkup(text.replace(/\n/g, ' '), false) : '';
|
||||
this.titleLabel.clutter_text.set_markup(title);
|
||||
},
|
||||
|
||||
setBody: function(text) {
|
||||
this._bodyText = text;
|
||||
this.bodyLabel.setMarkup(text ? text.replace(/\n/g, ' ') : '',
|
||||
this._useBodyMarkup);
|
||||
if (this._expandedLabel)
|
||||
this._expandedLabel.setMarkup(text, this._useBodyMarkup);
|
||||
},
|
||||
|
||||
setUseBodyMarkup: function(enable) {
|
||||
if (this._useBodyMarkup === enable)
|
||||
return;
|
||||
this._useBodyMarkup = enable;
|
||||
if (this.bodyLabel)
|
||||
this.setBody(this._bodyText);
|
||||
},
|
||||
|
||||
setActionArea: function(actor) {
|
||||
if (actor == null) {
|
||||
if (this._actionBin.get_n_children() > 0)
|
||||
this._actionBin.get_child_at_index(0).destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._actionBin.get_n_children() > 0)
|
||||
throw new Error('Message already has an action area');
|
||||
|
||||
this._actionBin.add_actor(actor);
|
||||
this._actionBin.visible = this.expanded;
|
||||
},
|
||||
|
||||
addMediaControl: function(iconName, callback) {
|
||||
let icon = new St.Icon({ icon_name: iconName, icon_size: 16 });
|
||||
let button = new St.Button({ style_class: 'message-media-control',
|
||||
child: icon });
|
||||
button.connect('clicked', callback);
|
||||
this._mediaControls.add_actor(button);
|
||||
return button;
|
||||
},
|
||||
|
||||
setExpandedBody: function(actor) {
|
||||
if (actor == null) {
|
||||
if (this._bodyStack.get_n_children() > 1)
|
||||
this._bodyStack.get_child_at_index(1).destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._bodyStack.get_n_children() > 1)
|
||||
throw new Error('Message already has an expanded body actor');
|
||||
|
||||
this._bodyStack.insert_child_at_index(actor, 1);
|
||||
},
|
||||
|
||||
setExpandedLines: function(nLines) {
|
||||
this._bodyStack.layout_manager.expandLines = nLines;
|
||||
},
|
||||
|
||||
expand: function(animate) {
|
||||
this.expanded = true;
|
||||
|
||||
this._actionBin.visible = (this._actionBin.get_n_children() > 0);
|
||||
|
||||
if (this._bodyStack.get_n_children() < 2) {
|
||||
this._expandedLabel = new URLHighlighter(this._bodyText,
|
||||
true, this._useBodyMarkup);
|
||||
this.setExpandedBody(this._expandedLabel.actor);
|
||||
}
|
||||
|
||||
if (animate) {
|
||||
Tweener.addTween(this._bodyStack.layout_manager,
|
||||
{ expansion: 1,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
this._actionBin.scale_y = 0;
|
||||
Tweener.addTween(this._actionBin,
|
||||
{ scale_y: 1,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
} else {
|
||||
this._bodyStack.layout_manager.expansion = 1;
|
||||
this._actionBin.scale_y = 1;
|
||||
}
|
||||
|
||||
this.emit('expanded');
|
||||
},
|
||||
|
||||
unexpand: function(animate) {
|
||||
if (animate) {
|
||||
Tweener.addTween(this._bodyStack.layout_manager,
|
||||
{ expansion: 0,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
Tweener.addTween(this._actionBin,
|
||||
{ scale_y: 0,
|
||||
time: MessageTray.ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onCompleteScope: this,
|
||||
onComplete: function() {
|
||||
this._actionBin.hide();
|
||||
this.expanded = false;
|
||||
}});
|
||||
} else {
|
||||
this._bodyStack.layout_manager.expansion = 0;
|
||||
this._actionBin.scale_y = 0;
|
||||
this.expanded = false;
|
||||
}
|
||||
|
||||
this.emit('unexpanded');
|
||||
},
|
||||
|
||||
canClose: function() {
|
||||
return this._mediaControls.get_n_children() == 0;
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let hovered = this.actor.hover;
|
||||
this._closeButton.visible = hovered && this.canClose();
|
||||
this._secondaryBin.visible = !hovered;
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
},
|
||||
|
||||
_onKeyPressed: function(a, event) {
|
||||
let keysym = event.get_key_symbol();
|
||||
|
||||
if (keysym == Clutter.KEY_Delete ||
|
||||
keysym == Clutter.KEY_KP_Delete) {
|
||||
this.close();
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(Message.prototype);
|
||||
|
||||
const MessageListSection = new Lang.Class({
|
||||
Name: 'MessageListSection',
|
||||
|
||||
_init: function(title) {
|
||||
this.actor = new St.BoxLayout({ style_class: 'message-list-section',
|
||||
clip_to_allocation: true,
|
||||
x_expand: true, vertical: true });
|
||||
let titleBox = new St.BoxLayout({ style_class: 'message-list-section-title-box' });
|
||||
this.actor.add_actor(titleBox);
|
||||
|
||||
this._title = new St.Button({ style_class: 'message-list-section-title',
|
||||
label: title,
|
||||
can_focus: true,
|
||||
x_expand: true,
|
||||
x_align: St.Align.START });
|
||||
titleBox.add_actor(this._title);
|
||||
|
||||
this._title.connect('clicked', Lang.bind(this, this._onTitleClicked));
|
||||
this._title.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
|
||||
|
||||
let closeIcon = new St.Icon({ icon_name: 'window-close-symbolic' });
|
||||
this._closeButton = new St.Button({ style_class: 'message-list-section-close',
|
||||
child: closeIcon,
|
||||
accessible_name: _("Clear section"),
|
||||
can_focus: true });
|
||||
this._closeButton.set_x_align(Clutter.ActorAlign.END);
|
||||
titleBox.add_actor(this._closeButton);
|
||||
|
||||
this._closeButton.connect('clicked', Lang.bind(this, this.clear));
|
||||
|
||||
this._list = new St.BoxLayout({ style_class: 'message-list-section-list',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._list);
|
||||
|
||||
this._list.connect('actor-added', Lang.bind(this, this._sync));
|
||||
this._list.connect('actor-removed', Lang.bind(this, this._sync));
|
||||
|
||||
let id = Main.sessionMode.connect('updated',
|
||||
Lang.bind(this, this._sync));
|
||||
this.actor.connect('destroy', function() {
|
||||
Main.sessionMode.disconnect(id);
|
||||
});
|
||||
|
||||
this._messages = new Map();
|
||||
this._date = new Date();
|
||||
this.empty = true;
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_onTitleClicked: function() {
|
||||
Main.overview.hide();
|
||||
Main.panel.closeCalendar();
|
||||
},
|
||||
|
||||
_onKeyFocusIn: function(actor) {
|
||||
this.emit('key-focus-in', actor);
|
||||
},
|
||||
|
||||
get allowed() {
|
||||
return true;
|
||||
},
|
||||
|
||||
setDate: function(date) {
|
||||
if (Calendar.sameDay(date, this._date))
|
||||
return;
|
||||
this._date = date;
|
||||
this._sync();
|
||||
},
|
||||
|
||||
addMessage: function(message, animate) {
|
||||
this.addMessageAtIndex(message, -1, animate);
|
||||
},
|
||||
|
||||
addMessageAtIndex: function(message, index, animate) {
|
||||
let obj = {
|
||||
container: null,
|
||||
destroyId: 0,
|
||||
keyFocusId: 0,
|
||||
closeId: 0
|
||||
};
|
||||
let pivot = new Clutter.Point({ x: .5, y: .5 });
|
||||
let scale = animate ? 0 : 1;
|
||||
obj.container = new St.Widget({ layout_manager: new ScaleLayout(),
|
||||
pivot_point: pivot,
|
||||
scale_x: scale, scale_y: scale });
|
||||
obj.keyFocusId = message.actor.connect('key-focus-in',
|
||||
Lang.bind(this, this._onKeyFocusIn));
|
||||
obj.destroyId = message.actor.connect('destroy',
|
||||
Lang.bind(this, function() {
|
||||
this.removeMessage(message, false);
|
||||
}));
|
||||
obj.closeId = message.connect('close',
|
||||
Lang.bind(this, function() {
|
||||
this.removeMessage(message, true);
|
||||
}));
|
||||
|
||||
this._messages.set(message, obj);
|
||||
obj.container.add_actor(message.actor);
|
||||
|
||||
this._list.insert_child_at_index(obj.container, index);
|
||||
|
||||
if (animate)
|
||||
Tweener.addTween(obj.container, { scale_x: 1,
|
||||
scale_y: 1,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
},
|
||||
|
||||
moveMessage: function(message, index, animate) {
|
||||
let obj = this._messages.get(message);
|
||||
|
||||
if (!animate) {
|
||||
this._list.set_child_at_index(obj.container, index);
|
||||
return;
|
||||
}
|
||||
|
||||
let onComplete = Lang.bind(this, function() {
|
||||
this._list.set_child_at_index(obj.container, index);
|
||||
Tweener.addTween(obj.container, { scale_x: 1,
|
||||
scale_y: 1,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
});
|
||||
Tweener.addTween(obj.container, { scale_x: 0,
|
||||
scale_y: 0,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: onComplete });
|
||||
},
|
||||
|
||||
removeMessage: function(message, animate) {
|
||||
let obj = this._messages.get(message);
|
||||
|
||||
message.actor.disconnect(obj.destroyId);
|
||||
message.actor.disconnect(obj.keyFocusId);
|
||||
message.disconnect(obj.closeId);
|
||||
|
||||
this._messages.delete(message);
|
||||
|
||||
if (animate) {
|
||||
Tweener.addTween(obj.container, { scale_x: 0, scale_y: 0,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
obj.container.destroy();
|
||||
global.sync_pointer();
|
||||
}});
|
||||
} else {
|
||||
obj.container.destroy();
|
||||
global.sync_pointer();
|
||||
}
|
||||
},
|
||||
|
||||
clear: function() {
|
||||
let messages = [...this._messages.keys()].filter(function(message) {
|
||||
return message.canClose();
|
||||
});
|
||||
|
||||
// If there are few messages, letting them all zoom out looks OK
|
||||
if (messages.length < 2) {
|
||||
messages.forEach(function(message) {
|
||||
message.close();
|
||||
});
|
||||
} else {
|
||||
// Otherwise we slide them out one by one, and then zoom them
|
||||
// out "off-screen" in the end to smoothly shrink the parent
|
||||
let delay = MESSAGE_ANIMATION_TIME / Math.max(messages.length, 5);
|
||||
for (let i = 0; i < messages.length; i++) {
|
||||
let message = messages[i];
|
||||
let obj = this._messages.get(message);
|
||||
Tweener.addTween(obj.container,
|
||||
{ anchor_x: this._list.width,
|
||||
opacity: 0,
|
||||
time: MESSAGE_ANIMATION_TIME,
|
||||
delay: i * delay,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: function() {
|
||||
message.close();
|
||||
}});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_canClear: function() {
|
||||
for (let message of this._messages.keys())
|
||||
if (message.canClose())
|
||||
return true;
|
||||
return false;
|
||||
},
|
||||
|
||||
_shouldShow: function() {
|
||||
return !this.empty;
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let empty = this._list.get_n_children() == 0;
|
||||
let changed = this.empty !== empty;
|
||||
this.empty = empty;
|
||||
|
||||
if (changed)
|
||||
this.emit('empty-changed');
|
||||
|
||||
this._closeButton.visible = this._canClear();
|
||||
this.actor.visible = this.allowed && this._shouldShow();
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(MessageListSection.prototype);
|
@ -259,7 +259,7 @@ const ModalDialog = new Lang.Class({
|
||||
if (this.state == State.OPENED || this.state == State.OPENING)
|
||||
return true;
|
||||
|
||||
if (!this.pushModal(timestamp))
|
||||
if (!this.pushModal({ timestamp: timestamp }))
|
||||
return false;
|
||||
|
||||
this._fadeOpen(onPrimary);
|
||||
@ -318,11 +318,8 @@ const ModalDialog = new Lang.Class({
|
||||
pushModal: function (timestamp) {
|
||||
if (this._hasModal)
|
||||
return true;
|
||||
|
||||
let params = { actionMode: this._actionMode };
|
||||
if (timestamp)
|
||||
params['timestamp'] = timestamp;
|
||||
if (!Main.pushModal(this._group, params))
|
||||
if (!Main.pushModal(this._group, { timestamp: timestamp,
|
||||
actionMode: this._actionMode }))
|
||||
return false;
|
||||
|
||||
this._hasModal = true;
|
||||
|
270
js/ui/mpris.js
270
js/ui/mpris.js
@ -1,270 +0,0 @@
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
const Signals = imports.signals;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Calendar = imports.ui.calendar;
|
||||
const Main = imports.ui.main;
|
||||
const MessageList = imports.ui.messageList;
|
||||
|
||||
const DBusIface = '<node> \
|
||||
<interface name="org.freedesktop.DBus"> \
|
||||
<method name="ListNames"> \
|
||||
<arg type="as" direction="out" name="names" /> \
|
||||
</method> \
|
||||
<signal name="NameOwnerChanged"> \
|
||||
<arg type="s" direction="out" name="name" /> \
|
||||
<arg type="s" direction="out" name="oldOwner" /> \
|
||||
<arg type="s" direction="out" name="newOwner" /> \
|
||||
</signal> \
|
||||
</interface> \
|
||||
</node>';
|
||||
const DBusProxy = Gio.DBusProxy.makeProxyWrapper(DBusIface);
|
||||
|
||||
const MprisIface = '<node> \
|
||||
<interface name="org.mpris.MediaPlayer2"> \
|
||||
<method name="Raise" /> \
|
||||
<property name="CanRaise" type="b" access="read" /> \
|
||||
<property name="DesktopEntry" type="s" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
const MprisProxy = Gio.DBusProxy.makeProxyWrapper(MprisIface);
|
||||
|
||||
const MprisPlayerIface = '<node> \
|
||||
<interface name="org.mpris.MediaPlayer2.Player"> \
|
||||
<method name="PlayPause" /> \
|
||||
<method name="Next" /> \
|
||||
<method name="Previous" /> \
|
||||
<property name="CanPlay" type="b" access="read" /> \
|
||||
<property name="Metadata" type="a{sv}" access="read" /> \
|
||||
<property name="PlaybackStatus" type="s" access="read" /> \
|
||||
</interface> \
|
||||
</node>';
|
||||
const MprisPlayerProxy = Gio.DBusProxy.makeProxyWrapper(MprisPlayerIface);
|
||||
|
||||
const MPRIS_PLAYER_PREFIX = 'org.mpris.MediaPlayer2.';
|
||||
|
||||
const MediaMessage = new Lang.Class({
|
||||
Name: 'MediaMessage',
|
||||
Extends: MessageList.Message,
|
||||
|
||||
_init: function(player) {
|
||||
this._player = player;
|
||||
|
||||
this.parent('', '');
|
||||
|
||||
this._icon = new St.Icon({ style_class: 'media-message-cover-icon' });
|
||||
this.setIcon(this._icon);
|
||||
|
||||
this.addMediaControl('media-skip-backward-symbolic',
|
||||
Lang.bind(this, function() {
|
||||
this._player.previous();
|
||||
}));
|
||||
|
||||
this._playPauseButton = this.addMediaControl(null,
|
||||
Lang.bind(this, function() {
|
||||
this._player.playPause();
|
||||
}));
|
||||
|
||||
this.addMediaControl('media-skip-forward-symbolic',
|
||||
Lang.bind(this, function() {
|
||||
this._player.next();
|
||||
}));
|
||||
|
||||
this._player.connect('changed', Lang.bind(this, this._update));
|
||||
this._player.connect('closed', Lang.bind(this, this.close));
|
||||
this._update();
|
||||
},
|
||||
|
||||
_onClicked: function() {
|
||||
this._player.raise();
|
||||
Main.panel.closeCalendar();
|
||||
},
|
||||
|
||||
_update: function() {
|
||||
this.setTitle(this._player.trackArtists.join(', '));
|
||||
this.setBody(this._player.trackTitle);
|
||||
|
||||
if (this._player.trackCoverUrl) {
|
||||
let file = Gio.File.new_for_uri(this._player.trackCoverUrl);
|
||||
this._icon.gicon = new Gio.FileIcon({ file: file });
|
||||
this._icon.remove_style_class_name('fallback');
|
||||
} else {
|
||||
this._icon.icon_name = 'audio-x-generic-symbolic';
|
||||
this._icon.add_style_class_name('fallback');
|
||||
}
|
||||
|
||||
let isPlaying = this._player.status == 'Playing';
|
||||
let iconName = isPlaying ? 'media-playback-pause-symbolic'
|
||||
: 'media-playback-start-symbolic';
|
||||
this._playPauseButton.child.icon_name = iconName;
|
||||
}
|
||||
});
|
||||
|
||||
const MprisPlayer = new Lang.Class({
|
||||
Name: 'MprisPlayer',
|
||||
|
||||
_init: function(busName) {
|
||||
this._mprisProxy = new MprisProxy(Gio.DBus.session, busName,
|
||||
'/org/mpris/MediaPlayer2',
|
||||
Lang.bind(this, this._onMprisProxyReady));
|
||||
this._playerProxy = new MprisPlayerProxy(Gio.DBus.session, busName,
|
||||
'/org/mpris/MediaPlayer2',
|
||||
Lang.bind(this, this._onPlayerProxyReady));
|
||||
|
||||
this._visible = false;
|
||||
this._trackArtists = [];
|
||||
this._trackTitle = '';
|
||||
this._trackCoverUrl = '';
|
||||
},
|
||||
|
||||
get status() {
|
||||
return this._playerProxy.PlaybackStatus;
|
||||
},
|
||||
|
||||
get trackArtists() {
|
||||
return this._trackArtists;
|
||||
},
|
||||
|
||||
get trackTitle() {
|
||||
return this._trackTitle;
|
||||
},
|
||||
|
||||
get trackCoverUrl() {
|
||||
return this._trackCoverUrl;
|
||||
},
|
||||
|
||||
playPause: function() {
|
||||
this._playerProxy.PlayPauseRemote();
|
||||
},
|
||||
|
||||
next: function() {
|
||||
this._playerProxy.NextRemote();
|
||||
},
|
||||
|
||||
previous: function() {
|
||||
this._playerProxy.PreviousRemote();
|
||||
},
|
||||
|
||||
raise: function() {
|
||||
// The remote Raise() method may run into focus stealing prevention,
|
||||
// so prefer activating the app via .desktop file if possible
|
||||
let app = null;
|
||||
if (this._mprisProxy.DesktopEntry) {
|
||||
let desktopId = this._mprisProxy.DesktopEntry + '.desktop';
|
||||
app = Shell.AppSystem.get_default().lookup_app(desktopId);
|
||||
}
|
||||
|
||||
if (app)
|
||||
app.activate();
|
||||
else if (this._mprisProxy.CanRaise)
|
||||
this._mprisProxy.RaiseRemote();
|
||||
},
|
||||
|
||||
_close: function() {
|
||||
this._mprisProxy.disconnect(this._ownerNotifyId);
|
||||
this._mprisProxy = null;
|
||||
|
||||
this._playerProxy.disconnect(this._propsChangedId);
|
||||
this._playerProxy = null;
|
||||
|
||||
this.emit('closed');
|
||||
},
|
||||
|
||||
_onMprisProxyReady: function() {
|
||||
this._ownerNotifyId = this._mprisProxy.connect('notify::g-name-owner',
|
||||
Lang.bind(this, function() {
|
||||
if (!this._mprisProxy.g_name_owner)
|
||||
this._close();
|
||||
}));
|
||||
},
|
||||
|
||||
_onPlayerProxyReady: function() {
|
||||
this._propsChangedId = this._playerProxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._updateState));
|
||||
this._updateState();
|
||||
},
|
||||
|
||||
_updateState: function() {
|
||||
let metadata = {};
|
||||
for (let prop in this._playerProxy.Metadata)
|
||||
metadata[prop] = this._playerProxy.Metadata[prop].deep_unpack();
|
||||
|
||||
this._trackArtists = metadata['xesam:artist'] || [_("Unknown artist")];
|
||||
this._trackTitle = metadata['xesam:title'] || _("Unknown title");
|
||||
this._trackCoverUrl = metadata['mpris:artUrl'] || '';
|
||||
this.emit('changed');
|
||||
|
||||
let visible = this._playerProxy.CanPlay;
|
||||
|
||||
if (this._visible != visible) {
|
||||
this._visible = visible;
|
||||
if (visible)
|
||||
this.emit('show');
|
||||
else
|
||||
this._close();
|
||||
}
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(MprisPlayer.prototype);
|
||||
|
||||
const MediaSection = new Lang.Class({
|
||||
Name: 'MediaSection',
|
||||
Extends: MessageList.MessageListSection,
|
||||
|
||||
_init: function() {
|
||||
this.parent(_("Media"));
|
||||
|
||||
this._players = new Map();
|
||||
|
||||
this._proxy = new DBusProxy(Gio.DBus.session,
|
||||
'org.freedesktop.DBus',
|
||||
'/org/freedesktop/DBus',
|
||||
Lang.bind(this, this._onProxyReady));
|
||||
},
|
||||
|
||||
_shouldShow: function() {
|
||||
return !this.empty && Calendar.isToday(this._date);
|
||||
},
|
||||
|
||||
_addPlayer: function(busName) {
|
||||
if (this._players.get(busName))
|
||||
return;
|
||||
|
||||
let player = new MprisPlayer(busName);
|
||||
player.connect('closed', Lang.bind(this,
|
||||
function() {
|
||||
this._players.delete(busName);
|
||||
}));
|
||||
player.connect('show', Lang.bind(this,
|
||||
function() {
|
||||
let message = new MediaMessage(player);
|
||||
this.addMessage(message, true);
|
||||
}));
|
||||
this._players.set(busName, player);
|
||||
},
|
||||
|
||||
_onProxyReady: function() {
|
||||
this._proxy.ListNamesRemote(Lang.bind(this,
|
||||
function([names]) {
|
||||
names.forEach(Lang.bind(this,
|
||||
function(name) {
|
||||
if (!name.startsWith(MPRIS_PLAYER_PREFIX))
|
||||
return;
|
||||
|
||||
this._addPlayer(name);
|
||||
}));
|
||||
}));
|
||||
this._proxy.connectSignal('NameOwnerChanged',
|
||||
Lang.bind(this, this._onNameOwnerChanged));
|
||||
},
|
||||
|
||||
_onNameOwnerChanged: function(proxy, sender, [name, oldOwner, newOwner]) {
|
||||
if (!name.startsWith(MPRIS_PLAYER_PREFIX))
|
||||
return;
|
||||
|
||||
if (newOwner && !oldOwner)
|
||||
this._addPlayer(name);
|
||||
}
|
||||
});
|
@ -22,9 +22,9 @@ const LevelBar = new Lang.Class({
|
||||
this._level = 0;
|
||||
|
||||
this.actor = new St.Bin({ style_class: 'level',
|
||||
x_align: St.Align.START,
|
||||
y_fill: true });
|
||||
this._bar = new St.Widget({ style_class: 'level-bar' });
|
||||
x_fill: true, y_fill: true });
|
||||
this._bar = new St.DrawingArea();
|
||||
this._bar.connect('repaint', Lang.bind(this, this._repaint));
|
||||
|
||||
this.actor.set_child(this._bar);
|
||||
},
|
||||
@ -38,10 +38,35 @@ const LevelBar = new Lang.Class({
|
||||
if (newValue == this._level)
|
||||
return;
|
||||
this._level = newValue;
|
||||
this._bar.queue_repaint();
|
||||
},
|
||||
|
||||
let width = this.actor.width;
|
||||
width *= (this._level / 100.);
|
||||
this._bar.width = width;
|
||||
_repaint: function() {
|
||||
let cr = this._bar.get_context();
|
||||
|
||||
let node = this.actor.get_theme_node();
|
||||
let radius = node.get_border_radius(0); // assume same radius for all corners
|
||||
Clutter.cairo_set_source_color(cr, node.get_foreground_color());
|
||||
|
||||
let [w, h] = this._bar.get_surface_size();
|
||||
w *= (this._level / 100.);
|
||||
|
||||
if (w == 0)
|
||||
return;
|
||||
|
||||
cr.moveTo(radius, 0);
|
||||
if (w >= radius)
|
||||
cr.arc(w - radius, radius, radius, 1.5 * Math.PI, 2. * Math.PI);
|
||||
else
|
||||
cr.lineTo(w, 0);
|
||||
if (w >= radius)
|
||||
cr.arc(w - radius, h - radius, radius, 0, 0.5 * Math.PI);
|
||||
else
|
||||
cr.lineTo(w, h);
|
||||
cr.arc(radius, h - radius, radius, 0.5 * Math.PI, Math.PI);
|
||||
cr.arc(radius, radius, radius, Math.PI, 1.5 * Math.PI);
|
||||
cr.fill();
|
||||
cr.$dispose();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -95,7 +95,6 @@ const AppMenuButton = new Lang.Class({
|
||||
this._startingApps = [];
|
||||
|
||||
this._menuManager = panel.menuManager;
|
||||
this._gtkSettings = Gtk.Settings.get_default();
|
||||
this._targetApp = null;
|
||||
this._appMenuNotifyId = 0;
|
||||
this._actionGroupNotifyId = 0;
|
||||
@ -124,14 +123,11 @@ const AppMenuButton = new Lang.Class({
|
||||
this._arrow = PopupMenu.arrowIcon(St.Side.BOTTOM);
|
||||
this._container.add_actor(this._arrow);
|
||||
|
||||
this._visible = this._gtkSettings.gtk_shell_shows_app_menu &&
|
||||
!Main.overview.visible;
|
||||
this._visible = !Main.overview.visible;
|
||||
if (!this._visible)
|
||||
this.actor.hide();
|
||||
this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, this._sync));
|
||||
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, this._sync));
|
||||
this._showsAppMenuId = this._gtkSettings.connect('notify::gtk-shell-shows-app-menu',
|
||||
Lang.bind(this, this._sync));
|
||||
|
||||
this._stop = true;
|
||||
|
||||
@ -309,9 +305,7 @@ const AppMenuButton = new Lang.Class({
|
||||
}
|
||||
}
|
||||
|
||||
let visible = (this._targetApp != null &&
|
||||
this._gtkSettings.gtk_shell_shows_app_menu &&
|
||||
!Main.overview.visibleTarget);
|
||||
let visible = (this._targetApp != null && !Main.overview.visibleTarget);
|
||||
if (visible)
|
||||
this.show();
|
||||
else
|
||||
@ -384,10 +378,6 @@ const AppMenuButton = new Lang.Class({
|
||||
Main.overview.disconnect(this._overviewShowingId);
|
||||
this._overviewShowingId = 0;
|
||||
}
|
||||
if (this._showsAppMenuId > 0) {
|
||||
this._gtkSettings.disconnect(this._showsAppMenuId);
|
||||
this._showsAppMenuId = 0;
|
||||
}
|
||||
if (this._switchWorkspaceNotifyId > 0) {
|
||||
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
|
||||
this._switchWorkspaceNotifyId = 0;
|
||||
@ -459,8 +449,7 @@ const ActivitiesButton = new Lang.Class({
|
||||
|
||||
if (event.type() == Clutter.EventType.TOUCH_END ||
|
||||
event.type() == Clutter.EventType.BUTTON_RELEASE)
|
||||
if (Main.overview.shouldToggleByCornerOrButton())
|
||||
Main.overview.toggle();
|
||||
Main.overview.toggle();
|
||||
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
@ -468,8 +457,7 @@ const ActivitiesButton = new Lang.Class({
|
||||
_onKeyRelease: function(actor, event) {
|
||||
let symbol = event.get_key_symbol();
|
||||
if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) {
|
||||
if (Main.overview.shouldToggleByCornerOrButton())
|
||||
Main.overview.toggle();
|
||||
Main.overview.toggle();
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
@ -654,50 +642,14 @@ const PanelCorner = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const AggregateLayout = new Lang.Class({
|
||||
Name: 'AggregateLayout',
|
||||
Extends: Clutter.BoxLayout,
|
||||
|
||||
_init: function(params) {
|
||||
if (!params)
|
||||
params = {};
|
||||
params['orientation'] = Clutter.Orientation.VERTICAL;
|
||||
this.parent(params);
|
||||
|
||||
this._sizeChildren = [];
|
||||
},
|
||||
|
||||
addSizeChild: function(actor) {
|
||||
this._sizeChildren.push(actor);
|
||||
this.layout_changed();
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
let themeNode = container.get_theme_node();
|
||||
let minWidth = themeNode.get_min_width();
|
||||
let natWidth = minWidth;
|
||||
|
||||
for (let i = 0; i < this._sizeChildren.length; i++) {
|
||||
let child = this._sizeChildren[i];
|
||||
let [childMin, childNat] = child.get_preferred_width(forHeight);
|
||||
minWidth = Math.max(minWidth, childMin);
|
||||
natWidth = Math.max(minWidth, childNat);
|
||||
}
|
||||
return [minWidth, natWidth];
|
||||
}
|
||||
});
|
||||
|
||||
const AggregateMenu = new Lang.Class({
|
||||
Name: 'AggregateMenu',
|
||||
Extends: PanelMenu.Button,
|
||||
|
||||
_init: function() {
|
||||
this.parent(0.0, C_("System menu in the top bar", "System"), false);
|
||||
this.parent(0.0, _("Settings"), false);
|
||||
this.menu.actor.add_style_class_name('aggregate-menu');
|
||||
|
||||
let menuLayout = new AggregateLayout();
|
||||
this.menu.box.set_layout_manager(menuLayout);
|
||||
|
||||
this._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
|
||||
this.actor.add_child(this._indicators);
|
||||
|
||||
@ -746,11 +698,6 @@ const AggregateMenu = new Lang.Class({
|
||||
this.menu.addMenuItem(this._rfkill.menu);
|
||||
this.menu.addMenuItem(this._power.menu);
|
||||
this.menu.addMenuItem(this._system.menu);
|
||||
|
||||
menuLayout.addSizeChild(this._location.menu.actor);
|
||||
menuLayout.addSizeChild(this._rfkill.menu.actor);
|
||||
menuLayout.addSizeChild(this._power.menu.actor);
|
||||
menuLayout.addSizeChild(this._system.menu.actor);
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -396,7 +396,6 @@ const PopupImageMenuItem = new Lang.Class({
|
||||
this.actor.add_child(this.label);
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.actor.add_child(this._icon, { align: St.Align.END });
|
||||
this.actor.label_actor = this.label;
|
||||
|
||||
this.setIcon(iconName);
|
||||
},
|
||||
@ -1146,16 +1145,6 @@ const PopupSubMenuMenuItem = new Lang.Class({
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_onTouchEvent: function(actor, event) {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||
// Since we override the parent, we need to manage what the parent does
|
||||
// with the active style class
|
||||
this.actor.remove_style_pseudo_class ('active');
|
||||
this._setOpenState(!this._getOpenState());
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -61,7 +61,6 @@ const RunDialog = new Lang.Class({
|
||||
|
||||
// rt is short for "reload theme"
|
||||
'rt': Lang.bind(this, function() {
|
||||
Main.reloadThemeResource();
|
||||
Main.loadTheme();
|
||||
})
|
||||
};
|
||||
|
@ -559,9 +559,6 @@ const ScreenShield = new Lang.Class({
|
||||
if (prevIsActive != this._isActive)
|
||||
this.emit('active-changed');
|
||||
|
||||
if (this._loginSession)
|
||||
this._loginSession.SetLockedHintRemote(active);
|
||||
|
||||
this._syncInhibitor();
|
||||
},
|
||||
|
||||
|
@ -137,10 +137,6 @@ const Slider = new Lang.Class({
|
||||
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
|
||||
}
|
||||
|
||||
// We need to emit 'drag-begin' before moving the handle to make
|
||||
// sure that no 'value-changed' signal is emitted before this one.
|
||||
this.emit('drag-begin');
|
||||
|
||||
let absX, absY;
|
||||
[absX, absY] = event.get_coords();
|
||||
this._moveHandle(absX, absY);
|
||||
@ -228,7 +224,6 @@ const Slider = new Lang.Class({
|
||||
let delta = key == Clutter.KEY_Right ? 0.1 : -0.1;
|
||||
this._value = Math.max(0, Math.min(this._value + delta, 1));
|
||||
this.actor.queue_repaint();
|
||||
this.emit('drag-begin');
|
||||
this.emit('value-changed', this._value);
|
||||
this.emit('drag-end');
|
||||
return Clutter.EVENT_STOP;
|
||||
|
@ -1,8 +1,11 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GnomeBluetooth = imports.gi.GnomeBluetooth;
|
||||
const Lang = imports.lang;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
@ -20,8 +23,6 @@ const RfkillManagerInterface = '<node> \
|
||||
|
||||
const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface);
|
||||
|
||||
const HAD_BLUETOOTH_DEVICES_SETUP = 'had-bluetooth-devices-setup';
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'BTIndicator',
|
||||
Extends: PanelMenu.SystemIndicator,
|
||||
@ -31,7 +32,6 @@ const Indicator = new Lang.Class({
|
||||
|
||||
this._indicator = this._addIndicator();
|
||||
this._indicator.icon_name = 'bluetooth-active-symbolic';
|
||||
this._hadSetupDevices = global.settings.get_boolean(HAD_BLUETOOTH_DEVICES_SETUP);
|
||||
|
||||
this._proxy = new RfkillManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
|
||||
Lang.bind(this, function(proxy, error) {
|
||||
@ -44,15 +44,13 @@ const Indicator = new Lang.Class({
|
||||
}));
|
||||
this._proxy.connect('g-properties-changed', Lang.bind(this, this._sync));
|
||||
|
||||
this._item = new PopupMenu.PopupSubMenuMenuItem(_("Bluetooth"), true);
|
||||
// The Bluetooth menu only appears when Bluetooth is in use,
|
||||
// so just statically build it with a "Turn Off" menu item.
|
||||
this._item = new PopupMenu.PopupSubMenuMenuItem('', true);
|
||||
this._item.icon.icon_name = 'bluetooth-active-symbolic';
|
||||
|
||||
this._toggleItem = new PopupMenu.PopupMenuItem('');
|
||||
this._toggleItem.connect('activate', Lang.bind(this, function() {
|
||||
this._proxy.BluetoothAirplaneMode = !this._proxy.BluetoothAirplaneMode;
|
||||
this._item.menu.addAction(_("Turn Off"), Lang.bind(this, function() {
|
||||
this._proxy.BluetoothAirplaneMode = true;
|
||||
}));
|
||||
this._item.menu.addMenuItem(this._toggleItem);
|
||||
|
||||
this._item.menu.addSettingsAction(_("Bluetooth Settings"), 'gnome-bluetooth-panel.desktop');
|
||||
this.menu.addMenuItem(this._item);
|
||||
|
||||
@ -70,75 +68,42 @@ const Indicator = new Lang.Class({
|
||||
while (ret) {
|
||||
let isDefault = this._model.get_value(iter,
|
||||
GnomeBluetooth.Column.DEFAULT);
|
||||
let isPowered = this._model.get_value(iter,
|
||||
GnomeBluetooth.Column.POWERED);
|
||||
if (isDefault && isPowered)
|
||||
if (isDefault)
|
||||
return iter;
|
||||
ret = this._model.iter_next(iter);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
// nDevices is the number of devices setup for the current default
|
||||
// adapter if one exists and is powered. If unpowered or unavailable,
|
||||
// nDevice is "1" if it had setup devices associated to it the last
|
||||
// time it was seen, and "-1" if not.
|
||||
//
|
||||
// nConnectedDevices is the number of devices connected to the default
|
||||
// adapter if one exists and is powered, or -1 if it's not available.
|
||||
_getNDevices: function() {
|
||||
_getNConnectedDevices: function() {
|
||||
let adapter = this._getDefaultAdapter();
|
||||
if (!adapter)
|
||||
return [ this._hadSetupDevices ? 1 : -1, -1 ];
|
||||
return 0;
|
||||
|
||||
let nConnectedDevices = 0;
|
||||
let nDevices = 0;
|
||||
let [ret, iter] = this._model.iter_children(adapter);
|
||||
while (ret) {
|
||||
let isConnected = this._model.get_value(iter,
|
||||
GnomeBluetooth.Column.CONNECTED);
|
||||
if (isConnected)
|
||||
nConnectedDevices++;
|
||||
|
||||
let isPaired = this._model.get_value(iter,
|
||||
GnomeBluetooth.Column.PAIRED);
|
||||
let isTrusted = this._model.get_value(iter,
|
||||
GnomeBluetooth.Column.TRUSTED);
|
||||
if (isPaired || isTrusted)
|
||||
nDevices++;
|
||||
ret = this._model.iter_next(iter);
|
||||
}
|
||||
|
||||
if (this._hadSetupDevices != (nDevices > 0)) {
|
||||
this._hadSetupDevices = !this._hadSetupDevices;
|
||||
global.settings.set_boolean(HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
|
||||
}
|
||||
|
||||
return [ nDevices, nConnectedDevices];
|
||||
return nDevices;
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let [ nDevices, nConnectedDevices ] = this._getNDevices();
|
||||
let nDevices = this._getNConnectedDevices();
|
||||
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
|
||||
|
||||
this.menu.setSensitive(sensitive);
|
||||
this._indicator.visible = nConnectedDevices > 0;
|
||||
this._indicator.visible = nDevices > 0;
|
||||
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
|
||||
// Remember if there were setup devices and show the menu
|
||||
// if we've seen setup devices and we're not hard blocked
|
||||
if (nDevices > 0)
|
||||
this._item.actor.visible = !this._proxy.BluetoothHardwareAirplaneMode;
|
||||
else
|
||||
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode;
|
||||
|
||||
if (nConnectedDevices > 0)
|
||||
/* Translators: this is the number of connected bluetooth devices */
|
||||
this._item.label.text = ngettext("%d Connected", "%d Connected", nConnectedDevices).format(nConnectedDevices);
|
||||
else if (nConnectedDevices == -1)
|
||||
this._item.label.text = _("Off");
|
||||
this._item.label.text = ngettext("%d Connected", "%d Connected", nDevices).format(nDevices);
|
||||
else
|
||||
this._item.label.text = _("Not In Use");
|
||||
|
||||
this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off");
|
||||
},
|
||||
});
|
||||
|
@ -1,6 +1,5 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Lang = imports.lang;
|
||||
@ -8,18 +7,12 @@ const Lang = imports.lang;
|
||||
const Main = imports.ui.main;
|
||||
const PanelMenu = imports.ui.panelMenu;
|
||||
const PopupMenu = imports.ui.popupMenu;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const LOCATION_SCHEMA = 'org.gnome.system.location';
|
||||
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
|
||||
const ENABLED = 'enabled';
|
||||
|
||||
const APP_PERMISSIONS_TABLE = 'gnome';
|
||||
const APP_PERMISSIONS_ID = 'geolocation';
|
||||
|
||||
const GeoclueAccuracyLevel = {
|
||||
NONE: 0,
|
||||
COUNTRY: 1,
|
||||
@ -29,15 +22,6 @@ const GeoclueAccuracyLevel = {
|
||||
EXACT: 8
|
||||
};
|
||||
|
||||
function accuracyLevelToString(accuracyLevel) {
|
||||
for (let key in GeoclueAccuracyLevel) {
|
||||
if (GeoclueAccuracyLevel[key] == accuracyLevel)
|
||||
return key;
|
||||
}
|
||||
|
||||
return 'NONE';
|
||||
}
|
||||
|
||||
var GeoclueIface = '<node> \
|
||||
<interface name="org.freedesktop.GeoClue2.Manager"> \
|
||||
<property name="InUse" type="b" access="read"/> \
|
||||
@ -62,26 +46,6 @@ var AgentIface = '<node> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
var PermissionStoreIface = '<node> \
|
||||
<interface name="org.freedesktop.impl.portal.PermissionStore"> \
|
||||
<method name="Lookup"> \
|
||||
<arg name="table" type="s" direction="in"/> \
|
||||
<arg name="id" type="s" direction="in"/> \
|
||||
<arg name="permissions" type="a{sas}" direction="out"/> \
|
||||
<arg name="data" type="v" direction="out"/> \
|
||||
</method> \
|
||||
<method name="Set"> \
|
||||
<arg name="table" type="s" direction="in"/> \
|
||||
<arg name="create" type="b" direction="in"/> \
|
||||
<arg name="id" type="s" direction="in"/> \
|
||||
<arg name="app_permissions" type="a{sas}" direction="in"/> \
|
||||
<arg name="data" type="v" direction="in"/> \
|
||||
</method> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const PermissionStore = Gio.DBusProxy.makeProxyWrapper(PermissionStoreIface);
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'LocationIndicator',
|
||||
Extends: PanelMenu.SystemIndicator,
|
||||
@ -119,66 +83,64 @@ const Indicator = new Lang.Class({
|
||||
this._onSessionUpdated();
|
||||
this._onMaxAccuracyLevelChanged();
|
||||
this._connectToGeoclue();
|
||||
this._connectToPermissionStore();
|
||||
},
|
||||
|
||||
get MaxAccuracyLevel() {
|
||||
return this._getMaxAccuracyLevel();
|
||||
},
|
||||
|
||||
AuthorizeAppAsync: function(params, invocation) {
|
||||
let [desktopId, reqAccuracyLevel] = params;
|
||||
// We (and geoclue) have currently no way to reliably identifying apps so
|
||||
// for now, lets just authorize all apps as long as they provide a valid
|
||||
// desktop ID. We also ensure they don't get more accuracy than global max.
|
||||
AuthorizeApp: function(desktop_id, reqAccuracyLevel) {
|
||||
var appSystem = Shell.AppSystem.get_default();
|
||||
var app = appSystem.lookup_app(desktop_id + ".desktop");
|
||||
if (app == null) {
|
||||
return [false, 0];
|
||||
}
|
||||
|
||||
let authorizer = new AppAuthorizer(desktopId,
|
||||
reqAccuracyLevel,
|
||||
this._permStoreProxy,
|
||||
this._getMaxAccuracyLevel());
|
||||
|
||||
authorizer.authorize(Lang.bind(this, function(accuracyLevel) {
|
||||
let ret = (accuracyLevel != GeoclueAccuracyLevel.NONE);
|
||||
invocation.return_value(GLib.Variant.new('(bu)',
|
||||
[ret, accuracyLevel]));
|
||||
}));
|
||||
let allowedAccuracyLevel = clamp(reqAccuracyLevel, 0, this._getMaxAccuracyLevel());
|
||||
return [true, allowedAccuracyLevel];
|
||||
},
|
||||
|
||||
_syncIndicator: function() {
|
||||
if (this._managerProxy == null) {
|
||||
if (this._proxy == null) {
|
||||
this._indicator.visible = false;
|
||||
this._item.actor.visible = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._indicator.visible = this._managerProxy.InUse;
|
||||
this._indicator.visible = this._proxy.InUse;
|
||||
this._item.actor.visible = this._indicator.visible;
|
||||
this._updateMenuLabels();
|
||||
},
|
||||
|
||||
_connectToGeoclue: function() {
|
||||
if (this._managerProxy != null || this._connecting)
|
||||
if (this._proxy != null || this._connecting)
|
||||
return false;
|
||||
|
||||
this._connecting = true;
|
||||
new GeoclueManager(Gio.DBus.system,
|
||||
'org.freedesktop.GeoClue2',
|
||||
'/org/freedesktop/GeoClue2/Manager',
|
||||
Lang.bind(this, this._onManagerProxyReady));
|
||||
Lang.bind(this, this._onProxyReady));
|
||||
return true;
|
||||
},
|
||||
|
||||
_onManagerProxyReady: function(proxy, error) {
|
||||
_onProxyReady: function(proxy, error) {
|
||||
if (error != null) {
|
||||
log(error.message);
|
||||
this._connecting = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._managerProxy = proxy;
|
||||
this._propertiesChangedId = this._managerProxy.connect('g-properties-changed',
|
||||
this._proxy = proxy;
|
||||
this._propertiesChangedId = this._proxy.connect('g-properties-changed',
|
||||
Lang.bind(this, this._onGeocluePropsChanged));
|
||||
|
||||
this._syncIndicator();
|
||||
|
||||
this._managerProxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
|
||||
this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
|
||||
},
|
||||
|
||||
_onAgentRegistered: function(result, error) {
|
||||
@ -191,10 +153,10 @@ const Indicator = new Lang.Class({
|
||||
|
||||
_onGeoclueVanished: function() {
|
||||
if (this._propertiesChangedId) {
|
||||
this._managerProxy.disconnect(this._propertiesChangedId);
|
||||
this._proxy.disconnect(this._propertiesChangedId);
|
||||
this._propertiesChangedId = 0;
|
||||
}
|
||||
this._managerProxy = null;
|
||||
this._proxy = null;
|
||||
|
||||
this._syncIndicator();
|
||||
},
|
||||
@ -249,206 +211,9 @@ const Indicator = new Lang.Class({
|
||||
let unpacked = properties.deep_unpack();
|
||||
if ("InUse" in unpacked)
|
||||
this._syncIndicator();
|
||||
},
|
||||
|
||||
_connectToPermissionStore: function() {
|
||||
this._permStoreProxy = null;
|
||||
new PermissionStore(Gio.DBus.session,
|
||||
'org.freedesktop.impl.portal.PermissionStore',
|
||||
'/org/freedesktop/impl/portal/PermissionStore',
|
||||
Lang.bind(this, this._onPermStoreProxyReady));
|
||||
},
|
||||
|
||||
_onPermStoreProxyReady: function(proxy, error) {
|
||||
if (error != null) {
|
||||
log(error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
this._permStoreProxy = proxy;
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
function clamp(value, min, max) {
|
||||
return Math.max(min, Math.min(max, value));
|
||||
}
|
||||
|
||||
const AppAuthorizer = new Lang.Class({
|
||||
Name: 'LocationAppAuthorizer',
|
||||
|
||||
_init: function(desktopId,
|
||||
reqAccuracyLevel,
|
||||
permStoreProxy,
|
||||
maxAccuracyLevel) {
|
||||
this.desktopId = desktopId;
|
||||
this.reqAccuracyLevel = reqAccuracyLevel;
|
||||
this._permStoreProxy = permStoreProxy;
|
||||
this._maxAccuracyLevel = maxAccuracyLevel;
|
||||
|
||||
this._accuracyLevel = GeoclueAccuracyLevel.NONE;
|
||||
},
|
||||
|
||||
authorize: function(onAuthDone) {
|
||||
this._onAuthDone = onAuthDone;
|
||||
|
||||
let appSystem = Shell.AppSystem.get_default();
|
||||
this._app = appSystem.lookup_app(this.desktopId + ".desktop");
|
||||
if (this._app == null || this._permStoreProxy == null) {
|
||||
this._completeAuth();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
this._permStoreProxy.LookupRemote(APP_PERMISSIONS_TABLE,
|
||||
APP_PERMISSIONS_ID,
|
||||
Lang.bind(this,
|
||||
this._onPermLookupDone));
|
||||
},
|
||||
|
||||
_onPermLookupDone: function(result, error) {
|
||||
if (error != null) {
|
||||
if (error.domain == Gio.DBusError) {
|
||||
// Likely no xdg-app installed, just authorize the app
|
||||
this._accuracyLevel = this.reqAccuracyLevel;
|
||||
this._permStoreProxy = null;
|
||||
this._completeAuth();
|
||||
} else {
|
||||
// Currently xdg-app throws an error if we lookup for
|
||||
// unknown ID (which would be the case first time this code
|
||||
// runs) so we continue with user authorization as normal
|
||||
// and ID is added to the store if user says "yes".
|
||||
log(error.message);
|
||||
this._permissions = {};
|
||||
this._userAuthorizeApp();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
[this._permissions] = result;
|
||||
let permission = this._permissions[this.desktopId];
|
||||
|
||||
if (permission == null) {
|
||||
this._userAuthorizeApp();
|
||||
} else {
|
||||
let [levelStr] = permission || ['NONE'];
|
||||
this._accuracyLevel = GeoclueAccuracyLevel[levelStr] ||
|
||||
GeoclueAccuracyLevel.NONE;
|
||||
this._completeAuth();
|
||||
}
|
||||
},
|
||||
|
||||
_userAuthorizeApp: function() {
|
||||
let name = this._app.get_name();
|
||||
let appInfo = this._app.get_app_info();
|
||||
let reason = appInfo.get_string("X-Geoclue-Reason");
|
||||
|
||||
this._showAppAuthDialog(name, reason);
|
||||
},
|
||||
|
||||
_showAppAuthDialog: function(name, reason) {
|
||||
this._dialog = new GeolocationDialog(name,
|
||||
reason,
|
||||
this.reqAccuracyLevel);
|
||||
|
||||
let responseId = this._dialog.connect('response', Lang.bind(this,
|
||||
function(dialog, level) {
|
||||
this._dialog.disconnect(responseId);
|
||||
this._accuracyLevel = level;
|
||||
this._completeAuth();
|
||||
}));
|
||||
|
||||
this._dialog.open();
|
||||
},
|
||||
|
||||
_completeAuth: function() {
|
||||
if (this._accuracyLevel != GeoclueAccuracyLevel.NONE) {
|
||||
this._accuracyLevel = clamp(this._accuracyLevel,
|
||||
0,
|
||||
this._maxAccuracyLevel);
|
||||
}
|
||||
this._saveToPermissionStore();
|
||||
|
||||
this._onAuthDone(this._accuracyLevel);
|
||||
},
|
||||
|
||||
_saveToPermissionStore: function() {
|
||||
if (this._permStoreProxy == null)
|
||||
return;
|
||||
|
||||
let levelStr = accuracyLevelToString(this._accuracyLevel);
|
||||
let dateStr = Math.round(Date.now() / 1000).toString();
|
||||
this._permissions[this.desktopId] = [levelStr, dateStr];
|
||||
|
||||
let data = GLib.Variant.new('av', {});
|
||||
|
||||
this._permStoreProxy.SetRemote(APP_PERMISSIONS_TABLE,
|
||||
true,
|
||||
APP_PERMISSIONS_ID,
|
||||
this._permissions,
|
||||
data,
|
||||
function (result, error) {
|
||||
if (error != null)
|
||||
log(error.message);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const GeolocationDialog = new Lang.Class({
|
||||
Name: 'GeolocationDialog',
|
||||
Extends: ModalDialog.ModalDialog,
|
||||
|
||||
_init: function(name, reason, reqAccuracyLevel) {
|
||||
this.parent({ styleClass: 'geolocation-dialog' });
|
||||
this.reqAccuracyLevel = reqAccuracyLevel;
|
||||
|
||||
let mainContentBox = new St.BoxLayout({ style_class: 'geolocation-dialog-main-layout' });
|
||||
this.contentLayout.add_actor(mainContentBox);
|
||||
|
||||
let icon = new St.Icon({ style_class: 'geolocation-dialog-icon',
|
||||
icon_name: 'find-location-symbolic',
|
||||
y_align: Clutter.ActorAlign.START });
|
||||
mainContentBox.add_actor(icon);
|
||||
|
||||
let messageBox = new St.BoxLayout({ style_class: 'geolocation-dialog-content',
|
||||
vertical: true });
|
||||
mainContentBox.add_actor(messageBox);
|
||||
|
||||
this._title = new St.Label({ style_class: 'geolocation-dialog-title headline' });
|
||||
messageBox.add_actor(this._title);
|
||||
|
||||
this._reason = new St.Label({ style_class: 'geolocation-dialog-reason' });
|
||||
messageBox.add_actor(this._reason);
|
||||
|
||||
this._privacyNote = new St.Label();
|
||||
messageBox.add_actor(this._privacyNote);
|
||||
|
||||
let button = this.addButton({ label: _("Deny Access"),
|
||||
action: Lang.bind(this, this._onDenyClicked),
|
||||
key: Clutter.KEY_Escape });
|
||||
this.addButton({ label: _("Grant Access"),
|
||||
action: Lang.bind(this, this._onGrantClicked) });
|
||||
|
||||
this.setInitialKeyFocus(button);
|
||||
|
||||
/* Translators: %s is an application name */
|
||||
this._title.text = _("Give %s access to your location?").format(name);
|
||||
|
||||
this._privacyNote.text = _("Location access can be changed at any time from the privacy settings.");
|
||||
|
||||
if (reason)
|
||||
this._reason.text = reason;
|
||||
this._reason.visible = (reason != null);
|
||||
},
|
||||
|
||||
_onGrantClicked: function() {
|
||||
this.emit('response', this.reqAccuracyLevel);
|
||||
this.close();
|
||||
},
|
||||
|
||||
_onDenyClicked: function() {
|
||||
this.emit('response', GeoclueAccuracyLevel.NONE);
|
||||
this.close();
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(GeolocationDialog.prototype);
|
||||
|
@ -621,7 +621,7 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
_init: function(client, device, settings) {
|
||||
this.parent(client, device, settings);
|
||||
|
||||
this.item.menu.addMenuItem(createSettingsAction(_("Bluetooth Settings"), device));
|
||||
this.item.menu.addMenuItem(createSettingsAction(_("Mobile Broadband Settings"), device));
|
||||
},
|
||||
|
||||
_getDescription: function() {
|
||||
@ -629,7 +629,7 @@ const NMDeviceBluetooth = new Lang.Class({
|
||||
},
|
||||
|
||||
getConnectLabel: function() {
|
||||
return _("Connect to Internet");
|
||||
return _("Use as Internet connection");
|
||||
},
|
||||
|
||||
getIndicatorIcon: function() {
|
||||
|
@ -1,8 +1,6 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const Gio = imports.gi.Gio;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const St = imports.gi.St;
|
||||
const Lang = imports.lang;
|
||||
const UPower = imports.gi.UPowerGlib;
|
||||
|
||||
@ -27,8 +25,6 @@ const DisplayDeviceInterface = '<node> \
|
||||
|
||||
const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(DisplayDeviceInterface);
|
||||
|
||||
const SHOW_BATTERY_PERCENTAGE = 'show-battery-percentage';
|
||||
|
||||
const Indicator = new Lang.Class({
|
||||
Name: 'PowerIndicator',
|
||||
Extends: PanelMenu.SystemIndicator,
|
||||
@ -36,15 +32,7 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
this._desktopSettings.connect('changed::' + SHOW_BATTERY_PERCENTAGE,
|
||||
Lang.bind(this, this._sync));
|
||||
|
||||
this._indicator = this._addIndicator();
|
||||
this._percentageLabel = new St.Label({ y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
this.indicators.add(this._percentageLabel, { expand: true, y_fill: true });
|
||||
this.indicators.add_style_class_name('power-status');
|
||||
|
||||
this._proxy = new PowerManagerProxy(Gio.DBus.system, BUS_NAME, OBJECT_PATH,
|
||||
Lang.bind(this, function(proxy, error) {
|
||||
@ -95,12 +83,12 @@ const Indicator = new Lang.Class({
|
||||
|
||||
if (this._proxy.State == UPower.DeviceState.DISCHARGING) {
|
||||
// Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
return _("%d\u2236%02d Remaining (%d\u2009%%)").format(hours, minutes, this._proxy.Percentage);
|
||||
return _("%d\u2236%02d Remaining (%d%%)").format(hours, minutes, this._proxy.Percentage);
|
||||
}
|
||||
|
||||
if (this._proxy.State == UPower.DeviceState.CHARGING) {
|
||||
// Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
return _("%d\u2236%02d Until Full (%d\u2009%%)").format(hours, minutes, this._proxy.Percentage);
|
||||
return _("%d\u2236%02d Until Full (%d%%)").format(hours, minutes, this._proxy.Percentage);
|
||||
}
|
||||
|
||||
return null;
|
||||
@ -111,12 +99,10 @@ const Indicator = new Lang.Class({
|
||||
let visible = this._proxy.IsPresent;
|
||||
if (visible) {
|
||||
this._item.actor.show();
|
||||
this._percentageLabel.visible = this._desktopSettings.get_boolean(SHOW_BATTERY_PERCENTAGE);
|
||||
} else {
|
||||
// If there's no battery, then we use the power icon.
|
||||
this._item.actor.hide();
|
||||
this._indicator.icon_name = 'system-shutdown-symbolic';
|
||||
this._percentageLabel.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -125,14 +111,6 @@ const Indicator = new Lang.Class({
|
||||
this._indicator.icon_name = icon;
|
||||
this._item.icon.icon_name = icon;
|
||||
|
||||
// The icon label
|
||||
let label
|
||||
if (this._proxy.State == UPower.DeviceState.FULLY_CHARGED)
|
||||
label = _("%d\u2009%%").format(100);
|
||||
else
|
||||
label = _("%d\u2009%%").format(this._proxy.Percentage);
|
||||
this._percentageLabel.clutter_text.set_markup('<span size="smaller">' + label + '</span>');
|
||||
|
||||
// The status label
|
||||
this._item.label.text = this._getStatus();
|
||||
},
|
||||
|
@ -6,7 +6,6 @@ const Gdm = imports.gi.Gdm;
|
||||
const Gio = imports.gi.Gio;
|
||||
const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
@ -111,7 +110,6 @@ const Indicator = new Lang.Class({
|
||||
|
||||
this._session = new GnomeSession.SessionManager();
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
this._monitorManager = Meta.MonitorManager.get();
|
||||
this._haveShutdown = true;
|
||||
this._haveSuspend = true;
|
||||
|
||||
@ -157,8 +155,6 @@ const Indicator = new Lang.Class({
|
||||
|
||||
this._orientationSettings.connect('changed::orientation-lock',
|
||||
Lang.bind(this, this._updateOrientationLock));
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
Lang.bind(this, this._updateOrientationLock));
|
||||
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
Lang.bind(this, this._sensorProxyAppeared),
|
||||
@ -268,8 +264,7 @@ const Indicator = new Lang.Class({
|
||||
|
||||
_updateOrientationLock: function() {
|
||||
if (this._sensorProxy)
|
||||
this._orientationLockAction.visible = this._sensorProxy.HasAccelerometer &&
|
||||
this._monitorManager.get_is_builtin_display_on();
|
||||
this._orientationLockAction.visible = this._sensorProxy.HasAccelerometer;
|
||||
else
|
||||
this._orientationLockAction.visible = false;
|
||||
|
||||
|
@ -156,7 +156,7 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
this.appDisplay = new AppDisplay.AppDisplay();
|
||||
this._appsPage = this._addPage(this.appDisplay.actor,
|
||||
_("Applications"), 'view-app-grid-symbolic');
|
||||
_("Applications"), 'view-grid-symbolic');
|
||||
|
||||
this._searchResults = new Search.SearchResults();
|
||||
this._searchPage = this._addPage(this._searchResults.actor,
|
||||
|
@ -677,7 +677,6 @@ const WindowManager = new Lang.Class({
|
||||
this._minimizing = [];
|
||||
this._unminimizing = [];
|
||||
this._mapping = [];
|
||||
this._resizing = [];
|
||||
this._destroying = [];
|
||||
this._movingWindow = null;
|
||||
|
||||
@ -693,7 +692,6 @@ const WindowManager = new Lang.Class({
|
||||
this._minimizeWindowDone(shellwm, actor);
|
||||
this._mapWindowDone(shellwm, actor);
|
||||
this._destroyWindowDone(shellwm, actor);
|
||||
this._sizeChangeWindowDone(shellwm, actor);
|
||||
}));
|
||||
|
||||
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
|
||||
@ -850,34 +848,22 @@ const WindowManager = new Lang.Class({
|
||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-applications',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-group',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-applications-backward',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-group-backward',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
Lang.bind(this, this._startAppSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-windows',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
Lang.bind(this, this._startWindowSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-windows-backward',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
this.setCustomKeybindingHandler('cycle-windows',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
this.setCustomKeybindingHandler('cycle-windows-backward',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
this.setCustomKeybindingHandler('cycle-group',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
this.setCustomKeybindingHandler('cycle-group-backward',
|
||||
Shell.ActionMode.NORMAL,
|
||||
Lang.bind(this, this._startSwitcher));
|
||||
Lang.bind(this, this._startWindowSwitcher));
|
||||
this.setCustomKeybindingHandler('switch-panels',
|
||||
Shell.ActionMode.NORMAL |
|
||||
Shell.ActionMode.OVERVIEW |
|
||||
@ -1232,120 +1218,9 @@ const WindowManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_sizeChangeWindow : function(shellwm, actor, whichChange, oldFrameRect, oldBufferRect) {
|
||||
let types = [Meta.WindowType.NORMAL];
|
||||
if (!this._shouldAnimateActor(actor, types)) {
|
||||
shellwm.completed_size_change(actor);
|
||||
return;
|
||||
}
|
||||
|
||||
if (whichChange == Meta.SizeChange.FULLSCREEN)
|
||||
this._fullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
|
||||
else if (whichChange == Meta.SizeChange.UNFULLSCREEN)
|
||||
this._unfullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
|
||||
else
|
||||
shellwm.completed_size_change(actor);
|
||||
},
|
||||
|
||||
_fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
|
||||
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
||||
actor.translation_x = oldFrameRect.x - monitor.x;
|
||||
actor.translation_y = oldFrameRect.y - monitor.y;
|
||||
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
|
||||
},
|
||||
|
||||
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
|
||||
let targetRect = actor.meta_window.get_frame_rect();
|
||||
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
|
||||
actor.translation_x = -(targetRect.x - monitor.x);
|
||||
actor.translation_y = -(targetRect.y - monitor.y);
|
||||
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
|
||||
},
|
||||
|
||||
_fullscreenAnimation: function(shellwm, actor, oldFrameRect) {
|
||||
this._resizing.push(actor);
|
||||
|
||||
// Position a clone of the window on top of the old position,
|
||||
// while actor updates are frozen.
|
||||
// Note that the MetaWindow has up to date sizing information for
|
||||
// the new geometry already.
|
||||
let targetRect = actor.meta_window.get_frame_rect();
|
||||
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
|
||||
let actorClone = new St.Widget({ content: actorContent });
|
||||
actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
|
||||
actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
|
||||
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
|
||||
Main.uiGroup.add_actor(actorClone);
|
||||
|
||||
actor.__fullscreenClone = actorClone;
|
||||
|
||||
let scaleX = targetRect.width / oldFrameRect.width;
|
||||
let scaleY = targetRect.height / oldFrameRect.height;
|
||||
|
||||
// Now scale and fade out the clone
|
||||
Tweener.addTween(actorClone,
|
||||
{ x: targetRect.x,
|
||||
y: targetRect.y,
|
||||
scale_x: scaleX,
|
||||
scale_y: scaleY,
|
||||
opacity: 0,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad'
|
||||
});
|
||||
|
||||
// Now set scale the actor to size it as the clone.
|
||||
// Note that the caller of this function already set a translation
|
||||
// on the actor.
|
||||
actor.scale_x = 1 / scaleX;
|
||||
actor.scale_y = 1 / scaleY;
|
||||
|
||||
// Scale it to its actual new size
|
||||
Tweener.addTween(actor,
|
||||
{ scale_x: 1.0,
|
||||
scale_y: 1.0,
|
||||
translation_x: 0,
|
||||
translation_y: 0,
|
||||
time: WINDOW_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: this._sizeChangeWindowDone,
|
||||
onCompleteScope: this,
|
||||
onCompleteParams: [shellwm, actor],
|
||||
onOverwrite: this._sizeChangeWindowOverwritten,
|
||||
onOverwriteScope: this,
|
||||
onOverwriteParams: [shellwm, actor]
|
||||
});
|
||||
|
||||
// Now unfreeze actor updates, to get it to the new size.
|
||||
// It's important that we don't wait until the animation is completed to
|
||||
// do this, otherwise our scale will be applied to the old texture size.
|
||||
shellwm.completed_size_change(actor);
|
||||
},
|
||||
|
||||
_sizeChangeWindowDone: function(shellwm, actor) {
|
||||
if (this._removeEffect(this._resizing, actor)) {
|
||||
Tweener.removeTweens(actor);
|
||||
actor.scale_x = 1.0;
|
||||
actor.scale_y = 1.0;
|
||||
actor.translation_x = 0;
|
||||
actor.translation_y = 0;
|
||||
|
||||
let actorClone = actor.__fullscreenClone;
|
||||
if (actorClone) {
|
||||
actorClone.destroy();
|
||||
delete actor.__fullscreenClone;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_sizeChangeWindowOverwritten: function(shellwm, actor) {
|
||||
if (this._removeEffect(this._resizing, actor)) {
|
||||
let actorClone = actor.__fullscreenClone;
|
||||
if (actorClone) {
|
||||
actorClone.destroy();
|
||||
delete actor.__fullscreenClone;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_hasAttachedDialogs: function(window, ignoreWindow) {
|
||||
var count = 0;
|
||||
window.foreach_transient(function(win) {
|
||||
@ -1379,14 +1254,11 @@ const WindowManager = new Lang.Class({
|
||||
let dimmer = getWindowDimmer(actor);
|
||||
if (!dimmer)
|
||||
return;
|
||||
if (this._shouldAnimate())
|
||||
Tweener.addTween(dimmer,
|
||||
{ dimFactor: 1.0,
|
||||
time: DIM_TIME,
|
||||
transition: 'linear'
|
||||
});
|
||||
else
|
||||
dimmer.dimFactor = 1.0;
|
||||
Tweener.addTween(dimmer,
|
||||
{ dimFactor: 1.0,
|
||||
time: DIM_TIME,
|
||||
transition: 'linear'
|
||||
});
|
||||
},
|
||||
|
||||
_undimWindow: function(window) {
|
||||
@ -1396,13 +1268,10 @@ const WindowManager = new Lang.Class({
|
||||
let dimmer = getWindowDimmer(actor);
|
||||
if (!dimmer)
|
||||
return;
|
||||
if (this._shouldAnimate())
|
||||
Tweener.addTween(dimmer,
|
||||
{ dimFactor: 0.0,
|
||||
time: UNDIM_TIME,
|
||||
transition: 'linear' });
|
||||
else
|
||||
dimmer.dimFactor = 0.0;
|
||||
Tweener.addTween(dimmer,
|
||||
{ dimFactor: 0.0,
|
||||
time: UNDIM_TIME,
|
||||
transition: 'linear' });
|
||||
},
|
||||
|
||||
_mapWindow : function(shellwm, actor) {
|
||||
@ -1421,9 +1290,6 @@ const WindowManager = new Lang.Class({
|
||||
actor._windowType = type;
|
||||
}));
|
||||
|
||||
if (actor.meta_window.is_attached_dialog())
|
||||
this._checkDimming(actor.get_meta_window().get_transient_for());
|
||||
|
||||
let types = [Meta.WindowType.NORMAL,
|
||||
Meta.WindowType.DIALOG,
|
||||
Meta.WindowType.MODAL_DIALOG];
|
||||
@ -1432,6 +1298,9 @@ const WindowManager = new Lang.Class({
|
||||
return;
|
||||
}
|
||||
|
||||
if (actor.meta_window.is_attached_dialog())
|
||||
this._checkDimming(actor.get_meta_window().get_transient_for());
|
||||
|
||||
switch (actor._windowType) {
|
||||
case Meta.WindowType.NORMAL:
|
||||
actor.set_pivot_point(0.5, 1.0);
|
||||
@ -1514,9 +1383,6 @@ const WindowManager = new Lang.Class({
|
||||
});
|
||||
}
|
||||
|
||||
if (window.is_attached_dialog())
|
||||
this._checkDimming(window.get_transient_for(), window);
|
||||
|
||||
let types = [Meta.WindowType.NORMAL,
|
||||
Meta.WindowType.DIALOG,
|
||||
Meta.WindowType.MODAL_DIALOG];
|
||||
@ -1551,6 +1417,7 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
if (window.is_attached_dialog()) {
|
||||
let parent = window.get_transient_for();
|
||||
this._checkDimming(parent, window);
|
||||
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
||||
Tweener.removeTweens(actor);
|
||||
this._destroyWindowDone(shellwm, actor);
|
||||
@ -1756,37 +1623,23 @@ const WindowManager = new Lang.Class({
|
||||
this._windowMenuManager.showWindowMenuForWindow(window, menu, rect);
|
||||
},
|
||||
|
||||
_startSwitcher: function(display, screen, window, binding) {
|
||||
let constructor = null;
|
||||
switch (binding.get_name()) {
|
||||
case 'switch-applications':
|
||||
case 'switch-applications-backward':
|
||||
case 'switch-group':
|
||||
case 'switch-group-backward':
|
||||
constructor = AltTab.AppSwitcherPopup;
|
||||
break;
|
||||
case 'switch-windows':
|
||||
case 'switch-windows-backward':
|
||||
constructor = AltTab.WindowSwitcherPopup;
|
||||
break;
|
||||
case 'cycle-windows':
|
||||
case 'cycle-windows-backward':
|
||||
constructor = AltTab.WindowCyclerPopup;
|
||||
break;
|
||||
case 'cycle-group':
|
||||
case 'cycle-group-backward':
|
||||
constructor = AltTab.GroupCyclerPopup;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!constructor)
|
||||
return;
|
||||
|
||||
_startAppSwitcher : function(display, screen, window, binding) {
|
||||
/* prevent a corner case where both popups show up at once */
|
||||
if (this._workspaceSwitcherPopup != null)
|
||||
this._workspaceSwitcherPopup.destroy();
|
||||
|
||||
let tabPopup = new constructor();
|
||||
let tabPopup = new AltTab.AppSwitcherPopup();
|
||||
|
||||
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
|
||||
tabPopup.destroy();
|
||||
},
|
||||
|
||||
_startWindowSwitcher : function(display, screen, window, binding) {
|
||||
/* prevent a corner case where both popups show up at once */
|
||||
if (this._workspaceSwitcherPopup != null)
|
||||
this._workspaceSwitcherPopup.destroy();
|
||||
|
||||
let tabPopup = new AltTab.WindowSwitcherPopup();
|
||||
|
||||
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
|
||||
tabPopup.destroy();
|
||||
|
@ -214,7 +214,7 @@ const WindowMenuManager = new Lang.Class({
|
||||
menu.close();
|
||||
});
|
||||
|
||||
this._sourceActor.set_size(Math.max(1, rect.width), Math.max(1, rect.height));
|
||||
this._sourceActor.set_size(rect.width, rect.height);
|
||||
this._sourceActor.set_position(rect.x, rect.y);
|
||||
this._sourceActor.show();
|
||||
|
||||
|
@ -361,9 +361,6 @@ const WindowClone = new Lang.Class({
|
||||
// a long-press canceled when the pointer movement
|
||||
// exceeds dnd-drag-threshold to manually start the drag
|
||||
if (state == Clutter.LongPressState.CANCEL) {
|
||||
let event = Clutter.get_current_event();
|
||||
this._dragTouchSequence = event.get_event_sequence();
|
||||
|
||||
// A click cancels a long-press before any click handler is
|
||||
// run - make sure to not start a drag in that case
|
||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
|
||||
@ -372,7 +369,7 @@ const WindowClone = new Lang.Class({
|
||||
return;
|
||||
let [x, y] = action.get_coords();
|
||||
action.release();
|
||||
this._draggable.startDrag(x, y, global.get_current_time(), this._dragTouchSequence);
|
||||
this._draggable.startDrag(x, y, global.get_current_time());
|
||||
}));
|
||||
}
|
||||
return true;
|
||||
|
@ -45,11 +45,11 @@ const PrimaryActorLayout = new Lang.Class({
|
||||
this.primaryActor = primaryActor;
|
||||
},
|
||||
|
||||
vfunc_get_preferred_width: function(container, forHeight) {
|
||||
vfunc_get_preferred_width: function(forHeight) {
|
||||
return this.primaryActor.get_preferred_width(forHeight);
|
||||
},
|
||||
|
||||
vfunc_get_preferred_height: function(container, forWidth) {
|
||||
vfunc_get_preferred_height: function(forWidth) {
|
||||
return this.primaryActor.get_preferred_height(forWidth);
|
||||
},
|
||||
});
|
||||
@ -80,8 +80,6 @@ const WindowClone = new Lang.Class({
|
||||
|
||||
this.actor.connect('button-release-event',
|
||||
Lang.bind(this, this._onButtonRelease));
|
||||
this.actor.connect('touch-event',
|
||||
Lang.bind(this, this._onTouchEvent));
|
||||
|
||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||
|
||||
@ -202,15 +200,6 @@ const WindowClone = new Lang.Class({
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_onTouchEvent : function (actor, event) {
|
||||
if (event.type() != Clutter.EventType.TOUCH_END ||
|
||||
!global.display.is_pointer_emulating_sequence(event.get_event_sequence()))
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
this.emit('selected', event.get_time());
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_onDragBegin : function (draggable, time) {
|
||||
this.inDrag = true;
|
||||
this.emit('drag-begin');
|
||||
@ -653,7 +642,6 @@ const ThumbnailsBox = new Lang.Class({
|
||||
|
||||
this.actor.connect('button-press-event', function() { return Clutter.EVENT_STOP; });
|
||||
this.actor.connect('button-release-event', Lang.bind(this, this._onButtonRelease));
|
||||
this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent));
|
||||
|
||||
Main.overview.connect('showing',
|
||||
Lang.bind(this, this._createThumbnails));
|
||||
@ -684,31 +672,18 @@ const ThumbnailsBox = new Lang.Class({
|
||||
global.screen.n_workspaces > 1;
|
||||
},
|
||||
|
||||
_activateThumbnailAtPoint: function (stageX, stageY, time) {
|
||||
_onButtonRelease: function(actor, event) {
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
let [r, x, y] = this.actor.transform_stage_point(stageX, stageY);
|
||||
|
||||
for (let i = 0; i < this._thumbnails.length; i++) {
|
||||
let thumbnail = this._thumbnails[i]
|
||||
let [w, h] = thumbnail.actor.get_transformed_size();
|
||||
if (y >= thumbnail.actor.y && y <= thumbnail.actor.y + h) {
|
||||
thumbnail.activate(time);
|
||||
thumbnail.activate(event.get_time());
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onButtonRelease: function(actor, event) {
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._activateThumbnailAtPoint(stageX, stageY, event.get_time());
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
||||
_onTouchEvent: function (actor, event) {
|
||||
if (event.type() == Clutter.EventType.TOUCH_END &&
|
||||
global.display.is_pointer_emulating_sequence(event.get_event_sequence())) {
|
||||
let [stageX, stageY] = event.get_coords();
|
||||
this._activateThumbnailAtPoint(stageX, stageY, event.get_time());
|
||||
}
|
||||
|
||||
return Clutter.EVENT_STOP;
|
||||
},
|
||||
|
@ -421,7 +421,7 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
// Only switch to the workspace when there's no application
|
||||
// windows open. The problem is that it's too easy to miss
|
||||
// an app window and get the wrong one focused.
|
||||
if ((action.get_button() == 1 || action.get_button() == 0) &&
|
||||
if (action.get_button() == 1 &&
|
||||
this._getPrimaryView().getActiveWorkspace().isEmpty())
|
||||
Main.overview.hide();
|
||||
}));
|
||||
|
@ -140,7 +140,7 @@
|
||||
|
||||
<para>
|
||||
<filename>/usr/share/gnome-session/sessions/gnome.session</filename>,
|
||||
<filename>/usr/share/applications/org.gnome.Shell.desktop</filename>.</para>
|
||||
<filename>/usr/share/applications/gnome-shell.desktop</filename>.</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
|
@ -24,7 +24,6 @@ fi
|
||||
fr
|
||||
fur
|
||||
ga
|
||||
gd
|
||||
gl
|
||||
gu
|
||||
he
|
||||
|
@ -2,8 +2,9 @@
|
||||
# Please keep this file sorted alphabetically.
|
||||
[encoding: UTF-8]
|
||||
data/50-gnome-shell-system.xml.in
|
||||
data/gnome-shell.desktop.in.in
|
||||
data/gnome-shell-extension-prefs.desktop.in.in
|
||||
data/org.gnome.Shell.desktop.in.in
|
||||
data/gnome-shell-wayland.desktop.in.in
|
||||
data/org.gnome.shell.gschema.xml.in.in
|
||||
data/org.gnome.Shell.PortalHelper.desktop.in
|
||||
js/extensionPrefs/main.js
|
||||
@ -14,7 +15,6 @@ js/misc/util.js
|
||||
js/portalHelper/main.js
|
||||
js/ui/appDisplay.js
|
||||
js/ui/appFavorites.js
|
||||
js/ui/audioDeviceSelection.js
|
||||
js/ui/backgroundMenu.js
|
||||
js/ui/calendar.js
|
||||
js/ui/components/automountManager.js
|
||||
@ -33,9 +33,7 @@ js/ui/keyboard.js
|
||||
js/ui/legacyTray.js
|
||||
js/ui/lookingGlass.js
|
||||
js/ui/main.js
|
||||
js/ui/messageList.js
|
||||
js/ui/messageTray.js
|
||||
js/ui/mpris.js
|
||||
js/ui/notificationDaemon.js
|
||||
js/ui/overviewControls.js
|
||||
js/ui/overview.js
|
||||
|
372
po/ca.po
372
po/ca.po
@ -3,23 +3,22 @@
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
# Siegfried-Angel Gevatter Pujals <rainct@ubuntu.com>, 2009.
|
||||
# Jordi Serratosa <jordis@softcatala.cat>, 2012.
|
||||
# Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2013, 2014, 2016.
|
||||
# Gil Forcada <gilforcada@guifi.net>, 2010, 2011, 2013, 2014.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: HEAD\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-03-13 10:20+0000\n"
|
||||
"PO-Revision-Date: 2016-03-13 14:47+0100\n"
|
||||
"Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-08-20 19:24+0200\n"
|
||||
"PO-Revision-Date: 2015-05-28 19:32+0100\n"
|
||||
"Last-Translator: David Medina <opensusecatala@gmail.com>\n"
|
||||
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bits\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Gtranslator 2.91.6\n"
|
||||
"X-Generator: Poedit 1.6.9\n"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:1
|
||||
msgid "System"
|
||||
@ -45,6 +44,15 @@ msgstr "Mostra totes les aplicacions"
|
||||
msgid "Open the application menu"
|
||||
msgstr "Obre el menú d'aplicació"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gestor de finestres i llançador d'aplicacions"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Extension Preferences"
|
||||
msgstr "Preferències de les extensions del GNOME Shell"
|
||||
@ -53,13 +61,9 @@ msgstr "Preferències de les extensions del GNOME Shell"
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
msgstr "Configureu les extensions del GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Gestor de finestres i llançador d'aplicacions"
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
|
||||
msgid "GNOME Shell (wayland compositor)"
|
||||
msgstr "GNOME Shell (composició mitjançant Wayland)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
@ -172,97 +176,78 @@ msgstr ""
|
||||
"de verificació."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"Whether the default Bluetooth adapter had set up devices associated to it"
|
||||
msgstr ""
|
||||
"Si l'adaptador de Bluetooth predeterminat té dispositius configurats "
|
||||
"associats"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid ""
|
||||
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
|
||||
"powered, or if there were devices set up associated with the default "
|
||||
"adapter. This will be reset if the default adapter is ever seen not to have "
|
||||
"devices associated to it."
|
||||
msgstr ""
|
||||
"El Shell només mostrà una entrada de menú Bluetooth si un adaptador Bluetooh "
|
||||
"està engegat, o si hi ha dispositius configurats associats a l'adaptador "
|
||||
"predeterminat. Això es reiniciarà si l'adaptador predeterminat té "
|
||||
"dispositius associats."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Mostra el número de la setmana al calendari"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Si és «true» (cert) es mostra el número de la setmana al calendari."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Vinculació per obrir el menú d'aplicació"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "La vinculació per obrir el menú d'aplicació."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Vinculació per obrir la vista «Mostra les aplicacions»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Vinculació per obrir la vista «Mostra les aplicacions» de les activitats de "
|
||||
"la vista general."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Vinculació per obrir la vista general"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Vinculació per obrir la vista general d'activitats."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the notification list"
|
||||
msgstr ""
|
||||
"La vinculació per commutar la visibilitat de la llista de notificacions"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the visibility of the notification list."
|
||||
msgstr ""
|
||||
"La vinculació per commutar la visibilitat de la llista de notificacions."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Vinculació per posar el focus a la notificació activa"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Vinculació per posar el focus a la notificació activa."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid ""
|
||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||
msgstr ""
|
||||
"Vinculació que fa una pausa i continua tots els «tweens» en execució, per "
|
||||
"motius de depuració"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Quin tipus de teclat s'ha d'utilitzar"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "El tipus de teclat que s'utilitzarà."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Limita el canviador a l'espai de treball actual."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@ -271,11 +256,11 @@ msgstr ""
|
||||
"de treball actual es mostren en el canviador. En cas contrari es mostren "
|
||||
"totes les aplicacions."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The application icon mode."
|
||||
msgstr "El mode d'icona de les aplicacions."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@ -286,7 +271,7 @@ msgstr ""
|
||||
"icon-only» (mostra la icona de l'aplicació) o «both» (ambdues coses: mostra "
|
||||
"la miniatura de la finestra i la icona de l'aplicació)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@ -294,32 +279,32 @@ msgstr ""
|
||||
"Si és «true» (cert), només les finestres de l'espai de treball actual es "
|
||||
"mostren en el canviador. En cas contrari, es mostren totes les finestres."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Adjunta el diàleg modal a la finestra pare"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Si s'executa el GNOME Shell, aquesta clau sobreescriu la clau «org.gnome."
|
||||
"mutter»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Habilita la tesselització a les vores en deixar anar les finestres a les "
|
||||
"vores de la pantalla"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Els espais de treball es gestionen dinàmicament"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Només en el monitor principal hi ha espais de treball"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
msgstr ""
|
||||
"Retarda el canvi del focus, quan s'està en mode ratolí, fins que el punter "
|
||||
@ -329,52 +314,51 @@ msgstr ""
|
||||
msgid "Network Login"
|
||||
msgstr "Inici de sessió de la xarxa"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:117
|
||||
#: ../js/extensionPrefs/main.js:122
|
||||
#, javascript-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:149
|
||||
#: ../js/extensionPrefs/main.js:154
|
||||
msgid "GNOME Shell Extensions"
|
||||
msgstr "Extensions del GNOME Shell"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
|
||||
#: ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:916
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel·la"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
|
||||
#: ../js/gdm/authPrompt.js:448
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
|
||||
#: ../js/gdm/authPrompt.js:435
|
||||
msgid "Next"
|
||||
msgstr "Següent"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/ui/unlockDialog.js:59
|
||||
msgid "Unlock"
|
||||
msgstr "Desbloqueja"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:214
|
||||
#: ../js/gdm/authPrompt.js:213
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Entra"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:285
|
||||
#: ../js/gdm/loginDialog.js:281
|
||||
msgid "Choose Session"
|
||||
msgstr "Trieu la sessió"
|
||||
|
||||
#. 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:435
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "No esteu llistat?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:854
|
||||
#: ../js/gdm/loginDialog.js:847
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(p. ex. l'usuari o %s)"
|
||||
@ -382,12 +366,12 @@ msgstr "(p. ex. l'usuari o %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:859 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/ui/components/networkAgent.js:289
|
||||
msgid "Username: "
|
||||
msgstr "Nom d'usuari:"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1196
|
||||
#: ../js/gdm/loginDialog.js:1181
|
||||
msgid "Login Window"
|
||||
msgstr "Finestra d'entrada"
|
||||
|
||||
@ -523,36 +507,16 @@ msgstr "Afegeix als preferits"
|
||||
msgid "Show Details"
|
||||
msgstr "Mostra els detalls"
|
||||
|
||||
#: ../js/ui/appFavorites.js:134
|
||||
#: ../js/ui/appFavorites.js:132
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "S'ha afegit %s als preferits."
|
||||
|
||||
#: ../js/ui/appFavorites.js:168
|
||||
#: ../js/ui/appFavorites.js:166
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "S'ha suprimit %s dels preferits."
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:59
|
||||
msgid "Select Audio Device"
|
||||
msgstr "Seleccioneu dispositiu d'àudio"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:69
|
||||
msgid "Sound Settings"
|
||||
msgstr "Paràmetres del so"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:78
|
||||
msgid "Headphones"
|
||||
msgstr "Auriculars"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:80
|
||||
msgid "Headset"
|
||||
msgstr "Auriculars amb micròfon"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Micròfon"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19
|
||||
msgid "Change Background…"
|
||||
msgstr "Canvia el fons de l'escriptori…"
|
||||
@ -561,12 +525,13 @@ msgstr "Canvia el fons de l'escriptori…"
|
||||
msgid "Display Settings"
|
||||
msgstr "Paràmetres de la pantalla"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
|
||||
#: ../js/ui/status/system.js:366
|
||||
msgid "Settings"
|
||||
msgstr "Paràmetres"
|
||||
|
||||
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
|
||||
#: ../js/ui/calendar.js:47
|
||||
#: ../js/ui/calendar.js:55
|
||||
msgctxt "calendar-no-work"
|
||||
msgid "06"
|
||||
msgstr "06"
|
||||
@ -576,96 +541,94 @@ msgstr "06"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#: ../js/ui/calendar.js:76
|
||||
#: ../js/ui/calendar.js:84
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "Dg"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:78
|
||||
#: ../js/ui/calendar.js:86
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "Dl"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:80
|
||||
#: ../js/ui/calendar.js:88
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "Dt"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:82
|
||||
#: ../js/ui/calendar.js:90
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "Dc"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:84
|
||||
#: ../js/ui/calendar.js:92
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "Dj"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:86
|
||||
#: ../js/ui/calendar.js:94
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "Dv"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:88
|
||||
#: ../js/ui/calendar.js:96
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "Ds"
|
||||
|
||||
#: ../js/ui/calendar.js:416
|
||||
#: ../js/ui/calendar.js:566
|
||||
msgid "Previous month"
|
||||
msgstr "Mes anterior"
|
||||
|
||||
#: ../js/ui/calendar.js:426
|
||||
#: ../js/ui/calendar.js:576
|
||||
msgid "Next month"
|
||||
msgstr "Mes següent"
|
||||
|
||||
#: ../js/ui/calendar.js:579
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: ../js/ui/calendar.js:634
|
||||
#: ../js/ui/calendar.js:783
|
||||
msgid "Week %V"
|
||||
msgstr "Setmana %V"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: ../js/ui/calendar.js:695
|
||||
#: ../js/ui/calendar.js:1188
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Tot el dia"
|
||||
|
||||
#: ../js/ui/calendar.js:821
|
||||
#: ../js/ui/calendar.js:1291
|
||||
msgid "Clear section"
|
||||
msgstr "Neteja la secció"
|
||||
|
||||
#: ../js/ui/calendar.js:1518
|
||||
msgid "Events"
|
||||
msgstr "Cites"
|
||||
|
||||
#: ../js/ui/calendar.js:830
|
||||
#: ../js/ui/calendar.js:1527
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A %d de %B"
|
||||
|
||||
#: ../js/ui/calendar.js:834
|
||||
#: ../js/ui/calendar.js:1531
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A %d de %B de %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:919
|
||||
#: ../js/ui/calendar.js:1616
|
||||
msgid "Notifications"
|
||||
msgstr "Notificacions"
|
||||
|
||||
#: ../js/ui/calendar.js:1070
|
||||
#: ../js/ui/calendar.js:1767
|
||||
msgid "No Notifications"
|
||||
msgstr "Cap notificació"
|
||||
|
||||
#: ../js/ui/calendar.js:1073
|
||||
#: ../js/ui/calendar.js:1770
|
||||
msgid "No Events"
|
||||
msgstr "Cap cita"
|
||||
|
||||
@ -677,7 +640,7 @@ msgstr "S'ha connectat un dispositiu extern"
|
||||
msgid "External drive disconnected"
|
||||
msgstr "S'ha desconnectat un dispositiu extern"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:355
|
||||
#: ../js/ui/components/autorunManager.js:354
|
||||
#, javascript-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Obre amb %s"
|
||||
@ -993,11 +956,11 @@ msgid "Keyboard"
|
||||
msgstr "Teclat"
|
||||
|
||||
#. translators: 'Hide' is a verb
|
||||
#: ../js/ui/legacyTray.js:65
|
||||
#: ../js/ui/legacyTray.js:66
|
||||
msgid "Hide tray"
|
||||
msgstr "Oculta la Safata"
|
||||
|
||||
#: ../js/ui/legacyTray.js:106
|
||||
#: ../js/ui/legacyTray.js:107
|
||||
msgid "Status Icons"
|
||||
msgstr "Icones d'estat"
|
||||
|
||||
@ -1025,7 +988,7 @@ msgstr "Habilitat"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Inhabilitat"
|
||||
|
||||
@ -1049,26 +1012,10 @@ msgstr "Mostra el codi font"
|
||||
msgid "Web Page"
|
||||
msgstr "Pàgina web"
|
||||
|
||||
#: ../js/ui/messageList.js:543
|
||||
msgid "Clear section"
|
||||
msgstr "Neteja la secció"
|
||||
|
||||
#: ../js/ui/messageTray.js:1486
|
||||
msgid "System Information"
|
||||
msgstr "Informació de l'ordinador"
|
||||
|
||||
#: ../js/ui/mpris.js:194
|
||||
msgid "Unknown artist"
|
||||
msgstr "Artista desconegut"
|
||||
|
||||
#: ../js/ui/mpris.js:195
|
||||
msgid "Unknown title"
|
||||
msgstr "Títol desconegut"
|
||||
|
||||
#: ../js/ui/mpris.js:217
|
||||
msgid "Media"
|
||||
msgstr "Multimèdia"
|
||||
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "Desfés"
|
||||
@ -1085,22 +1032,17 @@ msgstr "Vista general"
|
||||
msgid "Type to search…"
|
||||
msgstr "Teclegeu per cercar…"
|
||||
|
||||
#: ../js/ui/panel.js:358
|
||||
#: ../js/ui/panel.js:352
|
||||
msgid "Quit"
|
||||
msgstr "Surt"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:414
|
||||
#: ../js/ui/panel.js:404
|
||||
msgid "Activities"
|
||||
msgstr "Activitats"
|
||||
|
||||
#: ../js/ui/panel.js:695
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: ../js/ui/panel.js:807
|
||||
#: ../js/ui/panel.js:754
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
@ -1113,15 +1055,15 @@ msgstr "Barra superior"
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:71
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
msgstr "Introduïu una ordre"
|
||||
|
||||
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162
|
||||
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
|
||||
msgid "Close"
|
||||
msgstr "Tanca"
|
||||
|
||||
#: ../js/ui/runDialog.js:282
|
||||
#: ../js/ui/runDialog.js:281
|
||||
msgid "Restarting…"
|
||||
msgstr "S'està reiniciant…"
|
||||
|
||||
@ -1244,41 +1186,29 @@ msgstr "Alt contrast"
|
||||
msgid "Large Text"
|
||||
msgstr "Text gran"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:47
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Desactiva"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:56
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Paràmetres del Bluetooth"
|
||||
|
||||
#. Translators: this is the number of connected bluetooth devices
|
||||
#: ../js/ui/status/bluetooth.js:136
|
||||
#: ../js/ui/status/bluetooth.js:105
|
||||
#, javascript-format
|
||||
msgid "%d Connected"
|
||||
msgid_plural "%d Connected"
|
||||
msgstr[0] "%d connectat"
|
||||
msgstr[1] "%d connectats"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:138
|
||||
msgid "Off"
|
||||
msgstr "Desactivat"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:140
|
||||
#: ../js/ui/status/bluetooth.js:107
|
||||
msgid "Not In Use"
|
||||
msgstr "No s'usa"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Activa"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Desactiva"
|
||||
|
||||
#: ../js/ui/status/brightness.js:44
|
||||
msgid "Brightness"
|
||||
msgstr "Brillantor"
|
||||
@ -1287,50 +1217,30 @@ msgstr "Brillantor"
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Mostra la disposició del teclat"
|
||||
|
||||
#: ../js/ui/status/location.js:107 ../js/ui/status/location.js:215
|
||||
#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177
|
||||
msgid "Location Enabled"
|
||||
msgstr "Ubicació habilitada"
|
||||
|
||||
#: ../js/ui/status/location.js:108 ../js/ui/status/location.js:216
|
||||
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178
|
||||
msgid "Disable"
|
||||
msgstr "Inhabilita"
|
||||
|
||||
#: ../js/ui/status/location.js:109
|
||||
#: ../js/ui/status/location.js:73
|
||||
msgid "Privacy Settings"
|
||||
msgstr "Paràmetres de privacitat"
|
||||
|
||||
#: ../js/ui/status/location.js:214
|
||||
#: ../js/ui/status/location.js:176
|
||||
msgid "Location In Use"
|
||||
msgstr "Ubicació en ús"
|
||||
|
||||
#: ../js/ui/status/location.js:218
|
||||
#: ../js/ui/status/location.js:180
|
||||
msgid "Location Disabled"
|
||||
msgstr "Ubicació inhabilitada"
|
||||
|
||||
#: ../js/ui/status/location.js:219
|
||||
#: ../js/ui/status/location.js:181
|
||||
msgid "Enable"
|
||||
msgstr "Habilita"
|
||||
|
||||
#: ../js/ui/status/location.js:426
|
||||
msgid "Deny Access"
|
||||
msgstr "Denega l'accés"
|
||||
|
||||
#: ../js/ui/status/location.js:429
|
||||
msgid "Grant Access"
|
||||
msgstr "Permetre l'accés"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: ../js/ui/status/location.js:435
|
||||
#, javascript-format
|
||||
msgid "Give %s access to your location?"
|
||||
msgstr "Voleu donar a %s accés a la vostra ubicació?"
|
||||
|
||||
#: ../js/ui/status/location.js:437
|
||||
msgid "Location access can be changed at any time from the privacy settings."
|
||||
msgstr ""
|
||||
"Podeu canviar la configuració de l'accés a la ubicació sempre que vulgueu "
|
||||
"des del la configuració de la privacitat."
|
||||
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
msgstr "<desconegut>"
|
||||
@ -1466,6 +1376,10 @@ msgstr "Trieu una xarxa"
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Paràmetres del sense fil"
|
||||
|
||||
#: ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Activa"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: ../js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
@ -1515,36 +1429,31 @@ msgstr "Ha fallat la connexió"
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Ha fallat l'activació de la connexió de xarxa"
|
||||
|
||||
#: ../js/ui/status/power.js:61
|
||||
#: ../js/ui/status/power.js:49
|
||||
msgid "Power Settings"
|
||||
msgstr "Paràmetres d'energia"
|
||||
|
||||
#: ../js/ui/status/power.js:77
|
||||
#: ../js/ui/status/power.js:65
|
||||
msgid "Fully Charged"
|
||||
msgstr "Totalment carregada"
|
||||
|
||||
#. 0 is reported when UPower does not have enough data
|
||||
#. to estimate battery life
|
||||
#: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90
|
||||
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
|
||||
msgid "Estimating…"
|
||||
msgstr "S'està estimant la durada…"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
#: ../js/ui/status/power.js:98
|
||||
#: ../js/ui/status/power.js:86
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Remaining (%d %%)"
|
||||
msgstr "%d∶%02d Queda (%d %%)"
|
||||
msgid "%d∶%02d Remaining (%d%%)"
|
||||
msgstr "%d∶%02d Queda (%d%%)"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
#: ../js/ui/status/power.js:103
|
||||
#: ../js/ui/status/power.js:91
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Until Full (%d %%)"
|
||||
msgstr "%d∶%02d Fins que estigui del tot carregada (%d %%)"
|
||||
|
||||
#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133
|
||||
#, javascript-format
|
||||
msgid "%d %%"
|
||||
msgstr "%d %%"
|
||||
msgid "%d∶%02d Until Full (%d%%)"
|
||||
msgstr "%d∶%02d Fins que estigui del tot carregada (%d%%)"
|
||||
|
||||
#. The menu only appears when airplane mode is on, so just
|
||||
#. statically build it as if it was on, rather than dynamically
|
||||
@ -1585,6 +1494,10 @@ msgstr "S'ha canviat el volum"
|
||||
msgid "Volume"
|
||||
msgstr "Volum"
|
||||
|
||||
#: ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Micròfon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:67
|
||||
msgid "Log in as another user"
|
||||
msgstr "Entra amb un altre usuari"
|
||||
@ -1705,7 +1618,7 @@ msgstr "Calendari de l'Evolution"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1835
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@ -1714,66 +1627,66 @@ msgstr[1] "%u sortides"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1845
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u entrada"
|
||||
msgstr[1] "%u entrades"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
#: ../src/gvc/gvc-mixer-control.c:2373
|
||||
msgid "System Sounds"
|
||||
msgstr "Sons del sistema"
|
||||
|
||||
#: ../src/main.c:381
|
||||
#: ../src/main.c:373
|
||||
msgid "Print version"
|
||||
msgstr "Mostra la versió"
|
||||
|
||||
#: ../src/main.c:387
|
||||
#: ../src/main.c:379
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "El mode que utilitzarà el GDM per a la pantalla d'entrada"
|
||||
|
||||
#: ../src/main.c:393
|
||||
#: ../src/main.c:385
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Utilitza un mode específic, p. ex. «gdm» per la pantalla d'entrada"
|
||||
|
||||
#: ../src/main.c:399
|
||||
#: ../src/main.c:391
|
||||
msgid "List possible modes"
|
||||
msgstr "Llista els modes possibles"
|
||||
|
||||
#: ../src/shell-app.c:246
|
||||
#: ../src/shell-app.c:239
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconegut"
|
||||
|
||||
#: ../src/shell-app.c:487
|
||||
#: ../src/shell-app.c:480
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "No s'ha pogut iniciar «%s»"
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:730
|
||||
#: ../src/shell-keyring-prompt.c:742
|
||||
msgid "Passwords do not match."
|
||||
msgstr "Les contrasenyes no coincideixen."
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:738
|
||||
#: ../src/shell-keyring-prompt.c:750
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "La contrasenya no pot ser buida"
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:353
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "L'usuari ha descartat el diàleg d'autenticació"
|
||||
|
||||
#~ msgid "%s is requesting access to your location."
|
||||
#~ msgstr "%s està demanant accés a la vostra ubicació."
|
||||
|
||||
#~ msgid "GNOME Shell (wayland compositor)"
|
||||
#~ msgstr "GNOME Shell (composició mitjançant Wayland)"
|
||||
#~ msgid "Bluetooth"
|
||||
#~ msgstr "Bluetooth"
|
||||
|
||||
#~ msgid "%d Connected Device"
|
||||
#~ msgid_plural "%d Connected Devices"
|
||||
#~ msgstr[0] "%d dispositiu connectat"
|
||||
#~ msgstr[1] "%d dispositius connectats"
|
||||
|
||||
#~ msgid "Off"
|
||||
#~ msgstr "Desactivat"
|
||||
|
||||
#~ msgid "Authentication required"
|
||||
#~ msgstr "Cal autenticació"
|
||||
|
||||
@ -1982,6 +1895,9 @@ msgstr "L'usuari ha descartat el diàleg d'autenticació"
|
||||
#~ msgid "View account"
|
||||
#~ msgstr "Mostra el compte"
|
||||
|
||||
#~ msgid "Unknown reason"
|
||||
#~ msgstr "Motiu desconegut"
|
||||
|
||||
#~ msgid "Open Calendar"
|
||||
#~ msgstr "Obre el calendari"
|
||||
|
||||
|
378
po/gl.po
378
po/gl.po
@ -6,22 +6,21 @@
|
||||
# Antón Méixome <meixome@certima.net>, 2009.
|
||||
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
|
||||
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
|
||||
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016.
|
||||
#
|
||||
# Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-03-12 13:15+0100\n"
|
||||
"PO-Revision-Date: 2016-03-12 13:16+0100\n"
|
||||
"POT-Creation-Date: 2015-08-26 00:05+0200\n"
|
||||
"PO-Revision-Date: 2015-08-26 00:10+0200\n"
|
||||
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
|
||||
"Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
|
||||
"Language-Team: gnome-l10n-gl@gnome.org\n"
|
||||
"Language: gl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Gtranslator 2.91.7\n"
|
||||
"X-Generator: Virtaal 0.7.1\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:1
|
||||
@ -48,6 +47,15 @@ msgstr "Mostrar todos os aplicativos"
|
||||
msgid "Open the application menu"
|
||||
msgstr "Abrir o menú de aplicativo"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Xestor de xanelas e inicio de aplicativos"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Extension Preferences"
|
||||
msgstr "Preferencias das extensións de GNOME Shell"
|
||||
@ -56,13 +64,9 @@ msgstr "Preferencias das extensións de GNOME Shell"
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
msgstr "Configure as extensións de GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Xestor de xanelas e inicio de aplicativos"
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
|
||||
msgid "GNOME Shell (wayland compositor)"
|
||||
msgstr "GNOME Shell (compositor de wayland)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
@ -170,95 +174,76 @@ msgstr ""
|
||||
"estado por omisión da opción. "
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"Whether the default Bluetooth adapter had set up devices associated to it"
|
||||
msgstr ""
|
||||
"Indica se o adaptador de Bluetooth por omisión ten configurados dispositivos "
|
||||
"asociados a el"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid ""
|
||||
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
|
||||
"powered, or if there were devices set up associated with the default "
|
||||
"adapter. This will be reset if the default adapter is ever seen not to have "
|
||||
"devices associated to it."
|
||||
msgstr ""
|
||||
"O shell só mostrará o elemento de menú de Bluetooth se hai un adaptador de "
|
||||
"Bluetooth conectado ou se houbera dispositivos asociados co adaptador "
|
||||
"principal. Isto restabelecerase se o adaptador por omisión non se ve ou non "
|
||||
"ten dispositivos asociados a el."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Mostrar a data da semana no calendario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Se é verdadeiro, móstrase a data da semana ISO no calendario."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Combinación de teclas para abrir o menú de aplicativo"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Combinación de teclas para abrir o menú de aplicativo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Combinación de teclas para abrir a vista «Mostrar aplicativos»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Combinación de teclas para abrir a vista \"Mostrar aplicativos\" da Vista "
|
||||
"xera de Actividades."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Combinación de teclas para abrir a Vista xeral"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Combinación de teclas para abrir a Vista de actividades."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the notification list"
|
||||
msgstr ""
|
||||
"Combinación de teclas para trocar a visibilidade da área de notificacións"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the visibility of the notification list."
|
||||
msgstr ""
|
||||
"Combinación de teclas para trocar a visibilidade da área de notificacións."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Combinación de teclas para enfocar a notificación activa"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Combinación de teclas para enfocar a notificación activa."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid ""
|
||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||
msgstr "Atallo de teclado que pausa e reinicia todo os xemelgos executándose."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Que teclado usar"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "O tipo de teclado a usar."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Restrinxir o trocador ao espazo de traballo actual."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@ -266,11 +251,11 @@ msgstr ""
|
||||
"Se é verdadeiro, só se mostran no trocador os aplicativos que teñen xanelas "
|
||||
"no espazo de traballo actual. Doutra maneira inclúense todos os aplicativos."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The application icon mode."
|
||||
msgstr "O modo da icona do aplicativo."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@ -280,7 +265,7 @@ msgstr ""
|
||||
"son «thumbnail-only» (mostra unha miniatura da xanela, «app-icon-only» (só "
|
||||
"mostra a icona do aplicativo) ou «both» (móstranse ambas cosas)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@ -288,29 +273,29 @@ msgstr ""
|
||||
"Se é verdadeiro, só se mostrarán no trocador as xanelas do espazo de "
|
||||
"traballo actual. Doutra maneira inclúense todos os aplicativos."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Anexar o diálogo modal á xanela pai"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Esta chave sobrescribe a chave en org.gnome.mutter cando executa GNOME Shell."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Activar o mosaico nos bordos ao arrastrar xanelas aos bordos da xanela"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Os espazos de traballo xestiónanse dinamicamente"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Espazos de traballo só no monitor primario"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare"
|
||||
|
||||
@ -318,52 +303,51 @@ msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare"
|
||||
msgid "Network Login"
|
||||
msgstr "Inicio de sesión en rede"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:117
|
||||
#: ../js/extensionPrefs/main.js:122
|
||||
#, javascript-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "Produciuse un erro ao cargar o diálogo de preferenzas para %s:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:149
|
||||
#: ../js/extensionPrefs/main.js:154
|
||||
msgid "GNOME Shell Extensions"
|
||||
msgstr "Extensións de GNOME Shell"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
|
||||
#: ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:916
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
|
||||
#: ../js/gdm/authPrompt.js:448
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
|
||||
#: ../js/gdm/authPrompt.js:435
|
||||
msgid "Next"
|
||||
msgstr "Seguinte"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/ui/unlockDialog.js:59
|
||||
msgid "Unlock"
|
||||
msgstr "Desbloquear"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:214
|
||||
#: ../js/gdm/authPrompt.js:213
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Iniciar sesión"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:285
|
||||
#: ../js/gdm/loginDialog.js:281
|
||||
msgid "Choose Session"
|
||||
msgstr "Escolla unha sesión"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:435
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "Non está na lista?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:854
|
||||
#: ../js/gdm/loginDialog.js:847
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(p.ex., usuario ou %s)"
|
||||
@ -371,12 +355,12 @@ msgstr "(p.ex., usuario ou %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:859 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/ui/components/networkAgent.js:289
|
||||
msgid "Username: "
|
||||
msgstr "Nome de usuario: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1196
|
||||
#: ../js/gdm/loginDialog.js:1181
|
||||
msgid "Login Window"
|
||||
msgstr "Xanela de inicio de sesión"
|
||||
|
||||
@ -512,36 +496,16 @@ msgstr "Engadir aos favoritos"
|
||||
msgid "Show Details"
|
||||
msgstr "Mostrar detalles"
|
||||
|
||||
#: ../js/ui/appFavorites.js:134
|
||||
#: ../js/ui/appFavorites.js:132
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s foi engadido aos seus favoritos."
|
||||
|
||||
#: ../js/ui/appFavorites.js:168
|
||||
#: ../js/ui/appFavorites.js:166
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s retirouse dos seus marcadores."
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:59
|
||||
msgid "Select Audio Device"
|
||||
msgstr "Seleccionar dispositivo de son"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:69
|
||||
msgid "Sound Settings"
|
||||
msgstr "Preferencias de son"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:78
|
||||
msgid "Headphones"
|
||||
msgstr "Cascos auriculares"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:80
|
||||
msgid "Headset"
|
||||
msgstr "Auriculares"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Micrófono"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19
|
||||
msgid "Change Background…"
|
||||
msgstr "Cambiar fondo de escritorio…"
|
||||
@ -550,12 +514,13 @@ msgstr "Cambiar fondo de escritorio…"
|
||||
msgid "Display Settings"
|
||||
msgstr "Preferencias da pantalla"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
|
||||
#: ../js/ui/status/system.js:366
|
||||
msgid "Settings"
|
||||
msgstr "Preferencias"
|
||||
|
||||
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
|
||||
#: ../js/ui/calendar.js:47
|
||||
#: ../js/ui/calendar.js:55
|
||||
msgctxt "calendar-no-work"
|
||||
msgid "06"
|
||||
msgstr "06"
|
||||
@ -565,96 +530,94 @@ msgstr "06"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#: ../js/ui/calendar.js:76
|
||||
#: ../js/ui/calendar.js:84
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "D"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:78
|
||||
#: ../js/ui/calendar.js:86
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "L"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:80
|
||||
#: ../js/ui/calendar.js:88
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "M"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:82
|
||||
#: ../js/ui/calendar.js:90
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "W"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:84
|
||||
#: ../js/ui/calendar.js:92
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "X"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:86
|
||||
#: ../js/ui/calendar.js:94
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "V"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:88
|
||||
#: ../js/ui/calendar.js:96
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
#: ../js/ui/calendar.js:416
|
||||
#: ../js/ui/calendar.js:566
|
||||
msgid "Previous month"
|
||||
msgstr "Anterior mes"
|
||||
|
||||
#: ../js/ui/calendar.js:426
|
||||
#: ../js/ui/calendar.js:576
|
||||
msgid "Next month"
|
||||
msgstr "Seguinte mes"
|
||||
|
||||
#: ../js/ui/calendar.js:579
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: ../js/ui/calendar.js:634
|
||||
#: ../js/ui/calendar.js:783
|
||||
msgid "Week %V"
|
||||
msgstr "Semana %V"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: ../js/ui/calendar.js:695
|
||||
#: ../js/ui/calendar.js:1188
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Todo o día"
|
||||
|
||||
#: ../js/ui/calendar.js:821
|
||||
#: ../js/ui/calendar.js:1291
|
||||
msgid "Clear section"
|
||||
msgstr "Limpar sección"
|
||||
|
||||
#: ../js/ui/calendar.js:1518
|
||||
msgid "Events"
|
||||
msgstr "Eventos"
|
||||
|
||||
#: ../js/ui/calendar.js:830
|
||||
#: ../js/ui/calendar.js:1527
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d de %B"
|
||||
|
||||
#: ../js/ui/calendar.js:834
|
||||
#: ../js/ui/calendar.js:1531
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d de %B de %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:919
|
||||
#: ../js/ui/calendar.js:1616
|
||||
msgid "Notifications"
|
||||
msgstr "Notificacións"
|
||||
|
||||
#: ../js/ui/calendar.js:1070
|
||||
#: ../js/ui/calendar.js:1767
|
||||
msgid "No Notifications"
|
||||
msgstr "Non hai notificacións"
|
||||
|
||||
#: ../js/ui/calendar.js:1073
|
||||
#: ../js/ui/calendar.js:1770
|
||||
msgid "No Events"
|
||||
msgstr "Non hai eventos"
|
||||
|
||||
@ -666,7 +629,7 @@ msgstr "Unidade externa conectada"
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Unidade externa desconectada"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:355
|
||||
#: ../js/ui/components/autorunManager.js:354
|
||||
#, javascript-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Abrir con %s"
|
||||
@ -978,11 +941,11 @@ msgid "Keyboard"
|
||||
msgstr "Teclado"
|
||||
|
||||
#. translators: 'Hide' is a verb
|
||||
#: ../js/ui/legacyTray.js:65
|
||||
#: ../js/ui/legacyTray.js:66
|
||||
msgid "Hide tray"
|
||||
msgstr "Ocultar bandexa"
|
||||
|
||||
#: ../js/ui/legacyTray.js:106
|
||||
#: ../js/ui/legacyTray.js:107
|
||||
msgid "Status Icons"
|
||||
msgstr "Iconas de estado"
|
||||
|
||||
@ -1010,7 +973,7 @@ msgstr "Activado"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Desactivado"
|
||||
|
||||
@ -1034,26 +997,10 @@ msgstr "Ver fonte"
|
||||
msgid "Web Page"
|
||||
msgstr "Páxina web"
|
||||
|
||||
#: ../js/ui/messageList.js:543
|
||||
msgid "Clear section"
|
||||
msgstr "Limpar sección"
|
||||
|
||||
#: ../js/ui/messageTray.js:1486
|
||||
msgid "System Information"
|
||||
msgstr "Información do sistema"
|
||||
|
||||
#: ../js/ui/mpris.js:194
|
||||
msgid "Unknown artist"
|
||||
msgstr "Artista descoñecido"
|
||||
|
||||
#: ../js/ui/mpris.js:195
|
||||
msgid "Unknown title"
|
||||
msgstr "Título descoñecido"
|
||||
|
||||
#: ../js/ui/mpris.js:217
|
||||
msgid "Media"
|
||||
msgstr "Multimedia"
|
||||
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "Desfacer"
|
||||
@ -1070,22 +1017,17 @@ msgstr "Vista xeral"
|
||||
msgid "Type to search…"
|
||||
msgstr "Escriba para buscar…"
|
||||
|
||||
#: ../js/ui/panel.js:358
|
||||
#: ../js/ui/panel.js:352
|
||||
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:414
|
||||
#: ../js/ui/panel.js:404
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#: ../js/ui/panel.js:695
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Sistema"
|
||||
|
||||
#: ../js/ui/panel.js:807
|
||||
#: ../js/ui/panel.js:754
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
@ -1098,15 +1040,15 @@ msgstr "Barra superior"
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:71
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
msgstr "Escriba unha orde"
|
||||
|
||||
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162
|
||||
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
|
||||
msgid "Close"
|
||||
msgstr "Pechar"
|
||||
|
||||
#: ../js/ui/runDialog.js:282
|
||||
#: ../js/ui/runDialog.js:281
|
||||
msgid "Restarting…"
|
||||
msgstr "Restimando…"
|
||||
|
||||
@ -1229,41 +1171,29 @@ msgstr "Contraste alto"
|
||||
msgid "Large Text"
|
||||
msgstr "Texto grande"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:47
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Apagar"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:56
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Preferencias do Bluetooth"
|
||||
|
||||
#. Translators: this is the number of connected bluetooth devices
|
||||
#: ../js/ui/status/bluetooth.js:136
|
||||
#: ../js/ui/status/bluetooth.js:105
|
||||
#, javascript-format
|
||||
msgid "%d Connected"
|
||||
msgid_plural "%d Connected"
|
||||
msgstr[0] "%d conectado"
|
||||
msgstr[1] "%d conectados"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:138
|
||||
msgid "Off"
|
||||
msgstr "Desactivar"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:140
|
||||
#: ../js/ui/status/bluetooth.js:107
|
||||
msgid "Not In Use"
|
||||
msgstr "Non está en uso"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Activar"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Apagar"
|
||||
|
||||
#: ../js/ui/status/brightness.js:44
|
||||
msgid "Brightness"
|
||||
msgstr "Brillo"
|
||||
@ -1272,50 +1202,30 @@ msgstr "Brillo"
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Mostrar a distribución do teclado"
|
||||
|
||||
#: ../js/ui/status/location.js:107 ../js/ui/status/location.js:215
|
||||
#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177
|
||||
msgid "Location Enabled"
|
||||
msgstr "Localización activada"
|
||||
|
||||
#: ../js/ui/status/location.js:108 ../js/ui/status/location.js:216
|
||||
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178
|
||||
msgid "Disable"
|
||||
msgstr "Desactivar"
|
||||
|
||||
#: ../js/ui/status/location.js:109
|
||||
#: ../js/ui/status/location.js:73
|
||||
msgid "Privacy Settings"
|
||||
msgstr "Preferencias da privacidade"
|
||||
|
||||
#: ../js/ui/status/location.js:214
|
||||
#: ../js/ui/status/location.js:176
|
||||
msgid "Location In Use"
|
||||
msgstr "Localización en uso"
|
||||
|
||||
#: ../js/ui/status/location.js:218
|
||||
#: ../js/ui/status/location.js:180
|
||||
msgid "Location Disabled"
|
||||
msgstr "Localización desactivada"
|
||||
|
||||
#: ../js/ui/status/location.js:219
|
||||
#: ../js/ui/status/location.js:181
|
||||
msgid "Enable"
|
||||
msgstr "Activar"
|
||||
|
||||
#: ../js/ui/status/location.js:426
|
||||
msgid "Deny Access"
|
||||
msgstr "Denegar acceso"
|
||||
|
||||
#: ../js/ui/status/location.js:429
|
||||
msgid "Grant Access"
|
||||
msgstr "Conceder acceso"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: ../js/ui/status/location.js:435
|
||||
#, javascript-format
|
||||
msgid "Give %s access to your location?"
|
||||
msgstr "Darlle acceso a %s á súa localización?"
|
||||
|
||||
#: ../js/ui/status/location.js:437
|
||||
msgid "Location access can be changed at any time from the privacy settings."
|
||||
msgstr ""
|
||||
"Pode cambiar o acceso á localización en calquera momento desde as "
|
||||
"preferencias de privacidade."
|
||||
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
msgstr "<descoñecido>"
|
||||
@ -1451,6 +1361,10 @@ msgstr "Seleccione unha rede"
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Preferencias da WiFi"
|
||||
|
||||
#: ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Activar"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: ../js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
@ -1500,36 +1414,31 @@ msgstr "Produciuse un fallo na conexión"
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Produciuse un fallo na activación da conexión de rede"
|
||||
|
||||
#: ../js/ui/status/power.js:61
|
||||
#: ../js/ui/status/power.js:49
|
||||
msgid "Power Settings"
|
||||
msgstr "Preferencias de enerxía"
|
||||
|
||||
#: ../js/ui/status/power.js:77
|
||||
#: ../js/ui/status/power.js:65
|
||||
msgid "Fully Charged"
|
||||
msgstr "Carga completa"
|
||||
|
||||
#. 0 is reported when UPower does not have enough data
|
||||
#. to estimate battery life
|
||||
#: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90
|
||||
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
|
||||
msgid "Estimating…"
|
||||
msgstr "Estimando…"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
#: ../js/ui/status/power.js:98
|
||||
#: ../js/ui/status/power.js:86
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Remaining (%d %%)"
|
||||
msgstr "%d∶%02d Faltan (%d %%)"
|
||||
msgid "%d∶%02d Remaining (%d%%)"
|
||||
msgstr "Faltan %d:%02d (%d%%)"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
#: ../js/ui/status/power.js:103
|
||||
#: ../js/ui/status/power.js:91
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Until Full (%d %%)"
|
||||
msgstr "%d∶%02d ate cargado (%d %%)"
|
||||
|
||||
#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133
|
||||
#, javascript-format
|
||||
msgid "%d %%"
|
||||
msgstr "%d %%"
|
||||
msgid "%d∶%02d Until Full (%d%%)"
|
||||
msgstr "%d:%02d ate cargado (%d%%)"
|
||||
|
||||
#. The menu only appears when airplane mode is on, so just
|
||||
#. statically build it as if it was on, rather than dynamically
|
||||
@ -1570,6 +1479,10 @@ msgstr "Volume cambiado"
|
||||
msgid "Volume"
|
||||
msgstr "Volume"
|
||||
|
||||
#: ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Micrófono"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:67
|
||||
msgid "Log in as another user"
|
||||
msgstr "Iniciar sesión como outro usuario"
|
||||
@ -1690,7 +1603,7 @@ msgstr "Calendario de Evolution"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1835
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@ -1699,68 +1612,68 @@ msgstr[1] "%u saídas"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1845
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u entrada"
|
||||
msgstr[1] "%u entradas"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
#: ../src/gvc/gvc-mixer-control.c:2373
|
||||
msgid "System Sounds"
|
||||
msgstr "Sons do sistema"
|
||||
|
||||
#: ../src/main.c:381
|
||||
#: ../src/main.c:373
|
||||
msgid "Print version"
|
||||
msgstr "Imprimir versión"
|
||||
|
||||
#: ../src/main.c:387
|
||||
#: ../src/main.c:379
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Modo usado por GDM para a pantalla de inicio"
|
||||
|
||||
#: ../src/main.c:393
|
||||
#: ../src/main.c:385
|
||||
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:399
|
||||
#: ../src/main.c:391
|
||||
msgid "List possible modes"
|
||||
msgstr "Listar os modos posíbeis"
|
||||
|
||||
#: ../src/shell-app.c:246
|
||||
#: ../src/shell-app.c:239
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Descoñecido"
|
||||
|
||||
#: ../src/shell-app.c:487
|
||||
#: ../src/shell-app.c:480
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Produciuse un erro ao iniciar «%s»"
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:730
|
||||
#: ../src/shell-keyring-prompt.c:742
|
||||
msgid "Passwords do not match."
|
||||
msgstr "Os contrasinais non coinciden."
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:738
|
||||
#: ../src/shell-keyring-prompt.c:750
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "O contrasinal non pode estar baleiro"
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:353
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "O usuario rexeitou o diálogo de autenticación"
|
||||
|
||||
#~ msgid "%s is requesting access to your location."
|
||||
#~ msgstr "%s está solicitando acceso á súa localización."
|
||||
|
||||
#~ msgid "GNOME Shell (wayland compositor)"
|
||||
#~ msgstr "GNOME Shell (compositor de wayland)"
|
||||
#~ msgid "Bluetooth"
|
||||
#~ msgstr "Bluetooth"
|
||||
|
||||
#~ msgid "%d Connected Device"
|
||||
#~ msgid_plural "%d Connected Devices"
|
||||
#~ msgstr[0] "%d dispositivo conectado"
|
||||
#~ msgstr[1] "%d dispositivos conectados"
|
||||
|
||||
#~ msgid "Off"
|
||||
#~ msgstr "Desactivar"
|
||||
|
||||
#~ msgid "Authentication required"
|
||||
#~ msgstr "Requírese autenticación"
|
||||
|
||||
@ -1912,6 +1825,9 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
|
||||
#~ msgid "View account"
|
||||
#~ msgstr "Ver conta"
|
||||
|
||||
#~ msgid "Unknown reason"
|
||||
#~ msgstr "Razón descoñecida"
|
||||
|
||||
#~ msgid "Show the message list"
|
||||
#~ msgstr "Mostrar a lista de mensaxes"
|
||||
|
||||
@ -2086,6 +2002,9 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
|
||||
#~ msgid "Device %s wants access to the service '%s'"
|
||||
#~ msgstr "O dispositivo %s quere acceder ao servizo «%s»"
|
||||
|
||||
#~ msgid "Always grant access"
|
||||
#~ msgstr "Conceder acceso sempre"
|
||||
|
||||
#~ msgid "Grant this time only"
|
||||
#~ msgstr "Conceder só esta vez"
|
||||
|
||||
@ -2253,6 +2172,9 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
|
||||
#~ msgid "Visibility"
|
||||
#~ msgstr "Visibilidade"
|
||||
|
||||
#~ msgid "Send Files to Device…"
|
||||
#~ msgstr "Enviar ficheiros ao dispositivo…"
|
||||
|
||||
#~ msgid "Set Up a New Device…"
|
||||
#~ msgstr "Configurar un dispositivo novo…"
|
||||
|
||||
@ -2306,6 +2228,10 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
|
||||
#~ msgstr[0] "Queda %d minuto"
|
||||
#~ msgstr[1] "Quedan %d minutos"
|
||||
|
||||
#~ msgctxt "percent of battery remaining"
|
||||
#~ msgid "%d%%"
|
||||
#~ msgstr "%d%%"
|
||||
|
||||
#~ msgid "AC Adapter"
|
||||
#~ msgstr "Adaptador de corrente"
|
||||
|
||||
|
394
po/he.po
394
po/he.po
@ -10,8 +10,8 @@ msgid ""
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-03-11 14:49+0200\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-08-30 21:15+0300\n"
|
||||
"PO-Revision-Date: 2015-08-30 21:16+0300\n"
|
||||
"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
|
||||
"Language-Team: עברית <>\n"
|
||||
@ -47,6 +47,15 @@ msgstr "הצגת כל היישומים"
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:6
|
||||
msgid "Open the application menu"
|
||||
msgstr "פתיחת תפריט היישום"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "מעטפת GNOME"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "ניהול חלונות והרצת יישומים"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Extension Preferences"
|
||||
@ -55,13 +64,9 @@ msgstr "העדפות ההרחבות של GNOME Shell"
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
msgstr "הגדרת הרחבות GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "מעטפת GNOME"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
|
||||
msgid "GNOME Shell (wayland compositor)"
|
||||
msgstr "GNOME Shell (מסדר wayland)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
||||
@ -165,92 +170,74 @@ msgstr ""
|
||||
"'Remember Password' checkbox will be present. This key sets the default "
|
||||
"state of the checkbox."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"Whether the default Bluetooth adapter had set up devices associated to it"
|
||||
msgstr ""
|
||||
"Whether the default Bluetooth adapter had set up devices associated to it"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid ""
|
||||
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
|
||||
"powered, or if there were devices set up associated with the default "
|
||||
"adapter. This will be reset if the default adapter is ever seen not to have "
|
||||
"devices associated to it."
|
||||
msgstr ""
|
||||
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
|
||||
"powered, or if there were devices set up associated with the default "
|
||||
"adapter. This will be reset if the default adapter is ever seen not to have "
|
||||
"devices associated to it."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Show the week date in the calendar"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "If true, display the ISO week date in the calendar."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Keybinding to open the application menu"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Keybinding to open the application menu."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Keybinding to open the \"Show Applications\" view"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Keybinding to open the overview"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Keybinding to open the Activities Overview."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the notification list"
|
||||
msgstr "Keybinding to toggle the visibility of the notification list"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the visibility of the notification list."
|
||||
msgstr "Keybinding to toggle the visibility of the notification list."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Keybinding to focus the active notification"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Keybinding to focus the active notification."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid ""
|
||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||
msgstr ""
|
||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Which keyboard to use"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "The type of keyboard to use."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Limit switcher to current workspace."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
@ -258,51 +245,51 @@ msgstr ""
|
||||
msgstr ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The application icon mode."
|
||||
msgstr "The application icon mode."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
msgstr ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
msgstr ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
"only' (shows only the application icon) or 'both'."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
msgstr ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Attach modal dialog to the parent window"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Enable edge tiling when dropping windows on screen edges"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Workspaces are managed dynamically"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Workspaces only on primary monitor"
|
||||
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
msgstr "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
@ -310,52 +297,51 @@ msgstr "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
|
||||
msgid "Network Login"
|
||||
msgstr "Network Login"
|
||||
|
||||
|
||||
#: ../js/extensionPrefs/main.js:122
|
||||
#, javascript-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "אירעה שגיאה בעת טעינת דו־שיח ההעדפות עבור %s:"
|
||||
|
||||
|
||||
#: ../js/extensionPrefs/main.js:154
|
||||
msgid "GNOME Shell Extensions"
|
||||
msgstr "הרחבות GNOME Shell"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:916
|
||||
msgid "Cancel"
|
||||
msgstr "ביטול"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
|
||||
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
|
||||
#: ../js/gdm/authPrompt.js:435
|
||||
msgid "Next"
|
||||
msgstr "הבא"
|
||||
|
||||
|
||||
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/ui/unlockDialog.js:59
|
||||
msgid "Unlock"
|
||||
msgstr "שחרור"
|
||||
|
||||
|
||||
#: ../js/gdm/authPrompt.js:213
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "כניסה"
|
||||
|
||||
|
||||
#: ../js/gdm/loginDialog.js:281
|
||||
msgid "Choose Session"
|
||||
msgstr "בחירת הפעלה"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "לא רשום?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:847
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
@ -363,12 +349,12 @@ msgstr "(משתמש או %s לדוגמה)"
|
||||
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/ui/components/networkAgent.js:289
|
||||
msgid "Username: "
|
||||
msgstr "שם משתמש:"
|
||||
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1181
|
||||
msgid "Login Window"
|
||||
msgstr "חלון כניסה"
|
||||
@ -504,36 +490,16 @@ msgstr "הוספה למועדפים"
|
||||
#: ../js/ui/appDisplay.js:1897
|
||||
msgid "Show Details"
|
||||
msgstr "הצגת פרטים"
|
||||
|
||||
|
||||
#: ../js/ui/appFavorites.js:132
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s נוסף למועדפים שלך."
|
||||
|
||||
|
||||
#: ../js/ui/appFavorites.js:166
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s הוסר מהמועדפים שלך."
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:59
|
||||
msgid "Select Audio Device"
|
||||
msgstr "בחירת התקן שמע"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:69
|
||||
msgid "Sound Settings"
|
||||
msgstr "הגדרות שמע"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:78
|
||||
msgid "Headphones"
|
||||
msgstr "אזניות"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:80
|
||||
msgid "Headset"
|
||||
msgstr "אזניות עם מיקרופון"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "מיקרופון"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19
|
||||
msgid "Change Background…"
|
||||
@ -542,12 +508,13 @@ msgstr "החלפת הרקע…"
|
||||
#: ../js/ui/backgroundMenu.js:21
|
||||
msgid "Display Settings"
|
||||
msgstr "הגדרות תצוגה"
|
||||
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
|
||||
#: ../js/ui/status/system.js:366
|
||||
msgid "Settings"
|
||||
msgstr "הגדרות"
|
||||
|
||||
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
|
||||
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
|
||||
#: ../js/ui/calendar.js:55
|
||||
msgctxt "calendar-no-work"
|
||||
msgid "06"
|
||||
@ -557,96 +524,94 @@ msgstr "65"
|
||||
#. *
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#.
|
||||
#: ../js/ui/calendar.js:84
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "א"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:86
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "ב"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:88
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "ג"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:90
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "ד"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:92
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "ה"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:94
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "ו"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:96
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "ש"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:566
|
||||
msgid "Previous month"
|
||||
msgstr "חודש קודם"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:576
|
||||
msgid "Next month"
|
||||
msgstr "חודש הבא"
|
||||
|
||||
#: ../js/ui/calendar.js:579
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:783
|
||||
msgid "Week %V"
|
||||
msgstr "שבוע %V"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#.
|
||||
#: ../js/ui/calendar.js:1188
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "יום שלם"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:1291
|
||||
msgid "Clear section"
|
||||
msgstr "ניקוי מקטע"
|
||||
|
||||
#: ../js/ui/calendar.js:1518
|
||||
msgid "Events"
|
||||
msgstr "אירועים"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:1527
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, ה־%e ב%B"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:1531
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, ה־%e ב%B, %Y"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:1616
|
||||
msgid "Notifications"
|
||||
msgstr "התרעות"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:1767
|
||||
msgid "No Notifications"
|
||||
msgstr "אין התרעות"
|
||||
|
||||
|
||||
#: ../js/ui/calendar.js:1770
|
||||
msgid "No Events"
|
||||
msgstr "אין אירועים"
|
||||
@ -658,7 +623,7 @@ msgstr "חובר כונן חיצוני"
|
||||
#: ../js/ui/components/automountManager.js:102
|
||||
msgid "External drive disconnected"
|
||||
msgstr "נותק כונן חיצוני"
|
||||
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:354
|
||||
#, javascript-format
|
||||
msgid "Open with %s"
|
||||
@ -964,11 +929,11 @@ msgid "Keyboard"
|
||||
msgid "Keyboard"
|
||||
msgstr "מקלדת"
|
||||
|
||||
#. translators: 'Hide' is a verb
|
||||
#. translators: 'Hide' is a verb
|
||||
#: ../js/ui/legacyTray.js:66
|
||||
msgid "Hide tray"
|
||||
msgstr "הסתרת המגש"
|
||||
|
||||
|
||||
#: ../js/ui/legacyTray.js:107
|
||||
msgid "Status Icons"
|
||||
msgstr "סמלי מצב"
|
||||
@ -996,7 +961,7 @@ msgstr "פעיל"
|
||||
msgstr "פעיל"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "מנוטרל"
|
||||
@ -1020,26 +985,10 @@ msgstr "צפייה במקור"
|
||||
#: ../js/ui/lookingGlass.js:758
|
||||
msgid "Web Page"
|
||||
msgstr "דף אינטרנט"
|
||||
|
||||
#: ../js/ui/messageList.js:543
|
||||
msgid "Clear section"
|
||||
msgstr "ניקוי מקטע"
|
||||
|
||||
#: ../js/ui/messageTray.js:1486
|
||||
msgid "System Information"
|
||||
msgstr "פרטי המערכת"
|
||||
|
||||
#: ../js/ui/mpris.js:194
|
||||
msgid "Unknown artist"
|
||||
msgstr "אמן לא ידוע"
|
||||
|
||||
#: ../js/ui/mpris.js:195
|
||||
msgid "Unknown title"
|
||||
msgstr "כותרת לא ידועה"
|
||||
|
||||
#: ../js/ui/mpris.js:217
|
||||
msgid "Media"
|
||||
msgstr "מדיה"
|
||||
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
@ -1056,22 +1005,17 @@ msgstr "סקירה"
|
||||
#: ../js/ui/overview.js:244
|
||||
msgid "Type to search…"
|
||||
msgstr "יש להקליד כדי לחפש…"
|
||||
|
||||
|
||||
#: ../js/ui/panel.js:352
|
||||
msgid "Quit"
|
||||
msgstr "יציאה"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:404
|
||||
msgid "Activities"
|
||||
msgstr "פעילויות"
|
||||
|
||||
#: ../js/ui/panel.js:695
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "מערכת"
|
||||
|
||||
|
||||
#: ../js/ui/panel.js:754
|
||||
msgid "Top Bar"
|
||||
msgstr "הסרגל העליון"
|
||||
@ -1084,15 +1028,15 @@ msgstr "הסרגל העליון"
|
||||
#: ../js/ui/popupMenu.js:289
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
msgstr "נא להזין פקודה"
|
||||
|
||||
|
||||
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
|
||||
msgid "Close"
|
||||
msgstr "סגירה"
|
||||
|
||||
|
||||
#: ../js/ui/runDialog.js:281
|
||||
msgid "Restarting…"
|
||||
msgstr "מופעל מחדש…"
|
||||
@ -1217,41 +1161,29 @@ msgstr "ניגודיות גבוהה"
|
||||
#: ../js/ui/status/accessibility.js:202
|
||||
msgid "Large Text"
|
||||
msgstr "טקסט גדול"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:47
|
||||
msgid "Bluetooth"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "כיבוי"
|
||||
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "הגדרות Bluetooth"
|
||||
|
||||
#. Translators: this is the number of connected bluetooth devices
|
||||
#. Translators: this is the number of connected bluetooth devices
|
||||
#: ../js/ui/status/bluetooth.js:105
|
||||
#, c-format
|
||||
msgid "%d Connected"
|
||||
msgid_plural "%d Connected"
|
||||
msgstr[0] "אחד מחובר"
|
||||
msgstr[1] "%d מחוברים"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:138
|
||||
msgid "Off"
|
||||
msgstr "כבוי"
|
||||
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:107
|
||||
msgid "Not In Use"
|
||||
msgstr "לא בשימוש"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "הפעלה"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "כיבוי"
|
||||
|
||||
#: ../js/ui/status/brightness.js:44
|
||||
msgid "Brightness"
|
||||
@ -1260,48 +1192,30 @@ msgstr "בהירות"
|
||||
#: ../js/ui/status/keyboard.js:736
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "הצגת פריסת המקלדת"
|
||||
|
||||
|
||||
#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177
|
||||
msgid "Location Enabled"
|
||||
msgstr "איכון מאופשר"
|
||||
|
||||
|
||||
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178
|
||||
msgid "Disable"
|
||||
msgstr "השבתה"
|
||||
|
||||
|
||||
#: ../js/ui/status/location.js:73
|
||||
msgid "Privacy Settings"
|
||||
msgstr "הגדרות פרטיות"
|
||||
|
||||
|
||||
#: ../js/ui/status/location.js:176
|
||||
msgid "Location In Use"
|
||||
msgstr "איכון בשימוש"
|
||||
|
||||
|
||||
#: ../js/ui/status/location.js:180
|
||||
msgid "Location Disabled"
|
||||
msgstr "איכון מושבת"
|
||||
|
||||
|
||||
#: ../js/ui/status/location.js:181
|
||||
msgid "Enable"
|
||||
msgstr "אפשור"
|
||||
|
||||
#: ../js/ui/status/location.js:426
|
||||
msgid "Deny Access"
|
||||
msgstr "מניעת גישה"
|
||||
|
||||
#: ../js/ui/status/location.js:429
|
||||
msgid "Grant Access"
|
||||
msgstr "אפשור גישה"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: ../js/ui/status/location.js:435
|
||||
#, javascript-format
|
||||
msgid "Give %s access to your location?"
|
||||
msgstr "לתת ליישום %s גישה למיקום שלך?"
|
||||
|
||||
#: ../js/ui/status/location.js:437
|
||||
msgid "Location access can be changed at any time from the privacy settings."
|
||||
msgstr "ניתן לשנות בכל עת את הרשאות הגישה למיקום שלך מהגדרות הפרטיות."
|
||||
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
@ -1437,6 +1351,10 @@ msgstr "בחירת רשת"
|
||||
#: ../js/ui/status/network.js:1177
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "הגדרות רשת אלחוטית"
|
||||
|
||||
#: ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "הפעלה"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: ../js/ui/status/network.js:1296
|
||||
@ -1486,37 +1404,32 @@ msgstr "ההתחברות נכשלה"
|
||||
#: ../js/ui/status/network.js:1698
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "הפעלת חיבור הרשת נכשלה"
|
||||
|
||||
|
||||
#: ../js/ui/status/power.js:49
|
||||
msgid "Power Settings"
|
||||
msgstr "הגדרות צריכת החשמל"
|
||||
|
||||
|
||||
#: ../js/ui/status/power.js:65
|
||||
msgid "Fully Charged"
|
||||
msgstr "בטעינה מלאה"
|
||||
|
||||
#. 0 is reported when UPower does not have enough data
|
||||
#. to estimate battery life
|
||||
#. to estimate battery life
|
||||
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
|
||||
msgid "Estimating…"
|
||||
msgstr "מתבצע שערוך…"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
#: ../js/ui/status/power.js:86
|
||||
#, javascript-format
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Remaining (%d%%)"
|
||||
msgstr "%d∶%02d נותרו (%d%%)"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
#: ../js/ui/status/power.js:91
|
||||
#, javascript-format
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Until Full (%d%%)"
|
||||
msgstr "%d:%02d עד לטעינה מלאה (%d%%)"
|
||||
|
||||
#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133
|
||||
#, javascript-format
|
||||
msgid "%d %%"
|
||||
msgstr "%d %%"
|
||||
|
||||
#. The menu only appears when airplane mode is on, so just
|
||||
#. statically build it as if it was on, rather than dynamically
|
||||
@ -1556,6 +1469,10 @@ msgstr "עצמת השמע השתנתה"
|
||||
#: ../js/ui/status/volume.js:162
|
||||
msgid "Volume"
|
||||
msgstr "עצמה"
|
||||
|
||||
#: ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "מיקרופון"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:67
|
||||
msgid "Log in as another user"
|
||||
@ -1677,7 +1594,7 @@ msgstr "יומן אבולושן"
|
||||
msgstr "יומן אבולושן"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
@ -1686,60 +1603,57 @@ msgstr[1] "%u פלטים"
|
||||
msgstr[1] "%u פלטים"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "קלט אחד"
|
||||
msgstr[1] "%u קלטים"
|
||||
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2373
|
||||
msgid "System Sounds"
|
||||
msgstr "צלילי מערכת"
|
||||
|
||||
|
||||
#: ../src/main.c:373
|
||||
msgid "Print version"
|
||||
msgstr "Print version"
|
||||
|
||||
|
||||
#: ../src/main.c:379
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "המצב בו GDM יעשה שימוש לצורך מסך הכניסה"
|
||||
|
||||
|
||||
#: ../src/main.c:385
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "שימוש במצב מסוים, לדוגמה: „gdm“ למסך הכניסה"
|
||||
|
||||
|
||||
#: ../src/main.c:391
|
||||
msgid "List possible modes"
|
||||
msgstr "הצגת המצבים האפשריים"
|
||||
|
||||
|
||||
#: ../src/shell-app.c:239
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "לא ידוע"
|
||||
|
||||
|
||||
#: ../src/shell-app.c:480
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "אירע כשל בטעינת „%s”"
|
||||
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:742
|
||||
msgid "Passwords do not match."
|
||||
msgstr "הססמאות אינן תואמות."
|
||||
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:750
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "הססמה אינה יכולה להישאר ריקה"
|
||||
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
|
||||
#~ msgid "%s is requesting access to your location."
|
||||
#~ msgstr "%s דורש גישה למיקום שלך."
|
||||
|
||||
#~ msgid "GNOME Shell (wayland compositor)"
|
||||
|
||||
#~ msgid "Bluetooth"
|
||||
#~ msgstr "Bluetooth"
|
||||
|
||||
# javascript-format
|
||||
@ -1747,6 +1661,9 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
#~ msgid_plural "%d Connected Devices"
|
||||
#~ msgstr[0] "התקן אחד מחובר"
|
||||
#~ msgstr[1] "%d התקנים מחוברים"
|
||||
|
||||
#~ msgid "Off"
|
||||
#~ msgstr "כבוי"
|
||||
|
||||
#~ msgid "Authentication required"
|
||||
#~ msgstr "נדרש אימות"
|
||||
@ -1893,6 +1810,9 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
|
||||
#~ msgid "View account"
|
||||
#~ msgstr "צפייה בחשבון"
|
||||
|
||||
#~ msgid "Unknown reason"
|
||||
#~ msgstr "סיבה לא ידועה"
|
||||
|
||||
#~ msgid "Show the message list"
|
||||
#~ msgstr "הצגת רשימת הודעות"
|
||||
@ -2086,6 +2006,9 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
|
||||
#~ msgid "Device %s wants access to the service '%s'"
|
||||
#~ msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
|
||||
|
||||
#~ msgid "Always grant access"
|
||||
#~ msgstr "תמיד להעניק גישה"
|
||||
|
||||
#~ msgid "Grant this time only"
|
||||
#~ msgstr "הענקת גישה הפעם בלבד"
|
||||
@ -2253,6 +2176,9 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
|
||||
#~ msgid "Visibility"
|
||||
#~ msgstr "הצגה"
|
||||
|
||||
#~ msgid "Send Files to Device…"
|
||||
#~ msgstr "שליחת קובץ להתקן…"
|
||||
|
||||
#~ msgid "Set Up a New Device…"
|
||||
#~ msgstr "הגדרת התקן חדש…"
|
||||
@ -2331,6 +2257,10 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||
#~ msgstr[0] "דקה אחת נותרה"
|
||||
#~ msgstr[1] "%d דקות נותרו"
|
||||
#~ msgstr[2] "שתי דקות נותרו"
|
||||
|
||||
#~ msgctxt "percent of battery remaining"
|
||||
#~ msgid "%d%%"
|
||||
#~ msgstr "%d%%"
|
||||
|
||||
#~ msgid "AC Adapter"
|
||||
#~ msgstr "מתאם חשמל"
|
||||
|
366
po/nb.po
366
po/nb.po
@ -7,10 +7,10 @@
|
||||
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell 3.19.x\n"
|
||||
"Project-Id-Version: gnome-shell 3.17.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-01 14:12+0200\n"
|
||||
"PO-Revision-Date: 2016-05-01 14:21+0200\n"
|
||||
"POT-Creation-Date: 2015-09-07 19:22+0200\n"
|
||||
"PO-Revision-Date: 2015-09-07 19:31+0200\n"
|
||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||
"Language: Norwegian bokmål\n"
|
||||
@ -44,6 +44,15 @@ msgstr "Vis alle programmer"
|
||||
msgid "Open the application menu"
|
||||
msgstr "Åpne programmenyen"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Vindushåndtering og oppstart av programmer"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Extension Preferences"
|
||||
msgstr "Brukervalg for GNOME Shell-utvidelser"
|
||||
@ -52,13 +61,9 @@ msgstr "Brukervalg for GNOME Shell-utvidelser"
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
msgstr "Sett opp utvidelser for GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "GNOME Shell"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Vindushåndtering og oppstart av programmer"
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
|
||||
msgid "GNOME Shell (wayland compositor)"
|
||||
msgstr "GNOME Shell (Wayland-kompositør)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
@ -161,88 +166,75 @@ msgstr ""
|
||||
"standardverdien for avkryssingsboksen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"Whether the default Bluetooth adapter had set up devices associated to it"
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid ""
|
||||
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
|
||||
"powered, or if there were devices set up associated with the default "
|
||||
"adapter. This will be reset if the default adapter is ever seen not to have "
|
||||
"devices associated to it."
|
||||
msgstr ""
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Vis ukedato/ukenummer i kalender"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr "Viser ISO-ukedato i kalenderen hvis «true»."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Tastaturbinding som åpner programmenyen"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Tastaturbinding som åpner programmenyen."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Tastaturbinding som åpner visningen «Vis programmer»"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Tastaturbinding som åpner visningen «Vis programmer» i aktivitetsoversikten."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Tastaturbinding som åpner oversikten"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Tastaturbinding som åpner aktivitetsoversikten."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the notification list"
|
||||
msgstr "Tastaturbinding som slår av/på visning av varslingsliste"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the visibility of the notification list."
|
||||
msgstr "Tastaturbinding som slår av/på visning av varslingsliste."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Tastaturbinding som fokuserer aktiv varsling"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Tastaturbinding som fokuserer aktiv varsling."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid ""
|
||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||
msgstr ""
|
||||
"Hurtigtast som stanser og fortsetter pågående bevegelser til "
|
||||
"feilsøkingsformål"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Tastatur som skal brukes"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Type tastatur som skal brukes."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Begrens programveksling til gjeldende arbeidsområde."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@ -251,11 +243,11 @@ msgstr ""
|
||||
"gjeldende arbeidsområder som vises i programveksleren. I motsatt fall kan du "
|
||||
"veksle mellom programmer på tvers av arbeidsområder."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The application icon mode."
|
||||
msgstr "Ikonmodus for programmet."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@ -265,7 +257,7 @@ msgstr ""
|
||||
"valgalternativer er «thumbnail-only» (viser miniatyrbilde av vinduet), «app-"
|
||||
"icon-only» (viser bare programikonet) og «both» (viser begge forannevnte)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@ -274,30 +266,30 @@ msgstr ""
|
||||
"arbeidsområder som vises i programveksleren. I motsatt fall vises vinduer "
|
||||
"fra alle arbeidsområder."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Fest modal dialog til opphavsvinduet"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Denne nøkkelen overstyrer nøkkelen i org.gnome.mutter når GNOME Shell kjøres."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Del opp skjermkantene i fliser når brukeren drar og slipper vinduer på dem"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Arbeidsområder håndteres dynamisk"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Arbeidsområder vises kun på hovedskjerm"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
msgstr "Utsett fokusendringer i musmodus til peker slutter å bevege seg"
|
||||
|
||||
@ -305,52 +297,51 @@ msgstr "Utsett fokusendringer i musmodus til peker slutter å bevege seg"
|
||||
msgid "Network Login"
|
||||
msgstr "Nettverkspålogging"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:117
|
||||
#: ../js/extensionPrefs/main.js:122
|
||||
#, javascript-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "Det oppsto en feil ved lasting av brukervalgdialog for %s:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:149
|
||||
#: ../js/extensionPrefs/main.js:154
|
||||
msgid "GNOME Shell Extensions"
|
||||
msgstr "Utvidelser for GNOME Shell"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
|
||||
#: ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:916
|
||||
msgid "Cancel"
|
||||
msgstr "Avbryt"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
|
||||
#: ../js/gdm/authPrompt.js:448
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
|
||||
#: ../js/gdm/authPrompt.js:447
|
||||
msgid "Next"
|
||||
msgstr "Neste"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/ui/unlockDialog.js:59
|
||||
msgid "Unlock"
|
||||
msgstr "Lås opp"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:214
|
||||
#: ../js/gdm/authPrompt.js:213
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Logg inn"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:285
|
||||
#: ../js/gdm/loginDialog.js:281
|
||||
msgid "Choose Session"
|
||||
msgstr "Velg økt"
|
||||
|
||||
#. 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:435
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "Ikke listet?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:854
|
||||
#: ../js/gdm/loginDialog.js:850
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(f.eks. bruker eller %s)"
|
||||
@ -358,12 +349,12 @@ msgstr "(f.eks. bruker eller %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:859 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/gdm/loginDialog.js:855 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/ui/components/networkAgent.js:289
|
||||
msgid "Username: "
|
||||
msgstr "Brukernavn: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1196
|
||||
#: ../js/gdm/loginDialog.js:1184
|
||||
msgid "Login Window"
|
||||
msgstr "Innloggingsvindu"
|
||||
|
||||
@ -499,36 +490,16 @@ msgstr "Legg til i favoritter"
|
||||
msgid "Show Details"
|
||||
msgstr "Vis detaljer"
|
||||
|
||||
#: ../js/ui/appFavorites.js:134
|
||||
#: ../js/ui/appFavorites.js:132
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "%s ble lagt til i favoritter."
|
||||
|
||||
#: ../js/ui/appFavorites.js:168
|
||||
#: ../js/ui/appFavorites.js:166
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s ble fjernet fra favoritter."
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:59
|
||||
msgid "Select Audio Device"
|
||||
msgstr "Velg lydenhet"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:69
|
||||
msgid "Sound Settings"
|
||||
msgstr "Innstillinger for lyd"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:78
|
||||
msgid "Headphones"
|
||||
msgstr "Hodetelefoner"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:80
|
||||
msgid "Headset"
|
||||
msgstr "Headset"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19
|
||||
msgid "Change Background…"
|
||||
msgstr "Bytt bakgrunn …"
|
||||
@ -537,12 +508,13 @@ msgstr "Bytt bakgrunn …"
|
||||
msgid "Display Settings"
|
||||
msgstr "Innstillinger for skjerm"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:371
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
|
||||
#: ../js/ui/status/system.js:366
|
||||
msgid "Settings"
|
||||
msgstr "Innstillinger"
|
||||
|
||||
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
|
||||
#: ../js/ui/calendar.js:47
|
||||
#: ../js/ui/calendar.js:55
|
||||
msgctxt "calendar-no-work"
|
||||
msgid "06"
|
||||
msgstr "06"
|
||||
@ -552,96 +524,94 @@ msgstr "06"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#: ../js/ui/calendar.js:76
|
||||
#: ../js/ui/calendar.js:84
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:78
|
||||
#: ../js/ui/calendar.js:86
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "M"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:80
|
||||
#: ../js/ui/calendar.js:88
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "T"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:82
|
||||
#: ../js/ui/calendar.js:90
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "O"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:84
|
||||
#: ../js/ui/calendar.js:92
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "T"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:86
|
||||
#: ../js/ui/calendar.js:94
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "F"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:88
|
||||
#: ../js/ui/calendar.js:96
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "L"
|
||||
|
||||
#: ../js/ui/calendar.js:416
|
||||
#: ../js/ui/calendar.js:566
|
||||
msgid "Previous month"
|
||||
msgstr "Forrige måned"
|
||||
|
||||
#: ../js/ui/calendar.js:426
|
||||
#: ../js/ui/calendar.js:576
|
||||
msgid "Next month"
|
||||
msgstr "Neste måned"
|
||||
|
||||
#: ../js/ui/calendar.js:579
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: ../js/ui/calendar.js:634
|
||||
#: ../js/ui/calendar.js:783
|
||||
msgid "Week %V"
|
||||
msgstr "Uke %V"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: ../js/ui/calendar.js:695
|
||||
#: ../js/ui/calendar.js:1188
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Hele dagen"
|
||||
|
||||
#: ../js/ui/calendar.js:821
|
||||
#: ../js/ui/calendar.js:1291
|
||||
msgid "Clear section"
|
||||
msgstr "Tøm seksjon"
|
||||
|
||||
#: ../js/ui/calendar.js:1518
|
||||
msgid "Events"
|
||||
msgstr "Hendelser"
|
||||
|
||||
#: ../js/ui/calendar.js:830
|
||||
#: ../js/ui/calendar.js:1527
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A %B %d"
|
||||
|
||||
#: ../js/ui/calendar.js:834
|
||||
#: ../js/ui/calendar.js:1531
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A %B %d, %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:919
|
||||
#: ../js/ui/calendar.js:1616
|
||||
msgid "Notifications"
|
||||
msgstr "Varslinger"
|
||||
|
||||
#: ../js/ui/calendar.js:1070
|
||||
#: ../js/ui/calendar.js:1767
|
||||
msgid "No Notifications"
|
||||
msgstr "Ingen varslinger"
|
||||
|
||||
#: ../js/ui/calendar.js:1073
|
||||
#: ../js/ui/calendar.js:1770
|
||||
msgid "No Events"
|
||||
msgstr "Ingen hendelser"
|
||||
|
||||
@ -653,7 +623,7 @@ msgstr "Ekstern stasjon koblet til"
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Ekstern stasjon koblet fra"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:355
|
||||
#: ../js/ui/components/autorunManager.js:354
|
||||
#, javascript-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Åpne med %s"
|
||||
@ -779,7 +749,7 @@ msgstr "Beklager, det virket ikke. Prøv igjen."
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:760
|
||||
#: ../js/ui/components/telepathyClient.js:759
|
||||
#, javascript-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s er nå kjent som %s"
|
||||
@ -966,11 +936,11 @@ msgid "Keyboard"
|
||||
msgstr "Tastatur"
|
||||
|
||||
#. translators: 'Hide' is a verb
|
||||
#: ../js/ui/legacyTray.js:65
|
||||
#: ../js/ui/legacyTray.js:66
|
||||
msgid "Hide tray"
|
||||
msgstr "Skjul statusområde"
|
||||
|
||||
#: ../js/ui/legacyTray.js:106
|
||||
#: ../js/ui/legacyTray.js:107
|
||||
msgid "Status Icons"
|
||||
msgstr "Statusikoner"
|
||||
|
||||
@ -998,7 +968,7 @@ msgstr "Slått på"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Slått av"
|
||||
|
||||
@ -1022,26 +992,10 @@ msgstr "Vis kildekode"
|
||||
msgid "Web Page"
|
||||
msgstr "Nettside"
|
||||
|
||||
#: ../js/ui/messageList.js:543
|
||||
msgid "Clear section"
|
||||
msgstr "Tøm seksjon"
|
||||
|
||||
#: ../js/ui/messageTray.js:1486
|
||||
msgid "System Information"
|
||||
msgstr "Systeminformasjon"
|
||||
|
||||
#: ../js/ui/mpris.js:194
|
||||
msgid "Unknown artist"
|
||||
msgstr "Ukjent artist"
|
||||
|
||||
#: ../js/ui/mpris.js:195
|
||||
msgid "Unknown title"
|
||||
msgstr "Ukjent tittel"
|
||||
|
||||
#: ../js/ui/mpris.js:217
|
||||
msgid "Media"
|
||||
msgstr "Media"
|
||||
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "Angre"
|
||||
@ -1058,22 +1012,17 @@ msgstr "Oversikt"
|
||||
msgid "Type to search…"
|
||||
msgstr "Skriv for å søke …"
|
||||
|
||||
#: ../js/ui/panel.js:358
|
||||
#: ../js/ui/panel.js:352
|
||||
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:414
|
||||
#: ../js/ui/panel.js:404
|
||||
msgid "Activities"
|
||||
msgstr "Aktiviteter"
|
||||
|
||||
#: ../js/ui/panel.js:695
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "System"
|
||||
|
||||
#: ../js/ui/panel.js:807
|
||||
#: ../js/ui/panel.js:754
|
||||
msgid "Top Bar"
|
||||
msgstr "Topp-panel"
|
||||
|
||||
@ -1086,15 +1035,15 @@ msgstr "Topp-panel"
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:71
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
msgstr "Skriv inn en kommando"
|
||||
|
||||
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162
|
||||
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
|
||||
msgid "Close"
|
||||
msgstr "Lukk"
|
||||
|
||||
#: ../js/ui/runDialog.js:282
|
||||
#: ../js/ui/runDialog.js:281
|
||||
msgid "Restarting…"
|
||||
msgstr "Starter på nytt …"
|
||||
|
||||
@ -1118,7 +1067,7 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d ny varsling"
|
||||
msgstr[1] "%d nye varslinger"
|
||||
|
||||
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:379
|
||||
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:374
|
||||
msgid "Lock"
|
||||
msgstr "Lås"
|
||||
|
||||
@ -1217,41 +1166,29 @@ msgstr "Høy kontrast"
|
||||
msgid "Large Text"
|
||||
msgstr "Stor tekst"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:47
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Slå av"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:56
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Bluetooth-innstillinger"
|
||||
|
||||
#. Translators: this is the number of connected bluetooth devices
|
||||
#: ../js/ui/status/bluetooth.js:136
|
||||
#: ../js/ui/status/bluetooth.js:105
|
||||
#, javascript-format
|
||||
msgid "%d Connected"
|
||||
msgid_plural "%d Connected"
|
||||
msgstr[0] "%d koblet til"
|
||||
msgstr[1] "%d koblet til"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:138
|
||||
msgid "Off"
|
||||
msgstr "Av"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:140
|
||||
#: ../js/ui/status/bluetooth.js:107
|
||||
msgid "Not In Use"
|
||||
msgstr "Ikke i bruk"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Slå på"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Slå av"
|
||||
|
||||
#: ../js/ui/status/brightness.js:44
|
||||
msgid "Brightness"
|
||||
msgstr "Lysstyrke"
|
||||
@ -1260,48 +1197,30 @@ msgstr "Lysstyrke"
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Vis tastaturutforming"
|
||||
|
||||
#: ../js/ui/status/location.js:107 ../js/ui/status/location.js:215
|
||||
#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177
|
||||
msgid "Location Enabled"
|
||||
msgstr "Plassering slått på"
|
||||
|
||||
#: ../js/ui/status/location.js:108 ../js/ui/status/location.js:216
|
||||
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178
|
||||
msgid "Disable"
|
||||
msgstr "Slå av"
|
||||
|
||||
#: ../js/ui/status/location.js:109
|
||||
#: ../js/ui/status/location.js:73
|
||||
msgid "Privacy Settings"
|
||||
msgstr "Innstillinger for personvern"
|
||||
|
||||
#: ../js/ui/status/location.js:214
|
||||
#: ../js/ui/status/location.js:176
|
||||
msgid "Location In Use"
|
||||
msgstr "Plassering i bruk"
|
||||
|
||||
#: ../js/ui/status/location.js:218
|
||||
#: ../js/ui/status/location.js:180
|
||||
msgid "Location Disabled"
|
||||
msgstr "Plassering slått av"
|
||||
|
||||
#: ../js/ui/status/location.js:219
|
||||
#: ../js/ui/status/location.js:181
|
||||
msgid "Enable"
|
||||
msgstr "Slå på"
|
||||
|
||||
#: ../js/ui/status/location.js:426
|
||||
msgid "Deny Access"
|
||||
msgstr "Nekt tilgang"
|
||||
|
||||
#: ../js/ui/status/location.js:429
|
||||
msgid "Grant Access"
|
||||
msgstr "Gi tilgang"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: ../js/ui/status/location.js:435
|
||||
#, javascript-format
|
||||
msgid "Give %s access to your location?"
|
||||
msgstr "Gi %s tilgang til din plassering?"
|
||||
|
||||
#: ../js/ui/status/location.js:437
|
||||
msgid "Location access can be changed at any time from the privacy settings."
|
||||
msgstr "Tilgang til plassering kan endres når som helst fra innstillinger for personvern."
|
||||
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
msgstr "<ukjent>"
|
||||
@ -1437,6 +1356,10 @@ msgstr "Velg nettverk"
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Innstillinger"
|
||||
|
||||
#: ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Slå på"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: ../js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
@ -1486,36 +1409,31 @@ msgstr "Tilkobling mislyktes"
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivering av nettverkstilkobling mislyktes"
|
||||
|
||||
#: ../js/ui/status/power.js:61
|
||||
#: ../js/ui/status/power.js:49
|
||||
msgid "Power Settings"
|
||||
msgstr "Innstillinger for strøm"
|
||||
|
||||
#: ../js/ui/status/power.js:77
|
||||
#: ../js/ui/status/power.js:65
|
||||
msgid "Fully Charged"
|
||||
msgstr "Fullt oppladet"
|
||||
|
||||
#. 0 is reported when UPower does not have enough data
|
||||
#. to estimate battery life
|
||||
#: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90
|
||||
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
|
||||
msgid "Estimating…"
|
||||
msgstr "Estimerer …"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
#: ../js/ui/status/power.js:98
|
||||
#: ../js/ui/status/power.js:86
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Remaining (%d %%)"
|
||||
msgstr "%d:%02d gjenstår (%d %%)"
|
||||
msgid "%d∶%02d Remaining (%d%%)"
|
||||
msgstr "%d:%02d gjenstår (%d%%)"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
#: ../js/ui/status/power.js:103
|
||||
#: ../js/ui/status/power.js:91
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Until Full (%d %%)"
|
||||
msgstr "%d:%02d til batteriet er fullt (%d %%)"
|
||||
|
||||
#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133
|
||||
#, javascript-format
|
||||
msgid "%d %%"
|
||||
msgstr "%d %%"
|
||||
msgid "%d∶%02d Until Full (%d%%)"
|
||||
msgstr "%d:%02d til batteriet er fullt (%d%%)"
|
||||
|
||||
#. The menu only appears when airplane mode is on, so just
|
||||
#. statically build it as if it was on, rather than dynamically
|
||||
@ -1524,27 +1442,27 @@ msgstr "%d %%"
|
||||
msgid "Airplane Mode On"
|
||||
msgstr "Flymodus er slått på"
|
||||
|
||||
#: ../js/ui/status/system.js:348
|
||||
#: ../js/ui/status/system.js:343
|
||||
msgid "Switch User"
|
||||
msgstr "Bytt bruker"
|
||||
|
||||
#: ../js/ui/status/system.js:353
|
||||
#: ../js/ui/status/system.js:348
|
||||
msgid "Log Out"
|
||||
msgstr "Logg ut"
|
||||
|
||||
#: ../js/ui/status/system.js:358
|
||||
#: ../js/ui/status/system.js:353
|
||||
msgid "Account Settings"
|
||||
msgstr "Innstillinger for konto"
|
||||
|
||||
#: ../js/ui/status/system.js:375
|
||||
#: ../js/ui/status/system.js:370
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Lås for orientering"
|
||||
|
||||
#: ../js/ui/status/system.js:383
|
||||
#: ../js/ui/status/system.js:378
|
||||
msgid "Suspend"
|
||||
msgstr "Hvilemodus"
|
||||
|
||||
#: ../js/ui/status/system.js:386
|
||||
#: ../js/ui/status/system.js:381
|
||||
msgid "Power Off"
|
||||
msgstr "Slå av"
|
||||
|
||||
@ -1556,6 +1474,10 @@ msgstr "Volum endret"
|
||||
msgid "Volume"
|
||||
msgstr "Volum"
|
||||
|
||||
#: ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:67
|
||||
msgid "Log in as another user"
|
||||
msgstr "Logg inn som en annen bruker"
|
||||
@ -1640,19 +1562,19 @@ msgstr "Alltid på synlig arbeidsområde"
|
||||
|
||||
#: ../js/ui/windowMenu.js:105
|
||||
msgid "Move to Workspace Left"
|
||||
msgstr "Flytt til arbeidsområdet til venstre"
|
||||
msgstr "Gå til arbeidsområdet til venstre"
|
||||
|
||||
#: ../js/ui/windowMenu.js:110
|
||||
msgid "Move to Workspace Right"
|
||||
msgstr "Flytt til arbeidsområdet til høyre"
|
||||
msgstr "Gå til arbeidsområdet til høyre"
|
||||
|
||||
#: ../js/ui/windowMenu.js:115
|
||||
msgid "Move to Workspace Up"
|
||||
msgstr "Flytt til arbeidsområdet over"
|
||||
msgstr "Gå til arbeidsområdet over"
|
||||
|
||||
#: ../js/ui/windowMenu.js:120
|
||||
msgid "Move to Workspace Down"
|
||||
msgstr "Flytt til arbeidsområdet under"
|
||||
msgstr "Gå til arbeidsområdet under"
|
||||
|
||||
#: ../js/ui/windowMenu.js:136
|
||||
msgid "Move to Monitor Up"
|
||||
@ -1676,7 +1598,7 @@ msgstr "Evolution kalender"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1835
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@ -1685,51 +1607,51 @@ msgstr[1] "%u utganger"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1845
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
msgstr[0] "%u inngang"
|
||||
msgstr[1] "%u innganger"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
#: ../src/gvc/gvc-mixer-control.c:2373
|
||||
msgid "System Sounds"
|
||||
msgstr "Systemlyder"
|
||||
|
||||
#: ../src/main.c:381
|
||||
#: ../src/main.c:373
|
||||
msgid "Print version"
|
||||
msgstr "Vis versjon"
|
||||
|
||||
#: ../src/main.c:387
|
||||
#: ../src/main.c:379
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Modus som brukes av GDM for innloggingsskjermen"
|
||||
|
||||
#: ../src/main.c:393
|
||||
#: ../src/main.c:385
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
|
||||
|
||||
#: ../src/main.c:399
|
||||
#: ../src/main.c:391
|
||||
msgid "List possible modes"
|
||||
msgstr "Vis mulige modi"
|
||||
|
||||
#: ../src/shell-app.c:246
|
||||
#: ../src/shell-app.c:239
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Ukjent"
|
||||
|
||||
#: ../src/shell-app.c:487
|
||||
#: ../src/shell-app.c:480
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Klarte ikke å starte «%s»"
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:730
|
||||
#: ../src/shell-keyring-prompt.c:742
|
||||
msgid "Passwords do not match."
|
||||
msgstr "Passordene er ikke like."
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:738
|
||||
#: ../src/shell-keyring-prompt.c:750
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "Passordet kan ikke være tomt"
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:353
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Autentiseringsdialogen ble lukket av brukeren"
|
||||
|
361
po/pl.po
361
po/pl.po
@ -4,16 +4,16 @@
|
||||
# pomóc w jego rozwijaniu i pielęgnowaniu, napisz do nas:
|
||||
# gnomepl@aviary.pl
|
||||
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||||
# Piotr Drąg <piotrdrag@gmail.com>, 2009-2016.
|
||||
# Piotr Drąg <piotrdrag@gmail.com>, 2009-2015.
|
||||
# Tomasz Dominikowski <dominikowski@gmail.com>, 2009.
|
||||
# Wojciech Szczęsny <wszczesny@aviary.pl>, 2013.
|
||||
# Aviary.pl <gnomepl@aviary.pl>, 2009-2016.
|
||||
# Aviary.pl <gnomepl@aviary.pl>, 2009-2015.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnome-shell\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-03-10 17:25+0100\n"
|
||||
"PO-Revision-Date: 2016-03-10 17:27+0100\n"
|
||||
"POT-Creation-Date: 2015-08-24 15:27+0200\n"
|
||||
"PO-Revision-Date: 2015-08-24 15:28+0200\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <gnomepl@aviary.pl>\n"
|
||||
"Language: pl\n"
|
||||
@ -49,6 +49,15 @@ msgstr "Wyświetlenie wszystkich programów"
|
||||
msgid "Open the application menu"
|
||||
msgstr "Otwarcie menu programu"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "Powłoka środowiska GNOME"
|
||||
|
||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Zarządzanie oknami i uruchamianiem programów"
|
||||
|
||||
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
|
||||
msgid "GNOME Shell Extension Preferences"
|
||||
msgstr "Preferencje rozszerzenia powłoki GNOME"
|
||||
@ -57,13 +66,9 @@ msgstr "Preferencje rozszerzenia powłoki GNOME"
|
||||
msgid "Configure GNOME Shell Extensions"
|
||||
msgstr "Konfiguracja rozszerzeń powłoki GNOME"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:1
|
||||
msgid "GNOME Shell"
|
||||
msgstr "Powłoka środowiska GNOME"
|
||||
|
||||
#: ../data/org.gnome.Shell.desktop.in.in.h:2
|
||||
msgid "Window management and application launching"
|
||||
msgstr "Zarządzanie oknami i uruchamianiem programów"
|
||||
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
|
||||
msgid "GNOME Shell (wayland compositor)"
|
||||
msgstr "Powłoka środowiska GNOME (Wayland)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||
@ -166,99 +171,82 @@ msgid ""
|
||||
"'Remember Password' checkbox will be present. This key sets the default "
|
||||
"state of the checkbox."
|
||||
msgstr ""
|
||||
"Powłoka poprosi o hasło podczas montowania zaszyfrowanego urządzenia lub "
|
||||
"zdalnego systemu plików. Jeśli hasło może zostać zapisane do późniejszego "
|
||||
"użycia, to obecne będzie pole wyboru „Zapamiętanie hasła”. Ten klucz ustawia "
|
||||
"domyślną wartość tego pola."
|
||||
"Powłoka zażąda hasła po zamontowaniu zaszyfrowanego urządzenia lub zdalnego "
|
||||
"systemu plików. Jeśli hasło może zostać zapisane do późniejszego użycia, to "
|
||||
"obecne będzie pole wyboru „Zapamiętanie hasła”. Ten klucz ustawia domyślną "
|
||||
"wartość tego pola."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||
msgid ""
|
||||
"Whether the default Bluetooth adapter had set up devices associated to it"
|
||||
msgstr "Czy domyślny adapter Bluetooth ma powiązane ustawione urządzenia"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid ""
|
||||
"The shell will only show a Bluetooth menu item if a Bluetooth adapter is "
|
||||
"powered, or if there were devices set up associated with the default "
|
||||
"adapter. This will be reset if the default adapter is ever seen not to have "
|
||||
"devices associated to it."
|
||||
msgstr ""
|
||||
"Powłoka będzie wyświetlała menu Bluetooth tylko, jeśli adapter Bluetooth "
|
||||
"jest włączony lub są ustawione urządzenia powiązane z domyślnym adapterem. "
|
||||
"Zostanie to przywrócone, kiedy tylko domyślny adapter nie będzie miał "
|
||||
"żadnych powiązanych urządzeń."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Show the week date in the calendar"
|
||||
msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||
msgid "If true, display the ISO week date in the calendar."
|
||||
msgstr ""
|
||||
"Jeśli jest ustawione na „true”, to wyświetla w kalendarzu dzień tygodnia w "
|
||||
"formacie ISO."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||
msgid "Keybinding to open the application menu"
|
||||
msgstr "Skrót do otwarcia menu programu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||
msgid "Keybinding to open the application menu."
|
||||
msgstr "Skrót do otwarcia menu programu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||
msgid "Keybinding to open the \"Show Applications\" view"
|
||||
msgstr "Skrót do otwarcia widoku „Wyświetl programy”"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||
msgid ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr "Skrót do otwarcia widoku „Wyświetl programy” ekranu podglądu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||
msgid "Keybinding to open the overview"
|
||||
msgstr "Skrót do otwarcia ekranu podglądu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||
msgid "Keybinding to open the Activities Overview."
|
||||
msgstr "Skrót do otwarcia ekranu podglądu."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||
msgid "Keybinding to toggle the visibility of the notification list"
|
||||
msgstr "Skrót do przełączenia widoczności listy powiadomień"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||
msgid "Keybinding to toggle the visibility of the notification list."
|
||||
msgstr "Skrót do przełączenia widoczności listy powiadomień."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||
msgid "Keybinding to focus the active notification"
|
||||
msgstr "Skrót do aktywacji bieżącego powiadomienia"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "Keybinding to focus the active notification."
|
||||
msgstr "Skrót do aktywacji bieżącego powiadomienia."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
msgid ""
|
||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||
msgstr ""
|
||||
"Skrót wstrzymujący i wznawiający wszystkie działające klatki pośrednie (do "
|
||||
"celów debugowania)"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "Which keyboard to use"
|
||||
msgstr "Której klawiatury używać"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||
msgid "The type of keyboard to use."
|
||||
msgstr "Typ używanej klawiatury."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||
msgid "Limit switcher to current workspace."
|
||||
msgstr "Ograniczenie przełącznika do bieżącego obszaru roboczego."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||
msgid ""
|
||||
"If true, only applications that have windows on the current workspace are "
|
||||
"shown in the switcher. Otherwise, all applications are included."
|
||||
@ -267,11 +255,11 @@ msgstr ""
|
||||
"obszarze roboczym są wyświetlane w przełączniku. W przeciwnym przypadku "
|
||||
"wszystkie programy są załączone."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||
msgid "The application icon mode."
|
||||
msgstr "Tryb ikon programów."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||
msgid ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||
@ -281,7 +269,7 @@ msgstr ""
|
||||
"„thumbnail-only” (wyświetla miniaturę okna), „app-icon-only” (wyświetla "
|
||||
"tylko ikonę programu) lub „both” (wyświetla oba)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||
msgid ""
|
||||
"If true, only windows from the current workspace are shown in the switcher. "
|
||||
"Otherwise, all windows are included."
|
||||
@ -290,32 +278,32 @@ msgstr ""
|
||||
"wyświetlane w przełączniku. W przeciwnym przypadku wszystkie okna są "
|
||||
"załączone."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||
msgid "Attach modal dialog to the parent window"
|
||||
msgstr "Dołączanie modalnych okien dialogowych do okien nadrzędnych"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||
msgid ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Ten klucz zastępuje klucz w „org.gnome.mutter”, kiedy uruchomiona jest "
|
||||
"powłoka GNOME."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
"Włączenie kafelkowania przy krawędziach podczas przenoszenia okien do "
|
||||
"krawędzi ekranu"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Dynamiczne zarządzanie obszarami roboczymi"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||
msgid "Workspaces only on primary monitor"
|
||||
msgstr "Obszary robocze tylko na pierwszym monitorze"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
msgstr ""
|
||||
"Opóźnienie zmiany aktywności w trybie myszy do momentu, w którym kursor się "
|
||||
@ -325,53 +313,52 @@ msgstr ""
|
||||
msgid "Network Login"
|
||||
msgstr "Logowanie do sieci"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:121
|
||||
#: ../js/extensionPrefs/main.js:122
|
||||
#, javascript-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr ""
|
||||
"Wystąpił błąd podczas wczytywania okna preferencji dla rozszerzenia „%s”:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:153
|
||||
#: ../js/extensionPrefs/main.js:154
|
||||
msgid "GNOME Shell Extensions"
|
||||
msgstr "Rozszerzenia powłoki GNOME"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/audioDeviceSelection.js:71
|
||||
#: ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
|
||||
#: ../js/ui/components/polkitAgent.js:179 ../js/ui/endSessionDialog.js:452
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:916
|
||||
msgid "Cancel"
|
||||
msgstr "Anuluj"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:216
|
||||
#: ../js/gdm/authPrompt.js:448
|
||||
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
|
||||
#: ../js/gdm/authPrompt.js:435
|
||||
msgid "Next"
|
||||
msgstr "Dalej"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
|
||||
#: ../js/ui/unlockDialog.js:59
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokuj"
|
||||
|
||||
#: ../js/gdm/authPrompt.js:214
|
||||
#: ../js/gdm/authPrompt.js:213
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Zaloguj"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:285
|
||||
#: ../js/gdm/loginDialog.js:281
|
||||
msgid "Choose Session"
|
||||
msgstr "Wybór sesji"
|
||||
|
||||
#. 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:435
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "Inny użytkownik?"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:854
|
||||
#: ../js/gdm/loginDialog.js:847
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(np. użytkownik lub %s)"
|
||||
@ -379,12 +366,12 @@ msgstr "(np. użytkownik lub %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:859 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
|
||||
#: ../js/ui/components/networkAgent.js:289
|
||||
msgid "Username: "
|
||||
msgstr "Nazwa użytkownika: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1196
|
||||
#: ../js/gdm/loginDialog.js:1181
|
||||
msgid "Login Window"
|
||||
msgstr "Okno logowania"
|
||||
|
||||
@ -520,36 +507,16 @@ msgstr "Dodaj do ulubionych"
|
||||
msgid "Show Details"
|
||||
msgstr "Wyświetl szczegóły"
|
||||
|
||||
#: ../js/ui/appFavorites.js:134
|
||||
#: ../js/ui/appFavorites.js:132
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
msgstr "Program „%s” został dodany do ulubionych."
|
||||
|
||||
#: ../js/ui/appFavorites.js:168
|
||||
#: ../js/ui/appFavorites.js:166
|
||||
#, javascript-format
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Program „%s” został usunięty z ulubionych."
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:59
|
||||
msgid "Select Audio Device"
|
||||
msgstr "Wybór urządzenia dźwiękowego"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:69
|
||||
msgid "Sound Settings"
|
||||
msgstr "Ustawienia dźwięku"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:78
|
||||
msgid "Headphones"
|
||||
msgstr "Słuchawki"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:80
|
||||
msgid "Headset"
|
||||
msgstr "Słuchawki z mikrofonem"
|
||||
|
||||
#: ../js/ui/audioDeviceSelection.js:82 ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19
|
||||
msgid "Change Background…"
|
||||
msgstr "Zmień tło…"
|
||||
@ -558,12 +525,13 @@ msgstr "Zmień tło…"
|
||||
msgid "Display Settings"
|
||||
msgstr "Ustawienia ekranu"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366
|
||||
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
|
||||
#: ../js/ui/status/system.js:366
|
||||
msgid "Settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
|
||||
#: ../js/ui/calendar.js:47
|
||||
#: ../js/ui/calendar.js:55
|
||||
msgctxt "calendar-no-work"
|
||||
msgid "06"
|
||||
msgstr "06"
|
||||
@ -573,96 +541,94 @@ msgstr "06"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#.
|
||||
#: ../js/ui/calendar.js:76
|
||||
#: ../js/ui/calendar.js:84
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "N"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday
|
||||
#: ../js/ui/calendar.js:78
|
||||
#: ../js/ui/calendar.js:86
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "P"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday
|
||||
#: ../js/ui/calendar.js:80
|
||||
#: ../js/ui/calendar.js:88
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "W"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday
|
||||
#: ../js/ui/calendar.js:82
|
||||
#: ../js/ui/calendar.js:90
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "Ś"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday
|
||||
#: ../js/ui/calendar.js:84
|
||||
#: ../js/ui/calendar.js:92
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "C"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday
|
||||
#: ../js/ui/calendar.js:86
|
||||
#: ../js/ui/calendar.js:94
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "P"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday
|
||||
#: ../js/ui/calendar.js:88
|
||||
#: ../js/ui/calendar.js:96
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
#: ../js/ui/calendar.js:416
|
||||
#: ../js/ui/calendar.js:566
|
||||
msgid "Previous month"
|
||||
msgstr "Poprzedni miesiąc"
|
||||
|
||||
#: ../js/ui/calendar.js:426
|
||||
#: ../js/ui/calendar.js:576
|
||||
msgid "Next month"
|
||||
msgstr "Następny miesiąc"
|
||||
|
||||
#: ../js/ui/calendar.js:579
|
||||
#, no-javascript-format
|
||||
msgctxt "date day number format"
|
||||
msgid "%d"
|
||||
msgstr "%d"
|
||||
|
||||
#: ../js/ui/calendar.js:634
|
||||
#: ../js/ui/calendar.js:783
|
||||
msgid "Week %V"
|
||||
msgstr "%V. tydzień"
|
||||
msgstr "%V tydzień"
|
||||
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#.
|
||||
#: ../js/ui/calendar.js:695
|
||||
#: ../js/ui/calendar.js:1188
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Cały dzień"
|
||||
|
||||
#: ../js/ui/calendar.js:821
|
||||
#: ../js/ui/calendar.js:1291
|
||||
msgid "Clear section"
|
||||
msgstr "Wyczyść"
|
||||
|
||||
#: ../js/ui/calendar.js:1518
|
||||
msgid "Events"
|
||||
msgstr "Wydarzenia"
|
||||
|
||||
#: ../js/ui/calendar.js:830
|
||||
#: ../js/ui/calendar.js:1527
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e %B"
|
||||
|
||||
#: ../js/ui/calendar.js:834
|
||||
#: ../js/ui/calendar.js:1531
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %e %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:919
|
||||
#: ../js/ui/calendar.js:1616
|
||||
msgid "Notifications"
|
||||
msgstr "Powiadomienia"
|
||||
|
||||
#: ../js/ui/calendar.js:1070
|
||||
#: ../js/ui/calendar.js:1767
|
||||
msgid "No Notifications"
|
||||
msgstr "Brak powiadomień"
|
||||
|
||||
#: ../js/ui/calendar.js:1073
|
||||
#: ../js/ui/calendar.js:1770
|
||||
msgid "No Events"
|
||||
msgstr "Brak wydarzeń"
|
||||
|
||||
@ -674,7 +640,7 @@ msgstr "Podłączono dysk zewnętrzny"
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Odłączono dysk zewnętrzny"
|
||||
|
||||
#: ../js/ui/components/autorunManager.js:355
|
||||
#: ../js/ui/components/autorunManager.js:354
|
||||
#, javascript-format
|
||||
msgid "Open with %s"
|
||||
msgstr "Otwórz za pomocą „%s”"
|
||||
@ -993,11 +959,11 @@ msgid "Keyboard"
|
||||
msgstr "Klawiatura"
|
||||
|
||||
#. translators: 'Hide' is a verb
|
||||
#: ../js/ui/legacyTray.js:65
|
||||
#: ../js/ui/legacyTray.js:66
|
||||
msgid "Hide tray"
|
||||
msgstr "Ukryj obszar powiadamiania"
|
||||
|
||||
#: ../js/ui/legacyTray.js:106
|
||||
#: ../js/ui/legacyTray.js:107
|
||||
msgid "Status Icons"
|
||||
msgstr "Ikony stanu"
|
||||
|
||||
@ -1025,7 +991,7 @@ msgstr "Włączone"
|
||||
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828
|
||||
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Wyłączone"
|
||||
|
||||
@ -1049,26 +1015,10 @@ msgstr "Wyświetl źródło"
|
||||
msgid "Web Page"
|
||||
msgstr "Strona WWW"
|
||||
|
||||
#: ../js/ui/messageList.js:543
|
||||
msgid "Clear section"
|
||||
msgstr "Wyczyść"
|
||||
|
||||
#: ../js/ui/messageTray.js:1486
|
||||
msgid "System Information"
|
||||
msgstr "Informacje systemowe"
|
||||
|
||||
#: ../js/ui/mpris.js:194
|
||||
msgid "Unknown artist"
|
||||
msgstr "Nieznany wykonawca"
|
||||
|
||||
#: ../js/ui/mpris.js:195
|
||||
msgid "Unknown title"
|
||||
msgstr "Nieznany tytuł"
|
||||
|
||||
#: ../js/ui/mpris.js:217
|
||||
msgid "Media"
|
||||
msgstr "Multimedia"
|
||||
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "Cofnij"
|
||||
@ -1085,22 +1035,17 @@ msgstr "Podgląd"
|
||||
msgid "Type to search…"
|
||||
msgstr "Wyszukiwanie…"
|
||||
|
||||
#: ../js/ui/panel.js:358
|
||||
#: ../js/ui/panel.js:352
|
||||
msgid "Quit"
|
||||
msgstr "Zakończ"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:414
|
||||
#: ../js/ui/panel.js:404
|
||||
msgid "Activities"
|
||||
msgstr "Podgląd"
|
||||
|
||||
#: ../js/ui/panel.js:695
|
||||
msgctxt "System menu in the top bar"
|
||||
msgid "System"
|
||||
msgstr "Menu systemowe"
|
||||
|
||||
#: ../js/ui/panel.js:807
|
||||
#: ../js/ui/panel.js:754
|
||||
msgid "Top Bar"
|
||||
msgstr "Górny pasek"
|
||||
|
||||
@ -1113,15 +1058,15 @@ msgstr "Górny pasek"
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:71
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
msgstr "Proszę wprowadzić polecenie"
|
||||
|
||||
#: ../js/ui/runDialog.js:111 ../js/ui/windowMenu.js:162
|
||||
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
|
||||
msgid "Close"
|
||||
msgstr "Zamknij"
|
||||
|
||||
#: ../js/ui/runDialog.js:282
|
||||
#: ../js/ui/runDialog.js:281
|
||||
msgid "Restarting…"
|
||||
msgstr "Ponowne uruchamianie…"
|
||||
|
||||
@ -1246,16 +1191,19 @@ msgstr "Wysoki kontrast"
|
||||
msgid "Large Text"
|
||||
msgstr "Duży tekst"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:47
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Wyłącz"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:56
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Ustawienia Bluetooth"
|
||||
|
||||
#. Translators: this is the number of connected bluetooth devices
|
||||
#: ../js/ui/status/bluetooth.js:136
|
||||
#: ../js/ui/status/bluetooth.js:105
|
||||
#, javascript-format
|
||||
msgid "%d Connected"
|
||||
msgid_plural "%d Connected"
|
||||
@ -1263,25 +1211,10 @@ msgstr[0] "%d połączone urządzenie"
|
||||
msgstr[1] "%d połączone urządzenia"
|
||||
msgstr[2] "%d połączonych urządzeń"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:138
|
||||
msgid "Off"
|
||||
msgstr "Wyłączono"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:140
|
||||
#: ../js/ui/status/bluetooth.js:107
|
||||
msgid "Not In Use"
|
||||
msgstr "Nieużywane"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Włącz"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:142 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:353 ../js/ui/status/network.js:1279
|
||||
#: ../js/ui/status/network.js:1394 ../js/ui/status/rfkill.js:90
|
||||
#: ../js/ui/status/rfkill.js:117
|
||||
msgid "Turn Off"
|
||||
msgstr "Wyłącz"
|
||||
|
||||
#: ../js/ui/status/brightness.js:44
|
||||
msgid "Brightness"
|
||||
msgstr "Jasność"
|
||||
@ -1290,49 +1223,30 @@ msgstr "Jasność"
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Wyświetl układ klawiatury"
|
||||
|
||||
#: ../js/ui/status/location.js:107 ../js/ui/status/location.js:215
|
||||
#: ../js/ui/status/location.js:71 ../js/ui/status/location.js:177
|
||||
msgid "Location Enabled"
|
||||
msgstr "Włączono ustalanie położenia"
|
||||
msgstr "Włączono położenie"
|
||||
|
||||
#: ../js/ui/status/location.js:108 ../js/ui/status/location.js:216
|
||||
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:178
|
||||
msgid "Disable"
|
||||
msgstr "Wyłącz"
|
||||
|
||||
#: ../js/ui/status/location.js:109
|
||||
#: ../js/ui/status/location.js:73
|
||||
msgid "Privacy Settings"
|
||||
msgstr "Ustawienia prywatności"
|
||||
|
||||
#: ../js/ui/status/location.js:214
|
||||
#: ../js/ui/status/location.js:176
|
||||
msgid "Location In Use"
|
||||
msgstr "Ustalanie położenia jest używane"
|
||||
msgstr "Położenie jest używane"
|
||||
|
||||
#: ../js/ui/status/location.js:218
|
||||
#: ../js/ui/status/location.js:180
|
||||
msgid "Location Disabled"
|
||||
msgstr "Wyłączono ustalanie położenia"
|
||||
msgstr "Wyłączono położenie"
|
||||
|
||||
#: ../js/ui/status/location.js:219
|
||||
#: ../js/ui/status/location.js:181
|
||||
msgid "Enable"
|
||||
msgstr "Włącz"
|
||||
|
||||
#: ../js/ui/status/location.js:426
|
||||
msgid "Deny Access"
|
||||
msgstr "Odmów dostępu"
|
||||
|
||||
#: ../js/ui/status/location.js:429
|
||||
msgid "Grant Access"
|
||||
msgstr "Udziel dostępu"
|
||||
|
||||
#. Translators: %s is an application name
|
||||
#: ../js/ui/status/location.js:435
|
||||
#, javascript-format
|
||||
msgid "Give %s access to your location?"
|
||||
msgstr "Udzielić programowi „%s” dostępu do położenia użytkownika?"
|
||||
|
||||
#: ../js/ui/status/location.js:437
|
||||
msgid "Location access can be changed at any time from the privacy settings."
|
||||
msgstr ""
|
||||
"W każdej chwili można zmienić dostęp do położenia w ustawieniach prywatności."
|
||||
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
msgstr "<nieznane>"
|
||||
@ -1468,6 +1382,10 @@ msgstr "Wybierz sieć"
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Ustawienia sieci Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1279
|
||||
msgid "Turn On"
|
||||
msgstr "Włącz"
|
||||
|
||||
#. Translators: %s is a network identifier
|
||||
#: ../js/ui/status/network.js:1296
|
||||
#, javascript-format
|
||||
@ -1517,37 +1435,32 @@ msgstr "Połączenie się nie powiodło"
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktywacja połączenia sieciowego się nie powiodła"
|
||||
|
||||
#: ../js/ui/status/power.js:61
|
||||
#: ../js/ui/status/power.js:49
|
||||
msgid "Power Settings"
|
||||
msgstr "Ustawienia zasilania"
|
||||
|
||||
#: ../js/ui/status/power.js:77
|
||||
#: ../js/ui/status/power.js:65
|
||||
msgid "Fully Charged"
|
||||
msgstr "Naładowane"
|
||||
|
||||
#. 0 is reported when UPower does not have enough data
|
||||
#. to estimate battery life
|
||||
#: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90
|
||||
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
|
||||
msgid "Estimating…"
|
||||
msgstr "Obliczanie…"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
|
||||
#: ../js/ui/status/power.js:98
|
||||
#: ../js/ui/status/power.js:86
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Remaining (%d %%)"
|
||||
msgid "%d∶%02d Remaining (%d%%)"
|
||||
msgstr "Pozostało: %d∶%02d (%d%%)"
|
||||
|
||||
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
|
||||
#: ../js/ui/status/power.js:103
|
||||
#: ../js/ui/status/power.js:91
|
||||
#, javascript-format
|
||||
msgid "%d∶%02d Until Full (%d %%)"
|
||||
msgid "%d∶%02d Until Full (%d%%)"
|
||||
msgstr "Do naładowania: %d∶%02d (%d%%)"
|
||||
|
||||
#: ../js/ui/status/power.js:131 ../js/ui/status/power.js:133
|
||||
#, javascript-format
|
||||
msgid "%d %%"
|
||||
msgstr "%d%%"
|
||||
|
||||
#. The menu only appears when airplane mode is on, so just
|
||||
#. statically build it as if it was on, rather than dynamically
|
||||
#. changing the menu contents.
|
||||
@ -1587,6 +1500,10 @@ msgstr "Zmieniono głośność"
|
||||
msgid "Volume"
|
||||
msgstr "Głośność"
|
||||
|
||||
#: ../js/ui/status/volume.js:213
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofon"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:67
|
||||
msgid "Log in as another user"
|
||||
msgstr "Zaloguj jako inny użytkownik"
|
||||
@ -1708,7 +1625,7 @@ msgstr "Kalendarz programu Evolution"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound outputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1835
|
||||
#: ../src/gvc/gvc-mixer-control.c:1837
|
||||
#, c-format
|
||||
msgid "%u Output"
|
||||
msgid_plural "%u Outputs"
|
||||
@ -1718,7 +1635,7 @@ msgstr[2] "%u wyjść"
|
||||
|
||||
#. translators:
|
||||
#. * The number of sound inputs on a particular device
|
||||
#: ../src/gvc/gvc-mixer-control.c:1845
|
||||
#: ../src/gvc/gvc-mixer-control.c:1847
|
||||
#, c-format
|
||||
msgid "%u Input"
|
||||
msgid_plural "%u Inputs"
|
||||
@ -1726,44 +1643,44 @@ msgstr[0] "%u wejście"
|
||||
msgstr[1] "%u wejścia"
|
||||
msgstr[2] "%u wejść"
|
||||
|
||||
#: ../src/gvc/gvc-mixer-control.c:2371
|
||||
#: ../src/gvc/gvc-mixer-control.c:2373
|
||||
msgid "System Sounds"
|
||||
msgstr "Dźwięki systemowe"
|
||||
|
||||
#: ../src/main.c:381
|
||||
#: ../src/main.c:373
|
||||
msgid "Print version"
|
||||
msgstr "Wyświetla wersję"
|
||||
|
||||
#: ../src/main.c:387
|
||||
#: ../src/main.c:379
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Tryb używany przez GDM dla ekranu logowania"
|
||||
|
||||
#: ../src/main.c:393
|
||||
#: ../src/main.c:385
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Używa podanego trybu, np. „gdm” dla ekranu logowania"
|
||||
|
||||
#: ../src/main.c:399
|
||||
#: ../src/main.c:391
|
||||
msgid "List possible modes"
|
||||
msgstr "Wyświetla listę możliwych trybów"
|
||||
|
||||
#: ../src/shell-app.c:246
|
||||
#: ../src/shell-app.c:239
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Nieznany"
|
||||
|
||||
#: ../src/shell-app.c:487
|
||||
#: ../src/shell-app.c:480
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "Uruchomienie „%s” się nie powiodło"
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:730
|
||||
#: ../src/shell-keyring-prompt.c:742
|
||||
msgid "Passwords do not match."
|
||||
msgstr "Hasła się nie zgadzają."
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:738
|
||||
#: ../src/shell-keyring-prompt.c:750
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "Hasło nie może być puste"
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:353
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Okno dialogowe uwierzytelnienia zostało odrzucone przez użytkownika"
|
||||
|
707
po/pt_BR.po
707
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
915
po/sr@latin.po
915
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user