Compare commits
73 Commits
Author | SHA1 | Date | |
---|---|---|---|
c9f6d5e2a1 | |||
eba2b999ed | |||
cceac0d8fb | |||
14eedf8651 | |||
9c6180afa2 | |||
f1b1dbcb00 | |||
ee23b8dbe0 | |||
c9e00bee08 | |||
9970671bb1 | |||
bb4502dca8 | |||
d77c7a407c | |||
554001c0ed | |||
4d153bc96f | |||
476394809a | |||
b6f3e15037 | |||
46c86e093c | |||
c6350aa557 | |||
4e56af39da | |||
9fff972946 | |||
e30925995f | |||
f0d4260c81 | |||
a7f82745c6 | |||
a6fa6519d5 | |||
a944dca60e | |||
fdc443aebe | |||
7e08e1e0e7 | |||
bd7938e02f | |||
a583f45cc6 | |||
1071ac5d25 | |||
45793d0e47 | |||
ea3866a07a | |||
e41879a5c4 | |||
24dc926660 | |||
932b895127 | |||
9c4ffc4bf3 | |||
1ea2e2bcab | |||
a8b15dd2cf | |||
b1b8147ab8 | |||
39c210abed | |||
4bb2a364d3 | |||
6d3ebdcb5e | |||
e865db57e0 | |||
19ba9a98b8 | |||
4a39af7f98 | |||
c326aad9d7 | |||
dc94f7b9f5 | |||
e5be41b667 | |||
775bd961b6 | |||
3c67d012e7 | |||
2fbd8f063e | |||
f285f2c69f | |||
e375e1a857 | |||
910c95fa9b | |||
b95c0682b0 | |||
9f460a36f6 | |||
41a3f10938 | |||
d850c8599e | |||
ec288d0e68 | |||
0b92cd0772 | |||
c7f5f172dd | |||
84bc445593 | |||
365bfcae12 | |||
47c9243271 | |||
8c67a70db0 | |||
5f4591e24c | |||
37ef0e4bed | |||
7d7b92419f | |||
309d40a92b | |||
02718357da | |||
cfef107114 | |||
b742b1eed2 | |||
d58be565a1 | |||
522ed3c21d |
3
.gitignore
vendored
3
.gitignore
vendored
@ -28,6 +28,8 @@ data/org.gnome.shell.gschema.xml
|
|||||||
data/org.gnome.shell.gschema.valid
|
data/org.gnome.shell.gschema.valid
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.xml
|
data/org.gnome.shell.evolution.calendar.gschema.xml
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.valid
|
data/org.gnome.shell.evolution.calendar.gschema.valid
|
||||||
|
data/org.gnome.Shell.PortalHelper.desktop
|
||||||
|
data/org.gnome.Shell.PortalHelper.service
|
||||||
docs/reference/*/*.args
|
docs/reference/*/*.args
|
||||||
docs/reference/*/*.bak
|
docs/reference/*/*.bak
|
||||||
docs/reference/*/*.hierarchy
|
docs/reference/*/*.hierarchy
|
||||||
@ -80,6 +82,7 @@ src/gnome-shell-extension-tool
|
|||||||
src/gnome-shell-hotplug-sniffer
|
src/gnome-shell-hotplug-sniffer
|
||||||
src/gnome-shell-perf-helper
|
src/gnome-shell-perf-helper
|
||||||
src/gnome-shell-perf-tool
|
src/gnome-shell-perf-tool
|
||||||
|
src/gnome-shell-portal-helper
|
||||||
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
||||||
src/run-js-test
|
src/run-js-test
|
||||||
src/test-recorder
|
src/test-recorder
|
||||||
|
25
NEWS
25
NEWS
@ -1,3 +1,28 @@
|
|||||||
|
3.13.4
|
||||||
|
======
|
||||||
|
* Handle portal login requests [Giovanni; #704416]
|
||||||
|
* Scale fonts on wayland on hiDPI devices [Adel; #732537]
|
||||||
|
* Fix default ibus candidate index labels [Rui; #702944]
|
||||||
|
* Add gestures for various system actions [Carlos G.]
|
||||||
|
* Add performance test script for the perf.gnome.org [Owen; #732350]
|
||||||
|
* Use new restart framework to improve restart visuals [Owen; #733026]
|
||||||
|
* Improve keynav in app folder popups [Carlos S.; #731477]
|
||||||
|
* Fix truncation of app search results [Carlos S.; #732416]
|
||||||
|
* Automatically update renamed desktop files in favorites [Kalev; #729429]
|
||||||
|
* Misc. bug fixes and cleanups [Giovanni, Yosef, Owen, Bastien, Javier;
|
||||||
|
#729823, #726401, #732301, #732348, #732349, #733498, #733540]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Giovanni Campagna, Adel Gadllah, Carlos Garnacho, Javier Hernández,
|
||||||
|
Kalev Lember, Rui Matos, Florian Müllner, Bastien Nocera, Yosef Or Boczko,
|
||||||
|
Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Yuri Myasoedov [ru], Daniel Mustieles [es], Fran Diéguez [gl],
|
||||||
|
Cheng-Chia Tseng [zh_TW], A S Alam [pa], Benjamin Steinwender [de],
|
||||||
|
Enrico Nicoletto [pt_BR], MarMav [el], Yosef Or Boczko [he],
|
||||||
|
Kjartan Maraas [nb]
|
||||||
|
|
||||||
3.13.3
|
3.13.3
|
||||||
======
|
======
|
||||||
* Don't allow closing windows with attached modals [Florian; #729886]
|
* Don't allow closing windows with attached modals [Florian; #729886]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.13.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.13.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
|
|||||||
CLUTTER_MIN_VERSION=1.15.90
|
CLUTTER_MIN_VERSION=1.15.90
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||||
GJS_MIN_VERSION=1.39.0
|
GJS_MIN_VERSION=1.39.0
|
||||||
MUTTER_MIN_VERSION=3.13.3
|
MUTTER_MIN_VERSION=3.13.4
|
||||||
GTK_MIN_VERSION=3.7.9
|
GTK_MIN_VERSION=3.7.9
|
||||||
GIO_MIN_VERSION=2.37.0
|
GIO_MIN_VERSION=2.37.0
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
|
@ -1,6 +1,24 @@
|
|||||||
|
CLEANFILES =
|
||||||
|
|
||||||
desktopdir=$(datadir)/applications
|
desktopdir=$(datadir)/applications
|
||||||
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.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
|
||||||
|
|
||||||
|
servicedir = $(datadir)/dbus-1/services
|
||||||
|
service_DATA = org.gnome.Shell.PortalHelper.service
|
||||||
|
|
||||||
|
CLEANFILES += \
|
||||||
|
org.gnome.Shell.PortalHelper.service \
|
||||||
|
org.gnome.Shell.PortalHelper.desktop
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
%.service: %.service.in
|
||||||
|
$(AM_V_GEN) sed -e "s|@libexecdir[@]|$(libexecdir)|" \
|
||||||
|
$< > $@ || rm $@
|
||||||
|
|
||||||
# We substitute in bindir so it works as an autostart
|
# We substitute in bindir so it works as an autostart
|
||||||
# file when built in a non-system prefix
|
# file when built in a non-system prefix
|
||||||
%.desktop.in:%.desktop.in.in
|
%.desktop.in:%.desktop.in.in
|
||||||
@ -88,9 +106,11 @@ EXTRA_DIST = \
|
|||||||
$(menu_DATA) \
|
$(menu_DATA) \
|
||||||
$(convert_DATA) \
|
$(convert_DATA) \
|
||||||
$(keys_in_files) \
|
$(keys_in_files) \
|
||||||
|
org.gnome.Shell.PortalHelper.desktop.in \
|
||||||
|
org.gnome.Shell.PortalHelper.service.in \
|
||||||
org.gnome.shell.gschema.xml.in.in
|
org.gnome.shell.gschema.xml.in.in
|
||||||
|
|
||||||
CLEANFILES = \
|
CLEANFILES += \
|
||||||
gnome-shell.desktop.in \
|
gnome-shell.desktop.in \
|
||||||
gnome-shell-wayland.desktop.in \
|
gnome-shell-wayland.desktop.in \
|
||||||
gnome-shell-extension-prefs.in \
|
gnome-shell-extension-prefs.in \
|
||||||
|
9
data/org.gnome.Shell.PortalHelper.desktop.in
Normal file
9
data/org.gnome.Shell.PortalHelper.desktop.in
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
_Name=Captive Portal
|
||||||
|
Type=Application
|
||||||
|
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
||||||
|
DBusActivatable=true
|
||||||
|
NoDisplay=true
|
||||||
|
Icon=network-workgroup
|
||||||
|
StartupNotify=true
|
||||||
|
OnlyShowIn=GNOME;
|
3
data/org.gnome.Shell.PortalHelper.service.in
Normal file
3
data/org.gnome.Shell.PortalHelper.service.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[D-BUS Service]
|
||||||
|
Name=org.gnome.Shell.PortalHelper
|
||||||
|
Exec=@libexecdir@/gnome-shell-portal-helper
|
@ -45,7 +45,7 @@ stage {
|
|||||||
/* small bold */
|
/* small bold */
|
||||||
.dash-label,
|
.dash-label,
|
||||||
.window-caption,
|
.window-caption,
|
||||||
.switcher-list,
|
.switcher-list,
|
||||||
.app-well-app > .overview-icon,
|
.app-well-app > .overview-icon,
|
||||||
.show-apps > .overview-icon,
|
.show-apps > .overview-icon,
|
||||||
.grid-search-result .overview-icon {
|
.grid-search-result .overview-icon {
|
||||||
@ -2092,6 +2092,11 @@ StScrollBar StButton#vhandle:active {
|
|||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restart message */
|
||||||
|
.restart-message {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
|
||||||
/* ShellMountOperation Dialogs */
|
/* ShellMountOperation Dialogs */
|
||||||
.shell-mount-operation-icon {
|
.shell-mount-operation-icon {
|
||||||
icon-size: 48px;
|
icon-size: 48px;
|
||||||
|
@ -13,7 +13,7 @@ misc/config.js: misc/config.js.in Makefile
|
|||||||
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
||||||
$< > $@
|
$< > $@
|
||||||
|
|
||||||
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
||||||
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
||||||
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||||
|
@ -54,15 +54,17 @@ const Application = new Lang.Class({
|
|||||||
this._startupUuid = null;
|
this._startupUuid = null;
|
||||||
this._loaded = false;
|
this._loaded = false;
|
||||||
this._skipMainWindow = false;
|
this._skipMainWindow = false;
|
||||||
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||||
},
|
},
|
||||||
|
|
||||||
_extensionAvailable: function(uuid) {
|
_extensionAvailable: function(uuid) {
|
||||||
let extension = ExtensionUtils.extensions[uuid];
|
let extension = ExtensionUtils.extensions[uuid];
|
||||||
|
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
||||||
|
|
||||||
if (!extension)
|
if (!extension)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (ExtensionUtils.isOutOfDate(extension))
|
if (checkVersion && ExtensionUtils.isOutOfDate(extension))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
||||||
|
@ -25,6 +25,9 @@
|
|||||||
<file>misc/util.js</file>
|
<file>misc/util.js</file>
|
||||||
|
|
||||||
<file>perf/core.js</file>
|
<file>perf/core.js</file>
|
||||||
|
<file>perf/hwtest.js</file>
|
||||||
|
|
||||||
|
<file>portalHelper/main.js</file>
|
||||||
|
|
||||||
<file>ui/altTab.js</file>
|
<file>ui/altTab.js</file>
|
||||||
<file>ui/animation.js</file>
|
<file>ui/animation.js</file>
|
||||||
|
@ -72,6 +72,9 @@ function run() {
|
|||||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
||||||
|
|
||||||
|
// Enable recording of timestamps for different points in the frame cycle
|
||||||
|
global.frame_timestamps = true;
|
||||||
|
|
||||||
Main.overview.connect('shown', function() {
|
Main.overview.connect('shown', function() {
|
||||||
Scripting.scriptEvent('overviewShowDone');
|
Scripting.scriptEvent('overviewShowDone');
|
||||||
});
|
});
|
||||||
@ -87,7 +90,10 @@ function run() {
|
|||||||
yield Scripting.destroyTestWindows();
|
yield Scripting.destroyTestWindows();
|
||||||
|
|
||||||
for (let k = 0; k < config.count; k++)
|
for (let k = 0; k < config.count; k++)
|
||||||
yield Scripting.createTestWindow(config.width, config.height, config.alpha, config.maximized);
|
yield Scripting.createTestWindow({ width: config.width,
|
||||||
|
height: config.height,
|
||||||
|
alpha: config.alpha,
|
||||||
|
maximized: config.maximized });
|
||||||
|
|
||||||
yield Scripting.waitTestWindows();
|
yield Scripting.waitTestWindows();
|
||||||
yield Scripting.sleep(1000);
|
yield Scripting.sleep(1000);
|
||||||
|
308
js/perf/hwtest.js
Normal file
308
js/perf/hwtest.js
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const Gtk = imports.gi.Gtk;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Scripting = imports.ui.scripting;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
|
let METRICS = {
|
||||||
|
timeToDesktop:
|
||||||
|
{ description: "Time from starting graphical.target to desktop showing",
|
||||||
|
units: "us" },
|
||||||
|
|
||||||
|
overviewShowTime:
|
||||||
|
{ description: "Time to switch to overview view, first time",
|
||||||
|
units: "us" },
|
||||||
|
|
||||||
|
applicationsShowTime:
|
||||||
|
{ description: "Time to switch to applications view, first time",
|
||||||
|
units: "us" },
|
||||||
|
|
||||||
|
mainViewRedrawTime:
|
||||||
|
{ description: "Time to redraw the main view, full screen",
|
||||||
|
units: "us" },
|
||||||
|
|
||||||
|
overviewRedrawTime:
|
||||||
|
{ description: "Time to redraw the overview, full screen, 5 windows",
|
||||||
|
units: "us" },
|
||||||
|
|
||||||
|
applicationRedrawTime:
|
||||||
|
{ description: "Time to redraw frame with a maximized application update",
|
||||||
|
units: "us" },
|
||||||
|
|
||||||
|
geditStartTime:
|
||||||
|
{ description: "Time from gedit launch to window drawn",
|
||||||
|
units: "us" },
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitAndDraw(milliseconds) {
|
||||||
|
let cb;
|
||||||
|
|
||||||
|
let timeline = new Clutter.Timeline({ duration: milliseconds });
|
||||||
|
timeline.start();
|
||||||
|
|
||||||
|
timeline.connect('new-frame',
|
||||||
|
function(timeline, frame) {
|
||||||
|
global.stage.queue_redraw();
|
||||||
|
});
|
||||||
|
|
||||||
|
timeline.connect('completed',
|
||||||
|
function() {
|
||||||
|
timeline.stop();
|
||||||
|
if (cb)
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
return function(callback) {
|
||||||
|
cb = callback;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function waitSignal(object, signal) {
|
||||||
|
let cb;
|
||||||
|
|
||||||
|
let id = object.connect(signal, function() {
|
||||||
|
object.disconnect(id);
|
||||||
|
if (cb)
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
|
||||||
|
return function(callback) {
|
||||||
|
cb = callback;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractBootTimestamp() {
|
||||||
|
let sp = Gio.Subprocess.new(['journalctl', '-b',
|
||||||
|
'MESSAGE_ID=7d4958e842da4a758f6c1cdc7b36dcc5',
|
||||||
|
'UNIT=graphical.target',
|
||||||
|
'-o',
|
||||||
|
'json'],
|
||||||
|
Gio.SubprocessFlags.STDOUT_PIPE);
|
||||||
|
let result = null;
|
||||||
|
|
||||||
|
let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe());
|
||||||
|
while (true) {
|
||||||
|
let [line, length] = datastream.read_line_utf8(null);
|
||||||
|
if (line === null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
let fields = JSON.parse(line);
|
||||||
|
result = Number(fields['__MONOTONIC_TIMESTAMP']);
|
||||||
|
}
|
||||||
|
datastream.close(null);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function run() {
|
||||||
|
Scripting.defineScriptEvent("desktopShown", "Finished initial animation");
|
||||||
|
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
||||||
|
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
||||||
|
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||||
|
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
||||||
|
Scripting.defineScriptEvent("mainViewDrawStart", "Drawing main view");
|
||||||
|
Scripting.defineScriptEvent("mainViewDrawDone", "Ending timing main view drawing");
|
||||||
|
Scripting.defineScriptEvent("overviewDrawStart", "Drawing overview");
|
||||||
|
Scripting.defineScriptEvent("overviewDrawDone", "Ending timing overview drawing");
|
||||||
|
Scripting.defineScriptEvent("redrawTestStart", "Drawing application window");
|
||||||
|
Scripting.defineScriptEvent("redrawTestDone", "Ending timing application window drawing");
|
||||||
|
Scripting.defineScriptEvent("collectTimings", "Accumulate frame timings from redraw tests");
|
||||||
|
Scripting.defineScriptEvent("geditLaunch", "gedit application launch");
|
||||||
|
Scripting.defineScriptEvent("geditFirstFrame", "first frame of gedit window drawn");
|
||||||
|
|
||||||
|
yield Scripting.waitLeisure();
|
||||||
|
Scripting.scriptEvent('desktopShown');
|
||||||
|
|
||||||
|
Gtk.Settings.get_default().gtk_enable_animations = false;
|
||||||
|
|
||||||
|
Scripting.scriptEvent('overviewShowStart');
|
||||||
|
Main.overview.show();
|
||||||
|
yield Scripting.waitLeisure();
|
||||||
|
Scripting.scriptEvent('overviewShowDone');
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
Scripting.scriptEvent('applicationsShowStart');
|
||||||
|
Main.overview._dash.showAppsButton.checked = true;
|
||||||
|
|
||||||
|
yield Scripting.waitLeisure();
|
||||||
|
Scripting.scriptEvent('applicationsShowDone');
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
Main.overview.hide();
|
||||||
|
yield Scripting.waitLeisure();
|
||||||
|
|
||||||
|
////////////////////////////////////////
|
||||||
|
// Tests of redraw speed
|
||||||
|
////////////////////////////////////////
|
||||||
|
|
||||||
|
global.frame_timestamps = true;
|
||||||
|
global.frame_finish_timestamp = true;
|
||||||
|
|
||||||
|
for (let k = 0; k < 5; k++)
|
||||||
|
yield Scripting.createTestWindow(640, 480,
|
||||||
|
{ maximized: true });
|
||||||
|
yield Scripting.waitTestWindows();
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
Scripting.scriptEvent('mainViewDrawStart');
|
||||||
|
yield waitAndDraw(1000);
|
||||||
|
Scripting.scriptEvent('mainViewDrawDone');
|
||||||
|
|
||||||
|
Main.overview.show();
|
||||||
|
Scripting.waitLeisure();
|
||||||
|
|
||||||
|
yield Scripting.sleep(1500);
|
||||||
|
|
||||||
|
Scripting.scriptEvent('overviewDrawStart');
|
||||||
|
yield waitAndDraw(1000);
|
||||||
|
Scripting.scriptEvent('overviewDrawDone');
|
||||||
|
|
||||||
|
yield Scripting.destroyTestWindows();
|
||||||
|
Main.overview.hide();
|
||||||
|
|
||||||
|
yield Scripting.createTestWindow(640, 480,
|
||||||
|
{ maximized: true,
|
||||||
|
redraws: true});
|
||||||
|
yield Scripting.waitTestWindows();
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
Scripting.scriptEvent('redrawTestStart');
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
Scripting.scriptEvent('redrawTestDone');
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
Scripting.scriptEvent('collectTimings');
|
||||||
|
|
||||||
|
yield Scripting.destroyTestWindows();
|
||||||
|
|
||||||
|
global.frame_timestamps = false;
|
||||||
|
global.frame_finish_timestamp = false;
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
////////////////////////////////////////
|
||||||
|
|
||||||
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
let app = appSys.lookup_app('gedit.desktop');
|
||||||
|
|
||||||
|
Scripting.scriptEvent('geditLaunch');
|
||||||
|
app.activate();
|
||||||
|
|
||||||
|
let windows = app.get_windows();
|
||||||
|
if (windows.length > 0)
|
||||||
|
throw new Error('gedit was already running');
|
||||||
|
|
||||||
|
while (windows.length == 0) {
|
||||||
|
yield waitSignal(global.display, 'window-created');
|
||||||
|
windows = app.get_windows();
|
||||||
|
}
|
||||||
|
|
||||||
|
let actor = windows[0].get_compositor_private();
|
||||||
|
yield waitSignal(actor, 'first-frame');
|
||||||
|
Scripting.scriptEvent('geditFirstFrame');
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
windows[0].delete(global.get_current_time());
|
||||||
|
|
||||||
|
yield Scripting.sleep(1000);
|
||||||
|
|
||||||
|
Gtk.Settings.get_default().gtk_enable_animations = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let overviewShowStart;
|
||||||
|
let applicationsShowStart;
|
||||||
|
let stagePaintStart;
|
||||||
|
let redrawTiming;
|
||||||
|
let redrawTimes = {};
|
||||||
|
let geditLaunchTime;
|
||||||
|
|
||||||
|
function script_desktopShown(time) {
|
||||||
|
let bootTimestamp = extractBootTimestamp();
|
||||||
|
METRICS.timeToDesktop.value = time - bootTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_overviewShowStart(time) {
|
||||||
|
overviewShowStart = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_overviewShowDone(time) {
|
||||||
|
METRICS.overviewShowTime.value = time - overviewShowStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_applicationsShowStart(time) {
|
||||||
|
applicationsShowStart = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_applicationsShowDone(time) {
|
||||||
|
METRICS.applicationsShowTime.value = time - applicationsShowStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_mainViewDrawStart(time) {
|
||||||
|
redrawTiming = 'mainView';
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_mainViewDrawDone(time) {
|
||||||
|
redrawTiming = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_overviewDrawStart(time) {
|
||||||
|
redrawTiming = 'overview';
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_overviewDrawDone(time) {
|
||||||
|
redrawTiming = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_redrawTestStart(time) {
|
||||||
|
redrawTiming = 'application';
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_redrawTestDone(time) {
|
||||||
|
redrawTiming = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_collectTimings(time) {
|
||||||
|
for (let timing in redrawTimes) {
|
||||||
|
let times = redrawTimes[timing];
|
||||||
|
times.sort();
|
||||||
|
|
||||||
|
let len = times.length;
|
||||||
|
let median;
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
|
median = -1;
|
||||||
|
else if (len % 2 == 1)
|
||||||
|
median = times[(len - 1)/ 2];
|
||||||
|
else
|
||||||
|
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
||||||
|
|
||||||
|
METRICS[timing + 'RedrawTime'].value = median;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_geditLaunch(time) {
|
||||||
|
geditLaunchTime = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
function script_geditFirstFrame(time) {
|
||||||
|
METRICS.geditStartTime.value = time - geditLaunchTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clutter_stagePaintStart(time) {
|
||||||
|
stagePaintStart = time;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clutter_paintCompletedTimestamp(time) {
|
||||||
|
if (redrawTiming != null && stagePaintStart != null) {
|
||||||
|
if (!(redrawTiming in redrawTimes))
|
||||||
|
redrawTimes[redrawTiming] = [];
|
||||||
|
redrawTimes[redrawTiming].push(time - stagePaintStart);
|
||||||
|
}
|
||||||
|
stagePaintStart = null;
|
||||||
|
}
|
248
js/portalHelper/main.js
Normal file
248
js/portalHelper/main.js
Normal file
@ -0,0 +1,248 @@
|
|||||||
|
const Format = imports.format;
|
||||||
|
const Gettext = imports.gettext;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const GObject = imports.gi.GObject;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
|
const Gtk = imports.gi.Gtk;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Pango = imports.gi.Pango;
|
||||||
|
const Soup = imports.gi.Soup;
|
||||||
|
const WebKit = imports.gi.WebKit2;
|
||||||
|
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
|
const Config = imports.misc.config;
|
||||||
|
|
||||||
|
const PortalHelperResult = {
|
||||||
|
CANCELLED: 0,
|
||||||
|
COMPLETED: 1,
|
||||||
|
RECHECK: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
const INACTIVITY_TIMEOUT = 30000; //ms
|
||||||
|
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
||||||
|
|
||||||
|
const HelperDBusInterface = '<node> \
|
||||||
|
<interface name="org.gnome.Shell.PortalHelper"> \
|
||||||
|
<method name="Authenticate"> \
|
||||||
|
<arg type="o" direction="in" name="connection" /> \
|
||||||
|
<arg type="s" direction="in" name="url" /> \
|
||||||
|
<arg type="u" direction="in" name="timestamp" /> \
|
||||||
|
</method> \
|
||||||
|
<method name="Close"> \
|
||||||
|
<arg type="o" direction="in" name="connection" /> \
|
||||||
|
</method> \
|
||||||
|
<method name="Refresh"> \
|
||||||
|
<arg type="o" direction="in" name="connection" /> \
|
||||||
|
</method> \
|
||||||
|
<signal name="Done"> \
|
||||||
|
<arg type="o" name="connection" /> \
|
||||||
|
<arg type="u" name="result" /> \
|
||||||
|
</signal> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const PortalWindow = new Lang.Class({
|
||||||
|
Name: 'PortalWindow',
|
||||||
|
Extends: Gtk.ApplicationWindow,
|
||||||
|
|
||||||
|
_init: function(application, url, timestamp, doneCallback) {
|
||||||
|
this.parent({ application: application });
|
||||||
|
|
||||||
|
if (url) {
|
||||||
|
this._uri = new Soup.URI(uri);
|
||||||
|
} else {
|
||||||
|
url = 'http://www.gnome.org';
|
||||||
|
this._uri = null;
|
||||||
|
this._everSeenRedirect = false;
|
||||||
|
}
|
||||||
|
this._originalUrl = url;
|
||||||
|
this._doneCallback = doneCallback;
|
||||||
|
this._lastRecheck = 0;
|
||||||
|
this._recheckAtExit = false;
|
||||||
|
|
||||||
|
this._webView = new WebKit.WebView();
|
||||||
|
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
||||||
|
this._webView.load_uri(url);
|
||||||
|
this._webView.connect('notify::title', Lang.bind(this, this._syncTitle));
|
||||||
|
this._syncTitle();
|
||||||
|
|
||||||
|
this.add(this._webView);
|
||||||
|
this._webView.show();
|
||||||
|
this.maximize();
|
||||||
|
this.present_with_time(timestamp);
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncTitle: function() {
|
||||||
|
let title = this._webView.title;
|
||||||
|
|
||||||
|
if (title) {
|
||||||
|
this.title = title;
|
||||||
|
} else {
|
||||||
|
// TRANSLATORS: this is the title of the wifi captive portal login
|
||||||
|
// window, until we know the title of the actual login page
|
||||||
|
this.title = _("Web Authentication Redirect");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh: function() {
|
||||||
|
this._everSeenRedirect = false;
|
||||||
|
this._webView.load_uri(this._originalUrl);
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_delete_event: function(event) {
|
||||||
|
if (this._recheckAtExit)
|
||||||
|
this._doneCallback(PortalHelperResult.RECHECK);
|
||||||
|
else
|
||||||
|
this._doneCallback(PortalHelperResult.CANCELLED);
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDecidePolicy: function(view, decision, type) {
|
||||||
|
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
||||||
|
decision.ignore();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type != WebKit.PolicyDecisionType.NAVIGATION_ACTION)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let request = decision.get_request();
|
||||||
|
let uri = new Soup.URI(request.get_uri());
|
||||||
|
|
||||||
|
if (this._uri != null) {
|
||||||
|
if (!uri.host_equal(uri, this._uri)) {
|
||||||
|
// We *may* have finished here, but we don't know for
|
||||||
|
// sure. Tell gnome-shell to run another connectivity check
|
||||||
|
// (but ratelimit the checks, we don't want to spam
|
||||||
|
// gnome.org for portals that have 10 or more internal
|
||||||
|
// redirects - and unfortunately they exist)
|
||||||
|
// If we hit the rate limit, we also queue a recheck
|
||||||
|
// when the window is closed, just in case we miss the
|
||||||
|
// final check and don't realize we're connected
|
||||||
|
// This should not be a problem in the cancelled logic,
|
||||||
|
// because if the user doesn't want to start the login,
|
||||||
|
// we should not see any redirect at all, outside this._uri
|
||||||
|
|
||||||
|
let now = GLib.get_monotonic_time();
|
||||||
|
let shouldRecheck = (now - this._lastRecheck) >
|
||||||
|
CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT;
|
||||||
|
|
||||||
|
if (shouldRecheck) {
|
||||||
|
this._lastRecheck = now;
|
||||||
|
this._recheckAtExit = false;
|
||||||
|
this._doneCallback(PortalHelperResult.RECHECK);
|
||||||
|
} else {
|
||||||
|
this._recheckAtExit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the URI, in case of chained redirects, so we still
|
||||||
|
// think we're doing the login until gnome-shell kills us
|
||||||
|
this._uri = uri;
|
||||||
|
} else {
|
||||||
|
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
|
||||||
|
// Yay, we got to gnome!
|
||||||
|
decision.ignore();
|
||||||
|
this._doneCallback(PortalHelperResult.COMPLETED);
|
||||||
|
return true;
|
||||||
|
} else if (uri.get_host() != 'www.gnome.org') {
|
||||||
|
this._everSeenRedirect = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
decision.use();
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const WebPortalHelper = new Lang.Class({
|
||||||
|
Name: 'WebPortalHelper',
|
||||||
|
Extends: Gtk.Application,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent({ application_id: 'org.gnome.Shell.PortalHelper',
|
||||||
|
flags: Gio.ApplicationFlags.IS_SERVICE,
|
||||||
|
inactivity_timeout: 30000 });
|
||||||
|
|
||||||
|
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
||||||
|
this._queue = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_dbus_register: function(connection, path) {
|
||||||
|
this._dbusImpl.export(connection, path);
|
||||||
|
this.parent(connection, path);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_dbus_unregister: function(connection, path) {
|
||||||
|
this._dbusImpl.unexport_from_connection(connection);
|
||||||
|
this.parent(connection, path);
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_activate: function() {
|
||||||
|
// If launched manually (for example for testing), force a dummy authentication
|
||||||
|
// session with the default url
|
||||||
|
this.Authenticate('/org/gnome/dummy', '', 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
Authenticate: function(connection, url, timestamp) {
|
||||||
|
this._queue.push({ connection: connection, url: url, timestamp: timestamp });
|
||||||
|
|
||||||
|
this._processQueue();
|
||||||
|
},
|
||||||
|
|
||||||
|
Close: function(connection) {
|
||||||
|
for (let i = 0; i < this._queue.length; i++) {
|
||||||
|
let obj = this._queue[i];
|
||||||
|
|
||||||
|
if (obj.connection == connection) {
|
||||||
|
if (obj.window)
|
||||||
|
obj.window.destroy();
|
||||||
|
this._queue.splice(i, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._processQueue();
|
||||||
|
},
|
||||||
|
|
||||||
|
Refresh: function(connection) {
|
||||||
|
for (let i = 0; i < this._queue.length; i++) {
|
||||||
|
let obj = this._queue[i];
|
||||||
|
|
||||||
|
if (obj.connection == connection) {
|
||||||
|
if (obj.window)
|
||||||
|
obj.window.refresh();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_processQueue: function() {
|
||||||
|
if (this._queue.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let top = this._queue[0];
|
||||||
|
if (top.window != null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
|
||||||
|
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function initEnvironment() {
|
||||||
|
String.prototype.format = Format.format;
|
||||||
|
}
|
||||||
|
|
||||||
|
function main(argv) {
|
||||||
|
initEnvironment();
|
||||||
|
|
||||||
|
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
||||||
|
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
||||||
|
|
||||||
|
let app = new WebPortalHelper();
|
||||||
|
return app.run(argv);
|
||||||
|
}
|
@ -1253,6 +1253,51 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
this._grabHelper = new GrabHelper.GrabHelper(this.actor);
|
this._grabHelper = new GrabHelper.GrabHelper(this.actor);
|
||||||
this._grabHelper.addActor(Main.layoutManager.overviewGroup);
|
this._grabHelper.addActor(Main.layoutManager.overviewGroup);
|
||||||
|
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onKeyPress: function(actor, event) {
|
||||||
|
if (global.stage.get_key_focus() != actor)
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
// Since we need to only grab focus on one item child when the user
|
||||||
|
// actually press a key we don't use navigate_focus when opening
|
||||||
|
// the popup.
|
||||||
|
// Instead of that, grab the focus on the AppFolderPopup actor
|
||||||
|
// and actually moves the focus to a child only when the user
|
||||||
|
// actually press a key.
|
||||||
|
// It should work with just grab_key_focus on the AppFolderPopup
|
||||||
|
// actor, but since the arrow keys are not wrapping_around the focus
|
||||||
|
// is not grabbed by a child when the widget that has the current focus
|
||||||
|
// is the same that is requesting focus, so to make it works with arrow
|
||||||
|
// keys we need to connect to the key-press-event and navigate_focus
|
||||||
|
// when that happens using TAB_FORWARD or TAB_BACKWARD instead of arrow
|
||||||
|
// keys
|
||||||
|
|
||||||
|
// Use TAB_FORWARD for down key and right key
|
||||||
|
// and TAB_BACKWARD for up key and left key on ltr
|
||||||
|
// languages
|
||||||
|
let direction;
|
||||||
|
let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR;
|
||||||
|
switch (event.get_key_symbol()) {
|
||||||
|
case Clutter.Down:
|
||||||
|
direction = Gtk.DirectionType.TAB_FORWARD;
|
||||||
|
break;
|
||||||
|
case Clutter.Right:
|
||||||
|
direction = isLtr ? Gtk.DirectionType.TAB_FORWARD :
|
||||||
|
Gtk.DirectionType.TAB_BACKWARD;
|
||||||
|
break;
|
||||||
|
case Clutter.Up:
|
||||||
|
direction = Gtk.DirectionType.TAB_BACKWARD;
|
||||||
|
break;
|
||||||
|
case Clutter.Left:
|
||||||
|
direction = isLtr ? Gtk.DirectionType.TAB_BACKWARD :
|
||||||
|
Gtk.DirectionType.TAB_FORWARD;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
}
|
||||||
|
return actor.navigate_focus(null, direction, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
toggle: function() {
|
toggle: function() {
|
||||||
@ -1278,8 +1323,6 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
||||||
BoxPointer.PopupAnimation.SLIDE);
|
BoxPointer.PopupAnimation.SLIDE);
|
||||||
|
|
||||||
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
|
||||||
|
|
||||||
this.emit('open-state-changed', true);
|
this.emit('open-state-changed', true);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -6,6 +6,26 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
const RENAMED_DESKTOP_IDS = {
|
||||||
|
'baobab.desktop': 'org.gnome.baobab.desktop',
|
||||||
|
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
||||||
|
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
||||||
|
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||||
|
'gcalctool.desktop': 'gnome-calculator.desktop',
|
||||||
|
'gedit.desktop': 'org.gnome.gedit.desktop',
|
||||||
|
'glchess.desktop': 'gnome-chess.desktop',
|
||||||
|
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||||
|
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||||
|
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||||
|
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||||
|
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||||
|
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||||
|
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
||||||
|
'gnomine.desktop': 'gnome-mines.desktop',
|
||||||
|
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||||
|
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||||
|
};
|
||||||
|
|
||||||
const AppFavorites = new Lang.Class({
|
const AppFavorites = new Lang.Class({
|
||||||
Name: 'AppFavorites',
|
Name: 'AppFavorites',
|
||||||
|
|
||||||
@ -24,6 +44,21 @@ const AppFavorites = new Lang.Class({
|
|||||||
|
|
||||||
reload: function() {
|
reload: function() {
|
||||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
||||||
|
|
||||||
|
// Map old desktop file names to the current ones
|
||||||
|
let updated = false;
|
||||||
|
ids = ids.map(function (id) {
|
||||||
|
let newId = RENAMED_DESKTOP_IDS[id];
|
||||||
|
if (newId !== undefined) {
|
||||||
|
updated = true;
|
||||||
|
return newId;
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
});
|
||||||
|
// ... and write back the updated desktop file names
|
||||||
|
if (updated)
|
||||||
|
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||||
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
let appSys = Shell.AppSystem.get_default();
|
||||||
let apps = ids.map(function (id) {
|
let apps = ids.map(function (id) {
|
||||||
return appSys.lookup_app(id);
|
return appSys.lookup_app(id);
|
||||||
|
@ -448,7 +448,7 @@ const Background = new Lang.Class({
|
|||||||
|
|
||||||
let image = this._images[index];
|
let image = this._images[index];
|
||||||
if (image.content)
|
if (image.content)
|
||||||
this._cache.removeImageContent(content);
|
this._cache.removeImageContent(image.content);
|
||||||
image.content = content;
|
image.content = content;
|
||||||
this._watchCacheFile(filename);
|
this._watchCacheFile(filename);
|
||||||
},
|
},
|
||||||
@ -659,7 +659,10 @@ const SystemBackground = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._cache.removeImageContent(this.actor.content);
|
let content = this.actor.content;
|
||||||
|
|
||||||
|
if (content)
|
||||||
|
this._cache.removeImageContent(content);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(SystemBackground.prototype);
|
Signals.addSignalMethods(SystemBackground.prototype);
|
||||||
|
@ -55,9 +55,14 @@ function addBackgroundMenu(actor, layoutManager) {
|
|||||||
});
|
});
|
||||||
actor.add_action(clickAction);
|
actor.add_action(clickAction);
|
||||||
|
|
||||||
|
let grabOpBeginId = global.display.connect('grab-op-begin', function () {
|
||||||
|
clickAction.release();
|
||||||
|
});
|
||||||
|
|
||||||
actor.connect('destroy', function() {
|
actor.connect('destroy', function() {
|
||||||
actor._backgroundMenu.destroy();
|
actor._backgroundMenu.destroy();
|
||||||
actor._backgroundMenu = null;
|
actor._backgroundMenu = null;
|
||||||
actor._backgroundManager = null;
|
actor._backgroundManager = null;
|
||||||
|
global.display.disconnect(grabOpBeginId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,9 @@ const Main = imports.ui.main;
|
|||||||
|
|
||||||
const MAX_CANDIDATES_PER_PAGE = 16;
|
const MAX_CANDIDATES_PER_PAGE = 16;
|
||||||
|
|
||||||
|
const DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
|
||||||
|
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
|
||||||
|
|
||||||
const CandidateArea = new Lang.Class({
|
const CandidateArea = new Lang.Class({
|
||||||
Name: 'CandidateArea',
|
Name: 'CandidateArea',
|
||||||
|
|
||||||
@ -89,7 +92,7 @@ const CandidateArea = new Lang.Class({
|
|||||||
if (!visible)
|
if (!visible)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : '%x'.format(i + 1));
|
box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : DEFAULT_INDEX_LABELS[i]);
|
||||||
box._candidateLabel.text = candidates[i];
|
box._candidateLabel.text = candidates[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
// Normally, the stage is always covered so Clutter doesn't need to clear
|
// Normally, the stage is always covered so Clutter doesn't need to clear
|
||||||
// it; however it becomes visible during the startup animation
|
// it; however it becomes visible during the startup animation
|
||||||
// See the comment below for a longer explanation
|
// See the comment below for a longer explanation
|
||||||
global.stage.color = DEFAULT_BACKGROUND_COLOR;
|
global.stage.background_color = DEFAULT_BACKGROUND_COLOR;
|
||||||
|
|
||||||
// Set up stage hierarchy to group all UI actors under one container.
|
// Set up stage hierarchy to group all UI actors under one container.
|
||||||
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
||||||
@ -224,7 +224,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||||
// position and size set in setDummyCursorGeometry.
|
// position and size set in setDummyCursorGeometry.
|
||||||
this.dummyCursor = new St.Widget({ width: 0, height: 0 });
|
this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
|
||||||
this.uiGroup.add_actor(this.dummyCursor);
|
this.uiGroup.add_actor(this.dummyCursor);
|
||||||
|
|
||||||
global.stage.remove_actor(global.top_window_group);
|
global.stage.remove_actor(global.top_window_group);
|
||||||
@ -597,7 +597,9 @@ const LayoutManager = new Lang.Class({
|
|||||||
reactive: true });
|
reactive: true });
|
||||||
this.addChrome(this._coverPane);
|
this.addChrome(this._coverPane);
|
||||||
|
|
||||||
if (Main.sessionMode.isGreeter) {
|
if (Meta.is_restart()) {
|
||||||
|
// On restart, we don't do an animation
|
||||||
|
} else if (Main.sessionMode.isGreeter) {
|
||||||
this.panelBox.translation_y = -this.panelBox.height;
|
this.panelBox.translation_y = -this.panelBox.height;
|
||||||
} else {
|
} else {
|
||||||
this._updateBackgrounds();
|
this._updateBackgrounds();
|
||||||
@ -636,7 +638,9 @@ const LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_startupAnimation: function() {
|
_startupAnimation: function() {
|
||||||
if (Main.sessionMode.isGreeter)
|
if (Meta.is_restart())
|
||||||
|
this._startupAnimationComplete();
|
||||||
|
else if (Main.sessionMode.isGreeter)
|
||||||
this._startupAnimationGreeter();
|
this._startupAnimationGreeter();
|
||||||
else
|
else
|
||||||
this._startupAnimationSession();
|
this._startupAnimationSession();
|
||||||
|
@ -18,6 +18,7 @@ const ExtensionSystem = imports.ui.extensionSystem;
|
|||||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||||
const Keyboard = imports.ui.keyboard;
|
const Keyboard = imports.ui.keyboard;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const OsdWindow = imports.ui.osdWindow;
|
const OsdWindow = imports.ui.osdWindow;
|
||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
@ -167,6 +168,16 @@ function _initializeUI() {
|
|||||||
overview.toggle();
|
overview.toggle();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
global.display.connect('show-restart-message', function(display, message) {
|
||||||
|
showRestartMessage(message);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
global.display.connect('restart', function() {
|
||||||
|
global.reexec_self();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
// Provide the bus object for gnome-session to
|
// Provide the bus object for gnome-session to
|
||||||
// initiate logouts.
|
// initiate logouts.
|
||||||
EndSessionDialog.init();
|
EndSessionDialog.init();
|
||||||
@ -233,8 +244,7 @@ function _loadDefaultStylesheet() {
|
|||||||
* Returns: A file path that contains the theme CSS,
|
* Returns: A file path that contains the theme CSS,
|
||||||
* null if using the default
|
* null if using the default
|
||||||
*/
|
*/
|
||||||
function getThemeStylesheet()
|
function getThemeStylesheet() {
|
||||||
{
|
|
||||||
return _cssStylesheet;
|
return _cssStylesheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,8 +255,7 @@ function getThemeStylesheet()
|
|||||||
*
|
*
|
||||||
* Set the theme CSS file that the shell will load
|
* Set the theme CSS file that the shell will load
|
||||||
*/
|
*/
|
||||||
function setThemeStylesheet(cssStylesheet)
|
function setThemeStylesheet(cssStylesheet) {
|
||||||
{
|
|
||||||
_cssStylesheet = cssStylesheet;
|
_cssStylesheet = cssStylesheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -608,3 +617,28 @@ function queueDeferredWork(workId) {
|
|||||||
GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork');
|
GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const RestartMessage = new Lang.Class({
|
||||||
|
Name: 'RestartMessage',
|
||||||
|
Extends: ModalDialog.ModalDialog,
|
||||||
|
|
||||||
|
_init : function(message) {
|
||||||
|
this.parent({ shellReactive: true,
|
||||||
|
styleClass: 'restart-message',
|
||||||
|
shouldFadeIn: false,
|
||||||
|
destroyOnClose: true });
|
||||||
|
|
||||||
|
let label = new St.Label({ text: message });
|
||||||
|
|
||||||
|
this.contentLayout.add(label, { x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.MIDDLE,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
this.buttonLayout.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function showRestartMessage(message) {
|
||||||
|
let restartMessage = new RestartMessage(message);
|
||||||
|
restartMessage.open();
|
||||||
|
}
|
||||||
|
@ -43,6 +43,7 @@ const ModalDialog = new Lang.Class({
|
|||||||
styleClass: null,
|
styleClass: null,
|
||||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||||
shouldFadeIn: true,
|
shouldFadeIn: true,
|
||||||
|
shouldFadeOut: true,
|
||||||
destroyOnClose: true });
|
destroyOnClose: true });
|
||||||
|
|
||||||
this.state = State.CLOSED;
|
this.state = State.CLOSED;
|
||||||
@ -50,6 +51,7 @@ const ModalDialog = new Lang.Class({
|
|||||||
this._keybindingMode = params.keybindingMode;
|
this._keybindingMode = params.keybindingMode;
|
||||||
this._shellReactive = params.shellReactive;
|
this._shellReactive = params.shellReactive;
|
||||||
this._shouldFadeIn = params.shouldFadeIn;
|
this._shouldFadeIn = params.shouldFadeIn;
|
||||||
|
this._shouldFadeOut = params.shouldFadeOut;
|
||||||
this._destroyOnClose = params.destroyOnClose;
|
this._destroyOnClose = params.destroyOnClose;
|
||||||
|
|
||||||
this._group = new St.Widget({ visible: false,
|
this._group = new St.Widget({ visible: false,
|
||||||
@ -307,6 +309,15 @@ const ModalDialog = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_closeComplete: function() {
|
||||||
|
this.state = State.CLOSED;
|
||||||
|
this._group.hide();
|
||||||
|
this.emit('closed');
|
||||||
|
|
||||||
|
if (this._destroyOnClose)
|
||||||
|
this.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
close: function(timestamp) {
|
close: function(timestamp) {
|
||||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||||
return;
|
return;
|
||||||
@ -315,20 +326,16 @@ const ModalDialog = new Lang.Class({
|
|||||||
this.popModal(timestamp);
|
this.popModal(timestamp);
|
||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
|
|
||||||
Tweener.addTween(this._group,
|
if (this._shouldFadeOut)
|
||||||
{ opacity: 0,
|
Tweener.addTween(this._group,
|
||||||
time: OPEN_AND_CLOSE_TIME,
|
{ opacity: 0,
|
||||||
transition: 'easeOutQuad',
|
time: OPEN_AND_CLOSE_TIME,
|
||||||
onComplete: Lang.bind(this,
|
transition: 'easeOutQuad',
|
||||||
function() {
|
onComplete: Lang.bind(this,
|
||||||
this.state = State.CLOSED;
|
this._closeComplete)
|
||||||
this._group.hide();
|
})
|
||||||
this.emit('closed');
|
else
|
||||||
|
this._closeComplete();
|
||||||
if (this._destroyOnClose)
|
|
||||||
this.destroy();
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Drop modal status without closing the dialog; this makes the
|
// Drop modal status without closing the dialog; this makes the
|
||||||
|
@ -120,15 +120,12 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
|
|
||||||
this._nextNotificationId = 1;
|
this._nextNotificationId = 1;
|
||||||
|
|
||||||
|
Shell.WindowTracker.get_default().connect('notify::focus-app', Lang.bind(this, this._onFocusAppChanged));
|
||||||
|
Main.overview.connect('hidden', Lang.bind(this, this._onFocusAppChanged));
|
||||||
|
|
||||||
this._trayManager = new Shell.TrayManager();
|
this._trayManager = new Shell.TrayManager();
|
||||||
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
||||||
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
||||||
|
|
||||||
Shell.WindowTracker.get_default().connect('notify::focus-app',
|
|
||||||
Lang.bind(this, this._onFocusAppChanged));
|
|
||||||
Main.overview.connect('hidden',
|
|
||||||
Lang.bind(this, this._onFocusAppChanged));
|
|
||||||
|
|
||||||
this._trayManager.manage_screen(global.screen, Main.messageTray.actor);
|
this._trayManager.manage_screen(global.screen, Main.messageTray.actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -692,6 +689,12 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const PRIORITY_URGENCY_MAP = {
|
||||||
|
low: MessageTray.Urgency.LOW,
|
||||||
|
normal: MessageTray.Urgency.NORMAL,
|
||||||
|
high: MessageTray.Urgency.HIGH,
|
||||||
|
urgent: MessageTray.Urgency.CRITICAL
|
||||||
|
};
|
||||||
|
|
||||||
const GtkNotificationDaemonNotification = new Lang.Class({
|
const GtkNotificationDaemonNotification = new Lang.Class({
|
||||||
Name: 'GtkNotificationDaemonNotification',
|
Name: 'GtkNotificationDaemonNotification',
|
||||||
@ -705,12 +708,20 @@ const GtkNotificationDaemonNotification = new Lang.Class({
|
|||||||
"body": body,
|
"body": body,
|
||||||
"icon": gicon,
|
"icon": gicon,
|
||||||
"urgent": urgent,
|
"urgent": urgent,
|
||||||
|
"priority": priority,
|
||||||
"buttons": buttons,
|
"buttons": buttons,
|
||||||
"default-action": defaultAction,
|
"default-action": defaultAction,
|
||||||
"default-action-target": defaultActionTarget } = notification;
|
"default-action-target": defaultActionTarget } = notification;
|
||||||
|
|
||||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
if (priority) {
|
||||||
: MessageTray.Urgency.NORMAL);
|
let urgency = PRIORITY_URGENCY_MAP[priority.unpack()];
|
||||||
|
this.setUrgency(urgency != undefined ? urgency : MessageTray.Urgency.NORMAL);
|
||||||
|
} else if (urgent) {
|
||||||
|
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
||||||
|
: MessageTray.Urgency.NORMAL);
|
||||||
|
} else {
|
||||||
|
this.setUrgency(MessageTray.Urgency.NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
if (buttons) {
|
if (buttons) {
|
||||||
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
||||||
|
@ -425,8 +425,6 @@ const Overview = new Lang.Class({
|
|||||||
this.emit('windows-restacked', stackIndices);
|
this.emit('windows-restacked', stackIndices);
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Public methods ////
|
|
||||||
|
|
||||||
beginItemDrag: function(source) {
|
beginItemDrag: function(source) {
|
||||||
this.emit('item-drag-begin');
|
this.emit('item-drag-begin');
|
||||||
this._inDrag = true;
|
this._inDrag = true;
|
||||||
@ -455,23 +453,6 @@ const Overview = new Lang.Class({
|
|||||||
this._inDrag = false;
|
this._inDrag = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
// show:
|
|
||||||
//
|
|
||||||
// Animates the overview visible and grabs mouse and keyboard input
|
|
||||||
show: function() {
|
|
||||||
if (this.isDummy)
|
|
||||||
return;
|
|
||||||
if (this._shown)
|
|
||||||
return;
|
|
||||||
this._shown = true;
|
|
||||||
|
|
||||||
if (!this._syncGrab())
|
|
||||||
return;
|
|
||||||
|
|
||||||
Main.layoutManager.showOverview();
|
|
||||||
this._animateVisible();
|
|
||||||
},
|
|
||||||
|
|
||||||
focusSearch: function() {
|
focusSearch: function() {
|
||||||
this.show();
|
this.show();
|
||||||
this._searchEntry.grab_key_focus();
|
this._searchEntry.grab_key_focus();
|
||||||
@ -504,69 +485,6 @@ const Overview = new Lang.Class({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateVisible: function() {
|
|
||||||
if (this.visible || this.animationInProgress)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.visible = true;
|
|
||||||
this.animationInProgress = true;
|
|
||||||
this.visibleTarget = true;
|
|
||||||
this._activationTime = Date.now() / 1000;
|
|
||||||
|
|
||||||
Meta.disable_unredirect_for_screen(global.screen);
|
|
||||||
this.viewSelector.show();
|
|
||||||
|
|
||||||
this._stack.opacity = 0;
|
|
||||||
Tweener.addTween(this._stack,
|
|
||||||
{ opacity: 255,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
time: ANIMATION_TIME,
|
|
||||||
onComplete: this._showDone,
|
|
||||||
onCompleteScope: this
|
|
||||||
});
|
|
||||||
this._shadeBackgrounds();
|
|
||||||
|
|
||||||
this._coverPane.raise_top();
|
|
||||||
this._coverPane.show();
|
|
||||||
this.emit('showing');
|
|
||||||
},
|
|
||||||
|
|
||||||
// hide:
|
|
||||||
//
|
|
||||||
// Reverses the effect of show()
|
|
||||||
hide: function() {
|
|
||||||
if (this.isDummy)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!this._shown)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let event = Clutter.get_current_event();
|
|
||||||
if (event) {
|
|
||||||
let type = event.type();
|
|
||||||
let button = (type == Clutter.EventType.BUTTON_PRESS ||
|
|
||||||
type == Clutter.EventType.BUTTON_RELEASE);
|
|
||||||
let ctrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0;
|
|
||||||
if (button && ctrl)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._animateNotVisible();
|
|
||||||
|
|
||||||
this._shown = false;
|
|
||||||
this._syncGrab();
|
|
||||||
},
|
|
||||||
|
|
||||||
toggle: function() {
|
|
||||||
if (this.isDummy)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this.visible)
|
|
||||||
this.hide();
|
|
||||||
else
|
|
||||||
this.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
// Checks if the Activities button is currently sensitive to
|
// Checks if the Activities button is currently sensitive to
|
||||||
// clicks. The first call to this function within the
|
// clicks. The first call to this function within the
|
||||||
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
||||||
@ -583,8 +501,6 @@ const Overview = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Private methods ////
|
|
||||||
|
|
||||||
_syncGrab: function() {
|
_syncGrab: function() {
|
||||||
// We delay grab changes during animation so that when removing the
|
// We delay grab changes during animation so that when removing the
|
||||||
// overview we don't have a problem with the release of a press/release
|
// overview we don't have a problem with the release of a press/release
|
||||||
@ -614,6 +530,92 @@ const Overview = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// show:
|
||||||
|
//
|
||||||
|
// Animates the overview visible and grabs mouse and keyboard input
|
||||||
|
show: function() {
|
||||||
|
if (this.isDummy)
|
||||||
|
return;
|
||||||
|
if (this._shown)
|
||||||
|
return;
|
||||||
|
this._shown = true;
|
||||||
|
|
||||||
|
if (!this._syncGrab())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Main.layoutManager.showOverview();
|
||||||
|
this._animateVisible();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
_animateVisible: function() {
|
||||||
|
if (this.visible || this.animationInProgress)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.visible = true;
|
||||||
|
this.animationInProgress = true;
|
||||||
|
this.visibleTarget = true;
|
||||||
|
this._activationTime = Date.now() / 1000;
|
||||||
|
|
||||||
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
|
this.viewSelector.show();
|
||||||
|
|
||||||
|
this._stack.opacity = 0;
|
||||||
|
Tweener.addTween(this._stack,
|
||||||
|
{ opacity: 255,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
time: ANIMATION_TIME,
|
||||||
|
onComplete: this._showDone,
|
||||||
|
onCompleteScope: this
|
||||||
|
});
|
||||||
|
this._shadeBackgrounds();
|
||||||
|
|
||||||
|
this._coverPane.raise_top();
|
||||||
|
this._coverPane.show();
|
||||||
|
this.emit('showing');
|
||||||
|
},
|
||||||
|
|
||||||
|
_showDone: function() {
|
||||||
|
this.animationInProgress = false;
|
||||||
|
this._desktopFade.hide();
|
||||||
|
this._coverPane.hide();
|
||||||
|
|
||||||
|
this.emit('shown');
|
||||||
|
// Handle any calls to hide* while we were showing
|
||||||
|
if (!this._shown)
|
||||||
|
this._animateNotVisible();
|
||||||
|
|
||||||
|
this._syncGrab();
|
||||||
|
global.sync_pointer();
|
||||||
|
},
|
||||||
|
|
||||||
|
// hide:
|
||||||
|
//
|
||||||
|
// Reverses the effect of show()
|
||||||
|
hide: function() {
|
||||||
|
if (this.isDummy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!this._shown)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let event = Clutter.get_current_event();
|
||||||
|
if (event) {
|
||||||
|
let type = event.type();
|
||||||
|
let button = (type == Clutter.EventType.BUTTON_PRESS ||
|
||||||
|
type == Clutter.EventType.BUTTON_RELEASE);
|
||||||
|
let ctrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0;
|
||||||
|
if (button && ctrl)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._animateNotVisible();
|
||||||
|
|
||||||
|
this._shown = false;
|
||||||
|
this._syncGrab();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
_animateNotVisible: function() {
|
_animateNotVisible: function() {
|
||||||
if (!this.visible || this.animationInProgress)
|
if (!this.visible || this.animationInProgress)
|
||||||
return;
|
return;
|
||||||
@ -638,20 +640,6 @@ const Overview = new Lang.Class({
|
|||||||
this.emit('hiding');
|
this.emit('hiding');
|
||||||
},
|
},
|
||||||
|
|
||||||
_showDone: function() {
|
|
||||||
this.animationInProgress = false;
|
|
||||||
this._desktopFade.hide();
|
|
||||||
this._coverPane.hide();
|
|
||||||
|
|
||||||
this.emit('shown');
|
|
||||||
// Handle any calls to hide* while we were showing
|
|
||||||
if (!this._shown)
|
|
||||||
this._animateNotVisible();
|
|
||||||
|
|
||||||
this._syncGrab();
|
|
||||||
global.sync_pointer();
|
|
||||||
},
|
|
||||||
|
|
||||||
_hideDone: function() {
|
_hideDone: function() {
|
||||||
// Re-enable unredirection
|
// Re-enable unredirection
|
||||||
Meta.enable_unredirect_for_screen(global.screen);
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
@ -677,6 +665,16 @@ const Overview = new Lang.Class({
|
|||||||
this._fakePointerEvent();
|
this._fakePointerEvent();
|
||||||
this._needsFakePointerEvent = false;
|
this._needsFakePointerEvent = false;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
toggle: function() {
|
||||||
|
if (this.isDummy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (this.visible)
|
||||||
|
this.hide();
|
||||||
|
else
|
||||||
|
this.show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(Overview.prototype);
|
Signals.addSignalMethods(Overview.prototype);
|
||||||
|
@ -14,7 +14,6 @@ const St = imports.gi.St;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
|
@ -378,9 +378,9 @@ const PopupImageMenuItem = new Lang.Class({
|
|||||||
this.parent(params);
|
this.parent(params);
|
||||||
|
|
||||||
this.label = new St.Label({ text: text });
|
this.label = new St.Label({ text: text });
|
||||||
this.addActor(this.label);
|
this.actor.add_child(this.label);
|
||||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||||
this.addActor(this._icon, { align: St.Align.END });
|
this.actor.add_child(this._icon, { align: St.Align.END });
|
||||||
|
|
||||||
this.setIcon(iconName);
|
this.setIcon(iconName);
|
||||||
},
|
},
|
||||||
|
@ -50,14 +50,10 @@ const RunDialog = new Lang.Class({
|
|||||||
Main.createLookingGlass().open();
|
Main.createLookingGlass().open();
|
||||||
}),
|
}),
|
||||||
|
|
||||||
'r': Lang.bind(this, function() {
|
'r': Lang.bind(this, this._restart),
|
||||||
global.reexec_self();
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Developer brain backwards compatibility
|
// Developer brain backwards compatibility
|
||||||
'restart': Lang.bind(this, function() {
|
'restart': Lang.bind(this, this._restart),
|
||||||
global.reexec_self();
|
|
||||||
}),
|
|
||||||
|
|
||||||
'debugexit': Lang.bind(this, function() {
|
'debugexit': Lang.bind(this, function() {
|
||||||
Meta.quit(Meta.ExitCode.ERROR);
|
Meta.quit(Meta.ExitCode.ERROR);
|
||||||
@ -271,6 +267,12 @@ const RunDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_restart: function() {
|
||||||
|
this._shouldFadeOut = false;
|
||||||
|
this.close();
|
||||||
|
Meta.restart(_("Restarting…"));
|
||||||
|
},
|
||||||
|
|
||||||
open: function() {
|
open: function() {
|
||||||
this._history.lastItem();
|
this._history.lastItem();
|
||||||
this._errorBox.hide();
|
this._errorBox.hide();
|
||||||
|
@ -7,6 +7,7 @@ const Meta = imports.gi.Meta;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
// This module provides functionality for driving the shell user interface
|
// This module provides functionality for driving the shell user interface
|
||||||
// in an automated fashion. The primary current use case for this is
|
// in an automated fashion. The primary current use case for this is
|
||||||
@ -78,6 +79,7 @@ const PerfHelperIface = '<node> \
|
|||||||
<arg type="i" direction="in" /> \
|
<arg type="i" direction="in" /> \
|
||||||
<arg type="b" direction="in" /> \
|
<arg type="b" direction="in" /> \
|
||||||
<arg type="b" direction="in" /> \
|
<arg type="b" direction="in" /> \
|
||||||
|
<arg type="b" direction="in" /> \
|
||||||
</method> \
|
</method> \
|
||||||
<method name="WaitWindows" /> \
|
<method name="WaitWindows" /> \
|
||||||
<method name="DestroyWindows" /> \
|
<method name="DestroyWindows" /> \
|
||||||
@ -97,11 +99,36 @@ function _getPerfHelper() {
|
|||||||
return _perfHelper;
|
return _perfHelper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _callRemote(obj, method, ...args) {
|
||||||
|
let cb;
|
||||||
|
let errcb;
|
||||||
|
|
||||||
|
args.push(function(result, excp) {
|
||||||
|
if (excp) {
|
||||||
|
if (errcb)
|
||||||
|
errcb(excp);
|
||||||
|
} else {
|
||||||
|
if (cb)
|
||||||
|
cb();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
method.apply(obj, args);
|
||||||
|
|
||||||
|
return function(callback, error_callback) {
|
||||||
|
cb = callback;
|
||||||
|
errcb = error_callback;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* createTestWindow:
|
* createTestWindow:
|
||||||
* @width: width of window, in pixels
|
* @params: options for window creation.
|
||||||
* @height: height of window, in pixels
|
* width - width of window, in pixels (default 640)
|
||||||
* @alpha: whether the window should be alpha transparent
|
* height - height of window, in pixels (default 480)
|
||||||
|
* alpha - whether the window should have an alpha channel (default false)
|
||||||
|
* maximized - whether the window should be created maximized (default false)
|
||||||
|
* redraws - whether the window should continually redraw itself (default false)
|
||||||
* @maximized: whethe the window should be created maximized
|
* @maximized: whethe the window should be created maximized
|
||||||
*
|
*
|
||||||
* Creates a window using gnome-shell-perf-helper for testing purposes.
|
* Creates a window using gnome-shell-perf-helper for testing purposes.
|
||||||
@ -110,19 +137,17 @@ function _getPerfHelper() {
|
|||||||
* because of the normal X asynchronous mapping process, to actually wait
|
* because of the normal X asynchronous mapping process, to actually wait
|
||||||
* until the window has been mapped and exposed, use waitTestWindows().
|
* until the window has been mapped and exposed, use waitTestWindows().
|
||||||
*/
|
*/
|
||||||
function createTestWindow(width, height, alpha, maximized) {
|
function createTestWindow(width, height, params) {
|
||||||
let cb;
|
params = Params.parse(params, { width: 640,
|
||||||
|
height: 480,
|
||||||
|
alpha: false,
|
||||||
|
maximized: false,
|
||||||
|
redraws: false });
|
||||||
|
|
||||||
let perfHelper = _getPerfHelper();
|
let perfHelper = _getPerfHelper();
|
||||||
|
return _callRemote(perfHelper, perfHelper.CreateWindowRemote,
|
||||||
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
|
params.width, params.height,
|
||||||
function(result, excp) {
|
params.alpha, params.maximized, params.redraws);
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,17 +157,8 @@ function createTestWindow(width, height, alpha, maximized) {
|
|||||||
* created with createTestWindow have been mapped and exposed.
|
* created with createTestWindow have been mapped and exposed.
|
||||||
*/
|
*/
|
||||||
function waitTestWindows() {
|
function waitTestWindows() {
|
||||||
let cb;
|
|
||||||
let perfHelper = _getPerfHelper();
|
let perfHelper = _getPerfHelper();
|
||||||
|
return _callRemote(perfHelper, perfHelper.WaitWindowsRemote);
|
||||||
perfHelper.WaitWindowsRemote(function(result, excp) {
|
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,17 +171,8 @@ function waitTestWindows() {
|
|||||||
* process because of normal X asynchronicity.
|
* process because of normal X asynchronicity.
|
||||||
*/
|
*/
|
||||||
function destroyTestWindows() {
|
function destroyTestWindows() {
|
||||||
let cb;
|
|
||||||
let perfHelper = _getPerfHelper();
|
let perfHelper = _getPerfHelper();
|
||||||
|
return _callRemote(perfHelper, perfHelper.DestroyWindowsRemote);
|
||||||
perfHelper.DestroyWindowsRemote(function(result, excp) {
|
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -208,6 +215,10 @@ function _step(g, finish, onError) {
|
|||||||
let waitFunction = g.next();
|
let waitFunction = g.next();
|
||||||
waitFunction(function() {
|
waitFunction(function() {
|
||||||
_step(g, finish, onError);
|
_step(g, finish, onError);
|
||||||
|
},
|
||||||
|
function(err) {
|
||||||
|
if (onError)
|
||||||
|
onError(err);
|
||||||
});
|
});
|
||||||
} catch (err if err instanceof StopIteration) {
|
} catch (err if err instanceof StopIteration) {
|
||||||
if (finish)
|
if (finish)
|
||||||
@ -306,8 +317,8 @@ function _collect(scriptModule, outputFile) {
|
|||||||
print ('------------------------------------------------------------');
|
print ('------------------------------------------------------------');
|
||||||
for (let i = 0; i < metrics.length; i++) {
|
for (let i = 0; i < metrics.length; i++) {
|
||||||
let metric = metrics[i];
|
let metric = metrics[i];
|
||||||
print ('# ' + scriptModule.METRIC_DESCRIPTIONS[metric]);
|
print ('# ' + scriptModule.METRICS[metric].description);
|
||||||
print (metric + ': ' + scriptModule.METRICS[metric]);
|
print (metric + ': ' + scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units);
|
||||||
}
|
}
|
||||||
print ('------------------------------------------------------------');
|
print ('------------------------------------------------------------');
|
||||||
}
|
}
|
||||||
@ -360,7 +371,12 @@ function runPerfScript(scriptModule, outputFile) {
|
|||||||
|
|
||||||
_step(g,
|
_step(g,
|
||||||
function() {
|
function() {
|
||||||
_collect(scriptModule, outputFile);
|
try {
|
||||||
|
_collect(scriptModule, outputFile);
|
||||||
|
} catch (err) {
|
||||||
|
log("Script failed: " + err + "\n" + err.stack);
|
||||||
|
Meta.exit(Meta.ExitCode.ERROR);
|
||||||
|
}
|
||||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||||
},
|
},
|
||||||
function(err) {
|
function(err) {
|
||||||
|
@ -465,8 +465,14 @@ const GridSearchResults = new Lang.Class({
|
|||||||
Name: 'GridSearchResults',
|
Name: 'GridSearchResults',
|
||||||
Extends: SearchResultsBase,
|
Extends: SearchResultsBase,
|
||||||
|
|
||||||
_init: function(provider) {
|
_init: function(provider, parentContainer) {
|
||||||
this.parent(provider);
|
this.parent(provider);
|
||||||
|
// We need to use the parent container to know how much results we can show.
|
||||||
|
// None of the actors in this class can be used for that, since the main actor
|
||||||
|
// goes hidden when no results are displayed, and then it lost its allocation.
|
||||||
|
// Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore
|
||||||
|
// it doesn't show any result although we have some.
|
||||||
|
this._parentContainer = parentContainer;
|
||||||
|
|
||||||
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
|
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
|
||||||
xAlign: St.Align.START });
|
xAlign: St.Align.START });
|
||||||
@ -477,7 +483,9 @@ const GridSearchResults = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getMaxDisplayedResults: function() {
|
_getMaxDisplayedResults: function() {
|
||||||
return this._grid.columnsForWidth(this._bin.width) * this._grid.getRowLimit();
|
let parentThemeNode = this._parentContainer.get_theme_node();
|
||||||
|
let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width);
|
||||||
|
return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
|
||||||
},
|
},
|
||||||
|
|
||||||
_renderResults: function(metas) {
|
_renderResults: function(metas) {
|
||||||
@ -577,7 +585,7 @@ const SearchResults = new Lang.Class({
|
|||||||
if (provider.appInfo)
|
if (provider.appInfo)
|
||||||
providerDisplay = new ListSearchResults(provider);
|
providerDisplay = new ListSearchResults(provider);
|
||||||
else
|
else
|
||||||
providerDisplay = new GridSearchResults(provider);
|
providerDisplay = new GridSearchResults(provider, this._content);
|
||||||
|
|
||||||
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||||
this._content.add(providerDisplay.actor);
|
this._content.add(providerDisplay.actor);
|
||||||
|
@ -44,6 +44,33 @@ const NM80211Mode = NetworkManager['80211Mode'];
|
|||||||
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
||||||
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
|
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
|
||||||
|
|
||||||
|
const PortalHelperResult = {
|
||||||
|
CANCELLED: 0,
|
||||||
|
COMPLETED: 1,
|
||||||
|
RECHECK: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
const PortalHelperIface = '<node> \
|
||||||
|
<interface name="org.gnome.Shell.PortalHelper"> \
|
||||||
|
<method name="Authenticate"> \
|
||||||
|
<arg type="o" direction="in" name="connection" /> \
|
||||||
|
<arg type="s" direction="in" name="url" /> \
|
||||||
|
<arg type="u" direction="in" name="timestamp" /> \
|
||||||
|
</method> \
|
||||||
|
<method name="Close"> \
|
||||||
|
<arg type="o" direction="in" name="connection" /> \
|
||||||
|
</method> \
|
||||||
|
<method name="Refresh"> \
|
||||||
|
<arg type="o" direction="in" name="connection" /> \
|
||||||
|
</method> \
|
||||||
|
<signal name="Done"> \
|
||||||
|
<arg type="o" name="connection" /> \
|
||||||
|
<arg type="u" name="result" /> \
|
||||||
|
</signal> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
const PortalHelperProxy = Gio.DBusProxy.makeProxyWrapper(PortalHelperIface);
|
||||||
|
|
||||||
function ssidCompare(one, two) {
|
function ssidCompare(one, two) {
|
||||||
if (!one || !two)
|
if (!one || !two)
|
||||||
return false;
|
return false;
|
||||||
@ -207,13 +234,23 @@ const NMConnectionSection = new Lang.Class({
|
|||||||
this.item.menu.addMenuItem(this._labelSection);
|
this.item.menu.addMenuItem(this._labelSection);
|
||||||
this.item.menu.addMenuItem(this._radioSection);
|
this.item.menu.addMenuItem(this._radioSection);
|
||||||
|
|
||||||
this.connect('icon-changed', Lang.bind(this, this._sync));
|
this._notifyConnectivityId = this._client.connect('notify::connectivity', Lang.bind(this, this._iconChanged));
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
|
if (this._notifyConnectivityId != 0) {
|
||||||
|
this._client.disconnect(this._notifyConnectivityId);
|
||||||
|
this._notifyConnectivityId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this.item.destroy();
|
this.item.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_iconChanged: function() {
|
||||||
|
this._sync();
|
||||||
|
this.emit('icon-changed');
|
||||||
|
},
|
||||||
|
|
||||||
_sync: function() {
|
_sync: function() {
|
||||||
let nItems = this._connectionItems.size;
|
let nItems = this._connectionItems.size;
|
||||||
|
|
||||||
@ -278,7 +315,7 @@ const NMConnectionSection = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
item.connect('icon-changed', Lang.bind(this, function() {
|
item.connect('icon-changed', Lang.bind(this, function() {
|
||||||
this.emit('icon-changed');
|
this._iconChanged();
|
||||||
}));
|
}));
|
||||||
item.connect('activation-failed', Lang.bind(this, function(item, reason) {
|
item.connect('activation-failed', Lang.bind(this, function(item, reason) {
|
||||||
this.emit('activation-failed', reason);
|
this.emit('activation-failed', reason);
|
||||||
@ -523,7 +560,7 @@ const NMDeviceModem = new Lang.Class({
|
|||||||
if (this._mobileDevice) {
|
if (this._mobileDevice) {
|
||||||
this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, this._sync));
|
this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, this._sync));
|
||||||
this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
|
this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
|
||||||
this.emit('icon-changed');
|
this._iconChanged();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1145,10 +1182,16 @@ const NMDeviceWireless = new Lang.Class({
|
|||||||
this._wirelessHwEnabledChangedId = this._client.connect('notify::wireless-hardware-enabled', Lang.bind(this, this._sync));
|
this._wirelessHwEnabledChangedId = this._client.connect('notify::wireless-hardware-enabled', Lang.bind(this, this._sync));
|
||||||
this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
|
this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
|
||||||
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||||
|
this._notifyConnectivityId = this._client.connect('notify::connectivity', Lang.bind(this, this._iconChanged));
|
||||||
|
|
||||||
this._sync();
|
this._sync();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_iconChanged: function() {
|
||||||
|
this._sync();
|
||||||
|
this.emit('icon-changed');
|
||||||
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
if (this._activeApChangedId) {
|
if (this._activeApChangedId) {
|
||||||
GObject.Object.prototype.disconnect.call(this._device, this._activeApChangedId);
|
GObject.Object.prototype.disconnect.call(this._device, this._activeApChangedId);
|
||||||
@ -1174,6 +1217,10 @@ const NMDeviceWireless = new Lang.Class({
|
|||||||
this._dialog.destroy();
|
this._dialog.destroy();
|
||||||
this._dialog = null;
|
this._dialog = null;
|
||||||
}
|
}
|
||||||
|
if (this._notifyConnectivityId) {
|
||||||
|
this._client.disconnect(this._notifyConnectivityId);
|
||||||
|
this._notifyConnectivityId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this.item.destroy();
|
this.item.destroy();
|
||||||
},
|
},
|
||||||
@ -1211,7 +1258,7 @@ const NMDeviceWireless = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_strengthChanged: function() {
|
_strengthChanged: function() {
|
||||||
this.emit('icon-changed');
|
this._iconChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
_activeApChanged: function() {
|
_activeApChanged: function() {
|
||||||
@ -1561,6 +1608,7 @@ const NMApplet = new Lang.Class({
|
|||||||
|
|
||||||
this._activeConnections = [ ];
|
this._activeConnections = [ ];
|
||||||
this._connections = [ ];
|
this._connections = [ ];
|
||||||
|
this._connectivityQueue = [ ];
|
||||||
|
|
||||||
this._mainConnection = null;
|
this._mainConnection = null;
|
||||||
this._mainConnectionIconChangedId = 0;
|
this._mainConnectionIconChangedId = 0;
|
||||||
@ -1589,6 +1637,7 @@ const NMApplet = new Lang.Class({
|
|||||||
this._client.connect('notify::primary-connection', Lang.bind(this, this._syncMainConnection));
|
this._client.connect('notify::primary-connection', Lang.bind(this, this._syncMainConnection));
|
||||||
this._client.connect('notify::activating-connection', Lang.bind(this, this._syncMainConnection));
|
this._client.connect('notify::activating-connection', Lang.bind(this, this._syncMainConnection));
|
||||||
this._client.connect('notify::active-connections', Lang.bind(this, this._syncVPNConnections));
|
this._client.connect('notify::active-connections', Lang.bind(this, this._syncVPNConnections));
|
||||||
|
this._client.connect('notify::connectivity', Lang.bind(this, this._syncConnectivity));
|
||||||
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
|
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
|
||||||
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
||||||
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
||||||
@ -1757,6 +1806,7 @@ const NMApplet = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._updateIcon();
|
this._updateIcon();
|
||||||
|
this._syncConnectivity();
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncVPNConnections: function() {
|
_syncVPNConnections: function() {
|
||||||
@ -1862,6 +1912,97 @@ const NMApplet = new Lang.Class({
|
|||||||
_syncNMState: function() {
|
_syncNMState: function() {
|
||||||
this.indicators.visible = this._client.manager_running;
|
this.indicators.visible = this._client.manager_running;
|
||||||
this.menu.actor.visible = this._client.networking_enabled;
|
this.menu.actor.visible = this._client.networking_enabled;
|
||||||
|
|
||||||
|
this._syncConnectivity();
|
||||||
|
},
|
||||||
|
|
||||||
|
_flushConnectivityQueue: function() {
|
||||||
|
if (this._portalHelperProxy) {
|
||||||
|
for (let item of this._connectivityQueue)
|
||||||
|
this._portalHelperProxy.CloseRemote(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._connectivityQueue = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
_closeConnectivityCheck: function(path) {
|
||||||
|
let index = this._connectivityQueue.indexOf(path);
|
||||||
|
|
||||||
|
if (index >= 0) {
|
||||||
|
if (this._portalHelperProxy)
|
||||||
|
this._portalHelperProxy.CloseRemote(path);
|
||||||
|
|
||||||
|
this._connectivityQueue.splice(index, 1);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_portalHelperDone: function(proxy, emitter, parameters) {
|
||||||
|
let [path, result] = parameters;
|
||||||
|
|
||||||
|
if (result == PortalHelperResult.CANCELLED) {
|
||||||
|
// Keep the connection in the queue, so the user is not
|
||||||
|
// spammed with more logins until we next flush the queue,
|
||||||
|
// which will happen once he chooses a better connection
|
||||||
|
// or we get to full connectivity through other means
|
||||||
|
} else if (result == PortalHelperResult.COMPLETED) {
|
||||||
|
this._closeConnectivityCheck(path);
|
||||||
|
return;
|
||||||
|
} else if (result == PortalHelperResult.RECHECK) {
|
||||||
|
this._client.check_connectivity_async(null, Lang.bind(this, function(client, result) {
|
||||||
|
try {
|
||||||
|
let state = client.check_connectivity_finish(result);
|
||||||
|
if (state >= NetworkManager.ConnectivityState.FULL)
|
||||||
|
this._closeConnectivityCheck(path);
|
||||||
|
} catch(e) { }
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
log('Invalid result from portal helper: ' + result);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncConnectivity: function() {
|
||||||
|
if (this._mainConnection == null ||
|
||||||
|
this._mainConnection.state != NetworkManager.ActiveConnectionState.ACTIVATED) {
|
||||||
|
this._flushConnectivityQueue();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let isPortal = this._client.connectivity == NetworkManager.ConnectivityState.PORTAL;
|
||||||
|
// For testing, allow interpreting any value != FULL as PORTAL, because
|
||||||
|
// LIMITED (no upstream route after the default gateway) is easy to obtain
|
||||||
|
// with a tethered phone
|
||||||
|
// NONE is also possible, with a connection configured to force no default route
|
||||||
|
// (but in general we should only prompt a portal if we know there is a portal)
|
||||||
|
if (GLib.getenv('GNOME_SHELL_CONNECTIVITY_TEST') != null)
|
||||||
|
isPortal = isPortal || this._client.connectivity < NetworkManager.ConnectivityState.FULL;
|
||||||
|
if (!isPortal)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let path = this._mainConnection.get_path();
|
||||||
|
for (let item of this._connectivityQueue) {
|
||||||
|
if (item == path)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let timestamp = global.get_current_time();
|
||||||
|
if (this._portalHelperProxy) {
|
||||||
|
this._portalHelperProxy.AuthenticateRemote(path, '', timestamp);
|
||||||
|
} else {
|
||||||
|
new PortalHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PortalHelper',
|
||||||
|
'/org/gnome/Shell/PortalHelper', Lang.bind(this, function (proxy, error) {
|
||||||
|
if (error) {
|
||||||
|
log('Error launching the portal helper: ' + error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._portalHelperProxy = proxy;
|
||||||
|
proxy.connectSignal('Done', Lang.bind(this, this._portalHelperDone));
|
||||||
|
|
||||||
|
proxy.AuthenticateRemote(path, '', timestamp);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._connectivityQueue.push(path);
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateIcon: function() {
|
_updateIcon: function() {
|
||||||
|
@ -151,11 +151,11 @@ const Indicator = new Lang.Class({
|
|||||||
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
Gio.BusNameWatcherFlags.NONE,
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._orentationExists = true;
|
this._orientationExists = true;
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
}),
|
}),
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._orentationExists = false;
|
this._orientationExists = false;
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
}));
|
}));
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
|
@ -49,6 +49,139 @@ function getTermsForSearchString(searchString) {
|
|||||||
return terms;
|
return terms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const EDGE_THRESHOLD = 20;
|
||||||
|
const DRAG_DISTANCE = 80;
|
||||||
|
|
||||||
|
const EdgeDragAction = new Lang.Class({
|
||||||
|
Name: 'EdgeDragAction',
|
||||||
|
Extends: Clutter.GestureAction,
|
||||||
|
|
||||||
|
_init : function(side) {
|
||||||
|
this.parent();
|
||||||
|
this._side = side;
|
||||||
|
this.set_n_touch_points(1);
|
||||||
|
|
||||||
|
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||||
|
this.cancel();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_getMonitorRect : function (x, y) {
|
||||||
|
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
|
||||||
|
let monitorIndex = global.screen.get_monitor_index_for_rect(rect);
|
||||||
|
|
||||||
|
return global.screen.get_monitor_geometry(monitorIndex);
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_prepare : function(action, actor) {
|
||||||
|
if (this.get_n_current_points() == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let [x, y] = this.get_press_coords(0);
|
||||||
|
let monitorRect = this._getMonitorRect(x, y);
|
||||||
|
|
||||||
|
return ((this._side == St.Side.LEFT && x < monitorRect.x + EDGE_THRESHOLD) ||
|
||||||
|
(this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) ||
|
||||||
|
(this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) ||
|
||||||
|
(this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD));
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_progress : function (action, actor) {
|
||||||
|
let [startX, startY] = this.get_press_coords(0);
|
||||||
|
let [x, y] = this.get_motion_coords(0);
|
||||||
|
let offsetX = Math.abs (x - startX);
|
||||||
|
let offsetY = Math.abs (y - startY);
|
||||||
|
|
||||||
|
if (offsetX < EDGE_THRESHOLD && offsetY < EDGE_THRESHOLD)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ((offsetX > offsetY &&
|
||||||
|
(this._side == St.Side.TOP || this._side == St.Side.BOTTOM)) ||
|
||||||
|
(offsetY > offsetX &&
|
||||||
|
(this._side == St.Side.LEFT || this._side == St.Side.RIGHT))) {
|
||||||
|
this.cancel();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_end : function (action, actor) {
|
||||||
|
let [startX, startY] = this.get_press_coords(0);
|
||||||
|
let [x, y] = this.get_motion_coords(0);
|
||||||
|
let monitorRect = this._getMonitorRect(startX, startY);
|
||||||
|
|
||||||
|
if ((this._side == St.Side.TOP && y > monitorRect.y + DRAG_DISTANCE) ||
|
||||||
|
(this._side == St.Side.BOTTOM && y < monitorRect.y + monitorRect.height - DRAG_DISTANCE) ||
|
||||||
|
(this._side == St.Side.LEFT && x > monitorRect.x + DRAG_DISTANCE) ||
|
||||||
|
(this._side == St.Side.RIGHT && x < monitorRect.x + monitorRect.width - DRAG_DISTANCE))
|
||||||
|
this.emit('activated');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(EdgeDragAction.prototype);
|
||||||
|
|
||||||
|
const ShowOverviewAction = new Lang.Class({
|
||||||
|
Name: 'ShowOverviewAction',
|
||||||
|
Extends: Clutter.GestureAction,
|
||||||
|
|
||||||
|
_init : function() {
|
||||||
|
this.parent();
|
||||||
|
this.set_n_touch_points(3);
|
||||||
|
|
||||||
|
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||||
|
this.cancel();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_prepare : function(action, actor) {
|
||||||
|
return this.get_n_current_points() == this.get_n_touch_points();
|
||||||
|
},
|
||||||
|
|
||||||
|
_getBoundingRect : function(motion) {
|
||||||
|
let minX, minY, maxX, maxY;
|
||||||
|
|
||||||
|
for (let i = 0; i < this.get_n_current_points(); i++) {
|
||||||
|
let x, y;
|
||||||
|
|
||||||
|
if (motion == true) {
|
||||||
|
[x, y] = this.get_motion_coords(i);
|
||||||
|
} else {
|
||||||
|
[x, y] = this.get_press_coords(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 0) {
|
||||||
|
minX = maxX = x;
|
||||||
|
minY = maxY = y;
|
||||||
|
} else {
|
||||||
|
minX = Math.min(minX, x);
|
||||||
|
minY = Math.min(minY, y);
|
||||||
|
maxX = Math.max(maxX, x);
|
||||||
|
maxY = Math.max(maxY, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Meta.Rectangle({ x: minX,
|
||||||
|
y: minY,
|
||||||
|
width: maxX - minX,
|
||||||
|
height: maxY - minY });
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_begin : function(action, actor) {
|
||||||
|
this._initialRect = this._getBoundingRect(false);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_end : function(action, actor) {
|
||||||
|
let rect = this._getBoundingRect(true);
|
||||||
|
let oldArea = this._initialRect.width * this._initialRect.height;
|
||||||
|
let newArea = rect.width * rect.height;
|
||||||
|
let areaDiff = newArea / oldArea;
|
||||||
|
|
||||||
|
this.emit('activated', areaDiff);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(ShowOverviewAction.prototype);
|
||||||
|
|
||||||
const ViewSelector = new Lang.Class({
|
const ViewSelector = new Lang.Class({
|
||||||
Name: 'ViewSelector',
|
Name: 'ViewSelector',
|
||||||
|
|
||||||
@ -83,10 +216,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
icon_name: 'edit-find-symbolic' }));
|
icon_name: 'edit-find-symbolic' }));
|
||||||
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
|
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
|
||||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||||
icon_name: 'edit-clear-rtl-symbolic' });
|
icon_name: 'edit-clear-symbolic-rtl' });
|
||||||
else
|
else
|
||||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||||
icon_name: 'edit-clear-symbolic' });
|
icon_name: 'edit-clear-symbolic-ltr' });
|
||||||
|
|
||||||
this._iconClickedId = 0;
|
this._iconClickedId = 0;
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
@ -145,6 +278,23 @@ const ViewSelector = new Lang.Class({
|
|||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
Lang.bind(Main.overview, Main.overview.toggle));
|
Lang.bind(Main.overview, Main.overview.toggle));
|
||||||
|
|
||||||
|
let gesture;
|
||||||
|
|
||||||
|
gesture = new EdgeDragAction(St.Side.LEFT);
|
||||||
|
gesture.connect('activated', Lang.bind(this, function() {
|
||||||
|
if (Main.overview.visible)
|
||||||
|
Main.overview.hide();
|
||||||
|
else
|
||||||
|
this.showApps();
|
||||||
|
}));
|
||||||
|
global.stage.add_action(gesture);
|
||||||
|
|
||||||
|
gesture = new ShowOverviewAction();
|
||||||
|
gesture.connect('activated', Lang.bind(this, function(action, areaDiff) {
|
||||||
|
if (areaDiff < 0.7)
|
||||||
|
Main.overview.show();
|
||||||
|
}));
|
||||||
|
global.stage.add_action(gesture);
|
||||||
},
|
},
|
||||||
|
|
||||||
_toggleAppsPage: function() {
|
_toggleAppsPage: function() {
|
||||||
@ -358,7 +508,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
|
|
||||||
startSearch: function(event) {
|
startSearch: function(event) {
|
||||||
global.stage.set_key_focus(this._text);
|
global.stage.set_key_focus(this._text);
|
||||||
this._text.event(event, true);
|
|
||||||
|
let synthEvent = event.copy();
|
||||||
|
synthEvent.set_source(this._text);
|
||||||
|
this._text.event(synthEvent, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
// the entry does not show the hint
|
// the entry does not show the hint
|
||||||
|
@ -9,6 +9,7 @@ const Meta = imports.gi.Meta;
|
|||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const AltTab = imports.ui.altTab;
|
const AltTab = imports.ui.altTab;
|
||||||
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
||||||
@ -456,6 +457,115 @@ const TilePreview = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const WorkspaceSwitchAction = new Lang.Class({
|
||||||
|
Name: 'WorkspaceSwitchAction',
|
||||||
|
Extends: Clutter.GestureAction,
|
||||||
|
|
||||||
|
_init : function() {
|
||||||
|
this.parent();
|
||||||
|
this.set_n_touch_points(4);
|
||||||
|
|
||||||
|
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||||
|
this.cancel();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_prepare : function(action, actor) {
|
||||||
|
return this.get_n_current_points() == this.get_n_touch_points();
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_end : function(action, actor) {
|
||||||
|
const MOTION_THRESHOLD = 50;
|
||||||
|
|
||||||
|
// Just check one touchpoint here
|
||||||
|
let [startX, startY] = this.get_press_coords(0);
|
||||||
|
let [x, y] = this.get_motion_coords(0);
|
||||||
|
let offsetX = x - startX;
|
||||||
|
let offsetY = y - startY;
|
||||||
|
let direction;
|
||||||
|
|
||||||
|
if (Math.abs(offsetX) < MOTION_THRESHOLD &&
|
||||||
|
Math.abs(offsetY) < MOTION_THRESHOLD)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Math.abs(offsetY) > Math.abs(offsetX)) {
|
||||||
|
if (offsetY > 0)
|
||||||
|
direction = Meta.MotionDirection.UP;
|
||||||
|
else
|
||||||
|
direction = Meta.MotionDirection.DOWN;
|
||||||
|
} else {
|
||||||
|
if (offsetX > 0)
|
||||||
|
direction = Meta.MotionDirection.LEFT;
|
||||||
|
else
|
||||||
|
direction = Meta.MotionDirection.RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.emit('activated', direction);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(WorkspaceSwitchAction.prototype);
|
||||||
|
|
||||||
|
const AppSwitchAction = new Lang.Class({
|
||||||
|
Name: 'AppSwitchAction',
|
||||||
|
Extends: Clutter.GestureAction,
|
||||||
|
|
||||||
|
_init : function() {
|
||||||
|
this.parent();
|
||||||
|
this.set_n_touch_points(3);
|
||||||
|
|
||||||
|
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||||
|
this.cancel();
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_prepare : function(action, actor) {
|
||||||
|
return this.get_n_current_points() <= 4;
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_begin : function(action, actor) {
|
||||||
|
// in milliseconds
|
||||||
|
const LONG_PRESS_TIMEOUT = 250;
|
||||||
|
|
||||||
|
let nPoints = this.get_n_current_points();
|
||||||
|
let event = this.get_last_event (nPoints - 1);
|
||||||
|
|
||||||
|
if (nPoints == 3)
|
||||||
|
this._longPressStartTime = event.get_time();
|
||||||
|
else if (nPoints == 4) {
|
||||||
|
// Check whether the 4th finger press happens after a 3-finger long press,
|
||||||
|
// this only needs to be checked on the first 4th finger press
|
||||||
|
if (this._longPressStartTime != null &&
|
||||||
|
event.get_time() < this._longPressStartTime + LONG_PRESS_TIMEOUT)
|
||||||
|
this.cancel();
|
||||||
|
else {
|
||||||
|
this._longPressStartTime = null;
|
||||||
|
this.emit('activated');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.get_n_current_points() <= 4;
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_gesture_progress : function(action, actor) {
|
||||||
|
const MOTION_THRESHOLD = 30;
|
||||||
|
|
||||||
|
if (this.get_n_current_points() == 3) {
|
||||||
|
for (let i = 0; i < this.get_n_current_points(); i++) {
|
||||||
|
[startX, startY] = this.get_press_coords(i);
|
||||||
|
[x, y] = this.get_motion_coords(i);
|
||||||
|
|
||||||
|
if (Math.abs(x - startX) > MOTION_THRESHOLD ||
|
||||||
|
Math.abs(y - startY) > MOTION_THRESHOLD)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Signals.addSignalMethods(AppSwitchAction.prototype);
|
||||||
|
|
||||||
const WindowManager = new Lang.Class({
|
const WindowManager = new Lang.Class({
|
||||||
Name: 'WindowManager',
|
Name: 'WindowManager',
|
||||||
|
|
||||||
@ -683,6 +793,53 @@ const WindowManager = new Lang.Class({
|
|||||||
|
|
||||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||||
false, -1, 1);
|
false, -1, 1);
|
||||||
|
|
||||||
|
let gesture = new WorkspaceSwitchAction();
|
||||||
|
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);
|
||||||
|
|
||||||
|
gesture = new AppSwitchAction();
|
||||||
|
gesture.connect('activated', Lang.bind(this, this._switchApp));
|
||||||
|
global.stage.add_action(gesture);
|
||||||
|
},
|
||||||
|
|
||||||
|
_lookupIndex: function (windows, metaWindow) {
|
||||||
|
for (let i = 0; i < windows.length; i++) {
|
||||||
|
if (windows[i].metaWindow == metaWindow) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
_switchApp : function () {
|
||||||
|
let windows = global.get_window_actors().filter(Lang.bind(this, function(actor) {
|
||||||
|
let win = actor.metaWindow;
|
||||||
|
return (!win.is_override_redirect() &&
|
||||||
|
win.located_on_workspace(global.screen.get_active_workspace()));
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (windows.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let focusWindow = global.display.focus_window;
|
||||||
|
let nextWindow;
|
||||||
|
|
||||||
|
if (focusWindow == null)
|
||||||
|
nextWindow = windows[0].metaWindow;
|
||||||
|
else {
|
||||||
|
let index = this._lookupIndex (windows, focusWindow) + 1;
|
||||||
|
|
||||||
|
if (index >= windows.length)
|
||||||
|
index = 0;
|
||||||
|
|
||||||
|
nextWindow = windows[index].metaWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
Main.activateWindow(nextWindow);
|
||||||
},
|
},
|
||||||
|
|
||||||
keepWorkspaceAlive: function(workspace, duration) {
|
keepWorkspaceAlive: function(workspace, duration) {
|
||||||
@ -903,7 +1060,7 @@ const WindowManager = new Lang.Class({
|
|||||||
/* Scale the window from the center of the parent */
|
/* Scale the window from the center of the parent */
|
||||||
this._checkDimming(actor.get_meta_window().get_transient_for());
|
this._checkDimming(actor.get_meta_window().get_transient_for());
|
||||||
actor.set_scale(1.0, 0.0);
|
actor.set_scale(1.0, 0.0);
|
||||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
actor.set_pivot_point(0.5, 0.5);
|
||||||
actor.show();
|
actor.show();
|
||||||
this._mapping.push(actor);
|
this._mapping.push(actor);
|
||||||
|
|
||||||
@ -977,7 +1134,7 @@ const WindowManager = new Lang.Class({
|
|||||||
this._checkDimming(parent, window);
|
this._checkDimming(parent, window);
|
||||||
|
|
||||||
actor.set_scale(1.0, 1.0);
|
actor.set_scale(1.0, 1.0);
|
||||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
actor.set_pivot_point(0.5, 0.5);
|
||||||
actor.show();
|
actor.show();
|
||||||
|
|
||||||
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
||||||
|
@ -239,6 +239,14 @@ const WindowClone = new Lang.Class({
|
|||||||
return this._boundingBox;
|
return this._boundingBox;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get width() {
|
||||||
|
return this._boundingBox.width;
|
||||||
|
},
|
||||||
|
|
||||||
|
get height() {
|
||||||
|
return this._boundingBox.height;
|
||||||
|
},
|
||||||
|
|
||||||
getOriginalPosition: function() {
|
getOriginalPosition: function() {
|
||||||
return [this._boundingBox.x, this._boundingBox.y];
|
return [this._boundingBox.x, this._boundingBox.y];
|
||||||
},
|
},
|
||||||
@ -257,7 +265,8 @@ const WindowClone = new Lang.Class({
|
|||||||
rect = rect.union(metaWindow.get_outer_rect());
|
rect = rect.union(metaWindow.get_outer_rect());
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
this._boundingBox = rect;
|
// Convert from a MetaRectangle to a native JS object
|
||||||
|
this._boundingBox = { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
|
||||||
this.actor.layout_manager.boundingBox = rect;
|
this.actor.layout_manager.boundingBox = rect;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -832,7 +841,7 @@ const LayoutStrategy = new Lang.Class({
|
|||||||
// thumbnails is much more important to preserve than the width of
|
// thumbnails is much more important to preserve than the width of
|
||||||
// them, so two windows with equal height, but maybe differering
|
// them, so two windows with equal height, but maybe differering
|
||||||
// widths line up.
|
// widths line up.
|
||||||
let ratio = window.actor.height / this._monitor.height;
|
let ratio = window.height / this._monitor.height;
|
||||||
|
|
||||||
// The purpose of this manipulation here is to prevent windows
|
// The purpose of this manipulation here is to prevent windows
|
||||||
// from getting too small. For something like a calculator window,
|
// from getting too small. For something like a calculator window,
|
||||||
@ -934,11 +943,11 @@ const LayoutStrategy = new Lang.Class({
|
|||||||
let window = row.windows[j];
|
let window = row.windows[j];
|
||||||
|
|
||||||
let s = scale * this._computeWindowScale(window) * row.additionalScale;
|
let s = scale * this._computeWindowScale(window) * row.additionalScale;
|
||||||
let cellWidth = window.actor.width * s;
|
let cellWidth = window.width * s;
|
||||||
let cellHeight = window.actor.height * s;
|
let cellHeight = window.height * s;
|
||||||
|
|
||||||
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
|
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
|
||||||
let cloneWidth = window.actor.width * s;
|
let cloneWidth = window.width * s;
|
||||||
|
|
||||||
let cloneX = x + (cellWidth - cloneWidth) / 2;
|
let cloneX = x + (cellWidth - cloneWidth) / 2;
|
||||||
let cloneY = row.y + row.height - cellHeight;
|
let cloneY = row.y + row.height - cellHeight;
|
||||||
@ -992,7 +1001,7 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
|||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
let window = windows[i];
|
let window = windows[i];
|
||||||
let s = this._computeWindowScale(window);
|
let s = this._computeWindowScale(window);
|
||||||
totalWidth += window.actor.width * s;
|
totalWidth += window.width * s;
|
||||||
}
|
}
|
||||||
|
|
||||||
let idealRowWidth = totalWidth / numRows;
|
let idealRowWidth = totalWidth / numRows;
|
||||||
@ -1005,8 +1014,8 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
|||||||
for (; windowIdx < windows.length; windowIdx++) {
|
for (; windowIdx < windows.length; windowIdx++) {
|
||||||
let window = windows[windowIdx];
|
let window = windows[windowIdx];
|
||||||
let s = this._computeWindowScale(window);
|
let s = this._computeWindowScale(window);
|
||||||
let width = window.actor.width * s;
|
let width = window.width * s;
|
||||||
let height = window.actor.height * s;
|
let height = window.height * s;
|
||||||
row.fullHeight = Math.max(row.fullHeight, height);
|
row.fullHeight = Math.max(row.fullHeight, height);
|
||||||
|
|
||||||
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
|
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
|
||||||
@ -1131,6 +1140,11 @@ const Workspace = new Lang.Class({
|
|||||||
|
|
||||||
this._positionWindowsFlags = 0;
|
this._positionWindowsFlags = 0;
|
||||||
this._positionWindowsId = 0;
|
this._positionWindowsId = 0;
|
||||||
|
|
||||||
|
this.actor.connect('notify::mapped', Lang.bind(this, function() {
|
||||||
|
if (this.actor.mapped)
|
||||||
|
this._syncActualGeometry();
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
setFullGeometry: function(geom) {
|
setFullGeometry: function(geom) {
|
||||||
@ -1138,7 +1152,9 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._fullGeometry = geom;
|
this._fullGeometry = geom;
|
||||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
|
||||||
|
if (this.actor.mapped)
|
||||||
|
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||||
},
|
},
|
||||||
|
|
||||||
setActualGeometry: function(geom) {
|
setActualGeometry: function(geom) {
|
||||||
@ -1146,18 +1162,29 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._actualGeometry = geom;
|
this._actualGeometry = geom;
|
||||||
|
this._actualGeometryDirty = true;
|
||||||
|
|
||||||
if (this._actualGeometryLater)
|
if (this.actor.mapped)
|
||||||
|
this._syncActualGeometry();
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncActualGeometry: function() {
|
||||||
|
if (this._actualGeometryLater || !this._actualGeometryDirty)
|
||||||
|
return;
|
||||||
|
if (!this._actualGeometry)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._actualGeometryLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
this._actualGeometryLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
||||||
|
this._actualGeometryLater = 0;
|
||||||
|
if (!this.actor.mapped)
|
||||||
|
return false;
|
||||||
|
|
||||||
let geom = this._actualGeometry;
|
let geom = this._actualGeometry;
|
||||||
|
|
||||||
this._dropRect.set_position(geom.x, geom.y);
|
this._dropRect.set_position(geom.x, geom.y);
|
||||||
this._dropRect.set_size(geom.width, geom.height);
|
this._dropRect.set_size(geom.width, geom.height);
|
||||||
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
||||||
|
|
||||||
this._actualGeometryLater = 0;
|
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@ -1231,6 +1258,12 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We will reposition windows when enter again overview anyway.
|
||||||
|
// In this way we avoid unwanted animations of windows repositioning while
|
||||||
|
// animating overview
|
||||||
|
if (this.leavingOverview)
|
||||||
|
return;
|
||||||
|
|
||||||
let initialPositioning = flags & WindowPositionFlags.INITIAL;
|
let initialPositioning = flags & WindowPositionFlags.INITIAL;
|
||||||
let animate = flags & WindowPositionFlags.ANIMATE;
|
let animate = flags & WindowPositionFlags.ANIMATE;
|
||||||
|
|
||||||
|
@ -74,12 +74,12 @@ const WorkspacesViewBase = new Lang.Class({
|
|||||||
|
|
||||||
setFullGeometry: function(geom) {
|
setFullGeometry: function(geom) {
|
||||||
this._fullGeometry = geom;
|
this._fullGeometry = geom;
|
||||||
this._syncGeometry();
|
this._syncFullGeometry();
|
||||||
},
|
},
|
||||||
|
|
||||||
setActualGeometry: function(geom) {
|
setActualGeometry: function(geom) {
|
||||||
this._actualGeometry = geom;
|
this._actualGeometry = geom;
|
||||||
this._syncGeometry();
|
this._syncActualGeometry();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -127,9 +127,12 @@ const WorkspacesView = new Lang.Class({
|
|||||||
this._workspaces[i].setReservedSlot(clone);
|
this._workspaces[i].setReservedSlot(clone);
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncGeometry: function() {
|
_syncFullGeometry: function() {
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncActualGeometry: function() {
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
||||||
},
|
},
|
||||||
@ -260,10 +263,12 @@ const WorkspacesView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._fullGeometry)
|
if (this._fullGeometry) {
|
||||||
this._updateWorkspaceActors(false);
|
this._updateWorkspaceActors(false);
|
||||||
|
this._syncFullGeometry();
|
||||||
this._syncGeometry();
|
}
|
||||||
|
if (this._actualGeometry)
|
||||||
|
this._syncActualGeometry();
|
||||||
},
|
},
|
||||||
|
|
||||||
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
||||||
@ -352,8 +357,11 @@ const ExtraWorkspaceView = new Lang.Class({
|
|||||||
this._workspace.setReservedSlot(clone);
|
this._workspace.setReservedSlot(clone);
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncGeometry: function() {
|
_syncFullGeometry: function() {
|
||||||
this._workspace.setFullGeometry(this._fullGeometry);
|
this._workspace.setFullGeometry(this._fullGeometry);
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncActualGeometry: function() {
|
||||||
this._workspace.setActualGeometry(this._actualGeometry);
|
this._workspace.setActualGeometry(this._actualGeometry);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -598,8 +606,9 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
let [x, y] = this.actor.get_transformed_position();
|
let [x, y] = this.actor.get_transformed_position();
|
||||||
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
|
let allocation = this.actor.allocation;
|
||||||
let height = this.actor.allocation.y2 - this.actor.allocation.y1;
|
let width = allocation.x2 - allocation.x1;
|
||||||
|
let height = allocation.y2 - allocation.y1;
|
||||||
let primaryGeometry = { x: x, y: y, width: width, height: height };
|
let primaryGeometry = { x: x, y: y, width: width, height: height };
|
||||||
|
|
||||||
let monitors = Main.layoutManager.monitors;
|
let monitors = Main.layoutManager.monitors;
|
||||||
|
@ -6,11 +6,13 @@ data/gnome-shell.desktop.in.in
|
|||||||
data/gnome-shell-extension-prefs.desktop.in.in
|
data/gnome-shell-extension-prefs.desktop.in.in
|
||||||
data/gnome-shell-wayland.desktop.in.in
|
data/gnome-shell-wayland.desktop.in.in
|
||||||
data/org.gnome.shell.gschema.xml.in.in
|
data/org.gnome.shell.gschema.xml.in.in
|
||||||
|
data/org.gnome.Shell.PortalHelper.desktop.in
|
||||||
js/extensionPrefs/main.js
|
js/extensionPrefs/main.js
|
||||||
js/gdm/authPrompt.js
|
js/gdm/authPrompt.js
|
||||||
js/gdm/loginDialog.js
|
js/gdm/loginDialog.js
|
||||||
js/gdm/util.js
|
js/gdm/util.js
|
||||||
js/misc/util.js
|
js/misc/util.js
|
||||||
|
js/portalHelper/main.js
|
||||||
js/ui/appDisplay.js
|
js/ui/appDisplay.js
|
||||||
js/ui/appFavorites.js
|
js/ui/appFavorites.js
|
||||||
js/ui/backgroundMenu.js
|
js/ui/backgroundMenu.js
|
||||||
|
211
po/es.po
211
po/es.po
@ -10,8 +10,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell.master\n"
|
"Project-Id-Version: gnome-shell.master\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: 2014-06-17 07:28+0000\n"
|
"POT-Creation-Date: 2014-07-22 07:35+0000\n"
|
||||||
"PO-Revision-Date: 2014-06-17 18:41+0200\n"
|
"PO-Revision-Date: 2014-07-22 11:27+0200\n"
|
||||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||||
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
|
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
@ -324,19 +324,23 @@ msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Retardo al cambiar el foco del ratón hasta que el puntero deja de moverse"
|
"Retardo al cambiar el foco del ratón hasta que el puntero deja de moverse"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:125
|
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
|
||||||
|
msgid "Captive Portal"
|
||||||
|
msgstr "Portal captivo"
|
||||||
|
|
||||||
|
#: ../js/extensionPrefs/main.js:127
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:"
|
msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:157
|
#: ../js/extensionPrefs/main.js:159
|
||||||
msgid "GNOME Shell Extensions"
|
msgid "GNOME Shell Extensions"
|
||||||
msgstr "Extensiones de GNOME Shell"
|
msgstr "Extensiones de GNOME Shell"
|
||||||
|
|
||||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
|
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:142
|
||||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/network.js:878
|
#: ../js/ui/status/network.js:915
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
@ -367,8 +371,8 @@ msgstr "¿No está en la lista?"
|
|||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(ej., usuario o %s)"
|
msgstr "(ej., usuario o %s)"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
|
||||||
#: ../js/ui/components/networkAgent.js:280
|
#: ../js/ui/components/networkAgent.js:286
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Nombre de usuario:"
|
msgstr "Nombre de usuario:"
|
||||||
|
|
||||||
@ -397,6 +401,10 @@ msgstr "No se pudo analizar el comando:"
|
|||||||
msgid "Execution of “%s” failed:"
|
msgid "Execution of “%s” failed:"
|
||||||
msgstr "Falló la ejecución de «%s»:"
|
msgstr "Falló la ejecución de «%s»:"
|
||||||
|
|
||||||
|
#: ../js/portalHelper/main.js:84
|
||||||
|
msgid "Web Authentication Redirect"
|
||||||
|
msgstr "Redirección para autenticación web"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:641
|
#: ../js/ui/appDisplay.js:641
|
||||||
msgid "Frequently used applications will appear here"
|
msgid "Frequently used applications will appear here"
|
||||||
msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
|
msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
|
||||||
@ -409,19 +417,19 @@ msgstr "Frecuentes"
|
|||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todas"
|
msgstr "Todas"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1569
|
#: ../js/ui/appDisplay.js:1613
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Ventana nueva"
|
msgstr "Ventana nueva"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1591 ../js/ui/dash.js:285
|
#: ../js/ui/appDisplay.js:1635 ../js/ui/dash.js:285
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Quitar de los favoritos"
|
msgstr "Quitar de los favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1597
|
#: ../js/ui/appDisplay.js:1641
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Añadir a los favoritos"
|
msgstr "Añadir a los favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1606
|
#: ../js/ui/appDisplay.js:1650
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Mostrar detalles"
|
msgstr "Mostrar detalles"
|
||||||
|
|
||||||
@ -435,7 +443,7 @@ msgstr "Se ha añadido %s a sus favoritos."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "Se ha quitado %s de sus favoritos."
|
msgstr "Se ha quitado %s de sus favoritos."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||||
#: ../js/ui/status/system.js:337
|
#: ../js/ui/status/system.js:337
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configuración"
|
msgstr "Configuración"
|
||||||
@ -569,35 +577,35 @@ msgid "Next month"
|
|||||||
msgstr "Siguiente mes"
|
msgstr "Siguiente mes"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events */
|
#. Translators: Text to show if there are no events */
|
||||||
#: ../js/ui/calendar.js:775
|
#: ../js/ui/calendar.js:785
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nada programado"
|
msgstr "Nada programado"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||||
#: ../js/ui/calendar.js:793
|
#: ../js/ui/calendar.js:803
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %d de %B"
|
msgstr "%A, %d de %B"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
||||||
#: ../js/ui/calendar.js:796
|
#: ../js/ui/calendar.js:806
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %d de %B de %Y"
|
msgstr "%A, %d de %B de %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:807
|
#: ../js/ui/calendar.js:817
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Hoy"
|
msgstr "Hoy"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:811
|
#: ../js/ui/calendar.js:821
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Mañana"
|
msgstr "Mañana"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:822
|
#: ../js/ui/calendar.js:832
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Esta semana"
|
msgstr "Esta semana"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:830
|
#: ../js/ui/calendar.js:840
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "La semana que viene"
|
msgstr "La semana que viene"
|
||||||
|
|
||||||
@ -630,40 +638,40 @@ msgstr "Contraseña:"
|
|||||||
msgid "Type again:"
|
msgid "Type again:"
|
||||||
msgstr "Escriba de nuevo:"
|
msgstr "Escriba de nuevo:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
|
||||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
|
||||||
msgid "Connect"
|
msgid "Connect"
|
||||||
msgstr "Conectar"
|
msgstr "Conectar"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:224
|
#: ../js/ui/components/networkAgent.js:230
|
||||||
#: ../js/ui/components/networkAgent.js:236
|
#: ../js/ui/components/networkAgent.js:242
|
||||||
#: ../js/ui/components/networkAgent.js:264
|
#: ../js/ui/components/networkAgent.js:270
|
||||||
#: ../js/ui/components/networkAgent.js:284
|
#: ../js/ui/components/networkAgent.js:290
|
||||||
#: ../js/ui/components/networkAgent.js:294
|
#: ../js/ui/components/networkAgent.js:300
|
||||||
msgid "Password: "
|
msgid "Password: "
|
||||||
msgstr "Contraseña: "
|
msgstr "Contraseña: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:229
|
#: ../js/ui/components/networkAgent.js:235
|
||||||
msgid "Key: "
|
msgid "Key: "
|
||||||
msgstr "Clave:"
|
msgstr "Clave:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:268
|
#: ../js/ui/components/networkAgent.js:274
|
||||||
msgid "Identity: "
|
msgid "Identity: "
|
||||||
msgstr "Identidad:"
|
msgstr "Identidad:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:270
|
#: ../js/ui/components/networkAgent.js:276
|
||||||
msgid "Private key password: "
|
msgid "Private key password: "
|
||||||
msgstr "Contraseña de la clave privada:"
|
msgstr "Contraseña de la clave privada:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:282
|
#: ../js/ui/components/networkAgent.js:288
|
||||||
msgid "Service: "
|
msgid "Service: "
|
||||||
msgstr "Servicio:"
|
msgstr "Servicio:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:311
|
#: ../js/ui/components/networkAgent.js:317
|
||||||
msgid "Authentication required by wireless network"
|
msgid "Authentication required by wireless network"
|
||||||
msgstr "La red inalámbrica requiere autenticación"
|
msgstr "La red inalámbrica requiere autenticación"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:312
|
#: ../js/ui/components/networkAgent.js:318
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Passwords or encryption keys are required to access the wireless network "
|
"Passwords or encryption keys are required to access the wireless network "
|
||||||
@ -672,35 +680,35 @@ msgstr ""
|
|||||||
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
|
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
|
||||||
"inalámbrica «%s»."
|
"inalámbrica «%s»."
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:316
|
#: ../js/ui/components/networkAgent.js:322
|
||||||
msgid "Wired 802.1X authentication"
|
msgid "Wired 802.1X authentication"
|
||||||
msgstr "Autenticación 802.1X cableada"
|
msgstr "Autenticación 802.1X cableada"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:318
|
#: ../js/ui/components/networkAgent.js:324
|
||||||
msgid "Network name: "
|
msgid "Network name: "
|
||||||
msgstr "Nombre de la red"
|
msgstr "Nombre de la red"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:323
|
#: ../js/ui/components/networkAgent.js:329
|
||||||
msgid "DSL authentication"
|
msgid "DSL authentication"
|
||||||
msgstr "Autenticación DSL"
|
msgstr "Autenticación DSL"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:330
|
#: ../js/ui/components/networkAgent.js:336
|
||||||
msgid "PIN code required"
|
msgid "PIN code required"
|
||||||
msgstr "Código PIN requerido"
|
msgstr "Código PIN requerido"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:331
|
#: ../js/ui/components/networkAgent.js:337
|
||||||
msgid "PIN code is needed for the mobile broadband device"
|
msgid "PIN code is needed for the mobile broadband device"
|
||||||
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
|
msgstr "Se necesita un código PIN para el dispositivo de banda ancha móvil"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:332
|
#: ../js/ui/components/networkAgent.js:338
|
||||||
msgid "PIN: "
|
msgid "PIN: "
|
||||||
msgstr "PIN: "
|
msgstr "PIN: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:338
|
#: ../js/ui/components/networkAgent.js:344
|
||||||
msgid "Mobile broadband network password"
|
msgid "Mobile broadband network password"
|
||||||
msgstr "Contraseña de la red de banda ancha móvil"
|
msgstr "Contraseña de la red de banda ancha móvil"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:339
|
#: ../js/ui/components/networkAgent.js:345
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "A password is required to connect to “%s”."
|
msgid "A password is required to connect to “%s”."
|
||||||
msgstr "Se requiere una contraseña para conectarse a «%s»."
|
msgstr "Se requiere una contraseña para conectarse a «%s»."
|
||||||
@ -1001,7 +1009,7 @@ msgstr "Ver cuenta"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Razón desconocida"
|
msgstr "Razón desconocida"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "Ventanas"
|
msgstr "Ventanas"
|
||||||
|
|
||||||
@ -1204,7 +1212,7 @@ msgstr "Activado"
|
|||||||
#. translators:
|
#. translators:
|
||||||
#. * The device has been disabled
|
#. * The device has been disabled
|
||||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Desactivado"
|
msgstr "Desactivado"
|
||||||
|
|
||||||
@ -1264,7 +1272,7 @@ msgstr "Bandeja de mensajes"
|
|||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Información del sistema"
|
msgstr "Información del sistema"
|
||||||
|
|
||||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconocido"
|
msgstr "Desconocido"
|
||||||
@ -1292,32 +1300,37 @@ msgstr "Vista general"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Escribir para buscar…"
|
msgstr "Escribir para buscar…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:516
|
#: ../js/ui/panel.js:515
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Salir"
|
msgstr "Salir"
|
||||||
|
|
||||||
#. 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:568
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Actividades"
|
msgstr "Actividades"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:915
|
#: ../js/ui/panel.js:914
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Barra superior"
|
msgstr "Barra superior"
|
||||||
|
|
||||||
#: ../js/ui/popupMenu.js:279
|
#: ../js/ui/popupMenu.js:274
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:74
|
#: ../js/ui/runDialog.js:70
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Introducir un comando"
|
msgstr "Introducir un comando"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:120
|
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Cerrar"
|
msgstr "Cerrar"
|
||||||
|
|
||||||
|
#: ../js/ui/runDialog.js:273
|
||||||
|
#| msgid "Estimating…"
|
||||||
|
msgid "Restarting…"
|
||||||
|
msgstr "Reiniciando…"
|
||||||
|
|
||||||
#. 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:88
|
#: ../js/ui/screenShield.js:88
|
||||||
@ -1347,11 +1360,11 @@ msgstr "No se pudo bloquear"
|
|||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Una aplicación impidió el bloqueo"
|
msgstr "Una aplicación impidió el bloqueo"
|
||||||
|
|
||||||
#: ../js/ui/search.js:606
|
#: ../js/ui/search.js:614
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Buscando…"
|
msgstr "Buscando…"
|
||||||
|
|
||||||
#: ../js/ui/search.js:652
|
#: ../js/ui/search.js:660
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "No se encontraron resultados."
|
msgstr "No se encontraron resultados."
|
||||||
|
|
||||||
@ -1427,9 +1440,9 @@ msgstr "Texto grande"
|
|||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281
|
||||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86
|
||||||
#: ../js/ui/status/rfkill.js:114
|
#: ../js/ui/status/rfkill.js:114
|
||||||
msgid "Turn Off"
|
msgid "Turn Off"
|
||||||
msgstr "Apagar"
|
msgstr "Apagar"
|
||||||
@ -1445,7 +1458,7 @@ msgid_plural "%d Connected Devices"
|
|||||||
msgstr[0] "%d dispositivo conectado"
|
msgstr[0] "%d dispositivo conectado"
|
||||||
msgstr[1] "%d dispositivos conectados"
|
msgstr[1] "%d dispositivos conectados"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
|
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
|
||||||
msgid "Not Connected"
|
msgid "Not Connected"
|
||||||
msgstr "No conectado"
|
msgstr "No conectado"
|
||||||
|
|
||||||
@ -1473,156 +1486,156 @@ msgstr "Activar"
|
|||||||
msgid "In Use"
|
msgid "In Use"
|
||||||
msgstr "En uso"
|
msgstr "En uso"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:74
|
#: ../js/ui/status/network.js:101
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<desconocido>"
|
msgstr "<desconocido>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
|
||||||
#: ../js/ui/status/network.js:1464
|
#: ../js/ui/status/network.js:1511
|
||||||
msgid "Off"
|
msgid "Off"
|
||||||
msgstr "Desconectado"
|
msgstr "Desconectado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:422
|
#: ../js/ui/status/network.js:459
|
||||||
msgid "Connected"
|
msgid "Connected"
|
||||||
msgstr "Conectada"
|
msgstr "Conectada"
|
||||||
|
|
||||||
#. 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) */
|
||||||
#: ../js/ui/status/network.js:426
|
#: ../js/ui/status/network.js:463
|
||||||
msgid "Unmanaged"
|
msgid "Unmanaged"
|
||||||
msgstr "Sin gestionar"
|
msgstr "Sin gestionar"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:428
|
#: ../js/ui/status/network.js:465
|
||||||
msgid "Disconnecting"
|
msgid "Disconnecting"
|
||||||
msgstr "Desconectando"
|
msgstr "Desconectando"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
|
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
|
||||||
msgid "Connecting"
|
msgid "Connecting"
|
||||||
msgstr "Conectando"
|
msgstr "Conectando"
|
||||||
|
|
||||||
#. 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:437
|
#: ../js/ui/status/network.js:474
|
||||||
msgid "Authentication required"
|
msgid "Authentication required"
|
||||||
msgstr "Autenticación requerida"
|
msgstr "Autenticación requerida"
|
||||||
|
|
||||||
#. 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 */
|
#. module, which is missing */
|
||||||
#: ../js/ui/status/network.js:445
|
#: ../js/ui/status/network.js:482
|
||||||
msgid "Firmware missing"
|
msgid "Firmware missing"
|
||||||
msgstr "Falta el «firmware»"
|
msgstr "Falta el «firmware»"
|
||||||
|
|
||||||
#. 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 */
|
#. is disabled by rfkill, or it has no coverage */
|
||||||
#: ../js/ui/status/network.js:449
|
#: ../js/ui/status/network.js:486
|
||||||
msgid "Unavailable"
|
msgid "Unavailable"
|
||||||
msgstr "No disponible"
|
msgstr "No disponible"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
|
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Falló la conexión"
|
msgstr "Falló la conexión"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:467
|
#: ../js/ui/status/network.js:504
|
||||||
msgid "Wired Settings"
|
msgid "Wired Settings"
|
||||||
msgstr "Configuración de Wi-Fi"
|
msgstr "Configuración de Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
|
||||||
msgid "Mobile Broadband Settings"
|
msgid "Mobile Broadband Settings"
|
||||||
msgstr "Configuración de banda ancha móvil"
|
msgstr "Configuración de banda ancha móvil"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
|
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
|
||||||
msgid "Hardware Disabled"
|
msgid "Hardware Disabled"
|
||||||
msgstr "Hardware desactivado"
|
msgstr "Hardware desactivado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:595
|
#: ../js/ui/status/network.js:632
|
||||||
msgid "Use as Internet connection"
|
msgid "Use as Internet connection"
|
||||||
msgstr "Usar como conexión a Internet"
|
msgstr "Usar como conexión a Internet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:776
|
#: ../js/ui/status/network.js:813
|
||||||
msgid "Airplane Mode is On"
|
msgid "Airplane Mode is On"
|
||||||
msgstr "El modo avión está activado"
|
msgstr "El modo avión está activado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:777
|
#: ../js/ui/status/network.js:814
|
||||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||||
msgstr "La Wi-Fi se desactiva cuando se activa el modo avión."
|
msgstr "La Wi-Fi se desactiva cuando se activa el modo avión."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:778
|
#: ../js/ui/status/network.js:815
|
||||||
msgid "Turn Off Airplane Mode"
|
msgid "Turn Off Airplane Mode"
|
||||||
msgstr "Apagar el modo avión"
|
msgstr "Apagar el modo avión"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:787
|
#: ../js/ui/status/network.js:824
|
||||||
msgid "Wi-Fi is Off"
|
msgid "Wi-Fi is Off"
|
||||||
msgstr "La Wi-Fi está desactivada"
|
msgstr "La Wi-Fi está desactivada"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:788
|
#: ../js/ui/status/network.js:825
|
||||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||||
msgstr "Se debe activar la Wi-Fi para poder conectarse a la red."
|
msgstr "Se debe activar la Wi-Fi para poder conectarse a la red."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:789
|
#: ../js/ui/status/network.js:826
|
||||||
msgid "Turn On Wi-Fi"
|
msgid "Turn On Wi-Fi"
|
||||||
msgstr "Activar la Wi-Fi"
|
msgstr "Activar la Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:814
|
#: ../js/ui/status/network.js:851
|
||||||
msgid "Wi-Fi Networks"
|
msgid "Wi-Fi Networks"
|
||||||
msgstr "Redes Wi-Fi"
|
msgstr "Redes Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:816
|
#: ../js/ui/status/network.js:853
|
||||||
msgid "Select a network"
|
msgid "Select a network"
|
||||||
msgstr "Seleccionar una red"
|
msgstr "Seleccionar una red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:845
|
#: ../js/ui/status/network.js:882
|
||||||
msgid "No Networks"
|
msgid "No Networks"
|
||||||
msgstr "No hay redes"
|
msgstr "No hay redes"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
|
||||||
msgid "Use hardware switch to turn off"
|
msgid "Use hardware switch to turn off"
|
||||||
msgstr "Usar el interruptor hardware para apagar"
|
msgstr "Usar el interruptor hardware para apagar"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1136
|
#: ../js/ui/status/network.js:1173
|
||||||
msgid "Select Network"
|
msgid "Select Network"
|
||||||
msgstr "Seleccionar red"
|
msgstr "Seleccionar red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1142
|
#: ../js/ui/status/network.js:1179
|
||||||
msgid "Wi-Fi Settings"
|
msgid "Wi-Fi Settings"
|
||||||
msgstr "Configuración de Wi-Fi"
|
msgstr "Configuración de Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:1281
|
||||||
msgid "Turn On"
|
msgid "Turn On"
|
||||||
msgstr "Enceder"
|
msgstr "Enceder"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1251
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "Hotspot Active"
|
msgid "Hotspot Active"
|
||||||
msgstr "Punto de acceso activo"
|
msgstr "Punto de acceso activo"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1362
|
#: ../js/ui/status/network.js:1409
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "conectando…"
|
msgstr "conectando…"
|
||||||
|
|
||||||
#. 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:1365
|
#: ../js/ui/status/network.js:1412
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "se necesita autenticación"
|
msgstr "se necesita autenticación"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1367
|
#: ../js/ui/status/network.js:1414
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "falló la conexión"
|
msgstr "falló la conexión"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Configuración de la red"
|
msgstr "Configuración de la red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1435
|
#: ../js/ui/status/network.js:1482
|
||||||
msgid "VPN Settings"
|
msgid "VPN Settings"
|
||||||
msgstr "Configuración de VPN"
|
msgstr "Configuración de VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1454
|
#: ../js/ui/status/network.js:1501
|
||||||
msgid "VPN"
|
msgid "VPN"
|
||||||
msgstr "VPN"
|
msgstr "VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1607
|
#: ../js/ui/status/network.js:1656
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Gestor de la red"
|
msgstr "Gestor de la red"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1647
|
#: ../js/ui/status/network.js:1696
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Falló la activación de la conexión de red"
|
msgstr "Falló la activación de la conexión de red"
|
||||||
|
|
||||||
@ -1704,11 +1717,11 @@ msgstr "Iniciar sesión como otro usuario"
|
|||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Desbloquear ventana"
|
msgstr "Desbloquear ventana"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:100
|
#: ../js/ui/viewSelector.js:233
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Aplicaciones"
|
msgstr "Aplicaciones"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:104
|
#: ../js/ui/viewSelector.js:237
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Buscar"
|
msgstr "Buscar"
|
||||||
|
|
||||||
@ -1717,22 +1730,22 @@ msgstr "Buscar"
|
|||||||
msgid "“%s” is ready"
|
msgid "“%s” is ready"
|
||||||
msgstr "«%s» está preparado"
|
msgstr "«%s» está preparado"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:57
|
#: ../js/ui/windowManager.js:58
|
||||||
msgid "Do you want to keep these display settings?"
|
msgid "Do you want to keep these display settings?"
|
||||||
msgstr "¿Quiere mantener esta configuración de la pantalla?"
|
msgstr "¿Quiere mantener esta configuración de la pantalla?"
|
||||||
|
|
||||||
#. 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:76
|
#: ../js/ui/windowManager.js:77
|
||||||
msgid "Revert Settings"
|
msgid "Revert Settings"
|
||||||
msgstr "Revertir configuración"
|
msgstr "Revertir configuración"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:80
|
#: ../js/ui/windowManager.js:81
|
||||||
msgid "Keep Changes"
|
msgid "Keep Changes"
|
||||||
msgstr "Mantener cambios"
|
msgstr "Mantener cambios"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:99
|
#: ../js/ui/windowManager.js:100
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Settings changes will revert in %d second"
|
msgid "Settings changes will revert in %d second"
|
||||||
msgid_plural "Settings changes will revert in %d seconds"
|
msgid_plural "Settings changes will revert in %d seconds"
|
||||||
|
342
po/pt_BR.po
342
po/pt_BR.po
@ -21,8 +21,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\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: 2014-06-03 07:28+0000\n"
|
"POT-Creation-Date: 2014-07-18 07:33+0000\n"
|
||||||
"PO-Revision-Date: 2014-06-03 10:26-0300\n"
|
"PO-Revision-Date: 2014-07-18 13:24-0300\n"
|
||||||
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
|
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
|
||||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||||
"Language: pt_BR\n"
|
"Language: pt_BR\n"
|
||||||
@ -139,18 +139,27 @@ msgstr ""
|
|||||||
"área de favoritos."
|
"área de favoritos."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||||
|
msgid "App Picker View"
|
||||||
|
msgstr "Visualização do seletor de aplicativos"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||||
|
msgid "Index of the currently selected view in the application picker."
|
||||||
|
msgstr ""
|
||||||
|
"Índice da visualização atualmente selecionada no seletor de aplicativos."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
msgstr "Histórico do diálogo de comandos (Alt-F2)"
|
msgstr "Histórico do diálogo de comandos (Alt-F2)"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||||
msgid "History for the looking glass dialog"
|
msgid "History for the looking glass dialog"
|
||||||
msgstr "Histórico do diálogo do shell looking glass"
|
msgstr "Histórico do diálogo do shell looking glass"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||||
msgid "Always show the 'Log out' menu item in the user menu."
|
msgid "Always show the 'Log out' menu item in the user menu."
|
||||||
msgstr "Sempre mostrar o item de menu \"Encerrar sessão\" no menu de usuário."
|
msgstr "Sempre mostrar o item de menu \"Encerrar sessão\" no menu de usuário."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
||||||
"user, single-session situations."
|
"user, single-session situations."
|
||||||
@ -159,14 +168,14 @@ msgstr ""
|
|||||||
"sessão\" quando houver somente um usuário, em situações de somente uma "
|
"sessão\" quando houver somente um usuário, em situações de somente uma "
|
||||||
"sessão."
|
"sessão."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||||
msgid ""
|
msgid ""
|
||||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Se lembra ou não as senhas para montar sistemas de arquivos criptografados "
|
"Se lembra ou não as senhas para montar sistemas de arquivos criptografados "
|
||||||
"ou remotos"
|
"ou remotos"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||||
msgid ""
|
msgid ""
|
||||||
"The shell will request a password when an encrypted device or a remote "
|
"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 "
|
"filesystem is mounted. If the password can be saved for future use a "
|
||||||
@ -178,70 +187,78 @@ msgstr ""
|
|||||||
"posterior, a caixa de seleção 'Lembrar senha' estará presente. Esta chave "
|
"posterior, a caixa de seleção 'Lembrar senha' estará presente. Esta chave "
|
||||||
"ajusta o estado padrão da caixa de seleção."
|
"ajusta o estado padrão da caixa de seleção."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
msgstr "Mostrar o número da semana na agenda"
|
msgstr "Mostrar o número da semana na agenda"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||||
msgid "If true, display the ISO week date in the calendar."
|
msgid "If true, display the ISO week date in the calendar."
|
||||||
msgstr "Se verdadeiro, exibe o número da semana na agenda."
|
msgstr "Se verdadeiro, exibe o número da semana na agenda."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||||
msgid "Keybinding to open the application menu"
|
msgid "Keybinding to open the application menu"
|
||||||
msgstr "Atalho de teclado para abrir um menu de aplicativo"
|
msgstr "Atalho de teclado para abrir um menu de aplicativo"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||||
msgid "Keybinding to open the application menu."
|
msgid "Keybinding to open the application menu."
|
||||||
msgstr "Atalho de teclado para abrir um menu de aplicativo."
|
msgstr "Atalho de teclado para abrir um menu de aplicativo."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||||
msgid "Keybinding to open the \"Show Applications\" view"
|
msgid "Keybinding to open the \"Show Applications\" view"
|
||||||
msgstr "Atalho de teclado para abrir a visualização \"Mostrar aplicativos\""
|
msgstr "Atalho de teclado para abrir a visualização \"Mostrar aplicativos\""
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||||
msgid ""
|
msgid ""
|
||||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Atalho de teclado para abrir a visualização \"Mostrar aplicativos\" do "
|
"Atalho de teclado para abrir a visualização \"Mostrar aplicativos\" do "
|
||||||
"panorama de atividades."
|
"panorama de atividades."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||||
msgid "Keybinding to open the overview"
|
msgid "Keybinding to open the overview"
|
||||||
msgstr "Atalho de teclado para abrir o panorama"
|
msgstr "Atalho de teclado para abrir o panorama"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||||
msgid "Keybinding to open the Activities Overview."
|
msgid "Keybinding to open the Activities Overview."
|
||||||
msgstr "Atalho de teclado para abrir o panorama de atividades."
|
msgstr "Atalho de teclado para abrir o panorama de atividades."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
#: ../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 message tray"
|
||||||
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação"
|
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
#: ../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 message tray."
|
||||||
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação."
|
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||||
msgid "Keybinding to focus the active notification"
|
msgid "Keybinding to focus the active notification"
|
||||||
msgstr "Atalho de teclado para ativar a notificação ativa"
|
msgstr "Atalho de teclado para ativar a notificação ativa"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||||
msgid "Keybinding to focus the active notification."
|
msgid "Keybinding to focus the active notification."
|
||||||
msgstr "Atalho de teclado para ativar a notificação ativa."
|
msgstr "Atalho de teclado para ativar a notificação ativa."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
# Tween pode significar uma contração de Between ou se referir a um termo "in-between" usado em animação gráfica. -- Enrico
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||||
|
msgid ""
|
||||||
|
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||||
|
msgstr ""
|
||||||
|
"Atalho de teclado que pausa e continua todos os intermediários em execução, "
|
||||||
|
"a fim de depuração"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||||
msgid "Which keyboard to use"
|
msgid "Which keyboard to use"
|
||||||
msgstr "Qual teclado usar"
|
msgstr "Qual teclado usar"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||||
msgid "The type of keyboard to use."
|
msgid "The type of keyboard to use."
|
||||||
msgstr "O tipo do teclado para usar."
|
msgstr "O tipo do teclado para usar."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||||
msgid "The maximum accuracy level of location."
|
msgid "The maximum accuracy level of location."
|
||||||
msgstr "O nível máximo de precisão de local."
|
msgstr "O nível máximo de precisão de local."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures the maximum level of location accuracy applications are allowed "
|
"Configures the maximum level of location accuracy applications are allowed "
|
||||||
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
||||||
@ -259,11 +276,24 @@ msgstr ""
|
|||||||
"recursos de rede (apesar de na melhor hipótese usarem precisão à nível de "
|
"recursos de rede (apesar de na melhor hipótese usarem precisão à nível de "
|
||||||
"rua)."
|
"rua)."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||||
|
msgid "Limit switcher to current workspace."
|
||||||
|
msgstr "Limitar o alternador ao espaço de trabalho atual."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||||
|
msgid ""
|
||||||
|
"If true, only applications that have windows on the current workspace are "
|
||||||
|
"shown in the switcher. Otherwise, all applications are included."
|
||||||
|
msgstr ""
|
||||||
|
"Se verdadeiro, o alternador mostrará somente os aplicativos que possuem "
|
||||||
|
"janelas no espaço de trabalho atual. Caso contrário, todos os aplicativos "
|
||||||
|
"serão incluídos."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||||
msgid "The application icon mode."
|
msgid "The application icon mode."
|
||||||
msgstr "O modo ícone do aplicativo."
|
msgstr "O modo ícone do aplicativo."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||||
@ -273,48 +303,59 @@ msgstr ""
|
|||||||
"válidas são 'thumbnail-only' (mostra uma miniatura da janela), 'app-icon-"
|
"válidas são 'thumbnail-only' (mostra uma miniatura da janela), 'app-icon-"
|
||||||
"only' (mostra apenas o ícone do aplicativo) ou 'both'."
|
"only' (mostra apenas o ícone do aplicativo) ou 'both'."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||||
|
msgid ""
|
||||||
|
"If true, only windows from the current workspace are shown in the switcher. "
|
||||||
|
"Otherwise, all windows are included."
|
||||||
|
msgstr ""
|
||||||
|
"Se verdadeiro, o alternador mostrará somente as janelas do espaço de "
|
||||||
|
"trabalho atual. Caso contrário, todos as janelas serão incluídas."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Anexar diálogo modal à janela pai"
|
msgstr "Anexar diálogo modal à janela pai"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Esta chave sobrescreve a chave em org.gnome.mutter ao executar o Shell do "
|
"Esta chave sobrescreve a chave em org.gnome.mutter ao executar o Shell do "
|
||||||
"GNOME."
|
"GNOME."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Habilitar contorno ladrilhado ao arrastar janelas sobre as bordas da tela"
|
"Habilitar contorno ladrilhado ao arrastar janelas sobre as bordas da tela"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
msgstr "Espaços de trabalho são gerenciados dinamicamente"
|
msgstr "Espaços de trabalho são gerenciados dinamicamente"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Espaços de trabalho apenas no monitor primário"
|
msgstr "Espaços de trabalho apenas no monitor primário"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||||
msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover"
|
msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
|
||||||
|
msgid "Captive Portal"
|
||||||
|
msgstr "Portal cativo"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:125
|
#: ../js/extensionPrefs/main.js:125
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:"
|
msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:157
|
#: ../js/extensionPrefs/main.js:157
|
||||||
#| msgid "Configure GNOME Shell Extensions"
|
|
||||||
msgid "GNOME Shell Extensions"
|
msgid "GNOME Shell Extensions"
|
||||||
msgstr "Extensões do Shell do GNOME"
|
msgstr "Extensões do Shell do GNOME"
|
||||||
|
|
||||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
|
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:142
|
||||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/network.js:878
|
#: ../js/ui/status/network.js:915
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
@ -345,8 +386,8 @@ msgstr "Não está listado?"
|
|||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(ex.: usuário ou %s)"
|
msgstr "(ex.: usuário ou %s)"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
|
||||||
#: ../js/ui/components/networkAgent.js:280
|
#: ../js/ui/components/networkAgent.js:286
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Nome de usuário: "
|
msgstr "Nome de usuário: "
|
||||||
|
|
||||||
@ -375,31 +416,35 @@ msgstr "Não foi possível analisar comando:"
|
|||||||
msgid "Execution of “%s” failed:"
|
msgid "Execution of “%s” failed:"
|
||||||
msgstr "A execução de \"%s\" falhou:"
|
msgstr "A execução de \"%s\" falhou:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:640
|
#: ../js/portalHelper/main.js:84
|
||||||
|
msgid "Web Authentication Redirect"
|
||||||
|
msgstr "Redirecionamento para autenticação web"
|
||||||
|
|
||||||
|
#: ../js/ui/appDisplay.js:641
|
||||||
msgid "Frequently used applications will appear here"
|
msgid "Frequently used applications will appear here"
|
||||||
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:751
|
#: ../js/ui/appDisplay.js:752
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Frequente"
|
msgstr "Frequente"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:758
|
#: ../js/ui/appDisplay.js:759
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1571
|
#: ../js/ui/appDisplay.js:1613
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nova janela"
|
msgstr "Nova janela"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1593 ../js/ui/dash.js:285
|
#: ../js/ui/appDisplay.js:1635 ../js/ui/dash.js:285
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Remover dos favoritos"
|
msgstr "Remover dos favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1599
|
#: ../js/ui/appDisplay.js:1641
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Adicionar aos favoritos"
|
msgstr "Adicionar aos favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1608
|
#: ../js/ui/appDisplay.js:1650
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Mostrar detalhes"
|
msgstr "Mostrar detalhes"
|
||||||
|
|
||||||
@ -413,7 +458,7 @@ msgstr "%s foi adicionado aos seus favoritos."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s foi removido dos seus favoritos."
|
msgstr "%s foi removido dos seus favoritos."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||||
#: ../js/ui/status/system.js:337
|
#: ../js/ui/status/system.js:337
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configurações"
|
msgstr "Configurações"
|
||||||
@ -547,35 +592,35 @@ msgid "Next month"
|
|||||||
msgstr "Próximo mês"
|
msgstr "Próximo mês"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events */
|
#. Translators: Text to show if there are no events */
|
||||||
#: ../js/ui/calendar.js:775
|
#: ../js/ui/calendar.js:785
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nada agendado"
|
msgstr "Nada agendado"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||||
#: ../js/ui/calendar.js:793
|
#: ../js/ui/calendar.js:803
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %d de %B"
|
msgstr "%A, %d de %B"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
||||||
#: ../js/ui/calendar.js:796
|
#: ../js/ui/calendar.js:806
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %d de %B de %Y"
|
msgstr "%A, %d de %B de %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:807
|
#: ../js/ui/calendar.js:817
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Hoje"
|
msgstr "Hoje"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:811
|
#: ../js/ui/calendar.js:821
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Amanhã"
|
msgstr "Amanhã"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:822
|
#: ../js/ui/calendar.js:832
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Esta semana"
|
msgstr "Esta semana"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:830
|
#: ../js/ui/calendar.js:840
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Próxima semana"
|
msgstr "Próxima semana"
|
||||||
|
|
||||||
@ -608,40 +653,40 @@ msgstr "Senha:"
|
|||||||
msgid "Type again:"
|
msgid "Type again:"
|
||||||
msgstr "Digite novamente:"
|
msgstr "Digite novamente:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
|
||||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
|
||||||
msgid "Connect"
|
msgid "Connect"
|
||||||
msgstr "Conectar"
|
msgstr "Conectar"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:224
|
#: ../js/ui/components/networkAgent.js:230
|
||||||
#: ../js/ui/components/networkAgent.js:236
|
#: ../js/ui/components/networkAgent.js:242
|
||||||
#: ../js/ui/components/networkAgent.js:264
|
#: ../js/ui/components/networkAgent.js:270
|
||||||
#: ../js/ui/components/networkAgent.js:284
|
#: ../js/ui/components/networkAgent.js:290
|
||||||
#: ../js/ui/components/networkAgent.js:294
|
#: ../js/ui/components/networkAgent.js:300
|
||||||
msgid "Password: "
|
msgid "Password: "
|
||||||
msgstr "Senha: "
|
msgstr "Senha: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:229
|
#: ../js/ui/components/networkAgent.js:235
|
||||||
msgid "Key: "
|
msgid "Key: "
|
||||||
msgstr "Chave: "
|
msgstr "Chave: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:268
|
#: ../js/ui/components/networkAgent.js:274
|
||||||
msgid "Identity: "
|
msgid "Identity: "
|
||||||
msgstr "Identidade: "
|
msgstr "Identidade: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:270
|
#: ../js/ui/components/networkAgent.js:276
|
||||||
msgid "Private key password: "
|
msgid "Private key password: "
|
||||||
msgstr "Senha da chave privada: "
|
msgstr "Senha da chave privada: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:282
|
#: ../js/ui/components/networkAgent.js:288
|
||||||
msgid "Service: "
|
msgid "Service: "
|
||||||
msgstr "Serviço: "
|
msgstr "Serviço: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:311
|
#: ../js/ui/components/networkAgent.js:317
|
||||||
msgid "Authentication required by wireless network"
|
msgid "Authentication required by wireless network"
|
||||||
msgstr "Autenticação requisitada pela rede sem fio"
|
msgstr "Autenticação requisitada pela rede sem fio"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:312
|
#: ../js/ui/components/networkAgent.js:318
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Passwords or encryption keys are required to access the wireless network "
|
"Passwords or encryption keys are required to access the wireless network "
|
||||||
@ -650,35 +695,35 @@ msgstr ""
|
|||||||
"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio "
|
"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio "
|
||||||
"\"%s\"."
|
"\"%s\"."
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:316
|
#: ../js/ui/components/networkAgent.js:322
|
||||||
msgid "Wired 802.1X authentication"
|
msgid "Wired 802.1X authentication"
|
||||||
msgstr "Autenticação 802.1X cabeada"
|
msgstr "Autenticação 802.1X cabeada"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:318
|
#: ../js/ui/components/networkAgent.js:324
|
||||||
msgid "Network name: "
|
msgid "Network name: "
|
||||||
msgstr "Nome da rede: "
|
msgstr "Nome da rede: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:323
|
#: ../js/ui/components/networkAgent.js:329
|
||||||
msgid "DSL authentication"
|
msgid "DSL authentication"
|
||||||
msgstr "Autenticação DSL"
|
msgstr "Autenticação DSL"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:330
|
#: ../js/ui/components/networkAgent.js:336
|
||||||
msgid "PIN code required"
|
msgid "PIN code required"
|
||||||
msgstr "Código PIN requisitado"
|
msgstr "Código PIN requisitado"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:331
|
#: ../js/ui/components/networkAgent.js:337
|
||||||
msgid "PIN code is needed for the mobile broadband device"
|
msgid "PIN code is needed for the mobile broadband device"
|
||||||
msgstr "O código PIN é necessário para o dispositivo móvel de banda larga"
|
msgstr "O código PIN é necessário para o dispositivo móvel de banda larga"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:332
|
#: ../js/ui/components/networkAgent.js:338
|
||||||
msgid "PIN: "
|
msgid "PIN: "
|
||||||
msgstr "PIN: "
|
msgstr "PIN: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:338
|
#: ../js/ui/components/networkAgent.js:344
|
||||||
msgid "Mobile broadband network password"
|
msgid "Mobile broadband network password"
|
||||||
msgstr "Senha da rede de banda larga móvel"
|
msgstr "Senha da rede de banda larga móvel"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:339
|
#: ../js/ui/components/networkAgent.js:345
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "A password is required to connect to “%s”."
|
msgid "A password is required to connect to “%s”."
|
||||||
msgstr "Uma senha é necessária para se conectar a \"%s\""
|
msgstr "Uma senha é necessária para se conectar a \"%s\""
|
||||||
@ -976,7 +1021,7 @@ msgstr "Visualizar conta"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Razão desconhecida"
|
msgstr "Razão desconhecida"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "Janelas"
|
msgstr "Janelas"
|
||||||
|
|
||||||
@ -988,23 +1033,23 @@ msgstr "Mostrar aplicativos"
|
|||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Dash"
|
msgstr "Dash"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Abrir agenda"
|
msgstr "Abrir agenda"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:101
|
#: ../js/ui/dateMenu.js:100
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Abrir relógios"
|
msgstr "Abrir relógios"
|
||||||
|
|
||||||
# O "&" foi inserido como "e" para versão 3.8.0 no gnome-control-center
|
# O "&" foi inserido como "e" para versão 3.8.0 no gnome-control-center
|
||||||
#: ../js/ui/dateMenu.js:108
|
#: ../js/ui/dateMenu.js:107
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Configurações de data & hora"
|
msgstr "Configurações de data & hora"
|
||||||
|
|
||||||
#. 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:205
|
#: ../js/ui/dateMenu.js:204
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %e de %B de %Y"
|
msgstr "%A, %e de %B de %Y"
|
||||||
|
|
||||||
@ -1085,7 +1130,7 @@ msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos."
|
|||||||
#: ../js/ui/endSessionDialog.js:121
|
#: ../js/ui/endSessionDialog.js:121
|
||||||
msgctxt "title"
|
msgctxt "title"
|
||||||
msgid "Restart & Install Updates"
|
msgid "Restart & Install Updates"
|
||||||
msgstr "Reiniciar & Instalar atualizações"
|
msgstr "Reiniciar & instalar atualizações"
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:123
|
#: ../js/ui/endSessionDialog.js:123
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
@ -1181,7 +1226,7 @@ msgstr "Habilitado"
|
|||||||
#. translators:
|
#. translators:
|
||||||
#. * The device has been disabled
|
#. * The device has been disabled
|
||||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Desabilitado"
|
msgstr "Desabilitado"
|
||||||
|
|
||||||
@ -1205,43 +1250,43 @@ msgstr "Ver fonte"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "Página web"
|
msgstr "Página web"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1326
|
#: ../js/ui/messageTray.js:1325
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "Abrir"
|
msgstr "Abrir"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1333
|
#: ../js/ui/messageTray.js:1332
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Remover"
|
msgstr "Remover"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1630
|
#: ../js/ui/messageTray.js:1629
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Notificações"
|
msgstr "Notificações"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1637
|
#: ../js/ui/messageTray.js:1636
|
||||||
msgid "Clear Messages"
|
msgid "Clear Messages"
|
||||||
msgstr "Sem mensagens"
|
msgstr "Sem mensagens"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1656
|
#: ../js/ui/messageTray.js:1655
|
||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Configurações de notificação"
|
msgstr "Configurações de notificação"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1709
|
#: ../js/ui/messageTray.js:1708
|
||||||
msgid "Tray Menu"
|
msgid "Tray Menu"
|
||||||
msgstr "Menu de notificação"
|
msgstr "Menu de notificação"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1926
|
#: ../js/ui/messageTray.js:1925
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Sem mensagens"
|
msgstr "Sem mensagens"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1964
|
#: ../js/ui/messageTray.js:1963
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Área de notificação"
|
msgstr "Área de notificação"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2967
|
#: ../js/ui/messageTray.js:2966
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Informações do sistema"
|
msgstr "Informações do sistema"
|
||||||
|
|
||||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconhecido"
|
msgstr "Desconhecido"
|
||||||
@ -1269,32 +1314,37 @@ msgstr "Panorama"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Digite para pesquisar…"
|
msgstr "Digite para pesquisar…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:516
|
#: ../js/ui/panel.js:515
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Sair"
|
msgstr "Sair"
|
||||||
|
|
||||||
#. 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:568
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Atividades"
|
msgstr "Atividades"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:915
|
#: ../js/ui/panel.js:914
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Barra superior"
|
msgstr "Barra superior"
|
||||||
|
|
||||||
#: ../js/ui/popupMenu.js:279
|
#: ../js/ui/popupMenu.js:274
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:74
|
#: ../js/ui/runDialog.js:70
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Digite um comando"
|
msgstr "Digite um comando"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:120
|
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Fechar"
|
msgstr "Fechar"
|
||||||
|
|
||||||
|
#: ../js/ui/runDialog.js:273
|
||||||
|
#| msgid "Estimating…"
|
||||||
|
msgid "Restarting…"
|
||||||
|
msgstr "Reiniciando…"
|
||||||
|
|
||||||
#. 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:88
|
#: ../js/ui/screenShield.js:88
|
||||||
@ -1404,9 +1454,9 @@ msgstr "Texto grande"
|
|||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281
|
||||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86
|
||||||
#: ../js/ui/status/rfkill.js:114
|
#: ../js/ui/status/rfkill.js:114
|
||||||
msgid "Turn Off"
|
msgid "Turn Off"
|
||||||
msgstr "Desligar"
|
msgstr "Desligar"
|
||||||
@ -1422,7 +1472,7 @@ msgid_plural "%d Connected Devices"
|
|||||||
msgstr[0] "%d dispositivo conectado"
|
msgstr[0] "%d dispositivo conectado"
|
||||||
msgstr[1] "%d dispositivos conectados"
|
msgstr[1] "%d dispositivos conectados"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
|
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
|
||||||
msgid "Not Connected"
|
msgid "Not Connected"
|
||||||
msgstr "Não conectado"
|
msgstr "Não conectado"
|
||||||
|
|
||||||
@ -1450,157 +1500,157 @@ msgstr "Habilitar"
|
|||||||
msgid "In Use"
|
msgid "In Use"
|
||||||
msgstr "Em uso"
|
msgstr "Em uso"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:74
|
#: ../js/ui/status/network.js:101
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<desconhecido>"
|
msgstr "<desconhecido>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
|
||||||
#: ../js/ui/status/network.js:1464
|
#: ../js/ui/status/network.js:1511
|
||||||
msgid "Off"
|
msgid "Off"
|
||||||
msgstr "Off"
|
msgstr "Off"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:422
|
#: ../js/ui/status/network.js:459
|
||||||
msgid "Connected"
|
msgid "Connected"
|
||||||
msgstr "Conectado"
|
msgstr "Conectado"
|
||||||
|
|
||||||
# Não gerenciável para transmitir a idéia que o Networkmanager não consegue gerenciar o dispositivo --Enrico
|
# Não gerenciável para transmitir a idéia que o Networkmanager não consegue gerenciar o dispositivo --Enrico
|
||||||
#. 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) */
|
||||||
#: ../js/ui/status/network.js:426
|
#: ../js/ui/status/network.js:463
|
||||||
msgid "Unmanaged"
|
msgid "Unmanaged"
|
||||||
msgstr "Não gerenciável"
|
msgstr "Não gerenciável"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:428
|
#: ../js/ui/status/network.js:465
|
||||||
msgid "Disconnecting"
|
msgid "Disconnecting"
|
||||||
msgstr "Desconectando"
|
msgstr "Desconectando"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
|
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
|
||||||
msgid "Connecting"
|
msgid "Connecting"
|
||||||
msgstr "Conectando"
|
msgstr "Conectando"
|
||||||
|
|
||||||
#. 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:437
|
#: ../js/ui/status/network.js:474
|
||||||
msgid "Authentication required"
|
msgid "Authentication required"
|
||||||
msgstr "Autenticação necessária"
|
msgstr "Autenticação necessária"
|
||||||
|
|
||||||
#. 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 */
|
#. module, which is missing */
|
||||||
#: ../js/ui/status/network.js:445
|
#: ../js/ui/status/network.js:482
|
||||||
msgid "Firmware missing"
|
msgid "Firmware missing"
|
||||||
msgstr "Firmware em falta"
|
msgstr "Firmware em falta"
|
||||||
|
|
||||||
#. 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 */
|
#. is disabled by rfkill, or it has no coverage */
|
||||||
#: ../js/ui/status/network.js:449
|
#: ../js/ui/status/network.js:486
|
||||||
msgid "Unavailable"
|
msgid "Unavailable"
|
||||||
msgstr "Indisponível"
|
msgstr "Indisponível"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
|
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Falha de conexão"
|
msgstr "Falha de conexão"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:467
|
#: ../js/ui/status/network.js:504
|
||||||
msgid "Wired Settings"
|
msgid "Wired Settings"
|
||||||
msgstr "Configurações da rede cabeada"
|
msgstr "Configurações da rede cabeada"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
|
||||||
msgid "Mobile Broadband Settings"
|
msgid "Mobile Broadband Settings"
|
||||||
msgstr "Configurações de banda larga móvel"
|
msgstr "Configurações de banda larga móvel"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
|
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
|
||||||
msgid "Hardware Disabled"
|
msgid "Hardware Disabled"
|
||||||
msgstr "Hardware desabilitado"
|
msgstr "Hardware desabilitado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:595
|
#: ../js/ui/status/network.js:632
|
||||||
msgid "Use as Internet connection"
|
msgid "Use as Internet connection"
|
||||||
msgstr "Usar como conexão de Internet"
|
msgstr "Usar como conexão de Internet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:776
|
#: ../js/ui/status/network.js:813
|
||||||
msgid "Airplane Mode is On"
|
msgid "Airplane Mode is On"
|
||||||
msgstr "Modo avião ligado"
|
msgstr "Modo avião ligado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:777
|
#: ../js/ui/status/network.js:814
|
||||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||||
msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado."
|
msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:778
|
#: ../js/ui/status/network.js:815
|
||||||
msgid "Turn Off Airplane Mode"
|
msgid "Turn Off Airplane Mode"
|
||||||
msgstr "Desligar modo avião"
|
msgstr "Desligar modo avião"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:787
|
#: ../js/ui/status/network.js:824
|
||||||
msgid "Wi-Fi is Off"
|
msgid "Wi-Fi is Off"
|
||||||
msgstr "Wi-Fi desligado"
|
msgstr "Wi-Fi desligado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:788
|
#: ../js/ui/status/network.js:825
|
||||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||||
msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede."
|
msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:789
|
#: ../js/ui/status/network.js:826
|
||||||
msgid "Turn On Wi-Fi"
|
msgid "Turn On Wi-Fi"
|
||||||
msgstr "Ligar Wi-Fi"
|
msgstr "Ligar Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:814
|
#: ../js/ui/status/network.js:851
|
||||||
msgid "Wi-Fi Networks"
|
msgid "Wi-Fi Networks"
|
||||||
msgstr "Redes Wi-Fi"
|
msgstr "Redes Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:816
|
#: ../js/ui/status/network.js:853
|
||||||
msgid "Select a network"
|
msgid "Select a network"
|
||||||
msgstr "Selecione uma rede"
|
msgstr "Selecione uma rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:845
|
#: ../js/ui/status/network.js:882
|
||||||
msgid "No Networks"
|
msgid "No Networks"
|
||||||
msgstr "Nenhuma rede"
|
msgstr "Nenhuma rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
|
||||||
msgid "Use hardware switch to turn off"
|
msgid "Use hardware switch to turn off"
|
||||||
msgstr "Usar alternador de hardware para desligar"
|
msgstr "Usar alternador de hardware para desligar"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1136
|
#: ../js/ui/status/network.js:1173
|
||||||
msgid "Select Network"
|
msgid "Select Network"
|
||||||
msgstr "Selecione a rede"
|
msgstr "Selecione a rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1142
|
#: ../js/ui/status/network.js:1179
|
||||||
msgid "Wi-Fi Settings"
|
msgid "Wi-Fi Settings"
|
||||||
msgstr "Configurações de Wi-Fi"
|
msgstr "Configurações de Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:1281
|
||||||
msgid "Turn On"
|
msgid "Turn On"
|
||||||
msgstr "Ligar"
|
msgstr "Ligar"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1251
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "Hotspot Active"
|
msgid "Hotspot Active"
|
||||||
msgstr "Ponto de acesso ativo"
|
msgstr "Ponto de acesso ativo"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1362
|
#: ../js/ui/status/network.js:1409
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "conectando..."
|
msgstr "conectando..."
|
||||||
|
|
||||||
#. 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:1365
|
#: ../js/ui/status/network.js:1412
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "autenticação necessária"
|
msgstr "autenticação necessária"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1367
|
#: ../js/ui/status/network.js:1414
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "conexão falhou"
|
msgstr "conexão falhou"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Configurações de rede"
|
msgstr "Configurações de rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1435
|
#: ../js/ui/status/network.js:1482
|
||||||
msgid "VPN Settings"
|
msgid "VPN Settings"
|
||||||
msgstr "Configurações de VPN"
|
msgstr "Configurações de VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1454
|
#: ../js/ui/status/network.js:1501
|
||||||
msgid "VPN"
|
msgid "VPN"
|
||||||
msgstr "VPN"
|
msgstr "VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1607
|
#: ../js/ui/status/network.js:1656
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Gerenciador de rede"
|
msgstr "Gerenciador de rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1647
|
#: ../js/ui/status/network.js:1696
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Falha ao ativar a conexão da rede"
|
msgstr "Falha ao ativar a conexão da rede"
|
||||||
|
|
||||||
@ -1684,11 +1734,11 @@ msgstr "Iniciar sessão como outro usuário"
|
|||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Desbloquear janela"
|
msgstr "Desbloquear janela"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:100
|
#: ../js/ui/viewSelector.js:233
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Aplicativos"
|
msgstr "Aplicativos"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:104
|
#: ../js/ui/viewSelector.js:237
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Pesquisar"
|
msgstr "Pesquisar"
|
||||||
|
|
||||||
@ -1697,22 +1747,22 @@ msgstr "Pesquisar"
|
|||||||
msgid "“%s” is ready"
|
msgid "“%s” is ready"
|
||||||
msgstr "\"%s\" está pronto"
|
msgstr "\"%s\" está pronto"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:57
|
#: ../js/ui/windowManager.js:58
|
||||||
msgid "Do you want to keep these display settings?"
|
msgid "Do you want to keep these display settings?"
|
||||||
msgstr "Você deseja manter essas configurações de exibição?"
|
msgstr "Você deseja manter essas configurações de exibição?"
|
||||||
|
|
||||||
#. 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:76
|
#: ../js/ui/windowManager.js:77
|
||||||
msgid "Revert Settings"
|
msgid "Revert Settings"
|
||||||
msgstr "Reverter configurações"
|
msgstr "Reverter configurações"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:80
|
#: ../js/ui/windowManager.js:81
|
||||||
msgid "Keep Changes"
|
msgid "Keep Changes"
|
||||||
msgstr "Manter alterações"
|
msgstr "Manter alterações"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:99
|
#: ../js/ui/windowManager.js:100
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Settings changes will revert in %d second"
|
msgid "Settings changes will revert in %d second"
|
||||||
msgid_plural "Settings changes will revert in %d seconds"
|
msgid_plural "Settings changes will revert in %d seconds"
|
||||||
@ -1785,19 +1835,19 @@ msgstr[1] "%u entradas"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Sons do sistema"
|
msgstr "Sons do sistema"
|
||||||
|
|
||||||
#: ../src/main.c:349
|
#: ../src/main.c:371
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Versão de impressão"
|
msgstr "Versão de impressão"
|
||||||
|
|
||||||
#: ../src/main.c:355
|
#: ../src/main.c:377
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Modo usado pelo GDM para a tela de início de sessão"
|
msgstr "Modo usado pelo GDM para a tela de início de sessão"
|
||||||
|
|
||||||
#: ../src/main.c:361
|
#: ../src/main.c:383
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr "Utilizar um modo específico, ex.: \"gdm\" para a tela de login"
|
msgstr "Utilizar um modo específico, ex.: \"gdm\" para a tela de login"
|
||||||
|
|
||||||
#: ../src/main.c:367
|
#: ../src/main.c:389
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Listar modos possíveis"
|
msgstr "Listar modos possíveis"
|
||||||
|
|
||||||
|
135
po/zh_TW.po
135
po/zh_TW.po
@ -9,16 +9,16 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell 3.3.90\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: 2014-03-19 20:32+0000\n"
|
"POT-Creation-Date: 2014-04-10 08:01+0000\n"
|
||||||
"PO-Revision-Date: 2014-03-21 21:41+0800\n"
|
"PO-Revision-Date: 2014-04-10 23:25+0800\n"
|
||||||
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
|
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\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"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
"X-Generator: Poedit 1.6.3\n"
|
"X-Generator: Poedit 1.6.4\n"
|
||||||
|
|
||||||
#: ../data/50-gnome-shell-system.xml.in.h:1
|
#: ../data/50-gnome-shell-system.xml.in.h:1
|
||||||
msgid "System"
|
msgid "System"
|
||||||
@ -308,25 +308,25 @@ msgctxt "button"
|
|||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "登入"
|
msgstr "登入"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:270
|
#: ../js/gdm/loginDialog.js:271
|
||||||
msgid "Choose Session"
|
msgid "Choose Session"
|
||||||
msgstr "選擇作業階段"
|
msgstr "選擇作業階段"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:430
|
#: ../js/gdm/loginDialog.js:431
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "沒有列出來?"
|
msgstr "沒有列出來?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:608
|
#: ../js/gdm/loginDialog.js:614
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(例如: user 或 %s)"
|
msgstr "(例如: user 或 %s)"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:613 ../js/ui/components/networkAgent.js:262
|
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
||||||
#: ../js/ui/components/networkAgent.js:280
|
#: ../js/ui/components/networkAgent.js:280
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "使用者名稱:"
|
msgstr "使用者名稱:"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:884
|
#: ../js/gdm/loginDialog.js:920
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "登入視窗"
|
msgstr "登入視窗"
|
||||||
|
|
||||||
@ -351,27 +351,27 @@ msgstr "無法分析指令:"
|
|||||||
msgid "Execution of “%s” failed:"
|
msgid "Execution of “%s” failed:"
|
||||||
msgstr "執行「%s」失敗:"
|
msgstr "執行「%s」失敗:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:629
|
#: ../js/ui/appDisplay.js:636
|
||||||
msgid "Frequently used applications will appear here"
|
msgid "Frequently used applications will appear here"
|
||||||
msgstr "經常使用的應用程式會出現在這裡"
|
msgstr "經常使用的應用程式會出現在這裡"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:740
|
#: ../js/ui/appDisplay.js:747
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "常用"
|
msgstr "常用"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:747
|
#: ../js/ui/appDisplay.js:754
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "全部"
|
msgstr "全部"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1555
|
#: ../js/ui/appDisplay.js:1566
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "新視窗"
|
msgstr "新視窗"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1577 ../js/ui/dash.js:285
|
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "自喜好中移除"
|
msgstr "自喜好中移除"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1583
|
#: ../js/ui/appDisplay.js:1594
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "加入喜好"
|
msgstr "加入喜好"
|
||||||
|
|
||||||
@ -788,13 +788,13 @@ msgstr "%s 正在邀請您加入 %s"
|
|||||||
#: ../js/ui/components/telepathyClient.js:1164
|
#: ../js/ui/components/telepathyClient.js:1164
|
||||||
#: ../js/ui/components/telepathyClient.js:1199
|
#: ../js/ui/components/telepathyClient.js:1199
|
||||||
#: ../js/ui/components/telepathyClient.js:1233
|
#: ../js/ui/components/telepathyClient.js:1233
|
||||||
#: ../js/ui/components/telepathyClient.js:1290
|
#: ../js/ui/components/telepathyClient.js:1291
|
||||||
msgid "Decline"
|
msgid "Decline"
|
||||||
msgstr "拒絕"
|
msgstr "拒絕"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1170
|
#: ../js/ui/components/telepathyClient.js:1170
|
||||||
#: ../js/ui/components/telepathyClient.js:1239
|
#: ../js/ui/components/telepathyClient.js:1239
|
||||||
#: ../js/ui/components/telepathyClient.js:1295
|
#: ../js/ui/components/telepathyClient.js:1296
|
||||||
msgid "Accept"
|
msgid "Accept"
|
||||||
msgstr "接受"
|
msgstr "接受"
|
||||||
|
|
||||||
@ -831,118 +831,118 @@ msgstr "%s 正傳送給您 %s"
|
|||||||
msgid "%s would like permission to see when you are online"
|
msgid "%s would like permission to see when you are online"
|
||||||
msgstr "%s 想要得到查看您上線狀態的許可"
|
msgstr "%s 想要得到查看您上線狀態的許可"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1341
|
#: ../js/ui/components/telepathyClient.js:1342
|
||||||
msgid "Network error"
|
msgid "Network error"
|
||||||
msgstr "網路錯誤"
|
msgstr "網路錯誤"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1343
|
#: ../js/ui/components/telepathyClient.js:1344
|
||||||
msgid "Authentication failed"
|
msgid "Authentication failed"
|
||||||
msgstr "核對失敗"
|
msgstr "核對失敗"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1345
|
#: ../js/ui/components/telepathyClient.js:1346
|
||||||
msgid "Encryption error"
|
msgid "Encryption error"
|
||||||
msgstr "加密發生錯誤"
|
msgstr "加密發生錯誤"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1347
|
#: ../js/ui/components/telepathyClient.js:1348
|
||||||
msgid "Certificate not provided"
|
msgid "Certificate not provided"
|
||||||
msgstr "沒有提供憑證"
|
msgstr "沒有提供憑證"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1349
|
#: ../js/ui/components/telepathyClient.js:1350
|
||||||
msgid "Certificate untrusted"
|
msgid "Certificate untrusted"
|
||||||
msgstr "憑證不被信任"
|
msgstr "憑證不被信任"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1351
|
#: ../js/ui/components/telepathyClient.js:1352
|
||||||
msgid "Certificate expired"
|
msgid "Certificate expired"
|
||||||
msgstr "憑證已逾期"
|
msgstr "憑證已逾期"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1353
|
#: ../js/ui/components/telepathyClient.js:1354
|
||||||
msgid "Certificate not activated"
|
msgid "Certificate not activated"
|
||||||
msgstr "憑證尚未使用"
|
msgstr "憑證尚未使用"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1355
|
#: ../js/ui/components/telepathyClient.js:1356
|
||||||
msgid "Certificate hostname mismatch"
|
msgid "Certificate hostname mismatch"
|
||||||
msgstr "憑證主機名稱不符"
|
msgstr "憑證主機名稱不符"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1357
|
#: ../js/ui/components/telepathyClient.js:1358
|
||||||
msgid "Certificate fingerprint mismatch"
|
msgid "Certificate fingerprint mismatch"
|
||||||
msgstr "憑證數位指紋不符"
|
msgstr "憑證數位指紋不符"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1359
|
#: ../js/ui/components/telepathyClient.js:1360
|
||||||
msgid "Certificate self-signed"
|
msgid "Certificate self-signed"
|
||||||
msgstr "憑證為自我簽署"
|
msgstr "憑證為自我簽署"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1361
|
#: ../js/ui/components/telepathyClient.js:1362
|
||||||
msgid "Status is set to offline"
|
msgid "Status is set to offline"
|
||||||
msgstr "狀態設為離線"
|
msgstr "狀態設為離線"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1363
|
#: ../js/ui/components/telepathyClient.js:1364
|
||||||
msgid "Encryption is not available"
|
msgid "Encryption is not available"
|
||||||
msgstr "加密無法使用"
|
msgstr "加密無法使用"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1365
|
#: ../js/ui/components/telepathyClient.js:1366
|
||||||
msgid "Certificate is invalid"
|
msgid "Certificate is invalid"
|
||||||
msgstr "憑證無效"
|
msgstr "憑證無效"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1367
|
#: ../js/ui/components/telepathyClient.js:1368
|
||||||
msgid "Connection has been refused"
|
msgid "Connection has been refused"
|
||||||
msgstr "連線遭到拒絕"
|
msgstr "連線遭到拒絕"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1369
|
#: ../js/ui/components/telepathyClient.js:1370
|
||||||
msgid "Connection can't be established"
|
msgid "Connection can't be established"
|
||||||
msgstr "無法建立連線"
|
msgstr "無法建立連線"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1371
|
#: ../js/ui/components/telepathyClient.js:1372
|
||||||
msgid "Connection has been lost"
|
msgid "Connection has been lost"
|
||||||
msgstr "已失去連線"
|
msgstr "已失去連線"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1373
|
#: ../js/ui/components/telepathyClient.js:1374
|
||||||
msgid "This account is already connected to the server"
|
msgid "This account is already connected to the server"
|
||||||
msgstr "這個帳號已連接至該伺服器"
|
msgstr "這個帳號已連接至該伺服器"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1375
|
#: ../js/ui/components/telepathyClient.js:1376
|
||||||
msgid ""
|
msgid ""
|
||||||
"Connection has been replaced by a new connection using the same resource"
|
"Connection has been replaced by a new connection using the same resource"
|
||||||
msgstr "連線已被使用相同資源的新連線取代"
|
msgstr "連線已被使用相同資源的新連線取代"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1377
|
#: ../js/ui/components/telepathyClient.js:1378
|
||||||
msgid "The account already exists on the server"
|
msgid "The account already exists on the server"
|
||||||
msgstr "該帳號已經存在於伺服器上"
|
msgstr "該帳號已經存在於伺服器上"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1379
|
#: ../js/ui/components/telepathyClient.js:1380
|
||||||
msgid "Server is currently too busy to handle the connection"
|
msgid "Server is currently too busy to handle the connection"
|
||||||
msgstr "伺服器目前過於忙碌以致於無法處理該連線"
|
msgstr "伺服器目前過於忙碌以致於無法處理該連線"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1381
|
#: ../js/ui/components/telepathyClient.js:1382
|
||||||
msgid "Certificate has been revoked"
|
msgid "Certificate has been revoked"
|
||||||
msgstr "憑證已被撤銷"
|
msgstr "憑證已被撤銷"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1383
|
#: ../js/ui/components/telepathyClient.js:1384
|
||||||
msgid ""
|
msgid ""
|
||||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
msgstr "憑證使用不安全的密碼演算法,或是密碼處理上較弱"
|
msgstr "憑證使用不安全的密碼演算法,或是密碼處理上較弱"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1385
|
#: ../js/ui/components/telepathyClient.js:1386
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
"The length of the server certificate, or the depth of the server certificate "
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
"chain, exceed the limits imposed by the cryptography library"
|
||||||
msgstr "伺服器憑證的長度,或是伺服器憑證鏈的深度超過密碼函式庫所能處理的範圍"
|
msgstr "伺服器憑證的長度,或是伺服器憑證鏈的深度超過密碼函式庫所能處理的範圍"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1387
|
#: ../js/ui/components/telepathyClient.js:1388
|
||||||
msgid "Internal error"
|
msgid "Internal error"
|
||||||
msgstr "內部的錯誤"
|
msgstr "內部的錯誤"
|
||||||
|
|
||||||
#. translators: argument is the account name, like
|
#. translators: argument is the account name, like
|
||||||
#. * name@jabber.org for example. */
|
#. * name@jabber.org for example. */
|
||||||
#: ../js/ui/components/telepathyClient.js:1397
|
#: ../js/ui/components/telepathyClient.js:1398
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Unable to connect to %s"
|
msgid "Unable to connect to %s"
|
||||||
msgstr "無法連線到 %s"
|
msgstr "無法連線到 %s"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1402
|
#: ../js/ui/components/telepathyClient.js:1403
|
||||||
msgid "View account"
|
msgid "View account"
|
||||||
msgstr "檢視帳號"
|
msgstr "檢視帳號"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1439
|
#: ../js/ui/components/telepathyClient.js:1440
|
||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "不明原因"
|
msgstr "不明原因"
|
||||||
|
|
||||||
@ -1129,7 +1129,8 @@ msgstr "隱藏錯誤"
|
|||||||
msgid "Show Errors"
|
msgid "Show Errors"
|
||||||
msgstr "顯示錯誤"
|
msgstr "顯示錯誤"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:716
|
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
|
||||||
|
#: ../js/ui/status/location.js:167
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr "已啟用"
|
msgstr "已啟用"
|
||||||
|
|
||||||
@ -1137,8 +1138,8 @@ msgstr "已啟用"
|
|||||||
#. because it's disabled by rfkill (airplane mode) */
|
#. because it's disabled by rfkill (airplane mode) */
|
||||||
#. translators:
|
#. translators:
|
||||||
#. * The device has been disabled
|
#. * The device has been disabled
|
||||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/network.js:555
|
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||||
#: ../src/gvc/gvc-mixer-control.c:1830
|
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "已停用"
|
msgstr "已停用"
|
||||||
|
|
||||||
@ -1283,7 +1284,7 @@ msgstr "鎖定被應用程式阻擋"
|
|||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "搜尋…"
|
msgstr "搜尋…"
|
||||||
|
|
||||||
#: ../js/ui/search.js:646
|
#: ../js/ui/search.js:649
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "沒有結果。"
|
msgstr "沒有結果。"
|
||||||
|
|
||||||
@ -1359,8 +1360,7 @@ msgstr "大型文字"
|
|||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "藍牙"
|
msgstr "藍牙"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/location.js:60
|
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
||||||
#: ../js/ui/status/location.js:167 ../js/ui/status/network.js:151
|
|
||||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
||||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85
|
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85
|
||||||
#: ../js/ui/status/rfkill.js:105
|
#: ../js/ui/status/rfkill.js:105
|
||||||
@ -1393,24 +1393,29 @@ msgstr "顯示鍵盤配置"
|
|||||||
msgid "Location"
|
msgid "Location"
|
||||||
msgstr "位置"
|
msgstr "位置"
|
||||||
|
|
||||||
#: ../js/ui/status/location.js:59 ../js/ui/status/location.js:166
|
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
|
||||||
#: ../js/ui/status/rfkill.js:84
|
#| msgid "Disabled"
|
||||||
msgid "On"
|
msgid "Disable"
|
||||||
msgstr "開啟"
|
msgstr "停用"
|
||||||
|
|
||||||
#: ../js/ui/status/location.js:163 ../js/ui/status/network.js:420
|
#: ../js/ui/status/location.js:165
|
||||||
#: ../js/ui/status/network.js:1260 ../js/ui/status/network.js:1464
|
#| msgid "Enabled"
|
||||||
msgid "Off"
|
msgid "Enable"
|
||||||
msgstr "關閉"
|
msgstr "啟用"
|
||||||
|
|
||||||
#: ../js/ui/status/location.js:164 ../js/ui/status/network.js:1234
|
#: ../js/ui/status/location.js:167
|
||||||
msgid "Turn On"
|
msgid "In Use"
|
||||||
msgstr "開啟"
|
msgstr "使用中"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:74
|
#: ../js/ui/status/network.js:74
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<不明>"
|
msgstr "<不明>"
|
||||||
|
|
||||||
|
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
||||||
|
#: ../js/ui/status/network.js:1464
|
||||||
|
msgid "Off"
|
||||||
|
msgstr "關閉"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:422
|
#: ../js/ui/status/network.js:422
|
||||||
msgid "Connected"
|
msgid "Connected"
|
||||||
msgstr "已連線"
|
msgstr "已連線"
|
||||||
@ -1514,6 +1519,10 @@ msgstr "選擇網路"
|
|||||||
msgid "Wi-Fi Settings"
|
msgid "Wi-Fi Settings"
|
||||||
msgstr "Wi-Fi 設定值"
|
msgstr "Wi-Fi 設定值"
|
||||||
|
|
||||||
|
#: ../js/ui/status/network.js:1234
|
||||||
|
msgid "Turn On"
|
||||||
|
msgstr "開啟"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1251
|
#: ../js/ui/status/network.js:1251
|
||||||
msgid "Hotspot Active"
|
msgid "Hotspot Active"
|
||||||
msgstr "熱點活動中"
|
msgstr "熱點活動中"
|
||||||
@ -1580,6 +1589,10 @@ msgstr "電池"
|
|||||||
msgid "Airplane Mode"
|
msgid "Airplane Mode"
|
||||||
msgstr "飛安模式"
|
msgstr "飛安模式"
|
||||||
|
|
||||||
|
#: ../js/ui/status/rfkill.js:84
|
||||||
|
msgid "On"
|
||||||
|
msgstr "開啟"
|
||||||
|
|
||||||
#: ../js/ui/status/system.js:314
|
#: ../js/ui/status/system.js:314
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "切換使用者"
|
msgstr "切換使用者"
|
||||||
|
@ -199,6 +199,21 @@ nodist_gnome_shell_extension_prefs_SOURCES = \
|
|||||||
gnome_shell_extension_prefs_CPPFLAGS = $(gnome_shell_cflags)
|
gnome_shell_extension_prefs_CPPFLAGS = $(gnome_shell_cflags)
|
||||||
gnome_shell_extension_prefs_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
|
gnome_shell_extension_prefs_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
|
||||||
|
|
||||||
|
if HAVE_NETWORKMANAGER
|
||||||
|
|
||||||
|
libexec_PROGRAMS += gnome-shell-portal-helper
|
||||||
|
gnome_shell_portal_helper_SOURCES = \
|
||||||
|
gnome-shell-portal-helper.c \
|
||||||
|
$(NULL)
|
||||||
|
nodist_gnome_shell_portal_helper_SOURCES = \
|
||||||
|
$(top_builddir)/js/js-resources.c \
|
||||||
|
$(top_builddir)/js/js-resources.h \
|
||||||
|
$(NULL)
|
||||||
|
gnome_shell_portal_helper_CPPFLAGS = $(gnome_shell_cflags)
|
||||||
|
gnome_shell_portal_helper_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
|
|
||||||
libgnome_shell_js_la_SOURCES = \
|
libgnome_shell_js_la_SOURCES = \
|
||||||
@ -242,7 +257,7 @@ libexec_PROGRAMS += gnome-shell-perf-helper
|
|||||||
|
|
||||||
gnome_shell_perf_helper_SOURCES = shell-perf-helper.c
|
gnome_shell_perf_helper_SOURCES = shell-perf-helper.c
|
||||||
gnome_shell_perf_helper_CPPFLAGS = $(SHELL_PERF_HELPER_CFLAGS)
|
gnome_shell_perf_helper_CPPFLAGS = $(SHELL_PERF_HELPER_CFLAGS)
|
||||||
gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS)
|
gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS) -lm
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
|
|
||||||
|
@ -42,8 +42,8 @@ function _showHello() {
|
|||||||
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
let monitor = Main.layoutManager.primaryMonitor;
|
||||||
|
|
||||||
text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
|
text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
|
||||||
Math.floor(monitor.height / 2 - text.height / 2));
|
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
|
||||||
|
|
||||||
Tweener.addTween(text,
|
Tweener.addTween(text,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
|
@ -75,7 +75,9 @@ def start_shell(perf_output=None):
|
|||||||
# Set up environment
|
# Set up environment
|
||||||
env = dict(os.environ)
|
env = dict(os.environ)
|
||||||
env['SHELL_PERF_MODULE'] = options.perf
|
env['SHELL_PERF_MODULE'] = options.perf
|
||||||
env['MUTTER_WM_CLASS_FILTER'] = 'Gnome-shell-perf-helper'
|
|
||||||
|
filters = ['Gnome-shell-perf-helper'] + options.extra_filter
|
||||||
|
env['MUTTER_WM_CLASS_FILTER'] = ','.join(filters)
|
||||||
|
|
||||||
if perf_output is not None:
|
if perf_output is not None:
|
||||||
env['SHELL_PERF_OUTPUT'] = perf_output
|
env['SHELL_PERF_OUTPUT'] = perf_output
|
||||||
@ -189,6 +191,11 @@ def upload_performance_report(report_text):
|
|||||||
print "Performance report upload failed with status %d" % response.status
|
print "Performance report upload failed with status %d" % response.status
|
||||||
print response.read()
|
print response.read()
|
||||||
|
|
||||||
|
def gnome_hwtest_log(*args):
|
||||||
|
command = ['gnome-hwtest-log', '-t', 'gnome-shell-perf-tool']
|
||||||
|
command.extend(args)
|
||||||
|
subprocess.check_call(command)
|
||||||
|
|
||||||
def run_performance_test():
|
def run_performance_test():
|
||||||
iters = options.perf_iters
|
iters = options.perf_iters
|
||||||
if options.perf_warmup:
|
if options.perf_warmup:
|
||||||
@ -289,6 +296,13 @@ def run_performance_test():
|
|||||||
|
|
||||||
if options.perf_upload:
|
if options.perf_upload:
|
||||||
upload_performance_report(json.dumps(report))
|
upload_performance_report(json.dumps(report))
|
||||||
|
elif options.hwtest:
|
||||||
|
# Log to systemd journal
|
||||||
|
for metric in sorted(metric_summaries.keys()):
|
||||||
|
summary = metric_summaries[metric]
|
||||||
|
gnome_hwtest_log('--metric=' + metric + '=' + str(summary['values'][0]) + summary['units'],
|
||||||
|
'--metric-description=' + summary['description'])
|
||||||
|
gnome_hwtest_log('--finished')
|
||||||
else:
|
else:
|
||||||
# Write a human readable summary
|
# Write a human readable summary
|
||||||
print '------------------------------------------------------------';
|
print '------------------------------------------------------------';
|
||||||
@ -304,8 +318,7 @@ def run_performance_test():
|
|||||||
|
|
||||||
parser = optparse.OptionParser()
|
parser = optparse.OptionParser()
|
||||||
parser.add_option("", "--perf", metavar="PERF_MODULE",
|
parser.add_option("", "--perf", metavar="PERF_MODULE",
|
||||||
help="Specify the name of a performance module to run",
|
help="Specify the name of a performance module to run")
|
||||||
default="core")
|
|
||||||
parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
|
parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
|
||||||
help="Numbers of iterations of performance module to run",
|
help="Numbers of iterations of performance module to run",
|
||||||
default=1)
|
default=1)
|
||||||
@ -315,6 +328,10 @@ parser.add_option("", "--perf-output", metavar="OUTPUT_FILE",
|
|||||||
help="Output file to write performance report")
|
help="Output file to write performance report")
|
||||||
parser.add_option("", "--perf-upload", action="store_true",
|
parser.add_option("", "--perf-upload", action="store_true",
|
||||||
help="Upload performance report to server")
|
help="Upload performance report to server")
|
||||||
|
parser.add_option("", "--extra-filter", action="append",
|
||||||
|
help="add an extra window class that should be allowed")
|
||||||
|
parser.add_option("", "--hwtest", action="store_true",
|
||||||
|
help="Log results appropriately for GNOME Hardware Testing")
|
||||||
parser.add_option("", "--version", action="callback", callback=show_version,
|
parser.add_option("", "--version", action="callback", callback=show_version,
|
||||||
help="Display version and exit")
|
help="Display version and exit")
|
||||||
|
|
||||||
@ -323,12 +340,25 @@ parser.add_option("-r", "--replace", action="store_true",
|
|||||||
|
|
||||||
options, args = parser.parse_args()
|
options, args = parser.parse_args()
|
||||||
|
|
||||||
|
if options.perf == None:
|
||||||
|
if options.hwtest:
|
||||||
|
options.perf = 'hwtest'
|
||||||
|
else:
|
||||||
|
options.perf = 'core'
|
||||||
|
|
||||||
|
if options.extra_filter is None:
|
||||||
|
if options.hwtest:
|
||||||
|
options.extra_filter = ['Gedit']
|
||||||
|
else:
|
||||||
|
options.extra_filter = []
|
||||||
|
|
||||||
if args:
|
if args:
|
||||||
parser.print_usage()
|
parser.print_usage()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
normal_exit = run_performance_test()
|
normal_exit = run_performance_test()
|
||||||
if normal_exit:
|
if normal_exit:
|
||||||
restore_shell()
|
if not options.hwtest:
|
||||||
|
restore_shell()
|
||||||
else:
|
else:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@ -174,7 +174,6 @@ gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
|
|||||||
const char * (* query_extensions_string) (Display *dpy, int screen);
|
const char * (* query_extensions_string) (Display *dpy, int screen);
|
||||||
Bool (* query_extension) (Display *dpy, int *error, int *event);
|
Bool (* query_extension) (Display *dpy, int *error, int *event);
|
||||||
MetaScreen *screen;
|
MetaScreen *screen;
|
||||||
MetaDisplay *display;
|
|
||||||
Display *xdisplay;
|
Display *xdisplay;
|
||||||
const char *glx_extensions;
|
const char *glx_extensions;
|
||||||
|
|
||||||
@ -183,9 +182,8 @@ gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
screen = meta_plugin_get_screen (plugin);
|
screen = meta_plugin_get_screen (plugin);
|
||||||
display = meta_screen_get_display (screen);
|
|
||||||
|
|
||||||
xdisplay = meta_display_get_xdisplay (display);
|
xdisplay = clutter_x11_get_default_display ();
|
||||||
|
|
||||||
query_extensions_string =
|
query_extensions_string =
|
||||||
(void *) cogl_get_proc_address ("glXQueryExtensionsString");
|
(void *) cogl_get_proc_address ("glXQueryExtensionsString");
|
||||||
@ -389,9 +387,17 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
|||||||
* can send this with a ust of 0. Simplify life for consumers
|
* can send this with a ust of 0. Simplify life for consumers
|
||||||
* by ignoring such events */
|
* by ignoring such events */
|
||||||
if (swap_complete_event->ust != 0)
|
if (swap_complete_event->ust != 0)
|
||||||
shell_perf_log_event_x (shell_perf_log_get_default (),
|
{
|
||||||
"glx.swapComplete",
|
gboolean frame_timestamps;
|
||||||
swap_complete_event->ust);
|
g_object_get (shell_plugin->global,
|
||||||
|
"frame-timestamps", &frame_timestamps,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (frame_timestamps)
|
||||||
|
shell_perf_log_event_x (shell_perf_log_get_default (),
|
||||||
|
"glx.swapComplete",
|
||||||
|
swap_complete_event->ust);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
52
src/gnome-shell-portal-helper.c
Normal file
52
src/gnome-shell-portal-helper.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <girepository.h>
|
||||||
|
#include <gjs/gjs.h>
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
const char *search_path[] = { "resource:///org/gnome/shell", NULL };
|
||||||
|
GError *error = NULL;
|
||||||
|
GjsContext *context;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
||||||
|
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||||
|
textdomain (GETTEXT_PACKAGE);
|
||||||
|
|
||||||
|
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
|
||||||
|
|
||||||
|
context = g_object_new (GJS_TYPE_CONTEXT,
|
||||||
|
"search-path", search_path,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (!gjs_context_define_string_array(context, "ARGV",
|
||||||
|
argc, (const char**)argv,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
g_message("Failed to define ARGV: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!gjs_context_eval (context,
|
||||||
|
"const Main = imports.portalHelper.main; Main.main(ARGV);",
|
||||||
|
-1,
|
||||||
|
"<main>",
|
||||||
|
&status,
|
||||||
|
&error))
|
||||||
|
{
|
||||||
|
g_message ("Execution of main.js threw exception: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -96,6 +96,8 @@ struct _ShellGlobal {
|
|||||||
guint32 xdnd_timestamp;
|
guint32 xdnd_timestamp;
|
||||||
|
|
||||||
gboolean has_modal;
|
gboolean has_modal;
|
||||||
|
gboolean frame_timestamps;
|
||||||
|
gboolean frame_finish_timestamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -116,6 +118,8 @@ enum {
|
|||||||
PROP_IMAGEDIR,
|
PROP_IMAGEDIR,
|
||||||
PROP_USERDATADIR,
|
PROP_USERDATADIR,
|
||||||
PROP_FOCUS_MANAGER,
|
PROP_FOCUS_MANAGER,
|
||||||
|
PROP_FRAME_TIMESTAMPS,
|
||||||
|
PROP_FRAME_FINISH_TIMESTAMP,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Signals */
|
/* Signals */
|
||||||
@ -146,6 +150,12 @@ shell_global_set_property(GObject *object,
|
|||||||
g_clear_pointer (&global->session_mode, g_free);
|
g_clear_pointer (&global->session_mode, g_free);
|
||||||
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FRAME_TIMESTAMPS:
|
||||||
|
global->frame_timestamps = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
case PROP_FRAME_FINISH_TIMESTAMP:
|
||||||
|
global->frame_finish_timestamp = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -217,6 +227,12 @@ shell_global_get_property(GObject *object,
|
|||||||
case PROP_FOCUS_MANAGER:
|
case PROP_FOCUS_MANAGER:
|
||||||
g_value_set_object (value, global->focus_manager);
|
g_value_set_object (value, global->focus_manager);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FRAME_TIMESTAMPS:
|
||||||
|
g_value_set_boolean (value, global->frame_timestamps);
|
||||||
|
break;
|
||||||
|
case PROP_FRAME_FINISH_TIMESTAMP:
|
||||||
|
g_value_set_boolean (value, global->frame_finish_timestamp);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -500,6 +516,20 @@ shell_global_class_init (ShellGlobalClass *klass)
|
|||||||
"The shell's StFocusManager",
|
"The shell's StFocusManager",
|
||||||
ST_TYPE_FOCUS_MANAGER,
|
ST_TYPE_FOCUS_MANAGER,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_FRAME_TIMESTAMPS,
|
||||||
|
g_param_spec_boolean ("frame-timestamps",
|
||||||
|
"Frame Timestamps",
|
||||||
|
"Whether to log frame timestamps in the performance log",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_FRAME_FINISH_TIMESTAMP,
|
||||||
|
g_param_spec_boolean ("frame-finish-timestamp",
|
||||||
|
"Frame Finish Timestamps",
|
||||||
|
"Whether at the end of a frame to call glFinish and log paintCompletedTimestamp",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -756,17 +786,71 @@ global_stage_notify_height (GObject *gobject,
|
|||||||
static gboolean
|
static gboolean
|
||||||
global_stage_before_paint (gpointer data)
|
global_stage_before_paint (gpointer data)
|
||||||
{
|
{
|
||||||
shell_perf_log_event (shell_perf_log_get_default (),
|
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||||
"clutter.stagePaintStart");
|
|
||||||
|
if (global->frame_timestamps)
|
||||||
|
shell_perf_log_event (shell_perf_log_get_default (),
|
||||||
|
"clutter.stagePaintStart");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
global_stage_after_paint (gpointer data)
|
load_gl_symbol (const char *name,
|
||||||
|
void **func)
|
||||||
{
|
{
|
||||||
shell_perf_log_event (shell_perf_log_get_default (),
|
*func = cogl_get_proc_address (name);
|
||||||
"clutter.stagePaintDone");
|
if (!*func)
|
||||||
|
{
|
||||||
|
g_warning ("failed to resolve required GL symbol \"%s\"\n", name);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
global_stage_after_paint (ClutterStage *stage,
|
||||||
|
ShellGlobal *global)
|
||||||
|
{
|
||||||
|
/* At this point, we've finished all layout and painting, but haven't
|
||||||
|
* actually flushed or swapped */
|
||||||
|
|
||||||
|
if (global->frame_timestamps && global->frame_finish_timestamp)
|
||||||
|
{
|
||||||
|
/* It's interesting to find out when the paint actually finishes
|
||||||
|
* on the GPU. We could wait for this asynchronously with
|
||||||
|
* ARB_timer_query (see https://bugzilla.gnome.org/show_bug.cgi?id=732350
|
||||||
|
* for an implementation of this), but what we actually would
|
||||||
|
* find out then is the latency for drawing a frame, not how much
|
||||||
|
* GPU work was needed, since frames can overlap. Calling glFinish()
|
||||||
|
* is a fairly reliable way to separate out adjacent frames
|
||||||
|
* and measure the amount of GPU work. This is turned on with a
|
||||||
|
* separate property from ::frame-timestamps, since it should not
|
||||||
|
* be turned on if we're trying to actual measure latency or frame
|
||||||
|
* rate.
|
||||||
|
*/
|
||||||
|
static void (*finish) (void);
|
||||||
|
|
||||||
|
if (!finish)
|
||||||
|
load_gl_symbol ("glFinish", (void **)&finish);
|
||||||
|
|
||||||
|
finish ();
|
||||||
|
|
||||||
|
shell_perf_log_event (shell_perf_log_get_default (),
|
||||||
|
"clutter.paintCompletedTimestamp");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
global_stage_after_swap (gpointer data)
|
||||||
|
{
|
||||||
|
/* Everything is done, we're ready for a new frame */
|
||||||
|
|
||||||
|
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||||
|
|
||||||
|
if (global->frame_timestamps)
|
||||||
|
shell_perf_log_event (shell_perf_log_get_default (),
|
||||||
|
"clutter.stagePaintDone");
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -784,7 +868,11 @@ update_scale_factor (GtkSettings *settings,
|
|||||||
|
|
||||||
g_value_init (&value, G_TYPE_INT);
|
g_value_init (&value, G_TYPE_INT);
|
||||||
if (gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value))
|
if (gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value))
|
||||||
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 ())
|
||||||
|
g_object_set (clutter_settings_get_default (), "font-dpi", 96 * 1024 * g_value_get_int (&value), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Make sure clutter and gdk scaling stays disabled */
|
/* Make sure clutter and gdk scaling stays disabled */
|
||||||
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
|
g_object_set (clutter_settings_get_default (), "window-scaling-factor", 1, NULL);
|
||||||
@ -947,19 +1035,26 @@ _shell_global_set_plugin (ShellGlobal *global,
|
|||||||
|
|
||||||
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
|
||||||
global_stage_before_paint,
|
global_stage_before_paint,
|
||||||
NULL, NULL);
|
global, NULL);
|
||||||
|
|
||||||
|
g_signal_connect (global->stage, "after-paint",
|
||||||
|
G_CALLBACK (global_stage_after_paint), global);
|
||||||
|
|
||||||
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
||||||
global_stage_after_paint,
|
global_stage_after_swap,
|
||||||
NULL, NULL);
|
global, NULL);
|
||||||
|
|
||||||
shell_perf_log_define_event (shell_perf_log_get_default(),
|
shell_perf_log_define_event (shell_perf_log_get_default(),
|
||||||
"clutter.stagePaintStart",
|
"clutter.stagePaintStart",
|
||||||
"Start of stage page repaint",
|
"Start of stage page repaint",
|
||||||
"");
|
"");
|
||||||
|
shell_perf_log_define_event (shell_perf_log_get_default(),
|
||||||
|
"clutter.paintCompletedTimestamp",
|
||||||
|
"Paint completion on GPU",
|
||||||
|
"");
|
||||||
shell_perf_log_define_event (shell_perf_log_get_default(),
|
shell_perf_log_define_event (shell_perf_log_get_default(),
|
||||||
"clutter.stagePaintDone",
|
"clutter.stagePaintDone",
|
||||||
"End of stage page repaint",
|
"End of frame, possibly including swap time",
|
||||||
"");
|
"");
|
||||||
|
|
||||||
g_signal_connect (global->stage, "notify::key-focus",
|
g_signal_connect (global->stage, "notify::key-focus",
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
|
|
||||||
@ -27,6 +29,7 @@ static const gchar introspection_xml[] =
|
|||||||
" <arg type='i' name='height' direction='in'/>"
|
" <arg type='i' name='height' direction='in'/>"
|
||||||
" <arg type='b' name='alpha' direction='in'/>"
|
" <arg type='b' name='alpha' direction='in'/>"
|
||||||
" <arg type='b' name='maximized' direction='in'/>"
|
" <arg type='b' name='maximized' direction='in'/>"
|
||||||
|
" <arg type='b' name='redraws' direction='in'/>"
|
||||||
" </method>"
|
" </method>"
|
||||||
" <method name='WaitWindows'/>"
|
" <method name='WaitWindows'/>"
|
||||||
" <method name='DestroyWindows'/>"
|
" <method name='DestroyWindows'/>"
|
||||||
@ -40,9 +43,13 @@ typedef struct {
|
|||||||
|
|
||||||
guint alpha : 1;
|
guint alpha : 1;
|
||||||
guint maximized : 1;
|
guint maximized : 1;
|
||||||
|
guint redraws : 1;
|
||||||
guint mapped : 1;
|
guint mapped : 1;
|
||||||
guint exposed : 1;
|
guint exposed : 1;
|
||||||
guint pending : 1;
|
guint pending : 1;
|
||||||
|
|
||||||
|
gint64 start_time;
|
||||||
|
gint64 time;
|
||||||
} WindowInfo;
|
} WindowInfo;
|
||||||
|
|
||||||
static int opt_idle_timeout = 30;
|
static int opt_idle_timeout = 30;
|
||||||
@ -119,6 +126,7 @@ on_window_draw (GtkWidget *window,
|
|||||||
{
|
{
|
||||||
cairo_rectangle_int_t allocation;
|
cairo_rectangle_int_t allocation;
|
||||||
gtk_widget_get_allocation (window, &allocation);
|
gtk_widget_get_allocation (window, &allocation);
|
||||||
|
double x_offset, y_offset;
|
||||||
|
|
||||||
/* We draw an arbitrary pattern of red lines near the border of the
|
/* We draw an arbitrary pattern of red lines near the border of the
|
||||||
* window to make it more clear than empty windows if something
|
* window to make it more clear than empty windows if something
|
||||||
@ -136,16 +144,27 @@ on_window_draw (GtkWidget *window,
|
|||||||
cairo_paint (cr);
|
cairo_paint (cr);
|
||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
|
|
||||||
|
if (info->redraws)
|
||||||
|
{
|
||||||
|
double position = (info->time - info->start_time) / 1000000.;
|
||||||
|
x_offset = 20 * cos (2 * M_PI * position);
|
||||||
|
y_offset = 20 * sin (2 * M_PI * position);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x_offset = y_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
cairo_set_source_rgb (cr, 1, 0, 0);
|
cairo_set_source_rgb (cr, 1, 0, 0);
|
||||||
cairo_set_line_width (cr, 10);
|
cairo_set_line_width (cr, 10);
|
||||||
cairo_move_to (cr, 0, 40);
|
cairo_move_to (cr, 0, 40 + y_offset);
|
||||||
cairo_line_to (cr, allocation.width, 40);
|
cairo_line_to (cr, allocation.width, 40 + y_offset);
|
||||||
cairo_move_to (cr, 0, allocation.height - 40);
|
cairo_move_to (cr, 0, allocation.height - 40 + y_offset);
|
||||||
cairo_line_to (cr, allocation.width, allocation.height - 40);
|
cairo_line_to (cr, allocation.width, allocation.height - 40 + y_offset);
|
||||||
cairo_move_to (cr, 40, 0);
|
cairo_move_to (cr, 40 + x_offset, 0);
|
||||||
cairo_line_to (cr, 40, allocation.height);
|
cairo_line_to (cr, 40 + x_offset, allocation.height);
|
||||||
cairo_move_to (cr, allocation.width - 40, 0);
|
cairo_move_to (cr, allocation.width - 40 + x_offset, 0);
|
||||||
cairo_line_to (cr, allocation.width - 40, allocation.height);
|
cairo_line_to (cr, allocation.width - 40 + x_offset, allocation.height);
|
||||||
cairo_stroke (cr);
|
cairo_stroke (cr);
|
||||||
|
|
||||||
info->exposed = TRUE;
|
info->exposed = TRUE;
|
||||||
@ -159,11 +178,29 @@ on_window_draw (GtkWidget *window,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
tick_callback (GtkWidget *widget,
|
||||||
|
GdkFrameClock *frame_clock,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
WindowInfo *info = user_data;
|
||||||
|
|
||||||
|
if (info->start_time < 0)
|
||||||
|
info->start_time = info->time = gdk_frame_clock_get_frame_time (frame_clock);
|
||||||
|
else
|
||||||
|
info->time = gdk_frame_clock_get_frame_time (frame_clock);
|
||||||
|
|
||||||
|
gtk_widget_queue_draw (widget);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_window (int width,
|
create_window (int width,
|
||||||
int height,
|
int height,
|
||||||
gboolean alpha,
|
gboolean alpha,
|
||||||
gboolean maximized)
|
gboolean maximized,
|
||||||
|
gboolean redraws)
|
||||||
{
|
{
|
||||||
WindowInfo *info;
|
WindowInfo *info;
|
||||||
|
|
||||||
@ -172,12 +209,14 @@ create_window (int width,
|
|||||||
info->height = height;
|
info->height = height;
|
||||||
info->alpha = alpha;
|
info->alpha = alpha;
|
||||||
info->maximized = maximized;
|
info->maximized = maximized;
|
||||||
|
info->redraws = redraws;
|
||||||
info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||||
if (alpha)
|
if (alpha)
|
||||||
gtk_widget_set_visual (info->window, gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
|
gtk_widget_set_visual (info->window, gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
|
||||||
if (maximized)
|
if (maximized)
|
||||||
gtk_window_maximize (GTK_WINDOW (info->window));
|
gtk_window_maximize (GTK_WINDOW (info->window));
|
||||||
info->pending = TRUE;
|
info->pending = TRUE;
|
||||||
|
info->start_time = -1;
|
||||||
|
|
||||||
gtk_widget_set_size_request (info->window, width, height);
|
gtk_widget_set_size_request (info->window, width, height);
|
||||||
gtk_widget_set_app_paintable (info->window, TRUE);
|
gtk_widget_set_app_paintable (info->window, TRUE);
|
||||||
@ -185,6 +224,10 @@ create_window (int width,
|
|||||||
g_signal_connect (info->window, "draw", G_CALLBACK (on_window_draw), info);
|
g_signal_connect (info->window, "draw", G_CALLBACK (on_window_draw), info);
|
||||||
gtk_widget_show (info->window);
|
gtk_widget_show (info->window);
|
||||||
|
|
||||||
|
if (info->redraws)
|
||||||
|
gtk_widget_add_tick_callback (info->window, tick_callback,
|
||||||
|
info, NULL);
|
||||||
|
|
||||||
our_windows = g_list_prepend (our_windows, info);
|
our_windows = g_list_prepend (our_windows, info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,11 +285,11 @@ handle_method_call (GDBusConnection *connection,
|
|||||||
else if (g_strcmp0 (method_name, "CreateWindow") == 0)
|
else if (g_strcmp0 (method_name, "CreateWindow") == 0)
|
||||||
{
|
{
|
||||||
int width, height;
|
int width, height;
|
||||||
gboolean alpha, maximized;
|
gboolean alpha, maximized, redraws;
|
||||||
|
|
||||||
g_variant_get (parameters, "(iibb)", &width, &height, &alpha, &maximized);
|
g_variant_get (parameters, "(iibbb)", &width, &height, &alpha, &maximized, &redraws);
|
||||||
|
|
||||||
create_window (width, height, alpha, maximized);
|
create_window (width, height, alpha, maximized, redraws);
|
||||||
g_dbus_method_invocation_return_value (invocation, NULL);
|
g_dbus_method_invocation_return_value (invocation, NULL);
|
||||||
}
|
}
|
||||||
else if (g_strcmp0 (method_name, "WaitWindows") == 0)
|
else if (g_strcmp0 (method_name, "WaitWindows") == 0)
|
||||||
|
@ -126,11 +126,7 @@ G_DEFINE_TYPE(ShellPerfLog, shell_perf_log, G_TYPE_OBJECT);
|
|||||||
static gint64
|
static gint64
|
||||||
get_time (void)
|
get_time (void)
|
||||||
{
|
{
|
||||||
GTimeVal timeval;
|
return g_get_monotonic_time ();
|
||||||
|
|
||||||
g_get_current_time (&timeval);
|
|
||||||
|
|
||||||
return timeval.tv_sec * G_GINT64_CONSTANT(1000000) + timeval.tv_usec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -751,7 +751,7 @@ recorder_connect_stage_callbacks (ShellRecorder *recorder)
|
|||||||
G_CALLBACK (recorder_on_stage_paint), recorder);
|
G_CALLBACK (recorder_on_stage_paint), recorder);
|
||||||
g_signal_connect (recorder->stage, "notify::width",
|
g_signal_connect (recorder->stage, "notify::width",
|
||||||
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
||||||
g_signal_connect (recorder->stage, "notify::width",
|
g_signal_connect (recorder->stage, "notify::height",
|
||||||
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
G_CALLBACK (recorder_on_stage_notify_size), recorder);
|
||||||
|
|
||||||
clutter_x11_add_filter (recorder_event_filter, recorder);
|
clutter_x11_add_filter (recorder_event_filter, recorder);
|
||||||
|
@ -252,7 +252,7 @@ st_icon_class_init (StIconClass *klass)
|
|||||||
pspec = g_param_spec_string ("icon-name",
|
pspec = g_param_spec_string ("icon-name",
|
||||||
"Icon name",
|
"Icon name",
|
||||||
"An icon name",
|
"An icon name",
|
||||||
NULL, ST_PARAM_READWRITE | G_PARAM_DEPRECATED);
|
NULL, ST_PARAM_READWRITE);
|
||||||
g_object_class_install_property (object_class, PROP_ICON_NAME, pspec);
|
g_object_class_install_property (object_class, PROP_ICON_NAME, pspec);
|
||||||
|
|
||||||
pspec = g_param_spec_int ("icon-size",
|
pspec = g_param_spec_int ("icon-size",
|
||||||
|
Reference in New Issue
Block a user