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.evolution.calendar.gschema.xml
|
||||
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/*/*.bak
|
||||
docs/reference/*/*.hierarchy
|
||||
@ -80,6 +82,7 @@ src/gnome-shell-extension-tool
|
||||
src/gnome-shell-hotplug-sniffer
|
||||
src/gnome-shell-perf-helper
|
||||
src/gnome-shell-perf-tool
|
||||
src/gnome-shell-portal-helper
|
||||
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
||||
src/run-js-test
|
||||
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
|
||||
======
|
||||
* Don't allow closing windows with attached modals [Florian; #729886]
|
||||
|
@ -1,5 +1,5 @@
|
||||
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_SRCDIR([src/shell-global.c])
|
||||
@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
|
||||
CLUTTER_MIN_VERSION=1.15.90
|
||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||
GJS_MIN_VERSION=1.39.0
|
||||
MUTTER_MIN_VERSION=3.13.3
|
||||
MUTTER_MIN_VERSION=3.13.4
|
||||
GTK_MIN_VERSION=3.7.9
|
||||
GIO_MIN_VERSION=2.37.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
|
@ -1,6 +1,24 @@
|
||||
CLEANFILES =
|
||||
|
||||
desktopdir=$(datadir)/applications
|
||||
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
|
||||
# file when built in a non-system prefix
|
||||
%.desktop.in:%.desktop.in.in
|
||||
@ -88,9 +106,11 @@ EXTRA_DIST = \
|
||||
$(menu_DATA) \
|
||||
$(convert_DATA) \
|
||||
$(keys_in_files) \
|
||||
org.gnome.Shell.PortalHelper.desktop.in \
|
||||
org.gnome.Shell.PortalHelper.service.in \
|
||||
org.gnome.shell.gschema.xml.in.in
|
||||
|
||||
CLEANFILES = \
|
||||
CLEANFILES += \
|
||||
gnome-shell.desktop.in \
|
||||
gnome-shell-wayland.desktop.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 */
|
||||
.dash-label,
|
||||
.window-caption,
|
||||
.switcher-list,
|
||||
.switcher-list,
|
||||
.app-well-app > .overview-icon,
|
||||
.show-apps > .overview-icon,
|
||||
.grid-search-result .overview-icon {
|
||||
@ -2092,6 +2092,11 @@ StScrollBar StButton#vhandle:active {
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
/* Restart message */
|
||||
.restart-message {
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
/* ShellMountOperation Dialogs */
|
||||
.shell-mount-operation-icon {
|
||||
icon-size: 48px;
|
||||
|
@ -13,7 +13,7 @@ misc/config.js: misc/config.js.in Makefile
|
||||
-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
|
||||
$(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
|
||||
|
@ -54,15 +54,17 @@ const Application = new Lang.Class({
|
||||
this._startupUuid = null;
|
||||
this._loaded = false;
|
||||
this._skipMainWindow = false;
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
},
|
||||
|
||||
_extensionAvailable: function(uuid) {
|
||||
let extension = ExtensionUtils.extensions[uuid];
|
||||
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
||||
|
||||
if (!extension)
|
||||
return false;
|
||||
|
||||
if (ExtensionUtils.isOutOfDate(extension))
|
||||
if (checkVersion && ExtensionUtils.isOutOfDate(extension))
|
||||
return false;
|
||||
|
||||
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
||||
|
@ -25,6 +25,9 @@
|
||||
<file>misc/util.js</file>
|
||||
|
||||
<file>perf/core.js</file>
|
||||
<file>perf/hwtest.js</file>
|
||||
|
||||
<file>portalHelper/main.js</file>
|
||||
|
||||
<file>ui/altTab.js</file>
|
||||
<file>ui/animation.js</file>
|
||||
|
@ -72,6 +72,9 @@ function run() {
|
||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch 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() {
|
||||
Scripting.scriptEvent('overviewShowDone');
|
||||
});
|
||||
@ -87,7 +90,10 @@ function run() {
|
||||
yield Scripting.destroyTestWindows();
|
||||
|
||||
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.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.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() {
|
||||
@ -1278,8 +1323,6 @@ const AppFolderPopup = new Lang.Class({
|
||||
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
||||
BoxPointer.PopupAnimation.SLIDE);
|
||||
|
||||
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
|
||||
this.emit('open-state-changed', true);
|
||||
},
|
||||
|
||||
|
@ -6,6 +6,26 @@ const Signals = imports.signals;
|
||||
|
||||
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({
|
||||
Name: 'AppFavorites',
|
||||
|
||||
@ -24,6 +44,21 @@ const AppFavorites = new Lang.Class({
|
||||
|
||||
reload: function() {
|
||||
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 apps = ids.map(function (id) {
|
||||
return appSys.lookup_app(id);
|
||||
|
@ -448,7 +448,7 @@ const Background = new Lang.Class({
|
||||
|
||||
let image = this._images[index];
|
||||
if (image.content)
|
||||
this._cache.removeImageContent(content);
|
||||
this._cache.removeImageContent(image.content);
|
||||
image.content = content;
|
||||
this._watchCacheFile(filename);
|
||||
},
|
||||
@ -659,7 +659,10 @@ const SystemBackground = new Lang.Class({
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this._cache.removeImageContent(this.actor.content);
|
||||
let content = this.actor.content;
|
||||
|
||||
if (content)
|
||||
this._cache.removeImageContent(content);
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(SystemBackground.prototype);
|
||||
|
@ -55,9 +55,14 @@ function addBackgroundMenu(actor, layoutManager) {
|
||||
});
|
||||
actor.add_action(clickAction);
|
||||
|
||||
let grabOpBeginId = global.display.connect('grab-op-begin', function () {
|
||||
clickAction.release();
|
||||
});
|
||||
|
||||
actor.connect('destroy', function() {
|
||||
actor._backgroundMenu.destroy();
|
||||
actor._backgroundMenu = null;
|
||||
actor._backgroundManager = null;
|
||||
global.display.disconnect(grabOpBeginId);
|
||||
});
|
||||
}
|
||||
|
@ -11,6 +11,9 @@ const Main = imports.ui.main;
|
||||
|
||||
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({
|
||||
Name: 'CandidateArea',
|
||||
|
||||
@ -89,7 +92,7 @@ const CandidateArea = new Lang.Class({
|
||||
if (!visible)
|
||||
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];
|
||||
}
|
||||
|
||||
|
@ -163,7 +163,7 @@ const LayoutManager = new Lang.Class({
|
||||
// Normally, the stage is always covered so Clutter doesn't need to clear
|
||||
// it; however it becomes visible during the startup animation
|
||||
// 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.
|
||||
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
|
||||
// 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);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
@ -597,7 +597,9 @@ const LayoutManager = new Lang.Class({
|
||||
reactive: true });
|
||||
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;
|
||||
} else {
|
||||
this._updateBackgrounds();
|
||||
@ -636,7 +638,9 @@ const LayoutManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_startupAnimation: function() {
|
||||
if (Main.sessionMode.isGreeter)
|
||||
if (Meta.is_restart())
|
||||
this._startupAnimationComplete();
|
||||
else if (Main.sessionMode.isGreeter)
|
||||
this._startupAnimationGreeter();
|
||||
else
|
||||
this._startupAnimationSession();
|
||||
|
@ -18,6 +18,7 @@ const ExtensionSystem = imports.ui.extensionSystem;
|
||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||
const Keyboard = imports.ui.keyboard;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const OsdWindow = imports.ui.osdWindow;
|
||||
const Overview = imports.ui.overview;
|
||||
const Panel = imports.ui.panel;
|
||||
@ -167,6 +168,16 @@ function _initializeUI() {
|
||||
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
|
||||
// initiate logouts.
|
||||
EndSessionDialog.init();
|
||||
@ -233,8 +244,7 @@ function _loadDefaultStylesheet() {
|
||||
* Returns: A file path that contains the theme CSS,
|
||||
* null if using the default
|
||||
*/
|
||||
function getThemeStylesheet()
|
||||
{
|
||||
function getThemeStylesheet() {
|
||||
return _cssStylesheet;
|
||||
}
|
||||
|
||||
@ -245,8 +255,7 @@ function getThemeStylesheet()
|
||||
*
|
||||
* Set the theme CSS file that the shell will load
|
||||
*/
|
||||
function setThemeStylesheet(cssStylesheet)
|
||||
{
|
||||
function setThemeStylesheet(cssStylesheet) {
|
||||
_cssStylesheet = cssStylesheet;
|
||||
}
|
||||
|
||||
@ -608,3 +617,28 @@ function queueDeferredWork(workId) {
|
||||
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,
|
||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||
shouldFadeIn: true,
|
||||
shouldFadeOut: true,
|
||||
destroyOnClose: true });
|
||||
|
||||
this.state = State.CLOSED;
|
||||
@ -50,6 +51,7 @@ const ModalDialog = new Lang.Class({
|
||||
this._keybindingMode = params.keybindingMode;
|
||||
this._shellReactive = params.shellReactive;
|
||||
this._shouldFadeIn = params.shouldFadeIn;
|
||||
this._shouldFadeOut = params.shouldFadeOut;
|
||||
this._destroyOnClose = params.destroyOnClose;
|
||||
|
||||
this._group = new St.Widget({ visible: false,
|
||||
@ -307,6 +309,15 @@ const ModalDialog = new Lang.Class({
|
||||
return true;
|
||||
},
|
||||
|
||||
_closeComplete: function() {
|
||||
this.state = State.CLOSED;
|
||||
this._group.hide();
|
||||
this.emit('closed');
|
||||
|
||||
if (this._destroyOnClose)
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
close: function(timestamp) {
|
||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||
return;
|
||||
@ -315,20 +326,16 @@ const ModalDialog = new Lang.Class({
|
||||
this.popModal(timestamp);
|
||||
this._savedKeyFocus = null;
|
||||
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 0,
|
||||
time: OPEN_AND_CLOSE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
function() {
|
||||
this.state = State.CLOSED;
|
||||
this._group.hide();
|
||||
this.emit('closed');
|
||||
|
||||
if (this._destroyOnClose)
|
||||
this.destroy();
|
||||
})
|
||||
});
|
||||
if (this._shouldFadeOut)
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 0,
|
||||
time: OPEN_AND_CLOSE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
this._closeComplete)
|
||||
})
|
||||
else
|
||||
this._closeComplete();
|
||||
},
|
||||
|
||||
// Drop modal status without closing the dialog; this makes the
|
||||
|
@ -120,15 +120,12 @@ const FdoNotificationDaemon = new Lang.Class({
|
||||
|
||||
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._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));
|
||||
|
||||
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);
|
||||
},
|
||||
|
||||
@ -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({
|
||||
Name: 'GtkNotificationDaemonNotification',
|
||||
@ -705,12 +708,20 @@ const GtkNotificationDaemonNotification = new Lang.Class({
|
||||
"body": body,
|
||||
"icon": gicon,
|
||||
"urgent": urgent,
|
||||
"priority": priority,
|
||||
"buttons": buttons,
|
||||
"default-action": defaultAction,
|
||||
"default-action-target": defaultActionTarget } = notification;
|
||||
|
||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
||||
: MessageTray.Urgency.NORMAL);
|
||||
if (priority) {
|
||||
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) {
|
||||
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
||||
|
@ -425,8 +425,6 @@ const Overview = new Lang.Class({
|
||||
this.emit('windows-restacked', stackIndices);
|
||||
},
|
||||
|
||||
//// Public methods ////
|
||||
|
||||
beginItemDrag: function(source) {
|
||||
this.emit('item-drag-begin');
|
||||
this._inDrag = true;
|
||||
@ -455,23 +453,6 @@ const Overview = new Lang.Class({
|
||||
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() {
|
||||
this.show();
|
||||
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
|
||||
// clicks. The first call to this function within the
|
||||
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
||||
@ -583,8 +501,6 @@ const Overview = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
//// Private methods ////
|
||||
|
||||
_syncGrab: function() {
|
||||
// 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
|
||||
@ -614,6 +530,92 @@ const Overview = new Lang.Class({
|
||||
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() {
|
||||
if (!this.visible || this.animationInProgress)
|
||||
return;
|
||||
@ -638,20 +640,6 @@ const Overview = new Lang.Class({
|
||||
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() {
|
||||
// Re-enable unredirection
|
||||
Meta.enable_unredirect_for_screen(global.screen);
|
||||
@ -677,6 +665,16 @@ const Overview = new Lang.Class({
|
||||
this._fakePointerEvent();
|
||||
this._needsFakePointerEvent = false;
|
||||
}
|
||||
},
|
||||
|
||||
toggle: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
|
||||
if (this.visible)
|
||||
this.hide();
|
||||
else
|
||||
this.show();
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(Overview.prototype);
|
||||
|
@ -14,7 +14,6 @@ const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const Config = imports.misc.config;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
|
@ -378,9 +378,9 @@ const PopupImageMenuItem = new Lang.Class({
|
||||
this.parent(params);
|
||||
|
||||
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.addActor(this._icon, { align: St.Align.END });
|
||||
this.actor.add_child(this._icon, { align: St.Align.END });
|
||||
|
||||
this.setIcon(iconName);
|
||||
},
|
||||
|
@ -50,14 +50,10 @@ const RunDialog = new Lang.Class({
|
||||
Main.createLookingGlass().open();
|
||||
}),
|
||||
|
||||
'r': Lang.bind(this, function() {
|
||||
global.reexec_self();
|
||||
}),
|
||||
'r': Lang.bind(this, this._restart),
|
||||
|
||||
// Developer brain backwards compatibility
|
||||
'restart': Lang.bind(this, function() {
|
||||
global.reexec_self();
|
||||
}),
|
||||
'restart': Lang.bind(this, this._restart),
|
||||
|
||||
'debugexit': Lang.bind(this, function() {
|
||||
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() {
|
||||
this._history.lastItem();
|
||||
this._errorBox.hide();
|
||||
|
@ -7,6 +7,7 @@ const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
// This module provides functionality for driving the shell user interface
|
||||
// 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="b" direction="in" /> \
|
||||
<arg type="b" direction="in" /> \
|
||||
<arg type="b" direction="in" /> \
|
||||
</method> \
|
||||
<method name="WaitWindows" /> \
|
||||
<method name="DestroyWindows" /> \
|
||||
@ -97,11 +99,36 @@ function _getPerfHelper() {
|
||||
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:
|
||||
* @width: width of window, in pixels
|
||||
* @height: height of window, in pixels
|
||||
* @alpha: whether the window should be alpha transparent
|
||||
* @params: options for window creation.
|
||||
* width - width of window, in pixels (default 640)
|
||||
* 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
|
||||
*
|
||||
* 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
|
||||
* until the window has been mapped and exposed, use waitTestWindows().
|
||||
*/
|
||||
function createTestWindow(width, height, alpha, maximized) {
|
||||
let cb;
|
||||
function createTestWindow(width, height, params) {
|
||||
params = Params.parse(params, { width: 640,
|
||||
height: 480,
|
||||
alpha: false,
|
||||
maximized: false,
|
||||
redraws: false });
|
||||
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
|
||||
function(result, excp) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
return _callRemote(perfHelper, perfHelper.CreateWindowRemote,
|
||||
params.width, params.height,
|
||||
params.alpha, params.maximized, params.redraws);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -132,17 +157,8 @@ function createTestWindow(width, height, alpha, maximized) {
|
||||
* created with createTestWindow have been mapped and exposed.
|
||||
*/
|
||||
function waitTestWindows() {
|
||||
let cb;
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.WaitWindowsRemote(function(result, excp) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
return _callRemote(perfHelper, perfHelper.WaitWindowsRemote);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,17 +171,8 @@ function waitTestWindows() {
|
||||
* process because of normal X asynchronicity.
|
||||
*/
|
||||
function destroyTestWindows() {
|
||||
let cb;
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.DestroyWindowsRemote(function(result, excp) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
return _callRemote(perfHelper, perfHelper.DestroyWindowsRemote);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -208,6 +215,10 @@ function _step(g, finish, onError) {
|
||||
let waitFunction = g.next();
|
||||
waitFunction(function() {
|
||||
_step(g, finish, onError);
|
||||
},
|
||||
function(err) {
|
||||
if (onError)
|
||||
onError(err);
|
||||
});
|
||||
} catch (err if err instanceof StopIteration) {
|
||||
if (finish)
|
||||
@ -306,8 +317,8 @@ function _collect(scriptModule, outputFile) {
|
||||
print ('------------------------------------------------------------');
|
||||
for (let i = 0; i < metrics.length; i++) {
|
||||
let metric = metrics[i];
|
||||
print ('# ' + scriptModule.METRIC_DESCRIPTIONS[metric]);
|
||||
print (metric + ': ' + scriptModule.METRICS[metric]);
|
||||
print ('# ' + scriptModule.METRICS[metric].description);
|
||||
print (metric + ': ' + scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units);
|
||||
}
|
||||
print ('------------------------------------------------------------');
|
||||
}
|
||||
@ -360,7 +371,12 @@ function runPerfScript(scriptModule, outputFile) {
|
||||
|
||||
_step(g,
|
||||
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);
|
||||
},
|
||||
function(err) {
|
||||
|
@ -465,8 +465,14 @@ const GridSearchResults = new Lang.Class({
|
||||
Name: 'GridSearchResults',
|
||||
Extends: SearchResultsBase,
|
||||
|
||||
_init: function(provider) {
|
||||
_init: function(provider, parentContainer) {
|
||||
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,
|
||||
xAlign: St.Align.START });
|
||||
@ -477,7 +483,9 @@ const GridSearchResults = new Lang.Class({
|
||||
},
|
||||
|
||||
_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) {
|
||||
@ -577,7 +585,7 @@ const SearchResults = new Lang.Class({
|
||||
if (provider.appInfo)
|
||||
providerDisplay = new ListSearchResults(provider);
|
||||
else
|
||||
providerDisplay = new GridSearchResults(provider);
|
||||
providerDisplay = new GridSearchResults(provider, this._content);
|
||||
|
||||
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||
this._content.add(providerDisplay.actor);
|
||||
|
@ -44,6 +44,33 @@ const NM80211Mode = NetworkManager['80211Mode'];
|
||||
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
||||
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) {
|
||||
if (!one || !two)
|
||||
return false;
|
||||
@ -207,13 +234,23 @@ const NMConnectionSection = new Lang.Class({
|
||||
this.item.menu.addMenuItem(this._labelSection);
|
||||
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() {
|
||||
if (this._notifyConnectivityId != 0) {
|
||||
this._client.disconnect(this._notifyConnectivityId);
|
||||
this._notifyConnectivityId = 0;
|
||||
}
|
||||
|
||||
this.item.destroy();
|
||||
},
|
||||
|
||||
_iconChanged: function() {
|
||||
this._sync();
|
||||
this.emit('icon-changed');
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let nItems = this._connectionItems.size;
|
||||
|
||||
@ -278,7 +315,7 @@ const NMConnectionSection = new Lang.Class({
|
||||
return;
|
||||
|
||||
item.connect('icon-changed', Lang.bind(this, function() {
|
||||
this.emit('icon-changed');
|
||||
this._iconChanged();
|
||||
}));
|
||||
item.connect('activation-failed', Lang.bind(this, function(item, reason) {
|
||||
this.emit('activation-failed', reason);
|
||||
@ -523,7 +560,7 @@ const NMDeviceModem = new Lang.Class({
|
||||
if (this._mobileDevice) {
|
||||
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.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._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._notifyConnectivityId = this._client.connect('notify::connectivity', Lang.bind(this, this._iconChanged));
|
||||
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_iconChanged: function() {
|
||||
this._sync();
|
||||
this.emit('icon-changed');
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (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 = null;
|
||||
}
|
||||
if (this._notifyConnectivityId) {
|
||||
this._client.disconnect(this._notifyConnectivityId);
|
||||
this._notifyConnectivityId = 0;
|
||||
}
|
||||
|
||||
this.item.destroy();
|
||||
},
|
||||
@ -1211,7 +1258,7 @@ const NMDeviceWireless = new Lang.Class({
|
||||
},
|
||||
|
||||
_strengthChanged: function() {
|
||||
this.emit('icon-changed');
|
||||
this._iconChanged();
|
||||
},
|
||||
|
||||
_activeApChanged: function() {
|
||||
@ -1561,6 +1608,7 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
this._activeConnections = [ ];
|
||||
this._connections = [ ];
|
||||
this._connectivityQueue = [ ];
|
||||
|
||||
this._mainConnection = null;
|
||||
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::activating-connection', Lang.bind(this, this._syncMainConnection));
|
||||
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-removed', Lang.bind(this, this._deviceRemoved));
|
||||
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
||||
@ -1757,6 +1806,7 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
|
||||
this._updateIcon();
|
||||
this._syncConnectivity();
|
||||
},
|
||||
|
||||
_syncVPNConnections: function() {
|
||||
@ -1862,6 +1912,97 @@ const NMApplet = new Lang.Class({
|
||||
_syncNMState: function() {
|
||||
this.indicators.visible = this._client.manager_running;
|
||||
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() {
|
||||
|
@ -151,11 +151,11 @@ const Indicator = new Lang.Class({
|
||||
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
Lang.bind(this, function() {
|
||||
this._orentationExists = true;
|
||||
this._orientationExists = true;
|
||||
this._updateOrientationLock();
|
||||
}),
|
||||
Lang.bind(this, function() {
|
||||
this._orentationExists = false;
|
||||
this._orientationExists = false;
|
||||
this._updateOrientationLock();
|
||||
}));
|
||||
this._updateOrientationLock();
|
||||
|
@ -49,6 +49,139 @@ function getTermsForSearchString(searchString) {
|
||||
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({
|
||||
Name: 'ViewSelector',
|
||||
|
||||
@ -83,10 +216,10 @@ const ViewSelector = new Lang.Class({
|
||||
icon_name: 'edit-find-symbolic' }));
|
||||
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
|
||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-clear-rtl-symbolic' });
|
||||
icon_name: 'edit-clear-symbolic-rtl' });
|
||||
else
|
||||
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._capturedEventId = 0;
|
||||
@ -145,6 +278,23 @@ const ViewSelector = new Lang.Class({
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
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() {
|
||||
@ -358,7 +508,10 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
startSearch: function(event) {
|
||||
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
|
||||
|
@ -9,6 +9,7 @@ const Meta = imports.gi.Meta;
|
||||
const Pango = imports.gi.Pango;
|
||||
const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const AltTab = imports.ui.altTab;
|
||||
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({
|
||||
Name: 'WindowManager',
|
||||
|
||||
@ -683,6 +793,53 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||
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) {
|
||||
@ -903,7 +1060,7 @@ const WindowManager = new Lang.Class({
|
||||
/* Scale the window from the center of the parent */
|
||||
this._checkDimming(actor.get_meta_window().get_transient_for());
|
||||
actor.set_scale(1.0, 0.0);
|
||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
||||
actor.set_pivot_point(0.5, 0.5);
|
||||
actor.show();
|
||||
this._mapping.push(actor);
|
||||
|
||||
@ -977,7 +1134,7 @@ const WindowManager = new Lang.Class({
|
||||
this._checkDimming(parent, window);
|
||||
|
||||
actor.set_scale(1.0, 1.0);
|
||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
||||
actor.set_pivot_point(0.5, 0.5);
|
||||
actor.show();
|
||||
|
||||
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
||||
|
@ -239,6 +239,14 @@ const WindowClone = new Lang.Class({
|
||||
return this._boundingBox;
|
||||
},
|
||||
|
||||
get width() {
|
||||
return this._boundingBox.width;
|
||||
},
|
||||
|
||||
get height() {
|
||||
return this._boundingBox.height;
|
||||
},
|
||||
|
||||
getOriginalPosition: function() {
|
||||
return [this._boundingBox.x, this._boundingBox.y];
|
||||
},
|
||||
@ -257,7 +265,8 @@ const WindowClone = new Lang.Class({
|
||||
rect = rect.union(metaWindow.get_outer_rect());
|
||||
}, 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;
|
||||
},
|
||||
|
||||
@ -832,7 +841,7 @@ const LayoutStrategy = new Lang.Class({
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
// them, so two windows with equal height, but maybe differering
|
||||
// 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
|
||||
// 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 s = scale * this._computeWindowScale(window) * row.additionalScale;
|
||||
let cellWidth = window.actor.width * s;
|
||||
let cellHeight = window.actor.height * s;
|
||||
let cellWidth = window.width * s;
|
||||
let cellHeight = window.height * s;
|
||||
|
||||
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 cloneY = row.y + row.height - cellHeight;
|
||||
@ -992,7 +1001,7 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let window = windows[i];
|
||||
let s = this._computeWindowScale(window);
|
||||
totalWidth += window.actor.width * s;
|
||||
totalWidth += window.width * s;
|
||||
}
|
||||
|
||||
let idealRowWidth = totalWidth / numRows;
|
||||
@ -1005,8 +1014,8 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
for (; windowIdx < windows.length; windowIdx++) {
|
||||
let window = windows[windowIdx];
|
||||
let s = this._computeWindowScale(window);
|
||||
let width = window.actor.width * s;
|
||||
let height = window.actor.height * s;
|
||||
let width = window.width * s;
|
||||
let height = window.height * s;
|
||||
row.fullHeight = Math.max(row.fullHeight, height);
|
||||
|
||||
// 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._positionWindowsId = 0;
|
||||
|
||||
this.actor.connect('notify::mapped', Lang.bind(this, function() {
|
||||
if (this.actor.mapped)
|
||||
this._syncActualGeometry();
|
||||
}));
|
||||
},
|
||||
|
||||
setFullGeometry: function(geom) {
|
||||
@ -1138,7 +1152,9 @@ const Workspace = new Lang.Class({
|
||||
return;
|
||||
|
||||
this._fullGeometry = geom;
|
||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||
|
||||
if (this.actor.mapped)
|
||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||
},
|
||||
|
||||
setActualGeometry: function(geom) {
|
||||
@ -1146,18 +1162,29 @@ const Workspace = new Lang.Class({
|
||||
return;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
this._dropRect.set_position(geom.x, geom.y);
|
||||
this._dropRect.set_size(geom.width, geom.height);
|
||||
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
||||
|
||||
this._actualGeometryLater = 0;
|
||||
return false;
|
||||
}));
|
||||
},
|
||||
@ -1231,6 +1258,12 @@ const Workspace = new Lang.Class({
|
||||
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 animate = flags & WindowPositionFlags.ANIMATE;
|
||||
|
||||
|
@ -74,12 +74,12 @@ const WorkspacesViewBase = new Lang.Class({
|
||||
|
||||
setFullGeometry: function(geom) {
|
||||
this._fullGeometry = geom;
|
||||
this._syncGeometry();
|
||||
this._syncFullGeometry();
|
||||
},
|
||||
|
||||
setActualGeometry: function(geom) {
|
||||
this._actualGeometry = geom;
|
||||
this._syncGeometry();
|
||||
this._syncActualGeometry();
|
||||
},
|
||||
});
|
||||
|
||||
@ -127,9 +127,12 @@ const WorkspacesView = new Lang.Class({
|
||||
this._workspaces[i].setReservedSlot(clone);
|
||||
},
|
||||
|
||||
_syncGeometry: function() {
|
||||
_syncFullGeometry: function() {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
||||
},
|
||||
|
||||
_syncActualGeometry: function() {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
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._syncGeometry();
|
||||
this._syncFullGeometry();
|
||||
}
|
||||
if (this._actualGeometry)
|
||||
this._syncActualGeometry();
|
||||
},
|
||||
|
||||
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
||||
@ -352,8 +357,11 @@ const ExtraWorkspaceView = new Lang.Class({
|
||||
this._workspace.setReservedSlot(clone);
|
||||
},
|
||||
|
||||
_syncGeometry: function() {
|
||||
_syncFullGeometry: function() {
|
||||
this._workspace.setFullGeometry(this._fullGeometry);
|
||||
},
|
||||
|
||||
_syncActualGeometry: function() {
|
||||
this._workspace.setActualGeometry(this._actualGeometry);
|
||||
},
|
||||
|
||||
@ -598,8 +606,9 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
return;
|
||||
|
||||
let [x, y] = this.actor.get_transformed_position();
|
||||
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
|
||||
let height = this.actor.allocation.y2 - this.actor.allocation.y1;
|
||||
let allocation = this.actor.allocation;
|
||||
let width = allocation.x2 - allocation.x1;
|
||||
let height = allocation.y2 - allocation.y1;
|
||||
let primaryGeometry = { x: x, y: y, width: width, height: height };
|
||||
|
||||
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-wayland.desktop.in.in
|
||||
data/org.gnome.shell.gschema.xml.in.in
|
||||
data/org.gnome.Shell.PortalHelper.desktop.in
|
||||
js/extensionPrefs/main.js
|
||||
js/gdm/authPrompt.js
|
||||
js/gdm/loginDialog.js
|
||||
js/gdm/util.js
|
||||
js/misc/util.js
|
||||
js/portalHelper/main.js
|
||||
js/ui/appDisplay.js
|
||||
js/ui/appFavorites.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"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2014-06-17 07:28+0000\n"
|
||||
"PO-Revision-Date: 2014-06-17 18:41+0200\n"
|
||||
"POT-Creation-Date: 2014-07-22 07:35+0000\n"
|
||||
"PO-Revision-Date: 2014-07-22 11:27+0200\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
|
||||
"Language: es\n"
|
||||
@ -324,19 +324,23 @@ msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||
msgstr ""
|
||||
"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
|
||||
msgid "There was an error loading the preferences dialog for %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"
|
||||
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/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:878
|
||||
#: ../js/ui/status/network.js:915
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
@ -367,8 +371,8 @@ msgstr "¿No está en la lista?"
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(ej., usuario o %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
|
||||
#: ../js/ui/components/networkAgent.js:286
|
||||
msgid "Username: "
|
||||
msgstr "Nombre de usuario:"
|
||||
|
||||
@ -397,6 +401,10 @@ msgstr "No se pudo analizar el comando:"
|
||||
msgid "Execution of “%s” failed:"
|
||||
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
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Las aplicaciones usadas frecuentemente aparecerán aquí"
|
||||
@ -409,19 +417,19 @@ msgstr "Frecuentes"
|
||||
msgid "All"
|
||||
msgstr "Todas"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1569
|
||||
#: ../js/ui/appDisplay.js:1613
|
||||
msgid "New Window"
|
||||
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"
|
||||
msgstr "Quitar de los favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1597
|
||||
#: ../js/ui/appDisplay.js:1641
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Añadir a los favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1606
|
||||
#: ../js/ui/appDisplay.js:1650
|
||||
msgid "Show Details"
|
||||
msgstr "Mostrar detalles"
|
||||
|
||||
@ -435,7 +443,7 @@ msgstr "Se ha añadido %s a sus favoritos."
|
||||
msgid "%s has been removed from your favorites."
|
||||
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
|
||||
msgid "Settings"
|
||||
msgstr "Configuración"
|
||||
@ -569,35 +577,35 @@ msgid "Next month"
|
||||
msgstr "Siguiente mes"
|
||||
|
||||
#. Translators: Text to show if there are no events */
|
||||
#: ../js/ui/calendar.js:775
|
||||
#: ../js/ui/calendar.js:785
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Nada programado"
|
||||
|
||||
#. 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"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d de %B"
|
||||
|
||||
#. 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"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d de %B de %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:807
|
||||
#: ../js/ui/calendar.js:817
|
||||
msgid "Today"
|
||||
msgstr "Hoy"
|
||||
|
||||
#: ../js/ui/calendar.js:811
|
||||
#: ../js/ui/calendar.js:821
|
||||
msgid "Tomorrow"
|
||||
msgstr "Mañana"
|
||||
|
||||
#: ../js/ui/calendar.js:822
|
||||
#: ../js/ui/calendar.js:832
|
||||
msgid "This week"
|
||||
msgstr "Esta semana"
|
||||
|
||||
#: ../js/ui/calendar.js:830
|
||||
#: ../js/ui/calendar.js:840
|
||||
msgid "Next week"
|
||||
msgstr "La semana que viene"
|
||||
|
||||
@ -630,40 +638,40 @@ msgstr "Contraseña:"
|
||||
msgid "Type again:"
|
||||
msgstr "Escriba de nuevo:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
||||
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
|
||||
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
|
||||
msgid "Connect"
|
||||
msgstr "Conectar"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:224
|
||||
#: ../js/ui/components/networkAgent.js:236
|
||||
#: ../js/ui/components/networkAgent.js:264
|
||||
#: ../js/ui/components/networkAgent.js:284
|
||||
#: ../js/ui/components/networkAgent.js:294
|
||||
#: ../js/ui/components/networkAgent.js:230
|
||||
#: ../js/ui/components/networkAgent.js:242
|
||||
#: ../js/ui/components/networkAgent.js:270
|
||||
#: ../js/ui/components/networkAgent.js:290
|
||||
#: ../js/ui/components/networkAgent.js:300
|
||||
msgid "Password: "
|
||||
msgstr "Contraseña: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:229
|
||||
#: ../js/ui/components/networkAgent.js:235
|
||||
msgid "Key: "
|
||||
msgstr "Clave:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:268
|
||||
#: ../js/ui/components/networkAgent.js:274
|
||||
msgid "Identity: "
|
||||
msgstr "Identidad:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:270
|
||||
#: ../js/ui/components/networkAgent.js:276
|
||||
msgid "Private key password: "
|
||||
msgstr "Contraseña de la clave privada:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:282
|
||||
#: ../js/ui/components/networkAgent.js:288
|
||||
msgid "Service: "
|
||||
msgstr "Servicio:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:311
|
||||
#: ../js/ui/components/networkAgent.js:317
|
||||
msgid "Authentication required by wireless network"
|
||||
msgstr "La red inalámbrica requiere autenticación"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:312
|
||||
#: ../js/ui/components/networkAgent.js:318
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"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 "
|
||||
"inalámbrica «%s»."
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:316
|
||||
#: ../js/ui/components/networkAgent.js:322
|
||||
msgid "Wired 802.1X authentication"
|
||||
msgstr "Autenticación 802.1X cableada"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:318
|
||||
#: ../js/ui/components/networkAgent.js:324
|
||||
msgid "Network name: "
|
||||
msgstr "Nombre de la red"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:323
|
||||
#: ../js/ui/components/networkAgent.js:329
|
||||
msgid "DSL authentication"
|
||||
msgstr "Autenticación DSL"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:330
|
||||
#: ../js/ui/components/networkAgent.js:336
|
||||
msgid "PIN code required"
|
||||
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"
|
||||
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: "
|
||||
msgstr "PIN: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:338
|
||||
#: ../js/ui/components/networkAgent.js:344
|
||||
msgid "Mobile broadband network password"
|
||||
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
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Se requiere una contraseña para conectarse a «%s»."
|
||||
@ -1001,7 +1009,7 @@ msgstr "Ver cuenta"
|
||||
msgid "Unknown reason"
|
||||
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"
|
||||
msgstr "Ventanas"
|
||||
|
||||
@ -1204,7 +1212,7 @@ msgstr "Activado"
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../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"
|
||||
msgstr "Desactivado"
|
||||
|
||||
@ -1264,7 +1272,7 @@ msgstr "Bandeja de mensajes"
|
||||
msgid "System Information"
|
||||
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"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocido"
|
||||
@ -1292,32 +1300,37 @@ msgstr "Vista general"
|
||||
msgid "Type to search…"
|
||||
msgstr "Escribir para buscar…"
|
||||
|
||||
#: ../js/ui/panel.js:516
|
||||
#: ../js/ui/panel.js:515
|
||||
msgid "Quit"
|
||||
msgstr "Salir"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview". */
|
||||
#: ../js/ui/panel.js:568
|
||||
#: ../js/ui/panel.js:567
|
||||
msgid "Activities"
|
||||
msgstr "Actividades"
|
||||
|
||||
#: ../js/ui/panel.js:915
|
||||
#: ../js/ui/panel.js:914
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
#: ../js/ui/popupMenu.js:279
|
||||
#: ../js/ui/popupMenu.js:274
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:74
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
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"
|
||||
msgstr "Cerrar"
|
||||
|
||||
#: ../js/ui/runDialog.js:273
|
||||
#| msgid "Estimating…"
|
||||
msgid "Restarting…"
|
||||
msgstr "Reiniciando…"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format */
|
||||
#: ../js/ui/screenShield.js:88
|
||||
@ -1347,11 +1360,11 @@ msgstr "No se pudo bloquear"
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Una aplicación impidió el bloqueo"
|
||||
|
||||
#: ../js/ui/search.js:606
|
||||
#: ../js/ui/search.js:614
|
||||
msgid "Searching…"
|
||||
msgstr "Buscando…"
|
||||
|
||||
#: ../js/ui/search.js:652
|
||||
#: ../js/ui/search.js:660
|
||||
msgid "No results."
|
||||
msgstr "No se encontraron resultados."
|
||||
|
||||
@ -1427,9 +1440,9 @@ msgstr "Texto grande"
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281
|
||||
#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/rfkill.js:114
|
||||
msgid "Turn Off"
|
||||
msgstr "Apagar"
|
||||
@ -1445,7 +1458,7 @@ msgid_plural "%d Connected Devices"
|
||||
msgstr[0] "%d dispositivo conectado"
|
||||
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"
|
||||
msgstr "No conectado"
|
||||
|
||||
@ -1473,156 +1486,156 @@ msgstr "Activar"
|
||||
msgid "In Use"
|
||||
msgstr "En uso"
|
||||
|
||||
#: ../js/ui/status/network.js:74
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
msgstr "<desconocido>"
|
||||
|
||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
||||
#: ../js/ui/status/network.js:1464
|
||||
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
|
||||
#: ../js/ui/status/network.js:1511
|
||||
msgid "Off"
|
||||
msgstr "Desconectado"
|
||||
|
||||
#: ../js/ui/status/network.js:422
|
||||
#: ../js/ui/status/network.js:459
|
||||
msgid "Connected"
|
||||
msgstr "Conectada"
|
||||
|
||||
#. 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) */
|
||||
#: ../js/ui/status/network.js:426
|
||||
#: ../js/ui/status/network.js:463
|
||||
msgid "Unmanaged"
|
||||
msgstr "Sin gestionar"
|
||||
|
||||
#: ../js/ui/status/network.js:428
|
||||
#: ../js/ui/status/network.js:465
|
||||
msgid "Disconnecting"
|
||||
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"
|
||||
msgstr "Conectando"
|
||||
|
||||
#. 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"
|
||||
msgstr "Autenticación requerida"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing */
|
||||
#: ../js/ui/status/network.js:445
|
||||
#: ../js/ui/status/network.js:482
|
||||
msgid "Firmware missing"
|
||||
msgstr "Falta el «firmware»"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage */
|
||||
#: ../js/ui/status/network.js:449
|
||||
#: ../js/ui/status/network.js:486
|
||||
msgid "Unavailable"
|
||||
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"
|
||||
msgstr "Falló la conexión"
|
||||
|
||||
#: ../js/ui/status/network.js:467
|
||||
#: ../js/ui/status/network.js:504
|
||||
msgid "Wired Settings"
|
||||
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"
|
||||
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"
|
||||
msgstr "Hardware desactivado"
|
||||
|
||||
#: ../js/ui/status/network.js:595
|
||||
#: ../js/ui/status/network.js:632
|
||||
msgid "Use as Internet connection"
|
||||
msgstr "Usar como conexión a Internet"
|
||||
|
||||
#: ../js/ui/status/network.js:776
|
||||
#: ../js/ui/status/network.js:813
|
||||
msgid "Airplane Mode is On"
|
||||
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."
|
||||
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"
|
||||
msgstr "Apagar el modo avión"
|
||||
|
||||
#: ../js/ui/status/network.js:787
|
||||
#: ../js/ui/status/network.js:824
|
||||
msgid "Wi-Fi is Off"
|
||||
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."
|
||||
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"
|
||||
msgstr "Activar la Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:814
|
||||
#: ../js/ui/status/network.js:851
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Redes Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:816
|
||||
#: ../js/ui/status/network.js:853
|
||||
msgid "Select a network"
|
||||
msgstr "Seleccionar una red"
|
||||
|
||||
#: ../js/ui/status/network.js:845
|
||||
#: ../js/ui/status/network.js:882
|
||||
msgid "No Networks"
|
||||
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"
|
||||
msgstr "Usar el interruptor hardware para apagar"
|
||||
|
||||
#: ../js/ui/status/network.js:1136
|
||||
#: ../js/ui/status/network.js:1173
|
||||
msgid "Select Network"
|
||||
msgstr "Seleccionar red"
|
||||
|
||||
#: ../js/ui/status/network.js:1142
|
||||
#: ../js/ui/status/network.js:1179
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Configuración de Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1234
|
||||
#: ../js/ui/status/network.js:1281
|
||||
msgid "Turn On"
|
||||
msgstr "Enceder"
|
||||
|
||||
#: ../js/ui/status/network.js:1251
|
||||
#: ../js/ui/status/network.js:1298
|
||||
msgid "Hotspot Active"
|
||||
msgstr "Punto de acceso activo"
|
||||
|
||||
#: ../js/ui/status/network.js:1362
|
||||
#: ../js/ui/status/network.js:1409
|
||||
msgid "connecting..."
|
||||
msgstr "conectando…"
|
||||
|
||||
#. 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"
|
||||
msgstr "se necesita autenticación"
|
||||
|
||||
#: ../js/ui/status/network.js:1367
|
||||
#: ../js/ui/status/network.js:1414
|
||||
msgid "connection failed"
|
||||
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"
|
||||
msgstr "Configuración de la red"
|
||||
|
||||
#: ../js/ui/status/network.js:1435
|
||||
#: ../js/ui/status/network.js:1482
|
||||
msgid "VPN Settings"
|
||||
msgstr "Configuración de VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1454
|
||||
#: ../js/ui/status/network.js:1501
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1607
|
||||
#: ../js/ui/status/network.js:1656
|
||||
msgid "Network Manager"
|
||||
msgstr "Gestor de la red"
|
||||
|
||||
#: ../js/ui/status/network.js:1647
|
||||
#: ../js/ui/status/network.js:1696
|
||||
msgid "Activation of network connection failed"
|
||||
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"
|
||||
msgstr "Desbloquear ventana"
|
||||
|
||||
#: ../js/ui/viewSelector.js:100
|
||||
#: ../js/ui/viewSelector.js:233
|
||||
msgid "Applications"
|
||||
msgstr "Aplicaciones"
|
||||
|
||||
#: ../js/ui/viewSelector.js:104
|
||||
#: ../js/ui/viewSelector.js:237
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
@ -1717,22 +1730,22 @@ msgstr "Buscar"
|
||||
msgid "“%s” is ready"
|
||||
msgstr "«%s» está preparado"
|
||||
|
||||
#: ../js/ui/windowManager.js:57
|
||||
#: ../js/ui/windowManager.js:58
|
||||
msgid "Do you want to keep these display settings?"
|
||||
msgstr "¿Quiere mantener esta configuración de la pantalla?"
|
||||
|
||||
#. Translators: this and the following message should be limited in lenght,
|
||||
#. to avoid ellipsizing the labels.
|
||||
#. */
|
||||
#: ../js/ui/windowManager.js:76
|
||||
#: ../js/ui/windowManager.js:77
|
||||
msgid "Revert Settings"
|
||||
msgstr "Revertir configuración"
|
||||
|
||||
#: ../js/ui/windowManager.js:80
|
||||
#: ../js/ui/windowManager.js:81
|
||||
msgid "Keep Changes"
|
||||
msgstr "Mantener cambios"
|
||||
|
||||
#: ../js/ui/windowManager.js:99
|
||||
#: ../js/ui/windowManager.js:100
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
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"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2014-06-03 07:28+0000\n"
|
||||
"PO-Revision-Date: 2014-06-03 10:26-0300\n"
|
||||
"POT-Creation-Date: 2014-07-18 07:33+0000\n"
|
||||
"PO-Revision-Date: 2014-07-18 13:24-0300\n"
|
||||
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
|
||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||
"Language: pt_BR\n"
|
||||
@ -139,18 +139,27 @@ msgstr ""
|
||||
"área de favoritos."
|
||||
|
||||
#: ../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"
|
||||
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"
|
||||
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."
|
||||
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 ""
|
||||
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||
msgid ""
|
||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||
msgstr ""
|
||||
"Se lembra ou não as senhas para montar sistemas de arquivos criptografados "
|
||||
"ou remotos"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||
msgid ""
|
||||
"The shell will request a password when an encrypted device or a remote "
|
||||
"filesystem is mounted. If the password can be saved for future use a "
|
||||
@ -178,70 +187,78 @@ msgstr ""
|
||||
"posterior, a caixa de seleção 'Lembrar senha' estará presente. Esta chave "
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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 ""
|
||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||
msgstr ""
|
||||
"Atalho de teclado para abrir a visualização \"Mostrar aplicativos\" do "
|
||||
"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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
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 ""
|
||||
"Configures the maximum level of location accuracy applications are allowed "
|
||||
"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 "
|
||||
"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."
|
||||
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 ""
|
||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||
"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-"
|
||||
"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"
|
||||
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 ""
|
||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||
msgstr ""
|
||||
"Esta chave sobrescreve a chave em org.gnome.mutter ao executar o Shell do "
|
||||
"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"
|
||||
msgstr ""
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
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
|
||||
#, javascript-format
|
||||
msgid "There was an error loading the preferences dialog for %s:"
|
||||
msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:"
|
||||
|
||||
#: ../js/extensionPrefs/main.js:157
|
||||
#| msgid "Configure GNOME Shell Extensions"
|
||||
msgid "GNOME Shell Extensions"
|
||||
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/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/network.js:878
|
||||
#: ../js/ui/status/network.js:915
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
@ -345,8 +386,8 @@ msgstr "Não está listado?"
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(ex.: usuário ou %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
|
||||
#: ../js/ui/components/networkAgent.js:286
|
||||
msgid "Username: "
|
||||
msgstr "Nome de usuário: "
|
||||
|
||||
@ -375,31 +416,35 @@ msgstr "Não foi possível analisar comando:"
|
||||
msgid "Execution of “%s” failed:"
|
||||
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"
|
||||
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
||||
|
||||
#: ../js/ui/appDisplay.js:751
|
||||
#: ../js/ui/appDisplay.js:752
|
||||
msgid "Frequent"
|
||||
msgstr "Frequente"
|
||||
|
||||
#: ../js/ui/appDisplay.js:758
|
||||
#: ../js/ui/appDisplay.js:759
|
||||
msgid "All"
|
||||
msgstr "Todos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1571
|
||||
#: ../js/ui/appDisplay.js:1613
|
||||
msgid "New Window"
|
||||
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"
|
||||
msgstr "Remover dos favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1599
|
||||
#: ../js/ui/appDisplay.js:1641
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Adicionar aos favoritos"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1608
|
||||
#: ../js/ui/appDisplay.js:1650
|
||||
msgid "Show Details"
|
||||
msgstr "Mostrar detalhes"
|
||||
|
||||
@ -413,7 +458,7 @@ msgstr "%s foi adicionado aos seus favoritos."
|
||||
msgid "%s has been removed from your favorites."
|
||||
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
|
||||
msgid "Settings"
|
||||
msgstr "Configurações"
|
||||
@ -547,35 +592,35 @@ msgid "Next month"
|
||||
msgstr "Próximo mês"
|
||||
|
||||
#. Translators: Text to show if there are no events */
|
||||
#: ../js/ui/calendar.js:775
|
||||
#: ../js/ui/calendar.js:785
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Nada agendado"
|
||||
|
||||
#. 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"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %d de %B"
|
||||
|
||||
#. 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"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d de %B de %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:807
|
||||
#: ../js/ui/calendar.js:817
|
||||
msgid "Today"
|
||||
msgstr "Hoje"
|
||||
|
||||
#: ../js/ui/calendar.js:811
|
||||
#: ../js/ui/calendar.js:821
|
||||
msgid "Tomorrow"
|
||||
msgstr "Amanhã"
|
||||
|
||||
#: ../js/ui/calendar.js:822
|
||||
#: ../js/ui/calendar.js:832
|
||||
msgid "This week"
|
||||
msgstr "Esta semana"
|
||||
|
||||
#: ../js/ui/calendar.js:830
|
||||
#: ../js/ui/calendar.js:840
|
||||
msgid "Next week"
|
||||
msgstr "Próxima semana"
|
||||
|
||||
@ -608,40 +653,40 @@ msgstr "Senha:"
|
||||
msgid "Type again:"
|
||||
msgstr "Digite novamente:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
||||
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
|
||||
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
|
||||
msgid "Connect"
|
||||
msgstr "Conectar"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:224
|
||||
#: ../js/ui/components/networkAgent.js:236
|
||||
#: ../js/ui/components/networkAgent.js:264
|
||||
#: ../js/ui/components/networkAgent.js:284
|
||||
#: ../js/ui/components/networkAgent.js:294
|
||||
#: ../js/ui/components/networkAgent.js:230
|
||||
#: ../js/ui/components/networkAgent.js:242
|
||||
#: ../js/ui/components/networkAgent.js:270
|
||||
#: ../js/ui/components/networkAgent.js:290
|
||||
#: ../js/ui/components/networkAgent.js:300
|
||||
msgid "Password: "
|
||||
msgstr "Senha: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:229
|
||||
#: ../js/ui/components/networkAgent.js:235
|
||||
msgid "Key: "
|
||||
msgstr "Chave: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:268
|
||||
#: ../js/ui/components/networkAgent.js:274
|
||||
msgid "Identity: "
|
||||
msgstr "Identidade: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:270
|
||||
#: ../js/ui/components/networkAgent.js:276
|
||||
msgid "Private key password: "
|
||||
msgstr "Senha da chave privada: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:282
|
||||
#: ../js/ui/components/networkAgent.js:288
|
||||
msgid "Service: "
|
||||
msgstr "Serviço: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:311
|
||||
#: ../js/ui/components/networkAgent.js:317
|
||||
msgid "Authentication required by wireless network"
|
||||
msgstr "Autenticação requisitada pela rede sem fio"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:312
|
||||
#: ../js/ui/components/networkAgent.js:318
|
||||
#, javascript-format
|
||||
msgid ""
|
||||
"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 "
|
||||
"\"%s\"."
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:316
|
||||
#: ../js/ui/components/networkAgent.js:322
|
||||
msgid "Wired 802.1X authentication"
|
||||
msgstr "Autenticação 802.1X cabeada"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:318
|
||||
#: ../js/ui/components/networkAgent.js:324
|
||||
msgid "Network name: "
|
||||
msgstr "Nome da rede: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:323
|
||||
#: ../js/ui/components/networkAgent.js:329
|
||||
msgid "DSL authentication"
|
||||
msgstr "Autenticação DSL"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:330
|
||||
#: ../js/ui/components/networkAgent.js:336
|
||||
msgid "PIN code required"
|
||||
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"
|
||||
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: "
|
||||
msgstr "PIN: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:338
|
||||
#: ../js/ui/components/networkAgent.js:344
|
||||
msgid "Mobile broadband network password"
|
||||
msgstr "Senha da rede de banda larga móvel"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:339
|
||||
#: ../js/ui/components/networkAgent.js:345
|
||||
#, javascript-format
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "Uma senha é necessária para se conectar a \"%s\""
|
||||
@ -976,7 +1021,7 @@ msgstr "Visualizar conta"
|
||||
msgid "Unknown reason"
|
||||
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"
|
||||
msgstr "Janelas"
|
||||
|
||||
@ -988,23 +1033,23 @@ msgstr "Mostrar aplicativos"
|
||||
msgid "Dash"
|
||||
msgstr "Dash"
|
||||
|
||||
#: ../js/ui/dateMenu.js:97
|
||||
#: ../js/ui/dateMenu.js:96
|
||||
msgid "Open Calendar"
|
||||
msgstr "Abrir agenda"
|
||||
|
||||
#: ../js/ui/dateMenu.js:101
|
||||
#: ../js/ui/dateMenu.js:100
|
||||
msgid "Open Clocks"
|
||||
msgstr "Abrir relógios"
|
||||
|
||||
# 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"
|
||||
msgstr "Configurações de data & hora"
|
||||
|
||||
#. 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").
|
||||
#. */
|
||||
#: ../js/ui/dateMenu.js:205
|
||||
#: ../js/ui/dateMenu.js:204
|
||||
msgid "%A %B %e, %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
|
||||
msgctxt "title"
|
||||
msgid "Restart & Install Updates"
|
||||
msgstr "Reiniciar & Instalar atualizações"
|
||||
msgstr "Reiniciar & instalar atualizações"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:123
|
||||
#, javascript-format
|
||||
@ -1181,7 +1226,7 @@ msgstr "Habilitado"
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../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"
|
||||
msgstr "Desabilitado"
|
||||
|
||||
@ -1205,43 +1250,43 @@ msgstr "Ver fonte"
|
||||
msgid "Web Page"
|
||||
msgstr "Página web"
|
||||
|
||||
#: ../js/ui/messageTray.js:1326
|
||||
#: ../js/ui/messageTray.js:1325
|
||||
msgid "Open"
|
||||
msgstr "Abrir"
|
||||
|
||||
#: ../js/ui/messageTray.js:1333
|
||||
#: ../js/ui/messageTray.js:1332
|
||||
msgid "Remove"
|
||||
msgstr "Remover"
|
||||
|
||||
#: ../js/ui/messageTray.js:1630
|
||||
#: ../js/ui/messageTray.js:1629
|
||||
msgid "Notifications"
|
||||
msgstr "Notificações"
|
||||
|
||||
#: ../js/ui/messageTray.js:1637
|
||||
#: ../js/ui/messageTray.js:1636
|
||||
msgid "Clear Messages"
|
||||
msgstr "Sem mensagens"
|
||||
|
||||
#: ../js/ui/messageTray.js:1656
|
||||
#: ../js/ui/messageTray.js:1655
|
||||
msgid "Notification Settings"
|
||||
msgstr "Configurações de notificação"
|
||||
|
||||
#: ../js/ui/messageTray.js:1709
|
||||
#: ../js/ui/messageTray.js:1708
|
||||
msgid "Tray Menu"
|
||||
msgstr "Menu de notificação"
|
||||
|
||||
#: ../js/ui/messageTray.js:1926
|
||||
#: ../js/ui/messageTray.js:1925
|
||||
msgid "No Messages"
|
||||
msgstr "Sem mensagens"
|
||||
|
||||
#: ../js/ui/messageTray.js:1964
|
||||
#: ../js/ui/messageTray.js:1963
|
||||
msgid "Message Tray"
|
||||
msgstr "Área de notificação"
|
||||
|
||||
#: ../js/ui/messageTray.js:2967
|
||||
#: ../js/ui/messageTray.js:2966
|
||||
msgid "System Information"
|
||||
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"
|
||||
msgid "Unknown"
|
||||
msgstr "Desconhecido"
|
||||
@ -1269,32 +1314,37 @@ msgstr "Panorama"
|
||||
msgid "Type to search…"
|
||||
msgstr "Digite para pesquisar…"
|
||||
|
||||
#: ../js/ui/panel.js:516
|
||||
#: ../js/ui/panel.js:515
|
||||
msgid "Quit"
|
||||
msgstr "Sair"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview". */
|
||||
#: ../js/ui/panel.js:568
|
||||
#: ../js/ui/panel.js:567
|
||||
msgid "Activities"
|
||||
msgstr "Atividades"
|
||||
|
||||
#: ../js/ui/panel.js:915
|
||||
#: ../js/ui/panel.js:914
|
||||
msgid "Top Bar"
|
||||
msgstr "Barra superior"
|
||||
|
||||
#: ../js/ui/popupMenu.js:279
|
||||
#: ../js/ui/popupMenu.js:274
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
#: ../js/ui/runDialog.js:74
|
||||
#: ../js/ui/runDialog.js:70
|
||||
msgid "Enter a Command"
|
||||
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"
|
||||
msgstr "Fechar"
|
||||
|
||||
#: ../js/ui/runDialog.js:273
|
||||
#| msgid "Estimating…"
|
||||
msgid "Restarting…"
|
||||
msgstr "Reiniciando…"
|
||||
|
||||
#. Translators: This is a time format for a date in
|
||||
#. long format */
|
||||
#: ../js/ui/screenShield.js:88
|
||||
@ -1404,9 +1454,9 @@ msgstr "Texto grande"
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281
|
||||
#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/rfkill.js:114
|
||||
msgid "Turn Off"
|
||||
msgstr "Desligar"
|
||||
@ -1422,7 +1472,7 @@ msgid_plural "%d Connected Devices"
|
||||
msgstr[0] "%d dispositivo conectado"
|
||||
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"
|
||||
msgstr "Não conectado"
|
||||
|
||||
@ -1450,157 +1500,157 @@ msgstr "Habilitar"
|
||||
msgid "In Use"
|
||||
msgstr "Em uso"
|
||||
|
||||
#: ../js/ui/status/network.js:74
|
||||
#: ../js/ui/status/network.js:101
|
||||
msgid "<unknown>"
|
||||
msgstr "<desconhecido>"
|
||||
|
||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
||||
#: ../js/ui/status/network.js:1464
|
||||
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
|
||||
#: ../js/ui/status/network.js:1511
|
||||
msgid "Off"
|
||||
msgstr "Off"
|
||||
|
||||
#: ../js/ui/status/network.js:422
|
||||
#: ../js/ui/status/network.js:459
|
||||
msgid "Connected"
|
||||
msgstr "Conectado"
|
||||
|
||||
# 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
|
||||
#. 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"
|
||||
msgstr "Não gerenciável"
|
||||
|
||||
#: ../js/ui/status/network.js:428
|
||||
#: ../js/ui/status/network.js:465
|
||||
msgid "Disconnecting"
|
||||
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"
|
||||
msgstr "Conectando"
|
||||
|
||||
#. 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"
|
||||
msgstr "Autenticação necessária"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing */
|
||||
#: ../js/ui/status/network.js:445
|
||||
#: ../js/ui/status/network.js:482
|
||||
msgid "Firmware missing"
|
||||
msgstr "Firmware em falta"
|
||||
|
||||
#. Translators: this is for a network device that cannot be activated (for example it
|
||||
#. is disabled by rfkill, or it has no coverage */
|
||||
#: ../js/ui/status/network.js:449
|
||||
#: ../js/ui/status/network.js:486
|
||||
msgid "Unavailable"
|
||||
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"
|
||||
msgstr "Falha de conexão"
|
||||
|
||||
#: ../js/ui/status/network.js:467
|
||||
#: ../js/ui/status/network.js:504
|
||||
msgid "Wired Settings"
|
||||
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"
|
||||
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"
|
||||
msgstr "Hardware desabilitado"
|
||||
|
||||
#: ../js/ui/status/network.js:595
|
||||
#: ../js/ui/status/network.js:632
|
||||
msgid "Use as Internet connection"
|
||||
msgstr "Usar como conexão de Internet"
|
||||
|
||||
#: ../js/ui/status/network.js:776
|
||||
#: ../js/ui/status/network.js:813
|
||||
msgid "Airplane Mode is On"
|
||||
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."
|
||||
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"
|
||||
msgstr "Desligar modo avião"
|
||||
|
||||
#: ../js/ui/status/network.js:787
|
||||
#: ../js/ui/status/network.js:824
|
||||
msgid "Wi-Fi is Off"
|
||||
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."
|
||||
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"
|
||||
msgstr "Ligar Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:814
|
||||
#: ../js/ui/status/network.js:851
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Redes Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:816
|
||||
#: ../js/ui/status/network.js:853
|
||||
msgid "Select a network"
|
||||
msgstr "Selecione uma rede"
|
||||
|
||||
#: ../js/ui/status/network.js:845
|
||||
#: ../js/ui/status/network.js:882
|
||||
msgid "No Networks"
|
||||
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"
|
||||
msgstr "Usar alternador de hardware para desligar"
|
||||
|
||||
#: ../js/ui/status/network.js:1136
|
||||
#: ../js/ui/status/network.js:1173
|
||||
msgid "Select Network"
|
||||
msgstr "Selecione a rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1142
|
||||
#: ../js/ui/status/network.js:1179
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Configurações de Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1234
|
||||
#: ../js/ui/status/network.js:1281
|
||||
msgid "Turn On"
|
||||
msgstr "Ligar"
|
||||
|
||||
#: ../js/ui/status/network.js:1251
|
||||
#: ../js/ui/status/network.js:1298
|
||||
msgid "Hotspot Active"
|
||||
msgstr "Ponto de acesso ativo"
|
||||
|
||||
#: ../js/ui/status/network.js:1362
|
||||
#: ../js/ui/status/network.js:1409
|
||||
msgid "connecting..."
|
||||
msgstr "conectando..."
|
||||
|
||||
#. 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"
|
||||
msgstr "autenticação necessária"
|
||||
|
||||
#: ../js/ui/status/network.js:1367
|
||||
#: ../js/ui/status/network.js:1414
|
||||
msgid "connection failed"
|
||||
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"
|
||||
msgstr "Configurações de rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1435
|
||||
#: ../js/ui/status/network.js:1482
|
||||
msgid "VPN Settings"
|
||||
msgstr "Configurações de VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1454
|
||||
#: ../js/ui/status/network.js:1501
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1607
|
||||
#: ../js/ui/status/network.js:1656
|
||||
msgid "Network Manager"
|
||||
msgstr "Gerenciador de rede"
|
||||
|
||||
#: ../js/ui/status/network.js:1647
|
||||
#: ../js/ui/status/network.js:1696
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Falha ao ativar a conexão da rede"
|
||||
|
||||
@ -1684,11 +1734,11 @@ msgstr "Iniciar sessão como outro usuário"
|
||||
msgid "Unlock Window"
|
||||
msgstr "Desbloquear janela"
|
||||
|
||||
#: ../js/ui/viewSelector.js:100
|
||||
#: ../js/ui/viewSelector.js:233
|
||||
msgid "Applications"
|
||||
msgstr "Aplicativos"
|
||||
|
||||
#: ../js/ui/viewSelector.js:104
|
||||
#: ../js/ui/viewSelector.js:237
|
||||
msgid "Search"
|
||||
msgstr "Pesquisar"
|
||||
|
||||
@ -1697,22 +1747,22 @@ msgstr "Pesquisar"
|
||||
msgid "“%s” is ready"
|
||||
msgstr "\"%s\" está pronto"
|
||||
|
||||
#: ../js/ui/windowManager.js:57
|
||||
#: ../js/ui/windowManager.js:58
|
||||
msgid "Do you want to keep these display settings?"
|
||||
msgstr "Você deseja manter essas configurações de exibição?"
|
||||
|
||||
#. Translators: this and the following message should be limited in lenght,
|
||||
#. to avoid ellipsizing the labels.
|
||||
#. */
|
||||
#: ../js/ui/windowManager.js:76
|
||||
#: ../js/ui/windowManager.js:77
|
||||
msgid "Revert Settings"
|
||||
msgstr "Reverter configurações"
|
||||
|
||||
#: ../js/ui/windowManager.js:80
|
||||
#: ../js/ui/windowManager.js:81
|
||||
msgid "Keep Changes"
|
||||
msgstr "Manter alterações"
|
||||
|
||||
#: ../js/ui/windowManager.js:99
|
||||
#: ../js/ui/windowManager.js:100
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
@ -1785,19 +1835,19 @@ msgstr[1] "%u entradas"
|
||||
msgid "System Sounds"
|
||||
msgstr "Sons do sistema"
|
||||
|
||||
#: ../src/main.c:349
|
||||
#: ../src/main.c:371
|
||||
msgid "Print version"
|
||||
msgstr "Versão de impressão"
|
||||
|
||||
#: ../src/main.c:355
|
||||
#: ../src/main.c:377
|
||||
msgid "Mode used by GDM for login screen"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2014-03-19 20:32+0000\n"
|
||||
"PO-Revision-Date: 2014-03-21 21:41+0800\n"
|
||||
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
|
||||
"POT-Creation-Date: 2014-04-10 08:01+0000\n"
|
||||
"PO-Revision-Date: 2014-04-10 23:25+0800\n"
|
||||
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
|
||||
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
|
||||
"Language: zh_TW\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\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
|
||||
msgid "System"
|
||||
@ -308,25 +308,25 @@ msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "登入"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:270
|
||||
#: ../js/gdm/loginDialog.js:271
|
||||
msgid "Choose Session"
|
||||
msgstr "選擇作業階段"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:430
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "沒有列出來?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:608
|
||||
#: ../js/gdm/loginDialog.js:614
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %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
|
||||
msgid "Username: "
|
||||
msgstr "使用者名稱:"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:884
|
||||
#: ../js/gdm/loginDialog.js:920
|
||||
msgid "Login Window"
|
||||
msgstr "登入視窗"
|
||||
|
||||
@ -351,27 +351,27 @@ msgstr "無法分析指令:"
|
||||
msgid "Execution of “%s” failed:"
|
||||
msgstr "執行「%s」失敗:"
|
||||
|
||||
#: ../js/ui/appDisplay.js:629
|
||||
#: ../js/ui/appDisplay.js:636
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "經常使用的應用程式會出現在這裡"
|
||||
|
||||
#: ../js/ui/appDisplay.js:740
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
msgid "Frequent"
|
||||
msgstr "常用"
|
||||
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
#: ../js/ui/appDisplay.js:754
|
||||
msgid "All"
|
||||
msgstr "全部"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1555
|
||||
#: ../js/ui/appDisplay.js:1566
|
||||
msgid "New Window"
|
||||
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"
|
||||
msgstr "自喜好中移除"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1583
|
||||
#: ../js/ui/appDisplay.js:1594
|
||||
msgid "Add to Favorites"
|
||||
msgstr "加入喜好"
|
||||
|
||||
@ -788,13 +788,13 @@ msgstr "%s 正在邀請您加入 %s"
|
||||
#: ../js/ui/components/telepathyClient.js:1164
|
||||
#: ../js/ui/components/telepathyClient.js:1199
|
||||
#: ../js/ui/components/telepathyClient.js:1233
|
||||
#: ../js/ui/components/telepathyClient.js:1290
|
||||
#: ../js/ui/components/telepathyClient.js:1291
|
||||
msgid "Decline"
|
||||
msgstr "拒絕"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1296
|
||||
msgid "Accept"
|
||||
msgstr "接受"
|
||||
|
||||
@ -831,118 +831,118 @@ msgstr "%s 正傳送給您 %s"
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s 想要得到查看您上線狀態的許可"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid "Network error"
|
||||
msgstr "網路錯誤"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid "Authentication failed"
|
||||
msgstr "核對失敗"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Encryption error"
|
||||
msgstr "加密發生錯誤"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1347
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Certificate not provided"
|
||||
msgstr "沒有提供憑證"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1349
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "憑證不被信任"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
msgid "Certificate expired"
|
||||
msgstr "憑證已逾期"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
msgid "Certificate not activated"
|
||||
msgstr "憑證尚未使用"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "憑證主機名稱不符"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1357
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "憑證數位指紋不符"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "憑證為自我簽署"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Status is set to offline"
|
||||
msgstr "狀態設為離線"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Encryption is not available"
|
||||
msgstr "加密無法使用"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "憑證無效"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1367
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Connection has been refused"
|
||||
msgstr "連線遭到拒絕"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1369
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
msgid "Connection can't be established"
|
||||
msgstr "無法建立連線"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1371
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
msgid "Connection has been lost"
|
||||
msgstr "已失去連線"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1373
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "這個帳號已連接至該伺服器"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1375
|
||||
#: ../js/ui/components/telepathyClient.js:1376
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "連線已被使用相同資源的新連線取代"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1377
|
||||
#: ../js/ui/components/telepathyClient.js:1378
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "該帳號已經存在於伺服器上"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1379
|
||||
#: ../js/ui/components/telepathyClient.js:1380
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "伺服器目前過於忙碌以致於無法處理該連線"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1381
|
||||
#: ../js/ui/components/telepathyClient.js:1382
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "憑證已被撤銷"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr "憑證使用不安全的密碼演算法,或是密碼處理上較弱"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1385
|
||||
#: ../js/ui/components/telepathyClient.js:1386
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
msgstr "伺服器憑證的長度,或是伺服器憑證鏈的深度超過密碼函式庫所能處理的範圍"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1387
|
||||
#: ../js/ui/components/telepathyClient.js:1388
|
||||
msgid "Internal error"
|
||||
msgstr "內部的錯誤"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1397
|
||||
#: ../js/ui/components/telepathyClient.js:1398
|
||||
#, javascript-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "無法連線到 %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#: ../js/ui/components/telepathyClient.js:1403
|
||||
msgid "View account"
|
||||
msgstr "檢視帳號"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1439
|
||||
#: ../js/ui/components/telepathyClient.js:1440
|
||||
msgid "Unknown reason"
|
||||
msgstr "不明原因"
|
||||
|
||||
@ -1129,7 +1129,8 @@ msgstr "隱藏錯誤"
|
||||
msgid "Show Errors"
|
||||
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"
|
||||
msgstr "已啟用"
|
||||
|
||||
@ -1137,8 +1138,8 @@ msgstr "已啟用"
|
||||
#. because it's disabled by rfkill (airplane mode) */
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/network.js:555
|
||||
#: ../src/gvc/gvc-mixer-control.c:1830
|
||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "已停用"
|
||||
|
||||
@ -1283,7 +1284,7 @@ msgstr "鎖定被應用程式阻擋"
|
||||
msgid "Searching…"
|
||||
msgstr "搜尋…"
|
||||
|
||||
#: ../js/ui/search.js:646
|
||||
#: ../js/ui/search.js:649
|
||||
msgid "No results."
|
||||
msgstr "沒有結果。"
|
||||
|
||||
@ -1359,8 +1360,7 @@ msgstr "大型文字"
|
||||
msgid "Bluetooth"
|
||||
msgstr "藍牙"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/location.js:60
|
||||
#: ../js/ui/status/location.js:167 ../js/ui/status/network.js:151
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
||||
#: ../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/rfkill.js:105
|
||||
@ -1393,24 +1393,29 @@ msgstr "顯示鍵盤配置"
|
||||
msgid "Location"
|
||||
msgstr "位置"
|
||||
|
||||
#: ../js/ui/status/location.js:59 ../js/ui/status/location.js:166
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
msgid "On"
|
||||
msgstr "開啟"
|
||||
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
|
||||
#| msgid "Disabled"
|
||||
msgid "Disable"
|
||||
msgstr "停用"
|
||||
|
||||
#: ../js/ui/status/location.js:163 ../js/ui/status/network.js:420
|
||||
#: ../js/ui/status/network.js:1260 ../js/ui/status/network.js:1464
|
||||
msgid "Off"
|
||||
msgstr "關閉"
|
||||
#: ../js/ui/status/location.js:165
|
||||
#| msgid "Enabled"
|
||||
msgid "Enable"
|
||||
msgstr "啟用"
|
||||
|
||||
#: ../js/ui/status/location.js:164 ../js/ui/status/network.js:1234
|
||||
msgid "Turn On"
|
||||
msgstr "開啟"
|
||||
#: ../js/ui/status/location.js:167
|
||||
msgid "In Use"
|
||||
msgstr "使用中"
|
||||
|
||||
#: ../js/ui/status/network.js:74
|
||||
msgid "<unknown>"
|
||||
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
|
||||
msgid "Connected"
|
||||
msgstr "已連線"
|
||||
@ -1514,6 +1519,10 @@ msgstr "選擇網路"
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Wi-Fi 設定值"
|
||||
|
||||
#: ../js/ui/status/network.js:1234
|
||||
msgid "Turn On"
|
||||
msgstr "開啟"
|
||||
|
||||
#: ../js/ui/status/network.js:1251
|
||||
msgid "Hotspot Active"
|
||||
msgstr "熱點活動中"
|
||||
@ -1580,6 +1589,10 @@ msgstr "電池"
|
||||
msgid "Airplane Mode"
|
||||
msgstr "飛安模式"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
msgid "On"
|
||||
msgstr "開啟"
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
msgid "Switch User"
|
||||
msgstr "切換使用者"
|
||||
|
@ -199,6 +199,21 @@ nodist_gnome_shell_extension_prefs_SOURCES = \
|
||||
gnome_shell_extension_prefs_CPPFLAGS = $(gnome_shell_cflags)
|
||||
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 = \
|
||||
@ -242,7 +257,7 @@ libexec_PROGRAMS += gnome-shell-perf-helper
|
||||
|
||||
gnome_shell_perf_helper_SOURCES = shell-perf-helper.c
|
||||
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;
|
||||
|
||||
text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
|
||||
Math.floor(monitor.height / 2 - text.height / 2));
|
||||
text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
|
||||
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
|
||||
|
||||
Tweener.addTween(text,
|
||||
{ opacity: 0,
|
||||
|
@ -75,7 +75,9 @@ def start_shell(perf_output=None):
|
||||
# Set up environment
|
||||
env = dict(os.environ)
|
||||
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:
|
||||
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 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():
|
||||
iters = options.perf_iters
|
||||
if options.perf_warmup:
|
||||
@ -289,6 +296,13 @@ def run_performance_test():
|
||||
|
||||
if options.perf_upload:
|
||||
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:
|
||||
# Write a human readable summary
|
||||
print '------------------------------------------------------------';
|
||||
@ -304,8 +318,7 @@ def run_performance_test():
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option("", "--perf", metavar="PERF_MODULE",
|
||||
help="Specify the name of a performance module to run",
|
||||
default="core")
|
||||
help="Specify the name of a performance module to run")
|
||||
parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
|
||||
help="Numbers of iterations of performance module to run",
|
||||
default=1)
|
||||
@ -315,6 +328,10 @@ parser.add_option("", "--perf-output", metavar="OUTPUT_FILE",
|
||||
help="Output file to write performance report")
|
||||
parser.add_option("", "--perf-upload", action="store_true",
|
||||
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,
|
||||
help="Display version and exit")
|
||||
|
||||
@ -323,12 +340,25 @@ parser.add_option("-r", "--replace", action="store_true",
|
||||
|
||||
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:
|
||||
parser.print_usage()
|
||||
sys.exit(1)
|
||||
|
||||
normal_exit = run_performance_test()
|
||||
if normal_exit:
|
||||
restore_shell()
|
||||
if not options.hwtest:
|
||||
restore_shell()
|
||||
else:
|
||||
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);
|
||||
Bool (* query_extension) (Display *dpy, int *error, int *event);
|
||||
MetaScreen *screen;
|
||||
MetaDisplay *display;
|
||||
Display *xdisplay;
|
||||
const char *glx_extensions;
|
||||
|
||||
@ -183,9 +182,8 @@ gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
|
||||
return FALSE;
|
||||
|
||||
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 =
|
||||
(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
|
||||
* by ignoring such events */
|
||||
if (swap_complete_event->ust != 0)
|
||||
shell_perf_log_event_x (shell_perf_log_get_default (),
|
||||
"glx.swapComplete",
|
||||
swap_complete_event->ust);
|
||||
{
|
||||
gboolean frame_timestamps;
|
||||
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
|
||||
|
||||
|
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;
|
||||
|
||||
gboolean has_modal;
|
||||
gboolean frame_timestamps;
|
||||
gboolean frame_finish_timestamp;
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -116,6 +118,8 @@ enum {
|
||||
PROP_IMAGEDIR,
|
||||
PROP_USERDATADIR,
|
||||
PROP_FOCUS_MANAGER,
|
||||
PROP_FRAME_TIMESTAMPS,
|
||||
PROP_FRAME_FINISH_TIMESTAMP,
|
||||
};
|
||||
|
||||
/* Signals */
|
||||
@ -146,6 +150,12 @@ shell_global_set_property(GObject *object,
|
||||
g_clear_pointer (&global->session_mode, g_free);
|
||||
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
|
||||
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:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -217,6 +227,12 @@ shell_global_get_property(GObject *object,
|
||||
case PROP_FOCUS_MANAGER:
|
||||
g_value_set_object (value, global->focus_manager);
|
||||
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:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@ -500,6 +516,20 @@ shell_global_class_init (ShellGlobalClass *klass)
|
||||
"The shell's StFocusManager",
|
||||
ST_TYPE_FOCUS_MANAGER,
|
||||
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
|
||||
global_stage_before_paint (gpointer data)
|
||||
{
|
||||
shell_perf_log_event (shell_perf_log_get_default (),
|
||||
"clutter.stagePaintStart");
|
||||
ShellGlobal *global = SHELL_GLOBAL (data);
|
||||
|
||||
if (global->frame_timestamps)
|
||||
shell_perf_log_event (shell_perf_log_get_default (),
|
||||
"clutter.stagePaintStart");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
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 (),
|
||||
"clutter.stagePaintDone");
|
||||
*func = cogl_get_proc_address (name);
|
||||
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;
|
||||
}
|
||||
@ -784,7 +868,11 @@ update_scale_factor (GtkSettings *settings,
|
||||
|
||||
g_value_init (&value, G_TYPE_INT);
|
||||
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 */
|
||||
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,
|
||||
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,
|
||||
global_stage_after_paint,
|
||||
NULL, NULL);
|
||||
global_stage_after_swap,
|
||||
global, NULL);
|
||||
|
||||
shell_perf_log_define_event (shell_perf_log_get_default(),
|
||||
"clutter.stagePaintStart",
|
||||
"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(),
|
||||
"clutter.stagePaintDone",
|
||||
"End of stage page repaint",
|
||||
"End of frame, possibly including swap time",
|
||||
"");
|
||||
|
||||
g_signal_connect (global->stage, "notify::key-focus",
|
||||
|
@ -9,6 +9,8 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkx.h>
|
||||
|
||||
@ -27,6 +29,7 @@ static const gchar introspection_xml[] =
|
||||
" <arg type='i' name='height' direction='in'/>"
|
||||
" <arg type='b' name='alpha' direction='in'/>"
|
||||
" <arg type='b' name='maximized' direction='in'/>"
|
||||
" <arg type='b' name='redraws' direction='in'/>"
|
||||
" </method>"
|
||||
" <method name='WaitWindows'/>"
|
||||
" <method name='DestroyWindows'/>"
|
||||
@ -40,9 +43,13 @@ typedef struct {
|
||||
|
||||
guint alpha : 1;
|
||||
guint maximized : 1;
|
||||
guint redraws : 1;
|
||||
guint mapped : 1;
|
||||
guint exposed : 1;
|
||||
guint pending : 1;
|
||||
|
||||
gint64 start_time;
|
||||
gint64 time;
|
||||
} WindowInfo;
|
||||
|
||||
static int opt_idle_timeout = 30;
|
||||
@ -119,6 +126,7 @@ on_window_draw (GtkWidget *window,
|
||||
{
|
||||
cairo_rectangle_int_t 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
|
||||
* window to make it more clear than empty windows if something
|
||||
@ -136,16 +144,27 @@ on_window_draw (GtkWidget *window,
|
||||
cairo_paint (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_line_width (cr, 10);
|
||||
cairo_move_to (cr, 0, 40);
|
||||
cairo_line_to (cr, allocation.width, 40);
|
||||
cairo_move_to (cr, 0, allocation.height - 40);
|
||||
cairo_line_to (cr, allocation.width, allocation.height - 40);
|
||||
cairo_move_to (cr, 40, 0);
|
||||
cairo_line_to (cr, 40, allocation.height);
|
||||
cairo_move_to (cr, allocation.width - 40, 0);
|
||||
cairo_line_to (cr, allocation.width - 40, allocation.height);
|
||||
cairo_move_to (cr, 0, 40 + y_offset);
|
||||
cairo_line_to (cr, allocation.width, 40 + y_offset);
|
||||
cairo_move_to (cr, 0, allocation.height - 40 + y_offset);
|
||||
cairo_line_to (cr, allocation.width, allocation.height - 40 + y_offset);
|
||||
cairo_move_to (cr, 40 + x_offset, 0);
|
||||
cairo_line_to (cr, 40 + x_offset, allocation.height);
|
||||
cairo_move_to (cr, allocation.width - 40 + x_offset, 0);
|
||||
cairo_line_to (cr, allocation.width - 40 + x_offset, allocation.height);
|
||||
cairo_stroke (cr);
|
||||
|
||||
info->exposed = TRUE;
|
||||
@ -159,11 +178,29 @@ on_window_draw (GtkWidget *window,
|
||||
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
|
||||
create_window (int width,
|
||||
int height,
|
||||
gboolean alpha,
|
||||
gboolean maximized)
|
||||
gboolean maximized,
|
||||
gboolean redraws)
|
||||
{
|
||||
WindowInfo *info;
|
||||
|
||||
@ -172,12 +209,14 @@ create_window (int width,
|
||||
info->height = height;
|
||||
info->alpha = alpha;
|
||||
info->maximized = maximized;
|
||||
info->redraws = redraws;
|
||||
info->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
if (alpha)
|
||||
gtk_widget_set_visual (info->window, gdk_screen_get_rgba_visual (gdk_screen_get_default ()));
|
||||
if (maximized)
|
||||
gtk_window_maximize (GTK_WINDOW (info->window));
|
||||
info->pending = TRUE;
|
||||
info->start_time = -1;
|
||||
|
||||
gtk_widget_set_size_request (info->window, width, height);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -242,11 +285,11 @@ handle_method_call (GDBusConnection *connection,
|
||||
else if (g_strcmp0 (method_name, "CreateWindow") == 0)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else if (g_strcmp0 (method_name, "WaitWindows") == 0)
|
||||
|
@ -126,11 +126,7 @@ G_DEFINE_TYPE(ShellPerfLog, shell_perf_log, G_TYPE_OBJECT);
|
||||
static gint64
|
||||
get_time (void)
|
||||
{
|
||||
GTimeVal timeval;
|
||||
|
||||
g_get_current_time (&timeval);
|
||||
|
||||
return timeval.tv_sec * G_GINT64_CONSTANT(1000000) + timeval.tv_usec;
|
||||
return g_get_monotonic_time ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -751,7 +751,7 @@ recorder_connect_stage_callbacks (ShellRecorder *recorder)
|
||||
G_CALLBACK (recorder_on_stage_paint), recorder);
|
||||
g_signal_connect (recorder->stage, "notify::width",
|
||||
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);
|
||||
|
||||
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",
|
||||
"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);
|
||||
|
||||
pspec = g_param_spec_int ("icon-size",
|
||||
|
Reference in New Issue
Block a user