Compare commits

..

10 Commits

Author SHA1 Message Date
Carlos Garnacho
38509081e7 windowManager: Switch the focused application on 3-finger hold + tap
The gesture action only cycles through the applications in the current
workspace.
2014-06-27 23:32:54 +02:00
Carlos Garnacho
f659b66a9d Add AppSwitchAction Clutter.GestureAction
This action implements 3-finger hold + 4th finger tap to switch
the focused application.
2014-06-27 23:32:54 +02:00
Carlos Garnacho
247a42ccc4 windowManager: switch workspaces on 4-finger drag
The workspace to switch is obtained from the direction received
by the WorkspaceSwitchAction gesture.
2014-06-27 23:32:54 +02:00
Carlos Garnacho
a50a463eb3 Add workspaceSwitchAction Clutter.GestureAction
This gesture implements 4-finger drag, that will be used for workspace
switching.
2014-06-27 23:32:54 +02:00
Carlos Garnacho
dc7cca7e6d viewSelector: Show the overview on 3-finger pinch gestures 2014-06-27 23:32:54 +02:00
Carlos Garnacho
38032bf820 Add showOverViewAction Clutter.GestureAction
This gesture implements 3-finger pinch, that will be used to show
the overview.
2014-06-27 23:32:54 +02:00
Carlos Garnacho
624314ee3e backgroundMenu: release the click gesture if a grab operation begun
If an active grab on pointer events happens during multi-touch operations,
all non-pointer-emulating touches will be muted. This may leave the
Clutter.ClickAction incomplete if triggered by one of those sequences,
just to have a gesture take over and trigger a compositor grab, which would
leave the capture-event handler stuck eating events.

So listen for grab-op-begin from the display, and ensure the action is
released if such grab begins.
and the capture event handler stuck.
2014-06-27 23:32:54 +02:00
Carlos Garnacho
ed6dc326d1 viewSelector: add left edge drag gesture to show the app picker 2014-06-27 23:32:54 +02:00
Carlos Garnacho
13b4290e55 messageTray: Add bottom drag gesture to popup the message tray 2014-06-27 23:32:54 +02:00
Carlos Garnacho
f4e0f6385c Add edgeDrag Clutter.GestureAction
This action is only triggered if started from the monitor edge specified
on construction.
2014-06-27 23:32:54 +02:00
50 changed files with 2504 additions and 3736 deletions

3
.gitignore vendored
View File

@@ -28,8 +28,6 @@ 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
@@ -82,7 +80,6 @@ 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
View File

@@ -1,28 +1,3 @@
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]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.13.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.13.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -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.4
MUTTER_MIN_VERSION=3.13.3
GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3

View File

@@ -2092,11 +2092,6 @@ StScrollBar StButton#vhandle:active {
font-size: 10pt;
}
/* Restart message */
.restart-message {
font-size: 14pt;
}
/* ShellMountOperation Dialogs */
.shell-mount-operation-icon {
icon-size: 48px;

View File

@@ -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) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --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

View File

@@ -54,17 +54,15 @@ 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 (checkVersion && ExtensionUtils.isOutOfDate(extension))
if (ExtensionUtils.isOutOfDate(extension))
return false;
if (!extension.dir.get_child('prefs.js').query_exists(null))

View File

@@ -25,7 +25,6 @@
<file>misc/util.js</file>
<file>perf/core.js</file>
<file>perf/hwtest.js</file>
<file>portalHelper/main.js</file>
@@ -33,6 +32,7 @@
<file>ui/animation.js</file>
<file>ui/appDisplay.js</file>
<file>ui/appFavorites.js</file>
<file>ui/appSwitchAction.js</file>
<file>ui/backgroundMenu.js</file>
<file>ui/background.js</file>
<file>ui/boxpointer.js</file>
@@ -42,6 +42,7 @@
<file>ui/dash.js</file>
<file>ui/dateMenu.js</file>
<file>ui/dnd.js</file>
<file>ui/edgeDragAction.js</file>
<file>ui/endSessionDialog.js</file>
<file>ui/environment.js</file>
<file>ui/extensionDownloader.js</file>
@@ -80,6 +81,7 @@
<file>ui/shellDBus.js</file>
<file>ui/shellEntry.js</file>
<file>ui/shellMountOperation.js</file>
<file>ui/showOverviewAction.js</file>
<file>ui/slider.js</file>
<file>ui/switcherPopup.js</file>
<file>ui/tweener.js</file>
@@ -90,6 +92,7 @@
<file>ui/windowMenu.js</file>
<file>ui/windowManager.js</file>
<file>ui/workspace.js</file>
<file>ui/workspaceSwitchAction.js</file>
<file>ui/workspaceSwitcherPopup.js</file>
<file>ui/workspaceThumbnail.js</file>
<file>ui/workspacesView.js</file>

View File

@@ -72,9 +72,6 @@ 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');
});
@@ -90,10 +87,7 @@ function run() {
yield Scripting.destroyTestWindows();
for (let k = 0; k < config.count; k++)
yield Scripting.createTestWindow({ width: config.width,
height: config.height,
alpha: config.alpha,
maximized: config.maximized });
yield Scripting.createTestWindow(config.width, config.height, config.alpha, config.maximized);
yield Scripting.waitTestWindows();
yield Scripting.sleep(1000);

View File

@@ -1,308 +0,0 @@
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;
}

View File

@@ -1253,51 +1253,6 @@ 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() {
@@ -1323,6 +1278,8 @@ 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);
},

View File

@@ -6,26 +6,6 @@ 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',
@@ -44,21 +24,6 @@ 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);

64
js/ui/appSwitchAction.js Normal file
View File

@@ -0,0 +1,64 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Signals = imports.signals;
const Clutter = imports.gi.Clutter;
//in milliseconds
let LONG_PRESS_TIMEOUT = 250;
let MOTION_THRESHOLD = 30;
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, this.cancel));
global.display.connect('grab-op-end', Lang.bind(this, this.cancel));
},
vfunc_gesture_prepare : function(action, actor) {
return this.get_n_current_points() <= 4;
},
vfunc_gesture_begin : function(action, actor) {
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) {
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);

View File

@@ -55,7 +55,7 @@ function addBackgroundMenu(actor, layoutManager) {
});
actor.add_action(clickAction);
let grabOpBeginId = global.display.connect('grab-op-begin', function () {
global.display.connect('grab-op-begin', function () {
clickAction.release();
});
@@ -63,6 +63,5 @@ function addBackgroundMenu(actor, layoutManager) {
actor._backgroundMenu.destroy();
actor._backgroundMenu = null;
actor._backgroundManager = null;
global.display.disconnect(grabOpBeginId);
});
}

76
js/ui/edgeDragAction.js Normal file
View File

@@ -0,0 +1,76 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Signals = imports.signals;
const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
let EDGE_THRESHOLD = 20;
let 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, this.cancel));
global.display.connect('grab-op-end', Lang.bind(this, 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);

View File

@@ -11,9 +11,6 @@ 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',
@@ -92,7 +89,7 @@ const CandidateArea = new Lang.Class({
if (!visible)
continue;
box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : DEFAULT_INDEX_LABELS[i]);
box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : '%x'.format(i + 1));
box._candidateLabel.text = candidates[i];
}

View File

@@ -597,9 +597,7 @@ const LayoutManager = new Lang.Class({
reactive: true });
this.addChrome(this._coverPane);
if (Meta.is_restart()) {
// On restart, we don't do an animation
} else if (Main.sessionMode.isGreeter) {
if (Main.sessionMode.isGreeter) {
this.panelBox.translation_y = -this.panelBox.height;
} else {
this._updateBackgrounds();
@@ -638,9 +636,7 @@ const LayoutManager = new Lang.Class({
},
_startupAnimation: function() {
if (Meta.is_restart())
this._startupAnimationComplete();
else if (Main.sessionMode.isGreeter)
if (Main.sessionMode.isGreeter)
this._startupAnimationGreeter();
else
this._startupAnimationSession();

View File

@@ -18,7 +18,6 @@ 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;
@@ -168,16 +167,6 @@ 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();
@@ -244,7 +233,8 @@ function _loadDefaultStylesheet() {
* Returns: A file path that contains the theme CSS,
* null if using the default
*/
function getThemeStylesheet() {
function getThemeStylesheet()
{
return _cssStylesheet;
}
@@ -255,7 +245,8 @@ function getThemeStylesheet() {
*
* Set the theme CSS file that the shell will load
*/
function setThemeStylesheet(cssStylesheet) {
function setThemeStylesheet(cssStylesheet)
{
_cssStylesheet = cssStylesheet;
}
@@ -617,28 +608,3 @@ 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();
}

View File

@@ -15,6 +15,7 @@ const Signals = imports.signals;
const St = imports.gi.St;
const Tp = imports.gi.TelepathyGLib;
const EdgeDragAction = imports.ui.edgeDragAction;
const BoxPointer = imports.ui.boxpointer;
const CtrlAltTab = imports.ui.ctrlAltTab;
const GnomeSession = imports.misc.gnomeSession;
@@ -1933,6 +1934,10 @@ const MessageTray = new Lang.Class({
this._messageTrayMenuButton = new MessageTrayMenuButton(this);
this.actor.add_actor(this._messageTrayMenuButton.actor);
let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM);
gesture.connect('activated', Lang.bind(this, this.toggle));
global.stage.add_action(gesture);
},
close: function() {

View File

@@ -43,7 +43,6 @@ const ModalDialog = new Lang.Class({
styleClass: null,
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
shouldFadeIn: true,
shouldFadeOut: true,
destroyOnClose: true });
this.state = State.CLOSED;
@@ -51,7 +50,6 @@ 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,
@@ -309,15 +307,6 @@ 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;
@@ -326,16 +315,20 @@ const ModalDialog = new Lang.Class({
this.popModal(timestamp);
this._savedKeyFocus = null;
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();
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();
})
});
},
// Drop modal status without closing the dialog; this makes the

View File

@@ -120,12 +120,15 @@ 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);
},
@@ -689,12 +692,6 @@ 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',
@@ -708,20 +705,12 @@ const GtkNotificationDaemonNotification = new Lang.Class({
"body": body,
"icon": gicon,
"urgent": urgent,
"priority": priority,
"buttons": buttons,
"default-action": defaultAction,
"default-action-target": defaultActionTarget } = notification;
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);
}
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
: MessageTray.Urgency.NORMAL);
if (buttons) {
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {

View File

@@ -425,6 +425,8 @@ const Overview = new Lang.Class({
this.emit('windows-restacked', stackIndices);
},
//// Public methods ////
beginItemDrag: function(source) {
this.emit('item-drag-begin');
this._inDrag = true;
@@ -453,6 +455,23 @@ 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();
@@ -485,6 +504,69 @@ 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
@@ -501,6 +583,8 @@ 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
@@ -530,92 +614,6 @@ 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;
@@ -640,6 +638,20 @@ 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);
@@ -665,16 +677,6 @@ 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);

View File

@@ -14,6 +14,7 @@ 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;

View File

@@ -378,9 +378,9 @@ const PopupImageMenuItem = new Lang.Class({
this.parent(params);
this.label = new St.Label({ text: text });
this.actor.add_child(this.label);
this.addActor(this.label);
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.actor.add_child(this._icon, { align: St.Align.END });
this.addActor(this._icon, { align: St.Align.END });
this.setIcon(iconName);
},

View File

@@ -50,10 +50,14 @@ const RunDialog = new Lang.Class({
Main.createLookingGlass().open();
}),
'r': Lang.bind(this, this._restart),
'r': Lang.bind(this, function() {
global.reexec_self();
}),
// Developer brain backwards compatibility
'restart': Lang.bind(this, this._restart),
'restart': Lang.bind(this, function() {
global.reexec_self();
}),
'debugexit': Lang.bind(this, function() {
Meta.quit(Meta.ExitCode.ERROR);
@@ -267,12 +271,6 @@ const RunDialog = new Lang.Class({
}
},
_restart: function() {
this._shouldFadeOut = false;
this.close();
Meta.restart(_("Restarting…"));
},
open: function() {
this._history.lastItem();
this._errorBox.hide();

View File

@@ -7,7 +7,6 @@ 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
@@ -79,7 +78,6 @@ 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" /> \
@@ -99,36 +97,11 @@ 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:
* @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)
* @width: width of window, in pixels
* @height: height of window, in pixels
* @alpha: whether the window should be alpha transparent
* @maximized: whethe the window should be created maximized
*
* Creates a window using gnome-shell-perf-helper for testing purposes.
@@ -137,17 +110,19 @@ function _callRemote(obj, method, ...args) {
* 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, params) {
params = Params.parse(params, { width: 640,
height: 480,
alpha: false,
maximized: false,
redraws: false });
function createTestWindow(width, height, alpha, maximized) {
let cb;
let perfHelper = _getPerfHelper();
return _callRemote(perfHelper, perfHelper.CreateWindowRemote,
params.width, params.height,
params.alpha, params.maximized, params.redraws);
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
function(result, excp) {
if (cb)
cb();
});
return function(callback) {
cb = callback;
};
}
/**
@@ -157,8 +132,17 @@ function createTestWindow(width, height, params) {
* created with createTestWindow have been mapped and exposed.
*/
function waitTestWindows() {
let cb;
let perfHelper = _getPerfHelper();
return _callRemote(perfHelper, perfHelper.WaitWindowsRemote);
perfHelper.WaitWindowsRemote(function(result, excp) {
if (cb)
cb();
});
return function(callback) {
cb = callback;
};
}
/**
@@ -171,8 +155,17 @@ function waitTestWindows() {
* process because of normal X asynchronicity.
*/
function destroyTestWindows() {
let cb;
let perfHelper = _getPerfHelper();
return _callRemote(perfHelper, perfHelper.DestroyWindowsRemote);
perfHelper.DestroyWindowsRemote(function(result, excp) {
if (cb)
cb();
});
return function(callback) {
cb = callback;
};
}
/**
@@ -215,10 +208,6 @@ 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)
@@ -317,8 +306,8 @@ function _collect(scriptModule, outputFile) {
print ('------------------------------------------------------------');
for (let i = 0; i < metrics.length; i++) {
let metric = metrics[i];
print ('# ' + scriptModule.METRICS[metric].description);
print (metric + ': ' + scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units);
print ('# ' + scriptModule.METRIC_DESCRIPTIONS[metric]);
print (metric + ': ' + scriptModule.METRICS[metric]);
}
print ('------------------------------------------------------------');
}
@@ -371,12 +360,7 @@ function runPerfScript(scriptModule, outputFile) {
_step(g,
function() {
try {
_collect(scriptModule, outputFile);
} catch (err) {
log("Script failed: " + err + "\n" + err.stack);
Meta.exit(Meta.ExitCode.ERROR);
}
_collect(scriptModule, outputFile);
Meta.exit(Meta.ExitCode.SUCCESS);
},
function(err) {

View File

@@ -465,14 +465,8 @@ const GridSearchResults = new Lang.Class({
Name: 'GridSearchResults',
Extends: SearchResultsBase,
_init: function(provider, parentContainer) {
_init: function(provider) {
this.parent(provider);
// We need to use the parent container to know how much results we can show.
// None of the actors in this class can be used for that, since the main actor
// goes hidden when no results are displayed, and then it lost its allocation.
// Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore
// it doesn't show any result although we have some.
this._parentContainer = parentContainer;
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
@@ -483,9 +477,7 @@ const GridSearchResults = new Lang.Class({
},
_getMaxDisplayedResults: function() {
let parentThemeNode = this._parentContainer.get_theme_node();
let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width);
return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
return this._grid.columnsForWidth(this._bin.width) * this._grid.getRowLimit();
},
_renderResults: function(metas) {
@@ -585,7 +577,7 @@ const SearchResults = new Lang.Class({
if (provider.appInfo)
providerDisplay = new ListSearchResults(provider);
else
providerDisplay = new GridSearchResults(provider, this._content);
providerDisplay = new GridSearchResults(provider);
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._content.add(providerDisplay.actor);

View File

@@ -0,0 +1,66 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Signals = imports.signals;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
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, this.cancel));
global.display.connect('grab-op-end', Lang.bind(this, 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);

View File

@@ -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._orientationExists = true;
this._orentationExists = true;
this._updateOrientationLock();
}),
Lang.bind(this, function() {
this._orientationExists = false;
this._orentationExists = false;
this._updateOrientationLock();
}));
this._updateOrientationLock();

View File

@@ -11,6 +11,8 @@ const Lang = imports.lang;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const EdgeDragAction = imports.ui.edgeDragAction;
const ShowOverviewAction = imports.ui.showOverviewAction;
const AppDisplay = imports.ui.appDisplay;
const Main = imports.ui.main;
const OverviewControls = imports.ui.overviewControls;
@@ -49,139 +51,6 @@ 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',
@@ -278,9 +147,7 @@ const ViewSelector = new Lang.Class({
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(Main.overview, Main.overview.toggle));
let gesture;
gesture = new EdgeDragAction(St.Side.LEFT);
let gesture = new EdgeDragAction.EdgeDragAction(St.Side.RIGHT);
gesture.connect('activated', Lang.bind(this, function() {
if (Main.overview.visible)
Main.overview.hide();
@@ -289,7 +156,7 @@ const ViewSelector = new Lang.Class({
}));
global.stage.add_action(gesture);
gesture = new ShowOverviewAction();
gesture = new ShowOverviewAction.ShowOverviewAction();
gesture.connect('activated', Lang.bind(this, function(action, areaDiff) {
if (areaDiff < 0.7)
Main.overview.show();
@@ -508,10 +375,7 @@ const ViewSelector = new Lang.Class({
startSearch: function(event) {
global.stage.set_key_focus(this._text);
let synthEvent = event.copy();
synthEvent.set_source(this._text);
this._text.event(synthEvent, true);
this._text.event(event, true);
},
// the entry does not show the hint

View File

@@ -9,9 +9,10 @@ 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 WorkspaceSwitchAction = imports.ui.workspaceSwitchAction;
const AppSwitchAction = imports.ui.appSwitchAction;
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
@@ -457,115 +458,6 @@ 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',
@@ -794,14 +686,14 @@ const WindowManager = new Lang.Class({
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1);
let gesture = new WorkspaceSwitchAction();
let gesture = new WorkspaceSwitchAction.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 = new AppSwitchAction.AppSwitchAction();
gesture.connect('activated', Lang.bind(this, this._switchApp));
global.stage.add_action(gesture);
},

View File

@@ -1258,12 +1258,6 @@ 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;

View File

@@ -0,0 +1,52 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Signals = imports.signals;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
let MOTION_THRESHOLD = 50;
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, this.cancel));
global.display.connect('grab-op-end', Lang.bind(this, 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) {
// 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);

653
po/de.po

File diff suppressed because it is too large Load Diff

825
po/el.po

File diff suppressed because it is too large Load Diff

211
po/es.po
View File

@@ -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-07-22 07:35+0000\n"
"PO-Revision-Date: 2014-07-22 11:27+0200\n"
"POT-Creation-Date: 2014-06-17 07:28+0000\n"
"PO-Revision-Date: 2014-06-17 18:41+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,23 +324,19 @@ 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"
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Captive Portal"
msgstr "Portal captivo"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:125
#, 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:159
#: ../js/extensionPrefs/main.js:157
msgid "GNOME Shell Extensions"
msgstr "Extensiones de GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:142
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../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:915
#: ../js/ui/status/network.js:878
msgid "Cancel"
msgstr "Cancelar"
@@ -371,8 +367,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:268
#: ../js/ui/components/networkAgent.js:286
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
#: ../js/ui/components/networkAgent.js:280
msgid "Username: "
msgstr "Nombre de usuario:"
@@ -401,10 +397,6 @@ 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í"
@@ -417,19 +409,19 @@ msgstr "Frecuentes"
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:1613
#: ../js/ui/appDisplay.js:1569
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:1635 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1591 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:1641
#: ../js/ui/appDisplay.js:1597
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1606
msgid "Show Details"
msgstr "Mostrar detalles"
@@ -443,7 +435,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:809
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Configuración"
@@ -577,35 +569,35 @@ msgid "Next month"
msgstr "Siguiente mes"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:785
#: ../js/ui/calendar.js:775
msgid "Nothing Scheduled"
msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year */
#: ../js/ui/calendar.js:803
#: ../js/ui/calendar.js:793
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:806
#: ../js/ui/calendar.js:796
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:817
#: ../js/ui/calendar.js:807
msgid "Today"
msgstr "Hoy"
#: ../js/ui/calendar.js:821
#: ../js/ui/calendar.js:811
msgid "Tomorrow"
msgstr "Mañana"
#: ../js/ui/calendar.js:832
#: ../js/ui/calendar.js:822
msgid "This week"
msgstr "Esta semana"
#: ../js/ui/calendar.js:840
#: ../js/ui/calendar.js:830
msgid "Next week"
msgstr "La semana que viene"
@@ -638,40 +630,40 @@ msgstr "Contraseña:"
msgid "Type again:"
msgstr "Escriba de nuevo:"
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
msgid "Connect"
msgstr "Conectar"
#: ../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
#: ../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
msgid "Password: "
msgstr "Contraseña: "
#: ../js/ui/components/networkAgent.js:235
#: ../js/ui/components/networkAgent.js:229
msgid "Key: "
msgstr "Clave:"
#: ../js/ui/components/networkAgent.js:274
#: ../js/ui/components/networkAgent.js:268
msgid "Identity: "
msgstr "Identidad:"
#: ../js/ui/components/networkAgent.js:276
#: ../js/ui/components/networkAgent.js:270
msgid "Private key password: "
msgstr "Contraseña de la clave privada:"
#: ../js/ui/components/networkAgent.js:288
#: ../js/ui/components/networkAgent.js:282
msgid "Service: "
msgstr "Servicio:"
#: ../js/ui/components/networkAgent.js:317
#: ../js/ui/components/networkAgent.js:311
msgid "Authentication required by wireless network"
msgstr "La red inalámbrica requiere autenticación"
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:312
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -680,35 +672,35 @@ msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»."
#: ../js/ui/components/networkAgent.js:322
#: ../js/ui/components/networkAgent.js:316
msgid "Wired 802.1X authentication"
msgstr "Autenticación 802.1X cableada"
#: ../js/ui/components/networkAgent.js:324
#: ../js/ui/components/networkAgent.js:318
msgid "Network name: "
msgstr "Nombre de la red"
#: ../js/ui/components/networkAgent.js:329
#: ../js/ui/components/networkAgent.js:323
msgid "DSL authentication"
msgstr "Autenticación DSL"
#: ../js/ui/components/networkAgent.js:336
#: ../js/ui/components/networkAgent.js:330
msgid "PIN code required"
msgstr "Código PIN requerido"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:331
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:338
#: ../js/ui/components/networkAgent.js:332
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:344
#: ../js/ui/components/networkAgent.js:338
msgid "Mobile broadband network password"
msgstr "Contraseña de la red de banda ancha móvil"
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:339
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Se requiere una contraseña para conectarse a «%s»."
@@ -1009,7 +1001,7 @@ msgstr "Ver cuenta"
msgid "Unknown reason"
msgstr "Razón desconocida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
msgid "Windows"
msgstr "Ventanas"
@@ -1212,7 +1204,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:592 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Desactivado"
@@ -1272,7 +1264,7 @@ msgstr "Bandeja de mensajes"
msgid "System Information"
msgstr "Información del sistema"
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
msgctxt "program"
msgid "Unknown"
msgstr "Desconocido"
@@ -1300,37 +1292,32 @@ msgstr "Vista general"
msgid "Type to search…"
msgstr "Escribir para buscar…"
#: ../js/ui/panel.js:515
#: ../js/ui/panel.js:516
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:567
#: ../js/ui/panel.js:568
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/panel.js:914
#: ../js/ui/panel.js:915
msgid "Top Bar"
msgstr "Barra superior"
#: ../js/ui/popupMenu.js:274
#: ../js/ui/popupMenu.js:279
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:70
#: ../js/ui/runDialog.js:74
msgid "Enter a Command"
msgstr "Introducir un comando"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
#: ../js/ui/runDialog.js:114 ../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
@@ -1360,11 +1347,11 @@ msgstr "No se pudo bloquear"
msgid "Lock was blocked by an application"
msgstr "Una aplicación impidió el bloqueo"
#: ../js/ui/search.js:614
#: ../js/ui/search.js:606
msgid "Searching…"
msgstr "Buscando…"
#: ../js/ui/search.js:660
#: ../js/ui/search.js:652
msgid "No results."
msgstr "No se encontraron resultados."
@@ -1440,9 +1427,9 @@ msgstr "Texto grande"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../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/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/rfkill.js:114
msgid "Turn Off"
msgstr "Apagar"
@@ -1458,7 +1445,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:1309
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
msgid "Not Connected"
msgstr "No conectado"
@@ -1486,156 +1473,156 @@ msgstr "Activar"
msgid "In Use"
msgstr "En uso"
#: ../js/ui/status/network.js:101
#: ../js/ui/status/network.js:74
msgid "<unknown>"
msgstr "<desconocido>"
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
#: ../js/ui/status/network.js:1511
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
#: ../js/ui/status/network.js:1464
msgid "Off"
msgstr "Desconectado"
#: ../js/ui/status/network.js:459
#: ../js/ui/status/network.js:422
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:463
#: ../js/ui/status/network.js:426
msgid "Unmanaged"
msgstr "Sin gestionar"
#: ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:428
msgid "Disconnecting"
msgstr "Desconectando"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
msgid "Connecting"
msgstr "Conectando"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#: ../js/ui/status/network.js:437
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:482
#: ../js/ui/status/network.js:445
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:486
#: ../js/ui/status/network.js:449
msgid "Unavailable"
msgstr "No disponible"
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
msgid "Connection failed"
msgstr "Falló la conexión"
#: ../js/ui/status/network.js:504
#: ../js/ui/status/network.js:467
msgid "Wired Settings"
msgstr "Configuración de Wi-Fi"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
msgid "Mobile Broadband Settings"
msgstr "Configuración de banda ancha móvil"
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
msgid "Hardware Disabled"
msgstr "Hardware desactivado"
#: ../js/ui/status/network.js:632
#: ../js/ui/status/network.js:595
msgid "Use as Internet connection"
msgstr "Usar como conexión a Internet"
#: ../js/ui/status/network.js:813
#: ../js/ui/status/network.js:776
msgid "Airplane Mode is On"
msgstr "El modo avión está activado"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:777
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:815
#: ../js/ui/status/network.js:778
msgid "Turn Off Airplane Mode"
msgstr "Apagar el modo avión"
#: ../js/ui/status/network.js:824
#: ../js/ui/status/network.js:787
msgid "Wi-Fi is Off"
msgstr "La Wi-Fi está desactivada"
#: ../js/ui/status/network.js:825
#: ../js/ui/status/network.js:788
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:826
#: ../js/ui/status/network.js:789
msgid "Turn On Wi-Fi"
msgstr "Activar la Wi-Fi"
#: ../js/ui/status/network.js:851
#: ../js/ui/status/network.js:814
msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi"
#: ../js/ui/status/network.js:853
#: ../js/ui/status/network.js:816
msgid "Select a network"
msgstr "Seleccionar una red"
#: ../js/ui/status/network.js:882
#: ../js/ui/status/network.js:845
msgid "No Networks"
msgstr "No hay redes"
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
#: ../js/ui/status/network.js:866 ../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:1173
#: ../js/ui/status/network.js:1136
msgid "Select Network"
msgstr "Seleccionar red"
#: ../js/ui/status/network.js:1179
#: ../js/ui/status/network.js:1142
msgid "Wi-Fi Settings"
msgstr "Configuración de Wi-Fi"
#: ../js/ui/status/network.js:1281
#: ../js/ui/status/network.js:1234
msgid "Turn On"
msgstr "Enceder"
#: ../js/ui/status/network.js:1298
#: ../js/ui/status/network.js:1251
msgid "Hotspot Active"
msgstr "Punto de acceso activo"
#: ../js/ui/status/network.js:1409
#: ../js/ui/status/network.js:1362
msgid "connecting..."
msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:1412
#: ../js/ui/status/network.js:1365
msgid "authentication required"
msgstr "se necesita autenticación"
#: ../js/ui/status/network.js:1414
#: ../js/ui/status/network.js:1367
msgid "connection failed"
msgstr "falló la conexión"
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
msgid "Network Settings"
msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1482
#: ../js/ui/status/network.js:1435
msgid "VPN Settings"
msgstr "Configuración de VPN"
#: ../js/ui/status/network.js:1501
#: ../js/ui/status/network.js:1454
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1656
#: ../js/ui/status/network.js:1607
msgid "Network Manager"
msgstr "Gestor de la red"
#: ../js/ui/status/network.js:1696
#: ../js/ui/status/network.js:1647
msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red"
@@ -1717,11 +1704,11 @@ msgstr "Iniciar sesión como otro usuario"
msgid "Unlock Window"
msgstr "Desbloquear ventana"
#: ../js/ui/viewSelector.js:233
#: ../js/ui/viewSelector.js:100
msgid "Applications"
msgstr "Aplicaciones"
#: ../js/ui/viewSelector.js:237
#: ../js/ui/viewSelector.js:104
msgid "Search"
msgstr "Buscar"
@@ -1730,22 +1717,22 @@ msgstr "Buscar"
msgid "“%s” is ready"
msgstr "«%s» está preparado"
#: ../js/ui/windowManager.js:58
#: ../js/ui/windowManager.js:57
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:77
#: ../js/ui/windowManager.js:76
msgid "Revert Settings"
msgstr "Revertir configuración"
#: ../js/ui/windowManager.js:81
#: ../js/ui/windowManager.js:80
msgid "Keep Changes"
msgstr "Mantener cambios"
#: ../js/ui/windowManager.js:100
#: ../js/ui/windowManager.js:99
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"

539
po/gl.po

File diff suppressed because it is too large Load Diff

375
po/he.po

File diff suppressed because it is too large Load Diff

540
po/nb.po

File diff suppressed because it is too large Load Diff

826
po/pa.po

File diff suppressed because it is too large Load Diff

View File

@@ -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-07-18 07:33+0000\n"
"PO-Revision-Date: 2014-07-18 13:24-0300\n"
"POT-Creation-Date: 2014-06-03 07:28+0000\n"
"PO-Revision-Date: 2014-06-03 10:26-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,27 +139,18 @@ 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:12
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
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:13
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
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:14
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
@@ -168,14 +159,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:15
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
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:16
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
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 "
@@ -187,78 +178,70 @@ 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:17
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
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:18
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
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:19
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
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:20
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
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:21
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
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:22
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
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:23
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the overview"
msgstr "Atalho de teclado para abrir o panorama"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to open the Activities Overview."
msgstr "Atalho de teclado para abrir o panorama de atividades."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
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:26
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
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:27
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
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:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to focus the active notification."
msgstr "Atalho de teclado para ativar a notificação ativa."
# 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
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Which keyboard to use"
msgstr "Qual teclado usar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "The type of keyboard to use."
msgstr "O tipo do teclado para usar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
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:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid ""
"Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', "
@@ -276,24 +259,11 @@ 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: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
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "The application icon mode."
msgstr "O modo ícone do aplicativo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@@ -303,59 +273,48 @@ 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: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
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Attach modal dialog to the parent window"
msgstr "Anexar diálogo modal à janela pai"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
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:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
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:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "Workspaces are managed dynamically"
msgstr "Espaços de trabalho são gerenciados dinamicamente"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
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:44
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
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:142
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../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:915
#: ../js/ui/status/network.js:878
msgid "Cancel"
msgstr "Cancelar"
@@ -386,8 +345,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:268
#: ../js/ui/components/networkAgent.js:286
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
#: ../js/ui/components/networkAgent.js:280
msgid "Username: "
msgstr "Nome de usuário: "
@@ -416,35 +375,31 @@ msgstr "Não foi possível analisar comando:"
msgid "Execution of “%s” failed:"
msgstr "A execução de \"%s\" falhou:"
#: ../js/portalHelper/main.js:84
msgid "Web Authentication Redirect"
msgstr "Redirecionamento para autenticação web"
#: ../js/ui/appDisplay.js:641
#: ../js/ui/appDisplay.js:640
msgid "Frequently used applications will appear here"
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
#: ../js/ui/appDisplay.js:752
#: ../js/ui/appDisplay.js:751
msgid "Frequent"
msgstr "Frequente"
#: ../js/ui/appDisplay.js:759
#: ../js/ui/appDisplay.js:758
msgid "All"
msgstr "Todos"
#: ../js/ui/appDisplay.js:1613
#: ../js/ui/appDisplay.js:1571
msgid "New Window"
msgstr "Nova janela"
#: ../js/ui/appDisplay.js:1635 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1593 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Remover dos favoritos"
#: ../js/ui/appDisplay.js:1641
#: ../js/ui/appDisplay.js:1599
msgid "Add to Favorites"
msgstr "Adicionar aos favoritos"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1608
msgid "Show Details"
msgstr "Mostrar detalhes"
@@ -458,7 +413,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:809
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Configurações"
@@ -592,35 +547,35 @@ msgid "Next month"
msgstr "Próximo mês"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:785
#: ../js/ui/calendar.js:775
msgid "Nothing Scheduled"
msgstr "Nada agendado"
#. Translators: Shown on calendar heading when selected day occurs on current year */
#: ../js/ui/calendar.js:803
#: ../js/ui/calendar.js:793
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:806
#: ../js/ui/calendar.js:796
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:817
#: ../js/ui/calendar.js:807
msgid "Today"
msgstr "Hoje"
#: ../js/ui/calendar.js:821
#: ../js/ui/calendar.js:811
msgid "Tomorrow"
msgstr "Amanhã"
#: ../js/ui/calendar.js:832
#: ../js/ui/calendar.js:822
msgid "This week"
msgstr "Esta semana"
#: ../js/ui/calendar.js:840
#: ../js/ui/calendar.js:830
msgid "Next week"
msgstr "Próxima semana"
@@ -653,40 +608,40 @@ msgstr "Senha:"
msgid "Type again:"
msgstr "Digite novamente:"
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
msgid "Connect"
msgstr "Conectar"
#: ../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
#: ../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
msgid "Password: "
msgstr "Senha: "
#: ../js/ui/components/networkAgent.js:235
#: ../js/ui/components/networkAgent.js:229
msgid "Key: "
msgstr "Chave: "
#: ../js/ui/components/networkAgent.js:274
#: ../js/ui/components/networkAgent.js:268
msgid "Identity: "
msgstr "Identidade: "
#: ../js/ui/components/networkAgent.js:276
#: ../js/ui/components/networkAgent.js:270
msgid "Private key password: "
msgstr "Senha da chave privada: "
#: ../js/ui/components/networkAgent.js:288
#: ../js/ui/components/networkAgent.js:282
msgid "Service: "
msgstr "Serviço: "
#: ../js/ui/components/networkAgent.js:317
#: ../js/ui/components/networkAgent.js:311
msgid "Authentication required by wireless network"
msgstr "Autenticação requisitada pela rede sem fio"
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:312
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -695,35 +650,35 @@ msgstr ""
"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio "
"\"%s\"."
#: ../js/ui/components/networkAgent.js:322
#: ../js/ui/components/networkAgent.js:316
msgid "Wired 802.1X authentication"
msgstr "Autenticação 802.1X cabeada"
#: ../js/ui/components/networkAgent.js:324
#: ../js/ui/components/networkAgent.js:318
msgid "Network name: "
msgstr "Nome da rede: "
#: ../js/ui/components/networkAgent.js:329
#: ../js/ui/components/networkAgent.js:323
msgid "DSL authentication"
msgstr "Autenticação DSL"
#: ../js/ui/components/networkAgent.js:336
#: ../js/ui/components/networkAgent.js:330
msgid "PIN code required"
msgstr "Código PIN requisitado"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:331
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:338
#: ../js/ui/components/networkAgent.js:332
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:344
#: ../js/ui/components/networkAgent.js:338
msgid "Mobile broadband network password"
msgstr "Senha da rede de banda larga móvel"
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:339
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Uma senha é necessária para se conectar a \"%s\""
@@ -1021,7 +976,7 @@ msgstr "Visualizar conta"
msgid "Unknown reason"
msgstr "Razão desconhecida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
msgid "Windows"
msgstr "Janelas"
@@ -1033,23 +988,23 @@ msgstr "Mostrar aplicativos"
msgid "Dash"
msgstr "Dash"
#: ../js/ui/dateMenu.js:96
#: ../js/ui/dateMenu.js:97
msgid "Open Calendar"
msgstr "Abrir agenda"
#: ../js/ui/dateMenu.js:100
#: ../js/ui/dateMenu.js:101
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:107
#: ../js/ui/dateMenu.js:108
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:204
#: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y"
@@ -1130,7 +1085,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
@@ -1226,7 +1181,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:592 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Desabilitado"
@@ -1250,43 +1205,43 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Página web"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1326
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1333
msgid "Remove"
msgstr "Remover"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1630
msgid "Notifications"
msgstr "Notificações"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1637
msgid "Clear Messages"
msgstr "Sem mensagens"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1656
msgid "Notification Settings"
msgstr "Configurações de notificação"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1709
msgid "Tray Menu"
msgstr "Menu de notificação"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1926
msgid "No Messages"
msgstr "Sem mensagens"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1964
msgid "Message Tray"
msgstr "Área de notificação"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2967
msgid "System Information"
msgstr "Informações do sistema"
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
msgctxt "program"
msgid "Unknown"
msgstr "Desconhecido"
@@ -1314,37 +1269,32 @@ msgstr "Panorama"
msgid "Type to search…"
msgstr "Digite para pesquisar…"
#: ../js/ui/panel.js:515
#: ../js/ui/panel.js:516
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:567
#: ../js/ui/panel.js:568
msgid "Activities"
msgstr "Atividades"
#: ../js/ui/panel.js:914
#: ../js/ui/panel.js:915
msgid "Top Bar"
msgstr "Barra superior"
#: ../js/ui/popupMenu.js:274
#: ../js/ui/popupMenu.js:279
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:70
#: ../js/ui/runDialog.js:74
msgid "Enter a Command"
msgstr "Digite um comando"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
#: ../js/ui/runDialog.js:114 ../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
@@ -1454,9 +1404,9 @@ msgstr "Texto grande"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../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/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/rfkill.js:114
msgid "Turn Off"
msgstr "Desligar"
@@ -1472,7 +1422,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:1309
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
msgid "Not Connected"
msgstr "Não conectado"
@@ -1500,157 +1450,157 @@ msgstr "Habilitar"
msgid "In Use"
msgstr "Em uso"
#: ../js/ui/status/network.js:101
#: ../js/ui/status/network.js:74
msgid "<unknown>"
msgstr "<desconhecido>"
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
#: ../js/ui/status/network.js:1511
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
#: ../js/ui/status/network.js:1464
msgid "Off"
msgstr "Off"
#: ../js/ui/status/network.js:459
#: ../js/ui/status/network.js:422
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:463
#: ../js/ui/status/network.js:426
msgid "Unmanaged"
msgstr "Não gerenciável"
#: ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:428
msgid "Disconnecting"
msgstr "Desconectando"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
msgid "Connecting"
msgstr "Conectando"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#: ../js/ui/status/network.js:437
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:482
#: ../js/ui/status/network.js:445
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:486
#: ../js/ui/status/network.js:449
msgid "Unavailable"
msgstr "Indisponível"
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
msgid "Connection failed"
msgstr "Falha de conexão"
#: ../js/ui/status/network.js:504
#: ../js/ui/status/network.js:467
msgid "Wired Settings"
msgstr "Configurações da rede cabeada"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
msgid "Mobile Broadband Settings"
msgstr "Configurações de banda larga móvel"
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
msgid "Hardware Disabled"
msgstr "Hardware desabilitado"
#: ../js/ui/status/network.js:632
#: ../js/ui/status/network.js:595
msgid "Use as Internet connection"
msgstr "Usar como conexão de Internet"
#: ../js/ui/status/network.js:813
#: ../js/ui/status/network.js:776
msgid "Airplane Mode is On"
msgstr "Modo avião ligado"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:777
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:815
#: ../js/ui/status/network.js:778
msgid "Turn Off Airplane Mode"
msgstr "Desligar modo avião"
#: ../js/ui/status/network.js:824
#: ../js/ui/status/network.js:787
msgid "Wi-Fi is Off"
msgstr "Wi-Fi desligado"
#: ../js/ui/status/network.js:825
#: ../js/ui/status/network.js:788
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:826
#: ../js/ui/status/network.js:789
msgid "Turn On Wi-Fi"
msgstr "Ligar Wi-Fi"
#: ../js/ui/status/network.js:851
#: ../js/ui/status/network.js:814
msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi"
#: ../js/ui/status/network.js:853
#: ../js/ui/status/network.js:816
msgid "Select a network"
msgstr "Selecione uma rede"
#: ../js/ui/status/network.js:882
#: ../js/ui/status/network.js:845
msgid "No Networks"
msgstr "Nenhuma rede"
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
#: ../js/ui/status/network.js:866 ../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:1173
#: ../js/ui/status/network.js:1136
msgid "Select Network"
msgstr "Selecione a rede"
#: ../js/ui/status/network.js:1179
#: ../js/ui/status/network.js:1142
msgid "Wi-Fi Settings"
msgstr "Configurações de Wi-Fi"
#: ../js/ui/status/network.js:1281
#: ../js/ui/status/network.js:1234
msgid "Turn On"
msgstr "Ligar"
#: ../js/ui/status/network.js:1298
#: ../js/ui/status/network.js:1251
msgid "Hotspot Active"
msgstr "Ponto de acesso ativo"
#: ../js/ui/status/network.js:1409
#: ../js/ui/status/network.js:1362
msgid "connecting..."
msgstr "conectando..."
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:1412
#: ../js/ui/status/network.js:1365
msgid "authentication required"
msgstr "autenticação necessária"
#: ../js/ui/status/network.js:1414
#: ../js/ui/status/network.js:1367
msgid "connection failed"
msgstr "conexão falhou"
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
msgid "Network Settings"
msgstr "Configurações de rede"
#: ../js/ui/status/network.js:1482
#: ../js/ui/status/network.js:1435
msgid "VPN Settings"
msgstr "Configurações de VPN"
#: ../js/ui/status/network.js:1501
#: ../js/ui/status/network.js:1454
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1656
#: ../js/ui/status/network.js:1607
msgid "Network Manager"
msgstr "Gerenciador de rede"
#: ../js/ui/status/network.js:1696
#: ../js/ui/status/network.js:1647
msgid "Activation of network connection failed"
msgstr "Falha ao ativar a conexão da rede"
@@ -1734,11 +1684,11 @@ msgstr "Iniciar sessão como outro usuário"
msgid "Unlock Window"
msgstr "Desbloquear janela"
#: ../js/ui/viewSelector.js:233
#: ../js/ui/viewSelector.js:100
msgid "Applications"
msgstr "Aplicativos"
#: ../js/ui/viewSelector.js:237
#: ../js/ui/viewSelector.js:104
msgid "Search"
msgstr "Pesquisar"
@@ -1747,22 +1697,22 @@ msgstr "Pesquisar"
msgid "“%s” is ready"
msgstr "\"%s\" está pronto"
#: ../js/ui/windowManager.js:58
#: ../js/ui/windowManager.js:57
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:77
#: ../js/ui/windowManager.js:76
msgid "Revert Settings"
msgstr "Reverter configurações"
#: ../js/ui/windowManager.js:81
#: ../js/ui/windowManager.js:80
msgid "Keep Changes"
msgstr "Manter alterações"
#: ../js/ui/windowManager.js:100
#: ../js/ui/windowManager.js:99
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -1835,19 +1785,19 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#: ../src/main.c:371
#: ../src/main.c:349
msgid "Print version"
msgstr "Versão de impressão"
#: ../src/main.c:377
#: ../src/main.c:355
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:383
#: ../src/main.c:361
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:389
#: ../src/main.c:367
msgid "List possible modes"
msgstr "Listar modos possíveis"

122
po/ru.po
View File

@@ -18,17 +18,17 @@ 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-07-08 07:32+0000\n"
"PO-Revision-Date: 2014-07-08 17:18+0300\n"
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
"POT-Creation-Date: 2014-06-25 07:31+0000\n"
"PO-Revision-Date: 2014-06-25 22:59+0400\n"
"Last-Translator: Yuri Myasoedov <ymyasoedov@yandex.ru>\n"
"Language-Team: русский <gnome-cyr@gnome.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 1.5.4\n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Gtranslator 2.91.6\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@@ -226,14 +226,10 @@ msgstr "Комбинация клавиш для перевода фокуса
msgid "Keybinding to focus the active notification."
msgstr "Комбинация клавиш для перевода фокуса на текущее уведомление."
# tweens? пока непонятно, что это
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, fuzzy
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Комбинация клавиш, которая приостанавливает и возобновляет все запущенные "
"tweens (для отладки)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@@ -327,23 +323,20 @@ msgstr "Рабочие места только на основном монит
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Задержка изменения фокуса в режиме мыши после остановки указателя"
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Captive Portal"
msgstr "Captive-портал"
#: ../js/extensionPrefs/main.js:125
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:"
#: ../js/extensionPrefs/main.js:157
#| msgid "Configure GNOME Shell Extensions"
msgid "GNOME Shell Extensions"
msgstr "Расширения GNOME Shell"
#: ../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:915
#: ../js/ui/status/network.js:878
msgid "Cancel"
msgstr "Отмена"
@@ -404,11 +397,6 @@ msgstr "Не удалось разобрать команду:"
msgid "Execution of “%s” failed:"
msgstr "Не удалось выполнить «%s»:"
#: ../js/portalHelper/main.js:84
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "Перенаправление для проверки подлинности"
#: ../js/ui/appDisplay.js:641
msgid "Frequently used applications will appear here"
msgstr "Здесь появляются часто используемые приложения"
@@ -434,6 +422,7 @@ msgid "Add to Favorites"
msgstr "Добавить в избранное"
#: ../js/ui/appDisplay.js:1607
#| msgid "Show Text"
msgid "Show Details"
msgstr "Показать подробности"
@@ -644,8 +633,8 @@ msgstr "Пароль:"
msgid "Type again:"
msgstr "Введите ещё раз:"
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
msgid "Connect"
msgstr "Соединиться"
@@ -1228,7 +1217,7 @@ msgstr "Включено"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Выключено"
@@ -1454,9 +1443,9 @@ msgstr "Крупный текст"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../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/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/rfkill.js:114
msgid "Turn Off"
msgstr "Выключить"
@@ -1473,7 +1462,7 @@ msgstr[0] "Подключено %d устройство"
msgstr[1] "Подключено %d устройства"
msgstr[2] "Подключено %d устройств"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
msgid "Not Connected"
msgstr "Не подключено"
@@ -1501,156 +1490,161 @@ msgstr "Включить"
msgid "In Use"
msgstr "Используется"
#: ../js/ui/status/network.js:101
#: ../js/ui/status/network.js:74
msgid "<unknown>"
msgstr "<неизвестно>"
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
#: ../js/ui/status/network.js:1511
#: ../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:459
#: ../js/ui/status/network.js:422
msgid "Connected"
msgstr "Подключено"
#. 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:463
#: ../js/ui/status/network.js:426
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "Не управляется"
#: ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:428
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "Отключение"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
msgid "Connecting"
msgstr "Подключение"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#: ../js/ui/status/network.js:437
#| msgid "authentication required"
msgid "Authentication required"
msgstr "Требуется подтверждение подлинности"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#: ../js/ui/status/network.js:445
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "Отсутствует прошивка"
#. 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:486
#: ../js/ui/status/network.js:449
#| msgid "unavailable"
msgid "Unavailable"
msgstr "Недоступно"
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
msgid "Connection failed"
msgstr "Сбой подключения"
#: ../js/ui/status/network.js:504
#: ../js/ui/status/network.js:467
msgid "Wired Settings"
msgstr "Параметры проводных соединений"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
msgid "Mobile Broadband Settings"
msgstr "Параметры широкополосной мобильной связи"
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
msgid "Hardware Disabled"
msgstr "Оборудование выключено"
#: ../js/ui/status/network.js:632
#: ../js/ui/status/network.js:595
msgid "Use as Internet connection"
msgstr "Использовать как Интернет-соединение"
#: ../js/ui/status/network.js:813
#: ../js/ui/status/network.js:776
msgid "Airplane Mode is On"
msgstr "Включён режим авиаперелёта"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:777
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Когда включён режим авиаперелёта, адаптер Wi-Fi выключен."
#: ../js/ui/status/network.js:815
#: ../js/ui/status/network.js:778
msgid "Turn Off Airplane Mode"
msgstr "Выключить режим авиаперелёта"
#: ../js/ui/status/network.js:824
#: ../js/ui/status/network.js:787
msgid "Wi-Fi is Off"
msgstr "Wi-Fi выключен"
#: ../js/ui/status/network.js:825
#: ../js/ui/status/network.js:788
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Для подключения к сети, адаптер Wi-Fi должен быть включён."
#: ../js/ui/status/network.js:826
#: ../js/ui/status/network.js:789
msgid "Turn On Wi-Fi"
msgstr "Включить Wi-Fi"
#: ../js/ui/status/network.js:851
#: ../js/ui/status/network.js:814
msgid "Wi-Fi Networks"
msgstr "Сети Wi-Fi"
#: ../js/ui/status/network.js:853
#: ../js/ui/status/network.js:816
msgid "Select a network"
msgstr "Выберите сеть"
#: ../js/ui/status/network.js:882
#: ../js/ui/status/network.js:845
msgid "No Networks"
msgstr "Сети отсутствуют"
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
msgid "Use hardware switch to turn off"
msgstr "Используйте механический переключатель, чтобы выключить"
#: ../js/ui/status/network.js:1173
#: ../js/ui/status/network.js:1136
msgid "Select Network"
msgstr "Выбрать сеть"
#: ../js/ui/status/network.js:1179
#: ../js/ui/status/network.js:1142
msgid "Wi-Fi Settings"
msgstr "Параметры Wi-Fi"
#: ../js/ui/status/network.js:1281
#: ../js/ui/status/network.js:1234
msgid "Turn On"
msgstr "Включить"
#: ../js/ui/status/network.js:1298
#: ../js/ui/status/network.js:1251
msgid "Hotspot Active"
msgstr "Точка доступа включена"
#: ../js/ui/status/network.js:1409
#: ../js/ui/status/network.js:1362
msgid "connecting..."
msgstr "подключение…"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:1412
#: ../js/ui/status/network.js:1365
msgid "authentication required"
msgstr "требуется подтверждение подлинности"
#: ../js/ui/status/network.js:1414
#: ../js/ui/status/network.js:1367
msgid "connection failed"
msgstr "сбой подключения"
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
msgid "Network Settings"
msgstr "Настроить сеть"
#: ../js/ui/status/network.js:1482
#: ../js/ui/status/network.js:1435
msgid "VPN Settings"
msgstr "Параметры VPN"
#: ../js/ui/status/network.js:1501
#: ../js/ui/status/network.js:1454
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1656
#: ../js/ui/status/network.js:1607
msgid "Network Manager"
msgstr "Диспетчер сети"
#: ../js/ui/status/network.js:1696
#: ../js/ui/status/network.js:1647
msgid "Activation of network connection failed"
msgstr "Не удалось активировать сетевое подключение"
@@ -1791,7 +1785,7 @@ msgstr "Изменить размер"
#: ../js/ui/windowMenu.js:65
msgid "Move Titlebar Onscreen"
msgstr "Переместить панель заголовка на экран"
msgstr ""
#: ../js/ui/windowMenu.js:70
msgid "Always on Top"

View File

@@ -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-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"
"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"
"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.4\n"
"X-Generator: Poedit 1.6.3\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:271
#: ../js/gdm/loginDialog.js:270
msgid "Choose Session"
msgstr "選擇作業階段"
#: ../js/gdm/loginDialog.js:431
#: ../js/gdm/loginDialog.js:430
msgid "Not listed?"
msgstr "沒有列出來?"
#: ../js/gdm/loginDialog.js:614
#: ../js/gdm/loginDialog.js:608
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)"
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
#: ../js/gdm/loginDialog.js:613 ../js/ui/components/networkAgent.js:262
#: ../js/ui/components/networkAgent.js:280
msgid "Username: "
msgstr "使用者名稱:"
#: ../js/gdm/loginDialog.js:920
#: ../js/gdm/loginDialog.js:884
msgid "Login Window"
msgstr "登入視窗"
@@ -351,27 +351,27 @@ msgstr "無法分析指令:"
msgid "Execution of “%s” failed:"
msgstr "執行「%s」失敗"
#: ../js/ui/appDisplay.js:636
#: ../js/ui/appDisplay.js:629
msgid "Frequently used applications will appear here"
msgstr "經常使用的應用程式會出現在這裡"
#: ../js/ui/appDisplay.js:747
#: ../js/ui/appDisplay.js:740
msgid "Frequent"
msgstr "常用"
#: ../js/ui/appDisplay.js:754
#: ../js/ui/appDisplay.js:747
msgid "All"
msgstr "全部"
#: ../js/ui/appDisplay.js:1566
#: ../js/ui/appDisplay.js:1555
msgid "New Window"
msgstr "新視窗"
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1577 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "自喜好中移除"
#: ../js/ui/appDisplay.js:1594
#: ../js/ui/appDisplay.js:1583
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:1291
#: ../js/ui/components/telepathyClient.js:1290
msgid "Decline"
msgstr "拒絕"
#: ../js/ui/components/telepathyClient.js:1170
#: ../js/ui/components/telepathyClient.js:1239
#: ../js/ui/components/telepathyClient.js:1296
#: ../js/ui/components/telepathyClient.js:1295
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:1342
#: ../js/ui/components/telepathyClient.js:1341
msgid "Network error"
msgstr "網路錯誤"
#: ../js/ui/components/telepathyClient.js:1344
#: ../js/ui/components/telepathyClient.js:1343
msgid "Authentication failed"
msgstr "核對失敗"
#: ../js/ui/components/telepathyClient.js:1346
#: ../js/ui/components/telepathyClient.js:1345
msgid "Encryption error"
msgstr "加密發生錯誤"
#: ../js/ui/components/telepathyClient.js:1348
#: ../js/ui/components/telepathyClient.js:1347
msgid "Certificate not provided"
msgstr "沒有提供憑證"
#: ../js/ui/components/telepathyClient.js:1350
#: ../js/ui/components/telepathyClient.js:1349
msgid "Certificate untrusted"
msgstr "憑證不被信任"
#: ../js/ui/components/telepathyClient.js:1352
#: ../js/ui/components/telepathyClient.js:1351
msgid "Certificate expired"
msgstr "憑證已逾期"
#: ../js/ui/components/telepathyClient.js:1354
#: ../js/ui/components/telepathyClient.js:1353
msgid "Certificate not activated"
msgstr "憑證尚未使用"
#: ../js/ui/components/telepathyClient.js:1356
#: ../js/ui/components/telepathyClient.js:1355
msgid "Certificate hostname mismatch"
msgstr "憑證主機名稱不符"
#: ../js/ui/components/telepathyClient.js:1358
#: ../js/ui/components/telepathyClient.js:1357
msgid "Certificate fingerprint mismatch"
msgstr "憑證數位指紋不符"
#: ../js/ui/components/telepathyClient.js:1360
#: ../js/ui/components/telepathyClient.js:1359
msgid "Certificate self-signed"
msgstr "憑證為自我簽署"
#: ../js/ui/components/telepathyClient.js:1362
#: ../js/ui/components/telepathyClient.js:1361
msgid "Status is set to offline"
msgstr "狀態設為離線"
#: ../js/ui/components/telepathyClient.js:1364
#: ../js/ui/components/telepathyClient.js:1363
msgid "Encryption is not available"
msgstr "加密無法使用"
#: ../js/ui/components/telepathyClient.js:1366
#: ../js/ui/components/telepathyClient.js:1365
msgid "Certificate is invalid"
msgstr "憑證無效"
#: ../js/ui/components/telepathyClient.js:1368
#: ../js/ui/components/telepathyClient.js:1367
msgid "Connection has been refused"
msgstr "連線遭到拒絕"
#: ../js/ui/components/telepathyClient.js:1370
#: ../js/ui/components/telepathyClient.js:1369
msgid "Connection can't be established"
msgstr "無法建立連線"
#: ../js/ui/components/telepathyClient.js:1372
#: ../js/ui/components/telepathyClient.js:1371
msgid "Connection has been lost"
msgstr "已失去連線"
#: ../js/ui/components/telepathyClient.js:1374
#: ../js/ui/components/telepathyClient.js:1373
msgid "This account is already connected to the server"
msgstr "這個帳號已連接至該伺服器"
#: ../js/ui/components/telepathyClient.js:1376
#: ../js/ui/components/telepathyClient.js:1375
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "連線已被使用相同資源的新連線取代"
#: ../js/ui/components/telepathyClient.js:1378
#: ../js/ui/components/telepathyClient.js:1377
msgid "The account already exists on the server"
msgstr "該帳號已經存在於伺服器上"
#: ../js/ui/components/telepathyClient.js:1380
#: ../js/ui/components/telepathyClient.js:1379
msgid "Server is currently too busy to handle the connection"
msgstr "伺服器目前過於忙碌以致於無法處理該連線"
#: ../js/ui/components/telepathyClient.js:1382
#: ../js/ui/components/telepathyClient.js:1381
msgid "Certificate has been revoked"
msgstr "憑證已被撤銷"
#: ../js/ui/components/telepathyClient.js:1384
#: ../js/ui/components/telepathyClient.js:1383
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "憑證使用不安全的密碼演算法,或是密碼處理上較弱"
#: ../js/ui/components/telepathyClient.js:1386
#: ../js/ui/components/telepathyClient.js:1385
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:1388
#: ../js/ui/components/telepathyClient.js:1387
msgid "Internal error"
msgstr "內部的錯誤"
#. translators: argument is the account name, like
#. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1398
#: ../js/ui/components/telepathyClient.js:1397
#, javascript-format
msgid "Unable to connect to %s"
msgstr "無法連線到 %s"
#: ../js/ui/components/telepathyClient.js:1403
#: ../js/ui/components/telepathyClient.js:1402
msgid "View account"
msgstr "檢視帳號"
#: ../js/ui/components/telepathyClient.js:1440
#: ../js/ui/components/telepathyClient.js:1439
msgid "Unknown reason"
msgstr "不明原因"
@@ -1129,8 +1129,7 @@ msgstr "隱藏錯誤"
msgid "Show Errors"
msgstr "顯示錯誤"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:167
#: ../js/ui/lookingGlass.js:716
msgid "Enabled"
msgstr "已啟用"
@@ -1138,8 +1137,8 @@ msgstr "已啟用"
#. because it's disabled by rfkill (airplane mode) */
#. 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/lookingGlass.js:719 ../js/ui/status/network.js:555
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "已停用"
@@ -1284,7 +1283,7 @@ msgstr "鎖定被應用程式阻擋"
msgid "Searching…"
msgstr "搜尋…"
#: ../js/ui/search.js:649
#: ../js/ui/search.js:646
msgid "No results."
msgstr "沒有結果。"
@@ -1360,7 +1359,8 @@ msgstr "大型文字"
msgid "Bluetooth"
msgstr "藍牙"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
#: ../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/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,29 +1393,24 @@ msgstr "顯示鍵盤配置"
msgid "Location"
msgstr "位置"
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
#| msgid "Disabled"
msgid "Disable"
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:165
#| msgid "Enabled"
msgid "Enable"
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:167
msgid "In Use"
msgstr "使用中"
#: ../js/ui/status/location.js:164 ../js/ui/status/network.js:1234
msgid "Turn On"
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 "已連線"
@@ -1519,10 +1514,6 @@ 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 "熱點活動中"
@@ -1589,10 +1580,6 @@ msgstr "電池"
msgid "Airplane Mode"
msgstr "飛安模式"
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "開啟"
#: ../js/ui/status/system.js:314
msgid "Switch User"
msgstr "切換使用者"

View File

@@ -257,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) -lm
gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS)
########################################

View File

@@ -42,8 +42,8 @@ function _showHello() {
let monitor = Main.layoutManager.primaryMonitor;
text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
Math.floor(monitor.height / 2 - text.height / 2));
Tweener.addTween(text,
{ opacity: 0,

View File

@@ -75,9 +75,7 @@ def start_shell(perf_output=None):
# Set up environment
env = dict(os.environ)
env['SHELL_PERF_MODULE'] = options.perf
filters = ['Gnome-shell-perf-helper'] + options.extra_filter
env['MUTTER_WM_CLASS_FILTER'] = ','.join(filters)
env['MUTTER_WM_CLASS_FILTER'] = 'Gnome-shell-perf-helper'
if perf_output is not None:
env['SHELL_PERF_OUTPUT'] = perf_output
@@ -191,11 +189,6 @@ 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:
@@ -296,13 +289,6 @@ 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 '------------------------------------------------------------';
@@ -318,7 +304,8 @@ def run_performance_test():
parser = optparse.OptionParser()
parser.add_option("", "--perf", metavar="PERF_MODULE",
help="Specify the name of a performance module to run")
help="Specify the name of a performance module to run",
default="core")
parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
help="Numbers of iterations of performance module to run",
default=1)
@@ -328,10 +315,6 @@ 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")
@@ -340,25 +323,12 @@ 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:
if not options.hwtest:
restore_shell()
restore_shell()
else:
sys.exit(1)

View File

@@ -174,6 +174,7 @@ 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;
@@ -182,8 +183,9 @@ gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
return FALSE;
screen = meta_plugin_get_screen (plugin);
display = meta_screen_get_display (screen);
xdisplay = clutter_x11_get_default_display ();
xdisplay = meta_display_get_xdisplay (display);
query_extensions_string =
(void *) cogl_get_proc_address ("glXQueryExtensionsString");
@@ -387,17 +389,9 @@ 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)
{
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);
}
shell_perf_log_event_x (shell_perf_log_get_default (),
"glx.swapComplete",
swap_complete_event->ust);
}
#endif

View File

@@ -96,8 +96,6 @@ struct _ShellGlobal {
guint32 xdnd_timestamp;
gboolean has_modal;
gboolean frame_timestamps;
gboolean frame_finish_timestamp;
};
enum {
@@ -118,8 +116,6 @@ enum {
PROP_IMAGEDIR,
PROP_USERDATADIR,
PROP_FOCUS_MANAGER,
PROP_FRAME_TIMESTAMPS,
PROP_FRAME_FINISH_TIMESTAMP,
};
/* Signals */
@@ -150,12 +146,6 @@ 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;
@@ -227,12 +217,6 @@ 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;
@@ -516,20 +500,6 @@ 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));
}
/*
@@ -786,71 +756,17 @@ global_stage_notify_height (GObject *gobject,
static gboolean
global_stage_before_paint (gpointer data)
{
ShellGlobal *global = SHELL_GLOBAL (data);
if (global->frame_timestamps)
shell_perf_log_event (shell_perf_log_get_default (),
"clutter.stagePaintStart");
shell_perf_log_event (shell_perf_log_get_default (),
"clutter.stagePaintStart");
return TRUE;
}
static gboolean
load_gl_symbol (const char *name,
void **func)
global_stage_after_paint (gpointer data)
{
*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");
shell_perf_log_event (shell_perf_log_get_default (),
"clutter.stagePaintDone");
return TRUE;
}
@@ -868,11 +784,7 @@ 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);
if (meta_is_wayland_compositor ())
g_object_set (clutter_settings_get_default (), "font-dpi", 96 * 1024 * g_value_get_int (&value), NULL);
}
g_object_set (context, "scale-factor", 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);
@@ -1035,26 +947,19 @@ _shell_global_set_plugin (ShellGlobal *global,
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_PRE_PAINT,
global_stage_before_paint,
global, NULL);
g_signal_connect (global->stage, "after-paint",
G_CALLBACK (global_stage_after_paint), global);
NULL, NULL);
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
global_stage_after_swap,
global, NULL);
global_stage_after_paint,
NULL, 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 frame, possibly including swap time",
"End of stage page repaint",
"");
g_signal_connect (global->stage, "notify::key-focus",

View File

@@ -9,8 +9,6 @@
#include "config.h"
#include <math.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
@@ -29,7 +27,6 @@ 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'/>"
@@ -43,13 +40,9 @@ 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;
@@ -126,7 +119,6 @@ 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
@@ -144,27 +136,16 @@ 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 + 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_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_stroke (cr);
info->exposed = TRUE;
@@ -178,29 +159,11 @@ 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 redraws)
gboolean maximized)
{
WindowInfo *info;
@@ -209,14 +172,12 @@ 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);
@@ -224,10 +185,6 @@ 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);
}
@@ -285,11 +242,11 @@ handle_method_call (GDBusConnection *connection,
else if (g_strcmp0 (method_name, "CreateWindow") == 0)
{
int width, height;
gboolean alpha, maximized, redraws;
gboolean alpha, maximized;
g_variant_get (parameters, "(iibbb)", &width, &height, &alpha, &maximized, &redraws);
g_variant_get (parameters, "(iibb)", &width, &height, &alpha, &maximized);
create_window (width, height, alpha, maximized, redraws);
create_window (width, height, alpha, maximized);
g_dbus_method_invocation_return_value (invocation, NULL);
}
else if (g_strcmp0 (method_name, "WaitWindows") == 0)

View File

@@ -126,7 +126,11 @@ G_DEFINE_TYPE(ShellPerfLog, shell_perf_log, G_TYPE_OBJECT);
static gint64
get_time (void)
{
return g_get_monotonic_time ();
GTimeVal timeval;
g_get_current_time (&timeval);
return timeval.tv_sec * G_GINT64_CONSTANT(1000000) + timeval.tv_usec;
}
static void

View File

@@ -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::height",
g_signal_connect (recorder->stage, "notify::width",
G_CALLBACK (recorder_on_stage_notify_size), recorder);
clutter_x11_add_filter (recorder_event_filter, recorder);