Compare commits
	
		
			1 Commits
		
	
	
		
			3.21.4
			...
			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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										241
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										241
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,244 +1,3 @@
 | 
			
		||||
3.21.4
 | 
			
		||||
======
 | 
			
		||||
* overview: Fix switching workspaces when scrolling on non-primary monitors
 | 
			
		||||
  [Florian; #766883, #768316]
 | 
			
		||||
* Fix crash when using screen recorder under wayland [Rui; #767001]
 | 
			
		||||
* Update theme on video memory purge errors [Rui; #739178]
 | 
			
		||||
* Free old backgrounds immediately [Hyungwon; #766353]
 | 
			
		||||
* Add support for system upgrades to end session dialog [Kalev; #763611]
 | 
			
		||||
* Fix maximized windows flickering to the wrong size on restart [Owen; #761566]
 | 
			
		||||
* Hide ignored events in calendar as well [Florian; #768538]
 | 
			
		||||
* calendar: Only hide dismissed occurrence of recurring event [Florian; #748226]
 | 
			
		||||
* Provide org.freedesktop.impl.portal.access implementation [Florian; #768669]
 | 
			
		||||
* Misc. bug fixes and cleanups [Rui, Florian, Marinus, Jonas; #767954, #768317,
 | 
			
		||||
  #746867, #762206, #768956, #768979]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Piotr Drąg, Hyungwon Hwang, Kalev Lember, Rui Matos,
 | 
			
		||||
  Florian Müllner, Marinus Schraal, Owen W. Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Andika Triwidada [id], Daniel Mustieles [es], Bruce Cowan [en_GB],
 | 
			
		||||
  Dušan Kazik [sk], Piotr Drąg [pl], Chao-Hsiung Liao [zh_HK]
 | 
			
		||||
 | 
			
		||||
3.21.3
 | 
			
		||||
======
 | 
			
		||||
 * Do not disable suspend action when locked [Florian; #725960]
 | 
			
		||||
 * Remember input sources MRU list [Cosimo; #766826]
 | 
			
		||||
 * networkAgent: Handle VPN service aliases [David; #658484]
 | 
			
		||||
 * Plug a memory leak [Hans; #710230]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Cosimo Cecchi, Florian Müllner, Hans Petter Jansson, David Woodhouse
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Tiago Santos [pt], Cédric Valmary [oc], Muhammet Kara [tr],
 | 
			
		||||
  Daniel Mustieles [es], Rafael Fontenelle [pt_BR]
 | 
			
		||||
 | 
			
		||||
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.4],[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.4
 | 
			
		||||
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.3)
 | 
			
		||||
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,14 +2,11 @@ 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
 | 
			
		||||
 | 
			
		||||
portaldir = $(datadir)/xdg-desktop-portal/portals
 | 
			
		||||
portal_DATA = gnome-shell.portal
 | 
			
		||||
 | 
			
		||||
servicedir = $(datadir)/dbus-1/services
 | 
			
		||||
service_DATA = org.gnome.Shell.PortalHelper.service
 | 
			
		||||
 | 
			
		||||
@@ -107,9 +104,9 @@ 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	\
 | 
			
		||||
	$(portal_DATA)					\
 | 
			
		||||
	$(introspection_DATA)				\
 | 
			
		||||
	$(menu_DATA)					\
 | 
			
		||||
	$(convert_DATA)					\
 | 
			
		||||
@@ -124,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
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
[portal]
 | 
			
		||||
DBusName=org.freedesktop.impl.portal.desktop.gnome
 | 
			
		||||
Interfaces=org.freedesktop.impl.portal.Access
 | 
			
		||||
UseIn=gnome
 | 
			
		||||
@@ -51,7 +51,7 @@
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="looking-glass-history" type="as">
 | 
			
		||||
      <default>[]</default>
 | 
			
		||||
      <!-- Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass -->
 | 
			
		||||
      <!-- Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass -->
 | 
			
		||||
      <_summary>History for the looking glass dialog</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="always-show-log-out" type="b">
 | 
			
		||||
@@ -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,77 +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; }
 | 
			
		||||
 | 
			
		||||
/* Access Dialog */
 | 
			
		||||
.access-dialog {
 | 
			
		||||
  spacing: 30px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-main-layout {
 | 
			
		||||
  padding: 12px 20px 0;
 | 
			
		||||
  spacing: 12px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-content {
 | 
			
		||||
  max-width: 28em;
 | 
			
		||||
  spacing: 20px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-icon {
 | 
			
		||||
  min-width: 48px;
 | 
			
		||||
  icon-size: 48px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-title {
 | 
			
		||||
  font-weight: bold; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-subtitle {
 | 
			
		||||
  color: #999999;
 | 
			
		||||
  font-weight: bold; }
 | 
			
		||||
 | 
			
		||||
/* 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;
 | 
			
		||||
@@ -479,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; }
 | 
			
		||||
@@ -558,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 {
 | 
			
		||||
@@ -699,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; }
 | 
			
		||||
 | 
			
		||||
@@ -792,7 +716,7 @@ StScrollBar {
 | 
			
		||||
  border-radius: 1.4em; }
 | 
			
		||||
  .calendar-day-base:hover, .calendar-day-base:focus {
 | 
			
		||||
    background-color: #0d0d0d; }
 | 
			
		||||
  .calendar-day-base:active, .calendar-day-base:selected {
 | 
			
		||||
  .calendar-day-base:active {
 | 
			
		||||
    color: white;
 | 
			
		||||
    background-color: #215d9c;
 | 
			
		||||
    border-color: transparent; }
 | 
			
		||||
@@ -826,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; }
 | 
			
		||||
@@ -895,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; }
 | 
			
		||||
@@ -927,7 +823,7 @@ StScrollBar {
 | 
			
		||||
    color: transparent; }
 | 
			
		||||
 | 
			
		||||
.aggregate-menu {
 | 
			
		||||
  min-width: 21em; }
 | 
			
		||||
  width: 360px; }
 | 
			
		||||
  .aggregate-menu .popup-menu-icon {
 | 
			
		||||
    padding: 0 4px; }
 | 
			
		||||
 | 
			
		||||
@@ -1064,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: 7ab2789464...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,77 +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; }
 | 
			
		||||
 | 
			
		||||
/* Access Dialog */
 | 
			
		||||
.access-dialog {
 | 
			
		||||
  spacing: 30px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-main-layout {
 | 
			
		||||
  padding: 12px 20px 0;
 | 
			
		||||
  spacing: 12px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-content {
 | 
			
		||||
  max-width: 28em;
 | 
			
		||||
  spacing: 20px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-icon {
 | 
			
		||||
  min-width: 48px;
 | 
			
		||||
  icon-size: 48px; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-title {
 | 
			
		||||
  font-weight: bold; }
 | 
			
		||||
 | 
			
		||||
.access-dialog-subtitle {
 | 
			
		||||
  color: #8e8e80;
 | 
			
		||||
  font-weight: bold; }
 | 
			
		||||
 | 
			
		||||
/* 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;
 | 
			
		||||
@@ -479,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; }
 | 
			
		||||
@@ -558,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 {
 | 
			
		||||
@@ -699,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; }
 | 
			
		||||
 | 
			
		||||
@@ -792,7 +716,7 @@ StScrollBar {
 | 
			
		||||
  border-radius: 1.4em; }
 | 
			
		||||
  .calendar-day-base:hover, .calendar-day-base:focus {
 | 
			
		||||
    background-color: #454c4c; }
 | 
			
		||||
  .calendar-day-base:active, .calendar-day-base:selected {
 | 
			
		||||
  .calendar-day-base:active {
 | 
			
		||||
    color: white;
 | 
			
		||||
    background-color: #215d9c;
 | 
			
		||||
    border-color: transparent; }
 | 
			
		||||
@@ -826,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; }
 | 
			
		||||
@@ -895,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; }
 | 
			
		||||
@@ -927,7 +823,7 @@ StScrollBar {
 | 
			
		||||
    color: transparent; }
 | 
			
		||||
 | 
			
		||||
.aggregate-menu {
 | 
			
		||||
  min-width: 21em; }
 | 
			
		||||
  width: 280px; }
 | 
			
		||||
  .aggregate-menu .popup-menu-icon {
 | 
			
		||||
    padding: 0 4px; }
 | 
			
		||||
 | 
			
		||||
@@ -1064,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;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,12 +31,10 @@
 | 
			
		||||
 | 
			
		||||
    <file>portalHelper/main.js</file>
 | 
			
		||||
 | 
			
		||||
    <file>ui/accessDialog.js</file>
 | 
			
		||||
    <file>ui/altTab.js</file>
 | 
			
		||||
    <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>
 | 
			
		||||
@@ -64,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>';
 | 
			
		||||
 | 
			
		||||
@@ -134,13 +131,10 @@ const LoginManagerSystemd = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    canSuspend: function(asyncCallback) {
 | 
			
		||||
        this._proxy.CanSuspendRemote(function(result, error) {
 | 
			
		||||
            if (error) {
 | 
			
		||||
                asyncCallback(false, false);
 | 
			
		||||
            } else {
 | 
			
		||||
                let needsAuth = result[0] == 'challenge';
 | 
			
		||||
                let canSuspend = needsAuth || result[0] == 'yes';
 | 
			
		||||
                asyncCallback(canSuspend, needsAuth);
 | 
			
		||||
            }
 | 
			
		||||
            if (error)
 | 
			
		||||
                asyncCallback(false);
 | 
			
		||||
            else
 | 
			
		||||
                asyncCallback(result[0] != 'no' && result[0] != 'na');
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -193,7 +187,7 @@ const LoginManagerDummy = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    canSuspend: function(asyncCallback) {
 | 
			
		||||
        asyncCallback(false, false);
 | 
			
		||||
        asyncCallback(false);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    listSessions: function(asyncCallback) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,202 +0,0 @@
 | 
			
		||||
const Clutter = imports.gi.Clutter;
 | 
			
		||||
const Gio = imports.gi.Gio;
 | 
			
		||||
const GLib = imports.gi.GLib;
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
const Pango = imports.gi.Pango;
 | 
			
		||||
const Shell = imports.gi.Shell;
 | 
			
		||||
const St = imports.gi.St;
 | 
			
		||||
 | 
			
		||||
const CheckBox = imports.ui.checkBox;
 | 
			
		||||
const ModalDialog = imports.ui.modalDialog;
 | 
			
		||||
 | 
			
		||||
const RequestIface = '<node> \
 | 
			
		||||
<interface name="org.freedesktop.impl.portal.Request"> \
 | 
			
		||||
<method name="Close"/> \
 | 
			
		||||
</interface> \
 | 
			
		||||
</node>';
 | 
			
		||||
 | 
			
		||||
const AccessIface = '<node> \
 | 
			
		||||
<interface name="org.freedesktop.impl.portal.Access"> \
 | 
			
		||||
<method name="AccessDialog"> \
 | 
			
		||||
  <arg type="o" name="handle" direction="in"/> \
 | 
			
		||||
  <arg type="s" name="app_id" direction="in"/> \
 | 
			
		||||
  <arg type="s" name="parent_window" direction="in"/> \
 | 
			
		||||
  <arg type="s" name="title" direction="in"/> \
 | 
			
		||||
  <arg type="s" name="subtitle" direction="in"/> \
 | 
			
		||||
  <arg type="s" name="body" direction="in"/> \
 | 
			
		||||
  <arg type="a{sv}" name="options" direction="in"/> \
 | 
			
		||||
  <arg type="u" name="response" direction="out"/> \
 | 
			
		||||
  <arg type="a{sv}" name="results" direction="out"/> \
 | 
			
		||||
</method> \
 | 
			
		||||
</interface> \
 | 
			
		||||
</node>';
 | 
			
		||||
 | 
			
		||||
const DialogResponse = {
 | 
			
		||||
    OK: 0,
 | 
			
		||||
    CANCEL: 1,
 | 
			
		||||
    CLOSED: 2
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const AccessDialog = new Lang.Class({
 | 
			
		||||
    Name: 'AccessDialog',
 | 
			
		||||
    Extends: ModalDialog.ModalDialog,
 | 
			
		||||
 | 
			
		||||
    _init: function(invocation, handle, title, subtitle, body, options) {
 | 
			
		||||
        this.parent({ styleClass: 'access-dialog' });
 | 
			
		||||
 | 
			
		||||
        this._invocation = invocation;
 | 
			
		||||
        this._handle = handle;
 | 
			
		||||
 | 
			
		||||
        this._requestExported = false;
 | 
			
		||||
        this._request = Gio.DBusExportedObject.wrapJSObject(RequestIface, this);
 | 
			
		||||
 | 
			
		||||
        for (let option in options)
 | 
			
		||||
            options[option] = options[option].deep_unpack();
 | 
			
		||||
 | 
			
		||||
        this._buildLayout(title, subtitle, body, options);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _buildLayout: function(title, subtitle, body, options) {
 | 
			
		||||
        // No support for non-modal system dialogs, so ignore the option
 | 
			
		||||
        //let modal = options['modal'] || true;
 | 
			
		||||
        let denyLabel = options['deny_label'] || _("Deny Access");
 | 
			
		||||
        let grantLabel = options['grant_label'] || _("Grant Access");
 | 
			
		||||
        let iconName = options['icon'] || null;
 | 
			
		||||
        let choices = options['choices'] || [];
 | 
			
		||||
 | 
			
		||||
        let mainContentBox = new St.BoxLayout();
 | 
			
		||||
        mainContentBox.style_class = 'access-dialog-main-layout';
 | 
			
		||||
        this.contentLayout.add_actor(mainContentBox);
 | 
			
		||||
 | 
			
		||||
        let icon = new St.Icon({ style_class: 'access-dialog-icon',
 | 
			
		||||
                                 icon_name: iconName,
 | 
			
		||||
                                 y_align: Clutter.ActorAlign.START });
 | 
			
		||||
        mainContentBox.add_actor(icon);
 | 
			
		||||
 | 
			
		||||
        let messageBox = new St.BoxLayout({ vertical: true });
 | 
			
		||||
        messageBox.style_class = 'access-dialog-content',
 | 
			
		||||
        mainContentBox.add_actor(messageBox);
 | 
			
		||||
 | 
			
		||||
        let label;
 | 
			
		||||
        label = new St.Label({ style_class: 'access-dialog-title headline',
 | 
			
		||||
                               text: title });
 | 
			
		||||
        messageBox.add_actor(label);
 | 
			
		||||
 | 
			
		||||
        label = new St.Label({ style_class: 'access-dialog-subtitle',
 | 
			
		||||
                               text: subtitle });
 | 
			
		||||
        label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        label.clutter_text.line_wrap = true;
 | 
			
		||||
        messageBox.add_actor(label);
 | 
			
		||||
 | 
			
		||||
        this._choices = new Map();
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < choices.length; i++) {
 | 
			
		||||
            let [id, name, opts, selected] = choices[i];
 | 
			
		||||
            if (opts.length > 0)
 | 
			
		||||
                continue; // radio buttons, not implemented
 | 
			
		||||
 | 
			
		||||
            let check = new CheckBox.CheckBox();
 | 
			
		||||
            check.getLabelActor().text = name;
 | 
			
		||||
            check.actor.checked = selected == "true";
 | 
			
		||||
            messageBox.add_actor(check.actor);
 | 
			
		||||
 | 
			
		||||
            this._choices.set(id, check);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        label = new St.Label({ text: body });
 | 
			
		||||
        label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
 | 
			
		||||
        label.clutter_text.line_wrap = true;
 | 
			
		||||
        messageBox.add_actor(label);
 | 
			
		||||
 | 
			
		||||
        this.addButton({ label: denyLabel,
 | 
			
		||||
                         action: () => {
 | 
			
		||||
                             this._sendResponse(DialogResponse.CANCEL);
 | 
			
		||||
                         },
 | 
			
		||||
                         key: Clutter.KEY_Escape });
 | 
			
		||||
        this.addButton({ label: grantLabel,
 | 
			
		||||
                         action: () => {
 | 
			
		||||
                             this._sendResponse(DialogResponse.OK);
 | 
			
		||||
                         }});
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    open: function() {
 | 
			
		||||
        this.parent();
 | 
			
		||||
 | 
			
		||||
        let connection = this._invocation.get_connection();
 | 
			
		||||
        this._requestExported = this._request.export(connection, this._handle);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    CloseAsync: function(invocation, params) {
 | 
			
		||||
        if (this._invocation.get_sender() != invocation.get_sender()) {
 | 
			
		||||
            invocation.return_error_literal(Gio.DBusError,
 | 
			
		||||
                                            Gio.DBusError.ACCESS_DENIED,
 | 
			
		||||
                                            '');
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._sendResponse(DialogResponse.CLOSED);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _sendResponse: function(response) {
 | 
			
		||||
        if (this._requestExported)
 | 
			
		||||
            this._request.unexport();
 | 
			
		||||
        this._requestExported = false;
 | 
			
		||||
 | 
			
		||||
        let results = {};
 | 
			
		||||
        if (response == DialogResponse.OK) {
 | 
			
		||||
            for (let [id, check] of this._choices) {
 | 
			
		||||
                let checked = check.actor.checked ? 'true' : 'false';
 | 
			
		||||
                results[id] = new GLib.Variant('s', checked);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Delay actual response until the end of the close animation (if any)
 | 
			
		||||
        this.connect('closed', () => {
 | 
			
		||||
            this._invocation.return_value(new GLib.Variant('(ua{sv})',
 | 
			
		||||
                                                           [response, results]));
 | 
			
		||||
        });
 | 
			
		||||
        this.close();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const AccessDialogDBus = new Lang.Class({
 | 
			
		||||
    Name: 'AccessDialogDBus',
 | 
			
		||||
 | 
			
		||||
    _init: function() {
 | 
			
		||||
        this._accessDialog = null;
 | 
			
		||||
 | 
			
		||||
        this._windowTracker = Shell.WindowTracker.get_default();
 | 
			
		||||
 | 
			
		||||
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(AccessIface, this);
 | 
			
		||||
        this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/portal/desktop');
 | 
			
		||||
 | 
			
		||||
        Gio.DBus.session.own_name('org.freedesktop.impl.portal.desktop.gnome', Gio.BusNameOwnerFlags.REPLACE, null, null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    AccessDialogAsync: function(params, invocation) {
 | 
			
		||||
        if (this._accessDialog) {
 | 
			
		||||
            invocation.return_error_literal(Gio.DBusError,
 | 
			
		||||
                                            Gio.DBusError.LIMITS_EXCEEDED,
 | 
			
		||||
                                            'Already showing a system access dialog');
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let [handle, appId, parentWindow, title, subtitle, body, options] = params;
 | 
			
		||||
        // We probably want to use parentWindow and global.display.focus_window
 | 
			
		||||
        // for this check in the future
 | 
			
		||||
        if (appId && appId + '.desktop' != this._windowTracker.focus_app.id) {
 | 
			
		||||
            invocation.return_error_literal(Gio.DBusError,
 | 
			
		||||
                                            Gio.DBusError.ACCESS_DENIED,
 | 
			
		||||
                                            'Only the focused app is allowed to show a system access dialog');
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let dialog = new AccessDialog(invocation, handle, title,
 | 
			
		||||
                                      subtitle, body, options);
 | 
			
		||||
        dialog.open();
 | 
			
		||||
 | 
			
		||||
        dialog.connect('closed', () => { this._accessDialog = null; });
 | 
			
		||||
 | 
			
		||||
        this._accessDialog = dialog;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
@@ -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;
 | 
			
		||||
@@ -696,7 +685,6 @@ const BackgroundManager = new Lang.Class({
 | 
			
		||||
                           time: FADE_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: function() {
 | 
			
		||||
                               oldBackgroundActor.background.run_dispose();
 | 
			
		||||
                               oldBackgroundActor.destroy();
 | 
			
		||||
                           }
 | 
			
		||||
                         });
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -796,18 +796,10 @@ const NetworkAgent = new Lang.Class({
 | 
			
		||||
                        path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE)) {
 | 
			
		||||
                    if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE))
 | 
			
		||||
                        this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
 | 
			
		||||
                        try {
 | 
			
		||||
                            let aliases = keyfile.get_string_list('VPN Connection', 'aliases');
 | 
			
		||||
 | 
			
		||||
                            for (let alias of aliases) {
 | 
			
		||||
                                this._vpnBinaries[alias] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
 | 
			
		||||
                            }
 | 
			
		||||
                        } catch(e) { } // ignore errors if key does not exist
 | 
			
		||||
                    } else {
 | 
			
		||||
                    else
 | 
			
		||||
                        throw new Error('VPN plugin at %s is not executable'.format(path));
 | 
			
		||||
                    }
 | 
			
		||||
                } catch(e) {
 | 
			
		||||
                    log('Error \'%s\' while processing VPN keyfile \'%s\''.
 | 
			
		||||
                        format(e.message, dir.get_child(name).get_path()));
 | 
			
		||||
 
 | 
			
		||||
@@ -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() {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright 2010-2016 Red Hat, Inc
 | 
			
		||||
 * Copyright 2010 Red Hat, Inc
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -114,7 +114,7 @@ const restartDialogContent = {
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const restartUpdateDialogContent = {
 | 
			
		||||
const restartInstallDialogContent = {
 | 
			
		||||
 | 
			
		||||
    subject: C_("title", "Restart & Install Updates"),
 | 
			
		||||
    description: function(seconds) {
 | 
			
		||||
@@ -132,38 +132,18 @@ const restartUpdateDialogContent = {
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const restartUpgradeDialogContent = {
 | 
			
		||||
 | 
			
		||||
    subject: C_("title", "Restart & Install Upgrade"),
 | 
			
		||||
    upgradeDescription: function(distroName, distroVersion) {
 | 
			
		||||
        /* Translators: This is the text displayed for system upgrades in the
 | 
			
		||||
           shut down dialog. First %s gets replaced with the distro name and
 | 
			
		||||
           second %s with the distro version to upgrade to */
 | 
			
		||||
        return _("%s %s will be installed after restart. Upgrade installation can take a long time: ensure that you have backed up and that the computer is plugged in.").format(distroName, distroVersion);
 | 
			
		||||
    },
 | 
			
		||||
    disableTimer: true,
 | 
			
		||||
    showBatteryWarning: false,
 | 
			
		||||
    confirmButtons: [{ signal: 'ConfirmedReboot',
 | 
			
		||||
                       label:  C_("button", "Restart & Install") }],
 | 
			
		||||
    iconName: 'view-refresh-symbolic',
 | 
			
		||||
    iconStyleClass: 'end-session-dialog-shutdown-icon',
 | 
			
		||||
    showOtherSessions: true,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const DialogType = {
 | 
			
		||||
  LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
 | 
			
		||||
  SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
 | 
			
		||||
  RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
 | 
			
		||||
  UPDATE_RESTART: 3,
 | 
			
		||||
  UPGRADE_RESTART: 4
 | 
			
		||||
  UPDATE_RESTART: 3
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const DialogContent = {
 | 
			
		||||
    0 /* DialogType.LOGOUT */: logoutDialogContent,
 | 
			
		||||
    1 /* DialogType.SHUTDOWN */: shutdownDialogContent,
 | 
			
		||||
    2 /* DialogType.RESTART */: restartDialogContent,
 | 
			
		||||
    3 /* DialogType.UPDATE_RESTART */: restartUpdateDialogContent,
 | 
			
		||||
    4 /* DialogType.UPGRADE_RESTART */: restartUpgradeDialogContent
 | 
			
		||||
    3 /* DialogType.UPDATE_RESTART */: restartInstallDialogContent
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const MAX_USERS_IN_SESSION_DIALOG = 5;
 | 
			
		||||
@@ -183,10 +163,7 @@ const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
 | 
			
		||||
const PkOfflineIface = '<node> \
 | 
			
		||||
<interface name="org.freedesktop.PackageKit.Offline"> \
 | 
			
		||||
    <property name="UpdatePrepared" type="b" access="read"/> \
 | 
			
		||||
    <property name="UpdateTriggered" type="b" access="read"/> \
 | 
			
		||||
    <property name="UpgradePrepared" type="b" access="read"/> \
 | 
			
		||||
    <property name="UpgradeTriggered" type="b" access="read"/> \
 | 
			
		||||
    <property name="PreparedUpgrade" type="a{sv}" access="read"/> \
 | 
			
		||||
    <property name="TriggerAction" type="s" access="read"/> \
 | 
			
		||||
    <method name="Trigger"> \
 | 
			
		||||
        <arg type="s" name="action" direction="in"/> \
 | 
			
		||||
    </method> \
 | 
			
		||||
@@ -438,19 +415,11 @@ const EndSessionDialog = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
                if (dialogContent.descriptionWithUser)
 | 
			
		||||
                    description = dialogContent.descriptionWithUser(realName, displayTime);
 | 
			
		||||
                else
 | 
			
		||||
                    description = dialogContent.description(displayTime);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Use a different description when we are installing a system upgrade
 | 
			
		||||
        if (dialogContent.upgradeDescription) {
 | 
			
		||||
            let name = this._pkOfflineProxy.PreparedUpgrade['name'].deep_unpack();
 | 
			
		||||
            let version = this._pkOfflineProxy.PreparedUpgrade['version'].deep_unpack();
 | 
			
		||||
 | 
			
		||||
            if (name != null && version != null)
 | 
			
		||||
                description = dialogContent.upgradeDescription(name, version);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Fall back to regular description
 | 
			
		||||
        if (!description)
 | 
			
		||||
            description = dialogContent.description(displayTime);
 | 
			
		||||
 | 
			
		||||
@@ -729,12 +698,9 @@ const EndSessionDialog = new Lang.Class({
 | 
			
		||||
        this._totalSecondsToStayOpen = totalSecondsToStayOpen;
 | 
			
		||||
        this._type = type;
 | 
			
		||||
 | 
			
		||||
        if (this._type == DialogType.RESTART) {
 | 
			
		||||
            if (this._pkOfflineProxy.UpdateTriggered)
 | 
			
		||||
                this._type = DialogType.UPDATE_RESTART;
 | 
			
		||||
            else if (this._pkOfflineProxy.UpgradeTriggered)
 | 
			
		||||
                this._type = DialogType.UPGRADE_RESTART;
 | 
			
		||||
        }
 | 
			
		||||
        if (this._type == DialogType.RESTART &&
 | 
			
		||||
            this._pkOfflineProxy.TriggerAction == 'reboot')
 | 
			
		||||
            this._type = DialogType.UPDATE_RESTART;
 | 
			
		||||
 | 
			
		||||
        this._applications = [];
 | 
			
		||||
        this._applicationList.destroy_all_children();
 | 
			
		||||
@@ -761,19 +727,19 @@ const EndSessionDialog = new Lang.Class({
 | 
			
		||||
        if (dialogContent.showOtherSessions)
 | 
			
		||||
            this._loadSessions();
 | 
			
		||||
 | 
			
		||||
        let updateTriggered = this._pkOfflineProxy.UpdateTriggered;
 | 
			
		||||
        let updateAlreadyTriggered = this._pkOfflineProxy.TriggerAction == 'power-off' || this._pkOfflineProxy.TriggerAction == 'reboot';
 | 
			
		||||
        let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
 | 
			
		||||
        let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
 | 
			
		||||
 | 
			
		||||
        _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
 | 
			
		||||
        this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
 | 
			
		||||
        this._checkBox.actor.checked = (updatePrepared && updateTriggered);
 | 
			
		||||
        this._checkBox.actor.checked = (updatePrepared && updateAlreadyTriggered);
 | 
			
		||||
 | 
			
		||||
        // We show the warning either together with the checkbox, or when
 | 
			
		||||
        // updates have already been triggered, but the user doesn't have
 | 
			
		||||
        // enough permissions to cancel them.
 | 
			
		||||
        this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
 | 
			
		||||
                                        (this._checkBox.actor.visible || updatePrepared && updateTriggered && !updatesAllowed));
 | 
			
		||||
                                        (this._checkBox.actor.visible || updatePrepared && updateAlreadyTriggered && !updatesAllowed));
 | 
			
		||||
 | 
			
		||||
        this._updateButtons();
 | 
			
		||||
 | 
			
		||||
@@ -783,9 +749,7 @@ const EndSessionDialog = new Lang.Class({
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!dialogContent.disableTimer)
 | 
			
		||||
            this._startTimer();
 | 
			
		||||
 | 
			
		||||
        this._startTimer();
 | 
			
		||||
        this._sync();
 | 
			
		||||
 | 
			
		||||
        let signalId = this.connect('opened',
 | 
			
		||||
 
 | 
			
		||||
@@ -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 ||
 | 
			
		||||
 
 | 
			
		||||
@@ -220,8 +220,7 @@ const LayoutManager = new Lang.Class({
 | 
			
		||||
        global.stage.add_child(this.uiGroup);
 | 
			
		||||
 | 
			
		||||
        this.overviewGroup = new St.Widget({ name: 'overviewGroup',
 | 
			
		||||
                                             visible: false,
 | 
			
		||||
                                             reactive: true });
 | 
			
		||||
                                             visible: false });
 | 
			
		||||
        this.addChrome(this.overviewGroup);
 | 
			
		||||
 | 
			
		||||
        this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup',
 | 
			
		||||
@@ -592,10 +591,7 @@ const LayoutManager = new Lang.Class({
 | 
			
		||||
        this.addChrome(this._coverPane);
 | 
			
		||||
 | 
			
		||||
        if (Meta.is_restart()) {
 | 
			
		||||
            // On restart, we don't do an animation. Force an update of the
 | 
			
		||||
            // regions immediately so that maximized windows restore to the
 | 
			
		||||
            // right size taking struts into account.
 | 
			
		||||
            this._updateRegions();
 | 
			
		||||
            // On restart, we don't do an animation
 | 
			
		||||
        } else if (Main.sessionMode.isGreeter) {
 | 
			
		||||
            this.panelBox.translation_y = -this.panelBox.height;
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -942,11 +938,6 @@ const LayoutManager = new Lang.Class({
 | 
			
		||||
        if (Main.modalCount > 0)
 | 
			
		||||
            return GLib.SOURCE_REMOVE;
 | 
			
		||||
 | 
			
		||||
        // Bug workaround - get_transformed_position()/get_transformed_size() don't work after
 | 
			
		||||
        // a change in stage size until the first pick or paint.
 | 
			
		||||
        // https://bugzilla.gnome.org/show_bug.cgi?id=761565
 | 
			
		||||
        global.stage.get_actor_at_pos(Clutter.PickMode.ALL, 0, 0);
 | 
			
		||||
 | 
			
		||||
        let rects = [], struts = [], i;
 | 
			
		||||
        let isPopupMenuVisible = global.top_window_group.get_children().some(isPopupMetaWindow);
 | 
			
		||||
        let wantsInputRegion = !isPopupMenuVisible;
 | 
			
		||||
 
 | 
			
		||||
@@ -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,8 +11,6 @@ const Meta = imports.gi.Meta;
 | 
			
		||||
const Shell = imports.gi.Shell;
 | 
			
		||||
const St = imports.gi.St;
 | 
			
		||||
 | 
			
		||||
const AccessDialog = imports.ui.accessDialog;
 | 
			
		||||
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
 | 
			
		||||
const Components = imports.ui.components;
 | 
			
		||||
const CtrlAltTab = imports.ui.ctrlAltTab;
 | 
			
		||||
const EndSessionDialog = imports.ui.endSessionDialog;
 | 
			
		||||
@@ -64,8 +62,6 @@ let ctrlAltTabManager = null;
 | 
			
		||||
let osdWindowManager = null;
 | 
			
		||||
let osdMonitorLabeler = null;
 | 
			
		||||
let sessionMode = null;
 | 
			
		||||
let shellAccessDialogDBusService = null;
 | 
			
		||||
let shellAudioSelectionDBusService = null;
 | 
			
		||||
let shellDBusService = null;
 | 
			
		||||
let shellMountOpDBusService = null;
 | 
			
		||||
let screenSaverDBus = null;
 | 
			
		||||
@@ -82,7 +78,6 @@ let _startDate;
 | 
			
		||||
let _defaultCssStylesheet = null;
 | 
			
		||||
let _cssStylesheet = null;
 | 
			
		||||
let _a11ySettings = null;
 | 
			
		||||
let _themeResource = null;
 | 
			
		||||
 | 
			
		||||
function _sessionUpdated() {
 | 
			
		||||
    if (sessionMode.isPrimary)
 | 
			
		||||
@@ -124,8 +119,6 @@ function start() {
 | 
			
		||||
                                       _loadDefaultStylesheet);
 | 
			
		||||
    _initializeUI();
 | 
			
		||||
 | 
			
		||||
    shellAccessDialogDBusService = new AccessDialog.AccessDialogDBus();
 | 
			
		||||
    shellAudioSelectionDBusService = new AudioDeviceSelection.AudioDeviceSelectionDBus();
 | 
			
		||||
    shellDBusService = new ShellDBus.GnomeShell();
 | 
			
		||||
    shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
 | 
			
		||||
 | 
			
		||||
@@ -144,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
 | 
			
		||||
@@ -194,8 +189,6 @@ function _initializeUI() {
 | 
			
		||||
        return true;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    global.display.connect('gl-video-memory-purged', loadTheme);
 | 
			
		||||
 | 
			
		||||
    // Provide the bus object for gnome-session to
 | 
			
		||||
    // initiate logouts.
 | 
			
		||||
    EndSessionDialog.init();
 | 
			
		||||
@@ -297,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,13 +22,11 @@ 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);
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('notify::width', () => { this.level = this.level; });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get level() {
 | 
			
		||||
@@ -36,44 +34,39 @@ const LevelBar = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set level(value) {
 | 
			
		||||
        this._level = Math.max(0, Math.min(value, 100));
 | 
			
		||||
 | 
			
		||||
        let alloc = this.actor.get_allocation_box();
 | 
			
		||||
        let newWidth = Math.round((alloc.x2 - alloc.x1) * this._level / 100);
 | 
			
		||||
        if (newWidth != this._bar.width)
 | 
			
		||||
            this._bar.width = newWidth;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const OsdWindowConstraint = new Lang.Class({
 | 
			
		||||
    Name: 'OsdWindowConstraint',
 | 
			
		||||
    Extends: Clutter.Constraint,
 | 
			
		||||
 | 
			
		||||
    _init: function(props) {
 | 
			
		||||
        this._minSize = 0;
 | 
			
		||||
        this.parent(props);
 | 
			
		||||
        let newValue = Math.max(0, Math.min(value, 100));
 | 
			
		||||
        if (newValue == this._level)
 | 
			
		||||
            return;
 | 
			
		||||
        this._level = newValue;
 | 
			
		||||
        this._bar.queue_repaint();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set minSize(v) {
 | 
			
		||||
        this._minSize = v;
 | 
			
		||||
        if (this.actor)
 | 
			
		||||
            this.actor.queue_relayout();
 | 
			
		||||
    },
 | 
			
		||||
    _repaint: function() {
 | 
			
		||||
        let cr = this._bar.get_context();
 | 
			
		||||
 | 
			
		||||
    vfunc_update_allocation: function(actor, actorBox) {
 | 
			
		||||
        // Clutter will adjust the allocation for margins,
 | 
			
		||||
        // so add it to our minimum size
 | 
			
		||||
        let minSize = this._minSize + actor.margin_top + actor.margin_bottom;
 | 
			
		||||
        let [width, height] = actorBox.get_size();
 | 
			
		||||
        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());
 | 
			
		||||
 | 
			
		||||
        // Enforce a ratio of 1
 | 
			
		||||
        let size = Math.ceil(Math.max(minSize, height));
 | 
			
		||||
        actorBox.set_size(size, size);
 | 
			
		||||
        let [w, h] = this._bar.get_surface_size();
 | 
			
		||||
        w *= (this._level / 100.);
 | 
			
		||||
 | 
			
		||||
        // Recenter
 | 
			
		||||
        let [x, y] = actorBox.get_origin();
 | 
			
		||||
        actorBox.set_origin(Math.floor(x + width / 2 - size / 2),
 | 
			
		||||
                            Math.floor(y + height / 2 - size / 2));
 | 
			
		||||
        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();
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -81,6 +74,7 @@ const OsdWindow = new Lang.Class({
 | 
			
		||||
    Name: 'OsdWindow',
 | 
			
		||||
 | 
			
		||||
    _init: function(monitorIndex) {
 | 
			
		||||
        this._popupSize = 0;
 | 
			
		||||
        this.actor = new St.Widget({ x_expand: true,
 | 
			
		||||
                                     y_expand: true,
 | 
			
		||||
                                     x_align: Clutter.ActorAlign.CENTER,
 | 
			
		||||
@@ -90,12 +84,19 @@ const OsdWindow = new Lang.Class({
 | 
			
		||||
        let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
 | 
			
		||||
        this.actor.add_constraint(constraint);
 | 
			
		||||
 | 
			
		||||
        this._boxConstraint = new OsdWindowConstraint();
 | 
			
		||||
        this._box = new St.BoxLayout({ style_class: 'osd-window',
 | 
			
		||||
                                       vertical: true });
 | 
			
		||||
        this._box.add_constraint(this._boxConstraint);
 | 
			
		||||
        this.actor.add_actor(this._box);
 | 
			
		||||
 | 
			
		||||
        this._box.connect('style-changed', Lang.bind(this, this._onStyleChanged));
 | 
			
		||||
        this._box.connect('notify::height', Lang.bind(this,
 | 
			
		||||
            function() {
 | 
			
		||||
                Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
 | 
			
		||||
                    function() {
 | 
			
		||||
                        this._box.width = this._box.height;
 | 
			
		||||
                    }));
 | 
			
		||||
            }));
 | 
			
		||||
 | 
			
		||||
        this._icon = new St.Icon();
 | 
			
		||||
        this._box.add(this._icon, { expand: true });
 | 
			
		||||
 | 
			
		||||
@@ -197,12 +198,30 @@ const OsdWindow = new Lang.Class({
 | 
			
		||||
        let scalew = monitor.width / 640.0;
 | 
			
		||||
        let scaleh = monitor.height / 480.0;
 | 
			
		||||
        let scale = Math.min(scalew, scaleh);
 | 
			
		||||
        let popupSize = 110 * Math.max(1, scale);
 | 
			
		||||
        this._popupSize = 110 * Math.max(1, scale);
 | 
			
		||||
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        this._icon.icon_size = popupSize / (2 * scaleFactor);
 | 
			
		||||
        this._icon.icon_size = this._popupSize / (2 * scaleFactor);
 | 
			
		||||
        this._box.translation_y = monitor.height / 4;
 | 
			
		||||
        this._boxConstraint.minSize = popupSize;
 | 
			
		||||
        this._box.style_changed();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onStyleChanged: function() {
 | 
			
		||||
        let themeNode = this._box.get_theme_node();
 | 
			
		||||
        let horizontalPadding = themeNode.get_horizontal_padding();
 | 
			
		||||
        let verticalPadding = themeNode.get_vertical_padding();
 | 
			
		||||
        let topBorder = themeNode.get_border_width(St.Side.TOP);
 | 
			
		||||
        let bottomBorder = themeNode.get_border_width(St.Side.BOTTOM);
 | 
			
		||||
        let leftBorder = themeNode.get_border_width(St.Side.LEFT);
 | 
			
		||||
        let rightBorder = themeNode.get_border_width(St.Side.RIGHT);
 | 
			
		||||
 | 
			
		||||
        let minWidth = this._popupSize - verticalPadding - leftBorder - rightBorder;
 | 
			
		||||
        let minHeight = this._popupSize - horizontalPadding - topBorder - bottomBorder;
 | 
			
		||||
 | 
			
		||||
        // minWidth/minHeight here are in real pixels,
 | 
			
		||||
        // but the theme takes measures in unscaled dimensions
 | 
			
		||||
        let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
 | 
			
		||||
        this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight) / scaleFactor);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -107,12 +107,18 @@ const Overview = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._overviewCreated = true;
 | 
			
		||||
 | 
			
		||||
        let layout = new Clutter.BinLayout();
 | 
			
		||||
        this._stack = new Clutter.Actor({ layout_manager: layout });
 | 
			
		||||
        this._stack.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
 | 
			
		||||
 | 
			
		||||
        /* Translators: This is the main view to select
 | 
			
		||||
           activities. See also note for "Activities" string. */
 | 
			
		||||
        this._overview = new St.BoxLayout({ name: 'overview',
 | 
			
		||||
                                            accessible_name: _("Overview"),
 | 
			
		||||
                                            vertical: true });
 | 
			
		||||
        this._overview.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
 | 
			
		||||
                                            reactive: true,
 | 
			
		||||
                                            vertical: true,
 | 
			
		||||
                                            x_expand: true,
 | 
			
		||||
                                            y_expand: true });
 | 
			
		||||
        this._overview._delegate = this;
 | 
			
		||||
 | 
			
		||||
        // The main Background actors are inside global.window_group which are
 | 
			
		||||
@@ -120,7 +126,7 @@ const Overview = new Lang.Class({
 | 
			
		||||
        // one. Instances of this class share a single CoglTexture behind the
 | 
			
		||||
        // scenes which allows us to show the background with different
 | 
			
		||||
        // rendering options without duplicating the texture data.
 | 
			
		||||
        this._backgroundGroup = new Meta.BackgroundGroup({ reactive: true });
 | 
			
		||||
        this._backgroundGroup = new Meta.BackgroundGroup();
 | 
			
		||||
        Main.layoutManager.overviewGroup.add_child(this._backgroundGroup);
 | 
			
		||||
        this._bgManagers = [];
 | 
			
		||||
 | 
			
		||||
@@ -143,7 +149,8 @@ const Overview = new Lang.Class({
 | 
			
		||||
        Main.layoutManager.overviewGroup.add_child(this._coverPane);
 | 
			
		||||
        this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return Clutter.EVENT_STOP; }));
 | 
			
		||||
 | 
			
		||||
        Main.layoutManager.overviewGroup.add_child(this._overview);
 | 
			
		||||
        this._stack.add_actor(this._overview);
 | 
			
		||||
        Main.layoutManager.overviewGroup.add_child(this._stack);
 | 
			
		||||
 | 
			
		||||
        this._coverPane.hide();
 | 
			
		||||
 | 
			
		||||
@@ -152,9 +159,6 @@ const Overview = new Lang.Class({
 | 
			
		||||
            dragMotion: Lang.bind(this, this._onDragMotion)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        Main.layoutManager.overviewGroup.connect('scroll-event',
 | 
			
		||||
                                                 Lang.bind(this, this._onScrollEvent));
 | 
			
		||||
        Main.xdndHandler.connect('drag-begin', Lang.bind(this, this._onDragBegin));
 | 
			
		||||
        Main.xdndHandler.connect('drag-end', Lang.bind(this, this._onDragEnd));
 | 
			
		||||
 | 
			
		||||
@@ -251,6 +255,7 @@ const Overview = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        // Add our same-line elements after the search entry
 | 
			
		||||
        this._overview.add(this._controls.actor, { y_fill: true, expand: true });
 | 
			
		||||
        this._controls.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
 | 
			
		||||
 | 
			
		||||
        // TODO - recalculate everything when desktop size changes
 | 
			
		||||
        this.dashIconSize = this._dash.iconSize;
 | 
			
		||||
@@ -367,7 +372,7 @@ const Overview = new Lang.Class({
 | 
			
		||||
        if (this.isDummy)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._backgroundGroup.add_action(action);
 | 
			
		||||
        this._overview.add_action(action);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getDesktopClone: function() {
 | 
			
		||||
@@ -547,8 +552,8 @@ const Overview = new Lang.Class({
 | 
			
		||||
        Meta.disable_unredirect_for_screen(global.screen);
 | 
			
		||||
        this.viewSelector.show();
 | 
			
		||||
 | 
			
		||||
        this._overview.opacity = 0;
 | 
			
		||||
        Tweener.addTween(this._overview,
 | 
			
		||||
        this._stack.opacity = 0;
 | 
			
		||||
        Tweener.addTween(this._stack,
 | 
			
		||||
                         { opacity: 255,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           time: ANIMATION_TIME,
 | 
			
		||||
@@ -613,7 +618,7 @@ const Overview = new Lang.Class({
 | 
			
		||||
        this.viewSelector.animateFromOverview();
 | 
			
		||||
 | 
			
		||||
        // Make other elements fade out.
 | 
			
		||||
        Tweener.addTween(this._overview,
 | 
			
		||||
        Tweener.addTween(this._stack,
 | 
			
		||||
                         { opacity: 0,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           time: ANIMATION_TIME,
 | 
			
		||||
 
 | 
			
		||||
@@ -421,6 +421,7 @@ const ControlsManager = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        let layout = new ControlsLayout();
 | 
			
		||||
        this.actor = new St.Widget({ layout_manager: layout,
 | 
			
		||||
                                     reactive: true,
 | 
			
		||||
                                     x_expand: true, y_expand: true,
 | 
			
		||||
                                     clip_to_allocation: true });
 | 
			
		||||
        this._group = new St.BoxLayout({ name: 'overview-group',
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
                                   })
 | 
			
		||||
                                 };
 | 
			
		||||
 
 | 
			
		||||
@@ -349,6 +349,7 @@ const Arrow = new Lang.Class({
 | 
			
		||||
    _init: function(params) {
 | 
			
		||||
        this.parent(params);
 | 
			
		||||
        this.x_fill = this.y_fill = true;
 | 
			
		||||
        this.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
 | 
			
		||||
        this._drawingArea = new St.DrawingArea();
 | 
			
		||||
        this._drawingArea.connect('repaint', Lang.bind(this, this._drawArrow));
 | 
			
		||||
@@ -376,22 +377,6 @@ const Arrow = new Lang.Class({
 | 
			
		||||
        cr.$dispose();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    vfunc_get_paint_volume: function(volume) {
 | 
			
		||||
        if (!this.parent(volume))
 | 
			
		||||
            return false;
 | 
			
		||||
 | 
			
		||||
        if (!this._shadow)
 | 
			
		||||
            return true;
 | 
			
		||||
 | 
			
		||||
        let shadow_box = new Clutter.ActorBox();
 | 
			
		||||
        this._shadow.get_box(this._drawingArea.get_allocation_box(), shadow_box);
 | 
			
		||||
 | 
			
		||||
        volume.set_width(Math.max(shadow_box.x2 - shadow_box.x1, volume.get_width()));
 | 
			
		||||
        volume.set_height(Math.max(shadow_box.y2 - shadow_box.y1, volume.get_height()));
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    vfunc_style_changed: function() {
 | 
			
		||||
        let node = this.get_theme_node();
 | 
			
		||||
        this._shadow = node.get_shadow('-arrow-shadow');
 | 
			
		||||
@@ -399,8 +384,6 @@ const Arrow = new Lang.Class({
 | 
			
		||||
            this._shadowHelper = St.ShadowHelper.new(this._shadow);
 | 
			
		||||
        else
 | 
			
		||||
            this._shadowHelper = null;
 | 
			
		||||
 | 
			
		||||
        this.parent();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    vfunc_paint: function() {
 | 
			
		||||
@@ -576,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();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -728,7 +708,7 @@ const ScreenShield = new Lang.Class({
 | 
			
		||||
        let unitaryDelay = ARROW_ANIMATION_TIME / (arrows.length + 1);
 | 
			
		||||
        let maxOpacity = 255 * ARROW_ANIMATION_PEAK_OPACITY;
 | 
			
		||||
        for (let i = 0; i < arrows.length; i++) {
 | 
			
		||||
            arrows[i].opacity = 0;
 | 
			
		||||
            arrows.opacity = 0;
 | 
			
		||||
            Tweener.addTween(arrows[i],
 | 
			
		||||
                             { opacity: 0,
 | 
			
		||||
                               delay: unitaryDelay * (N_ARROWS - (i + 1)),
 | 
			
		||||
 
 | 
			
		||||
@@ -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");
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -61,8 +61,8 @@ const InputSource = new Lang.Class({
 | 
			
		||||
        this.emit('changed');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    activate: function(interactive) {
 | 
			
		||||
        this.emit('activate', !!interactive);
 | 
			
		||||
    activate: function() {
 | 
			
		||||
        this.emit('activate');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getXkbId: function() {
 | 
			
		||||
@@ -109,7 +109,7 @@ const InputSourcePopup = new Lang.Class({
 | 
			
		||||
    _finish : function() {
 | 
			
		||||
        this.parent();
 | 
			
		||||
 | 
			
		||||
        this._items[this._selectedIndex].activate(true);
 | 
			
		||||
        this._items[this._selectedIndex].activate();
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -159,14 +159,6 @@ const InputSourceSettings = new Lang.Class({
 | 
			
		||||
        return [];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get mruSources() {
 | 
			
		||||
        return [];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set mruSources(sourcesList) {
 | 
			
		||||
        // do nothing
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get keyboardOptions() {
 | 
			
		||||
        return [];
 | 
			
		||||
    },
 | 
			
		||||
@@ -259,7 +251,6 @@ const InputSourceSessionSettings = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    _DESKTOP_INPUT_SOURCES_SCHEMA: 'org.gnome.desktop.input-sources',
 | 
			
		||||
    _KEY_INPUT_SOURCES: 'sources',
 | 
			
		||||
    _KEY_MRU_SOURCES: 'mru-sources',
 | 
			
		||||
    _KEY_KEYBOARD_OPTIONS: 'xkb-options',
 | 
			
		||||
    _KEY_PER_WINDOW: 'per-window',
 | 
			
		||||
 | 
			
		||||
@@ -270,9 +261,9 @@ const InputSourceSessionSettings = new Lang.Class({
 | 
			
		||||
        this._settings.connect('changed::' + this._KEY_PER_WINDOW, Lang.bind(this, this._emitPerWindowChanged));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getSourcesList: function(key) {
 | 
			
		||||
    get inputSources() {
 | 
			
		||||
        let sourcesList = [];
 | 
			
		||||
        let sources = this._settings.get_value(key);
 | 
			
		||||
        let sources = this._settings.get_value(this._KEY_INPUT_SOURCES);
 | 
			
		||||
        let nSources = sources.n_children();
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < nSources; i++) {
 | 
			
		||||
@@ -282,19 +273,6 @@ const InputSourceSessionSettings = new Lang.Class({
 | 
			
		||||
        return sourcesList;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get inputSources() {
 | 
			
		||||
        return this._getSourcesList(this._KEY_INPUT_SOURCES);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get mruSources() {
 | 
			
		||||
        return this._getSourcesList(this._KEY_MRU_SOURCES);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    set mruSources(sourcesList) {
 | 
			
		||||
        let sources = GLib.Variant.new('a(ss)', sourcesList);
 | 
			
		||||
        this._settings.set_value(this._KEY_MRU_SOURCES, sources);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get keyboardOptions() {
 | 
			
		||||
        return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS);
 | 
			
		||||
    },
 | 
			
		||||
@@ -394,7 +372,7 @@ const InputSourceManager = new Lang.Class({
 | 
			
		||||
        while (!(is = this._inputSources[nextIndex]))
 | 
			
		||||
            nextIndex += 1;
 | 
			
		||||
 | 
			
		||||
        is.activate(true);
 | 
			
		||||
        is.activate();
 | 
			
		||||
        return true;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -422,25 +400,6 @@ const InputSourceManager = new Lang.Class({
 | 
			
		||||
        this._keyboardManager.reapply();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateMruSettings: function() {
 | 
			
		||||
        // If IBus is not ready we don't have a full picture of all
 | 
			
		||||
        // the available sources, so don't update the setting
 | 
			
		||||
        if (!this._ibusReady)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        // If IBus is temporarily disabled, don't update the setting
 | 
			
		||||
        if (this._disableIBus)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let sourcesList = [];
 | 
			
		||||
        for (let i = 0; i < this._mruSources.length; ++i) {
 | 
			
		||||
            let source = this._mruSources[i];
 | 
			
		||||
            sourcesList.push([source.type, source.id]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._settings.mruSources = sourcesList;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _currentInputSourceChanged: function(newSource) {
 | 
			
		||||
        let oldSource;
 | 
			
		||||
        [oldSource, this._currentSource] = [this._currentSource, newSource];
 | 
			
		||||
@@ -457,7 +416,7 @@ const InputSourceManager = new Lang.Class({
 | 
			
		||||
        this._changePerWindowSource();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _activateInputSource: function(is, interactive) {
 | 
			
		||||
    _activateInputSource: function(is) {
 | 
			
		||||
        KeyboardManager.holdKeyboard();
 | 
			
		||||
        this._keyboardManager.apply(is.xkbId);
 | 
			
		||||
 | 
			
		||||
@@ -475,54 +434,6 @@ const InputSourceManager = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard);
 | 
			
		||||
        this._currentInputSourceChanged(is);
 | 
			
		||||
 | 
			
		||||
        if (interactive)
 | 
			
		||||
            this._updateMruSettings();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateMruSources: function() {
 | 
			
		||||
        let sourcesList = [];
 | 
			
		||||
        for (let i in this._inputSources)
 | 
			
		||||
            sourcesList.push(this._inputSources[i]);
 | 
			
		||||
 | 
			
		||||
        this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; }));
 | 
			
		||||
 | 
			
		||||
        if (!this._disableIBus && this._mruSourcesBackup) {
 | 
			
		||||
            this._mruSources = this._mruSourcesBackup;
 | 
			
		||||
            this._mruSourcesBackup = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Initialize from settings when we have no MRU sources list
 | 
			
		||||
        if (this._mruSources.length == 0) {
 | 
			
		||||
            let mruSettings = this._settings.mruSources;
 | 
			
		||||
            for (let i = 0; i < mruSettings.length; i++) {
 | 
			
		||||
                let mruSettingSource = mruSettings[i];
 | 
			
		||||
                let mruSource = null;
 | 
			
		||||
 | 
			
		||||
                for (let j = 0; j < sourcesList.length; j++) {
 | 
			
		||||
                    let source = sourcesList[j];
 | 
			
		||||
                    if (source.type == mruSettingSource.type &&
 | 
			
		||||
                        source.id == mruSettingSource.id) {
 | 
			
		||||
                        mruSource = source;
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (mruSource)
 | 
			
		||||
                    this._mruSources.push(mruSource);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mruSources = [];
 | 
			
		||||
        for (let i = 0; i < this._mruSources.length; i++) {
 | 
			
		||||
            for (let j = 0; j < sourcesList.length; j++)
 | 
			
		||||
                if (this._mruSources[i].type == sourcesList[j].type &&
 | 
			
		||||
                    this._mruSources[i].id == sourcesList[j].id) {
 | 
			
		||||
                    mruSources = mruSources.concat(sourcesList.splice(j, 1));
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        this._mruSources = mruSources.concat(sourcesList);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _inputSourcesChanged: function() {
 | 
			
		||||
@@ -599,10 +510,30 @@ const InputSourceManager = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this.emit('sources-changed');
 | 
			
		||||
 | 
			
		||||
        this._updateMruSources();
 | 
			
		||||
        let sourcesList = [];
 | 
			
		||||
        for (let i in this._inputSources)
 | 
			
		||||
            sourcesList.push(this._inputSources[i]);
 | 
			
		||||
 | 
			
		||||
        this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; }));
 | 
			
		||||
 | 
			
		||||
        if (!this._disableIBus && this._mruSourcesBackup) {
 | 
			
		||||
            this._mruSources = this._mruSourcesBackup;
 | 
			
		||||
            this._mruSourcesBackup = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mruSources = [];
 | 
			
		||||
        for (let i = 0; i < this._mruSources.length; i++) {
 | 
			
		||||
            for (let j = 0; j < sourcesList.length; j++)
 | 
			
		||||
                if (this._mruSources[i].type == sourcesList[j].type &&
 | 
			
		||||
                    this._mruSources[i].id == sourcesList[j].id) {
 | 
			
		||||
                    mruSources = mruSources.concat(sourcesList.splice(j, 1));
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
        this._mruSources = mruSources.concat(sourcesList);
 | 
			
		||||
 | 
			
		||||
        if (this._mruSources.length > 0)
 | 
			
		||||
            this._mruSources[0].activate(false);
 | 
			
		||||
            this._mruSources[0].activate();
 | 
			
		||||
 | 
			
		||||
        // All ibus engines are preloaded here to reduce the launching time
 | 
			
		||||
        // when users switch the input sources.
 | 
			
		||||
@@ -711,7 +642,7 @@ const InputSourceManager = new Lang.Class({
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (window._currentSource)
 | 
			
		||||
            window._currentSource.activate(false);
 | 
			
		||||
            window._currentSource.activate();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _sourcesPerWindowChanged: function() {
 | 
			
		||||
@@ -832,10 +763,7 @@ const InputSourceIndicator = new Lang.Class({
 | 
			
		||||
            let is = this._inputSourceManager.inputSources[i];
 | 
			
		||||
 | 
			
		||||
            let menuItem = new LayoutMenuItem(is.displayName, is.shortName);
 | 
			
		||||
            menuItem.connect('activate', function() {
 | 
			
		||||
                is.activate(true);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            menuItem.connect('activate', Lang.bind(is, is.activate));
 | 
			
		||||
            let indicatorLabel = new St.Label({ text: is.shortName,
 | 
			
		||||
                                                visible: false });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
@@ -306,17 +301,14 @@ const Indicator = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateHaveSuspend: function() {
 | 
			
		||||
        this._loginManager.canSuspend(Lang.bind(this,
 | 
			
		||||
            function(canSuspend, needsAuth) {
 | 
			
		||||
                this._haveSuspend = canSuspend;
 | 
			
		||||
                this._suspendNeedsAuth = needsAuth;
 | 
			
		||||
                this._updateSuspend();
 | 
			
		||||
            }));
 | 
			
		||||
        this._loginManager.canSuspend(Lang.bind(this, function(result) {
 | 
			
		||||
            this._haveSuspend = result;
 | 
			
		||||
            this._updateSuspend();
 | 
			
		||||
        }));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateSuspend: function() {
 | 
			
		||||
        let disabled = (Main.sessionMode.isLocked &&
 | 
			
		||||
                        this._suspendNeedsAuth) ||
 | 
			
		||||
        let disabled = Main.sessionMode.isLocked ||
 | 
			
		||||
                       (Main.sessionMode.isGreeter &&
 | 
			
		||||
                        this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
 | 
			
		||||
        this._suspendAction.visible = this._haveSuspend && !disabled;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,7 @@ const WorkspacesView = new Lang.Class({
 | 
			
		||||
                                                    page_increment: 1,
 | 
			
		||||
                                                    page_size: 1,
 | 
			
		||||
                                                    step_increment: 0,
 | 
			
		||||
                                                    upper: global.screen.n_workspaces });
 | 
			
		||||
                                                    upper: 0 });
 | 
			
		||||
        this.scrollAdjustment.connect('notify::value',
 | 
			
		||||
                                      Lang.bind(this, this._onScroll));
 | 
			
		||||
 | 
			
		||||
@@ -374,10 +374,6 @@ const ExtraWorkspaceView = new Lang.Class({
 | 
			
		||||
        this._workspace.setActualGeometry(this._actualGeometry);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getActiveWorkspace: function() {
 | 
			
		||||
        return this._workspace;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    animateToOverview: function(animationType) {
 | 
			
		||||
        if (animationType == AnimationType.ZOOM)
 | 
			
		||||
            this._workspace.zoomToOverview();
 | 
			
		||||
@@ -425,10 +421,8 @@ 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.
 | 
			
		||||
            let event = Clutter.get_current_event();
 | 
			
		||||
            let index = this._getMonitorIndexForEvent(event);
 | 
			
		||||
            if ((action.get_button() == 1 || action.get_button() == 0) &&
 | 
			
		||||
                this._workspacesViews[index].getActiveWorkspace().isEmpty())
 | 
			
		||||
            if (action.get_button() == 1 &&
 | 
			
		||||
                this._getPrimaryView().getActiveWorkspace().isEmpty())
 | 
			
		||||
                Main.overview.hide();
 | 
			
		||||
        }));
 | 
			
		||||
        Main.overview.addAction(clickAction);
 | 
			
		||||
@@ -437,18 +431,11 @@ const WorkspacesDisplay = new Lang.Class({
 | 
			
		||||
        let panAction = new Clutter.PanAction({ threshold_trigger_edge: Clutter.GestureTriggerEdge.AFTER });
 | 
			
		||||
        panAction.connect('pan', Lang.bind(this, this._onPan));
 | 
			
		||||
        panAction.connect('gesture-begin', Lang.bind(this, function() {
 | 
			
		||||
            if (this._workspacesOnlyOnPrimary) {
 | 
			
		||||
                let event = Clutter.get_current_event();
 | 
			
		||||
                if (this._getMonitorIndexForEvent(event) != this._primaryIndex)
 | 
			
		||||
                    return false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].startSwipeScroll();
 | 
			
		||||
            return true;
 | 
			
		||||
        }));
 | 
			
		||||
        panAction.connect('gesture-cancel', Lang.bind(this, function() {
 | 
			
		||||
            clickAction.release();
 | 
			
		||||
            for (let i = 0; i < this._workspacesViews.length; i++)
 | 
			
		||||
                this._workspacesViews[i].endSwipeScroll();
 | 
			
		||||
        }));
 | 
			
		||||
@@ -594,12 +581,6 @@ const WorkspacesDisplay = new Lang.Class({
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getMonitorIndexForEvent: function(event) {
 | 
			
		||||
        let [x, y] = event.get_coords();
 | 
			
		||||
        let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 });
 | 
			
		||||
        return global.screen.get_monitor_index_for_rect(rect);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getPrimaryView: function() {
 | 
			
		||||
        if (!this._workspacesViews.length)
 | 
			
		||||
            return null;
 | 
			
		||||
@@ -680,11 +661,6 @@ const WorkspacesDisplay = new Lang.Class({
 | 
			
		||||
    _onScrollEvent: function(actor, event) {
 | 
			
		||||
        if (!this.actor.mapped)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        if (this._workspacesOnlyOnPrimary &&
 | 
			
		||||
            this._getMonitorIndexForEvent(event) != this._primaryIndex)
 | 
			
		||||
            return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
        let activeWs = global.screen.get_active_workspace();
 | 
			
		||||
        let ws;
 | 
			
		||||
        switch (event.get_scroll_direction()) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2019
									
								
								po/en_GB.po
									
									
									
									
									
								
							
							
						
						
									
										2019
									
								
								po/en_GB.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										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"
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user