Compare commits
	
		
			2 Commits
		
	
	
		
			wip/loc-ap
			...
			wip/maximi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5c2c60aaf4 | ||
|   | d20789bc61 | 
							
								
								
									
										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 | ||||
|   | ||||
							
								
								
									
										159
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										159
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,162 +1,3 @@ | ||||
| 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] | ||||
|  | ||||
| Contributors: | ||||
|   Michael Biebl, Josselin Mouette, Florian Müllner | ||||
|  | ||||
| Translations: | ||||
|   Baurzhan Muftakhidinov [kk], Changwoo Ryu [ko], Christian Kirbach [de], | ||||
|   Kjartan Maraas [nb], Jiri Grönroos [fi], Arash Mousavi [fa], | ||||
|   Jiro Matsuzawa [ja], Marek Černocký [cs], Milo Casagrande [it] | ||||
|  | ||||
| 3.17.91 | ||||
| ======= | ||||
| * Fix login screen spinner causing wakeups while VT-switched away | ||||
|   [Ray, Rui; #753891] | ||||
| * Fix scrolling of user list on login screen [Florian; #754525] | ||||
|  | ||||
| Contributors: | ||||
|   Piotr Drąg, Rui Matos, Florian Müllner, Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Dušan Kazik [sk], Jordi Mas [ca], Aurimas Černius [lt], Stas Solovey [ru], | ||||
|   Piotr Drąg [pl], Pedro Albuquerque [pt], Daniel Mustieles [es], | ||||
|   Chao-Hsiung Liao [zh_TW], Muhammet Kara [tr], Fran Dieguez [gl], | ||||
|   Hannie Dumoleyn [nl], Yosef Or Boczko [he], Tom Tryfonidis [el], | ||||
|   A S Alam [pa], Balázs Úr [hu], Alexandre Franke [fr], Frédéric Péters [fr] | ||||
|  | ||||
| 3.17.90 | ||||
| ======= | ||||
| * Avoid caret/focus viewport changes during pointer movement [Rui; #752138] | ||||
| * Match GTK+'s modal dialogs for system modal dialogs [Carlos; #746108] | ||||
| * Refine message list style [Florian; #749958] | ||||
| * Fix type-ahead behavior for backspace and compose key [Rui; #753319, #753320] | ||||
| * Refine the system status menu [Florian; #751377] | ||||
| * Misc. bug fixes and cleanups [Bastien, Ray, Florian, Jakub; #752779, #752739, | ||||
|   #741366, #651503, #753064, #753181, #752881] | ||||
|  | ||||
| Contributors: | ||||
|   Rui Matos, Florian Müllner, Bastien Nocera, Carlos Soriano, Jakub Steiner, | ||||
|   Ray Strode, Rico Tzschichholz | ||||
|  | ||||
| Translations: | ||||
|   Marek Černocký [cs], Kjartan Maraas [nb], Jordi Mas [ca], Muhammet Kara [tr], | ||||
|   Enrico Nicoletto [pt_BR] | ||||
|  | ||||
| 3.17.4 | ||||
| ====== | ||||
| * Fix fuzziness of app menu icon [Jakub; #747932] | ||||
| * Implement 4 finger swipe gesture for touchpads [Carlos; #752250] | ||||
| * Misc. bug fixes [Florian, Alexandre, Piotr, Ray, Mario; #751921, #659969, | ||||
|   #752438, #752675] | ||||
|  | ||||
| Contributors: | ||||
|   Piotr Drąg, Alexandre Franke, Carlos Garnacho, Florian Müllner, | ||||
|   Mario Sanchez Prada, Jakub Steiner, Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Benjamin Steinwender [de], Pedro Albuquerque [pt], Fabio Tomat [fur], | ||||
|   Matej Urbančič [sl], Daniel Mustieles [es], Yosef Or Boczko [he], | ||||
|   Daniel Martinez [an] | ||||
|  | ||||
| 3.17.3 | ||||
| ====== | ||||
| * Handle touch events in OSK on wayland [Rui; #750287] | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|   | ||||
							
								
								
									
										17
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,6 +1,5 @@ | ||||
| AC_PREREQ(2.63) | ||||
| AC_INIT([gnome-shell],[3.19.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) | ||||
| AX_IS_RELEASE([git-directory]) | ||||
| AC_INIT([gnome-shell],[3.17.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) | ||||
|  | ||||
| AC_CONFIG_HEADERS([config.h]) | ||||
| AC_CONFIG_SRCDIR([src/shell-global.c]) | ||||
| @@ -75,13 +74,13 @@ AS_IF([test x$enable_systemd != xno], [ | ||||
| AC_MSG_RESULT($enable_systemd) | ||||
|  | ||||
| CLUTTER_MIN_VERSION=1.21.5 | ||||
| GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4 | ||||
| GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 | ||||
| GJS_MIN_VERSION=1.39.0 | ||||
| MUTTER_MIN_VERSION=3.19.4 | ||||
| MUTTER_MIN_VERSION=3.17.3 | ||||
| GTK_MIN_VERSION=3.15.0 | ||||
| GIO_MIN_VERSION=2.45.3 | ||||
| LIBECAL_MIN_VERSION=3.5.3 | ||||
| LIBEDATASERVER_MIN_VERSION=3.17.2 | ||||
| LIBEDATASERVER_MIN_VERSION=3.13.90 | ||||
| TELEPATHY_GLIB_MIN_VERSION=0.17.5 | ||||
| POLKIT_MIN_VERSION=0.100 | ||||
| STARTUP_NOTIFICATION_MIN_VERSION=0.11 | ||||
| @@ -117,9 +116,9 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION) | ||||
| PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) | ||||
| PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) | ||||
| PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0) | ||||
| PKG_CHECK_MODULES(TRAY, 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.19.2) | ||||
| PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.13.1) | ||||
|  | ||||
| AC_ARG_ENABLE(browser-plugin, | ||||
|               [AS_HELP_STRING([--enable-browser-plugin], | ||||
| @@ -221,7 +220,7 @@ if test "$enable_man" != no; then | ||||
| fi | ||||
| AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) | ||||
|  | ||||
| AX_COMPILER_FLAGS() | ||||
| GNOME_COMPILE_WARNINGS([error]) | ||||
| case "$WARN_CFLAGS" in | ||||
|     *-Werror*) | ||||
|         WARN_CFLAGS="$WARN_CFLAGS -Wno-error=deprecated-declarations" | ||||
| @@ -270,7 +269,7 @@ Build configuration: | ||||
|        Prefix:                                 ${prefix} | ||||
|        Source code location:                   ${srcdir} | ||||
|        Compiler:                               ${CC} | ||||
|        Compiler Warnings:                      $ax_enable_compile_warnings | ||||
|        Compiler Warnings:                      $enable_compile_warnings | ||||
|  | ||||
|        Support for NetworkManager:             $have_networkmanager | ||||
|        Support for GStreamer recording:        $build_recorder | ||||
|   | ||||
| @@ -2,7 +2,7 @@ CLEANFILES = | ||||
| NULL = | ||||
|  | ||||
| desktopdir=$(datadir)/applications | ||||
| desktop_DATA = org.gnome.Shell.desktop gnome-shell-extension-prefs.desktop | ||||
| desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop  gnome-shell-extension-prefs.desktop | ||||
|  | ||||
| if HAVE_NETWORKMANAGER | ||||
| desktop_DATA += org.gnome.Shell.PortalHelper.desktop | ||||
| @@ -104,7 +104,8 @@ convertdir = $(datadir)/GConf/gsettings | ||||
| convert_DATA = gnome-shell-overrides.convert | ||||
|  | ||||
| EXTRA_DIST =						\ | ||||
| 	org.gnome.Shell.desktop.in.in			\ | ||||
| 	gnome-shell.desktop.in.in			\ | ||||
| 	gnome-shell-wayland.desktop.in.in		\ | ||||
| 	gnome-shell-extension-prefs.desktop.in.in	\ | ||||
| 	$(introspection_DATA)				\ | ||||
| 	$(menu_DATA)					\ | ||||
| @@ -120,7 +121,8 @@ EXTRA_DIST =						\ | ||||
| 	$(NULL) | ||||
|  | ||||
| CLEANFILES +=						\ | ||||
| 	org.gnome.Shell.desktop.in			\ | ||||
| 	gnome-shell.desktop.in				\ | ||||
| 	gnome-shell-wayland.desktop.in			\ | ||||
| 	gnome-shell-extension-prefs.in			\ | ||||
| 	$(desktop_DATA)					\ | ||||
| 	$(keys_DATA)					\ | ||||
|   | ||||
							
								
								
									
										15
									
								
								data/gnome-shell-wayland.desktop.in.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								data/gnome-shell-wayland.desktop.in.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| [Desktop Entry] | ||||
| Type=Application | ||||
| _Name=GNOME Shell (wayland compositor) | ||||
| _Comment=Window management and application launching | ||||
| Exec=@bindir@/gnome-shell --wayland --display-server | ||||
| X-GNOME-Bugzilla-Bugzilla=GNOME | ||||
| X-GNOME-Bugzilla-Product=gnome-shell | ||||
| X-GNOME-Bugzilla-Component=general | ||||
| X-GNOME-Bugzilla-Version=@VERSION@ | ||||
| Categories=GNOME;GTK;Core; | ||||
| OnlyShowIn=GNOME; | ||||
| NoDisplay=true | ||||
| X-GNOME-Autostart-Phase=DisplayServer | ||||
| X-GNOME-Autostart-Notify=true | ||||
| X-GNOME-AutoRestart=false | ||||
| @@ -10,7 +10,7 @@ X-GNOME-Bugzilla-Version=@VERSION@ | ||||
| Categories=GNOME;GTK;Core; | ||||
| OnlyShowIn=GNOME; | ||||
| NoDisplay=true | ||||
| X-GNOME-Autostart-Phase=DisplayServer | ||||
| X-GNOME-Autostart-Phase=WindowManager | ||||
| X-GNOME-Provides=panel;windowmanager; | ||||
| X-GNOME-Autostart-Notify=true | ||||
| X-GNOME-AutoRestart=false | ||||
| @@ -51,7 +51,6 @@ | ||||
|     </key> | ||||
|     <key name="looking-glass-history" type="as"> | ||||
|       <default>[]</default> | ||||
|       <!-- 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,16 +71,6 @@ | ||||
|         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"/> | ||||
|   | ||||
| @@ -37,13 +37,14 @@ stage { | ||||
|   icon-shadow: 0 1px black; } | ||||
|   .button:focus { | ||||
|     color: #eeeeec; | ||||
|     border-color: #215d9c; | ||||
|     box-shadow: inset 0 1px #454f52; | ||||
|     text-shadow: 0 1px black; | ||||
|     icon-shadow: 0 1px black; | ||||
|     box-shadow: inset 0px 0px 0px 1px #215d9c; } | ||||
|     icon-shadow: 0 1px black; } | ||||
|   .button:insensitive { | ||||
|     color: gray; | ||||
|     color: #7f7f7f; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: rgba(62, 67, 69, 0.7); | ||||
|     background-color: rgba(62, 67, 68, 0.7); | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
| @@ -51,46 +52,9 @@ stage { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|  | ||||
| .modal-dialog-linked-button { | ||||
|   border-right-width: 1px; | ||||
|   color: #eeeeec; | ||||
|   background-color: #2e3436; | ||||
|   border-color: rgba(0, 0, 0, 0.7); | ||||
|   box-shadow: inset 0 1px #454f52; | ||||
|   text-shadow: 0 1px black; | ||||
|   icon-shadow: 0 1px black; | ||||
|   padding: 12px; } | ||||
|   .modal-dialog-linked-button:insensitive { | ||||
|     color: gray; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: rgba(62, 67, 69, 0.7); | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .modal-dialog-linked-button:active { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .modal-dialog-linked-button:focus { | ||||
|     color: #eeeeec; | ||||
|     text-shadow: 0 1px black; | ||||
|     icon-shadow: 0 1px black; | ||||
|     box-shadow: inset 0px 0px 0px 1px #215d9c; } | ||||
|   .modal-dialog-linked-button:first-child { | ||||
|     border-radius: 0px 0px 0px 6px; } | ||||
|   .modal-dialog-linked-button:last-child { | ||||
|     border-right-width: 0px; | ||||
|     border-radius: 0px 0px 6px 0px; } | ||||
|   .modal-dialog-linked-button:first-child:last-child { | ||||
|     border-right-width: 0px; | ||||
|     border-radius: 0px 0px 6px 6px; } | ||||
|  | ||||
| /* Entries */ | ||||
| StEntry { | ||||
| @@ -107,8 +71,8 @@ StEntry { | ||||
|     box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4); | ||||
|     border-color: rgba(166, 166, 166, 0.5); } | ||||
|   StEntry:insensitive { | ||||
|     color: gray; | ||||
|     border-color: #0e0e0e; | ||||
|     color: #7f7f7f; | ||||
|     border-color: #0d0d0d; | ||||
|     box-shadow: none; } | ||||
|   StEntry StIcon.capslock-warning { | ||||
|     icon-size: 16px; | ||||
| @@ -131,10 +95,10 @@ StScrollBar { | ||||
|     background-color: transparent; } | ||||
|   StScrollBar StButton#vhandle, StScrollBar StButton#hhandle { | ||||
|     border-radius: 8px; | ||||
|     background-color: #999999; | ||||
|     background-color: #000; | ||||
|     margin: 3px; } | ||||
|     StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover { | ||||
|       background-color: #cccccc; } | ||||
|       background-color: #1a1a1a; } | ||||
|     StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active { | ||||
|       background-color: #215d9c; } | ||||
|  | ||||
| @@ -142,7 +106,7 @@ StScrollBar { | ||||
| .slider { | ||||
|   height: 1em; | ||||
|   -slider-height: 0.3em; | ||||
|   -slider-background-color: #0e0e0e; | ||||
|   -slider-background-color: #0d0d0d; | ||||
|   -slider-border-color: black; | ||||
|   -slider-active-background-color: #215d9c; | ||||
|   -slider-active-border-color: #184472; | ||||
| @@ -196,12 +160,11 @@ StScrollBar { | ||||
|   background-color: white; } | ||||
|  | ||||
| .modal-dialog { | ||||
|   border-radius: 9px; | ||||
|   border-radius: 5px; | ||||
|   color: #eeeeec; | ||||
|   background-color: rgba(23, 25, 26, 0.95); | ||||
|   border: 1px solid rgba(238, 238, 236, 0.2); } | ||||
|   .modal-dialog .modal-dialog-content-box { | ||||
|     padding: 24px; } | ||||
|   border: 3px solid rgba(238, 238, 236, 0.5); | ||||
|   padding: 24px; } | ||||
|   .modal-dialog .run-dialog-entry { | ||||
|     width: 20em; | ||||
|     margin-bottom: 6px; } | ||||
| @@ -216,6 +179,10 @@ StScrollBar { | ||||
|     color: #d6d6d1; | ||||
|     padding-bottom: .4em; } | ||||
|  | ||||
| .button-dialog-button-box { | ||||
|   spacing: 18px; | ||||
|   padding-top: 48px; } | ||||
|  | ||||
| .show-processes-dialog-subject, | ||||
| .mount-question-dialog-subject, | ||||
| .end-session-dialog-subject { | ||||
| @@ -224,7 +191,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; } | ||||
| @@ -408,9 +375,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; } | ||||
| @@ -444,7 +411,7 @@ StScrollBar { | ||||
|  | ||||
| .popup-menu-ornament { | ||||
|   text-align: right; | ||||
|   width: 1.2em; } | ||||
|   width: 1em; } | ||||
|  | ||||
| .popup-menu-boxpointer, | ||||
| .candidate-popup-boxpointer { | ||||
| @@ -625,8 +592,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; } | ||||
|  | ||||
| @@ -737,7 +702,7 @@ StScrollBar { | ||||
|   border-left-width: 1px; } | ||||
|  | ||||
| .calendar-nonwork-day { | ||||
|   color: gray; } | ||||
|   color: #7f7f7f; } | ||||
|  | ||||
| .calendar-today { | ||||
|   font-weight: bold; | ||||
| @@ -752,20 +717,9 @@ StScrollBar { | ||||
|   color: rgba(255, 255, 255, 0.15); | ||||
|   opacity: 0.5; } | ||||
|  | ||||
| .calendar-week-number { | ||||
|   font-size: 70%; | ||||
|   font-weight: bold; | ||||
|   width: 2.8em; | ||||
|   height: 2em; | ||||
|   border-radius: 2px 1em 2px 2px; | ||||
|   padding: 0.9em 0 0; | ||||
|   margin: 3px; | ||||
|   background-color: rgba(255, 255, 255, 0.1); | ||||
|   color: #000; } | ||||
|  | ||||
| /* Message list */ | ||||
| .message-list { | ||||
|   width: 31.5em; } | ||||
|   width: 420px; } | ||||
|  | ||||
| .message-list-sections { | ||||
|   spacing: 1.5em; } | ||||
| @@ -800,12 +754,7 @@ StScrollBar { | ||||
|     padding: 8px 8px 8px 0px; } | ||||
|  | ||||
| .message-icon-bin > StIcon { | ||||
|   icon-size: 32px; } | ||||
|  | ||||
| .message-secondary-bin:ltr { | ||||
|   padding-left: 8px; } | ||||
| .message-secondary-bin:rtl { | ||||
|   padding-right: 8px; } | ||||
|   icon-size: 48px; } | ||||
|  | ||||
| .message-secondary-bin { | ||||
|   color: #999999; } | ||||
| @@ -814,20 +763,14 @@ StScrollBar { | ||||
|   icon-size: 16px; } | ||||
|  | ||||
| .message-title { | ||||
|   font-weight: bold; | ||||
|   font-size: 1.1em; } | ||||
|   font-weight: bold; } | ||||
|  | ||||
| .message-content { | ||||
|   padding: 8px; | ||||
|   font-size: .9em; } | ||||
|   padding: 8px; } | ||||
|  | ||||
| .system-switch-user-submenu-icon.user-icon { | ||||
|   icon-size: 20px; | ||||
|   padding: 0 2px; } | ||||
|  | ||||
| .system-switch-user-submenu-icon.default-icon { | ||||
|   icon-size: 16px; | ||||
|   padding: 0 4px; } | ||||
| .system-switch-user-submenu-icon { | ||||
|   icon-size: 24px; | ||||
|   border: 1px solid rgba(255, 255, 255, 0.4); } | ||||
|  | ||||
| #appMenu { | ||||
|   spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg"); | ||||
| @@ -836,7 +779,7 @@ StScrollBar { | ||||
|     color: transparent; } | ||||
|  | ||||
| .aggregate-menu { | ||||
|   min-width: 21em; } | ||||
|   width: 360px; } | ||||
|   .aggregate-menu .popup-menu-icon { | ||||
|     padding: 0 4px; } | ||||
|  | ||||
| @@ -891,8 +834,7 @@ StScrollBar { | ||||
|   min-width: 470px; } | ||||
|  | ||||
| .nm-dialog-content { | ||||
|   spacing: 20px; | ||||
|   padding: 24px; } | ||||
|   spacing: 20px; } | ||||
|  | ||||
| .nm-dialog-header-hbox { | ||||
|   spacing: 10px; } | ||||
| @@ -973,14 +915,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; | ||||
| @@ -1078,7 +1016,7 @@ StScrollBar { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .app-view-control:first-child { | ||||
| @@ -1397,9 +1335,10 @@ StScrollBar { | ||||
|   color: white; } | ||||
|   .keyboard-key:focus { | ||||
|     color: #eeeeec; | ||||
|     border-color: #215d9c; | ||||
|     box-shadow: inset 0 1px #454f52; | ||||
|     text-shadow: 0 1px black; | ||||
|     icon-shadow: 0 1px black; | ||||
|     box-shadow: inset 0px 0px 0px 1px #215d9c; } | ||||
|     icon-shadow: 0 1px black; } | ||||
|   .keyboard-key:hover, .keyboard-key:checked { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
| @@ -1411,7 +1350,7 @@ StScrollBar { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .keyboard-key:grayed { | ||||
| @@ -1504,13 +1443,13 @@ StScrollBar { | ||||
|         color: white; | ||||
|         border-color: rgba(0, 0, 0, 0.7); | ||||
|         background-color: #1c5187; | ||||
|         box-shadow: inset 0 0 black; | ||||
|         box-shadow: none; | ||||
|         text-shadow: none; | ||||
|         icon-shadow: none; } | ||||
|       .login-dialog .modal-dialog-button:default:insensitive { | ||||
|         color: gray; | ||||
|         color: #7f7f7f; | ||||
|         border-color: rgba(0, 0, 0, 0.7); | ||||
|         background-color: rgba(62, 67, 69, 0.7); | ||||
|         background-color: rgba(62, 67, 68, 0.7); | ||||
|         box-shadow: none; | ||||
|         text-shadow: none; | ||||
|         icon-shadow: none; } | ||||
|   | ||||
 Submodule data/theme/gnome-shell-sass updated: 1d35c2890a...3573116e4f
									
								
							| @@ -37,13 +37,14 @@ stage { | ||||
|   icon-shadow: 0 1px black; } | ||||
|   .button:focus { | ||||
|     color: #eeeeec; | ||||
|     border-color: #215d9c; | ||||
|     box-shadow: inset 0 1px #454f52; | ||||
|     text-shadow: 0 1px black; | ||||
|     icon-shadow: 0 1px black; | ||||
|     box-shadow: inset 0px 0px 0px 1px #215d9c; } | ||||
|     icon-shadow: 0 1px black; } | ||||
|   .button:insensitive { | ||||
|     color: #949796; | ||||
|     color: #939695; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: rgba(66, 72, 73, 0.7); | ||||
|     background-color: rgba(66, 71, 73, 0.7); | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
| @@ -51,46 +52,9 @@ stage { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|  | ||||
| .modal-dialog-linked-button { | ||||
|   border-right-width: 1px; | ||||
|   color: #eeeeec; | ||||
|   background-color: #2e3436; | ||||
|   border-color: rgba(0, 0, 0, 0.7); | ||||
|   box-shadow: inset 0 1px #454f52; | ||||
|   text-shadow: 0 1px black; | ||||
|   icon-shadow: 0 1px black; | ||||
|   padding: 12px; } | ||||
|   .modal-dialog-linked-button:insensitive { | ||||
|     color: #949796; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: rgba(66, 72, 73, 0.7); | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .modal-dialog-linked-button:active { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .modal-dialog-linked-button:focus { | ||||
|     color: #eeeeec; | ||||
|     text-shadow: 0 1px black; | ||||
|     icon-shadow: 0 1px black; | ||||
|     box-shadow: inset 0px 0px 0px 1px #215d9c; } | ||||
|   .modal-dialog-linked-button:first-child { | ||||
|     border-radius: 0px 0px 0px 6px; } | ||||
|   .modal-dialog-linked-button:last-child { | ||||
|     border-right-width: 0px; | ||||
|     border-radius: 0px 0px 6px 0px; } | ||||
|   .modal-dialog-linked-button:first-child:last-child { | ||||
|     border-right-width: 0px; | ||||
|     border-radius: 0px 0px 6px 6px; } | ||||
|  | ||||
| /* Entries */ | ||||
| StEntry { | ||||
| @@ -107,8 +71,8 @@ StEntry { | ||||
|     box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4); | ||||
|     border-color: rgba(154, 154, 142, 0.5); } | ||||
|   StEntry:insensitive { | ||||
|     color: #949796; | ||||
|     border-color: #333636; | ||||
|     color: #939695; | ||||
|     border-color: #323636; | ||||
|     box-shadow: none; } | ||||
|   StEntry StIcon.capslock-warning { | ||||
|     icon-size: 16px; | ||||
| @@ -131,10 +95,10 @@ StScrollBar { | ||||
|     background-color: transparent; } | ||||
|   StScrollBar StButton#vhandle, StScrollBar StButton#hhandle { | ||||
|     border-radius: 8px; | ||||
|     background-color: #a6a8a7; | ||||
|     background-color: #393f3f; | ||||
|     margin: 3px; } | ||||
|     StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover { | ||||
|       background-color: #cacbc9; } | ||||
|       background-color: #515a5a; } | ||||
|     StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active { | ||||
|       background-color: #215d9c; } | ||||
|  | ||||
| @@ -142,7 +106,7 @@ StScrollBar { | ||||
| .slider { | ||||
|   height: 1em; | ||||
|   -slider-height: 0.3em; | ||||
|   -slider-background-color: #333636; | ||||
|   -slider-background-color: #323636; | ||||
|   -slider-border-color: #1c1f1f; | ||||
|   -slider-active-background-color: #215d9c; | ||||
|   -slider-active-border-color: #184472; | ||||
| @@ -196,12 +160,11 @@ StScrollBar { | ||||
|   background-color: white; } | ||||
|  | ||||
| .modal-dialog { | ||||
|   border-radius: 9px; | ||||
|   border-radius: 5px; | ||||
|   color: #eeeeec; | ||||
|   background-color: rgba(23, 25, 26, 0.95); | ||||
|   border: 1px solid rgba(238, 238, 236, 0.2); } | ||||
|   .modal-dialog .modal-dialog-content-box { | ||||
|     padding: 24px; } | ||||
|   border: 3px solid rgba(238, 238, 236, 0.5); | ||||
|   padding: 24px; } | ||||
|   .modal-dialog .run-dialog-entry { | ||||
|     width: 20em; | ||||
|     margin-bottom: 6px; } | ||||
| @@ -216,6 +179,10 @@ StScrollBar { | ||||
|     color: #d6d6d1; | ||||
|     padding-bottom: .4em; } | ||||
|  | ||||
| .button-dialog-button-box { | ||||
|   spacing: 18px; | ||||
|   padding-top: 48px; } | ||||
|  | ||||
| .show-processes-dialog-subject, | ||||
| .mount-question-dialog-subject, | ||||
| .end-session-dialog-subject { | ||||
| @@ -224,7 +191,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; } | ||||
| @@ -408,9 +375,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; } | ||||
| @@ -444,7 +411,7 @@ StScrollBar { | ||||
|  | ||||
| .popup-menu-ornament { | ||||
|   text-align: right; | ||||
|   width: 1.2em; } | ||||
|   width: 1em; } | ||||
|  | ||||
| .popup-menu-boxpointer, | ||||
| .candidate-popup-boxpointer { | ||||
| @@ -625,8 +592,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; } | ||||
|  | ||||
| @@ -737,7 +702,7 @@ StScrollBar { | ||||
|   border-left-width: 1px; } | ||||
|  | ||||
| .calendar-nonwork-day { | ||||
|   color: #949796; } | ||||
|   color: #939695; } | ||||
|  | ||||
| .calendar-today { | ||||
|   font-weight: bold; | ||||
| @@ -752,20 +717,9 @@ StScrollBar { | ||||
|   color: rgba(238, 238, 236, 0.15); | ||||
|   opacity: 0.5; } | ||||
|  | ||||
| .calendar-week-number { | ||||
|   font-size: 70%; | ||||
|   font-weight: bold; | ||||
|   width: 2.8em; | ||||
|   height: 2em; | ||||
|   border-radius: 2px 1em 2px 2px; | ||||
|   padding: 0.9em 0 0; | ||||
|   margin: 3px; | ||||
|   background-color: rgba(238, 238, 236, 0.1); | ||||
|   color: #393f3f; } | ||||
|  | ||||
| /* Message list */ | ||||
| .message-list { | ||||
|   width: 31.5em; } | ||||
|   width: 420px; } | ||||
|  | ||||
| .message-list-sections { | ||||
|   spacing: 1.5em; } | ||||
| @@ -800,12 +754,7 @@ StScrollBar { | ||||
|     padding: 8px 8px 8px 0px; } | ||||
|  | ||||
| .message-icon-bin > StIcon { | ||||
|   icon-size: 32px; } | ||||
|  | ||||
| .message-secondary-bin:ltr { | ||||
|   padding-left: 8px; } | ||||
| .message-secondary-bin:rtl { | ||||
|   padding-right: 8px; } | ||||
|   icon-size: 48px; } | ||||
|  | ||||
| .message-secondary-bin { | ||||
|   color: #8e8e80; } | ||||
| @@ -814,20 +763,14 @@ StScrollBar { | ||||
|   icon-size: 16px; } | ||||
|  | ||||
| .message-title { | ||||
|   font-weight: bold; | ||||
|   font-size: 1.1em; } | ||||
|   font-weight: bold; } | ||||
|  | ||||
| .message-content { | ||||
|   padding: 8px; | ||||
|   font-size: .9em; } | ||||
|   padding: 8px; } | ||||
|  | ||||
| .system-switch-user-submenu-icon.user-icon { | ||||
|   icon-size: 20px; | ||||
|   padding: 0 2px; } | ||||
|  | ||||
| .system-switch-user-submenu-icon.default-icon { | ||||
|   icon-size: 16px; | ||||
|   padding: 0 4px; } | ||||
| .system-switch-user-submenu-icon { | ||||
|   icon-size: 24px; | ||||
|   border: 1px solid rgba(238, 238, 236, 0.4); } | ||||
|  | ||||
| #appMenu { | ||||
|   spinner-image: url("resource:///org/gnome/shell/theme/process-working.svg"); | ||||
| @@ -836,7 +779,7 @@ StScrollBar { | ||||
|     color: transparent; } | ||||
|  | ||||
| .aggregate-menu { | ||||
|   min-width: 21em; } | ||||
|   width: 360px; } | ||||
|   .aggregate-menu .popup-menu-icon { | ||||
|     padding: 0 4px; } | ||||
|  | ||||
| @@ -891,8 +834,7 @@ StScrollBar { | ||||
|   min-width: 470px; } | ||||
|  | ||||
| .nm-dialog-content { | ||||
|   spacing: 20px; | ||||
|   padding: 24px; } | ||||
|   spacing: 20px; } | ||||
|  | ||||
| .nm-dialog-header-hbox { | ||||
|   spacing: 10px; } | ||||
| @@ -973,14 +915,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; | ||||
| @@ -1078,7 +1016,7 @@ StScrollBar { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .app-view-control:first-child { | ||||
| @@ -1397,9 +1335,10 @@ StScrollBar { | ||||
|   color: white; } | ||||
|   .keyboard-key:focus { | ||||
|     color: #eeeeec; | ||||
|     border-color: #215d9c; | ||||
|     box-shadow: inset 0 1px #454f52; | ||||
|     text-shadow: 0 1px black; | ||||
|     icon-shadow: 0 1px black; | ||||
|     box-shadow: inset 0px 0px 0px 1px #215d9c; } | ||||
|     icon-shadow: 0 1px black; } | ||||
|   .keyboard-key:hover, .keyboard-key:checked { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
| @@ -1411,7 +1350,7 @@ StScrollBar { | ||||
|     color: white; | ||||
|     border-color: rgba(0, 0, 0, 0.7); | ||||
|     background-color: #222728; | ||||
|     box-shadow: inset 0 0 black; | ||||
|     box-shadow: none; | ||||
|     text-shadow: none; | ||||
|     icon-shadow: none; } | ||||
|   .keyboard-key:grayed { | ||||
| @@ -1504,13 +1443,13 @@ StScrollBar { | ||||
|         color: white; | ||||
|         border-color: rgba(0, 0, 0, 0.7); | ||||
|         background-color: #1c5187; | ||||
|         box-shadow: inset 0 0 black; | ||||
|         box-shadow: none; | ||||
|         text-shadow: none; | ||||
|         icon-shadow: none; } | ||||
|       .login-dialog .modal-dialog-button:default:insensitive { | ||||
|         color: #949796; | ||||
|         color: #939695; | ||||
|         border-color: rgba(0, 0, 0, 0.7); | ||||
|         background-color: rgba(66, 72, 73, 0.7); | ||||
|         background-color: rgba(66, 71, 73, 0.7); | ||||
|         box-shadow: none; | ||||
|         text-shadow: none; | ||||
|         icon-shadow: none; } | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 26 KiB | 
| @@ -14,7 +14,7 @@ const ShellEntry = imports.ui.shellEntry; | ||||
| const Tweener = imports.ui.tweener; | ||||
| const UserWidget = imports.ui.userWidget; | ||||
|  | ||||
| const DEFAULT_BUTTON_WELL_ICON_SIZE = 16; | ||||
| const DEFAULT_BUTTON_WELL_ICON_SIZE = 24; | ||||
| const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0; | ||||
| const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3; | ||||
|  | ||||
| @@ -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'); | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
| @@ -259,7 +258,6 @@ const AuthPrompt = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _onVerificationComplete: function() { | ||||
|         this.setActorInDefaultButtonWell(null); | ||||
|         this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED; | ||||
| 	this.cancelButton.reactive = false; | ||||
|     }, | ||||
| @@ -283,12 +281,6 @@ const AuthPrompt = new Lang.Class({ | ||||
|         if (oldActor) | ||||
|             Tweener.removeTweens(oldActor); | ||||
|  | ||||
|         let wasSpinner; | ||||
|         if (oldActor == this._spinner.actor) | ||||
|             wasSpinner = true; | ||||
|         else | ||||
|             wasSpinner = false; | ||||
|  | ||||
|         let isSpinner; | ||||
|         if (actor == this._spinner.actor) | ||||
|             isSpinner = true; | ||||
| @@ -298,11 +290,6 @@ const AuthPrompt = new Lang.Class({ | ||||
|         if (this._defaultButtonWellActor != actor && oldActor) { | ||||
|             if (!animate) { | ||||
|                 oldActor.opacity = 0; | ||||
|  | ||||
|                 if (wasSpinner) { | ||||
|                     if (this._spinner) | ||||
|                         this._spinner.stop(); | ||||
|                 } | ||||
|             } else { | ||||
|                 Tweener.addTween(oldActor, | ||||
|                                  { opacity: 0, | ||||
| @@ -311,7 +298,7 @@ const AuthPrompt = new Lang.Class({ | ||||
|                                    transition: 'linear', | ||||
|                                    onCompleteScope: this, | ||||
|                                    onComplete: function() { | ||||
|                                       if (wasSpinner) { | ||||
|                                       if (isSpinner) { | ||||
|                                           if (this._spinner) | ||||
|                                               this._spinner.stop(); | ||||
|                                       } | ||||
| @@ -414,7 +401,7 @@ const AuthPrompt = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     updateSensitivity: function(sensitive) { | ||||
|         this._updateNextButtonSensitivity(sensitive && this._entry.text.length > 0); | ||||
|         this._updateNextButtonSensitivity(sensitive); | ||||
|         this._entry.reactive = sensitive; | ||||
|         this._entry.clutter_text.editable = sensitive; | ||||
|     }, | ||||
| @@ -445,9 +432,8 @@ const AuthPrompt = new Lang.Class({ | ||||
|         let oldStatus = this.verificationStatus; | ||||
|         this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; | ||||
|         this.cancelButton.reactive = true; | ||||
|         this.nextButton.label = _("Next"); | ||||
|  | ||||
|         if (this._userVerifier) | ||||
|         if (oldStatus == AuthPromptStatus.VERIFYING) | ||||
|             this._userVerifier.cancel(); | ||||
|  | ||||
|         this._queryingService = null; | ||||
| @@ -502,7 +488,6 @@ const AuthPrompt = new Lang.Class({ | ||||
|  | ||||
|     finish: function(onComplete) { | ||||
|         if (!this._userVerifier.hasPendingMessages) { | ||||
|             this._userVerifier.clear(); | ||||
|             onComplete(); | ||||
|             return; | ||||
|         } | ||||
| @@ -510,13 +495,12 @@ const AuthPrompt = new Lang.Class({ | ||||
|         let signalId = this._userVerifier.connect('no-more-messages', | ||||
|                                                   Lang.bind(this, function() { | ||||
|                                                       this._userVerifier.disconnect(signalId); | ||||
|                                                       this._userVerifier.clear(); | ||||
|                                                       onComplete(); | ||||
|                                                   })); | ||||
|     }, | ||||
|  | ||||
|     cancel: function() { | ||||
|         if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) { | ||||
|         if (this.verificationStatus == AuthPromptStatus.NOT_VERIFYING || this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) { | ||||
|             return; | ||||
|         } | ||||
|         this.reset(); | ||||
|   | ||||
| @@ -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; | ||||
| @@ -539,9 +535,6 @@ const LoginDialog = new Lang.Class({ | ||||
|         let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2; | ||||
|         let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2; | ||||
|  | ||||
|         natWidth = Math.min(natWidth, dialogBox.x2 - dialogBox.x1); | ||||
|         natHeight = Math.min(natHeight, dialogBox.y2 - dialogBox.y1); | ||||
|  | ||||
|         actorBox.x1 = Math.floor(centerX - natWidth / 2); | ||||
|         actorBox.y1 = Math.floor(centerY - natHeight / 2); | ||||
|         actorBox.x2 = actorBox.x1 + natWidth; | ||||
| @@ -881,7 +874,7 @@ const LoginDialog = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _loginScreenSessionActivated: function() { | ||||
|         if (this.actor.opacity == 255 && this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) | ||||
|         if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_SUCCEEDED) | ||||
|             return; | ||||
|  | ||||
|         Tweener.addTween(this.actor, | ||||
| @@ -898,8 +891,7 @@ const LoginDialog = new Lang.Class({ | ||||
|                            }, | ||||
|                            onUpdateScope: this, | ||||
|                            onComplete: function() { | ||||
|                                if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.NOT_VERIFYING) | ||||
|                                    this._authPrompt.reset(); | ||||
|                                this._authPrompt.reset(); | ||||
|                            }, | ||||
|                            onCompleteScope: this }); | ||||
|     }, | ||||
| @@ -928,7 +920,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 +1126,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 +1172,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; | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -448,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; | ||||
| @@ -685,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, | ||||
| @@ -707,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 = 100; | ||||
|  | ||||
| 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'); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -500,11 +500,6 @@ const AllView = new Lang.Class({ | ||||
|  | ||||
|     _loadApps: function() { | ||||
|         let apps = Gio.AppInfo.get_all().filter(function(appInfo) { | ||||
|             try { | ||||
|                 let id = appInfo.get_id(); // catch invalid file encodings | ||||
|             } catch(e) { | ||||
|                 return false; | ||||
|             } | ||||
|             return appInfo.should_show(); | ||||
|         }).map(function(app) { | ||||
|             return app.get_id(); | ||||
| @@ -1066,7 +1061,7 @@ const AppSearchProvider = new Lang.Class({ | ||||
|  | ||||
|     getInitialResultSet: function(terms, callback, cancellable) { | ||||
|         let query = terms.join(' '); | ||||
|         let groups = Shell.AppSystem.search(query); | ||||
|         let groups = Gio.DesktopAppInfo.search(query); | ||||
|         let usage = Shell.AppUsage.get_default(); | ||||
|         let results = []; | ||||
|         groups.forEach(function(group) { | ||||
| @@ -1295,10 +1290,7 @@ const FolderIcon = new Lang.Class({ | ||||
|             if (!_listsIntersect(folderCategories, appCategories)) | ||||
|                 return; | ||||
|  | ||||
|             try { | ||||
|                 addAppId(appInfo.get_id()); // catch invalid file encodings | ||||
|             } catch(e) { | ||||
|             } | ||||
|             addAppId(appInfo.get_id()); | ||||
|         }); | ||||
|  | ||||
|         this.actor.visible = this.view.getAllItems().length > 0; | ||||
|   | ||||
| @@ -26,7 +26,6 @@ const RENAMED_DESKTOP_IDS = { | ||||
|     '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', | ||||
|   | ||||
| @@ -144,7 +144,6 @@ const BackgroundCache = new Lang.Class({ | ||||
|         this._pendingFileLoads = []; | ||||
|         this._fileMonitors = {}; | ||||
|         this._backgroundSources = {}; | ||||
|         this._animations = {}; | ||||
|     }, | ||||
|  | ||||
|     monitorFile: function(file) { | ||||
| @@ -163,13 +162,12 @@ const BackgroundCache = new Lang.Class({ | ||||
|  | ||||
|     getAnimation: function(params) { | ||||
|         params = Params.parse(params, { file: null, | ||||
|                                         settingsSchema: null, | ||||
|                                         onLoaded: null }); | ||||
|  | ||||
|         if (this._animations[params.settingsSchema] && _fileEqual0(this._animationFile, params.file)) { | ||||
|         if (_fileEqual0(this._animationFile, params.file)) { | ||||
|             if (params.onLoaded) { | ||||
|                 let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() { | ||||
|                     params.onLoaded(this._animations[params.settingsSchema]); | ||||
|                     params.onLoaded(this._animation); | ||||
|                     return GLib.SOURCE_REMOVE; | ||||
|                 })); | ||||
|                 GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded'); | ||||
| @@ -180,11 +178,12 @@ const BackgroundCache = new Lang.Class({ | ||||
|         let animation = new Animation({ file: params.file }); | ||||
|  | ||||
|         animation.load(Lang.bind(this, function() { | ||||
|                            this._animations[params.settingsSchema] = animation; | ||||
|                            this._animationFile = params.file; | ||||
|                            this._animation = animation; | ||||
|  | ||||
|                            if (params.onLoaded) { | ||||
|                                let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() { | ||||
|                                    params.onLoaded(this._animations[params.settingsSchema]); | ||||
|                                    params.onLoaded(this._animation); | ||||
|                                    return GLib.SOURCE_REMOVE; | ||||
|                                })); | ||||
|                                GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded'); | ||||
| @@ -247,13 +246,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 +264,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; | ||||
| @@ -415,18 +403,17 @@ const Background = new Lang.Class({ | ||||
|  | ||||
|     _loadAnimation: function(file) { | ||||
|         this._cache.getAnimation({ file: file, | ||||
|                                    settingsSchema: this._settings.schema_id, | ||||
|                                    onLoaded: Lang.bind(this, function(animation) { | ||||
|                                        this._animation = animation; | ||||
|                                          onLoaded: Lang.bind(this, function(animation) { | ||||
|                                              this._animation = animation; | ||||
|  | ||||
|                                        if (!this._animation || this._cancellable.is_cancelled()) { | ||||
|                                            this._setLoaded(); | ||||
|                                            return; | ||||
|                                        } | ||||
|                                              if (!this._animation || this._cancellable.is_cancelled()) { | ||||
|                                                  this._setLoaded(); | ||||
|                                                  return; | ||||
|                                              } | ||||
|  | ||||
|                                        this._updateAnimation(); | ||||
|                                        this._watchFile(file); | ||||
|                                    }) | ||||
|                                              this._updateAnimation(); | ||||
|                                              this._watchFile(file); | ||||
|                                          }) | ||||
|                                  }); | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -24,8 +24,6 @@ const MSECS_IN_DAY = 24 * 60 * 60 * 1000; | ||||
| const SHOW_WEEKDATE_KEY = 'show-weekdate'; | ||||
| const ELLIPSIS_CHAR = '\u2026'; | ||||
|  | ||||
| const MESSAGE_ICON_SIZE = 32; | ||||
|  | ||||
| const MESSAGE_ANIMATION_TIME = 0.1; | ||||
|  | ||||
| const DEFAULT_EXPAND_LINES = 6; | ||||
| @@ -725,8 +723,7 @@ const Calendar = new Lang.Class({ | ||||
|         // nRows here means 6 weeks + one header + one navbar | ||||
|         let nRows = 8; | ||||
|         while (row < 8) { | ||||
|             // xgettext:no-javascript-format | ||||
|             let button = new St.Button({ label: iter.toLocaleFormat(C_("date day number format", "%d")), | ||||
|             let button = new St.Button({ label: iter.getDate().toString(), | ||||
|                                          can_focus: true }); | ||||
|             let rtl = button.get_text_direction() == Clutter.TextDirection.RTL; | ||||
|  | ||||
| @@ -979,6 +976,7 @@ const Message = new Lang.Class({ | ||||
|         this._iconBin = new St.Bin({ style_class: 'message-icon-bin', | ||||
|                                      y_expand: true, | ||||
|                                      visible: false }); | ||||
|         this._iconBin.set_y_align(Clutter.ActorAlign.START); | ||||
|         hbox.add_actor(this._iconBin); | ||||
|  | ||||
|         let contentBox = new St.BoxLayout({ style_class: 'message-content', | ||||
| @@ -1231,7 +1229,7 @@ const NotificationMessage = new Lang.Class({ | ||||
|                 this._closed = true; | ||||
|                 this.notification.destroy(MessageTray.NotificationDestroyedReason.DISMISSED); | ||||
|             })); | ||||
|         this._destroyId = notification.connect('destroy', Lang.bind(this, | ||||
|         notification.connect('destroy', Lang.bind(this, | ||||
|             function() { | ||||
|                 if (!this._closed) | ||||
|                     this.close(); | ||||
| @@ -1242,10 +1240,9 @@ const NotificationMessage = new Lang.Class({ | ||||
|  | ||||
|     _getIcon: function() { | ||||
|         if (this.notification.gicon) | ||||
|             return new St.Icon({ gicon: this.notification.gicon, | ||||
|                                  icon_size: MESSAGE_ICON_SIZE }); | ||||
|             return new St.Icon({ gicon: this.notification.gicon, icon_size: 48 }); | ||||
|         else | ||||
|             return this.notification.source.createIcon(MESSAGE_ICON_SIZE); | ||||
|             return this.notification.source.createIcon(48); | ||||
|     }, | ||||
|  | ||||
|     _onUpdated: function(n, clear) { | ||||
| @@ -1263,10 +1260,6 @@ const NotificationMessage = new Lang.Class({ | ||||
|         if (this._updatedId) | ||||
|             this.notification.disconnect(this._updatedId); | ||||
|         this._updatedId = 0; | ||||
|  | ||||
|         if (this._destroyId) | ||||
|             this.notification.disconnect(this._destroyId); | ||||
|         this._destroyId = 0; | ||||
|     } | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -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() { | ||||
|   | ||||
| @@ -9,15 +9,9 @@ const Gio = imports.gi.Gio; | ||||
| const GObject = imports.gi.GObject; | ||||
| const Gcr = imports.gi.Gcr; | ||||
|  | ||||
| const Animation = imports.ui.animation; | ||||
| const ModalDialog = imports.ui.modalDialog; | ||||
| const ShellEntry = imports.ui.shellEntry; | ||||
| const CheckBox = imports.ui.checkBox; | ||||
| const Tweener = imports.ui.tweener; | ||||
|  | ||||
| const WORK_SPINNER_ICON_SIZE = 16; | ||||
| const WORK_SPINNER_ANIMATION_DELAY = 1.0; | ||||
| const WORK_SPINNER_ANIMATION_TIME = 0.3; | ||||
|  | ||||
| const KeyringDialog = new Lang.Class({ | ||||
|     Name: 'KeyringDialog', | ||||
| @@ -64,47 +58,27 @@ const KeyringDialog = new Lang.Class({ | ||||
|                             { y_fill:  true, | ||||
|                               y_align: St.Align.START }); | ||||
|  | ||||
|         this._workSpinner = null; | ||||
|         this._controlTable = null; | ||||
|  | ||||
|  | ||||
|         this._cancelButton = this.addButton({ label: '', | ||||
|                                               action: Lang.bind(this, this._onCancelButton), | ||||
|                                               key: Clutter.Escape }); | ||||
|                                               key: Clutter.Escape }, | ||||
|                                             { expand: true, x_fill: false, x_align: St.Align.START }); | ||||
|         this.placeSpinner({ expand: false, | ||||
|                             x_fill: false, | ||||
|                             y_fill: false, | ||||
|                             x_align: St.Align.END, | ||||
|                             y_align: St.Align.MIDDLE }); | ||||
|         this._continueButton = this.addButton({ label: '', | ||||
|                                                 action: Lang.bind(this, this._onContinueButton), | ||||
|                                                 default: true }); | ||||
|                                                 default: true }, | ||||
|                                               { expand: false, x_fill: false, x_align: St.Align.END }); | ||||
|  | ||||
|         this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE); | ||||
|         this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE); | ||||
|     }, | ||||
|  | ||||
|     _setWorking: function(working) { | ||||
|         if (!this._workSpinner) | ||||
|             return; | ||||
|  | ||||
|         Tweener.removeTweens(this._workSpinner.actor); | ||||
|         if (working) { | ||||
|             this._workSpinner.play(); | ||||
|             Tweener.addTween(this._workSpinner.actor, | ||||
|                              { opacity: 255, | ||||
|                                delay: WORK_SPINNER_ANIMATION_DELAY, | ||||
|                                time: WORK_SPINNER_ANIMATION_TIME, | ||||
|                                transition: 'linear' | ||||
|                              }); | ||||
|         } else { | ||||
|             Tweener.addTween(this._workSpinner.actor, | ||||
|                              { opacity: 0, | ||||
|                                time: WORK_SPINNER_ANIMATION_TIME, | ||||
|                                transition: 'linear', | ||||
|                                onCompleteScope: this, | ||||
|                                onComplete: function() { | ||||
|                                    if (this._workSpinner) | ||||
|                                        this._workSpinner.stop(); | ||||
|                                } | ||||
|                              }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _buildControlTable: function() { | ||||
|         let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL }); | ||||
|         let table = new St.Widget({ style_class: 'keyring-dialog-control-table', | ||||
| @@ -127,22 +101,15 @@ const KeyringDialog = new Lang.Class({ | ||||
|             ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true }); | ||||
|             this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate)); | ||||
|  | ||||
|             let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); | ||||
|             this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE); | ||||
|             this._workSpinner.actor.opacity = 0; | ||||
|  | ||||
|             if (rtl) { | ||||
|                 layout.attach(this._workSpinner.actor, 0, row, 1, 1); | ||||
|                 layout.attach(this._passwordEntry, 1, row, 1, 1); | ||||
|                 layout.attach(label, 2, row, 1, 1); | ||||
|                 layout.attach(this._passwordEntry, 0, row, 1, 1); | ||||
|                 layout.attach(label, 1, row, 1, 1); | ||||
|             } else { | ||||
|                 layout.attach(label, 0, row, 1, 1); | ||||
|                 layout.attach(this._passwordEntry, 1, row, 1, 1); | ||||
|                 layout.attach(this._workSpinner.actor, 2, row, 1, 1); | ||||
|             } | ||||
|             row++; | ||||
|         } else { | ||||
|             this._workSpinner = null; | ||||
|             this._passwordEntry = null; | ||||
|         } | ||||
|  | ||||
| @@ -211,7 +178,7 @@ const KeyringDialog = new Lang.Class({ | ||||
|  | ||||
|         this._continueButton.can_focus = sensitive; | ||||
|         this._continueButton.reactive = sensitive; | ||||
|         this._setWorking(!sensitive); | ||||
|         this.setWorking(!sensitive); | ||||
|     }, | ||||
|  | ||||
|     _ensureOpen: function() { | ||||
|   | ||||
| @@ -13,19 +13,13 @@ const Mainloop = imports.mainloop; | ||||
| const Polkit = imports.gi.Polkit; | ||||
| const PolkitAgent = imports.gi.PolkitAgent; | ||||
|  | ||||
| const Animation = imports.ui.animation; | ||||
| const Components = imports.ui.components; | ||||
| const ModalDialog = imports.ui.modalDialog; | ||||
| const ShellEntry = imports.ui.shellEntry; | ||||
| const UserWidget = imports.ui.userWidget; | ||||
| const Tweener = imports.ui.tweener; | ||||
|  | ||||
| const DIALOG_ICON_SIZE = 48; | ||||
|  | ||||
| const WORK_SPINNER_ICON_SIZE = 16; | ||||
| const WORK_SPINNER_ANIMATION_DELAY = 1.0; | ||||
| const WORK_SPINNER_ANIMATION_TIME = 0.3; | ||||
|  | ||||
| const AuthenticationDialog = new Lang.Class({ | ||||
|     Name: 'AuthenticationDialog', | ||||
|     Extends: ModalDialog.ModalDialog, | ||||
| @@ -142,13 +136,6 @@ const AuthenticationDialog = new Lang.Class({ | ||||
|         this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate)); | ||||
|         this._passwordBox.add(this._passwordEntry, | ||||
|                               { expand: true }); | ||||
|  | ||||
|         let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); | ||||
|         this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE); | ||||
|         this._workSpinner.actor.opacity = 0; | ||||
|  | ||||
|         this._passwordBox.add(this._workSpinner.actor); | ||||
|  | ||||
|         this.setInitialKeyFocus(this._passwordEntry); | ||||
|         this._passwordBox.hide(); | ||||
|  | ||||
| @@ -178,10 +165,17 @@ const AuthenticationDialog = new Lang.Class({ | ||||
|  | ||||
|         this._cancelButton = this.addButton({ label: _("Cancel"), | ||||
|                                               action: Lang.bind(this, this.cancel), | ||||
|                                               key: Clutter.Escape }); | ||||
|                                               key: Clutter.Escape }, | ||||
|                                             { expand: true, x_fill: false, x_align: St.Align.START }); | ||||
|         this.placeSpinner({ expand: false, | ||||
|                             x_fill: false, | ||||
|                             y_fill: false, | ||||
|                             x_align: St.Align.END, | ||||
|                             y_align: St.Align.MIDDLE }); | ||||
|         this._okButton = this.addButton({ label:  _("Authenticate"), | ||||
|                                           action: Lang.bind(this, this._onAuthenticateButtonPressed), | ||||
|                                           default: true }); | ||||
|                                           default: true }, | ||||
|                                         { expand: false, x_fill: false, x_align: St.Align.END }); | ||||
|  | ||||
|         this._doneEmitted = false; | ||||
|  | ||||
| @@ -189,30 +183,6 @@ const AuthenticationDialog = new Lang.Class({ | ||||
|         this._cookie = cookie; | ||||
|     }, | ||||
|  | ||||
|     _setWorking: function(working) { | ||||
|         Tweener.removeTweens(this._workSpinner.actor); | ||||
|         if (working) { | ||||
|             this._workSpinner.play(); | ||||
|             Tweener.addTween(this._workSpinner.actor, | ||||
|                              { opacity: 255, | ||||
|                                delay: WORK_SPINNER_ANIMATION_DELAY, | ||||
|                                time: WORK_SPINNER_ANIMATION_TIME, | ||||
|                                transition: 'linear' | ||||
|                              }); | ||||
|         } else { | ||||
|             Tweener.addTween(this._workSpinner.actor, | ||||
|                              { opacity: 0, | ||||
|                                time: WORK_SPINNER_ANIMATION_TIME, | ||||
|                                transition: 'linear', | ||||
|                                onCompleteScope: this, | ||||
|                                onComplete: function() { | ||||
|                                    if (this._workSpinner) | ||||
|                                        this._workSpinner.stop(); | ||||
|                                } | ||||
|                              }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     performAuthentication: function() { | ||||
|         this.destroySession(); | ||||
|         this._session = new PolkitAgent.Session({ identity: this._identityToAuth, | ||||
| @@ -259,7 +229,7 @@ const AuthenticationDialog = new Lang.Class({ | ||||
|  | ||||
|         this._okButton.can_focus = sensitive; | ||||
|         this._okButton.reactive = sensitive; | ||||
|         this._setWorking(!sensitive); | ||||
|         this.setWorking(!sensitive); | ||||
|     }, | ||||
|  | ||||
|     _onEntryActivate: function() { | ||||
|   | ||||
| @@ -303,8 +303,6 @@ const ChatSource = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _createPolicy: function() { | ||||
|         if (this._account.protocol_name == 'irc') | ||||
|             return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari'); | ||||
|         return new MessageTray.NotificationApplicationPolicy('empathy'); | ||||
|     }, | ||||
|  | ||||
|   | ||||
| @@ -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) | ||||
|   | ||||
							
								
								
									
										71
									
								
								js/ui/dnd.js
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								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; | ||||
|   | ||||
| @@ -334,7 +334,7 @@ function _sessionUpdated() { | ||||
|     // from allowExtensions in the future | ||||
|     if (Main.sessionMode.allowExtensions) { | ||||
|         if (initted) | ||||
|             enabledExtensions = getEnabledExtensions(); | ||||
|             onEnabledExtensionsChanged(); | ||||
|         enableAllExtensions(); | ||||
|     } else { | ||||
|         disableAllExtensions(); | ||||
|   | ||||
| @@ -24,6 +24,9 @@ const KEYBOARD_TYPE = 'keyboard-type'; | ||||
| const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; | ||||
| const SHOW_KEYBOARD = 'screen-keyboard-enabled'; | ||||
|  | ||||
| const CURSOR_BUS_NAME = 'org.gnome.SettingsDaemon.Cursor'; | ||||
| const CURSOR_OBJECT_PATH = '/org/gnome/SettingsDaemon/Cursor'; | ||||
|  | ||||
| const CARIBOU_BUS_NAME = 'org.gnome.Caribou.Daemon'; | ||||
| const CARIBOU_OBJECT_PATH = '/org/gnome/Caribou/Daemon'; | ||||
|  | ||||
| @@ -204,6 +207,9 @@ const Keyboard = new Lang.Class({ | ||||
|         this._keyboardSettings.connect('changed', Lang.bind(this, this._sync)); | ||||
|         this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA }); | ||||
|         this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._sync)); | ||||
|         this._watchNameId = Gio.bus_watch_name(Gio.BusType.SESSION, CURSOR_BUS_NAME, 0, | ||||
|                                                Lang.bind(this, this._sync), | ||||
|                                                Lang.bind(this, this._sync)); | ||||
|         this._daemonProxy = null; | ||||
|         this._lastDeviceId = null; | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,6 @@ const Atspi = imports.gi.Atspi; | ||||
| const Clutter = imports.gi.Clutter; | ||||
| const GDesktopEnums = imports.gi.GDesktopEnums; | ||||
| const Gio = imports.gi.Gio; | ||||
| const GLib = imports.gi.GLib; | ||||
| const Shell = imports.gi.Shell; | ||||
| const St = imports.gi.St; | ||||
| const Lang = imports.lang; | ||||
| @@ -23,8 +22,6 @@ const MOUSE_POLL_FREQUENCY = 50; | ||||
| const CROSSHAIRS_CLIP_SIZE = [100, 100]; | ||||
| const NO_CHANGE = 0.0; | ||||
|  | ||||
| const POINTER_REST_TIME = 1000; // milliseconds | ||||
|  | ||||
| // Settings | ||||
| const APPLICATIONS_SCHEMA       = 'org.gnome.desktop.a11y.applications'; | ||||
| const SHOW_KEY                  = 'screen-magnifier-enabled'; | ||||
| @@ -712,9 +709,6 @@ const ZoomRegion = new Lang.Class({ | ||||
|         this._xCaret = 0; | ||||
|         this._yCaret = 0; | ||||
|  | ||||
|         this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID); | ||||
|         this._scrollContentsTimerId = 0; | ||||
|  | ||||
|         Main.layoutManager.connect('monitors-changed', | ||||
|                                    Lang.bind(this, this._monitorsChanged)); | ||||
|         this._focusCaretTracker.connect('caret-moved', | ||||
| @@ -1074,26 +1068,6 @@ const ZoomRegion = new Lang.Class({ | ||||
|         return this._isMouseOverRegion(); | ||||
|     }, | ||||
|  | ||||
|     _clearScrollContentsTimer: function() { | ||||
|         if (this._scrollContentsTimerId != 0) { | ||||
|             Mainloop.source_remove(this._scrollContentsTimerId); | ||||
|             this._scrollContentsTimerId = 0; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _scrollContentsToDelayed: function(x, y) { | ||||
|         if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) { | ||||
|             this.scrollContentsTo(x, y); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._clearScrollContentsTimer(); | ||||
|         this._scrollContentsTimerId = Mainloop.timeout_add(POINTER_REST_TIME, Lang.bind(this, function() { | ||||
|             this._scrollContentsToDelayed(x, y); | ||||
|             return GLib.SOURCE_REMOVE; | ||||
|         })); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * scrollContentsTo: | ||||
|      * Shift the contents of the magnified view such it is centered on the given | ||||
| @@ -1102,8 +1076,6 @@ const ZoomRegion = new Lang.Class({ | ||||
|      * @y:      The y-coord of the point to center on. | ||||
|      */ | ||||
|     scrollContentsTo: function(x, y) { | ||||
|         this._clearScrollContentsTimer(); | ||||
|  | ||||
|         this._followingCursor = false; | ||||
|         this._changeROI({ xCenter: x, | ||||
|                           yCenter: y }); | ||||
| @@ -1409,7 +1381,7 @@ const ZoomRegion = new Lang.Class({ | ||||
|         else if (this._caretTrackingMode == GDesktopEnums.MagnifierCaretTrackingMode.CENTERED) | ||||
|             [xCaret, yCaret] = this._centerFromPointCentered(xCaret, yCaret); | ||||
|  | ||||
|         this._scrollContentsToDelayed(xCaret, yCaret); | ||||
|         this.scrollContentsTo(xCaret, yCaret); | ||||
|     }, | ||||
|  | ||||
|     _centerFromFocusPosition: function() { | ||||
| @@ -1423,7 +1395,7 @@ const ZoomRegion = new Lang.Class({ | ||||
|         else if (this._focusTrackingMode == GDesktopEnums.MagnifierFocusTrackingMode.CENTERED) | ||||
|             [xFocus, yFocus] = this._centerFromPointCentered(xFocus, yFocus); | ||||
|  | ||||
|         this._scrollContentsToDelayed(xFocus, yFocus); | ||||
|         this.scrollContentsTo(xFocus, yFocus); | ||||
|     }, | ||||
|  | ||||
|     _centerFromPointPush: function(xPoint, yPoint) { | ||||
|   | ||||
| @@ -78,7 +78,6 @@ let _startDate; | ||||
| let _defaultCssStylesheet = null; | ||||
| let _cssStylesheet = null; | ||||
| let _a11ySettings = null; | ||||
| let _themeResource = null; | ||||
|  | ||||
| function _sessionUpdated() { | ||||
|     if (sessionMode.isPrimary) | ||||
| @@ -138,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 | ||||
| @@ -289,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: | ||||
|  * | ||||
|   | ||||
| @@ -14,6 +14,7 @@ const Atk = imports.gi.Atk; | ||||
|  | ||||
| const Params = imports.misc.params; | ||||
|  | ||||
| const Animation = imports.ui.animation; | ||||
| const Layout = imports.ui.layout; | ||||
| const Lightbox = imports.ui.lightbox; | ||||
| const Main = imports.ui.main; | ||||
| @@ -22,6 +23,10 @@ const Tweener = imports.ui.tweener; | ||||
| const OPEN_AND_CLOSE_TIME = 0.1; | ||||
| const FADE_OUT_DIALOG_TIME = 1.0; | ||||
|  | ||||
| const WORK_SPINNER_ICON_SIZE = 24; | ||||
| const WORK_SPINNER_ANIMATION_DELAY = 1.0; | ||||
| const WORK_SPINNER_ANIMATION_TIME = 0.3; | ||||
|  | ||||
| const State = { | ||||
|     OPENED: 0, | ||||
|     CLOSED: 1, | ||||
| @@ -74,9 +79,7 @@ const ModalDialog = new Lang.Class({ | ||||
|         this._group.add_actor(this._backgroundBin); | ||||
|  | ||||
|         this.dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog', | ||||
|                                                x_align:      Clutter.ActorAlign.CENTER, | ||||
|                                                y_align:      Clutter.ActorAlign.CENTER, | ||||
|                                                vertical:     true }); | ||||
|                                                vertical:    true }); | ||||
|         // modal dialogs are fixed width and grow vertically; set the request | ||||
|         // mode accordingly so wrapped labels are handled correctly during | ||||
|         // size requests. | ||||
| @@ -97,8 +100,7 @@ const ModalDialog = new Lang.Class({ | ||||
|         this.backgroundStack.add_actor(this.dialogLayout); | ||||
|  | ||||
|  | ||||
|         this.contentLayout = new St.BoxLayout({ vertical: true, | ||||
|                                                 style_class: "modal-dialog-content-box" }); | ||||
|         this.contentLayout = new St.BoxLayout({ vertical: true }); | ||||
|         this.dialogLayout.add(this.contentLayout, | ||||
|                               { expand:  true, | ||||
|                                 x_fill:  true, | ||||
| @@ -106,7 +108,8 @@ const ModalDialog = new Lang.Class({ | ||||
|                                 x_align: St.Align.MIDDLE, | ||||
|                                 y_align: St.Align.START }); | ||||
|  | ||||
|         this.buttonLayout = new St.Widget ({ layout_manager: new Clutter.BoxLayout ({ homogeneous:true }) }); | ||||
|         this.buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box', | ||||
|                                                vertical: false }); | ||||
|         this.dialogLayout.add(this.buttonLayout, | ||||
|                               { x_align: St.Align.MIDDLE, | ||||
|                                 y_align: St.Align.END }); | ||||
| @@ -115,6 +118,8 @@ const ModalDialog = new Lang.Class({ | ||||
|         this._initialKeyFocus = this.dialogLayout; | ||||
|         this._initialKeyFocusDestroyId = 0; | ||||
|         this._savedKeyFocus = null; | ||||
|  | ||||
|         this._workSpinner = null; | ||||
|     }, | ||||
|  | ||||
|     destroy: function() { | ||||
| @@ -142,12 +147,16 @@ const ModalDialog = new Lang.Class({ | ||||
|             else | ||||
|                 x_alignment = St.Align.MIDDLE; | ||||
|  | ||||
|             this.addButton(buttonInfo); | ||||
|             this.addButton(buttonInfo, { expand: true, | ||||
|                                          x_fill: false, | ||||
|                                          y_fill: false, | ||||
|                                          x_align: x_alignment, | ||||
|                                          y_align: St.Align.MIDDLE }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     addButton: function(buttonInfo) { | ||||
|         let label = buttonInfo['label'] | ||||
|     addButton: function(buttonInfo, layoutInfo) { | ||||
|         let label = buttonInfo['label']; | ||||
|         let action = buttonInfo['action']; | ||||
|         let key = buttonInfo['key']; | ||||
|         let isDefault = buttonInfo['default']; | ||||
| @@ -161,12 +170,10 @@ const ModalDialog = new Lang.Class({ | ||||
|         else | ||||
|             keys = []; | ||||
|  | ||||
|         let button = new St.Button({ style_class: 'modal-dialog-linked-button', | ||||
|         let button = new St.Button({ style_class: 'modal-dialog-button button', | ||||
|                                      button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, | ||||
|                                      reactive:    true, | ||||
|                                      can_focus:   true, | ||||
|                                      x_expand:    true, | ||||
|                                      y_expand:    true, | ||||
|                                      label:       label }); | ||||
|         button.connect('clicked', action); | ||||
|  | ||||
| @@ -181,11 +188,47 @@ const ModalDialog = new Lang.Class({ | ||||
|         for (let i in keys) | ||||
|             this._buttonKeys[keys[i]] = buttonInfo; | ||||
|  | ||||
|         this.buttonLayout.add_actor(button); | ||||
|         this.buttonLayout.add(button, layoutInfo); | ||||
|  | ||||
|         return button; | ||||
|     }, | ||||
|  | ||||
|     placeSpinner: function(layoutInfo) { | ||||
|         let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); | ||||
|         this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE); | ||||
|         this._workSpinner.actor.opacity = 0; | ||||
|         this._workSpinner.actor.show(); | ||||
|  | ||||
|         this.buttonLayout.add(this._workSpinner.actor, layoutInfo); | ||||
|     }, | ||||
|  | ||||
|     setWorking: function(working) { | ||||
|         if (!this._workSpinner) | ||||
|             return; | ||||
|  | ||||
|         Tweener.removeTweens(this._workSpinner.actor); | ||||
|         if (working) { | ||||
|             this._workSpinner.play(); | ||||
|             Tweener.addTween(this._workSpinner.actor, | ||||
|                              { opacity: 255, | ||||
|                                delay: WORK_SPINNER_ANIMATION_DELAY, | ||||
|                                time: WORK_SPINNER_ANIMATION_TIME, | ||||
|                                transition: 'linear' | ||||
|                              }); | ||||
|         } else { | ||||
|             Tweener.addTween(this._workSpinner.actor, | ||||
|                              { opacity: 0, | ||||
|                                time: WORK_SPINNER_ANIMATION_TIME, | ||||
|                                transition: 'linear', | ||||
|                                onCompleteScope: this, | ||||
|                                onComplete: function() { | ||||
|                                    if (this._workSpinner) | ||||
|                                        this._workSpinner.stop(); | ||||
|                                } | ||||
|                              }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _onKeyPressEvent: function(object, event) { | ||||
|         this._pressedKey = event.get_key_symbol(); | ||||
|         return Clutter.EVENT_PROPAGATE; | ||||
|   | ||||
| @@ -107,6 +107,13 @@ const Overview = new Lang.Class({ | ||||
|  | ||||
|         this._overviewCreated = true; | ||||
|  | ||||
|         // The main Background actors are inside global.window_group which are | ||||
|         // hidden when displaying the overview, so we create a new | ||||
|         // 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. | ||||
|         let monitor = Main.layoutManager.primaryMonitor; | ||||
|  | ||||
|         let layout = new Clutter.BinLayout(); | ||||
|         this._stack = new Clutter.Actor({ layout_manager: layout }); | ||||
|         this._stack.add_constraint(new LayoutManager.MonitorConstraint({ primary: true })); | ||||
| @@ -121,11 +128,6 @@ const Overview = new Lang.Class({ | ||||
|                                             y_expand: true }); | ||||
|         this._overview._delegate = this; | ||||
|  | ||||
|         // The main Background actors are inside global.window_group which are | ||||
|         // hidden when displaying the overview, so we create a new | ||||
|         // 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(); | ||||
|         Main.layoutManager.overviewGroup.add_child(this._backgroundGroup); | ||||
|         this._bgManagers = []; | ||||
|   | ||||
| @@ -25,12 +25,12 @@ const RemoteMenu = imports.ui.remoteMenu; | ||||
| const Main = imports.ui.main; | ||||
| const Tweener = imports.ui.tweener; | ||||
|  | ||||
| const PANEL_ICON_SIZE = 16; | ||||
| const APP_MENU_ICON_MARGIN = 0; | ||||
| const PANEL_ICON_SIZE = 24; | ||||
| const APP_MENU_ICON_MARGIN = 2; | ||||
|  | ||||
| const BUTTON_DND_ACTIVATION_TIMEOUT = 250; | ||||
|  | ||||
| const SPINNER_ANIMATION_TIME = 1.0; | ||||
| const SPINNER_ANIMATION_TIME = 0.2; | ||||
|  | ||||
| // To make sure the panel corners blend nicely with the panel, | ||||
| // we draw background and borders the same way, e.g. drawing | ||||
| @@ -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(); | ||||
|                                    }) | ||||
|                                  }; | ||||
|   | ||||
| @@ -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)); | ||||
|  | ||||
|         // 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(_("Bluetooth"), 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,41 @@ 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; | ||||
|             this._item.label.text = ngettext("%d Connected Device", "%d Connected Devices", nDevices).format(nDevices); | ||||
|         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"); | ||||
|         else | ||||
|             this._item.label.text = _("Not In Use"); | ||||
|  | ||||
|         this._toggleItem.label.text = this._proxy.BluetoothAirplaneMode ? _("Turn On") : _("Turn Off"); | ||||
|             this._item.label.text = _("Not Connected"); | ||||
|     }, | ||||
| }); | ||||
|   | ||||
| @@ -7,17 +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 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 = 'desktop'; | ||||
| const APP_PERMISSIONS_ID = 'geolocation'; | ||||
|  | ||||
| const GeoclueAccuracyLevel = { | ||||
|     NONE: 0, | ||||
|     COUNTRY: 1, | ||||
| @@ -51,26 +46,6 @@ var AgentIface = '<node> \ | ||||
|   </interface> \ | ||||
| </node>'; | ||||
|  | ||||
| var XdgAppIface = '<node> \ | ||||
|   <interface name="org.freedesktop.XdgApp.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(XdgAppIface); | ||||
|  | ||||
| const Indicator = new Lang.Class({ | ||||
|     Name: 'LocationIndicator', | ||||
|     Extends: PanelMenu.SystemIndicator, | ||||
| @@ -87,13 +62,13 @@ const Indicator = new Lang.Class({ | ||||
|         this._indicator = this._addIndicator(); | ||||
|         this._indicator.icon_name = 'find-location-symbolic'; | ||||
|  | ||||
|         this._item = new PopupMenu.PopupSubMenuMenuItem('', true); | ||||
|         this._item = new PopupMenu.PopupSubMenuMenuItem(_("Location"), true); | ||||
|         this._item.icon.icon_name = 'find-location-symbolic'; | ||||
|  | ||||
|         this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this); | ||||
|         this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent'); | ||||
|  | ||||
|         this._item.label.text = _("Location Enabled"); | ||||
|         this._item.label.text = _("Location Services in Use"); | ||||
|         this._onOffAction = this._item.menu.addAction(_("Disable"), Lang.bind(this, this._onOnOffAction)); | ||||
|         this._item.menu.addSettingsAction(_("Privacy Settings"), 'gnome-privacy-panel.desktop'); | ||||
|  | ||||
| @@ -108,200 +83,63 @@ const Indicator = new Lang.Class({ | ||||
|         this._onSessionUpdated(); | ||||
|         this._onMaxAccuracyLevelChanged(); | ||||
|         this._connectToGeoclue(); | ||||
|         this._connectToPermissionStore(); | ||||
|     }, | ||||
|  | ||||
|     get MaxAccuracyLevel() { | ||||
|         return this._getMaxAccuracyLevel(); | ||||
|     }, | ||||
|  | ||||
|     AuthorizeAppAsync: function(params, invocation) { | ||||
|         let [desktop_id, reqAccuracyLevel] = params; | ||||
|         log("%s is requesting location".format(desktop_id)); | ||||
|  | ||||
|         let callback = function(level, timesAllowed) { | ||||
|             if (level >= GeoclueAccuracyLevel.NONE && timesAllowed > 2) { | ||||
|                 log("%s is in store".format(desktop_id)); | ||||
|                 let accuracyLevel = clamp(reqAccuracyLevel, 0, level); | ||||
|                 this._completeAuthorizeApp(desktop_id, | ||||
|                                            accuracyLevel, | ||||
|                                            timesAllowed, | ||||
|                                            invocation); | ||||
|             } else { | ||||
|                 log("%s not in store".format(desktop_id)); | ||||
|                 this._userAuthorizeApp(desktop_id, | ||||
|                                        reqAccuracyLevel, | ||||
|                                        timesAllowed, | ||||
|                                        invocation); | ||||
|             } | ||||
|         } | ||||
|         this._fetchPermissionFromStore(desktop_id, Lang.bind(this, callback); | ||||
|     }, | ||||
|  | ||||
|     _userAuthorizeApp: function(desktopId, reqAccuracyLevel, timesAllowed, invocation) { | ||||
|     // 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(desktopId + ".desktop"); | ||||
|         var app = appSystem.lookup_app(desktop_id + ".desktop"); | ||||
|         if (app == null) { | ||||
|             this._completeAuthorizeApp(desktopId, | ||||
|                                        GeoclueAccuracyLevel.NONE, | ||||
|                                        timesAllowed, | ||||
|                                        invocation); | ||||
|             return; | ||||
|             return [false, 0]; | ||||
|         } | ||||
|  | ||||
|         var name = app.get_name(); | ||||
|         var icon = app.get_app_info().get_icon(); | ||||
|         var reason = app.get_string("X-Geoclue-Reason"); | ||||
|         var allowCallback = function() { | ||||
|             this._completeAuthorizeApp(desktopId, | ||||
|                                        reqAccuracyLevel, | ||||
|                                        timesAllowed, | ||||
|                                        invocation); | ||||
|         }; | ||||
|         var denyCallback = function() { | ||||
|             this._completeAuthorizeApp(desktopId, | ||||
|                                        GeoclueAccuracyLevel.NONE, | ||||
|                                        timesAllowed, | ||||
|                                        invocation); | ||||
|         }; | ||||
|  | ||||
|         this._showAppAuthDialog(name, | ||||
|                                 reason, | ||||
|                                 icon, | ||||
|                                 Lang.bind(this, allowCallback), | ||||
|                                 Lang.bind(this, denyCallback)); | ||||
|     }, | ||||
|  | ||||
|     _showAppAuthDialog: function(name, reason, icon, allowCallback, denyCallback) { | ||||
|         if (this._dialog == null) | ||||
|             this._dialog = new GeolocationDialog(name, reason, icon); | ||||
|         else | ||||
|             this._dialog.update(name, reason, icon); | ||||
|  | ||||
|         let closedId = this._dialog.connect('closed', function() { | ||||
|             this._dialog.disconnect(closedId); | ||||
|             if (this._dialog.allowed) | ||||
|                 allowCallback (); | ||||
|             else | ||||
|                 denyCallback (); | ||||
|         }.bind(this)); | ||||
|  | ||||
|         this._dialog.open(global.get_current_time ()); | ||||
|     }, | ||||
|  | ||||
|     _completeAuthorizeApp: function(desktopId, | ||||
|                                     accuracyLevel, | ||||
|                                     timesAllowed, | ||||
|                                     invocation) { | ||||
|         if (accuracyLevel == GeoclueAccuracyLevel.NONE) { | ||||
|             invocation.return_value(GLib.Variant.new('(bu)', | ||||
|                                                      [false, accuracyLevel])); | ||||
|             this._saveToPermissionStore(desktopId, accuracyLevel, 0); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         let allowedAccuracyLevel = clamp(accuracyLevel, | ||||
|                                          0, | ||||
|                                          this._getMaxAccuracyLevel()); | ||||
|         invocation.return_value(GLib.Variant.new('(bu)', | ||||
|                                                  [true, allowedAccuracyLevel])); | ||||
|  | ||||
|         this._saveToPermissionStore(desktopId, allowedAccuracyLevel, timesAllowed + 1); | ||||
|     }, | ||||
|  | ||||
|     _fetchPermissionFromStore: function(desktopId, callback) { | ||||
|         if (this._permStoreProxy == null) { | ||||
|             callback (-1, 0); | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this._permStoreProxy.LookupRemote(APP_PERMISSIONS_TABLE, | ||||
|                                           APP_PERMISSIONS_ID, | ||||
|                                           function(result, error) { | ||||
|             if (error != null) { | ||||
|                 log(error.message); | ||||
|                 callback(-1, 0); | ||||
|  | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             let [permissions, data] = result; | ||||
|             let permission = permissions[desktopId]; | ||||
|             if (permission == null) { | ||||
|                 callback(-1, 0); | ||||
|  | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             let levelStr = permission[0]; | ||||
|             let level = GeoclueAccuracyLevel[levelStr.toUpperCase()] || | ||||
|                         GeoclueAccuracyLevel.NONE; | ||||
|             let timesAllowed = data.get_byte(); | ||||
|  | ||||
|             callback(level, timesAllowed); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     _saveToPermissionStore: function(desktopId, | ||||
|                                      allowedAccuracyLevel, | ||||
|                                      timesAllowed) { | ||||
|         if (timesAllowed > 2 || this._permStoreProxy == null) | ||||
|             return; | ||||
|  | ||||
|         let levelStr = Object.keys(GeoclueAccuracyLevel)[allowedAccuracyLevel];  | ||||
|         let permission = { desktopId: [levelStr] }; | ||||
|         let permissions = GLib.Variant.new('a{sas}', [permission])); | ||||
|         let data = GLib.Variant.new('y', timesAllowed); | ||||
|  | ||||
|         this._permStoreProxy.SetRemote(APP_PERMISSIONS_TABLE, | ||||
|                                        true, | ||||
|                                        APP_PERMISSIONS_ID, | ||||
|                                        permissions, | ||||
|                                        data, | ||||
|                                        function (result, error) { | ||||
|             log(error.message); | ||||
|         }); | ||||
|         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) { | ||||
| @@ -314,10 +152,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(); | ||||
|     }, | ||||
| @@ -332,20 +170,7 @@ const Indicator = new Lang.Class({ | ||||
|         this.menu.setSensitive(sensitive); | ||||
|     }, | ||||
|  | ||||
|     _updateMenuLabels: function() { | ||||
|         if (this._settings.get_boolean(ENABLED)) { | ||||
|             this._item.label.text = this._indicator.visible ? _("Location In Use") | ||||
|                                                             : _("Location Enabled"); | ||||
|             this._onOffAction.label.text = _("Disable"); | ||||
|         } else { | ||||
|             this._item.label.text = _("Location Disabled"); | ||||
|             this._onOffAction.label.text = _("Enable"); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _onMaxAccuracyLevelChanged: function() { | ||||
|         this._updateMenuLabels(); | ||||
|  | ||||
|         // Gotta ensure geoclue is up and we are registered as agent to it | ||||
|         // before we emit the notify for this property change. | ||||
|         if (!this._connectToGeoclue()) | ||||
| @@ -372,85 +197,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.XdgApp', | ||||
|                            '/org/freedesktop/XdgApp/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 GeolocationDialog = new Lang.Class({ | ||||
|     Name: 'GeolocationDialog', | ||||
|     Extends: ModalDialog.ModalDialog, | ||||
|  | ||||
|     // FIXME: Would be nice to show the application icon too | ||||
|     _init: function(name, reason, icon) { | ||||
|         this.parent({ destroyOnClose: false }); | ||||
|  | ||||
|         let text = _("'%s' is requesting access to location data.").format (name); | ||||
|         this._label = new St.Label({ style_class: 'prompt-dialog-description', | ||||
|                                      text: text }); | ||||
|  | ||||
|         this.contentLayout.add(this._label, {}); | ||||
|  | ||||
|         if (reason != null) { | ||||
|             this._reasonLabel = new St.Label({ style_class: 'prompt-dialog-description', | ||||
|                                                text: reason }); | ||||
|             this.contentLayout.add(this._reasonLabel, {}); | ||||
|         } else { | ||||
|             this._reasonLabel = null; | ||||
|         } | ||||
|  | ||||
|         this._allowButton = this.addButton({ label: _("Confirm"), | ||||
|                                              action: this._onAllowClicked.bind(this), | ||||
|                                              default: false }, | ||||
|                                            { expand: true, x_fill: false, x_align: St.Align.END }); | ||||
|         this._denyButton = this.addButton({ label: _("Cancel"), | ||||
|                                             action: this._onDisallowClicked.bind(this), | ||||
|                                             default: true }, | ||||
|                                           { expand: true, x_fill: false, x_align: St.Align.START }); | ||||
|     }, | ||||
|  | ||||
|     update: function(name, reason, icon) { | ||||
|         let text = _("'%s' is requesting access to location data.").format (name); | ||||
|         this._label.text = text; | ||||
|  | ||||
|         if (this._reasonLabel != null) { | ||||
|             this.contentLayout.remove(this._reasonLabel, {}); | ||||
|             this._reasonLabel = null; | ||||
|         } | ||||
|  | ||||
|         if (reason != null) { | ||||
|             this._reasonLabel = new St.Label({ style_class: 'prompt-dialog-description', | ||||
|                                                text: reason }); | ||||
|             this.contentLayout.add(this._reasonLabel, {}); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _onAllowClicked: function() { | ||||
|         this.allowed = true; | ||||
|         this.close(); | ||||
|     }, | ||||
|  | ||||
|     _onDisallowClicked: function() { | ||||
|         this.allowed = false; | ||||
|         this.close(); | ||||
|     } | ||||
| }); | ||||
|   | ||||
| @@ -347,7 +347,6 @@ const NMConnectionDevice = new Lang.Class({ | ||||
|         this.parent(client); | ||||
|         this._device = device; | ||||
|         this._settings = settings; | ||||
|         this._description = ''; | ||||
|  | ||||
|         this._autoConnectItem = this.item.menu.addAction(_("Connect"), Lang.bind(this, this._autoConnect)); | ||||
|         this._deactivateItem = this._radioSection.addAction(_("Turn Off"), Lang.bind(this, this.deactivateConnection)); | ||||
| @@ -447,44 +446,38 @@ const NMConnectionDevice = new Lang.Class({ | ||||
|  | ||||
|         switch(this._device.state) { | ||||
|         case NetworkManager.DeviceState.DISCONNECTED: | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Off").format(this._getDescription()); | ||||
|             return _("Off"); | ||||
|         case NetworkManager.DeviceState.ACTIVATED: | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Connected").format(this._getDescription()); | ||||
|             return _("Connected"); | ||||
|         case NetworkManager.DeviceState.UNMANAGED: | ||||
|             /* Translators: this is for network devices that are physically present but are not | ||||
|                under NetworkManager's control (and thus cannot be used in the menu); | ||||
|                %s is a network identifier */ | ||||
|             return _("%s Unmanaged").format(this._getDescription()); | ||||
|                under NetworkManager's control (and thus cannot be used in the menu) */ | ||||
|             return _("Unmanaged"); | ||||
|         case NetworkManager.DeviceState.DEACTIVATING: | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Disconnecting").format(this._getDescription()); | ||||
|             return _("Disconnecting"); | ||||
|         case NetworkManager.DeviceState.PREPARE: | ||||
|         case NetworkManager.DeviceState.CONFIG: | ||||
|         case NetworkManager.DeviceState.IP_CONFIG: | ||||
|         case NetworkManager.DeviceState.IP_CHECK: | ||||
|         case NetworkManager.DeviceState.SECONDARIES: | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Connecting").format(this._getDescription()); | ||||
|             return _("Connecting"); | ||||
|         case NetworkManager.DeviceState.NEED_AUTH: | ||||
|             /* Translators: this is for network connections that require some kind of key or password; %s is a network identifier */ | ||||
|             return _("%s Requires Authentication").format(this._getDescription()); | ||||
|             /* Translators: this is for network connections that require some kind of key or password */ | ||||
|             return _("Authentication required"); | ||||
|         case NetworkManager.DeviceState.UNAVAILABLE: | ||||
|             // This state is actually a compound of various states (generically unavailable, | ||||
|             // firmware missing), that are exposed by different properties (whose state may | ||||
|             // or may not updated when we receive state-changed). | ||||
|             if (this._device.firmware_missing) { | ||||
|                 /* Translators: this is for devices that require some kind of firmware or kernel | ||||
|                    module, which is missing; %s is a network identifier */ | ||||
|                 return _("Firmware Missing For %s").format(this._getDescription()); | ||||
|                    module, which is missing */ | ||||
|                 return _("Firmware missing"); | ||||
|             } | ||||
|             /* Translators: this is for a network device that cannot be activated (for example it | ||||
|                is disabled by rfkill, or it has no coverage; %s is a network identifier */ | ||||
|             return _("%s Unavailable").format(this._getDescription()); | ||||
|                is disabled by rfkill, or it has no coverage */ | ||||
|             return _("Unavailable"); | ||||
|         case NetworkManager.DeviceState.FAILED: | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Connection Failed").format(this._getDescription()); | ||||
|             return _("Connection failed"); | ||||
|         default: | ||||
|             log('Device state invalid, is %d'.format(this._device.state)); | ||||
|             return 'invalid'; | ||||
| @@ -584,12 +577,11 @@ const NMDeviceModem = new Lang.Class({ | ||||
|  | ||||
|     _getStatus: function() { | ||||
|         if (!this._client.wwan_hardware_enabled) | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Hardware Disabled").format(this._getDescription()); | ||||
|             return _("Hardware Disabled"); | ||||
|         else if (!this._client.wwan_enabled) | ||||
|             /* Translators: this is for a network device that cannot be activated | ||||
|                because it's disabled by rfkill (airplane mode); %s is a network identifier */ | ||||
|             return _("%s Disabled").format(this._getDescription()); | ||||
|                because it's disabled by rfkill (airplane mode) */ | ||||
|             return _("Disabled"); | ||||
|         else if (this._device.state == NetworkManager.DeviceState.ACTIVATED && | ||||
|                  this._mobileDevice && this._mobileDevice.operator_name) | ||||
|             return this._mobileDevice.operator_name; | ||||
| @@ -877,7 +869,7 @@ const NMWirelessDialog = new Lang.Class({ | ||||
|                                                  y_align: Clutter.ActorAlign.CENTER }); | ||||
|  | ||||
|         let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg'); | ||||
|         this._noNetworksSpinner = new Animation.AnimatedIcon(file, 16, 16); | ||||
|         this._noNetworksSpinner = new Animation.AnimatedIcon(file, 24, 24); | ||||
|         this._noNetworksBox.add_actor(this._noNetworksSpinner.actor); | ||||
|         this._noNetworksBox.add_actor(new St.Label({ style_class: 'no-networks-label', | ||||
|                                                      text: _("No Networks") })); | ||||
| @@ -917,7 +909,10 @@ const NMWirelessDialog = new Lang.Class({ | ||||
|                                                   key: Clutter.Escape }); | ||||
|         this._connectButton = this.addButton({ action: Lang.bind(this, this._connect), | ||||
|                                                label: _("Connect"), | ||||
|                                                key: Clutter.Return }); | ||||
|                                                key: Clutter.Return }, | ||||
|                                              { expand: true, | ||||
|                                                x_fill: false, | ||||
|                                                x_align: St.Align.END }); | ||||
|     }, | ||||
|  | ||||
|     _connect: function() { | ||||
| @@ -1292,23 +1287,18 @@ const NMDeviceWireless = new Lang.Class({ | ||||
|         let ap = this._device.active_access_point; | ||||
|  | ||||
|         if (this._isHotSpotMaster()) | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Hotspot Active").format(this._description); | ||||
|             return _("Hotspot Active"); | ||||
|         else if (this._device.state >= NetworkManager.DeviceState.PREPARE && | ||||
|                  this._device.state < NetworkManager.DeviceState.ACTIVATED) | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Connecting").format(this._description); | ||||
|             return _("Connecting"); | ||||
|         else if (ap) | ||||
|             return ssidToLabel(ap.get_ssid()); | ||||
|         else if (!this._client.wireless_hardware_enabled) | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Hardware Disabled").format(this._description); | ||||
|             return _("Hardware Disabled"); | ||||
|         else if (!this._client.wireless_enabled) | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Off").format(this._description); | ||||
|             return _("Off"); | ||||
|         else if (this._device.state == NetworkManager.DeviceState.DISCONNECTED) | ||||
|             /* Translators: %s is a network identifier */ | ||||
|             return _("%s Not Connected").format(this._description); | ||||
|             return _("Not Connected"); | ||||
|         else | ||||
|             return ''; | ||||
|     }, | ||||
| @@ -1510,7 +1500,7 @@ const NMVPNSection = new Lang.Class({ | ||||
|                 return item.getName(); | ||||
|         } | ||||
|  | ||||
|         return _("VPN Off"); | ||||
|         return _("Off"); | ||||
|     }, | ||||
|  | ||||
|     _getMenuIcon: 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(); | ||||
|     }, | ||||
|   | ||||
| @@ -251,14 +251,8 @@ const Indicator = new Lang.Class({ | ||||
|             let file = Gio.File.new_for_path(iconFile); | ||||
|             let gicon = new Gio.FileIcon({ file: file }); | ||||
|             this._switchUserSubMenu.icon.gicon = gicon; | ||||
|  | ||||
|             this._switchUserSubMenu.icon.add_style_class_name('user-icon'); | ||||
|             this._switchUserSubMenu.icon.remove_style_class_name('default-icon'); | ||||
|         } else { | ||||
|             this._switchUserSubMenu.icon.icon_name = 'avatar-default-symbolic'; | ||||
|  | ||||
|             this._switchUserSubMenu.icon.add_style_class_name('default-icon'); | ||||
|             this._switchUserSubMenu.icon.remove_style_class_name('user-icon'); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
| @@ -350,9 +344,6 @@ const Indicator = new Lang.Class({ | ||||
|         this._switchUserSubMenu.menu.addMenuItem(item); | ||||
|         this._logoutItem = item; | ||||
|  | ||||
|         this._switchUserSubMenu.menu.addSettingsAction(_("Account Settings"), | ||||
|                                                        'gnome-user-accounts-panel.desktop'); | ||||
|  | ||||
|         this._user.connect('notify::is-loaded', Lang.bind(this, this._updateSwitchUserSubMenu)); | ||||
|         this._user.connect('changed', Lang.bind(this, this._updateSwitchUserSubMenu)); | ||||
|  | ||||
|   | ||||
| @@ -465,12 +465,6 @@ const ViewSelector = new Lang.Class({ | ||||
|     }, | ||||
|  | ||||
|     _shouldTriggerSearch: function(symbol) { | ||||
|         if (symbol == Clutter.Multi_key) | ||||
|             return true; | ||||
|  | ||||
|         if (symbol == Clutter.BackSpace && this._searchActive) | ||||
|             return true; | ||||
|  | ||||
|         let unicode = Clutter.keysym_to_unicode(symbol); | ||||
|         if (unicode == 0) | ||||
|             return false; | ||||
| @@ -478,7 +472,7 @@ const ViewSelector = new Lang.Class({ | ||||
|         if (getTermsForSearchString(String.fromCharCode(unicode)).length > 0) | ||||
|             return true; | ||||
|  | ||||
|         return false; | ||||
|         return symbol == Clutter.BackSpace && this._searchActive; | ||||
|     }, | ||||
|  | ||||
|     startSearch: function(event) { | ||||
|   | ||||
| @@ -81,10 +81,12 @@ const DisplayChangeDialog = new Lang.Class({ | ||||
|         */ | ||||
|         this._cancelButton = this.addButton({ label: _("Revert Settings"), | ||||
|                                               action: Lang.bind(this, this._onFailure), | ||||
|                                               key: Clutter.Escape }); | ||||
|                                               key: Clutter.Escape }, | ||||
|                                             { expand: true, x_fill: false, x_align: St.Align.START }); | ||||
|         this._okButton = this.addButton({ label:  _("Keep Changes"), | ||||
|                                           action: Lang.bind(this, this._onSuccess), | ||||
|                                           default: true }); | ||||
|                                           default: true }, | ||||
|                                         { expand: false, x_fill: false, x_align: St.Align.END }); | ||||
|  | ||||
|         this._timeoutId = Mainloop.timeout_add(ONE_SECOND, Lang.bind(this, this._tick)); | ||||
|         GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._tick'); | ||||
| @@ -475,62 +477,6 @@ const TilePreview = new Lang.Class({ | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const TouchpadWorkspaceSwitchAction = new Lang.Class({ | ||||
|     Name: 'TouchpadWorkspaceSwitchAction', | ||||
|  | ||||
|     _init: function(actor) { | ||||
|         this._dx = 0; | ||||
|         this._dy = 0; | ||||
|         actor.connect('captured-event', Lang.bind(this, this._handleEvent)); | ||||
|     }, | ||||
|  | ||||
|     _checkActivated: function() { | ||||
|         const MOTION_THRESHOLD = 50; | ||||
|         let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW; | ||||
|         let dir; | ||||
|  | ||||
|         if ((allowedModes & Main.actionMode) == 0) | ||||
|             return; | ||||
|  | ||||
|         if (this._dy < -MOTION_THRESHOLD) | ||||
|             dir = Meta.MotionDirection.DOWN; | ||||
|         else if (this._dy > MOTION_THRESHOLD) | ||||
|             dir = Meta.MotionDirection.UP; | ||||
|         else if (this._dx < -MOTION_THRESHOLD) | ||||
|             dir = Meta.MotionDirection.RIGHT; | ||||
|         else if (this._dx > MOTION_THRESHOLD) | ||||
|             dir = Meta.MotionDirection.LEFT; | ||||
|         else | ||||
|             return; | ||||
|  | ||||
|         this.emit('activated', dir); | ||||
|     }, | ||||
|  | ||||
|     _handleEvent: function(actor, event) { | ||||
|         if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         if (event.get_gesture_swipe_finger_count() != 4) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) { | ||||
|             let [dx, dy] = event.get_gesture_motion_delta(event); | ||||
|  | ||||
|             this._dx += dx; | ||||
|             this._dy += dy; | ||||
|         } else { | ||||
|             if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END) | ||||
|                 this._checkActivated(); | ||||
|  | ||||
|             this._dx = 0; | ||||
|             this._dy = 0; | ||||
|         } | ||||
|  | ||||
|         return Clutter.EVENT_STOP; | ||||
|     } | ||||
| }); | ||||
| Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype); | ||||
|  | ||||
| const WorkspaceSwitchAction = new Lang.Class({ | ||||
|     Name: 'WorkspaceSwitchAction', | ||||
|     Extends: Clutter.SwipeAction, | ||||
| @@ -676,8 +622,8 @@ const WindowManager = new Lang.Class({ | ||||
|  | ||||
|         this._minimizing = []; | ||||
|         this._unminimizing = []; | ||||
|         this._sizeChanging = []; | ||||
|         this._mapping = []; | ||||
|         this._resizing = []; | ||||
|         this._destroying = []; | ||||
|         this._movingWindow = null; | ||||
|  | ||||
| @@ -691,9 +637,9 @@ const WindowManager = new Lang.Class({ | ||||
|         this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone)); | ||||
|         this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) { | ||||
|             this._minimizeWindowDone(shellwm, actor); | ||||
|             this._sizeChangeWindowDone(shellwm, actor); | ||||
|             this._mapWindowDone(shellwm, actor); | ||||
|             this._destroyWindowDone(shellwm, actor); | ||||
|             this._sizeChangeWindowDone(shellwm, actor); | ||||
|         })); | ||||
|  | ||||
|         this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace)); | ||||
| @@ -922,22 +868,15 @@ const WindowManager = new Lang.Class({ | ||||
|                                                 false, -1, 1); | ||||
|  | ||||
|         let gesture = new WorkspaceSwitchAction(); | ||||
|         gesture.connect('activated', Lang.bind(this, this._actionSwitchWorkspace)); | ||||
|         gesture.connect('activated', Lang.bind(this, function(action, direction) { | ||||
|             let newWs = global.screen.get_active_workspace().get_neighbor(direction); | ||||
|             this.actionMoveWorkspace(newWs); | ||||
|         })); | ||||
|         global.stage.add_action(gesture); | ||||
|  | ||||
|         // This is not a normal Clutter.GestureAction, doesn't need add_action() | ||||
|         gesture = new TouchpadWorkspaceSwitchAction(global.stage); | ||||
|         gesture.connect('activated', Lang.bind(this, this._actionSwitchWorkspace)); | ||||
|  | ||||
|         gesture = new AppSwitchAction(); | ||||
|         gesture.connect('activated', Lang.bind(this, this._switchApp)); | ||||
|         global.stage.add_action(gesture); | ||||
|  | ||||
|     }, | ||||
|  | ||||
|     _actionSwitchWorkspace: function(action, direction) { | ||||
|             let newWs = global.screen.get_active_workspace().get_neighbor(direction); | ||||
|             this.actionMoveWorkspace(newWs); | ||||
|     }, | ||||
|  | ||||
|     _lookupIndex: function (windows, metaWindow) { | ||||
| @@ -1226,112 +1165,55 @@ const WindowManager = new Lang.Class({ | ||||
|             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); | ||||
|     }, | ||||
|         this._sizeChanging.push(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); | ||||
|         // The actor is in its old, "frozen" state. The borders that we have here | ||||
|         // are the difference between the frame and buffer rects. Offset the target | ||||
|         // with the same difference so it lines up nicely. | ||||
|         targetRect.x += oldBufferRect.x - oldFrameRect.x; | ||||
|         targetRect.y += oldBufferRect.y - oldFrameRect.y; | ||||
|  | ||||
|         // 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); | ||||
|         let frameX2 = oldFrameRect.x + oldFrameRect.width; | ||||
|         let bufferX2 = oldBufferRect.x + oldBufferRect.width; | ||||
|         targetRect.width += bufferX2 - frameX2; | ||||
|  | ||||
|         actor.__fullscreenClone = actorClone; | ||||
|         let frameY2 = oldFrameRect.y + oldFrameRect.width; | ||||
|         let bufferY2 = oldBufferRect.y + oldBufferRect.width; | ||||
|         targetRect.width += bufferY2 - frameY2; | ||||
|  | ||||
|         let scaleX = targetRect.width / oldFrameRect.width; | ||||
|         let scaleY = targetRect.height / oldFrameRect.height; | ||||
|         let scaleX = targetRect.width / actor.width; | ||||
|         let scaleY = targetRect.height / actor.height; | ||||
|  | ||||
|         // Now scale and fade out the clone | ||||
|         Tweener.addTween(actorClone, | ||||
|         Tweener.addTween(actor, | ||||
|                          { 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] | ||||
|                            onComplete: () => { this._sizeChangeWindowDone(shellwm, actor); }, | ||||
|                            onOverwrite: () => { this._sizeChangeWindowOverwritten(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; | ||||
|         if (!this._removeEffect(this._sizeChanging, actor)) | ||||
|             return; | ||||
|  | ||||
|             let actorClone = actor.__fullscreenClone; | ||||
|             if (actorClone) { | ||||
|                 actorClone.destroy(); | ||||
|                 delete actor.__fullscreenClone; | ||||
|             } | ||||
|         } | ||||
|         Tweener.removeTweens(actor); | ||||
|  | ||||
|         actor.scale_x = 1; | ||||
|         actor.scale_y = 1; | ||||
|  | ||||
|         shellwm.completed_size_change(actor); | ||||
|     }, | ||||
|  | ||||
|     _sizeChangeWindowOverwritten: function(shellwm, actor) { | ||||
|         if (this._removeEffect(this._resizing, actor)) { | ||||
|             let actorClone = actor.__fullscreenClone; | ||||
|             if (actorClone) { | ||||
|                 actorClone.destroy(); | ||||
|                 delete actor.__fullscreenClone; | ||||
|             } | ||||
|         } | ||||
|         if (!this._removeEffect(this._sizeChanging, actor)) | ||||
|             return; | ||||
|  | ||||
|         shellwm.completed_size_change(actor); | ||||
|     }, | ||||
|  | ||||
|     _hasAttachedDialogs: function(window, ignoreWindow) { | ||||
|   | ||||
| @@ -74,7 +74,7 @@ const WindowMenu = new Lang.Class({ | ||||
|                 window.make_above(); | ||||
|         })); | ||||
|         if (window.is_above()) | ||||
|             item.setOrnament(PopupMenu.Ornament.CHECK); | ||||
|             item.setOrnament(PopupMenu.Ornament.DOT); | ||||
|         if (window.get_maximized() == Meta.MaximizeFlags.BOTH || | ||||
|             type == Meta.WindowType.DOCK || | ||||
|             type == Meta.WindowType.DESKTOP || | ||||
| @@ -93,7 +93,7 @@ const WindowMenu = new Lang.Class({ | ||||
|                     window.stick(); | ||||
|             })); | ||||
|             if (isSticky) | ||||
|                 item.setOrnament(PopupMenu.Ornament.CHECK); | ||||
|                 item.setOrnament(PopupMenu.Ornament.DOT); | ||||
|             if (window.is_always_on_all_workspaces()) | ||||
|                 item.setSensitive(false); | ||||
|  | ||||
| @@ -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; | ||||
|   | ||||
| @@ -80,8 +80,6 @@ const WindowClone = new Lang.Class({ | ||||
|  | ||||
|         this.actor.connect('button-release-event', | ||||
|                            Lang.bind(this, this._onButtonRelease)); | ||||
|         this.actor.connect('touch-event', | ||||
|                            Lang.bind(this, this._onTouchEvent)); | ||||
|  | ||||
|         this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); | ||||
|  | ||||
| @@ -202,15 +200,6 @@ const WindowClone = new Lang.Class({ | ||||
|         return Clutter.EVENT_STOP; | ||||
|     }, | ||||
|  | ||||
|     _onTouchEvent : function (actor, event) { | ||||
|         if (event.type() != Clutter.EventType.TOUCH_END || | ||||
|             !global.display.is_pointer_emulating_sequence(event.get_event_sequence())) | ||||
|             return Clutter.EVENT_PROPAGATE; | ||||
|  | ||||
|         this.emit('selected', event.get_time()); | ||||
|         return Clutter.EVENT_STOP; | ||||
|     }, | ||||
|  | ||||
|     _onDragBegin : function (draggable, time) { | ||||
|         this.inDrag = true; | ||||
|         this.emit('drag-begin'); | ||||
| @@ -653,7 +642,6 @@ const ThumbnailsBox = new Lang.Class({ | ||||
|  | ||||
|         this.actor.connect('button-press-event', function() { return Clutter.EVENT_STOP; }); | ||||
|         this.actor.connect('button-release-event', Lang.bind(this, this._onButtonRelease)); | ||||
|         this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent)); | ||||
|  | ||||
|         Main.overview.connect('showing', | ||||
|                               Lang.bind(this, this._createThumbnails)); | ||||
| @@ -684,31 +672,18 @@ const ThumbnailsBox = new Lang.Class({ | ||||
|                 global.screen.n_workspaces > 1; | ||||
|     }, | ||||
|  | ||||
|     _activateThumbnailAtPoint: function (stageX, stageY, time) { | ||||
|     _onButtonRelease: function(actor, event) { | ||||
|         let [stageX, stageY] = event.get_coords(); | ||||
|         let [r, x, y] = this.actor.transform_stage_point(stageX, stageY); | ||||
|  | ||||
|         for (let i = 0; i < this._thumbnails.length; i++) { | ||||
|             let thumbnail = this._thumbnails[i] | ||||
|             let [w, h] = thumbnail.actor.get_transformed_size(); | ||||
|             if (y >= thumbnail.actor.y && y <= thumbnail.actor.y + h) { | ||||
|                 thumbnail.activate(time); | ||||
|                 thumbnail.activate(event.get_time()); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     _onButtonRelease: function(actor, event) { | ||||
|         let [stageX, stageY] = event.get_coords(); | ||||
|         this._activateThumbnailAtPoint(stageX, stageY, event.get_time()); | ||||
|         return Clutter.EVENT_STOP; | ||||
|     }, | ||||
|  | ||||
|     _onTouchEvent: function (actor, event) { | ||||
|         if (event.type() == Clutter.EventType.TOUCH_END && | ||||
|             global.display.is_pointer_emulating_sequence(event.get_event_sequence())) { | ||||
|             let [stageX, stageY] = event.get_coords(); | ||||
|             this._activateThumbnailAtPoint(stageX, stageY, event.get_time()); | ||||
|         } | ||||
|  | ||||
|         return Clutter.EVENT_STOP; | ||||
|     }, | ||||
|   | ||||
| @@ -421,7 +421,7 @@ const WorkspacesDisplay = new Lang.Class({ | ||||
|             // Only switch to the workspace when there's no application | ||||
|             // windows open. The problem is that it's too easy to miss | ||||
|             // an app window and get the wrong one focused. | ||||
|             if ((action.get_button() == 1 || action.get_button() == 0) && | ||||
|             if (action.get_button() == 1 && | ||||
|                 this._getPrimaryView().getActiveWorkspace().isEmpty()) | ||||
|                 Main.overview.hide(); | ||||
|         })); | ||||
|   | ||||
| @@ -140,7 +140,7 @@ | ||||
|  | ||||
|                 <para> | ||||
|                         <filename>/usr/share/gnome-session/sessions/gnome.session</filename>, | ||||
|                         <filename>/usr/share/applications/org.gnome.Shell.desktop</filename>.</para> | ||||
|                         <filename>/usr/share/applications/gnome-shell.desktop</filename>.</para> | ||||
|         </refsect1> | ||||
|  | ||||
|         <refsect1> | ||||
|   | ||||
| @@ -24,7 +24,6 @@ fi | ||||
| fr | ||||
| fur | ||||
| ga | ||||
| gd | ||||
| gl | ||||
| gu | ||||
| he | ||||
|   | ||||
| @@ -2,8 +2,9 @@ | ||||
| # Please keep this file sorted alphabetically. | ||||
| [encoding: UTF-8] | ||||
| data/50-gnome-shell-system.xml.in | ||||
| data/gnome-shell.desktop.in.in | ||||
| data/gnome-shell-extension-prefs.desktop.in.in | ||||
| data/org.gnome.Shell.desktop.in.in | ||||
| data/gnome-shell-wayland.desktop.in.in | ||||
| data/org.gnome.shell.gschema.xml.in.in | ||||
| data/org.gnome.Shell.PortalHelper.desktop.in | ||||
| js/extensionPrefs/main.js | ||||
|   | ||||
							
								
								
									
										297
									
								
								po/an.po
									
									
									
									
									
								
							
							
						
						
									
										297
									
								
								po/an.po
									
									
									
									
									
								
							| @@ -9,23 +9,24 @@ msgstr "" | ||||
| "Project-Id-Version: gnome-shell master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" | ||||
| "shell&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-07-23 08:08+0000\n" | ||||
| "PO-Revision-Date: 2015-04-28 08:40+0200\n" | ||||
| "Last-Translator: Daniel <entaltoaragon@gmail.com>\n" | ||||
| "POT-Creation-Date: 2015-03-17 12:39+0000\n" | ||||
| "PO-Revision-Date: 2015-03-17 19:50+0100\n" | ||||
| "Last-Translator: Daniel Martinez <entaltoaragon@gmail.com>\n" | ||||
| "Language-Team: Aragonés <softaragones@googlegroups.com>\n" | ||||
| "Language: an\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: Pootle 2.5.1.1\n" | ||||
| "X-POOTLE-MTIME: 1430206804.000000\n" | ||||
| "X-Generator: Gtranslator 2.91.6\n" | ||||
|  | ||||
| #: ../data/50-gnome-shell-system.xml.in.h:1 | ||||
| msgid "System" | ||||
| msgstr "Sistema" | ||||
|  | ||||
| #: ../data/50-gnome-shell-system.xml.in.h:2 | ||||
| #| msgid "%d new notification" | ||||
| #| msgid_plural "%d new notifications" | ||||
| msgid "Show the notification list" | ||||
| msgstr "Amostrar a lista de notificacions" | ||||
|  | ||||
| @@ -135,18 +136,17 @@ msgstr "Indiz de l'anvista seleccionada actual en o selector d'aplicacion." | ||||
| msgid "History for command (Alt-F2) dialog" | ||||
| msgstr "Historico d'o dialogo de comandos (Alt+F2)" | ||||
|  | ||||
| #. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:13 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:12 | ||||
| msgid "History for the looking glass dialog" | ||||
| msgstr "Historico d'o dialogo de \"looking glass\"" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:14 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:13 | ||||
| msgid "Always show the 'Log out' menu item in the user menu." | ||||
| msgstr "" | ||||
| "Amostrar siempre l'elemento de menú \"Trancar sesión\" en o menú de " | ||||
| "l'usuario." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:15 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:14 | ||||
| msgid "" | ||||
| "This key overrides the automatic hiding of the 'Log out' menu item in single-" | ||||
| "user, single-session situations." | ||||
| @@ -154,14 +154,14 @@ msgstr "" | ||||
| "Ista clau sobrescribe a ocultación automatica de l'elemento de menú " | ||||
| "\"Trancar sesión\" en situacions d'un solo usuario u d'una sola sesión." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:16 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:15 | ||||
| msgid "" | ||||
| "Whether to remember password for mounting encrypted or remote filesystems" | ||||
| msgstr "" | ||||
| "Indica si se debe recordar a clau ta amontar sistemas de fichers remotos u " | ||||
| "zifraus" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:17 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:16 | ||||
| msgid "" | ||||
| "The shell will request a password when an encrypted device or a remote " | ||||
| "filesystem is mounted. If the password can be saved for future use a " | ||||
| @@ -173,79 +173,81 @@ msgstr "" | ||||
| "s'amostrará a caixeta \"Remerar clau\". Ista clau estableix a valor " | ||||
| "predeterminada d'a caixeta." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:18 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:17 | ||||
| msgid "Show the week date in the calendar" | ||||
| msgstr "Amostrar a calendata d'a semana en o calendario" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:19 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:18 | ||||
| msgid "If true, display the ISO week date in the calendar." | ||||
| msgstr "Si ye cierta, amuestra a calendata de semana ISO en o calandario." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:20 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:19 | ||||
| msgid "Keybinding to open the application menu" | ||||
| msgstr "Asociación de teclas ta ubrir o menú de l'aplicación" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:21 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:20 | ||||
| msgid "Keybinding to open the application menu." | ||||
| msgstr "Asociación de teclas ta ubrir o menú de l'aplicación." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:22 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:21 | ||||
| msgid "Keybinding to open the \"Show Applications\" view" | ||||
| msgstr "Asociación de teclas ta la vista \"Amostrar aplicacions\"" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:23 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:22 | ||||
| msgid "" | ||||
| "Keybinding to open the \"Show Applications\" view of the Activities Overview." | ||||
| msgstr "" | ||||
| "Asociación de teclas ta ubrir la vista \"Amostrar aplicacions\" de la vista " | ||||
| "d'actividatz." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:24 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:23 | ||||
| msgid "Keybinding to open the overview" | ||||
| msgstr "Asociación de teclas ta l'anvista cheneral" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:25 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:24 | ||||
| msgid "Keybinding to open the Activities Overview." | ||||
| msgstr "Asociación de teclas ta ubrir l'anvista d'actividatz" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:26 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:25 | ||||
| #| msgid "Keybinding to toggle the visibility of the message tray" | ||||
| msgid "Keybinding to toggle the visibility of the notification list" | ||||
| msgstr "" | ||||
| "Asociación de teclas ta cambiar a visibilidat d'a lista de notificacions" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:27 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:26 | ||||
| #| msgid "Keybinding to toggle the visibility of the message tray." | ||||
| msgid "Keybinding to toggle the visibility of the notification list." | ||||
| msgstr "" | ||||
| "Asociación de teclas ta cambiar a visibilidat d'a lista de notificacions." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:28 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:27 | ||||
| msgid "Keybinding to focus the active notification" | ||||
| msgstr "Asociación de teclas ta dar o foco a la notificación activa" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:29 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:28 | ||||
| msgid "Keybinding to focus the active notification." | ||||
| msgstr "Asociación de teclas ta dar o foco a la notificación activa." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:30 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:29 | ||||
| msgid "" | ||||
| "Keybinding that pauses and resumes all running tweens, for debugging purposes" | ||||
| msgstr "" | ||||
| "Asociación de teclas que pausan y continan todas as execucions de «tweens», " | ||||
| "ta propositos de depuraci'on" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:31 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:30 | ||||
| msgid "Which keyboard to use" | ||||
| msgstr "Que teclau usar" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:32 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:31 | ||||
| msgid "The type of keyboard to use." | ||||
| msgstr "O tipo de teclau que usar." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:33 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:32 | ||||
| msgid "Limit switcher to current workspace." | ||||
| msgstr "Selector de limite ta l'aria de treballo actual." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:34 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:33 | ||||
| msgid "" | ||||
| "If true, only applications that have windows on the current workspace are " | ||||
| "shown in the switcher. Otherwise, all applications are included." | ||||
| @@ -254,21 +256,21 @@ msgstr "" | ||||
| "finestras en l'aria de treballo actual. D'atra man, s'incluirán todas as " | ||||
| "aplicacions." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:35 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:34 | ||||
| msgid "The application icon mode." | ||||
| msgstr "O modo d'icono de l'aplicación." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:36 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:35 | ||||
| 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'." | ||||
| "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" | ||||
| "only' (shows only the application icon) or 'both'." | ||||
| msgstr "" | ||||
| "Configura cómo s'amuestran as finestras en o selector. Os valore posibles " | ||||
| "son \"thumbnail-only\" (amuestra una miniatura d'a finestra), \"app-icon-" | ||||
| "only\" (solament amuestra l'icono de l'aplicación) u \"both\"." | ||||
| "son \"thumbnail-only\" (amuestra una miniatura d'a finestra), \"app-icon-only" | ||||
| "\" (solament amuestra l'icono de l'aplicación) u \"both\"." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:37 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:36 | ||||
| msgid "" | ||||
| "If true, only windows from the current workspace are shown in the switcher. " | ||||
| "Otherwise, all windows are included." | ||||
| @@ -276,31 +278,31 @@ msgstr "" | ||||
| "Si en ye verdadero, nomás s'amostrarán en o selector finestras de l'aria de " | ||||
| "treballo actual. D'atra man, s'incluirán todas as finestras." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:38 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:37 | ||||
| msgid "Attach modal dialog to the parent window" | ||||
| msgstr "Acoplar un dialogo modal a la finestra pai" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:39 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:38 | ||||
| msgid "" | ||||
| "This key overrides the key in org.gnome.mutter when running GNOME Shell." | ||||
| msgstr "" | ||||
| "Ista clau sobrescribe a clau en org.gnome.mutter en executar GNOME Shell." | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:40 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:39 | ||||
| msgid "Enable edge tiling when dropping windows on screen edges" | ||||
| msgstr "" | ||||
| "Activar o mosaico en os bordes en arrocegar finestras a os bordes d'a " | ||||
| "finestra" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:41 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:40 | ||||
| msgid "Workspaces are managed dynamically" | ||||
| msgstr "As arias de treballo se chestionan dinámicamente" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:42 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:41 | ||||
| msgid "Workspaces only on primary monitor" | ||||
| msgstr "Arias de treballo solament en a pantalla prencipal" | ||||
|  | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:43 | ||||
| #: ../data/org.gnome.shell.gschema.xml.in.in.h:42 | ||||
| msgid "Delay focus changes in mouse mode until the pointer stops moving" | ||||
| msgstr "" | ||||
| "Retardo en cambiar o foco d'o churi dica que o puntero deixa de mover-se" | ||||
| @@ -309,12 +311,12 @@ msgstr "" | ||||
| msgid "Network Login" | ||||
| msgstr "Encetar sesión en o rete" | ||||
|  | ||||
| #: ../js/extensionPrefs/main.js:122 | ||||
| #: ../js/extensionPrefs/main.js:123 | ||||
| #, javascript-format | ||||
| msgid "There was an error loading the preferences dialog for %s:" | ||||
| msgstr "I habió una error en lanzar o diálogo de preferencias ta %s:" | ||||
|  | ||||
| #: ../js/extensionPrefs/main.js:154 | ||||
| #: ../js/extensionPrefs/main.js:155 | ||||
| msgid "GNOME Shell Extensions" | ||||
| msgstr "Extensions de GNOME Shell" | ||||
|  | ||||
| @@ -325,39 +327,39 @@ msgstr "Extensions de GNOME Shell" | ||||
| msgid "Cancel" | ||||
| msgstr "Cancelar" | ||||
|  | ||||
| #: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215 | ||||
| #: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217 | ||||
| msgid "Next" | ||||
| msgstr "Siguient" | ||||
|  | ||||
| #: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403 | ||||
| #: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 | ||||
| #: ../js/ui/unlockDialog.js:59 | ||||
| msgid "Unlock" | ||||
| msgstr "Desbloquiar" | ||||
|  | ||||
| #: ../js/gdm/authPrompt.js:213 | ||||
| #: ../js/gdm/authPrompt.js:215 | ||||
| msgctxt "button" | ||||
| msgid "Sign In" | ||||
| msgstr "Encetar sesión" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:281 | ||||
| #: ../js/gdm/loginDialog.js:280 | ||||
| msgid "Choose Session" | ||||
| msgstr "Esleyir a sesión" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:431 | ||||
| #: ../js/gdm/loginDialog.js:420 | ||||
| msgid "Not listed?" | ||||
| msgstr "No ye en a lista?" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:847 | ||||
| #: ../js/gdm/loginDialog.js:829 | ||||
| #, javascript-format | ||||
| msgid "(e.g., user or %s)" | ||||
| msgstr "(eix., usuario u %s)" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271 | ||||
| #: ../js/gdm/loginDialog.js:834 ../js/ui/components/networkAgent.js:271 | ||||
| #: ../js/ui/components/networkAgent.js:289 | ||||
| msgid "Username: " | ||||
| msgstr "Nombre d'usuario: " | ||||
| msgstr "Nombre d'usuario:" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:1180 | ||||
| #: ../js/gdm/loginDialog.js:1169 | ||||
| msgid "Login Window" | ||||
| msgstr "Finestra d'inicio de sesión" | ||||
|  | ||||
| @@ -450,31 +452,31 @@ msgstr "%d de %B de %Y, %l∶%M %" | ||||
| msgid "Web Authentication Redirect" | ||||
| msgstr "Rendrecera ta autentiación web" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:789 | ||||
| #: ../js/ui/appDisplay.js:792 | ||||
| msgid "Frequently used applications will appear here" | ||||
| msgstr "As aplicaciones usadas freqüentment amaneixerán aquí" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:909 | ||||
| #: ../js/ui/appDisplay.js:912 | ||||
| msgid "Frequent" | ||||
| msgstr "Freqüent" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:916 | ||||
| #: ../js/ui/appDisplay.js:919 | ||||
| msgid "All" | ||||
| msgstr "Todas" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1845 | ||||
| #: ../js/ui/appDisplay.js:1850 | ||||
| msgid "New Window" | ||||
| msgstr "Finestra nueva" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1873 ../js/ui/dash.js:289 | ||||
| #: ../js/ui/appDisplay.js:1878 ../js/ui/dash.js:291 | ||||
| msgid "Remove from Favorites" | ||||
| msgstr "Sacar d'os favoritos" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1879 | ||||
| #: ../js/ui/appDisplay.js:1884 | ||||
| msgid "Add to Favorites" | ||||
| msgstr "Anyadir a os favoritos" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1889 | ||||
| #: ../js/ui/appDisplay.js:1894 | ||||
| msgid "Show Details" | ||||
| msgstr "Amostrar detalles" | ||||
|  | ||||
| @@ -488,19 +490,15 @@ msgstr "S'ha anyadiu %s a os suyos favoritos." | ||||
| msgid "%s has been removed from your favorites." | ||||
| msgstr "S'ha sacau %s d'os suyos favoritos" | ||||
|  | ||||
| #: ../js/ui/backgroundMenu.js:19 | ||||
| msgid "Change Background…" | ||||
| msgstr "Cambiar o fondo…" | ||||
|  | ||||
| #: ../js/ui/backgroundMenu.js:21 | ||||
| msgid "Display Settings" | ||||
| msgstr "Preferencias de pantalla" | ||||
|  | ||||
| #: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650 | ||||
| #: ../js/ui/status/system.js:357 | ||||
| #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650 | ||||
| #: ../js/ui/status/system.js:337 | ||||
| msgid "Settings" | ||||
| msgstr "Configuración" | ||||
|  | ||||
| #: ../js/ui/backgroundMenu.js:21 | ||||
| msgid "Change Background…" | ||||
| msgstr "Cambiar o fondo…" | ||||
|  | ||||
| #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */ | ||||
| #: ../js/ui/calendar.js:53 | ||||
| msgctxt "calendar-no-work" | ||||
| @@ -553,53 +551,54 @@ msgctxt "grid saturday" | ||||
| msgid "S" | ||||
| msgstr "S" | ||||
|  | ||||
| #: ../js/ui/calendar.js:564 | ||||
| #: ../js/ui/calendar.js:563 | ||||
| msgid "Previous month" | ||||
| msgstr "Mes anterior" | ||||
|  | ||||
| #: ../js/ui/calendar.js:574 | ||||
| #: ../js/ui/calendar.js:573 | ||||
| msgid "Next month" | ||||
| msgstr "Mes siguient" | ||||
|  | ||||
| #: ../js/ui/calendar.js:781 | ||||
| #: ../js/ui/calendar.js:780 | ||||
| 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:1187 | ||||
| #: ../js/ui/calendar.js:1182 | ||||
| msgctxt "event list time" | ||||
| msgid "All Day" | ||||
| msgstr "Tot o diya" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1289 | ||||
| #: ../js/ui/calendar.js:1288 | ||||
| msgid "Clear section" | ||||
| msgstr "Limpiar a sección" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1516 | ||||
| #: ../js/ui/calendar.js:1515 | ||||
| msgid "Events" | ||||
| msgstr "Eventos" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1525 | ||||
| #: ../js/ui/calendar.js:1524 | ||||
| msgctxt "calendar heading" | ||||
| msgid "%A, %B %d" | ||||
| msgstr "%A, %d de %B" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1529 | ||||
| #: ../js/ui/calendar.js:1528 | ||||
| msgctxt "calendar heading" | ||||
| msgid "%A, %B %d, %Y" | ||||
| msgstr "%A, %d de %B de %Y" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1614 | ||||
| #: ../js/ui/calendar.js:1613 | ||||
| msgid "Notifications" | ||||
| msgstr "Notificacions" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1765 | ||||
| #: ../js/ui/calendar.js:1764 | ||||
| #| msgid "Notifications" | ||||
| msgid "No Notifications" | ||||
| msgstr "No i hai notificacions" | ||||
|  | ||||
| #: ../js/ui/calendar.js:1768 | ||||
| #: ../js/ui/calendar.js:1767 | ||||
| msgid "No Events" | ||||
| msgstr "No i hai eventos" | ||||
|  | ||||
| @@ -635,23 +634,23 @@ msgstr "Connectar" | ||||
| #: ../js/ui/components/networkAgent.js:293 | ||||
| #: ../js/ui/components/networkAgent.js:303 | ||||
| msgid "Password: " | ||||
| msgstr "Clau de paso: " | ||||
| msgstr "Clau de paso:" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:238 | ||||
| msgid "Key: " | ||||
| msgstr "Clau: " | ||||
| msgstr "Clau:" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:277 | ||||
| msgid "Identity: " | ||||
| msgstr "Identidat: " | ||||
| msgstr "Identidat:" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:279 | ||||
| msgid "Private key password: " | ||||
| msgstr "Clau d'a clau privada: " | ||||
| msgstr "Clau d'a clau privada:" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:291 | ||||
| msgid "Service: " | ||||
| msgstr "Servicio: " | ||||
| msgstr "Servicio:" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:320 | ||||
| #: ../js/ui/components/networkAgent.js:658 | ||||
| @@ -662,8 +661,8 @@ msgstr "O ret sin cordón requiere autenticación" | ||||
| #: ../js/ui/components/networkAgent.js:659 | ||||
| #, javascript-format | ||||
| msgid "" | ||||
| "Passwords or encryption keys are required to access the wireless network “" | ||||
| "%s”." | ||||
| "Passwords or encryption keys are required to access the wireless network " | ||||
| "“%s”." | ||||
| msgstr "" | ||||
| "S'amenesten claus u claus de zifrau ta accedir a o ret inalambrico\"%s\"." | ||||
|  | ||||
| @@ -674,7 +673,7 @@ msgstr "Autenticación 802.1X cableada" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:327 | ||||
| msgid "Network name: " | ||||
| msgstr "Nombre d'o ret: " | ||||
| msgstr "Nombre d'o ret:" | ||||
|  | ||||
| #: ../js/ui/components/networkAgent.js:332 | ||||
| #: ../js/ui/components/networkAgent.js:666 | ||||
| @@ -734,7 +733,7 @@ msgstr "Prebe atra vegada." | ||||
|  | ||||
| #. Translators: this is the other person changing their old IM name to their new | ||||
| #. IM name. */ | ||||
| #: ../js/ui/components/telepathyClient.js:757 | ||||
| #: ../js/ui/components/telepathyClient.js:768 | ||||
| #, javascript-format | ||||
| msgid "%s is now known as %s" | ||||
| msgstr "Agora %s se dice %s" | ||||
| @@ -743,11 +742,11 @@ msgstr "Agora %s se dice %s" | ||||
| msgid "Windows" | ||||
| msgstr "Finestras" | ||||
|  | ||||
| #: ../js/ui/dash.js:250 ../js/ui/dash.js:291 | ||||
| #: ../js/ui/dash.js:252 ../js/ui/dash.js:293 | ||||
| msgid "Show Applications" | ||||
| msgstr "Amostrar aplicacions" | ||||
|  | ||||
| #: ../js/ui/dash.js:449 | ||||
| #: ../js/ui/dash.js:453 | ||||
| msgid "Dash" | ||||
| msgstr "Tablero" | ||||
|  | ||||
| @@ -755,6 +754,7 @@ msgstr "Tablero" | ||||
| #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). | ||||
| #. */ | ||||
| #: ../js/ui/dateMenu.js:73 | ||||
| #| msgid "%A %B %e, %Y" | ||||
| msgid "%B %e %Y" | ||||
| msgstr "%B %e %Y" | ||||
|  | ||||
| @@ -763,6 +763,7 @@ msgstr "%B %e %Y" | ||||
| #. * date, e.g. "Tuesday February 17 2015". | ||||
| #. */ | ||||
| #: ../js/ui/dateMenu.js:80 | ||||
| #| msgid "%A %B %e, %Y" | ||||
| msgid "%A %B %e %Y" | ||||
| msgstr "%A %e de %B de %Y" | ||||
|  | ||||
| @@ -771,6 +772,7 @@ msgid "Add world clocks…" | ||||
| msgstr "Adhibir reloches d'o mundo…" | ||||
|  | ||||
| #: ../js/ui/dateMenu.js:161 | ||||
| #| msgid "Open Clocks" | ||||
| msgid "World Clocks" | ||||
| msgstr "Reloches d'o mundo" | ||||
|  | ||||
| @@ -914,16 +916,17 @@ msgstr "Instalar" | ||||
| msgid "Download and install “%s” from extensions.gnome.org?" | ||||
| msgstr "Descargar y instalar \"%s\" dende extensions.gnome.org?" | ||||
|  | ||||
| #: ../js/ui/keyboard.js:747 ../js/ui/status/keyboard.js:713 | ||||
| #: ../js/ui/keyboard.js:714 ../js/ui/status/keyboard.js:580 | ||||
| msgid "Keyboard" | ||||
| msgstr "Teclau" | ||||
|  | ||||
| #. translators: 'Hide' is a verb */ | ||||
| #: ../js/ui/legacyTray.js:66 | ||||
| #: ../js/ui/legacyTray.js:64 | ||||
| #| msgid "Hide Text" | ||||
| msgid "Hide tray" | ||||
| msgstr "Amagar servilla" | ||||
|  | ||||
| #: ../js/ui/legacyTray.js:107 | ||||
| #: ../js/ui/legacyTray.js:104 | ||||
| msgid "Status Icons" | ||||
| msgstr "Iconos d'estau" | ||||
|  | ||||
| @@ -979,7 +982,7 @@ msgstr "Veyer fuent" | ||||
| msgid "Web Page" | ||||
| msgstr "Pachina web" | ||||
|  | ||||
| #: ../js/ui/messageTray.js:1486 | ||||
| #: ../js/ui/messageTray.js:2133 | ||||
| msgid "System Information" | ||||
| msgstr "Informacion d'o sistema" | ||||
|  | ||||
| @@ -1021,7 +1024,7 @@ msgstr "toggle-switch-intl" | ||||
| msgid "Enter a Command" | ||||
| msgstr "Introducir un comando" | ||||
|  | ||||
| #: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162 | ||||
| #: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120 | ||||
| msgid "Close" | ||||
| msgstr "Trancar" | ||||
|  | ||||
| @@ -1049,27 +1052,27 @@ msgid_plural "%d new notifications" | ||||
| msgstr[0] "%d notificación nueva" | ||||
| msgstr[1] "%d notificacions nuevas" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:365 | ||||
| #: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345 | ||||
| msgid "Lock" | ||||
| msgstr "Blocar" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:684 | ||||
| #: ../js/ui/screenShield.js:668 | ||||
| msgid "GNOME needs to lock the screen" | ||||
| msgstr "GNOME ameneste blocar a pantalla" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271 | ||||
| #: ../js/ui/screenShield.js:795 ../js/ui/screenShield.js:1271 | ||||
| msgid "Unable to lock" | ||||
| msgstr "No se podió blocar" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272 | ||||
| #: ../js/ui/screenShield.js:796 ../js/ui/screenShield.js:1272 | ||||
| msgid "Lock was blocked by an application" | ||||
| msgstr "Una aplicación impidió o bloqueyo" | ||||
|  | ||||
| #: ../js/ui/search.js:617 | ||||
| #: ../js/ui/search.js:616 | ||||
| msgid "Searching…" | ||||
| msgstr "Mirando…" | ||||
|  | ||||
| #: ../js/ui/search.js:619 | ||||
| #: ../js/ui/search.js:618 | ||||
| msgid "No results." | ||||
| msgstr "No se troboron resultaus." | ||||
|  | ||||
| @@ -1133,11 +1136,11 @@ msgstr "Refuso de teclas" | ||||
| msgid "Mouse Keys" | ||||
| msgstr "Teclas d'o ratet" | ||||
|  | ||||
| #: ../js/ui/status/accessibility.js:167 | ||||
| #: ../js/ui/status/accessibility.js:144 | ||||
| msgid "High Contrast" | ||||
| msgstr "Contraste alto" | ||||
|  | ||||
| #: ../js/ui/status/accessibility.js:202 | ||||
| #: ../js/ui/status/accessibility.js:193 | ||||
| msgid "Large Text" | ||||
| msgstr "Texto gran" | ||||
|  | ||||
| @@ -1171,7 +1174,7 @@ msgstr "No connectau" | ||||
| msgid "Brightness" | ||||
| msgstr "Brilo" | ||||
|  | ||||
| #: ../js/ui/status/keyboard.js:736 | ||||
| #: ../js/ui/status/keyboard.js:603 | ||||
| msgid "Show Keyboard Layout" | ||||
| msgstr "Amostrar a distribución d'o teclau" | ||||
|  | ||||
| @@ -1265,7 +1268,7 @@ msgstr "O modo avión ye enchegau" | ||||
|  | ||||
| #: ../js/ui/status/network.js:814 | ||||
| msgid "Wi-Fi is disabled when airplane mode is on." | ||||
| msgstr "O Wi-Fi ye desactivau quan o modo avión ye enchegau." | ||||
| msgstr "O Wi-Fi ye desactivau quan o modo avión  ye enchegau." | ||||
|  | ||||
| #: ../js/ui/status/network.js:815 | ||||
| msgid "Turn Off Airplane Mode" | ||||
| @@ -1382,23 +1385,23 @@ msgstr "Modo avión" | ||||
| msgid "On" | ||||
| msgstr "Enchegau" | ||||
|  | ||||
| #: ../js/ui/status/system.js:337 | ||||
| #: ../js/ui/status/system.js:317 | ||||
| msgid "Switch User" | ||||
| msgstr "Cambear d'usuario" | ||||
|  | ||||
| #: ../js/ui/status/system.js:342 | ||||
| #: ../js/ui/status/system.js:322 | ||||
| msgid "Log Out" | ||||
| msgstr "Trancar sesion" | ||||
|  | ||||
| #: ../js/ui/status/system.js:361 | ||||
| #: ../js/ui/status/system.js:341 | ||||
| msgid "Orientation Lock" | ||||
| msgstr "Bloqueyo d'Orientación" | ||||
|  | ||||
| #: ../js/ui/status/system.js:369 | ||||
| #: ../js/ui/status/system.js:349 | ||||
| msgid "Suspend" | ||||
| msgstr "Suspender" | ||||
|  | ||||
| #: ../js/ui/status/system.js:372 | ||||
| #: ../js/ui/status/system.js:352 | ||||
| msgid "Power Off" | ||||
| msgstr "Amortar" | ||||
|  | ||||
| @@ -1430,27 +1433,27 @@ msgstr "Aplicacions" | ||||
| msgid "Search" | ||||
| msgstr "Mirar" | ||||
|  | ||||
| #: ../js/ui/windowAttentionHandler.js:20 | ||||
| #: ../js/ui/windowAttentionHandler.js:19 | ||||
| #, javascript-format | ||||
| msgid "“%s” is ready" | ||||
| msgstr "\"%s\" ye parau" | ||||
|  | ||||
| #: ../js/ui/windowManager.js:63 | ||||
| #: ../js/ui/windowManager.js:65 | ||||
| msgid "Do you want to keep these display settings?" | ||||
| msgstr "Quiers mantener istas opcions de pantalla?" | ||||
|  | ||||
| #. Translators: this and the following message should be limited in lenght, | ||||
| #. to avoid ellipsizing the labels. | ||||
| #. */ | ||||
| #: ../js/ui/windowManager.js:82 | ||||
| #: ../js/ui/windowManager.js:84 | ||||
| msgid "Revert Settings" | ||||
| msgstr "Revertir as opcions" | ||||
|  | ||||
| #: ../js/ui/windowManager.js:86 | ||||
| #: ../js/ui/windowManager.js:88 | ||||
| msgid "Keep Changes" | ||||
| msgstr "Mantener os cambeos" | ||||
|  | ||||
| #: ../js/ui/windowManager.js:105 | ||||
| #: ../js/ui/windowManager.js:107 | ||||
| #, javascript-format | ||||
| msgid "Settings changes will revert in %d second" | ||||
| msgid_plural "Settings changes will revert in %d seconds" | ||||
| @@ -1459,7 +1462,7 @@ msgstr[1] "Os cambeos d'as opcions serán revertius en %d segundos" | ||||
|  | ||||
| #. Translators: This represents the size of a window. The first number is | ||||
| #. * the width of the window and the second is the height. */ | ||||
| #: ../js/ui/windowManager.js:660 | ||||
| #: ../js/ui/windowManager.js:599 | ||||
| #, javascript-format | ||||
| msgid "%d x %d" | ||||
| msgstr "%d x %d" | ||||
| @@ -1496,48 +1499,14 @@ msgstr "Siempre veyible" | ||||
| msgid "Always on Visible Workspace" | ||||
| msgstr "Siempre en l'aria de treballo veyible" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:105 | ||||
| #, fuzzy | ||||
| #| msgid "Move to Workspace Up" | ||||
| msgid "Move to Workspace Left" | ||||
| msgstr "Mover a l'aria de treballo d'a cucha" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:110 | ||||
| #, fuzzy | ||||
| #| msgid "Move to Workspace Up" | ||||
| msgid "Move to Workspace Right" | ||||
| msgstr "Mover a l'aria de treballo d'a dreita" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:115 | ||||
| #: ../js/ui/windowMenu.js:106 | ||||
| msgid "Move to Workspace Up" | ||||
| msgstr "Mover ta l'aria de treballo d'alto" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:120 | ||||
| #: ../js/ui/windowMenu.js:111 | ||||
| msgid "Move to Workspace Down" | ||||
| msgstr "Mover ta l'aria de treballo d'abaixo" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:136 | ||||
| #, fuzzy | ||||
| #| msgid "Move to Workspace Up" | ||||
| msgid "Move to Monitor Up" | ||||
| msgstr "Mover a la pantalla d'alto" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:142 | ||||
| #, fuzzy | ||||
| #| msgid "Move to Workspace Down" | ||||
| msgid "Move to Monitor Down" | ||||
| msgstr "Mover a la pantalla d'abaixo" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:148 | ||||
| #, fuzzy | ||||
| msgid "Move to Monitor Left" | ||||
| msgstr "Mover a la pantalla d'a cucha" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:154 | ||||
| #, fuzzy | ||||
| msgid "Move to Monitor Right" | ||||
| msgstr "Mover a la pantalla d'a dreita" | ||||
|  | ||||
| #: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 | ||||
| msgid "Evolution Calendar" | ||||
| msgstr "Calandario d'Evolution" | ||||
| @@ -1592,11 +1561,11 @@ msgstr "Desconoxiu" | ||||
| msgid "Failed to launch “%s”" | ||||
| msgstr "Ha fallau en aventar \"%s\"" | ||||
|  | ||||
| #: ../src/shell-keyring-prompt.c:742 | ||||
| #: ../src/shell-keyring-prompt.c:714 | ||||
| msgid "Passwords do not match." | ||||
| msgstr "As claus de paso no coinciden." | ||||
|  | ||||
| #: ../src/shell-keyring-prompt.c:750 | ||||
| #: ../src/shell-keyring-prompt.c:722 | ||||
| msgid "Password cannot be blank" | ||||
| msgstr "A clau de paso no puede estar vueda" | ||||
|  | ||||
| @@ -1834,6 +1803,14 @@ msgstr "L'usuario refusó o dialogo d'autenticación" | ||||
| #~ msgid "The maximum accuracy level of location." | ||||
| #~ msgstr "O maximo libel de precisión d'ubicación." | ||||
|  | ||||
| #~| msgid "" | ||||
| #~| "Configures the maximum level of location accuracy applications are " | ||||
| #~| "allowed to see. Valid options are 'off' (disable location tracking), " | ||||
| #~| "'country', 'city', 'neighborhood', 'street', and 'exact' (typically " | ||||
| #~| "requires GPS receiver). Please keep in mind that this only controls what " | ||||
| #~| "Geoclue will allow applications to see and they can find user's location " | ||||
| #~| "on their own using network resources (albeit with street-level accuracy " | ||||
| #~| "at best)." | ||||
| #~ msgid "" | ||||
| #~ "Configures the maximum level of location accuracy applications are " | ||||
| #~ "allowed to see. Valid options are 'off' (disable location tracking), " | ||||
| @@ -1845,8 +1822,8 @@ msgstr "L'usuario refusó o dialogo d'autenticación" | ||||
| #~ msgstr "" | ||||
| #~ "Configura o ran maximo de precisión d'ubicación que as aplicacions  " | ||||
| #~ "pueden veyer. As opcions validas son 'off' (seguimiento d'ubicación " | ||||
| #~ "desenchegau), 'country', 'city', 'neighborhood', 'street', and 'exact' " | ||||
| #~ "(typicament requier GPS " | ||||
| #~ "desenchegau), 'country', 'city', 'neighborhood', 'street', and " | ||||
| #~ "'exact' (typicament requier GPS " | ||||
|  | ||||
| #~ msgid "Arrangement of buttons on the titlebar" | ||||
| #~ msgstr "Orden d'os botons en a barra de titol" | ||||
| @@ -1991,6 +1968,7 @@ msgstr "L'usuario refusó o dialogo d'autenticación" | ||||
| #~ msgid "Session…" | ||||
| #~ msgstr "Sesión…" | ||||
|  | ||||
| #~| msgid "Power Off" | ||||
| #~ msgid "Power" | ||||
| #~ msgstr "Enerchía" | ||||
|  | ||||
| @@ -2154,9 +2132,11 @@ msgstr "L'usuario refusó o dialogo d'autenticación" | ||||
| #~ msgid "%d%%" | ||||
| #~ msgstr "%d%%" | ||||
|  | ||||
| #~| msgid "AC adapter" | ||||
| #~ msgid "AC Adapter" | ||||
| #~ msgstr "Adaptador de corrient" | ||||
|  | ||||
| #~| msgid "Laptop battery" | ||||
| #~ msgid "Laptop Battery" | ||||
| #~ msgstr "Bateria d'o portatil" | ||||
|  | ||||
| @@ -2169,9 +2149,11 @@ msgstr "L'usuario refusó o dialogo d'autenticación" | ||||
| #~ msgid "PDA" | ||||
| #~ msgstr "PDA" | ||||
|  | ||||
| #~| msgid "Cell phone" | ||||
| #~ msgid "Cell Phone" | ||||
| #~ msgstr "Telefono movil" | ||||
|  | ||||
| #~| msgid "Media player" | ||||
| #~ msgid "Media Player" | ||||
| #~ msgstr "Reproductor multimeya" | ||||
|  | ||||
| @@ -2181,6 +2163,7 @@ msgstr "L'usuario refusó o dialogo d'autenticación" | ||||
| #~ msgid "Computer" | ||||
| #~ msgstr "Equipo" | ||||
|  | ||||
| #~| msgid "Unknown" | ||||
| #~ msgctxt "device" | ||||
| #~ msgid "Unknown" | ||||
| #~ msgstr "Desconoxiu" | ||||
|   | ||||
							
								
								
									
										1025
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
							
						
						
									
										1025
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										86
									
								
								po/sl.po
									
									
									
									
									
								
							
							
						
						
									
										86
									
								
								po/sl.po
									
									
									
									
									
								
							| @@ -9,8 +9,8 @@ msgstr "" | ||||
| "Project-Id-Version: gnome-shell master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" | ||||
| "shell&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-07-08 08:07+0000\n" | ||||
| "PO-Revision-Date: 2015-07-08 15:46+0100\n" | ||||
| "POT-Creation-Date: 2015-05-10 08:30+0000\n" | ||||
| "PO-Revision-Date: 2015-05-10 20:54+0100\n" | ||||
| "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" | ||||
| "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" | ||||
| "Language: sl\n" | ||||
| @@ -340,17 +340,17 @@ msgstr "Izbor seje" | ||||
| msgid "Not listed?" | ||||
| msgstr "Ali je ni na seznamu?" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:847 | ||||
| #: ../js/gdm/loginDialog.js:840 | ||||
| #, javascript-format | ||||
| msgid "(e.g., user or %s)" | ||||
| msgstr "(na primer, uporabnika ali %s)" | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271 | ||||
| #: ../js/gdm/loginDialog.js:845 ../js/ui/components/networkAgent.js:271 | ||||
| #: ../js/ui/components/networkAgent.js:289 | ||||
| msgid "Username: " | ||||
| msgstr "Uporabniško ime: " | ||||
|  | ||||
| #: ../js/gdm/loginDialog.js:1180 | ||||
| #: ../js/gdm/loginDialog.js:1173 | ||||
| msgid "Login Window" | ||||
| msgstr "Prijavno okno" | ||||
|  | ||||
| @@ -443,31 +443,31 @@ msgstr "%B %d %Y, %l∶%M %p" | ||||
| msgid "Web Authentication Redirect" | ||||
| msgstr "Preusmeritev spletnega overjanja" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:789 | ||||
| #: ../js/ui/appDisplay.js:788 | ||||
| msgid "Frequently used applications will appear here" | ||||
| msgstr "Pogosto uporabljeni programi bodo prikazani tu" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:909 | ||||
| #: ../js/ui/appDisplay.js:908 | ||||
| msgid "Frequent" | ||||
| msgstr "Pogosto" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:916 | ||||
| #: ../js/ui/appDisplay.js:915 | ||||
| msgid "All" | ||||
| msgstr "Vse" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1845 | ||||
| #: ../js/ui/appDisplay.js:1844 | ||||
| msgid "New Window" | ||||
| msgstr "Novo okno" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1873 ../js/ui/dash.js:289 | ||||
| #: ../js/ui/appDisplay.js:1872 ../js/ui/dash.js:289 | ||||
| msgid "Remove from Favorites" | ||||
| msgstr "Odstrani iz priljubljenih" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1879 | ||||
| #: ../js/ui/appDisplay.js:1878 | ||||
| msgid "Add to Favorites" | ||||
| msgstr "Dodaj med priljubljene" | ||||
|  | ||||
| #: ../js/ui/appDisplay.js:1889 | ||||
| #: ../js/ui/appDisplay.js:1888 | ||||
| msgid "Show Details" | ||||
| msgstr "Pokaži besedilo" | ||||
|  | ||||
| @@ -490,7 +490,7 @@ msgid "Display Settings" | ||||
| msgstr "Nastavitve zaslona" | ||||
|  | ||||
| #: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650 | ||||
| #: ../js/ui/status/system.js:357 | ||||
| #: ../js/ui/status/system.js:334 | ||||
| msgid "Settings" | ||||
| msgstr "Nastavitve" | ||||
|  | ||||
| @@ -920,7 +920,7 @@ msgstr "Namesti" | ||||
| msgid "Download and install “%s” from extensions.gnome.org?" | ||||
| msgstr "Prejmi in namesti “%s” preko povezave na extensions.gnome.org?" | ||||
|  | ||||
| #: ../js/ui/keyboard.js:747 ../js/ui/status/keyboard.js:713 | ||||
| #: ../js/ui/keyboard.js:718 ../js/ui/status/keyboard.js:713 | ||||
| msgid "Keyboard" | ||||
| msgstr "Tipkovnica" | ||||
|  | ||||
| @@ -985,7 +985,7 @@ msgstr "Poglej vir" | ||||
| msgid "Web Page" | ||||
| msgstr "Spletna stran" | ||||
|  | ||||
| #: ../js/ui/messageTray.js:1486 | ||||
| #: ../js/ui/messageTray.js:1504 | ||||
| msgid "System Information" | ||||
| msgstr "Podrobnosti sistema" | ||||
|  | ||||
| @@ -1027,7 +1027,7 @@ msgstr "toggle-switch-intl" | ||||
| msgid "Enter a Command" | ||||
| msgstr "Vnos ukaza" | ||||
|  | ||||
| #: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162 | ||||
| #: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:153 | ||||
| msgid "Close" | ||||
| msgstr "Zapri" | ||||
|  | ||||
| @@ -1059,19 +1059,19 @@ msgstr[1] "%d novo obvestilo" | ||||
| msgstr[2] "%d novi obvestili" | ||||
| msgstr[3] "%d nova obvestila" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:365 | ||||
| #: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:342 | ||||
| msgid "Lock" | ||||
| msgstr "Zakleni" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:684 | ||||
| #: ../js/ui/screenShield.js:668 | ||||
| msgid "GNOME needs to lock the screen" | ||||
| msgstr "Zakleniti je treba zaslon" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271 | ||||
| #: ../js/ui/screenShield.js:795 ../js/ui/screenShield.js:1271 | ||||
| msgid "Unable to lock" | ||||
| msgstr "Zaklep ni mogoč" | ||||
|  | ||||
| #: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272 | ||||
| #: ../js/ui/screenShield.js:796 ../js/ui/screenShield.js:1272 | ||||
| msgid "Lock was blocked by an application" | ||||
| msgstr "Zaklep je preprečil program" | ||||
|  | ||||
| @@ -1394,23 +1394,23 @@ msgstr "Način letala" | ||||
| msgid "On" | ||||
| msgstr "Povezano" | ||||
|  | ||||
| #: ../js/ui/status/system.js:337 | ||||
| #: ../js/ui/status/system.js:314 | ||||
| msgid "Switch User" | ||||
| msgstr "Preklopi uporabnika" | ||||
|  | ||||
| #: ../js/ui/status/system.js:342 | ||||
| #: ../js/ui/status/system.js:319 | ||||
| msgid "Log Out" | ||||
| msgstr "Odjava" | ||||
|  | ||||
| #: ../js/ui/status/system.js:361 | ||||
| #: ../js/ui/status/system.js:338 | ||||
| msgid "Orientation Lock" | ||||
| msgstr "Zaklep položaja" | ||||
|  | ||||
| #: ../js/ui/status/system.js:369 | ||||
| #: ../js/ui/status/system.js:346 | ||||
| msgid "Suspend" | ||||
| msgstr "Zaustavi" | ||||
|  | ||||
| #: ../js/ui/status/system.js:372 | ||||
| #: ../js/ui/status/system.js:349 | ||||
| msgid "Power Off" | ||||
| msgstr "Izklop" | ||||
|  | ||||
| @@ -1442,27 +1442,27 @@ msgstr "Programi" | ||||
| msgid "Search" | ||||
| msgstr "Poišči" | ||||
|  | ||||
| #: ../js/ui/windowAttentionHandler.js:20 | ||||
| #: ../js/ui/windowAttentionHandler.js:19 | ||||
| #, javascript-format | ||||
| msgid "“%s” is ready" | ||||
| msgstr "“%s” storitev je pripravljena" | ||||
|  | ||||
| #: ../js/ui/windowManager.js:63 | ||||
| #: ../js/ui/windowManager.js:65 | ||||
| msgid "Do you want to keep these display settings?" | ||||
| msgstr "Ali želite ohraniti te nastavitve zaslona?" | ||||
|  | ||||
| #. Translators: this and the following message should be limited in lenght, | ||||
| #. to avoid ellipsizing the labels. | ||||
| #. */ | ||||
| #: ../js/ui/windowManager.js:82 | ||||
| #: ../js/ui/windowManager.js:84 | ||||
| msgid "Revert Settings" | ||||
| msgstr "Povrni nastavitve" | ||||
|  | ||||
| #: ../js/ui/windowManager.js:86 | ||||
| #: ../js/ui/windowManager.js:88 | ||||
| msgid "Keep Changes" | ||||
| msgstr "Sledi spremembam" | ||||
|  | ||||
| #: ../js/ui/windowManager.js:105 | ||||
| #: ../js/ui/windowManager.js:107 | ||||
| #, javascript-format | ||||
| msgid "Settings changes will revert in %d second" | ||||
| msgid_plural "Settings changes will revert in %d seconds" | ||||
| @@ -1473,7 +1473,7 @@ msgstr[3] "Spremembe nastavitev bodo povrnjene v %d sekundah." | ||||
|  | ||||
| #. Translators: This represents the size of a window. The first number is | ||||
| #. * the width of the window and the second is the height. */ | ||||
| #: ../js/ui/windowManager.js:604 | ||||
| #: ../js/ui/windowManager.js:613 | ||||
| #, javascript-format | ||||
| msgid "%d x %d" | ||||
| msgstr "%d x %d" | ||||
| @@ -1510,35 +1510,27 @@ msgstr "Vedno na vrhu" | ||||
| msgid "Always on Visible Workspace" | ||||
| msgstr "Vedno na dejavni delovni površini" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:105 | ||||
| msgid "Move to Workspace Left" | ||||
| msgstr "Premakni na delovno površino na levi" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:110 | ||||
| msgid "Move to Workspace Right" | ||||
| msgstr "Premakni na delovno površino na desni" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:115 | ||||
| #: ../js/ui/windowMenu.js:106 | ||||
| msgid "Move to Workspace Up" | ||||
| msgstr "Premakni na zgornjo delovno površino" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:120 | ||||
| #: ../js/ui/windowMenu.js:111 | ||||
| msgid "Move to Workspace Down" | ||||
| msgstr "Premakni na spodnjo delovno površino" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:136 | ||||
| #: ../js/ui/windowMenu.js:127 | ||||
| msgid "Move to Monitor Up" | ||||
| msgstr "\t" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:142 | ||||
| #: ../js/ui/windowMenu.js:133 | ||||
| msgid "Move to Monitor Down" | ||||
| msgstr "Premakni na zaslon spodaj" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:148 | ||||
| #: ../js/ui/windowMenu.js:139 | ||||
| msgid "Move to Monitor Left" | ||||
| msgstr "Premakni na zaslon levo" | ||||
|  | ||||
| #: ../js/ui/windowMenu.js:154 | ||||
| #: ../js/ui/windowMenu.js:145 | ||||
| msgid "Move to Monitor Right" | ||||
| msgstr "Premakni na zaslon desno" | ||||
|  | ||||
| @@ -1598,11 +1590,11 @@ msgstr "Neznano" | ||||
| msgid "Failed to launch “%s”" | ||||
| msgstr "Zaganjanje “%s” je spodletelo" | ||||
|  | ||||
| #: ../src/shell-keyring-prompt.c:742 | ||||
| #: ../src/shell-keyring-prompt.c:714 | ||||
| msgid "Passwords do not match." | ||||
| msgstr "Gesli se ne skladata." | ||||
|  | ||||
| #: ../src/shell-keyring-prompt.c:750 | ||||
| #: ../src/shell-keyring-prompt.c:722 | ||||
| msgid "Password cannot be blank" | ||||
| msgstr "Geslo ne more biti prazno" | ||||
|  | ||||
|   | ||||
							
								
								
									
										749
									
								
								po/sr@latin.po
									
									
									
									
									
								
							
							
						
						
									
										749
									
								
								po/sr@latin.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										680
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										680
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										548
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										548
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -41,6 +41,8 @@ | ||||
| #define N_(x) x | ||||
| #endif | ||||
|  | ||||
| #define CALENDAR_SOURCES_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CALENDAR_TYPE_SOURCES, CalendarSourcesPrivate)) | ||||
|  | ||||
| typedef struct _ClientData ClientData; | ||||
| typedef struct _CalendarSourceData CalendarSourceData; | ||||
|  | ||||
| @@ -64,14 +66,6 @@ struct _CalendarSourceData | ||||
|   guint            loaded : 1; | ||||
| }; | ||||
|  | ||||
| typedef struct _CalendarSourcesPrivate CalendarSourcesPrivate; | ||||
|  | ||||
| struct _CalendarSources | ||||
| { | ||||
|   GObject                 parent; | ||||
|   CalendarSourcesPrivate *priv; | ||||
| }; | ||||
|  | ||||
| struct _CalendarSourcesPrivate | ||||
| { | ||||
|   ESourceRegistry    *registry; | ||||
| @@ -83,8 +77,8 @@ struct _CalendarSourcesPrivate | ||||
|   CalendarSourceData  task_sources; | ||||
| }; | ||||
|  | ||||
| G_DEFINE_TYPE_WITH_PRIVATE (CalendarSources, calendar_sources, G_TYPE_OBJECT) | ||||
|  | ||||
| static void calendar_sources_class_init (CalendarSourcesClass *klass); | ||||
| static void calendar_sources_init       (CalendarSources      *sources); | ||||
| static void calendar_sources_finalize   (GObject             *object); | ||||
|  | ||||
| static void backend_died_cb (EClient *client, CalendarSourceData *source_data); | ||||
| @@ -114,6 +108,34 @@ client_data_free (ClientData *data) | ||||
|   g_slice_free (ClientData, data); | ||||
| } | ||||
|  | ||||
| GType | ||||
| calendar_sources_get_type (void) | ||||
| { | ||||
|   static GType sources_type = 0; | ||||
|    | ||||
|   if (!sources_type) | ||||
|     { | ||||
|       static const GTypeInfo sources_info = | ||||
|       { | ||||
| 	sizeof (CalendarSourcesClass), | ||||
| 	NULL,		/* base_init */ | ||||
| 	NULL,		/* base_finalize */ | ||||
| 	(GClassInitFunc) calendar_sources_class_init, | ||||
| 	NULL,           /* class_finalize */ | ||||
| 	NULL,		/* class_data */ | ||||
| 	sizeof (CalendarSources), | ||||
| 	0,		/* n_preallocs */ | ||||
| 	(GInstanceInitFunc) calendar_sources_init, | ||||
|       }; | ||||
|        | ||||
|       sources_type = g_type_register_static (G_TYPE_OBJECT, | ||||
| 					     "CalendarSources", | ||||
| 					     &sources_info, 0); | ||||
|     } | ||||
|    | ||||
|   return sources_type; | ||||
| } | ||||
|  | ||||
| static void | ||||
| calendar_sources_class_init (CalendarSourcesClass *klass) | ||||
| { | ||||
| @@ -123,11 +145,14 @@ calendar_sources_class_init (CalendarSourcesClass *klass) | ||||
|  | ||||
|   gobject_class->finalize = calendar_sources_finalize; | ||||
|  | ||||
|   g_type_class_add_private (klass, sizeof (CalendarSourcesPrivate)); | ||||
|  | ||||
|   signals [APPOINTMENT_SOURCES_CHANGED] = | ||||
|     g_signal_new ("appointment-sources-changed", | ||||
| 		  G_TYPE_FROM_CLASS (gobject_class), | ||||
| 		  G_SIGNAL_RUN_LAST, | ||||
| 		  0, | ||||
| 		  G_STRUCT_OFFSET (CalendarSourcesClass, | ||||
| 				   appointment_sources_changed), | ||||
| 		  NULL, | ||||
| 		  NULL, | ||||
|                   NULL, | ||||
| @@ -138,7 +163,8 @@ calendar_sources_class_init (CalendarSourcesClass *klass) | ||||
|     g_signal_new ("task-sources-changed", | ||||
| 		  G_TYPE_FROM_CLASS (gobject_class), | ||||
| 		  G_SIGNAL_RUN_LAST, | ||||
| 		  0, | ||||
| 		  G_STRUCT_OFFSET (CalendarSourcesClass, | ||||
| 				   task_sources_changed), | ||||
| 		  NULL, | ||||
| 		  NULL, | ||||
|                   NULL, | ||||
| @@ -153,7 +179,7 @@ calendar_sources_init (CalendarSources *sources) | ||||
|   GDBusConnection *session_bus; | ||||
|   GVariant *result; | ||||
|  | ||||
|   sources->priv = calendar_sources_get_instance_private (sources); | ||||
|   sources->priv = CALENDAR_SOURCES_GET_PRIVATE (sources); | ||||
|  | ||||
|   /* WORKAROUND: the hardcoded timeout for e_source_registry_new_sync() | ||||
|      (and other library calls that eventually call g_dbus_proxy_new[_sync]()) | ||||
| @@ -175,7 +201,7 @@ calendar_sources_init (CalendarSources *sources) | ||||
|                                         "/", "org.freedesktop.DBus", | ||||
|                                         "StartServiceByName", | ||||
|                                         g_variant_new ("(su)", | ||||
|                                                        "org.gnome.evolution.dataserver.Sources5", | ||||
|                                                        "org.gnome.evolution.dataserver.Sources4", | ||||
|                                                        0), | ||||
|                                         NULL, | ||||
|                                         G_DBUS_CALL_FLAGS_NONE, | ||||
|   | ||||
| @@ -28,10 +28,33 @@ | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| #define CALENDAR_TYPE_SOURCES (calendar_sources_get_type ()) | ||||
| G_DECLARE_FINAL_TYPE (CalendarSources, calendar_sources, | ||||
|                       CALENDAR, SOURCES, GObject) | ||||
| #define CALENDAR_TYPE_SOURCES        (calendar_sources_get_type ()) | ||||
| #define CALENDAR_SOURCES(o)          (G_TYPE_CHECK_INSTANCE_CAST ((o), CALENDAR_TYPE_SOURCES, CalendarSources)) | ||||
| #define CALENDAR_SOURCES_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST ((k), CALENDAR_TYPE_SOURCES, CalendarSourcesClass)) | ||||
| #define CALENDAR_IS_SOURCES(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), CALENDAR_TYPE_SOURCES)) | ||||
| #define CALENDAR_IS_SOURCES_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CALENDAR_TYPE_SOURCES)) | ||||
| #define CALENDAR_SOURCES_GET_CLASS(o)(G_TYPE_INSTANCE_GET_CLASS ((o), CALENDAR_TYPE_SOURCES, CalendarSourcesClass)) | ||||
|  | ||||
| typedef struct _CalendarSources        CalendarSources; | ||||
| typedef struct _CalendarSourcesClass   CalendarSourcesClass; | ||||
| typedef struct _CalendarSourcesPrivate CalendarSourcesPrivate; | ||||
|  | ||||
| struct _CalendarSources | ||||
| { | ||||
|   GObject                 parent; | ||||
|   CalendarSourcesPrivate *priv; | ||||
| }; | ||||
|  | ||||
| struct _CalendarSourcesClass | ||||
| { | ||||
|   GObjectClass    parent_class; | ||||
|  | ||||
|   void         (* appointment_sources_changed) (CalendarSources *sources); | ||||
|   void         (* task_sources_changed)        (CalendarSources *sources); | ||||
| }; | ||||
|  | ||||
|  | ||||
| GType            calendar_sources_get_type                (void) G_GNUC_CONST; | ||||
| CalendarSources *calendar_sources_get                     (void); | ||||
| GList           *calendar_sources_get_appointment_clients (CalendarSources *sources); | ||||
| GList           *calendar_sources_get_task_clients        (CalendarSources *sources); | ||||
|   | ||||
| @@ -45,8 +45,8 @@ static void gnome_shell_plugin_unminimize       (MetaPlugin          *plugin, | ||||
| static void gnome_shell_plugin_size_change      (MetaPlugin          *plugin, | ||||
|                                                  MetaWindowActor     *actor, | ||||
|                                                  MetaSizeChange       which_change, | ||||
|                                                  MetaRectangle       *old_frame_rect, | ||||
|                                                  MetaRectangle       *old_buffer_rect); | ||||
|                                                  MetaRectangle       *old_rect, | ||||
|                                                  MetaRectangle       *new_rect); | ||||
| static void gnome_shell_plugin_map              (MetaPlugin          *plugin, | ||||
|                                                  MetaWindowActor     *actor); | ||||
| static void gnome_shell_plugin_destroy          (MetaPlugin          *plugin, | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user