Compare commits

..

1 Commits

Author SHA1 Message Date
672ca8850a windowManager: add animations for fullscreen and unfullscreen
We use the newly introduced feature from Mutter to hook up our own
fullscreen and unfullscreen animations.
To give the illusion of a transition as smooth as possible, we create a
snapshot of the current contents of the actor before its state is
changed, and crossfade between the two states while the size changes.

https://bugzilla.gnome.org/show_bug.cgi?id=707248
2015-10-12 15:40:30 -04:00
26 changed files with 2416 additions and 3107 deletions

52
NEWS
View File

@ -1,55 +1,3 @@
3.18.3
======
* Fix browser plugin crash in Firefox [Carlos; #737932, #757940]
Contributors:
Carlos Garcia Campos
3.18.2
======
* Fix fullscreen animation glitches [Florian, Cosimo; #756697, #756714]
* Fix window menu being closed immediately in top orientation [Rui; #756605]
* Respect text-scaling factor under wayland [Owen; #756447]
* Fix login screen getting stuck after authentification [Ray; #754814]
* Fix overview being toggled while still animating [Rui; #756925]
* Improve robustness of browser plugin [Carlos; #737932, #757940]
* Misc. bug fixes [Owen, Florian; #756983, #757150, #757779]
Contributors:
Cosimo Cecchi, Carlos Garcia Campos, Rui Matos, Florian Müllner, Ray Strode,
Owen W. Taylor
Translations:
Kjartan Maraas [nb], Khaled Hosny [ar], Sveinn í Felli [is],
Balázs Meskó [hu], Daniel Șerbănescu [ro], Aron Xu [zh_CN],
Anthony Fok [zh_TW]
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 3.18.0
====== ======

View File

@ -3,10 +3,7 @@ mozillalibdir = $(BROWSER_PLUGIN_DIR)
mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la mozillalib_LTLIBRARIES = libgnome-shell-browser-plugin.la
# Browsers can unload and reload the module while browsing, which is not supported by GObject. libgnome_shell_browser_plugin_la_LDFLAGS = -module -avoid-version -no-undefined
# 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_LIBADD = \ libgnome_shell_browser_plugin_la_LIBADD = \
$(BROWSER_PLUGIN_LIBS) $(BROWSER_PLUGIN_LIBS)

View File

@ -43,6 +43,10 @@
#define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation" #define EXTENSION_DISABLE_VERSION_CHECK_KEY "disable-extension-version-validation"
typedef struct {
GDBusProxy *proxy;
} PluginData;
static NPNetscapeFuncs funcs; static NPNetscapeFuncs funcs;
static inline gchar * static inline gchar *
@ -141,6 +145,121 @@ check_origin_and_protocol (NPP instance)
return ret; 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 =================== */ /* =================== scripting interface =================== */
typedef struct { typedef struct {
@ -225,18 +344,45 @@ static NPObject *
plugin_object_allocate (NPP instance, plugin_object_allocate (NPP instance,
NPClass *klass) 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->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 static void
plugin_object_deallocate (NPObject *npobj) 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 static inline gboolean
@ -887,149 +1033,6 @@ init_methods_and_properties (void)
onextension_changed_id = funcs.getstringidentifier ("onchange"); 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 NPError
NPP_GetValue(NPP instance, NPP_GetValue(NPP instance,
NPPVariable variable, NPPVariable variable,
@ -1040,10 +1043,13 @@ NPP_GetValue(NPP instance,
switch (variable) { switch (variable) {
case NPPVpluginScriptableNPObject: case NPPVpluginScriptableNPObject:
g_debug ("creating scriptable object"); g_debug ("creating scriptable object");
if (!instance->pdata) init_methods_and_properties ();
return NPERR_INVALID_INSTANCE_ERROR;
*(NPObject**)value = instance->pdata; *(NPObject**)value = funcs.createobject (instance, &plugin_class);
break;
case NPPVpluginNeedsXEmbed:
*(bool *)value = TRUE;
break; break;
default: default:
@ -1061,11 +1067,3 @@ NPP_SetWindow(NPP instance,
{ {
return NPERR_NO_ERROR; return NPERR_NO_ERROR;
} }
int16_t
NPP_HandleEvent(NPP instance,
void *event)
{
/* Ignore the event */
return FALSE;
}

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.18.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.18.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AX_IS_RELEASE([git-directory]) AX_IS_RELEASE([git-directory])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
@ -77,7 +77,7 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.21.5 CLUTTER_MIN_VERSION=1.21.5
GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4 GOBJECT_INTROSPECTION_MIN_VERSION=1.45.4
GJS_MIN_VERSION=1.39.0 GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.18.1 MUTTER_MIN_VERSION=3.18.0
GTK_MIN_VERSION=3.15.0 GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.45.3 GIO_MIN_VERSION=2.45.3
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3

View File

@ -408,9 +408,9 @@ StScrollBar {
spacing-rows: 15px; spacing-rows: 15px;
spacing-columns: 1em; } spacing-columns: 1em; }
/* Popovers/Menus */ /* Popvers/Menus */
.popup-menu { .popup-menu {
min-width: 15em; } min-width: 200px; }
.popup-menu .popup-sub-menu { .popup-menu .popup-sub-menu {
background-color: black; background-color: black;
box-shadow: inset 0 -1px 0px #0d0d0d; } box-shadow: inset 0 -1px 0px #0d0d0d; }
@ -752,7 +752,7 @@ StScrollBar {
/* Message list */ /* Message list */
.message-list { .message-list {
width: 31.5em; } width: 420px; }
.message-list-sections { .message-list-sections {
spacing: 1.5em; } spacing: 1.5em; }
@ -823,7 +823,8 @@ StScrollBar {
color: transparent; } color: transparent; }
.aggregate-menu { .aggregate-menu {
min-width: 21em; } min-width: 280px;
max-width: 400px; }
.aggregate-menu .popup-menu-icon { .aggregate-menu .popup-menu-icon {
padding: 0 4px; } padding: 0 4px; }

View File

@ -408,9 +408,9 @@ StScrollBar {
spacing-rows: 15px; spacing-rows: 15px;
spacing-columns: 1em; } spacing-columns: 1em; }
/* Popovers/Menus */ /* Popvers/Menus */
.popup-menu { .popup-menu {
min-width: 15em; } min-width: 200px; }
.popup-menu .popup-sub-menu { .popup-menu .popup-sub-menu {
background-color: #343a3a; background-color: #343a3a;
box-shadow: inset 0 -1px 0px #282c2c; } box-shadow: inset 0 -1px 0px #282c2c; }
@ -752,7 +752,7 @@ StScrollBar {
/* Message list */ /* Message list */
.message-list { .message-list {
width: 31.5em; } width: 420px; }
.message-list-sections { .message-list-sections {
spacing: 1.5em; } spacing: 1.5em; }
@ -823,7 +823,8 @@ StScrollBar {
color: transparent; } color: transparent; }
.aggregate-menu { .aggregate-menu {
min-width: 21em; } min-width: 280px;
max-width: 400px; }
.aggregate-menu .popup-menu-icon { .aggregate-menu .popup-menu-icon {
padding: 0 4px; } padding: 0 4px; }

View File

@ -16,34 +16,6 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>. * 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 Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;

View File

@ -924,7 +924,11 @@ const LoginDialog = new Lang.Class({
}, },
onUpdateScope: this, onUpdateScope: this,
onComplete: function() { 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 }); onCompleteScope: this });
}, },

View File

@ -7,7 +7,7 @@ const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const ANIMATED_ICON_UPDATE_TIMEOUT = 16; const ANIMATED_ICON_UPDATE_TIMEOUT = 14;
const Animation = new Lang.Class({ const Animation = new Lang.Class({
Name: 'Animation', Name: 'Animation',
@ -33,7 +33,7 @@ const Animation = new Lang.Class({
if (this._frame == 0) if (this._frame == 0)
this._showFrame(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'); GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
} }

View File

@ -644,14 +644,15 @@ const Dash = new Lang.Class({
let firstIcon = firstButton._delegate.icon; let firstIcon = firstButton._delegate.icon;
let minHeight, natHeight; let minHeight, natHeight;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
// Enforce the current icon size during the size request // Enforce the current icon size during the size request
firstIcon.icon.ensure_style(); firstIcon.setIconSize(this.iconSize);
let [currentWidth, currentHeight] = firstIcon.icon.get_size();
firstIcon.icon.set_size(this.iconSize * scaleFactor, this.iconSize * scaleFactor);
[minHeight, natHeight] = firstButton.get_preferred_height(-1); [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 // Subtract icon padding and box spacing from the available height
availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) + availHeight -= iconChildren.length * (natHeight - this.iconSize * scaleFactor) +
@ -659,10 +660,6 @@ const Dash = new Lang.Class({
let availSize = availHeight / iconChildren.length; let availSize = availHeight / iconChildren.length;
let iconSizes = baseIconSizes.map(function(s) {
return s * scaleFactor;
});
let newIconSize = baseIconSizes[0]; let newIconSize = baseIconSizes[0];
for (let i = 0; i < iconSizes.length; i++) { for (let i = 0; i < iconSizes.length; i++) {
if (iconSizes[i] < availSize) if (iconSizes[i] < availSize)

View File

@ -459,8 +459,7 @@ const ActivitiesButton = new Lang.Class({
if (event.type() == Clutter.EventType.TOUCH_END || if (event.type() == Clutter.EventType.TOUCH_END ||
event.type() == Clutter.EventType.BUTTON_RELEASE) event.type() == Clutter.EventType.BUTTON_RELEASE)
if (Main.overview.shouldToggleByCornerOrButton()) Main.overview.toggle();
Main.overview.toggle();
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, },
@ -468,8 +467,7 @@ const ActivitiesButton = new Lang.Class({
_onKeyRelease: function(actor, event) { _onKeyRelease: function(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) { if (symbol == Clutter.KEY_Return || symbol == Clutter.KEY_space) {
if (Main.overview.shouldToggleByCornerOrButton()) Main.overview.toggle();
Main.overview.toggle();
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, },
@ -654,39 +652,6 @@ 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({ const AggregateMenu = new Lang.Class({
Name: 'AggregateMenu', Name: 'AggregateMenu',
Extends: PanelMenu.Button, Extends: PanelMenu.Button,
@ -695,9 +660,6 @@ const AggregateMenu = new Lang.Class({
this.parent(0.0, C_("System menu in the top bar", "System"), false); this.parent(0.0, C_("System menu in the top bar", "System"), false);
this.menu.actor.add_style_class_name('aggregate-menu'); 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._indicators = new St.BoxLayout({ style_class: 'panel-status-indicators-box' });
this.actor.add_child(this._indicators); this.actor.add_child(this._indicators);
@ -746,11 +708,6 @@ const AggregateMenu = new Lang.Class({
this.menu.addMenuItem(this._rfkill.menu); this.menu.addMenuItem(this._rfkill.menu);
this.menu.addMenuItem(this._power.menu); this.menu.addMenuItem(this._power.menu);
this.menu.addMenuItem(this._system.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);
}, },
}); });

View File

@ -677,7 +677,6 @@ const WindowManager = new Lang.Class({
this._minimizing = []; this._minimizing = [];
this._unminimizing = []; this._unminimizing = [];
this._mapping = []; this._mapping = [];
this._resizing = [];
this._destroying = []; this._destroying = [];
this._movingWindow = null; this._movingWindow = null;
@ -1235,27 +1234,6 @@ const WindowManager = new Lang.Class({
}, },
_fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) { _fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = oldFrameRect.x - monitor.x;
actor.translation_y = oldFrameRect.y - monitor.y;
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let targetRect = actor.meta_window.get_frame_rect();
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
actor.translation_x = -(targetRect.x - monitor.x);
actor.translation_y = -(targetRect.y - monitor.y);
this._fullscreenAnimation(shellwm, actor, oldFrameRect);
},
_fullscreenAnimation: function(shellwm, actor, oldFrameRect) {
this._resizing.push(actor);
// Position a clone of the window on top of the old position,
// while actor updates are frozen.
// Note that the MetaWindow has up to date sizing information for
// the new geometry already.
let targetRect = actor.meta_window.get_frame_rect(); let targetRect = actor.meta_window.get_frame_rect();
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect); let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
let actorClone = new St.Widget({ content: actorContent }); let actorClone = new St.Widget({ content: actorContent });
@ -1269,68 +1247,93 @@ const WindowManager = new Lang.Class({
let scaleX = targetRect.width / oldFrameRect.width; let scaleX = targetRect.width / oldFrameRect.width;
let scaleY = targetRect.height / oldFrameRect.height; let scaleY = targetRect.height / oldFrameRect.height;
// Now scale and fade out the clone
Tweener.addTween(actorClone, Tweener.addTween(actorClone,
{ x: targetRect.x, { x: targetRect.x,
y: targetRect.y, y: targetRect.y,
scale_x: scaleX, scaleX: scaleX,
scale_y: scaleY, scaleY: scaleY,
opacity: 0, opacity: 0,
time: WINDOW_ANIMATION_TIME, 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', transition: 'easeOutQuad',
onComplete: this._sizeChangeWindowDone, onComplete: this._sizeChangeWindowDone,
onCompleteScope: this, onCompleteScope: this,
onCompleteParams: [shellwm, actor], onCompleteParams: [shellwm, actor]
onOverwrite: this._sizeChangeWindowOverwritten, });
onOverwriteScope: this,
onOverwriteParams: [shellwm, actor] actor.translation_x = actor.x;
actor.translation_y = actor.y;
actor.scaleX = 1 / scaleX;
actor.scaleY = 1 / scaleY;
Tweener.addTween(actor,
{ scaleX: 1.0,
scaleY: 1.0,
translation_x: 0,
translation_y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad'
});
shellwm.completed_size_change(actor);
},
_unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
let targetRect = actor.meta_window.get_frame_rect();
let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
let actorClone = new St.Widget({ content: actorContent });
actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
Main.uiGroup.add_actor(actorClone);
actor.__unfullscreenClone = actorClone;
let scaleX = targetRect.width / oldFrameRect.width;
let scaleY = targetRect.height / oldFrameRect.height;
Tweener.addTween(actorClone,
{ x: targetRect.x,
y: targetRect.y,
scaleX: scaleX,
scaleY: scaleY,
opacity: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._sizeChangeWindowDone,
onCompleteScope: this,
onCompleteParams: [shellwm, actor]
});
actor.translation_x = -actor.x;
actor.translation_y = -actor.y;
actor.scaleX = 1 / scaleX;
actor.scaleY = 1 / scaleY;
Tweener.addTween(actor,
{ scaleX: 1.0,
scaleY: 1.0,
translation_x: 0,
translation_y: 0,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad'
}); });
// 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); shellwm.completed_size_change(actor);
}, },
_sizeChangeWindowDone: function(shellwm, actor) { _sizeChangeWindowDone: function(shellwm, actor) {
if (this._removeEffect(this._resizing, actor)) { Tweener.removeTweens(actor);
Tweener.removeTweens(actor);
actor.scale_x = 1.0;
actor.scale_y = 1.0;
actor.translation_x = 0;
actor.translation_y = 0;
let actorClone = actor.__fullscreenClone; let actorClone = actor.__fullscreenClone;
if (actorClone) { if (actorClone) {
actorClone.destroy(); actorClone.destroy();
delete actor.__fullscreenClone; delete actor.__fullscreenClone;
}
} }
},
_sizeChangeWindowOverwritten: function(shellwm, actor) { actorClone = actor.__unfullscreenClone;
if (this._removeEffect(this._resizing, actor)) { if (actorClone) {
let actorClone = actor.__fullscreenClone; actorClone.destroy();
if (actorClone) { delete actor.__unfullscreenClone;
actorClone.destroy();
delete actor.__fullscreenClone;
}
} }
}, },

View File

@ -214,7 +214,7 @@ const WindowMenuManager = new Lang.Class({
menu.close(); 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.set_position(rect.x, rect.y);
this._sourceActor.show(); this._sourceActor.show();

View File

@ -1223,13 +1223,13 @@ msgstr "<غير معروفة>"
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308 #: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s مغلق" msgstr "%s مغلق"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:454 #: ../js/ui/status/network.js:454
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
msgstr "%s مُتصل" msgstr "%s مُتصل"
#. Translators: this is for network devices that are physically present but are not #. 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); #. under NetworkManager's control (and thus cannot be used in the menu);
@ -1237,19 +1237,19 @@ msgstr "%s مُتصل"
#: ../js/ui/status/network.js:459 #: ../js/ui/status/network.js:459
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s غير مُدار" msgstr "%s غير مُدار"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:462
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s يقطع الاتّصال" msgstr "%s يقطع الاتّصال"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "%s يتّصل" msgstr "%s يتّصل"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier
#: ../js/ui/status/network.js:472 #: ../js/ui/status/network.js:472
@ -1269,7 +1269,7 @@ msgstr "برمجيات %s المغروسة (Firmware) غير متاحة"
#: ../js/ui/status/network.js:484 #: ../js/ui/status/network.js:484
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s غير متاح" msgstr "%s غير متاح"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: ../js/ui/status/network.js:487 #: ../js/ui/status/network.js:487
@ -1296,7 +1296,7 @@ msgstr "عتاد %s مُعَطَّل"
#: ../js/ui/status/network.js:592 #: ../js/ui/status/network.js:592
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
msgstr "%s معطّل" msgstr "%s معطّل"
#: ../js/ui/status/network.js:632 #: ../js/ui/status/network.js:632
msgid "Use as Internet connection" msgid "Use as Internet connection"
@ -1364,7 +1364,7 @@ msgstr "نقطة اتصال %s نشطة"
#: ../js/ui/status/network.js:1311 #: ../js/ui/status/network.js:1311
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s غير متّصل" msgstr "%s غير متّصل"
#: ../js/ui/status/network.js:1411 #: ../js/ui/status/network.js:1411
msgid "connecting..." msgid "connecting..."

666
po/eu.po

File diff suppressed because it is too large Load Diff

529
po/hu.po

File diff suppressed because it is too large Load Diff

633
po/is.po

File diff suppressed because it is too large Load Diff

View File

@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.17.x\n" "Project-Id-Version: gnome-shell 3.17.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-16 18:11+0200\n" "POT-Creation-Date: 2015-09-07 19:22+0200\n"
"PO-Revision-Date: 2015-10-16 18:11+0200\n" "PO-Revision-Date: 2015-09-07 19:31+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n" "Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: Norwegian bokmål\n" "Language: Norwegian bokmål\n"
@ -508,7 +508,8 @@ msgstr "Bytt bakgrunn …"
msgid "Display Settings" msgid "Display Settings"
msgstr "Innstillinger for skjerm" msgstr "Innstillinger for skjerm"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366 #: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:366
msgid "Settings" msgid "Settings"
msgstr "Innstillinger" msgstr "Innstillinger"
@ -584,33 +585,33 @@ msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Hele dagen" msgstr "Hele dagen"
#: ../js/ui/calendar.js:1295 #: ../js/ui/calendar.js:1291
msgid "Clear section" msgid "Clear section"
msgstr "Tøm seksjon" msgstr "Tøm seksjon"
#: ../js/ui/calendar.js:1522 #: ../js/ui/calendar.js:1518
msgid "Events" msgid "Events"
msgstr "Hendelser" msgstr "Hendelser"
#: ../js/ui/calendar.js:1531 #: ../js/ui/calendar.js:1527
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A %B %d" msgstr "%A %B %d"
#: ../js/ui/calendar.js:1535 #: ../js/ui/calendar.js:1531
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A %B %d, %Y" msgstr "%A %B %d, %Y"
#: ../js/ui/calendar.js:1620 #: ../js/ui/calendar.js:1616
msgid "Notifications" msgid "Notifications"
msgstr "Varslinger" msgstr "Varslinger"
#: ../js/ui/calendar.js:1771 #: ../js/ui/calendar.js:1767
msgid "No Notifications" msgid "No Notifications"
msgstr "Ingen varslinger" msgstr "Ingen varslinger"
#: ../js/ui/calendar.js:1774 #: ../js/ui/calendar.js:1770
msgid "No Events" msgid "No Events"
msgstr "Ingen hendelser" msgstr "Ingen hendelser"
@ -622,7 +623,7 @@ msgstr "Ekstern stasjon koblet til"
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "Ekstern stasjon koblet fra" msgstr "Ekstern stasjon koblet fra"
#: ../js/ui/components/autorunManager.js:351 #: ../js/ui/components/autorunManager.js:354
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Åpne med %s" msgstr "Åpne med %s"
@ -1011,22 +1012,17 @@ msgstr "Oversikt"
msgid "Type to search…" msgid "Type to search…"
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#: ../js/ui/panel.js:358 #: ../js/ui/panel.js:352
msgid "Quit" msgid "Quit"
msgstr "Avslutt" msgstr "Avslutt"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:414 #: ../js/ui/panel.js:404
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:693 #: ../js/ui/panel.js:754
msgctxt "System menu in the top bar"
msgid "System"
msgstr "System"
#: ../js/ui/panel.js:805
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@ -1566,19 +1562,19 @@ msgstr "Alltid på synlig arbeidsområde"
#: ../js/ui/windowMenu.js:105 #: ../js/ui/windowMenu.js:105
msgid "Move to Workspace Left" msgid "Move to Workspace Left"
msgstr "Flytt til arbeidsområdet til venstre" msgstr " til arbeidsområdet til venstre"
#: ../js/ui/windowMenu.js:110 #: ../js/ui/windowMenu.js:110
msgid "Move to Workspace Right" msgid "Move to Workspace Right"
msgstr "Flytt til arbeidsområdet til høyre" msgstr " til arbeidsområdet til høyre"
#: ../js/ui/windowMenu.js:115 #: ../js/ui/windowMenu.js:115
msgid "Move to Workspace Up" msgid "Move to Workspace Up"
msgstr "Flytt til arbeidsområdet over" msgstr " til arbeidsområdet over"
#: ../js/ui/windowMenu.js:120 #: ../js/ui/windowMenu.js:120
msgid "Move to Workspace Down" msgid "Move to Workspace Down"
msgstr "Flytt til arbeidsområdet under" msgstr " til arbeidsområdet under"
#: ../js/ui/windowMenu.js:136 #: ../js/ui/windowMenu.js:136
msgid "Move to Monitor Up" msgid "Move to Monitor Up"
@ -1622,28 +1618,28 @@ msgstr[1] "%u innganger"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemlyder" msgstr "Systemlyder"
#: ../src/main.c:381 #: ../src/main.c:373
msgid "Print version" msgid "Print version"
msgstr "Vis versjon" msgstr "Vis versjon"
#: ../src/main.c:387 #: ../src/main.c:379
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modus som brukes av GDM for innloggingsskjermen" msgstr "Modus som brukes av GDM for innloggingsskjermen"
#: ../src/main.c:393 #: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm" msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
#: ../src/main.c:399 #: ../src/main.c:391
msgid "List possible modes" msgid "List possible modes"
msgstr "Vis mulige modi" msgstr "Vis mulige modi"
#: ../src/shell-app.c:246 #: ../src/shell-app.c:239
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
#: ../src/shell-app.c:487 #: ../src/shell-app.c:480
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Klarte ikke å starte «%s»" msgstr "Klarte ikke å starte «%s»"

2078
po/ro.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +1,17 @@
# Chinese (Taiwan) translation for gnome-shell. # Chinese (Taiwan) translation for gnome-shell.
# Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER # Copyright (C) 2010 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2010, 2014. # Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>, 2010.
# Wei-Lun Chao <chaoweilun@gmail.com>, 2010. # Wei-Lun Chao <chaoweilun@gmail.com>, 2010.
# Anthony Fok <foka@debian.org>, 2015.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.18\n" "Project-Id-Version: gnome-shell 3.3.90\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-10-16 21:11+0000\n" "POT-Creation-Date: 2015-08-25 13:32+0800\n"
"PO-Revision-Date: 2015-10-17 09:30+0800\n" "PO-Revision-Date: 2015-08-25 13:37+0800\n"
"Last-Translator: Anthony Fok <foka@debian.org>\n" "Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n" "Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
"Language: zh_TW\n" "Language: zh_TW\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -298,7 +297,7 @@ msgid "Cancel"
msgstr "取消" msgstr "取消"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215 #: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
#: ../js/gdm/authPrompt.js:447 #: ../js/gdm/authPrompt.js:435
msgid "Next" msgid "Next"
msgstr "下一個" msgstr "下一個"
@ -316,29 +315,21 @@ msgstr "登入"
msgid "Choose Session" msgid "Choose Session"
msgstr "選擇作業階段" msgstr "選擇作業階段"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:431 #: ../js/gdm/loginDialog.js:431
msgid "Not listed?" msgid "Not listed?"
msgstr "沒有列出來?" msgstr "沒有列出來?"
#. Translators: this message is shown below the username entry field #: ../js/gdm/loginDialog.js:847
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:850
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)" msgstr "(例如: user 或 %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:855 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289 #: ../js/ui/components/networkAgent.js:289
msgid "Username: " msgid "Username: "
msgstr "使用者名稱:" msgstr "使用者名稱:"
#: ../js/gdm/loginDialog.js:1184 #: ../js/gdm/loginDialog.js:1181
msgid "Login Window" msgid "Login Window"
msgstr "登入視窗" msgstr "登入視窗"
@ -346,11 +337,6 @@ msgstr "登入視窗"
msgid "Authentication error" msgid "Authentication error"
msgstr "核對錯誤" msgstr "核對錯誤"
#. We don't show fingerprint messages directly since it's
#. not the main auth service. Instead we use the messages
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:473 #: ../js/gdm/util.js:473
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(或是滑過手指)" msgstr "(或是滑過手指)"
@ -359,8 +345,6 @@ msgstr "(或是滑過手指)"
msgid "Command not found" msgid "Command not found"
msgstr "找不到指令" msgstr "找不到指令"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:152 #: ../js/misc/util.js:152
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "無法分析指令:" msgstr "無法分析指令:"
@ -370,78 +354,70 @@ msgstr "無法分析指令:"
msgid "Execution of “%s” failed:" msgid "Execution of “%s” failed:"
msgstr "執行「%s」失敗" msgstr "執行「%s」失敗"
#. Translators: Time in 24h format #. Translators: Time in 24h format */
#: ../js/misc/util.js:191 #: ../js/misc/util.js:191
msgid "%H%M" msgid "%H%M"
msgstr "%H%M" msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a #. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" #. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/misc/util.js:197 #: ../js/misc/util.js:197
#, no-c-format
msgid "Yesterday, %H%M" msgid "Yesterday, %H%M"
msgstr "昨天 %H:%M" msgstr "昨天 %H:%M"
#. Translators: this is the week day name followed by a time #. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" #. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/misc/util.js:203 #: ../js/misc/util.js:203
#, no-c-format
msgid "%A, %H%M" msgid "%A, %H%M"
msgstr "%A %H%M" msgstr "%A %H%M"
#. Translators: this is the month name and day number #. Translators: this is the month name and day number
#. followed by a time string in 24h format. #. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" #. i.e. "May 25, 14:30" */
#: ../js/misc/util.js:209 #: ../js/misc/util.js:209
#, no-c-format
msgid "%B %d, %H%M" msgid "%B %d, %H%M"
msgstr "%m月%d日 %H%M" msgstr "%m月%d日 %H%M"
#. Translators: this is the month name, day number, year #. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format. #. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" #. i.e. "May 25 2012, 14:30" */
#: ../js/misc/util.js:215 #: ../js/misc/util.js:215
#, no-c-format
msgid "%B %d %Y, %H%M" msgid "%B %d %Y, %H%M"
msgstr "%Y年%m月%d日 %H:%M" msgstr "%Y年%m月%d日 %H:%M"
#. Translators: Time in 12h format #. Translators: Time in 12h format */
#: ../js/misc/util.js:220 #: ../js/misc/util.js:220
msgid "%l%M %p" msgid "%l%M %p"
msgstr "%p %l%M" msgstr "%p %l%M"
#. Translators: this is the word "Yesterday" followed by a #. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" #. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/misc/util.js:226 #: ../js/misc/util.js:226
#, no-c-format
msgid "Yesterday, %l%M %p" msgid "Yesterday, %l%M %p"
msgstr "昨天 %p %l%M" msgstr "昨天 %p %l%M"
#. Translators: this is the week day name followed by a time #. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" #. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/misc/util.js:232 #: ../js/misc/util.js:232
#, no-c-format
msgid "%A, %l%M %p" msgid "%A, %l%M %p"
msgstr "%A%p %l%M" msgstr "%A%p %l%M"
#. Translators: this is the month name and day number #. Translators: this is the month name and day number
#. followed by a time string in 12h format. #. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" #. i.e. "May 25, 2:30 pm" */
#: ../js/misc/util.js:238 #: ../js/misc/util.js:238
#, no-c-format
msgid "%B %d, %l%M %p" msgid "%B %d, %l%M %p"
msgstr "%m月%d日%p %l%M" msgstr "%m月%d日%p %l%M"
#. Translators: this is the month name, day number, year #. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format. #. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm" #. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/misc/util.js:244 #: ../js/misc/util.js:244
#, no-c-format
msgid "%B %d %Y, %l%M %p" msgid "%B %d %Y, %l%M %p"
msgstr "%Y年%m月%d日%p %l%M" msgstr "%Y年%m月%d日%p %l%M"
#. TRANSLATORS: this is the title of the wifi captive portal login #. TRANSLATORS: this is the title of the wifi captive portal login
#. * window, until we know the title of the actual login page #. * window, until we know the title of the actual login page */
#: ../js/portalHelper/main.js:85 #: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect" msgid "Web Authentication Redirect"
msgstr "網頁核對重新導向" msgstr "網頁核對重新導向"
@ -492,11 +468,12 @@ msgstr "改變背景…"
msgid "Display Settings" msgid "Display Settings"
msgstr "顯示設定值" msgstr "顯示設定值"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/status/system.js:366 #: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:366
msgid "Settings" msgid "Settings"
msgstr "設定值" msgstr "設定值"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). #. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
#: ../js/ui/calendar.js:55 #: ../js/ui/calendar.js:55
msgctxt "calendar-no-work" msgctxt "calendar-no-work"
msgid "06" msgid "06"
@ -506,43 +483,43 @@ msgstr "06"
#. * #. *
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #. */
#: ../js/ui/calendar.js:84 #: ../js/ui/calendar.js:84
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "日" msgstr "日"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:86 #: ../js/ui/calendar.js:86
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "一" msgstr "一"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:88 #: ../js/ui/calendar.js:88
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "二" msgstr "二"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:90 #: ../js/ui/calendar.js:90
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "三" msgstr "三"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:92 #: ../js/ui/calendar.js:92
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "四" msgstr "四"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:94 #: ../js/ui/calendar.js:94
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "五" msgstr "五"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:96 #: ../js/ui/calendar.js:96
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
@ -562,39 +539,39 @@ msgstr "%V 週"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #. */
#: ../js/ui/calendar.js:1188 #: ../js/ui/calendar.js:1188
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "整天" msgstr "整天"
#: ../js/ui/calendar.js:1295 #: ../js/ui/calendar.js:1291
msgid "Clear section" msgid "Clear section"
msgstr "清除區段" msgstr "清除區段"
#: ../js/ui/calendar.js:1522 #: ../js/ui/calendar.js:1518
msgid "Events" msgid "Events"
msgstr "行程" msgstr "行程"
#: ../js/ui/calendar.js:1531 #: ../js/ui/calendar.js:1527
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%m月%d日%A" msgstr "%m月%d日%A"
#: ../js/ui/calendar.js:1535 #: ../js/ui/calendar.js:1531
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%Y年%m月%d日%A" msgstr "%Y年%m月%d日%A"
#: ../js/ui/calendar.js:1620 #: ../js/ui/calendar.js:1616
msgid "Notifications" msgid "Notifications"
msgstr "通知" msgstr "通知"
#: ../js/ui/calendar.js:1771 #: ../js/ui/calendar.js:1767
msgid "No Notifications" msgid "No Notifications"
msgstr "沒有通知" msgstr "沒有通知"
#: ../js/ui/calendar.js:1774 #: ../js/ui/calendar.js:1770
msgid "No Events" msgid "No Events"
msgstr "沒有行程" msgstr "沒有行程"
@ -606,7 +583,7 @@ msgstr "外部裝置已連接"
msgid "External drive disconnected" msgid "External drive disconnected"
msgstr "外部裝置已拔除" msgstr "外部裝置已拔除"
#: ../js/ui/components/autorunManager.js:351 #: ../js/ui/components/autorunManager.js:354
#, javascript-format #, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "用 %s 開啟" msgstr "用 %s 開啟"
@ -624,7 +601,6 @@ msgstr "再輸入一次:"
msgid "Connect" msgid "Connect"
msgstr "連線" msgstr "連線"
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:233 #: ../js/ui/components/networkAgent.js:233
#: ../js/ui/components/networkAgent.js:245 #: ../js/ui/components/networkAgent.js:245
#: ../js/ui/components/networkAgent.js:273 #: ../js/ui/components/networkAgent.js:273
@ -633,7 +609,6 @@ msgstr "連線"
msgid "Password: " msgid "Password: "
msgstr "密碼: " msgstr "密碼: "
#. static WEP
#: ../js/ui/components/networkAgent.js:238 #: ../js/ui/components/networkAgent.js:238
msgid "Key: " msgid "Key: "
msgstr "金鑰:" msgstr "金鑰:"
@ -723,13 +698,13 @@ msgstr "核對"
#. Translators: "that didn't work" refers to the fact that the #. Translators: "that didn't work" refers to the fact that the
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance. */
#: ../js/ui/components/polkitAgent.js:301 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:301 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "抱歉,那樣沒有作用。請再試一次。" msgstr "抱歉,那樣沒有作用。請再試一次。"
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name. */
#: ../js/ui/components/telepathyClient.js:759 #: ../js/ui/components/telepathyClient.js:759
#, javascript-format #, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
@ -743,15 +718,13 @@ msgstr "視窗"
msgid "Show Applications" msgid "Show Applications"
msgstr "顯示應用程式" msgstr "顯示應用程式"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/dash.js:449 #: ../js/ui/dash.js:449
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #. */
#: ../js/ui/dateMenu.js:73 #: ../js/ui/dateMenu.js:73
msgid "%B %e %Y" msgid "%B %e %Y"
msgstr "%Y年%m月%e日" msgstr "%Y年%m月%e日"
@ -759,7 +732,7 @@ msgstr "%Y年%m月%e日"
#. Translators: This is the accessible name of the date button shown #. Translators: This is the accessible name of the date button shown
#. * below the time in the shell; it should combine the weekday and the #. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015". #. * date, e.g. "Tuesday February 17 2015".
#. #. */
#: ../js/ui/dateMenu.js:80 #: ../js/ui/dateMenu.js:80
msgid "%A %B %e %Y" msgid "%A %B %e %Y"
msgstr "%Y年%m月%e日%A" msgstr "%Y年%m月%e日%A"
@ -881,13 +854,13 @@ msgstr "部分應用程式忙碌中或有未儲存的工作。"
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "其他使用者已登入。" msgstr "其他使用者已登入。"
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:640 #: ../js/ui/endSessionDialog.js:640
#, javascript-format #, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (遠端)" msgstr "%s (遠端)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:643 #: ../js/ui/endSessionDialog.js:643
#, javascript-format #, javascript-format
msgid "%s (console)" msgid "%s (console)"
@ -906,7 +879,7 @@ msgstr "是否從 extensions.gnome.org 下載並安裝「%s」"
msgid "Keyboard" msgid "Keyboard"
msgstr "鍵盤" msgstr "鍵盤"
#. translators: 'Hide' is a verb #. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:66 #: ../js/ui/legacyTray.js:66
msgid "Hide tray" msgid "Hide tray"
msgstr "隱藏系統匣" msgstr "隱藏系統匣"
@ -919,7 +892,7 @@ msgstr "狀態圖示"
msgid "No extensions installed" msgid "No extensions installed"
msgstr "沒有安裝擴充功能" msgstr "沒有安裝擴充功能"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID. */
#: ../js/ui/lookingGlass.js:697 #: ../js/ui/lookingGlass.js:697
#, javascript-format #, javascript-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
@ -939,7 +912,7 @@ msgstr "已啟用"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1828 #: ../js/ui/lookingGlass.js:719 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "已停用" msgstr "已停用"
@ -978,37 +951,25 @@ msgstr "概覽"
#. Translators: this is the text displayed #. Translators: this is the text displayed
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters. */
#: ../js/ui/overview.js:244 #: ../js/ui/overview.js:244
msgid "Type to search…" msgid "Type to search…"
msgstr "輸入以搜尋…" msgstr "輸入以搜尋…"
#: ../js/ui/panel.js:358 #: ../js/ui/panel.js:352
msgid "Quit" msgid "Quit"
msgstr "結束" msgstr "結束"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:414 #: ../js/ui/panel.js:404
msgid "Activities" msgid "Activities"
msgstr "概覽 " msgstr "概覽 "
#: ../js/ui/panel.js:693 #: ../js/ui/panel.js:754
#, fuzzy
#| msgid "System"
msgctxt "System menu in the top bar"
msgid "System"
msgstr "系統"
#: ../js/ui/panel.js:805
msgid "Top Bar" msgid "Top Bar"
msgstr "頂端列" msgstr "頂端列"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:289 #: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-us" msgstr "toggle-switch-us"
@ -1026,7 +987,7 @@ msgid "Restarting…"
msgstr "重新啟動…" msgstr "重新啟動…"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format */
#: ../js/ui/screenShield.js:85 #: ../js/ui/screenShield.js:85
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%m月%d日%A" msgstr "%m月%d日%A"
@ -1051,13 +1012,6 @@ msgstr "鎖定"
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME 需要鎖定螢幕" msgstr "GNOME 需要鎖定螢幕"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
#. point, but any application using global grabs is broken
#. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271 #: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
msgid "Unable to lock" msgid "Unable to lock"
msgstr "無法鎖定" msgstr "無法鎖定"
@ -1153,7 +1107,7 @@ msgstr "關閉"
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "藍牙設定值" msgstr "藍牙設定值"
#. Translators: this is the number of connected bluetooth devices #. Translators: this is the number of connected bluetooth devices */
#: ../js/ui/status/bluetooth.js:105 #: ../js/ui/status/bluetooth.js:105
#, javascript-format #, javascript-format
msgid "%d Connected" msgid "%d Connected"
@ -1200,13 +1154,13 @@ msgstr "啟用"
msgid "<unknown>" msgid "<unknown>"
msgstr "<不明>" msgstr "<不明>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308 #: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1308
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s 關閉" msgstr "%s 關閉"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:454 #: ../js/ui/status/network.js:454
#, javascript-format #, javascript-format
msgid "%s Connected" msgid "%s Connected"
@ -1214,45 +1168,45 @@ msgstr "%s 已連線"
#. Translators: this is for network devices that are physically present but are not #. 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); #. under NetworkManager's control (and thus cannot be used in the menu);
#. %s is a network identifier #. %s is a network identifier */
#: ../js/ui/status/network.js:459 #: ../js/ui/status/network.js:459
#, javascript-format #, javascript-format
msgid "%s Unmanaged" msgid "%s Unmanaged"
msgstr "%s 未受管理" msgstr "%s 未受管理"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:462
#, javascript-format #, javascript-format
msgid "%s Disconnecting" msgid "%s Disconnecting"
msgstr "%s 正在斷線" msgstr "%s 正在斷線"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1300
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "正連線到 %s" msgstr "正連線到 %s"
#. Translators: this is for network connections that require some kind of key or password; %s is a network identifier #. Translators: this is for network connections that require some kind of key or password; %s is a network identifier */
#: ../js/ui/status/network.js:472 #: ../js/ui/status/network.js:472
#, javascript-format #, javascript-format
msgid "%s Requires Authentication" msgid "%s Requires Authentication"
msgstr "%s 需要核對" msgstr "%s 需要核對"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing; %s is a network identifier #. module, which is missing; %s is a network identifier */
#: ../js/ui/status/network.js:480 #: ../js/ui/status/network.js:480
#, javascript-format #, javascript-format
msgid "Firmware Missing For %s" msgid "Firmware Missing For %s"
msgstr "缺少 %s 韌體" msgstr "缺少 %s 韌體"
#. Translators: this is for a network device that cannot be activated (for example it #. 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 #. is disabled by rfkill, or it has no coverage; %s is a network identifier */
#: ../js/ui/status/network.js:484 #: ../js/ui/status/network.js:484
#, javascript-format #, javascript-format
msgid "%s Unavailable" msgid "%s Unavailable"
msgstr "%s 無法使用" msgstr "%s 無法使用"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:487 #: ../js/ui/status/network.js:487
#, javascript-format #, javascript-format
msgid "%s Connection Failed" msgid "%s Connection Failed"
@ -1266,14 +1220,14 @@ msgstr "有線設定值"
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "行動寬頻設定值" msgstr "行動寬頻設定值"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305 #: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s 硬體已停用" msgstr "%s 硬體已停用"
#. Translators: this is for a network device that cannot be activated #. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode); %s is a network identifier #. because it's disabled by rfkill (airplane mode); %s is a network identifier */
#: ../js/ui/status/network.js:592 #: ../js/ui/status/network.js:592
#, javascript-format #, javascript-format
msgid "%s Disabled" msgid "%s Disabled"
@ -1335,13 +1289,13 @@ msgstr "Wi-Fi 設定值"
msgid "Turn On" msgid "Turn On"
msgstr "開啟" msgstr "開啟"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:1296 #: ../js/ui/status/network.js:1296
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s 熱點有效" msgstr "%s 熱點有效"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier */
#: ../js/ui/status/network.js:1311 #: ../js/ui/status/network.js:1311
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
@ -1351,7 +1305,7 @@ msgstr "%s 未連線"
msgid "connecting..." msgid "connecting..."
msgstr "連線中…" msgstr "連線中…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:1414 #: ../js/ui/status/network.js:1414
msgid "authentication required" msgid "authentication required"
msgstr "要求核對" msgstr "要求核對"
@ -1392,27 +1346,20 @@ msgstr "電源設定值"
msgid "Fully Charged" msgid "Fully Charged"
msgstr "已完全充飽" msgstr "已完全充飽"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78 #: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
msgid "Estimating…" msgid "Estimating…"
msgstr "評估中…" msgstr "評估中…"
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: ../js/ui/status/power.js:86 #: ../js/ui/status/power.js:86
#, javascript-format #, javascript-format
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "剩餘時間 %d%02d (%d%%)" msgstr "剩餘時間 %d%02d (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: ../js/ui/status/power.js:91 #: ../js/ui/status/power.js:91
#, javascript-format #, javascript-format
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "直到充滿還需 %d%02d (%d%%)" msgstr "直到充滿還需 %d%02d (%d%%)"
#. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically
#. changing the menu contents.
#: ../js/ui/status/rfkill.js:88 #: ../js/ui/status/rfkill.js:88
msgid "Airplane Mode On" msgid "Airplane Mode On"
msgstr "飛安模式已開啟" msgstr "飛安模式已開啟"
@ -1480,7 +1427,7 @@ msgstr "您想要保留這些顯示器設定值嗎?"
#. Translators: this and the following message should be limited in lenght, #. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. #. */
#: ../js/ui/windowManager.js:82 #: ../js/ui/windowManager.js:82
msgid "Revert Settings" msgid "Revert Settings"
msgstr "還原設定值" msgstr "還原設定值"
@ -1496,7 +1443,7 @@ msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "設定值的變更會在 %d 秒內還原" msgstr[0] "設定值的變更會在 %d 秒內還原"
#. Translators: This represents the size of a window. The first number is #. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. #. * the width of the window and the second is the height. */
#: ../js/ui/windowManager.js:658 #: ../js/ui/windowManager.js:658
#, javascript-format #, javascript-format
msgid "%d x %d" msgid "%d x %d"
@ -1552,11 +1499,11 @@ msgstr "將工作區下移"
#: ../js/ui/windowMenu.js:136 #: ../js/ui/windowMenu.js:136
msgid "Move to Monitor Up" msgid "Move to Monitor Up"
msgstr "移至螢幕上端" msgstr "將工作區上移"
#: ../js/ui/windowMenu.js:142 #: ../js/ui/windowMenu.js:142
msgid "Move to Monitor Down" msgid "Move to Monitor Down"
msgstr "移至螢幕下端" msgstr "將工作區下移"
#: ../js/ui/windowMenu.js:148 #: ../js/ui/windowMenu.js:148
msgid "Move to Monitor Left" msgid "Move to Monitor Left"
@ -1572,7 +1519,7 @@ msgstr "Evolution 行事曆"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1835 #: ../src/gvc/gvc-mixer-control.c:1837
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
@ -1580,38 +1527,38 @@ msgstr[0] "%u 輸出"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1845 #: ../src/gvc/gvc-mixer-control.c:1847
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u 輸入" msgstr[0] "%u 輸入"
#: ../src/gvc/gvc-mixer-control.c:2371 #: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds" msgid "System Sounds"
msgstr "系統音效" msgstr "系統音效"
#: ../src/main.c:381 #: ../src/main.c:373
msgid "Print version" msgid "Print version"
msgstr "顯示版本" msgstr "顯示版本"
#: ../src/main.c:387 #: ../src/main.c:379
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "GDM 在登入畫面使用的模式" msgstr "GDM 在登入畫面使用的模式"
#: ../src/main.c:393 #: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "使用指定的模式例如「gdm」為登入畫面" msgstr "使用指定的模式例如「gdm」為登入畫面"
#: ../src/main.c:399 #: ../src/main.c:391
msgid "List possible modes" msgid "List possible modes"
msgstr "列出可能的模式" msgstr "列出可能的模式"
#: ../src/shell-app.c:246 #: ../src/shell-app.c:239
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "不明" msgstr "不明"
#: ../src/shell-app.c:487 #: ../src/shell-app.c:480
#, c-format #, c-format
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "無法啟動「%s」" msgstr "無法啟動「%s」"

View File

@ -867,12 +867,7 @@ update_scale_factor (GtkSettings *settings,
{ {
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL); g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
{ g_object_set (clutter_settings_get_default (), "font-dpi", 96 * 1024 * g_value_get_int (&value), NULL);
int xft_dpi;
g_object_get (settings, "gtk-xft-dpi", &xft_dpi, NULL);
g_object_set (clutter_settings_get_default (), "font-dpi", xft_dpi, NULL);
}
} }
/* Make sure clutter and gdk scaling stays disabled */ /* Make sure clutter and gdk scaling stays disabled */

View File

@ -562,24 +562,6 @@ layout_notify (GObject *object,
g_object_notify (self, prop_name); g_object_notify (self, prop_name);
} }
static void
on_layout_manager_notify (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
ClutterActor *actor = CLUTTER_ACTOR (object);
ClutterLayoutManager *layout = clutter_actor_get_layout_manager (actor);
g_warn_if_fail (CLUTTER_IS_BOX_LAYOUT (layout));
if (layout == NULL)
return;
g_signal_connect_swapped (layout, "layout-changed",
G_CALLBACK (clutter_actor_queue_relayout), actor);
g_signal_connect (layout, "notify", G_CALLBACK (layout_notify), object);
}
static void static void
st_box_layout_class_init (StBoxLayoutClass *klass) st_box_layout_class_init (StBoxLayoutClass *klass)
{ {
@ -632,11 +614,14 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
static void static void
st_box_layout_init (StBoxLayout *self) st_box_layout_init (StBoxLayout *self)
{ {
self->priv = BOX_LAYOUT_PRIVATE (self); ClutterLayoutManager *layout;
g_signal_connect (self, "notify::layout-manager", self->priv = BOX_LAYOUT_PRIVATE (self);
G_CALLBACK (on_layout_manager_notify), NULL); layout = clutter_box_layout_new ();
clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), clutter_box_layout_new ()); g_signal_connect_swapped (layout, "layout-changed",
G_CALLBACK (clutter_actor_queue_relayout), self);
g_signal_connect (layout, "notify", G_CALLBACK (layout_notify), self);
clutter_actor_set_layout_manager (CLUTTER_ACTOR (self), layout);
} }
/** /**

View File

@ -211,7 +211,7 @@ calculate_gaussian_kernel (gdouble sigma,
{ {
gdouble *ret, sum; gdouble *ret, sum;
gdouble exp_divisor; gdouble exp_divisor;
int half, i; guint half, i;
g_return_val_if_fail (sigma > 0, NULL); g_return_val_if_fail (sigma > 0, NULL);
@ -223,14 +223,14 @@ calculate_gaussian_kernel (gdouble sigma,
exp_divisor = 2 * sigma * sigma; exp_divisor = 2 * sigma * sigma;
/* n_values of 1D Gauss function */ /* n_values of 1D Gauss function */
for (i = 0; i < (int)n_values; i++) for (i = 0; i < n_values; i++)
{ {
ret[i] = exp (-(i - half) * (i - half) / exp_divisor); ret[i] = exp (-(i - half) * (i - half) / exp_divisor);
sum += ret[i]; sum += ret[i];
} }
/* normalize */ /* normalize */
for (i = 0; i < (int)n_values; i++) for (i = 0; i < n_values; i++)
ret[i] /= sum; ret[i] /= sum;
return ret; return ret;
@ -512,12 +512,7 @@ _st_create_shadow_cairo_pattern (StShadow *shadow_spec,
g_return_val_if_fail (shadow_spec != NULL, NULL); g_return_val_if_fail (shadow_spec != NULL, NULL);
g_return_val_if_fail (src_pattern != NULL, NULL); g_return_val_if_fail (src_pattern != NULL, NULL);
if (cairo_pattern_get_surface (src_pattern, &src_surface) != CAIRO_STATUS_SUCCESS) cairo_pattern_get_surface (src_pattern, &src_surface);
/* The most likely reason we can't get the pattern is that sizing went hairwire
* and the caller tried to create a surface too big for memory, leaving us with
* a pattern in an error state; we return a transparent pattern for the shadow.
*/
return cairo_pattern_create_rgba(1.0, 1.0, 1.0, 0.0);
width_in = cairo_image_surface_get_width (src_surface); width_in = cairo_image_surface_get_width (src_surface);
height_in = cairo_image_surface_get_height (src_surface); height_in = cairo_image_surface_get_height (src_surface);

View File

@ -741,11 +741,7 @@ paint_shadow_pattern_to_cairo_context (StShadow *shadow_spec,
/* Then subtract out the bounds of the surface in the surface /* Then subtract out the bounds of the surface in the surface
* pattern; we transform the context by the inverse of the * pattern; we transform the context by the inverse of the
* pattern matrix to get to surface coordinates */ * pattern matrix to get to surface coordinates */
cairo_pattern_get_surface (pattern, &surface);
if (cairo_pattern_get_surface (pattern, &surface) != CAIRO_STATUS_SUCCESS)
/* Something went wrong previously */
goto no_surface;
width = cairo_image_surface_get_width (surface); width = cairo_image_surface_get_width (surface);
height = cairo_image_surface_get_height (surface); height = cairo_image_surface_get_height (surface);
@ -756,7 +752,6 @@ paint_shadow_pattern_to_cairo_context (StShadow *shadow_spec,
cairo_rectangle (cr, 0, height, width, - height); cairo_rectangle (cr, 0, height, width, - height);
cairo_fill (cr); cairo_fill (cr);
no_surface:
cairo_restore (cr); cairo_restore (cr);
} }
@ -2150,7 +2145,7 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state)
guint border_radius[4]; guint border_radius[4];
int max_borders[4]; int max_borders[4];
int center_radius, corner_id; int center_radius, corner_id;
CoglHandle buffer, offscreen = COGL_INVALID_HANDLE; CoglHandle buffer, offscreen;
/* Get infos from the node */ /* Get infos from the node */
if (state->alloc_width < node->box_shadow_min_width || if (state->alloc_width < node->box_shadow_min_width ||
@ -2191,8 +2186,7 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state)
state->box_shadow_height, state->box_shadow_height,
COGL_TEXTURE_NO_SLICING, COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY); COGL_PIXEL_FORMAT_ANY);
if (buffer != COGL_INVALID_HANDLE) offscreen = cogl_offscreen_new_to_texture (buffer);
offscreen = cogl_offscreen_new_to_texture (buffer);
if (offscreen != COGL_INVALID_HANDLE) if (offscreen != COGL_INVALID_HANDLE)
{ {
@ -2212,9 +2206,7 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state)
state->box_shadow_material = _st_create_shadow_pipeline (st_theme_node_get_box_shadow (node), state->box_shadow_material = _st_create_shadow_pipeline (st_theme_node_get_box_shadow (node),
buffer); buffer);
} }
cogl_handle_unref (buffer);
if (buffer != COGL_INVALID_HANDLE)
cogl_handle_unref (buffer);
} }
static void static void