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
98 changed files with 5702 additions and 7931 deletions

4
.gitignore vendored
View File

@@ -24,13 +24,10 @@ data/gnome-shell-wayland.desktop.in
data/gnome-shell-extension-prefs.desktop
data/gnome-shell-extension-prefs.desktop.in
data/gschemas.compiled
data/perf-background.xml
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
@@ -83,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

58
NEWS
View File

@@ -1,61 +1,3 @@
3.13.90
=======
* Make use of GLSL optional [Adel; #733623]
* Update on-screen-keyboard position on monitor changes [Cosimo; #733790]
* Improve window manager animations [Giovanni; #732857]
* Handle touch events [Carlos G.; #733633]
* Try to not show "New Window" action for single-window apps
[Giovanni; #722554]
* Fix overview exceeding screen size with many apps installed
[Carlos S.; #723496]
* Add Software to default favorites [Mathieu; #734406]
* Improve app picker <-> desktop transition [Carlos S.; #732901]
* Remove <shift>-magic for switcher popups [Christophe; #732296]
* Add a special background to use for performance testing [Owen; #734610]
* Add support for default disabled search providers [Giovanni; #734110]
* Fix portals that don't redirect properly [Giovanni; #733848]
* Fix history trimming in chat notifications [Giovanni; #733899]
* Try to use default calendar application [Florian; #722333]
* Only show location menu when geolocation is in use [Zeeshan; #731122]
* Misc. bug fixes and cleanups [Giovanni, Carlos G., Zeeshan, Carlos S.,
Cosimo; #711682, #733840, #734483, #734680, #733813, #735062]
Contributors:
Zeeshan Ali (Khattak), Mathieu Bridon, Giovanni Campagna, Cosimo Cecchi,
Piotr Drąg, Christophe Fergeau, Adel Gadllah, Carlos Garnacho,
Florian Müllner, Carlos Soriano, Jasper St. Pierre, Olav Vitters,
Owen W. Taylor
Translations:
Aurimas Černius [lt], MarMav [el], Inaki Larranaga Murgoitio [eu],
Reinout van Schouwen [nl], ngoswami [as], Fabio Tomat [fur],
Chao-Hsiung Liao [zh_HK, zh_TW]
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.90],[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.90
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

@@ -74,13 +74,6 @@ dist_theme_DATA = \
theme/ws-switch-arrow-up.png \
theme/ws-switch-arrow-down.png
backgrounddir = $(pkgdatadir)
background_DATA = perf-background.xml
perf-background.xml: perf-background.xml.in
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
$< > $@ || rm $@
keysdir = @GNOME_KEYBINDINGS_KEYSDIR@
keys_in_files = 50-gnome-shell-system.xml.in
keys_DATA = $(keys_in_files:.xml.in=.xml)
@@ -113,7 +106,6 @@ EXTRA_DIST = \
$(menu_DATA) \
$(convert_DATA) \
$(keys_in_files) \
perf-background.xml.in \
org.gnome.Shell.PortalHelper.desktop.in \
org.gnome.Shell.PortalHelper.service.in \
org.gnome.shell.gschema.xml.in.in
@@ -125,7 +117,6 @@ CLEANFILES += \
$(desktop_DATA) \
$(keys_DATA) \
$(gsettings_SCHEMAS) \
perf-background.xml \
gschemas.compiled \
org.gnome.shell.gschema.valid \
org.gnome.shell.gschema.xml.in

View File

@@ -31,7 +31,7 @@
</_description>
</key>
<key name="favorite-apps" type="as">
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop', 'org.gnome.Software.desktop' ]</default>
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop' ]</default>
<_summary>List of desktop file IDs for favorite applications</_summary>
<_description>
The applications corresponding to these identifiers
@@ -74,6 +74,7 @@
<child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
<child name="location" schema="org.gnome.shell.location"/>
</schema>
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
@@ -143,6 +144,32 @@
</key>
</schema>
<enum id="org.gnome.shell.geoclue.AccuracyLevel">
<value value="0" nick="off"/>
<value value="1" nick="country"/>
<value value="4" nick="city"/>
<value value="5" nick="neighborhood"/>
<value value="6" nick="street"/>
<value value="8" nick="exact"/>
</enum>
<schema id="org.gnome.shell.location"
path="/org/gnome/shell/location/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="max-accuracy-level" enum="org.gnome.shell.geoclue.AccuracyLevel">
<default>'exact'</default>
<_summary>The maximum accuracy level of location.</_summary>
<_description>
Configures the maximum level of location accuracy applications are
allowed to see. Valid options are 'off' (disable location tracking),
'country', 'city', 'neighborhood', 'street', and 'exact' (typically
requires GPS receiver). Please keep in mind that this only controls
what GeoClue will allow applications to see and they can find user's
location on their own using network resources (albeit with street-level
accuracy at best).
</_description>
</key>
</schema>
<schema id="org.gnome.shell.app-switcher"
path="/org/gnome/shell/app-switcher/"
gettext-domain="@GETTEXT_PACKAGE@">

View File

@@ -1,31 +0,0 @@
<!-- With an animated background, performance will differ depending on whether
one layer or two layers are being blended together. This messes up our
benchmarks. We could just benchmark a single image, but since blended
images are present for much of the day with the GNOME default background,
we want to make sure that also performs well; for that reason we ship
an "animated" background that animates super-slowly to use during
performance tests; it will be in the blended state until 2030. -->
<background>
<starttime>
<year>1990</year>
<month>1</month>
<day>1</day>
<hour>0</hour>
<minute>00</minute>
<second>00</second>
</starttime>
<!-- One transition that takes 40 years -->
<transition type="overlay">
<duration>1261440000.0</duration>
<from>@datadir@/backgrounds/gnome/adwaita-morning.jpg</from>
<to>@datadir@/backgrounds/gnome/adwaita-day.jpg</to>
</transition>
<!-- A single slide doesn't work, so another slide for 1 minute after 40 years -->
<static>
<duration>60</duration>
<file>/usr/share/backgrounds/gnome/Sandstone.jpg</file>
</static>
</background>

View File

@@ -478,7 +478,7 @@ StScrollBar StButton#vhandle:active {
/* Common radii */
.search-entry,
#searchEntry,
.modal-dialog-button,
.notification-button,
.hotplug-notification-item,
@@ -500,7 +500,7 @@ StScrollBar StButton#vhandle:active {
/* Entries */
.search-entry,
#searchEntry,
.login-dialog StEntry,
.notification StEntry,
.modal-dialog StEntry {
@@ -512,7 +512,7 @@ StScrollBar StButton#vhandle:active {
padding: 4px 12px;
}
.search-entry,
#searchEntry,
.login-dialog StEntry,
.run-dialog-entry,
.notification StEntry {
@@ -524,8 +524,8 @@ StScrollBar StButton#vhandle:active {
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
}
.search-entry:focus,
.search-entry:hover,
#searchEntry:focus,
#searchEntry:hover,
.login-dialog StEntry:focus,
.notification StEntry:focus,
.modal-dialog StEntry {
@@ -542,18 +542,18 @@ StScrollBar StButton#vhandle:active {
border: 2px solid #3465a4;
}
.search-entry {
#searchEntry {
border-color: rgba(245,245,245,0.3);
color: rgb(192, 192, 192);
caret-color: rgb(192, 192, 192);
}
.search-entry:hover {
#searchEntry:hover {
color: rgb(128, 128, 128);
caret-color: rgb(128, 128, 128);
}
.search-entry:focus {
#searchEntry:focus {
color: rgb(64, 64, 64);
caret-color: rgb(64, 64, 64);
font-weight: bold;
@@ -917,7 +917,7 @@ StScrollBar StButton#vhandle:active {
/* Search Box */
.search-entry {
#searchEntry {
width: 320px;
}
@@ -926,8 +926,8 @@ StScrollBar StButton#vhandle:active {
color: #c0c0c0;
}
.search-entry:hover .search-entry-icon,
.search-entry:focus .search-entry-icon {
#searchEntry:hover .search-entry-icon,
#searchEntry:focus .search-entry-icon {
color: #8d8f8a;
}
@@ -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

@@ -27,9 +27,7 @@ its dependencies to build from tarballs.</description>
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
<bug-database rdf:resource="https://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
<programming-language>JavaScript</programming-language>
<programming-language>C</programming-language>
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
<maintainer>
<foaf:Person>

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

@@ -926,8 +926,6 @@ const LoginDialog = new Lang.Class({
this.actor.show();
this.actor.opacity = 0;
Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN });
Tweener.addTween(this.actor,
{ opacity: 255,
time: 1,
@@ -937,8 +935,7 @@ const LoginDialog = new Lang.Class({
},
close: function() {
Main.popModal(this.actor);
Main.ctrlAltTabManager.removeGroup(this.actor);
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
},
cancel: function() {

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('org.gnome.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(function(a, b) { return a - b });
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

@@ -49,14 +49,13 @@ const PortalWindow = new Lang.Class({
_init: function(application, url, timestamp, doneCallback) {
this.parent({ application: application });
if (!url) {
url = 'http://www.gnome.org';
this._originalUrlWasGnome = true;
if (url) {
this._uri = new Soup.URI(uri);
} else {
this._originalUrlWasGnome = false;
url = 'http://www.gnome.org';
this._uri = null;
this._everSeenRedirect = false;
}
this._uri = new Soup.URI(url);
this._everSeenRedirect = false;
this._originalUrl = url;
this._doneCallback = doneCallback;
this._lastRecheck = 0;
@@ -111,7 +110,37 @@ const PortalWindow = new Lang.Class({
let request = decision.get_request();
let uri = new Soup.URI(request.get_uri());
if (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
if (this._uri != null) {
if (!uri.host_equal(uri, this._uri)) {
// We *may* have finished here, but we don't know for
// sure. Tell gnome-shell to run another connectivity check
// (but ratelimit the checks, we don't want to spam
// gnome.org for portals that have 10 or more internal
// redirects - and unfortunately they exist)
// If we hit the rate limit, we also queue a recheck
// when the window is closed, just in case we miss the
// final check and don't realize we're connected
// This should not be a problem in the cancelled logic,
// because if the user doesn't want to start the login,
// we should not see any redirect at all, outside this._uri
let now = GLib.get_monotonic_time();
let shouldRecheck = (now - this._lastRecheck) >
CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT;
if (shouldRecheck) {
this._lastRecheck = now;
this._recheckAtExit = false;
this._doneCallback(PortalHelperResult.RECHECK);
} else {
this._recheckAtExit = true;
}
}
// Update the URI, in case of chained redirects, so we still
// think we're doing the login until gnome-shell kills us
this._uri = uri;
} else {
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
// Yay, we got to gnome!
decision.ignore();
@@ -122,34 +151,6 @@ const PortalWindow = new Lang.Class({
}
}
// We *may* have finished here, but we don't know for
// sure. Tell gnome-shell to run another connectivity check
// (but ratelimit the checks, we don't want to spam
// nmcheck.gnome.org for portals that have 10 or more internal
// redirects - and unfortunately they exist)
// If we hit the rate limit, we also queue a recheck
// when the window is closed, just in case we miss the
// final check and don't realize we're connected
// This should not be a problem in the cancelled logic,
// because if the user doesn't want to start the login,
// we should not see any redirect at all, outside this._uri
let now = GLib.get_monotonic_time();
let shouldRecheck = (now - this._lastRecheck) >
CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT;
if (shouldRecheck) {
this._lastRecheck = now;
this._recheckAtExit = false;
this._doneCallback(PortalHelperResult.RECHECK);
} else {
this._recheckAtExit = true;
}
// Update the URI, in case of chained redirects, so we still
// think we're doing the login until gnome-shell kills us
this._uri = uri;
decision.use();
return true;
},

View File

@@ -151,13 +151,13 @@ const AppSwitcherPopup = new Lang.Class({
this._items[this._selectedIndex].cachedWindows.length);
},
_keyPressHandler: function(keysym, action) {
_keyPressHandler: function(keysym, backwards, action) {
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
this._select(this._selectedIndex, this._nextWindow());
this._select(this._selectedIndex, backwards ? this._previousWindow() : this._nextWindow());
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
this._select(this._selectedIndex, this._previousWindow());
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS) {
this._select(this._next());
this._select(backwards ? this._previous() : this._next());
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
this._select(this._previous());
} else if (this._thumbnailsFocused) {
@@ -400,9 +400,9 @@ const WindowSwitcherPopup = new Lang.Class({
this._select(1);
},
_keyPressHandler: function(keysym, action) {
_keyPressHandler: function(keysym, backwards, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
this._select(this._next());
this._select(backwards ? this._previous() : this._next());
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD) {
this._select(this._previous());
} else {

View File

@@ -181,35 +181,17 @@ const BaseAppView = new Lang.Class({
});
Signals.addSignalMethods(BaseAppView.prototype);
const PageIndicatorsActor = new Lang.Class({
Name:'PageIndicatorsActor',
Extends: St.BoxLayout,
_init: function() {
this.parent({ style_class: 'page-indicators',
vertical: true,
x_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.CENTER,
reactive: true,
clip_to_allocation: true });
},
vfunc_get_preferred_height: function(forWidth) {
// We want to request the natural height of all our children as our
// natural height, so we chain up to St.BoxLayout, but we only request 0
// as minimum height, since it's not that important if some indicators
// are not shown
let [, natHeight] = this.parent(forWidth);
return [0, natHeight];
}
});
const PageIndicators = new Lang.Class({
Name:'PageIndicators',
_init: function() {
this.actor = new PageIndicatorsActor();
this.actor = new St.BoxLayout({ style_class: 'page-indicators',
vertical: true,
x_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.CENTER,
reactive: true });
this._nPages = 0;
this._currentPage = undefined;
@@ -630,7 +612,6 @@ const AllView = new Lang.Class({
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
this._adjustment.value = 0;
this._currentPage = 0;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function() {
this._pageIndicators.setNPages(this._grid.nPages());
@@ -965,7 +946,7 @@ const FolderView = new Lang.Class({
},
createFolderIcon: function(size) {
let layout = new Clutter.GridLayout();
let layout = new Clutter.TableLayout();
let icon = new St.Widget({ layout_manager: layout,
style_class: 'app-folder-icon' });
layout.hookup_style(icon);
@@ -981,7 +962,7 @@ const FolderView = new Lang.Class({
} else {
bin = new St.Bin({ width: subSize, height: subSize });
}
layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1);
layout.pack(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2));
}
return icon;
@@ -1272,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() {
@@ -1342,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);
},
@@ -1401,9 +1339,7 @@ const AppIcon = new Lang.Class({
this.actor.label_actor = this.icon.label;
this.actor.connect('leave-event', Lang.bind(this, this._onLeaveEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent));
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
@@ -1459,26 +1395,17 @@ const AppIcon = new Lang.Class({
this.actor.remove_style_class_name('running');
},
_setPopupTimeout: function() {
this._removeMenuTimeout();
this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT,
Lang.bind(this, function() {
this._menuTimeoutId = 0;
this.popupMenu();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
},
_onLeaveEvent: function(actor, event) {
this.actor.fake_release();
this._removeMenuTimeout();
},
_onButtonPress: function(actor, event) {
let button = event.get_button();
if (button == 1) {
this._setPopupTimeout();
this._removeMenuTimeout();
this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT,
Lang.bind(this, function() {
this._menuTimeoutId = 0;
this.popupMenu();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
} else if (button == 3) {
this.popupMenu();
return Clutter.EVENT_STOP;
@@ -1486,22 +1413,16 @@ const AppIcon = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
},
_onTouchEvent: function (actor, event) {
if (event.type() == Clutter.EventType.TOUCH_BEGIN)
this._setPopupTimeout();
return Clutter.EVENT_PROPAGATE;
},
_onClicked: function(actor, button) {
this._removeMenuTimeout();
if (button == 0 || button == 1) {
if (button == 1) {
this._onActivate(Clutter.get_current_event());
} else if (button == 2) {
this.app.open_new_window(-1);
Main.overview.hide();
}
return false;
},
_onKeyboardPopupMenu: function() {
@@ -1646,14 +1567,12 @@ const AppIconMenu = new Lang.Class({
if (!this._source.app.is_window_backed()) {
this._appendSeparator();
if (this._source.app.can_open_new_window()) {
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
this._newWindowMenuItem.connect('activate', Lang.bind(this, function() {
this._source.app.open_new_window(-1);
this.emit('activate-window', null);
}));
this._appendSeparator();
}
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
this._newWindowMenuItem.connect('activate', Lang.bind(this, function() {
this._source.app.open_new_window(-1);
this.emit('activate-window', null);
}));
this._appendSeparator();
let appInfo = this._source.app.get_app_info();
let actions = appInfo.list_actions();

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

@@ -311,8 +311,7 @@ const Background = new Lang.Class({
params = Params.parse(params, { monitorIndex: 0,
layoutManager: Main.layoutManager,
effects: Meta.BackgroundEffects.NONE,
settings: null,
overrideImage: null });
settings: null });
this.actor = new Meta.BackgroundGroup();
this.actor._delegate = this;
@@ -320,7 +319,6 @@ const Background = new Lang.Class({
Lang.bind(this, this._destroy));
this._settings = params.settings;
this._overrideImage = params.overrideImage;
this._monitorIndex = params.monitorIndex;
this._layoutManager = params.layoutManager;
this._effects = params.effects;
@@ -584,24 +582,19 @@ const Background = new Lang.Class({
this._loadPattern();
let filename;
if (this._overrideImage != null) {
filename = this._overrideImage;
this._style = GDesktopEnums.BackgroundStyle.WALLPAPER; // Hardcode
} else {
this._style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
if (this._style == GDesktopEnums.BackgroundStyle.NONE) {
this._setLoaded();
return;
}
let uri = this._settings.get_string(PICTURE_URI_KEY);
if (GLib.uri_parse_scheme(uri) != null)
filename = Gio.File.new_for_uri(uri).get_path();
else
filename = uri;
this._style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
if (this._style == GDesktopEnums.BackgroundStyle.NONE) {
this._setLoaded();
return;
}
let uri = this._settings.get_string(PICTURE_URI_KEY);
let filename;
if (GLib.uri_parse_scheme(uri) != null)
filename = Gio.File.new_for_uri(uri).get_path();
else
filename = uri;
if (!filename) {
this._setLoaded();
return;
@@ -735,8 +728,6 @@ const BackgroundManager = new Lang.Class({
controlPosition: true,
settingsSchema: BACKGROUND_SCHEMA });
// Allow override the background image setting for performance testing
this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
this._settings = new Gio.Settings({ schema_id: params.settingsSchema });
this._container = params.container;
this._layoutManager = params.layoutManager;
@@ -798,8 +789,7 @@ const BackgroundManager = new Lang.Class({
let background = new Background({ monitorIndex: this._monitorIndex,
layoutManager: this._layoutManager,
effects: this._effects,
settings: this._settings,
overrideImage: this._overrideImage });
settings: this._settings });
this._container.add_child(background.actor);
let monitor = this._layoutManager.monitors[this._monitorIndex];

View File

@@ -33,7 +33,8 @@ function addBackgroundMenu(actor, layoutManager) {
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
actor._backgroundManager.addMenu(actor._backgroundMenu);
function openMenu(x, y) {
function openMenu() {
let [x, y] = global.get_pointer();
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
}
@@ -41,25 +42,20 @@ function addBackgroundMenu(actor, layoutManager) {
let clickAction = new Clutter.ClickAction();
clickAction.connect('long-press', function(action, actor, state) {
if (state == Clutter.LongPressState.QUERY)
return ((action.get_button() == 0 ||
action.get_button() == 1) &&
!actor._backgroundMenu.isOpen);
return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
if (state == Clutter.LongPressState.ACTIVATE) {
let [x, y] = action.get_coords();
openMenu(x, y);
openMenu();
actor._backgroundManager.ignoreRelease();
}
return true;
});
clickAction.connect('clicked', function(action) {
if (action.get_button() == 3) {
let [x, y] = action.get_coords();
openMenu(x, y);
}
if (action.get_button() == 3)
openMenu();
});
actor.add_action(clickAction);
let grabOpBeginId = global.display.connect('grab-op-begin', function () {
global.display.connect('grab-op-begin', function () {
clickAction.release();
});
@@ -67,6 +63,5 @@ function addBackgroundMenu(actor, layoutManager) {
actor._backgroundMenu.destroy();
actor._backgroundMenu = null;
actor._backgroundManager = null;
global.display.disconnect(grabOpBeginId);
});
}

View File

@@ -409,7 +409,7 @@ const Calendar = new Lang.Class({
this._shouldDateGrabFocus = false;
this.actor = new St.Widget({ style_class: 'calendar',
layout_manager: new Clutter.GridLayout(),
layout_manager: new Clutter.TableLayout(),
reactive: true });
this.actor.connect('scroll-event',
@@ -447,7 +447,8 @@ const Calendar = new Lang.Class({
// Top line of the calendar '<| September 2009 |>'
this._topBox = new St.BoxLayout();
layout.attach(this._topBox, 0, 0, offsetCols + 7, 1);
layout.pack(this._topBox, 0, 0);
layout.set_span(this._topBox, offsetCols + 7, 1);
this._backButton = new St.Button({ style_class: 'calendar-change-month-back',
accessible_name: _("Previous month"),
@@ -484,7 +485,7 @@ const Calendar = new Lang.Class({
col = 6 - (7 + iter.getDay() - this._weekStart) % 7;
else
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
layout.attach(label, col, 1, 1, 1);
layout.pack(label, col, 1);
iter.setTime(iter.getTime() + MSECS_IN_DAY);
}
@@ -656,14 +657,14 @@ const Calendar = new Lang.Class({
col = 6 - (7 + iter.getDay() - this._weekStart) % 7;
else
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
layout.attach(button, col, row, 1, 1);
layout.pack(button, col, row);
this._buttons.push(button);
if (this._useWeekdate && iter.getDay() == 4) {
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
style_class: 'calendar-day-base calendar-week-number'});
layout.attach(label, rtl ? 7 : 0, row, 1, 1);
layout.pack(label, rtl ? 7 : 0, row);
}
iter.setTime(iter.getTime() + MSECS_IN_DAY);
@@ -706,7 +707,7 @@ const EventsList = new Lang.Class({
Name: 'EventsList',
_init: function() {
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let layout = new Clutter.TableLayout();
this.actor = new St.Widget({ style_class: 'events-table',
layout_manager: layout });
layout.hookup_style(this.actor);
@@ -729,34 +730,36 @@ const EventsList = new Lang.Class({
dayString = '';
let dayLabel = new St.Label({ style_class: 'events-day-dayname',
text: dayString,
x_align: Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.START });
text: dayString });
dayLabel.clutter_text.line_wrap = false;
dayLabel.clutter_text.ellipsize = false;
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
let layout = this.actor.layout_manager;
layout.attach(dayLabel, rtl ? 2 : 0, index, 1, 1);
layout.pack(dayLabel, rtl ? 2 : 0, index);
layout.child_set(dayLabel, { x_expand: false,
x_align: Clutter.TableAlignment.END,
y_align: Clutter.TableAlignment.START });
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
let timeString = _formatEventTime(event, clockFormat);
let timeLabel = new St.Label({ style_class: 'events-day-time',
text: timeString,
y_align: Clutter.ActorAlign.START });
text: timeString });
timeLabel.clutter_text.line_wrap = false;
timeLabel.clutter_text.ellipsize = false;
layout.attach(timeLabel, 1, index, 1, 1);
layout.pack(timeLabel, 1, index);
layout.child_set(timeLabel, { x_expand: false,
y_align: Clutter.TableAlignment.START });
let titleLabel = new St.Label({ style_class: 'events-day-task',
text: event.summary,
x_expand: true });
text: event.summary });
titleLabel.clutter_text.line_wrap = true;
titleLabel.clutter_text.ellipsize = false;
layout.attach(titleLabel, rtl ? 0 : 2, index, 1, 1);
layout.pack(titleLabel, rtl ? 0 : 2, index);
layout.child_set(titleLabel, { x_expand: true });
},
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
@@ -767,7 +770,8 @@ const EventsList = new Lang.Class({
let label = new St.Label({ style_class: 'events-day-header', text: header });
let layout = this.actor.layout_manager;
layout.attach(label, 0, index, 3, 1);
layout.pack(label, 0, index);
layout.child_set(label, { column_span: 3, x_expand: false });
index++;
for (let n = 0; n < events.length; n++) {

View File

@@ -80,46 +80,44 @@ const KeyringDialog = new Lang.Class({
},
_buildControlTable: function() {
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let layout = new Clutter.TableLayout();
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
layout_manager: layout });
layout.hookup_style(table);
let row = 0;
if (this.prompt.password_visible) {
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER });
let label = new St.Label({ style_class: 'prompt-dialog-password-label' });
label.set_text(_("Password:"));
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
layout.attach(label, 0, row, 1, 1);
layout.pack(label, 0, row);
layout.child_set(label, { x_expand: false, y_fill: false,
x_align: Clutter.TableAlignment.START });
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
x_expand: true });
can_focus: true });
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
layout.attach(this._passwordEntry, 1, row, 1, 1);
layout.pack(this._passwordEntry, 1, row);
row++;
} else {
this._passwordEntry = null;
}
if (this.prompt.confirm_visible) {
var label = new St.Label(({ style_class: 'prompt-dialog-password-label',
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER }));
var label = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
label.set_text(_("Type again:"));
layout.attach(label, 0, row, 1, 1);
layout.pack(label, 0, row);
layout.child_set(label, { x_expand: false, y_fill: false,
x_align: Clutter.TableAlignment.START });
this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
x_expand: true });
can_focus: true });
this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
this._confirmEntry.clutter_text.connect('activate', Lang.bind(this, this._onConfirmActivate));
layout.attach(this._confirmEntry, 1, row, 1, 1);
layout.pack(this._confirmEntry, 1, row);
row++;
} else {
this._confirmEntry = null;
@@ -132,15 +130,15 @@ const KeyringDialog = new Lang.Class({
let choice = new CheckBox.CheckBox();
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('choice-chosen', choice.actor, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
layout.attach(choice.actor, 1, row, 1, 1);
layout.pack(choice.actor, 1, row);
row++;
}
let warning = new St.Label({ style_class: 'prompt-dialog-error-label',
x_align: Clutter.ActorAlign.START });
let warning = new St.Label({ style_class: 'prompt-dialog-error-label' });
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
warning.clutter_text.line_wrap = true;
layout.attach(warning, 1, row, 1, 1);
layout.pack(warning, 1, row);
layout.child_set(warning, { x_fill: false, x_align: Clutter.TableAlignment.START });
this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE);

View File

@@ -72,7 +72,7 @@ const NetworkSecretDialog = new Lang.Class({
expand: true });
}
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let layout = new Clutter.TableLayout();
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
layout_manager: layout });
layout.hookup_style(secretTable);
@@ -83,17 +83,14 @@ const NetworkSecretDialog = new Lang.Class({
for (let i = 0; i < this._content.secrets.length; i++) {
let secret = this._content.secrets[i];
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
text: secret.label,
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER });
text: secret.label });
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
let reactive = secret.key != null;
secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: secret.value, can_focus: reactive,
reactive: reactive,
x_expand: true });
reactive: reactive });
ShellEntry.addContextMenu(secret.entry,
{ isPassword: secret.password });
@@ -121,12 +118,14 @@ const NetworkSecretDialog = new Lang.Class({
secret.valid = true;
if (rtl) {
layout.attach(secret.entry, 0, pos, 1, 1);
layout.attach(label, 1, pos, 1, 1);
layout.pack(secret.entry, 0, pos);
layout.pack(label, 1, pos);
} else {
layout.attach(label, 0, pos, 1, 1);
layout.attach(secret.entry, 1, pos, 1, 1);
layout.pack(label, 0, pos);
layout.pack(secret.entry, 1, pos);
}
layout.child_set(label, { x_expand: false, y_fill: false,
x_align: Clutter.TableAlignment.START });
pos++;
if (secret.password)

View File

@@ -863,6 +863,13 @@ const ChatNotification = new Lang.Class({
for (let i = 0; i < expired.length; i++)
expired[i].actor.destroy();
}
let groups = this._contentArea.get_children();
for (let i = 0; i < groups.length; i++) {
let group = groups[i];
if (group.get_n_children() == 0)
group.destroy();
}
},
/**
@@ -904,19 +911,16 @@ const ChatNotification = new Lang.Class({
this._lastGroup = group;
let emptyLine = new St.Label({ style_class: 'chat-empty-line' });
this.addActor(emptyLine);
this._history.unshift({ actor: emptyLine, time: timestamp,
realMessage: false });
}
let lineBox = new St.BoxLayout({ vertical: false });
lineBox.add(body, props.childProps);
this.addActor(lineBox);
this._lastMessageBox = lineBox;
this._lastMessageBox = new St.BoxLayout({ vertical: false });
this._lastMessageBox.add(body, props.childProps);
this.addActor(this._lastMessageBox);
this.updated();
let timestamp = props.timestamp;
this._history.unshift({ actor: lineBox, time: timestamp,
this._history.unshift({ actor: body, time: timestamp,
realMessage: group != 'meta' });
if (!props.noTimestamp) {

View File

@@ -156,11 +156,11 @@ const CtrlAltTabPopup = new Lang.Class({
this._select(this._selectedIndex);
},
_keyPressHandler: function(keysym, action) {
_keyPressHandler: function(keysym, backwards, action) {
if (action == Meta.KeyBindingAction.SWITCH_PANELS)
this._select(this._next());
this._select(backwards ? this._previous() : this._next());
else if (action == Meta.KeyBindingAction.SWITCH_PANELS_BACKWARD)
this._select(this._previous());
this._select(backwards ? this._next() : this._previous());
else if (keysym == Clutter.Left)
this._select(this._previous());
else if (keysym == Clutter.Right)

View File

@@ -211,13 +211,10 @@ const DateMenuButton = new Lang.Class({
return this._calendarApp;
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
if (apps && (apps.length > 0)) {
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
let defaultInRecommended = apps.some(function(a) { return a.equal(app); });
this._calendarApp = defaultInRecommended ? app : apps[0];
} else {
if (apps && (apps.length > 0))
this._calendarApp = apps[0];
else
this._calendarApp = null;
}
return this._calendarApp;
},

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

@@ -283,22 +283,12 @@ const GrabHelper = new Lang.Class({
return Clutter.EVENT_STOP;
}
let motion = type == Clutter.EventType.MOTION;
let press = type == Clutter.EventType.BUTTON_PRESS;
let release = type == Clutter.EventType.BUTTON_RELEASE;
let button = press || release;
let touchUpdate = type == Clutter.EventType.TOUCH_UPDATE;
let touchBegin = type == Clutter.EventType.TOUCH_BEGIN;
let touchEnd = type == Clutter.EventType.TOUCH_END;
let touch = touchUpdate || touchBegin || touchEnd;
if (touch && !global.display.is_pointer_emulating_sequence (event.get_event_sequence()))
return Clutter.EVENT_PROPAGATE;
if (this._ignoreUntilRelease && (motion || release || touch)) {
if (release || touchEnd)
this._ignoreUntilRelease = false;
if (release && this._ignoreRelease) {
this._ignoreRelease = false;
return Clutter.EVENT_STOP;
}
@@ -308,12 +298,11 @@ const GrabHelper = new Lang.Class({
if (Main.keyboard.shouldTakeEvent(event))
return Clutter.EVENT_PROPAGATE;
if (button || touchBegin) {
// If we have a press event, ignore the next
// motion/release events.
if (press || touchBegin)
this._ignoreUntilRelease = true;
if (button) {
// If we have a press event, ignore the next event,
// which should be a release event.
if (press)
this._ignoreRelease = true;
let i = this._actorInGrabStack(event.get_source()) + 1;
this.ungrab({ actor: this._grabStack[i].actor, isUser: true });
return Clutter.EVENT_STOP;

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

@@ -524,13 +524,12 @@ const IconGrid = new Lang.Class({
this._updateSpacingForSize(availWidth, availHeight);
}
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
Lang.bind(this, this._updateIconSizes));
let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize);
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateChildrenScale(scale); }));
},
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
_updateIconSizes: function() {
let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize);
_updateChildrenScale: function(scale) {
let newIconSize = Math.floor(ICON_SIZE * scale);
for (let i in this._items) {
this._items[i].icon.setIconSize(newIconSize);

View File

@@ -52,7 +52,8 @@ const Key = new Lang.Class({
_init : function(key) {
this._key = key;
this.actor = this._makeKey(key, GLib.markup_escape_text(key.label, -1));
this.actor = this._makeKey();
this._extended_keys = this._key.get_extended_keys();
this._extended_keyboard = null;
@@ -75,38 +76,20 @@ const Key = new Lang.Class({
}
},
_makeKey: function (key, label) {
_makeKey: function () {
let label = GLib.markup_escape_text(this._key.label, -1);
let button = new St.Button ({ label: label,
style_class: 'keyboard-key' });
button.key_width = this._key.width;
button.connect('button-press-event', Lang.bind(this,
function () {
key.press();
this._key.press();
return Clutter.EVENT_PROPAGATE;
}));
button.connect('button-release-event', Lang.bind(this,
function () {
key.release();
return Clutter.EVENT_PROPAGATE;
}));
button.connect('touch-event', Lang.bind(this,
function (actor, event) {
let device = event.get_device();
let sequence = event.get_event_sequence();
if (!this._touchPressed &&
event.type() == Clutter.EventType.TOUCH_BEGIN) {
device.sequence_grab(sequence, actor);
this._touchPressed = true;
key.press();
} else if (this._touchPressed &&
event.type() == Clutter.EventType.TOUCH_END &&
device.sequence_get_grabbed_actor(sequence) == actor) {
device.sequence_ungrab(sequence);
this._touchPressed = false;
key.release();
}
this._key.release();
return Clutter.EVENT_PROPAGATE;
}));
@@ -129,9 +112,18 @@ const Key = new Lang.Class({
for (let i = 0; i < this._extended_keys.length; ++i) {
let extended_key = this._extended_keys[i];
let label = this._getUnichar(extended_key);
let key = this._makeKey(extended_key, label);
let key = new St.Button({ label: label, style_class: 'keyboard-key' });
key.extended_key = extended_key;
key.connect('button-press-event', Lang.bind(this,
function () {
extended_key.press();
return Clutter.EVENT_PROPAGATE;
}));
key.connect('button-release-event', Lang.bind(this,
function () {
extended_key.release();
return Clutter.EVENT_PROPAGATE;
}));
this._extended_keyboard.add(key);
}
this._boxPointer.bin.add_actor(this._extended_keyboard);

View File

@@ -408,12 +408,6 @@ const LayoutManager = new Lang.Class({
}
},
_updateKeyboardBox: function() {
this.keyboardBox.set_position(this.keyboardMonitor.x,
this.keyboardMonitor.y + this.keyboardMonitor.height);
this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
},
_updateBoxes: function() {
this.screenShieldGroup.set_position(0, 0);
this.screenShieldGroup.set_size(global.screen_width, global.screen_height);
@@ -423,8 +417,6 @@ const LayoutManager = new Lang.Class({
if (this.keyboardIndex < 0)
this.keyboardIndex = this.primaryIndex;
else
this._updateKeyboardBox();
this.trayBox.set_position(this.bottomMonitor.x,
this.bottomMonitor.y + this.bottomMonitor.height);
@@ -549,7 +541,9 @@ const LayoutManager = new Lang.Class({
set keyboardIndex(v) {
this._keyboardIndex = v;
this._updateKeyboardBox();
this.keyboardBox.set_position(this.keyboardMonitor.x,
this.keyboardMonitor.y + this.keyboardMonitor.height);
this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
},
get keyboardIndex() {
@@ -603,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();
@@ -644,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

@@ -105,8 +105,8 @@ const Lightbox = new Lang.Class({
this._container = container;
this._children = container.get_children();
this._fadeFactor = params.fadeFactor;
this._radialEffect = Clutter.feature_available(Clutter.FeatureFlags.SHADERS_GLSL) && params.radialEffect;
if (this._radialEffect)
this._radialEffect = params.radialEffect;
if (params.radialEffect)
this.actor = new RadialShaderQuad({ x: 0,
y: 0,
reactive: params.inhibitEvents });

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;
@@ -922,7 +923,7 @@ const Notification = new Lang.Class({
let [titleMinH, titleNatH] = this._titleLabel.get_preferred_height(availWidth);
let [bannerMinW, bannerNatW] = this._bannerLabel.get_preferred_width(availWidth);
let rtl = (this._table.text_direction == Clutter.TextDirection.RTL);
let rtl = (this._titleDirection == Clutter.TextDirection.RTL);
let x = rtl ? availWidth : 0;
if (this._secondaryIcon) {
@@ -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

@@ -242,7 +242,7 @@ const Overview = new Lang.Class({
opacity: 0 });
this._overview.add_actor(this._panelGhost);
this._searchEntry = new St.Entry({ style_class: 'search-entry',
this._searchEntry = new St.Entry({ name: 'searchEntry',
/* Translators: this is the text displayed
in the search entry when no search is
active; it should not exceed ~30
@@ -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;
@@ -623,7 +621,7 @@ const Overview = new Lang.Class({
this.animationInProgress = true;
this.visibleTarget = false;
this.viewSelector.animateFromOverview();
this.viewSelector.zoomFromOverview();
// Make other elements fade out.
Tweener.addTween(this._stack,
@@ -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

@@ -118,6 +118,7 @@ const SlidingControl = new Lang.Class({
style_class: 'overview-controls',
clip_to_allocation: true });
Main.overview.connect('showing', Lang.bind(this, this._onOverviewShowing));
Main.overview.connect('hiding', Lang.bind(this, this._onOverviewHiding));
Main.overview.connect('item-drag-begin', Lang.bind(this, this._onDragBegin));
@@ -176,9 +177,14 @@ const SlidingControl = new Lang.Class({
transition: 'easeOutQuad' });
},
_onOverviewShowing: function() {
this._visible = true;
this.layout.slideX = this._getSlide();
this.layout.translationX = this._getTranslation();
this.slideIn();
},
_onOverviewHiding: function() {
// We need to explicitily slideOut since showing pages
// doesn't implies to slide out, instead, hiding the overview does.
this.slideOut();
},

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;
@@ -571,6 +572,7 @@ const ActivitiesButton = new Lang.Class({
this.actor.label_actor = this._label;
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this.actor.connect_after('button-release-event', Lang.bind(this, this._onButtonRelease));
this.actor.connect_after('key-release-event', Lang.bind(this, this._onKeyRelease));
Main.overview.connect('showing', Lang.bind(this, function() {
@@ -599,21 +601,16 @@ const ActivitiesButton = new Lang.Class({
},
_onCapturedEvent: function(actor, event) {
if (event.type() == Clutter.EventType.BUTTON_PRESS ||
event.type() == Clutter.EventType.TOUCH_BEGIN) {
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
if (!Main.overview.shouldToggleByCornerOrButton())
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_onEvent: function(actor, event) {
this.parent(actor, event);
if (event.type() == Clutter.EventType.TOUCH_END ||
event.type() == Clutter.EventType.BUTTON_RELEASE)
Main.overview.toggle();
_onButtonRelease: function() {
Main.overview.toggle();
this.menu.close();
return Clutter.EVENT_PROPAGATE;
},

View File

@@ -100,7 +100,7 @@ const Button = new Lang.Class({
accessible_name: nameText ? nameText : "",
accessible_role: Atk.Role.MENU });
this.actor.connect('event', Lang.bind(this, this._onEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibilityChanged));
@@ -131,12 +131,11 @@ const Button = new Lang.Class({
}
},
_onEvent: function(actor, event) {
if (this.menu &&
(event.type() == Clutter.EventType.TOUCH_BEGIN ||
event.type() == Clutter.EventType.BUTTON_PRESS))
this.menu.toggle();
_onButtonPress: function(actor, event) {
if (!this.menu)
return Clutter.EVENT_PROPAGATE;
this.menu.toggle();
return Clutter.EVENT_PROPAGATE;
},

View File

@@ -1,7 +1,9 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
@@ -13,6 +15,7 @@ const GrabHelper = imports.ui.grabHelper;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Separator = imports.ui.separator;
const Slider = imports.ui.slider;
const Tweener = imports.ui.tweener;
const Ornament = {
@@ -21,6 +24,17 @@ const Ornament = {
CHECK: 2,
};
function _ensureStyle(actor) {
if (actor.get_children) {
let children = actor.get_children();
for (let i = 0; i < children.length; i++)
_ensureStyle(children[i]);
}
if (actor instanceof St.Widget)
actor.ensure_style();
}
function isPopupMenuItemVisible(child) {
if (child._delegate instanceof PopupMenuSection)
if (child._delegate.isEmpty())
@@ -92,7 +106,6 @@ const PopupBaseMenuItem = new Lang.Class({
if (this._activatable) {
this.actor.connect('button-release-event', Lang.bind(this, this._onButtonReleaseEvent));
this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent));
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
}
if (params.reactive && params.hover)
@@ -119,14 +132,6 @@ const PopupBaseMenuItem = new Lang.Class({
return Clutter.EVENT_STOP;
},
_onTouchEvent: function (actor, event) {
if (event.type() == Clutter.EventType.TOUCH_END) {
this.activate(event);
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_onKeyPressEvent: function (actor, event) {
let symbol = event.get_key_symbol();
@@ -373,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

@@ -110,13 +110,6 @@ function loadRemoteSearchProviders(callback) {
else
remoteProvider = new RemoteSearchProvider(appInfo, busName, objectPath);
remoteProvider.defaultEnabled = true;
try {
remoteProvider.defaultEnabled = !keyfile.get_boolean(group, 'DefaultDisabled');
} catch(e) {
// ignore error
}
objectPaths[objectPath] = remoteProvider;
loadedProviders.push(remoteProvider);
} catch(e) {
@@ -139,14 +132,8 @@ function loadRemoteSearchProviders(callback) {
loadedProviders = loadedProviders.filter(function(provider) {
let appId = provider.appInfo.get_id();
if (provider.defaultEnabled) {
let disabled = searchSettings.get_strv('disabled');
return disabled.indexOf(appId) == -1;
} else {
let enabled = searchSettings.get_strv('enabled');
return enabled.indexOf(appId) != -1;
}
let disabled = searchSettings.get_strv('disabled');
return disabled.indexOf(appId) == -1;
});
loadedProviders.sort(function(providerA, providerB) {

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);
@@ -182,10 +186,6 @@ const RunDialog = new Lang.Class({
let results = someResults.reduce(function(a, b) {
return a.concat(b);
}, []);
if (!results.length)
return null;
let common = results.reduce(_getCommon, null);
return common.substr(text.length);
},
@@ -271,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

@@ -902,11 +902,17 @@ const ScreenShield = new Lang.Class({
},
showDialog: function() {
if (!this._becomeModal()) {
// In the login screen, this is a hard error. Fail-whale
log('Could not acquire modal grab for the login screen. Aborting login process.');
Meta.quit(Meta.ExitCode.ERROR);
}
// Ensure that the stage window is mapped, before taking a grab
// otherwise X errors out
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
if (!this._becomeModal()) {
// In the login screen, this is a hard error. Fail-whale
log('Could not acquire modal grab for the login screen. Aborting login process.');
Meta.quit(Meta.ExitCode.ERROR);
}
return false;
}));
this.actor.show();
this._isGreeter = Main.sessionMode.isGreeter;

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

@@ -32,7 +32,6 @@ const SearchSystem = new Lang.Class({
this._registerProvider(new AppDisplay.AppSearchProvider());
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::enabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
@@ -243,8 +242,8 @@ const GridSearchResult = new Lang.Class({
dragSource = icon.icon;
content = { actor: actor, icon: icon };
} else {
if (content.getDragActorSource)
dragSource = content.getDragActorSource();
if (content._delegate && content._delegate.getDragActorSource)
dragSource = content._delegate.getDragActorSource();
}
this.actor.set_child(content.actor);
@@ -267,7 +266,7 @@ const GridSearchResult = new Lang.Class({
if (!dragSource)
// not exactly right, but alignment problems are hard to notice
dragSource = content.actor;
dragSource = content;
this._dragActorSource = dragSource;
},
@@ -434,7 +433,7 @@ const ListSearchResults = new Lang.Class({
},
_setMoreIconVisible: function(visible) {
this.providerIcon.moreIcon.visible = visible;
this.providerIcon.moreIcon.visible = true;
},
_getMaxDisplayedResults: function() {
@@ -466,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 });
@@ -484,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) {
@@ -586,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

@@ -24,7 +24,6 @@ const Slider = new Lang.Class({
accessible_role: Atk.Role.SLIDER });
this.actor.connect('repaint', Lang.bind(this, this._sliderRepaint));
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
this.actor.connect('touch-event', Lang.bind(this, this._touchDragging));
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this.actor.connect('key-press-event', Lang.bind(this, this.onKeyPressEvent));
@@ -122,21 +121,11 @@ const Slider = new Lang.Class({
this._dragging = true;
let device = event.get_device();
let sequence = event.get_event_sequence();
if (sequence != null)
device.sequence_grab(sequence, this.actor);
else
device.grab(this.actor);
device.grab(this.actor);
this._grabbedDevice = device;
this._grabbedSequence = sequence;
if (sequence == null) {
this._releaseId = this.actor.connect('button-release-event', Lang.bind(this, this._endDragging));
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
}
this._releaseId = this.actor.connect('button-release-event', Lang.bind(this, this._endDragging));
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
let absX, absY;
[absX, absY] = event.get_coords();
this._moveHandle(absX, absY);
@@ -145,17 +134,10 @@ const Slider = new Lang.Class({
_endDragging: function() {
if (this._dragging) {
if (this._releaseId)
this.actor.disconnect(this._releaseId);
if (this._motionId)
this.actor.disconnect(this._motionId);
this.actor.disconnect(this._releaseId);
this.actor.disconnect(this._motionId);
if (this._grabbedSequence != null)
this._grabbedDevice.sequence_ungrab(this._grabbedSequence);
else
this._grabbedDevice.ungrab();
this._grabbedSequence = null;
this._grabbedDevice.ungrab();
this._grabbedDevice = null;
this._dragging = false;
@@ -164,24 +146,6 @@ const Slider = new Lang.Class({
return Clutter.EVENT_STOP;
},
_touchDragging: function(actor, event) {
let device = event.get_device();
let sequence = event.get_event_sequence();
if (!this._dragging &&
event.type() == Clutter.EventType.TOUCH_BEGIN) {
this.startDragging(event);
return Clutter.EVENT_STOP;
} else if (device.sequence_get_grabbed_actor(sequence) == actor) {
if (event.type() == Clutter.EventType.TOUCH_UPDATE)
return this._motionEvent(actor, event);
else if (event.type() == Clutter.EventType.TOUCH_END)
return this._endDragging();
}
return Clutter.EVENT_PROPAGATE;
},
scroll: function(event) {
let direction = event.get_scroll_direction();
let delta;

View File

@@ -283,11 +283,11 @@ const InputSourcePopup = new Lang.Class({
this._select(this._selectedIndex);
},
_keyPressHandler: function(keysym, action) {
_keyPressHandler: function(keysym, backwards, action) {
if (action == this._action)
this._select(this._next());
this._select(backwards ? this._previous() : this._next());
else if (action == this._actionBackward)
this._select(this._previous());
this._select(backwards ? this._next() : this._previous());
else if (keysym == Clutter.Left)
this._select(this._previous());
else if (keysym == Clutter.Right)
@@ -366,12 +366,13 @@ const InputSourceIndicator = new Lang.Class({
this._keybindingAction =
Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.NONE,
Meta.KeyBindingFlags.REVERSES,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward =
Main.wm.addKeybinding('switch-input-source-backward',
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES |
Meta.KeyBindingFlags.IS_REVERSED,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
@@ -472,7 +473,8 @@ const InputSourceIndicator = new Lang.Class({
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
let modifiers = binding.get_modifiers();
if (!popup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
popup.destroy();
},

View File

@@ -9,9 +9,8 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Shell = imports.gi.Shell;
const LOCATION_SCHEMA = 'org.gnome.system.location';
const LOCATION_SCHEMA = 'org.gnome.shell.location';
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
const ENABLED = 'enabled';
var GeoclueIface = '<node> \
<interface name="org.freedesktop.GeoClue2.Manager"> \
@@ -45,8 +44,6 @@ const Indicator = new Lang.Class({
this.parent();
this._settings = new Gio.Settings({ schema_id: LOCATION_SCHEMA });
this._settings.connect('changed::' + ENABLED,
Lang.bind(this, this._onMaxAccuracyLevelChanged));
this._settings.connect('changed::' + MAX_ACCURACY_LEVEL,
Lang.bind(this, this._onMaxAccuracyLevelChanged));
@@ -96,12 +93,10 @@ const Indicator = new Lang.Class({
_syncIndicator: function() {
if (this._proxy == null) {
this._indicator.visible = false;
this._item.actor.visible = false;
return;
}
this._indicator.visible = this._proxy.InUse;
this._item.actor.visible = this._indicator.visible;
this._updateMenuLabels();
},
@@ -128,6 +123,7 @@ const Indicator = new Lang.Class({
this._propertiesChangedId = this._proxy.connect('g-properties-changed',
Lang.bind(this, this._onGeocluePropsChanged));
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
this._syncIndicator();
this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
@@ -152,8 +148,10 @@ const Indicator = new Lang.Class({
},
_onOnOffAction: function() {
let enabled = this._settings.get_boolean(ENABLED);
this._settings.set_boolean(ENABLED, !enabled);
if (this._getMaxAccuracyLevel() == 0)
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
else
this._settings.set_enum(MAX_ACCURACY_LEVEL, 0);
},
_onSessionUpdated: function() {
@@ -162,12 +160,12 @@ const Indicator = new Lang.Class({
},
_updateMenuLabels: function() {
if (this._settings.get_boolean(ENABLED)) {
this._item.status.text = this._indicator.visible ? _("In Use") : _("Enabled");
this._onOffAction.label.text = _("Disable");
} else {
if (this._getMaxAccuracyLevel() == 0) {
this._item.status.text = _("Disabled");
this._onOffAction.label.text = _("Enable");
} else {
this._item.status.text = this._indicator.visible ? _("In Use") : _("Enabled");
this._onOffAction.label.text = _("Disable");
}
},
@@ -181,10 +179,7 @@ const Indicator = new Lang.Class({
},
_getMaxAccuracyLevel: function() {
if (this._settings.get_boolean(ENABLED))
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
else
return 0;
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
},
_notifyMaxAccuracyLevel: function() {
@@ -196,6 +191,12 @@ const Indicator = new Lang.Class({
let unpacked = properties.deep_unpack();
if ("InUse" in unpacked)
this._syncIndicator();
if ("AvailableAccuracyLevel" in unpacked) {
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
if (this._getMaxAccuracyLevel() != 0)
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
}
}
});

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

@@ -178,17 +178,19 @@ const SwitcherPopup = new Lang.Class({
return mod(this._selectedIndex - 1, this._items.length);
},
_keyPressHandler: function(keysym, action) {
_keyPressHandler: function(keysym, backwards, action) {
throw new Error('Not implemented');
},
_keyPressEvent: function(actor, event) {
let keysym = event.get_key_symbol();
let action = global.display.get_keybinding_action(event.get_key_code(), event.get_state());
let event_state = event.get_state();
let backwards = event_state & Clutter.ModifierType.SHIFT_MASK;
let action = global.display.get_keybinding_action(event.get_key_code(), event_state);
this._disableHover();
if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE)
if (this._keyPressHandler(keysym, backwards, action) != Clutter.EVENT_PROPAGATE)
return Clutter.EVENT_STOP;
if (keysym == Clutter.Escape)

View File

@@ -53,10 +53,8 @@ function _wrapTweening(target, tweeningParameters) {
}
}
if (!Gtk.Settings.get_default().gtk_enable_animations) {
if (!Gtk.Settings.get_default().gtk_enable_animations)
tweeningParameters['time'] = 0.000001;
tweeningParameters['delay'] = 0.000001;
}
_addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted);
}

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,145 +51,13 @@ 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',
_init : function(searchEntry, showAppsButton) {
this.actor = new Shell.Stack({ name: 'viewSelector' });
this._showAppsBlocked = false;
this._showAppsButton = showAppsButton;
this._showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled));
@@ -250,26 +120,18 @@ const ViewSelector = new Lang.Class({
this._stageKeyPressId = 0;
Main.overview.connect('showing', Lang.bind(this,
function () {
this._resetShowAppsButton();
this._stageKeyPressId = global.stage.connect('key-press-event',
Lang.bind(this, this._onStageKeyPress));
}));
Main.overview.connect('hiding', Lang.bind(this,
function () {
this._resetShowAppsButton();
if (this._stageKeyPressId != 0) {
global.stage.disconnect(this._stageKeyPressId);
this._stageKeyPressId = 0;
}
}));
Main.overview.connect('shown', Lang.bind(this,
function() {
// If we were animating from the desktop view to the
// apps page the workspace page was visible, allowing
// the windows to animate, but now we no longer want to
// show it given that we are now on the apps page or
// search page.
if (this._activePage != this._workspacesPage)
this._workspacesPage.opacity = 0;
}));
Main.wm.addKeybinding('toggle-application-view',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
@@ -285,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();
@@ -296,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();
@@ -305,36 +165,28 @@ const ViewSelector = new Lang.Class({
},
_toggleAppsPage: function() {
this._showAppsButton.checked = !this._showAppsButton.checked;
Main.overview.show();
this._showAppsButton.checked = !this._showAppsButton.checked;
},
showApps: function() {
this._showAppsButton.checked = true;
Main.overview.show();
this._showAppsButton.checked = true;
},
show: function() {
this.reset();
this._workspacesDisplay.show(this._showAppsButton.checked);
this._workspacesDisplay.show();
this._activePage = null;
if (this._showAppsButton.checked)
this._showPage(this._appsPage);
else
this._showPage(this._workspacesPage);
this._showPage(this._workspacesPage);
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
Main.overview.fadeOutDesktop();
},
animateFromOverview: function() {
// Make sure workspace page is fully visible to allow
// workspace.js do the animation of the windows
this._workspacesPage.opacity = 255;
this._workspacesDisplay.animateFromOverview(this._activePage != this._workspacesPage);
this._showAppsButton.checked = false;
zoomFromOverview: function() {
this._workspacesDisplay.zoomFromOverview();
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
Main.overview.fadeInDesktop();
@@ -385,10 +237,7 @@ const ViewSelector = new Lang.Class({
});
},
_showPage: function(page) {
if (!Main.overview.visible)
return;
_showPage: function(page, noFade) {
if (page == this._activePage)
return;
@@ -396,7 +245,7 @@ const ViewSelector = new Lang.Class({
this._activePage = page;
this.emit('page-changed');
if (oldPage)
if (oldPage && !noFade)
Tweener.addTween(oldPage,
{ opacity: 0,
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
@@ -407,7 +256,7 @@ const ViewSelector = new Lang.Class({
})
});
else
this._fadePageIn();
this._fadePageIn(oldPage);
},
_a11yFocusPage: function(page) {
@@ -416,10 +265,21 @@ const ViewSelector = new Lang.Class({
},
_onShowAppsButtonToggled: function() {
if (this._showAppsBlocked)
return;
this._showPage(this._showAppsButton.checked ?
this._appsPage : this._workspacesPage);
},
_resetShowAppsButton: function() {
this._showAppsBlocked = true;
this._showAppsButton.checked = false;
this._showAppsBlocked = false;
this._showPage(this._workspacesPage, true);
},
_onStageKeyPress: function(actor, event) {
// Ignore events while anything but the overview has
// pushed a modal (system modals, looking glass, ...)
@@ -515,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;
@@ -19,13 +20,6 @@ const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const MAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
const UNMAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
const MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
const SHOW_WINDOW_ANIMATION_TIME = 0.15;
const DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;
const DESTROY_WINDOW_ANIMATION_TIME = 0.15;
const DIALOG_DESTROY_WINDOW_ANIMATION_TIME = 0.1;
const WINDOW_ANIMATION_TIME = 0.25;
const DIM_BRIGHTNESS = -0.3;
const DIM_TIME = 0.500;
@@ -464,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',
@@ -801,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);
},
@@ -881,12 +766,12 @@ const WindowManager = new Lang.Class({
return !Main.overview.visible;
},
_shouldAnimateActor: function(actor, types) {
_shouldAnimateActor: function(actor) {
if (!this._shouldAnimate())
return false;
let type = actor.meta_window.get_window_type();
return types.indexOf(type) >= 0;
let windowType = actor.meta_window.get_window_type();
return windowType == Meta.WindowType.NORMAL ||
windowType == Meta.WindowType.MODAL_DIALOG;
},
_removeEffect : function(list, actor) {
@@ -899,10 +784,7 @@ const WindowManager = new Lang.Class({
},
_minimizeWindow : function(shellwm, actor) {
let types = [Meta.WindowType.NORMAL,
Meta.WindowType.MODAL_DIALOG,
Meta.WindowType.DIALOG];
if (!this._shouldAnimateActor(actor, types)) {
if (!this._shouldAnimateActor(actor)) {
shellwm.completed_minimize(actor);
return;
}
@@ -914,7 +796,7 @@ const WindowManager = new Lang.Class({
if (actor.meta_window.is_monitor_sized()) {
Tweener.addTween(actor,
{ opacity: 0,
time: MINIMIZE_WINDOW_ANIMATION_TIME,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._minimizeWindowDone,
onCompleteScope: this,
@@ -946,8 +828,8 @@ const WindowManager = new Lang.Class({
scale_y: yScale,
x: xDest,
y: yDest,
time: MINIMIZE_WINDOW_ANIMATION_TIME,
transition: 'easeInExpo',
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._minimizeWindowDone,
onCompleteScope: this,
onCompleteParams: [shellwm, actor],
@@ -963,7 +845,7 @@ const WindowManager = new Lang.Class({
Tweener.removeTweens(actor);
actor.set_scale(1.0, 1.0);
actor.set_opacity(255);
actor.set_pivot_point(0, 0);
actor.move_anchor_point_from_gravity(Clutter.Gravity.NORTH_WEST);
shellwm.completed_minimize(actor);
}
@@ -1061,10 +943,7 @@ const WindowManager = new Lang.Class({
actor._windowType = type;
}));
let types = [Meta.WindowType.NORMAL,
Meta.WindowType.DIALOG,
Meta.WindowType.MODAL_DIALOG];
if (!this._shouldAnimateActor(actor, types)) {
if (!this._shouldAnimateActor(actor)) {
shellwm.completed_map(actor);
return;
}
@@ -1072,23 +951,15 @@ const WindowManager = new Lang.Class({
if (actor.meta_window.is_attached_dialog()) {
/* Scale the window from the center of the parent */
this._checkDimming(actor.get_meta_window().get_transient_for());
}
switch (actor._windowType) {
case Meta.WindowType.NORMAL:
actor.set_pivot_point(0.5, 1.0);
actor.scale_x = 0.01;
actor.scale_y = 0.05;
actor.opacity = 0;
actor.set_scale(1.0, 0.0);
actor.set_pivot_point(0.5, 0.5);
actor.show();
this._mapping.push(actor);
Tweener.addTween(actor,
{ opacity: 255,
scale_x: 1,
scale_y: 1,
time: SHOW_WINDOW_ANIMATION_TIME,
transition: 'easeOutExpo',
{ scale_y: 1,
time: WINDOW_ANIMATION_TIME,
transition: "easeOutQuad",
onComplete: this._mapWindowDone,
onCompleteScope: this,
onCompleteParams: [shellwm, actor],
@@ -1096,20 +967,15 @@ const WindowManager = new Lang.Class({
onOverwriteScope: this,
onOverwriteParams: [shellwm, actor]
});
break;
case Meta.WindowType.MODAL_DIALOG:
case Meta.WindowType.DIALOG:
actor.set_pivot_point(0.5, 0.5);
actor.scale_y = 0;
} else {
/* Fade window in */
actor.opacity = 0;
actor.show();
this._mapping.push(actor);
Tweener.addTween(actor,
{ opacity: 255,
scale_x: 1,
scale_y: 1,
time: DIALOG_SHOW_WINDOW_ANIMATION_TIME,
time: WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._mapWindowDone,
onCompleteScope: this,
@@ -1118,10 +984,6 @@ const WindowManager = new Lang.Class({
onOverwriteScope: this,
onOverwriteParams: [shellwm, actor]
});
break;
default:
shellwm.completed_map(actor);
return;
}
},
@@ -1129,11 +991,7 @@ const WindowManager = new Lang.Class({
if (this._removeEffect(this._mapping, actor)) {
Tweener.removeTweens(actor);
actor.opacity = 255;
actor.set_pivot_point(0, 0);
actor.scale_y = 1;
actor.scale_x = 1;
actor.translation_y = 0;
actor.translation_x = 0;
shellwm.completed_map(actor);
}
},
@@ -1156,51 +1014,30 @@ const WindowManager = new Lang.Class({
});
}
let types = [Meta.WindowType.NORMAL,
Meta.WindowType.DIALOG,
Meta.WindowType.MODAL_DIALOG];
if (!this._shouldAnimateActor(actor, types)) {
if (!this._shouldAnimateActor(actor)) {
shellwm.completed_destroy(actor);
return;
}
switch (actor._windowType) {
case Meta.WindowType.NORMAL:
actor.set_pivot_point(0.5, 0.5);
this._destroying.push(actor);
this._destroying.push(actor);
Tweener.addTween(actor,
{ opacity: 0,
scale_x: 0.8,
scale_y: 0.8,
time: DESTROY_WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._destroyWindowDone,
onCompleteScope: this,
onCompleteParams: [shellwm, actor],
onOverwrite: this._destroyWindowDone,
onOverwriteScope: this,
onOverwriteParams: [shellwm, actor]
});
break;
case Meta.WindowType.MODAL_DIALOG:
case Meta.WindowType.DIALOG:
actor.set_pivot_point(0.5, 0.5);
this._destroying.push(actor);
if (window.is_attached_dialog()) {
let parent = window.get_transient_for();
this._checkDimming(parent, window);
if (window.is_attached_dialog()) {
let parent = window.get_transient_for();
this._checkDimming(parent, window);
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
Tweener.removeTweens(actor);
this._destroyWindowDone(shellwm, actor);
}));
}
actor.set_scale(1.0, 1.0);
actor.set_pivot_point(0.5, 0.5);
actor.show();
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
Tweener.removeTweens(actor);
this._destroyWindowDone(shellwm, actor);
}));
Tweener.addTween(actor,
{ scale_y: 0,
time: DIALOG_DESTROY_WINDOW_ANIMATION_TIME,
transition: 'easeOutQuad',
time: WINDOW_ANIMATION_TIME,
transition: "easeOutQuad",
onComplete: this._destroyWindowDone,
onCompleteScope: this,
onCompleteParams: [shellwm, actor],
@@ -1208,11 +1045,9 @@ const WindowManager = new Lang.Class({
onOverwriteScope: this,
onOverwriteParams: [shellwm, actor]
});
break;
default:
shellwm.completed_destroy(actor);
return;
}
shellwm.completed_destroy(actor);
},
_destroyWindowDone : function(shellwm, actor) {
@@ -1385,7 +1220,9 @@ const WindowManager = new Lang.Class({
let tabPopup = new AltTab.AppSwitcherPopup();
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
let modifiers = binding.get_modifiers();
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
tabPopup.destroy();
},
@@ -1396,12 +1233,16 @@ const WindowManager = new Lang.Class({
let tabPopup = new AltTab.WindowSwitcherPopup();
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
let modifiers = binding.get_modifiers();
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
tabPopup.destroy();
},
_startA11ySwitcher : function(display, screen, window, binding) {
Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
let modifiers = binding.get_modifiers();
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask());
},
_toggleAppMenu : function(display, screen, window, event, binding) {

View File

@@ -34,8 +34,6 @@ const DRAGGING_WINDOW_OPACITY = 100;
const LAYOUT_SCALE_WEIGHT = 1;
const LAYOUT_SPACE_WEIGHT = 0.1;
const WINDOW_ANIMATION_MAX_NUMBER_BLENDING = 3;
function _interpolate(start, end, step) {
return start + (end - start) * step;
}
@@ -89,7 +87,7 @@ const WindowCloneLayout = new Lang.Class({
},
vfunc_allocate: function(container, box, flags) {
container.get_children().forEach(Lang.bind(this, function (child) {
let clone = container.get_children().forEach(function (child) {
let realWindow;
if (child == container._delegate._windowClone)
realWindow = container._delegate.realWindow;
@@ -98,8 +96,8 @@ const WindowCloneLayout = new Lang.Class({
child.allocate(this._makeBoxForWindow(realWindow.meta_window),
flags);
}));
}
}, this);
},
});
const WindowClone = new Lang.Class({
@@ -1260,13 +1258,6 @@ const Workspace = new Lang.Class({
return;
}
// We will reposition windows anyway when enter again overview or when ending the windows
// animations whith fade animation.
// In this way we avoid unwanted animations of windows repositioning while
// animating overview.
if (this.leavingOverview || this._animatingWindowsFade)
return;
let initialPositioning = flags & WindowPositionFlags.INITIAL;
let animate = flags & WindowPositionFlags.ANIMATE;
@@ -1329,7 +1320,7 @@ const Workspace = new Lang.Class({
});
}
this._animateClone(clone, overlay, x, y, scale);
this._animateClone(clone, overlay, x, y, scale, initialPositioning);
} else {
// cancel any active tweens (otherwise they might override our changes)
Tweener.removeTweens(clone.actor);
@@ -1358,7 +1349,7 @@ const Workspace = new Lang.Class({
}
},
_animateClone: function(clone, overlay, x, y, scale) {
_animateClone: function(clone, overlay, x, y, scale, initialPositioning) {
Tweener.addTween(clone.actor,
{ x: x,
y: y,
@@ -1565,141 +1556,14 @@ const Workspace = new Lang.Class({
return false;
},
fadeToOverview: function() {
// We don't want to reposition windows while animating in this way.
this._animatingWindowsFade = true;
this._overviewShownId = Main.overview.connect('shown', Lang.bind(this,
this._doneShowingOverview));
if (this._windows.length == 0)
return;
if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
return;
// Special case maximized windows, since it doesn't make sense
// to animate windows below in the stack
let topMaximizedWindow;
// It is ok to treat the case where there is no maximized
// window as if the bottom-most window was maximized given that
// it won't affect the result of the animation
for (topMaximizedWindow = this._windows.length - 1; topMaximizedWindow > 0; topMaximizedWindow--) {
let metaWindow = this._windows[topMaximizedWindow].metaWindow;
if (metaWindow.maximized_horizontally && metaWindow.maximized_vertically)
break;
}
let nTimeSlots = Math.min(WINDOW_ANIMATION_MAX_NUMBER_BLENDING + 1, this._windows.length - topMaximizedWindow);
let windowBaseTime = Overview.ANIMATION_TIME / nTimeSlots;
let topIndex = this._windows.length - 1;
for (let i = 0; i < this._windows.length; i++) {
if (i < topMaximizedWindow) {
// below top-most maximized window, don't animate
let overlay = this._windowOverlays[i];
if (overlay)
overlay.hide();
this._windows[i].actor.opacity = 0;
} else {
let fromTop = topIndex - i;
let time;
if (fromTop < nTimeSlots) // animate top-most windows gradually
time = windowBaseTime * (nTimeSlots - fromTop);
else
time = windowBaseTime;
this._windows[i].actor.opacity = 255;
this._fadeWindow(i, time, 0);
}
}
},
fadeFromOverview: function() {
this.leavingOverview = true;
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
this._doneLeavingOverview));
if (this._windows.length == 0)
return;
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
Tweener.removeTweens(clone.actor);
}
if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId);
this._repositionWindowsId = 0;
}
if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
return;
// Special case maximized windows, since it doesn't make sense
// to animate windows below in the stack
let topMaximizedWindow;
// It is ok to treat the case where there is no maximized
// window as if the bottom-most window was maximized given that
// it won't affect the result of the animation
for (topMaximizedWindow = this._windows.length - 1; topMaximizedWindow > 0; topMaximizedWindow--) {
let metaWindow = this._windows[topMaximizedWindow].metaWindow;
if (metaWindow.maximized_horizontally && metaWindow.maximized_vertically)
break;
}
let nTimeSlots = Math.min(WINDOW_ANIMATION_MAX_NUMBER_BLENDING + 1, this._windows.length - topMaximizedWindow);
let windowBaseTime = Overview.ANIMATION_TIME / nTimeSlots;
let topIndex = this._windows.length - 1;
for (let i = 0; i < this._windows.length; i++) {
if (i < topMaximizedWindow) {
// below top-most maximized window, don't animate
let overlay = this._windowOverlays[i];
if (overlay)
overlay.hide();
this._windows[i].actor.opacity = 0;
} else {
let fromTop = topIndex - i;
let time;
if (fromTop < nTimeSlots) // animate top-most windows gradually
time = windowBaseTime * (fromTop + 1);
else
time = windowBaseTime * nTimeSlots;
this._windows[i].actor.opacity = 0;
this._fadeWindow(i, time, 255);
}
}
},
_fadeWindow: function(index, time, opacity) {
let clone = this._windows[index];
let overlay = this._windowOverlays[index];
if (overlay)
overlay.hide();
if (clone.metaWindow.showing_on_its_workspace()) {
let [origX, origY] = clone.getOriginalPosition();
clone.actor.scale_x = 1;
clone.actor.scale_y = 1;
clone.actor.x = origX;
clone.actor.y = origY;
Tweener.addTween(clone.actor,
{ time: time,
opacity: opacity,
transition: 'easeOutQuad'
});
} else {
// The window is hidden
clone.actor.opacity = 0;
}
},
zoomToOverview: function() {
// Animate the full-screen to Overview transition.
zoomToOverview : function() {
// Position and scale the windows.
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
},
zoomFromOverview: function() {
// Animates the return from Overview mode
zoomFromOverview : function() {
let currentWorkspace = global.screen.get_active_workspace();
this.leavingOverview = true;
@@ -1720,37 +1584,35 @@ const Workspace = new Lang.Class({
return;
// Position and scale the windows.
for (let i = 0; i < this._windows.length; i++)
this._zoomWindowFromOverview(i);
},
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
let overlay = this._windowOverlays[i];
_zoomWindowFromOverview: function(index) {
let clone = this._windows[index];
let overlay = this._windowOverlays[index];
if (overlay)
overlay.hide();
if (overlay)
overlay.hide();
if (clone.metaWindow.showing_on_its_workspace()) {
let [origX, origY] = clone.getOriginalPosition();
if (clone.metaWindow.showing_on_its_workspace()) {
let [origX, origY] = clone.getOriginalPosition();
Tweener.addTween(clone.actor,
{ x: origX,
y: origY,
scale_x: 1.0,
scale_y: 1.0,
time: Overview.ANIMATION_TIME,
opacity: 255,
transition: 'easeOutQuad'
});
} else {
// The window is hidden, make it shrink and fade it out
Tweener.addTween(clone.actor,
{ scale_x: 0,
scale_y: 0,
opacity: 0,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad'
});
Tweener.addTween(clone.actor,
{ x: origX,
y: origY,
scale_x: 1.0,
scale_y: 1.0,
time: Overview.ANIMATION_TIME,
opacity: 255,
transition: 'easeOutQuad'
});
} else {
// The window is hidden, make it shrink and fade it out
Tweener.addTween(clone.actor,
{ scale_x: 0,
scale_y: 0,
opacity: 0,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad'
});
}
}
},
@@ -1789,11 +1651,6 @@ const Workspace = new Lang.Class({
this.leavingOverview = false;
},
_doneShowingOverview: function() {
this._animatingWindowsFade = false;
this._recalculateWindowPositions(WindowPositionFlags.INITIAL);
},
// Tests if @actor belongs to this workspaces and monitor
_isMyWindow : function (actor) {
let win = actor.meta_window;

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);

View File

@@ -878,6 +878,9 @@ const ThumbnailsBox = new Lang.Class({
for (let key in ThumbnailState)
this._stateCounts[ThumbnailState[key]] = 0;
// The "porthole" is the portion of the screen that we show in the workspaces
this._porthole = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
this.addThumbnails(0, global.screen.n_workspaces);
this._updateSwitcherVisibility();
@@ -901,7 +904,6 @@ const ThumbnailsBox = new Lang.Class({
for (let w = 0; w < this._thumbnails.length; w++)
this._thumbnails[w].destroy();
this._thumbnails = [];
this._porthole = null;
},
_workspacesChanged: function() {
@@ -932,7 +934,6 @@ const ThumbnailsBox = new Lang.Class({
},
addThumbnails: function(start, count) {
this._ensurePorthole();
for (let k = start; k < start + count; k++) {
let metaWorkspace = global.screen.get_workspace_by_index(k);
let thumbnail = new WorkspaceThumbnail(metaWorkspace);
@@ -1120,7 +1121,9 @@ const ThumbnailsBox = new Lang.Class({
// the size request to our children because we know how big they are and know
// that the actors aren't depending on the virtual functions being called.
this._ensurePorthole();
if (this._thumbnails.length == 0)
return;
let themeNode = this.actor.get_theme_node();
let spacing = themeNode.get_length('spacing');
@@ -1132,7 +1135,8 @@ const ThumbnailsBox = new Lang.Class({
},
_getPreferredWidth: function(actor, forHeight, alloc) {
this._ensurePorthole();
if (this._thumbnails.length == 0)
return;
let themeNode = this.actor.get_theme_node();
@@ -1150,13 +1154,6 @@ const ThumbnailsBox = new Lang.Class({
alloc.natural_size = width;
},
// The "porthole" is the portion of the screen that we show in the
// workspaces
_ensurePorthole: function() {
if (!this._porthole)
this._porthole = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
},
_allocate: function(actor, box, flags) {
let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL);

View File

@@ -21,11 +21,6 @@ const WORKSPACE_SWITCH_TIME = 0.25;
// Note that mutter has a compile-time limit of 36
const MAX_WORKSPACES = 16;
const AnimationType = {
ZOOM: 0,
FADE: 1
};
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
const WorkspacesViewBase = new Lang.Class({
@@ -147,25 +142,17 @@ const WorkspacesView = new Lang.Class({
return this._workspaces[active];
},
animateToOverview: function(animationType) {
for (let w = 0; w < this._workspaces.length; w++) {
if (animationType == AnimationType.ZOOM)
this._workspaces[w].zoomToOverview();
else
this._workspaces[w].fadeToOverview();
}
zoomToOverview: function() {
for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomToOverview();
this._updateWorkspaceActors(false);
},
animateFromOverview: function(animationType) {
zoomFromOverview: function() {
this.actor.remove_clip();
for (let w = 0; w < this._workspaces.length; w++) {
if (animationType == AnimationType.ZOOM)
this._workspaces[w].zoomFromOverview();
else
this._workspaces[w].fadeFromOverview();
}
for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomFromOverview();
},
syncStacking: function(stackIndices) {
@@ -378,18 +365,12 @@ const ExtraWorkspaceView = new Lang.Class({
this._workspace.setActualGeometry(this._actualGeometry);
},
animateToOverview: function(animationType) {
if (animationType == AnimationType.ZOOM)
this._workspace.zoomToOverview();
else
this._workspace.fadeToOverview();
zoomToOverview: function() {
this._workspace.zoomToOverview();
},
animateFromOverview: function(animationType) {
if (animationType == AnimationType.ZOOM)
this._workspace.zoomFromOverview();
else
this._workspace.fadeFromOverview();
zoomFromOverview: function() {
this._workspace.zoomFromOverview();
},
syncStacking: function(stackIndices) {
@@ -481,16 +462,10 @@ const WorkspacesDisplay = new Lang.Class({
return this._getPrimaryView().actor.navigate_focus(from, direction, false);
},
show: function(fadeOnPrimary) {
show: function() {
this._updateWorkspacesViews();
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
animationType = AnimationType.FADE;
else
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateToOverview(animationType);
}
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].zoomToOverview();
this._restackedNotifyId =
Main.overview.connect('windows-restacked',
@@ -499,15 +474,9 @@ const WorkspacesDisplay = new Lang.Class({
this._scrollEventId = Main.overview.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
},
animateFromOverview: function(fadeOnPrimary) {
for (let i = 0; i < this._workspacesViews.length; i++) {
let animationType;
if (fadeOnPrimary && i == this._primaryIndex)
animationType = AnimationType.FADE;
else
animationType = AnimationType.ZOOM;
this._workspacesViews[i].animateFromOverview(animationType);
}
zoomFromOverview: function() {
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].zoomFromOverview();
},
hide: function() {

1091
po/as.po

File diff suppressed because it is too large Load Diff

653
po/de.po

File diff suppressed because it is too large Load Diff

871
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"

796
po/eu.po

File diff suppressed because it is too large Load Diff

858
po/fur.po

File diff suppressed because it is too large Load Diff

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

218
po/lt.po
View File

@@ -11,8 +11,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-25 19:35+0000\n"
"PO-Revision-Date: 2014-07-25 22:53+0300\n"
"POT-Creation-Date: 2014-06-22 07:30+0000\n"
"PO-Revision-Date: 2014-06-22 15:56+0300\n"
"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
"Language: lt\n"
@@ -316,23 +316,19 @@ msgstr "Darbalaukiai tik pagrindiniame monitoriuje"
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Atidėti fokuso pakeitimus pelei iki žymiklis nustos judėti"
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Captive Portal"
msgstr "Pagavimo portalas"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:125
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Kilo klaida įkeliant %s nustatymų dialogą:"
#: ../js/extensionPrefs/main.js:159
#: ../js/extensionPrefs/main.js:157
msgid "GNOME Shell Extensions"
msgstr "GNOME Shell plėtiniai"
#: ../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 "Atsisakyti"
@@ -363,8 +359,8 @@ msgstr "Nėra sąraše?"
msgid "(e.g., user or %s)"
msgstr "(pvz., naudotojas arba %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 "Naudotojo vardas: "
@@ -393,11 +389,6 @@ msgstr "Nepavyko perskaityti komandos:"
msgid "Execution of “%s” failed:"
msgstr "Nepavyko įvykdyti „%s“:"
#: ../js/portalHelper/main.js:84
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "Reikia patvirtinti tapatybę internete"
#: ../js/ui/appDisplay.js:641
msgid "Frequently used applications will appear here"
msgstr "Čia bus matomos dažnai naudojamos programos"
@@ -410,33 +401,33 @@ msgstr "Dažnai naudojamos"
msgid "All"
msgstr "Visos"
#: ../js/ui/appDisplay.js:1631
#: ../js/ui/appDisplay.js:1569
msgid "New Window"
msgstr "Naujas langas"
#: ../js/ui/appDisplay.js:1653 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1591 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Pašalinti iš mėgstamų"
#: ../js/ui/appDisplay.js:1659
#: ../js/ui/appDisplay.js:1597
msgid "Add to Favorites"
msgstr "Pridėti prie mėgstamų"
#: ../js/ui/appDisplay.js:1668
#: ../js/ui/appDisplay.js:1606
msgid "Show Details"
msgstr "Rodyti detalią informaciją"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:87
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s pridėta prie jūsų mėgstamų."
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:121
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s pašalinta iš jūsų mėgstamų."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:814
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Nustatymai"
@@ -570,35 +561,35 @@ msgid "Next month"
msgstr "Kitas mėnuo"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:785
#: ../js/ui/calendar.js:775
msgid "Nothing Scheduled"
msgstr "Nieko nesuplanuota"
#. 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, %B %d d."
#. 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, %Y m. %B %d d."
#: ../js/ui/calendar.js:817
#: ../js/ui/calendar.js:807
msgid "Today"
msgstr "Šiandien"
#: ../js/ui/calendar.js:821
#: ../js/ui/calendar.js:811
msgid "Tomorrow"
msgstr "Rytoj"
#: ../js/ui/calendar.js:832
#: ../js/ui/calendar.js:822
msgid "This week"
msgstr "Šią savaitę"
#: ../js/ui/calendar.js:840
#: ../js/ui/calendar.js:830
msgid "Next week"
msgstr "Kitą savaitę"
@@ -631,40 +622,40 @@ msgstr "Slaptažodis:"
msgid "Type again:"
msgstr "Įveskite dar kartą:"
#: ../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 "Prisijungti"
#: ../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 "Slaptažodis: "
#: ../js/ui/components/networkAgent.js:235
#: ../js/ui/components/networkAgent.js:229
msgid "Key: "
msgstr "Raktas: "
#: ../js/ui/components/networkAgent.js:274
#: ../js/ui/components/networkAgent.js:268
msgid "Identity: "
msgstr "Tapatybė: "
#: ../js/ui/components/networkAgent.js:276
#: ../js/ui/components/networkAgent.js:270
msgid "Private key password: "
msgstr "Privataus rakto slaptažodis: "
#: ../js/ui/components/networkAgent.js:288
#: ../js/ui/components/networkAgent.js:282
msgid "Service: "
msgstr "Tarnyba: "
#: ../js/ui/components/networkAgent.js:317
#: ../js/ui/components/networkAgent.js:311
msgid "Authentication required by wireless network"
msgstr "Belaidžiam tinklui reikia patvirtinti tapatybę"
#: ../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 "
@@ -673,35 +664,35 @@ msgstr ""
"Slaptažodžiai arba šifravimo raktai yra būtini priėjimui prie belaidžio "
"tinklo „%s“."
#: ../js/ui/components/networkAgent.js:322
#: ../js/ui/components/networkAgent.js:316
msgid "Wired 802.1X authentication"
msgstr "Laidinis 802.1X tapatybės patvirtinimas"
#: ../js/ui/components/networkAgent.js:324
#: ../js/ui/components/networkAgent.js:318
msgid "Network name: "
msgstr "Tinklo vardas: "
#: ../js/ui/components/networkAgent.js:329
#: ../js/ui/components/networkAgent.js:323
msgid "DSL authentication"
msgstr "DSL tapatybės patvirtinimas"
#: ../js/ui/components/networkAgent.js:336
#: ../js/ui/components/networkAgent.js:330
msgid "PIN code required"
msgstr "Reikalingas PIN kodas"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:331
msgid "PIN code is needed for the mobile broadband device"
msgstr "Reikalingas PIN kodas mobiliajam plačiajuosčiam įrenginiui"
#: ../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 "Mobiliojo plačiajuosčio tinklo slaptažodis"
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:339
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Būtinas slaptažodis norint prisijungti prie „%s“."
@@ -999,7 +990,7 @@ msgstr "Rodyti paskyrą"
msgid "Unknown reason"
msgstr "Nežinoma priežastis"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
msgid "Windows"
msgstr "Langai"
@@ -1175,7 +1166,7 @@ msgstr "Įdiegti"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Parsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:339
msgid "Keyboard"
msgstr "Klaviatūra"
@@ -1207,7 +1198,7 @@ msgstr "Įjungta"
#. 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 "Išjungta"
@@ -1267,7 +1258,7 @@ msgstr "Pranešimų juosta"
msgid "System Information"
msgstr "Sistemos informacija"
#: ../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 "Nežinoma"
@@ -1296,37 +1287,32 @@ msgstr "Apžvalga"
msgid "Type to search…"
msgstr "Rašykite, ko ieškote…"
#: ../js/ui/panel.js:515
#: ../js/ui/panel.js:516
msgid "Quit"
msgstr "Užverti"
#. 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 "Apžvalga"
#: ../js/ui/panel.js:919
#: ../js/ui/panel.js:915
msgid "Top Bar"
msgstr "Viršutinė juosta"
#: ../js/ui/popupMenu.js:283
#: ../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 "Įveskite komandą"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:120
msgid "Close"
msgstr "Užverti"
#: ../js/ui/runDialog.js:273
#| msgid "Estimating…"
msgid "Restarting…"
msgstr "Perleidžiama…"
#. Translators: This is a time format for a date in
#. long format */
#: ../js/ui/screenShield.js:88
@@ -1357,11 +1343,11 @@ msgstr "Nepavyksta užrakinti"
msgid "Lock was blocked by an application"
msgstr "Programa užblokavo užrakinimą"
#: ../js/ui/search.js:614
#: ../js/ui/search.js:606
msgid "Searching…"
msgstr "Ieškoma…"
#: ../js/ui/search.js:660
#: ../js/ui/search.js:652
msgid "No results."
msgstr "Nerasta atitikmenų."
@@ -1437,9 +1423,9 @@ msgstr "Didelis tekstas"
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 "Išjungti"
@@ -1456,7 +1442,7 @@ msgstr[0] "%d prijungtas įrenginys"
msgstr[1] "%d prijungti įrenginiai"
msgstr[2] "%d prijungtų įrenginių"
#: ../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 "Atsijungta"
@@ -1484,156 +1470,156 @@ msgstr "Įjungti"
msgid "In Use"
msgstr "Naudojama"
#: ../js/ui/status/network.js:101
#: ../js/ui/status/network.js:74
msgid "<unknown>"
msgstr "<nežinoma>"
#: ../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 "Išjungta"
#: ../js/ui/status/network.js:459
#: ../js/ui/status/network.js:422
msgid "Connected"
msgstr "Prisijungta"
#. 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 "Nevaldomas"
#: ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:428
msgid "Disconnecting"
msgstr "Atsijungiama"
#: ../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 "Jungiamasi"
#. 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 "Reikia patvirtinti tapatybę"
#. 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 "Trūksta integruotos programinės įrangos (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 "Nepasiekiamas"
#: ../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 "Nepavyko prisijungti"
#: ../js/ui/status/network.js:504
#: ../js/ui/status/network.js:467
msgid "Wired Settings"
msgstr "Laidinio ryšio nustatymai"
#: ../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 "Mobiliojo plačiajuosčio tinklo nustatymai"
#: ../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 "Aparatinė įranga išjungta"
#: ../js/ui/status/network.js:632
#: ../js/ui/status/network.js:595
msgid "Use as Internet connection"
msgstr "Naudoti kaip interneto ryšį"
#: ../js/ui/status/network.js:813
#: ../js/ui/status/network.js:776
msgid "Airplane Mode is On"
msgstr "Skrydžio veiksena įjungta"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:777
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Belaidis ryšys yra išjungta skrydžio veiksenoje."
#: ../js/ui/status/network.js:815
#: ../js/ui/status/network.js:778
msgid "Turn Off Airplane Mode"
msgstr "Išjungti skrydžio veikseną"
#: ../js/ui/status/network.js:824
#: ../js/ui/status/network.js:787
msgid "Wi-Fi is Off"
msgstr "Belaidžio ryšys išjungtas"
#: ../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 "Norint prisijungti prie tinklo reikia įjungti belaidį ryšį."
#: ../js/ui/status/network.js:826
#: ../js/ui/status/network.js:789
msgid "Turn On Wi-Fi"
msgstr "Įjungti belaidį ryšį"
#: ../js/ui/status/network.js:851
#: ../js/ui/status/network.js:814
msgid "Wi-Fi Networks"
msgstr "Wi-Fi tinklai"
#: ../js/ui/status/network.js:853
#: ../js/ui/status/network.js:816
msgid "Select a network"
msgstr "Pasirinkite tinklą"
#: ../js/ui/status/network.js:882
#: ../js/ui/status/network.js:845
msgid "No Networks"
msgstr "Nėra tinklų"
#: ../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 "Išjungimui naudoti aparatinį jungiklį"
#: ../js/ui/status/network.js:1173
#: ../js/ui/status/network.js:1136
msgid "Select Network"
msgstr "Pasirinkite tinklą"
#: ../js/ui/status/network.js:1179
#: ../js/ui/status/network.js:1142
msgid "Wi-Fi Settings"
msgstr "Belaidžio ryšio nustatymai"
#: ../js/ui/status/network.js:1281
#: ../js/ui/status/network.js:1234
msgid "Turn On"
msgstr "Įjungti"
#: ../js/ui/status/network.js:1298
#: ../js/ui/status/network.js:1251
msgid "Hotspot Active"
msgstr "Prieigos taškas aktyvus"
#: ../js/ui/status/network.js:1409
#: ../js/ui/status/network.js:1362
msgid "connecting..."
msgstr "jungiamasi..."
#. 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 "reikia patvirtinti tapatybę"
#: ../js/ui/status/network.js:1414
#: ../js/ui/status/network.js:1367
msgid "connection failed"
msgstr "nepavyko prisijungti"
#: ../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 "Tinklo nustatymai"
#: ../js/ui/status/network.js:1482
#: ../js/ui/status/network.js:1435
msgid "VPN Settings"
msgstr "VPN nustatymai"
#: ../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 "Tinklo valdymas"
#: ../js/ui/status/network.js:1696
#: ../js/ui/status/network.js:1647
msgid "Activation of network connection failed"
msgstr "Tinklo ryšio nepavyko aktyvuoti"
@@ -1715,11 +1701,11 @@ msgstr "Prisijungti kitu naudotoju"
msgid "Unlock Window"
msgstr "Atrakinimo langas"
#: ../js/ui/viewSelector.js:233
#: ../js/ui/viewSelector.js:100
msgid "Applications"
msgstr "Programos"
#: ../js/ui/viewSelector.js:237
#: ../js/ui/viewSelector.js:104
msgid "Search"
msgstr "Ieškoti"
@@ -1728,22 +1714,22 @@ msgstr "Ieškoti"
msgid "“%s” is ready"
msgstr "„%s“ yra pasirengusi"
#: ../js/ui/windowManager.js:58
#: ../js/ui/windowManager.js:57
msgid "Do you want to keep these display settings?"
msgstr "Ar nori įrašyti šiuos vaizduoklio nustatymus?"
#. 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 "Grąžinti nustatymus"
#: ../js/ui/windowManager.js:81
#: ../js/ui/windowManager.js:80
msgid "Keep Changes"
msgstr "Įrašyti pakeitimus"
#: ../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"

540
po/nb.po

File diff suppressed because it is too large Load Diff

994
po/nl.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"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,6 @@ st_cflags = \
-DLIBDIR=\""$(libdir)"\" \
-DG_LOG_DOMAIN=\"St\" \
-DST_COMPILATION \
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
-DCOGL_ENABLE_EXPERIMENTAL_API \
-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
$(ST_CFLAGS) \
$(NULL)

View File

@@ -61,8 +61,6 @@ include Makefile-hotplug-sniffer.am
gnome_shell_cflags = \
$(GNOME_SHELL_CFLAGS) \
-I$(srcdir)/tray \
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
-DCOGL_ENABLE_EXPERIMENTAL_API \
-DVERSION=\"$(VERSION)\" \
-DLOCALEDIR=\"$(datadir)/locale\" \
-DDATADIR=\"$(datadir)\" \
@@ -259,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,16 +75,11 @@ 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
# A fixed background image
env['SHELL_BACKGROUND_IMAGE'] = '@pkgdatadir@/perf-background.xml'
self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
args = []
args.append(os.path.join(self_dir, 'gnome-shell'))
@@ -107,6 +102,8 @@ def run_shell(perf_output=None):
def restore_shell():
pid = os.fork()
if (pid == 0):
if "MUTTER_WM_CLASS_FILTER" in os.environ:
del os.environ["MUTTER_WM_CLASS_FILTER"]
os.execlp("gnome-shell", "gnome-shell", "--replace")
else:
sys.exit(0)
@@ -192,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:
@@ -297,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 '------------------------------------------------------------';
@@ -319,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)
@@ -329,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")
@@ -341,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

@@ -26,6 +26,8 @@
#include <stdlib.h>
#include <string.h>
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#define COGL_ENABLE_EXPERIMENTAL_API
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <gjs/gjs.h>
@@ -172,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;
@@ -180,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");
@@ -385,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

@@ -242,8 +242,6 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
void *datap,
GError **error)
{
ClutterBackend *backend = clutter_get_default_backend ();
CoglContext *ctx = clutter_backend_get_cogl_context (backend);
CreateFadedIconData *data = datap;
ShellApp *app;
GdkPixbuf *pixbuf;
@@ -335,11 +333,13 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
}
}
texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, width, height,
have_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
rowstride,
pixels,
NULL));
texture = cogl_texture_new_from_data (width,
height,
COGL_TEXTURE_NONE,
have_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
COGL_PIXEL_FORMAT_ANY,
rowstride,
pixels);
g_free (pixels);
g_object_unref (pixbuf);
@@ -705,72 +705,6 @@ shell_app_open_new_window (ShellApp *app,
shell_app_launch (app, 0, workspace, NULL);
}
/**
* shell_app_can_open_new_window:
* @app: a #ShellApp
*
* Returns %TRUE if the app supports opening a new window through
* shell_app_open_new_window() (ie, if calling that function will
* result in actually opening a new window and not something else,
* like presenting the most recently active one)
*/
gboolean
shell_app_can_open_new_window (ShellApp *app)
{
ShellAppRunningState *state;
/* Apps that are not running can always open new windows, because
activating them would open the first one */
if (!app->running_state)
return TRUE;
state = app->running_state;
/* If the app has an explicit new-window action, then it can
(or it should be able to - we don't actually call the action
because we need to trigger startup notification, so it still
depends on what the app decides to do for Activate vs ActivateAction)
*/
if (g_action_group_has_action (G_ACTION_GROUP (state->muxer), "app.new-window"))
return TRUE;
/* If the app doesn't have a desktop file, then nothing is possible */
if (!app->info)
return FALSE;
/* If the app is explicitly telling us, then we know for sure */
if (g_desktop_app_info_has_key (G_DESKTOP_APP_INFO (app->info),
"X-GNOME-SingleWindow"))
return !g_desktop_app_info_get_boolean (G_DESKTOP_APP_INFO (app->info),
"X-GNOME-SingleWindow");
/* If this is a unique GtkApplication, and we don't have a new-window, then
probably we can't
We don't consider non-unique GtkApplications here to handle cases like
evince, which don't export a new-window action because each window is in
a different process. In any case, in a non-unique GtkApplication each
Activate() knows nothing about the other instances, so it will show a
new window.
*/
if (state->remote_menu)
{
const char *application_id;
application_id = meta_window_get_gtk_application_id (state->windows->data);
if (application_id != NULL)
return FALSE;
else
return TRUE;
}
/* In all other cases, we don't have a reliable source of information
or a decent heuristic, so we err on the compatibility side and say
yes.
*/
return TRUE;
}
/**
* shell_app_get_state:
* @app: a #ShellApp

View File

@@ -56,7 +56,6 @@ void shell_app_activate_full (ShellApp *app,
void shell_app_open_new_window (ShellApp *app,
int workspace);
gboolean shell_app_can_open_new_window (ShellApp *app);
ShellAppState shell_app_get_state (ShellApp *app);

View File

@@ -46,6 +46,8 @@
static ShellGlobal *the_object = NULL;
static void grab_notify (GtkWidget *widget, gboolean is_grab, gpointer user_data);
struct _ShellGlobal {
GObject parent;
@@ -61,6 +63,15 @@ struct _ShellGlobal {
char *session_mode;
/* We use this window to get a notification from GTK+ when
* a widget in our process does a GTK+ grab. See
* http://bugzilla.gnome.org/show_bug.cgi?id=570641
*
* This window is never mapped or shown.
*/
GtkWindow *grab_notifier;
gboolean gtk_grab_active;
XserverRegion input_region;
GjsContext *js_context;
@@ -85,8 +96,6 @@ struct _ShellGlobal {
guint32 xdnd_timestamp;
gboolean has_modal;
gboolean frame_timestamps;
gboolean frame_finish_timestamp;
};
enum {
@@ -107,8 +116,6 @@ enum {
PROP_IMAGEDIR,
PROP_USERDATADIR,
PROP_FOCUS_MANAGER,
PROP_FRAME_TIMESTAMPS,
PROP_FRAME_FINISH_TIMESTAMP,
};
/* Signals */
@@ -139,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;
@@ -216,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;
@@ -274,6 +269,10 @@ shell_global_init (ShellGlobal *global)
global->runtime_state_path = g_file_new_for_path (path);
global->settings = g_settings_new ("org.gnome.shell");
global->grab_notifier = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
global->gtk_grab_active = FALSE;
global->sound_context = ca_gtk_context_get ();
ca_context_change_props (global->sound_context,
@@ -333,6 +332,7 @@ shell_global_finalize (GObject *object)
ShellGlobal *global = SHELL_GLOBAL (object);
g_object_unref (global->js_context);
gtk_widget_destroy (GTK_WIDGET (global->grab_notifier));
g_object_unref (global->settings);
the_object = NULL;
@@ -500,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));
}
/*
@@ -638,7 +624,9 @@ sync_input_region (ShellGlobal *global)
{
MetaScreen *screen = global->meta_screen;
if (global->has_modal)
if (global->gtk_grab_active)
meta_empty_stage_input_region (screen);
else if (global->has_modal)
meta_set_stage_input_region (screen, None);
else
meta_set_stage_input_region (screen, global->input_region);
@@ -768,72 +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);
cogl_flush ();
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;
}
@@ -851,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);
@@ -1018,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",
@@ -1318,6 +1240,17 @@ shell_global_notify_error (ShellGlobal *global,
g_signal_emit_by_name (global, "notify-error", msg, details);
}
static void
grab_notify (GtkWidget *widget, gboolean was_grabbed, gpointer user_data)
{
ShellGlobal *global = SHELL_GLOBAL (user_data);
global->gtk_grab_active = !was_grabbed;
/* Update for the new setting of gtk_grab_active */
sync_input_region (global);
}
/**
* shell_global_init_xdnd:
* @global: the #ShellGlobal

View File

@@ -13,6 +13,9 @@
#include "config.h"
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#define COGL_ENABLE_EXPERIMENTAL_API
#include <cogl/cogl.h>
#include "shell-glsl-quad.h"

View File

@@ -35,6 +35,8 @@
#define SHELL_IS_INVERT_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_INVERT_LIGHTNESS_EFFECT))
#define SHELL_INVERT_LIGHTNESS_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_INVERT_LIGHTNESS_EFFEC, ShellInvertLightnessEffectClass))
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#include "shell-invert-lightness-effect.h"
#include <cogl/cogl.h>

View File

@@ -21,6 +21,7 @@
#ifndef __SHELL_INVERT_LIGHTNESS_EFFECT_H__
#define __SHELL_INVERT_LIGHTNESS_EFFECT_H__
#define COGL_ENABLE_EXPERIMENTAL_API
#include <clutter/clutter.h>
G_BEGIN_DECLS

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

@@ -21,6 +21,13 @@
#include "shell-recorder-src.h"
#include "shell-recorder.h"
#include <clutter/x11/clutter-x11.h>
#include <X11/extensions/XInput.h>
#include <X11/extensions/XInput2.h>
/* This is also hard-coded in mutter and GDK */
#define VIRTUAL_CORE_POINTER_ID 2
#define A11Y_APPS_SCHEMA "org.gnome.desktop.a11y.applications"
#define MAGNIFIER_ACTIVE_KEY "screen-magnifier-enabled"
@@ -56,6 +63,7 @@ struct _ShellRecorder {
GdkScreen *gdk_screen;
gboolean have_pointer;
int pointer_x;
int pointer_y;
@@ -551,18 +559,156 @@ on_cursor_changed (MetaCursorTracker *tracker,
recorder_queue_redraw (recorder);
}
/* We use an event filter on the stage to get the XFixesCursorNotifyEvent
* and also to track cursor position (when the cursor is over the stage's
* input area); tracking cursor position here rather than with ClutterEvent
* allows us to avoid worrying about event propagation and competing
* signal handlers.
*/
static ClutterX11FilterReturn
recorder_event_filter (XEvent *xev,
ClutterEvent *cev,
gpointer data)
{
ShellRecorder *recorder = data;
XIEvent *input_event = NULL;
if (xev->xany.window != clutter_x11_get_stage_window (recorder->stage))
return CLUTTER_X11_FILTER_CONTINUE;
if (xev->xany.type == GenericEvent &&
xev->xcookie.extension == recorder->xinput_opcode)
input_event = (XIEvent *) xev->xcookie.data;
if (input_event != NULL &&
input_event->evtype == XI_Motion)
{
XIDeviceEvent *device_event = (XIDeviceEvent *) input_event;
if (device_event->deviceid == VIRTUAL_CORE_POINTER_ID)
{
recorder->pointer_x = device_event->event_x;
recorder->pointer_y = device_event->event_y;
recorder_queue_redraw (recorder);
}
}
/* We want to track whether the pointer is over the stage
* window itself, and not in a child window. A "virtual"
* crossing is one that goes directly from ancestor to child.
*/
else if (input_event != NULL &&
input_event->evtype == XI_Enter)
{
XIEnterEvent *enter_event = (XIEnterEvent *) input_event;
if (enter_event->deviceid == VIRTUAL_CORE_POINTER_ID &&
(enter_event->detail != XINotifyVirtual &&
enter_event->detail != XINotifyNonlinearVirtual))
{
recorder->have_pointer = TRUE;
recorder->pointer_x = enter_event->event_x;
recorder->pointer_y = enter_event->event_y;
recorder_queue_redraw (recorder);
}
}
else if (input_event != NULL &&
input_event->evtype == XI_Leave)
{
XILeaveEvent *leave_event = (XILeaveEvent *) input_event;
if (leave_event->deviceid == VIRTUAL_CORE_POINTER_ID &&
(leave_event->detail != XINotifyVirtual &&
leave_event->detail != XINotifyNonlinearVirtual))
{
recorder->have_pointer = FALSE;
recorder->pointer_x = leave_event->event_x;
recorder->pointer_y = leave_event->event_y;
recorder_queue_redraw (recorder);
}
}
return CLUTTER_X11_FILTER_CONTINUE;
}
/* We optimize out querying the server for the pointer position if the
* pointer is in the input area of the ClutterStage. We track changes to
* that with Enter/Leave events, but we need to 100% accurate about the
* initial condition, which is a little involved.
*/
static void
recorder_get_initial_cursor_position (ShellRecorder *recorder)
{
Display *xdisplay = clutter_x11_get_default_display ();
Window xwindow = clutter_x11_get_stage_window (recorder->stage);
XWindowAttributes xwa;
Window root, child, parent;
Window *children;
guint n_children;
int root_x,root_y;
int window_x, window_y;
guint mask;
XGrabServer(xdisplay);
XGetWindowAttributes (xdisplay, xwindow, &xwa);
XQueryTree (xdisplay, xwindow, &root, &parent, &children, &n_children);
XFree (children);
if (xwa.map_state == IsViewable &&
XQueryPointer (xdisplay, parent,
&root, &child, &root_x, &root_y, &window_x, &window_y, &mask) &&
child == xwindow)
{
/* The point of this call is not actually to translate the coordinates -
* we could do that ourselves using xwa.{x,y} - but rather to see if
* the pointer is in a child of the window, which we count as "not in
* window", because we aren't guaranteed to get pointer events.
*/
XTranslateCoordinates(xdisplay, parent, xwindow,
window_x, window_y,
&window_x, &window_y, &child);
if (child == None)
{
recorder->have_pointer = TRUE;
recorder->pointer_x = window_x;
recorder->pointer_y = window_y;
}
}
else
recorder->have_pointer = FALSE;
XUngrabServer(xdisplay);
XFlush(xdisplay);
}
/* When the cursor is not over the stage's input area, we query for the
* pointer position in a timeout.
*/
static void
recorder_update_pointer (ShellRecorder *recorder)
{
int pointer_x, pointer_y;
Display *xdisplay = clutter_x11_get_default_display ();
Window xwindow = clutter_x11_get_stage_window (recorder->stage);
Window root, child;
int root_x,root_y;
int window_x, window_y;
guint mask;
meta_cursor_tracker_get_pointer (recorder->cursor_tracker, &pointer_x, &pointer_y, NULL);
if (recorder->have_pointer)
return;
if (pointer_x != recorder->pointer_x || pointer_y != recorder->pointer_y)
if (XQueryPointer (xdisplay, xwindow,
&root, &child, &root_x, &root_y, &window_x, &window_y, &mask))
{
recorder->pointer_x = pointer_x;
recorder->pointer_y = pointer_y;
recorder_queue_redraw (recorder);
if (window_x != recorder->pointer_x || window_y != recorder->pointer_y)
{
recorder->pointer_x = window_x;
recorder->pointer_y = window_y;
recorder_queue_redraw (recorder);
}
}
}
@@ -605,8 +751,10 @@ 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);
}
static void
@@ -622,6 +770,8 @@ recorder_disconnect_stage_callbacks (ShellRecorder *recorder)
(void *)recorder_on_stage_notify_size,
recorder);
clutter_x11_remove_filter (recorder_event_filter, recorder);
/* We don't don't deselect for cursor changes in case someone else just
* happened to be selecting for cursor events on the same window; sending
* us the events is close to free in any case.
@@ -650,7 +800,40 @@ recorder_set_stage (ShellRecorder *recorder,
recorder->stage = stage;
if (recorder->stage)
recorder_update_size (recorder);
{
int error_base, event_base;
int major = 2, minor = 3;
recorder->stage = stage;
recorder_update_size (recorder);
if (XQueryExtension (clutter_x11_get_default_display (),
"XInputExtension",
&recorder->xinput_opcode,
&error_base,
&event_base))
{
if (XIQueryVersion (clutter_x11_get_default_display (), &major, &minor) == Success)
{
int version = (major * 10) + minor;
if (version < 22)
g_warning("ShellRecorder: xinput version %d.%d is too old", major, minor);
}
else
{
g_warning("ShellRecorder: xinput version could not be queried");
}
}
else
{
g_warning("ShellRecorder: xinput extension unavailable");
}
clutter_stage_ensure_current (stage);
recorder_get_initial_cursor_position (recorder);
}
}
static void
@@ -1532,7 +1715,6 @@ shell_recorder_record (ShellRecorder *recorder,
recorder->last_frame_time = 0;
recorder->state = RECORDER_STATE_RECORDING;
recorder_update_pointer (recorder);
recorder_add_update_pointer_timeout (recorder);
/* Set up repaint hook */

View File

@@ -1,5 +1,8 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#define COGL_ENABLE_EXPERIMENTAL_API
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#include <clutter/clutter.h>
#include <cogl/cogl.h>
#include <meta/display.h>

View File

@@ -71,9 +71,6 @@ struct _StButtonPrivate
{
gchar *text;
ClutterInputDevice *device;
ClutterEventSequence *press_sequence;
guint button_mask : 3;
guint is_toggle : 1;
@@ -130,42 +127,27 @@ st_button_style_changed (StWidget *widget)
}
static void
st_button_press (StButton *button,
ClutterInputDevice *device,
StButtonMask mask,
ClutterEventSequence *sequence)
st_button_press (StButton *button,
StButtonMask mask)
{
if (button->priv->pressed == 0 || sequence)
if (button->priv->pressed == 0)
st_widget_add_style_pseudo_class (ST_WIDGET (button), "active");
button->priv->pressed |= mask;
button->priv->press_sequence = sequence;
button->priv->device = device;
}
static void
st_button_release (StButton *button,
ClutterInputDevice *device,
StButtonMask mask,
int clicked_button,
ClutterEventSequence *sequence)
st_button_release (StButton *button,
StButtonMask mask,
int clicked_button)
{
if ((device && button->priv->device != device) ||
(sequence && button->priv->press_sequence != sequence))
button->priv->pressed &= ~mask;
if (button->priv->pressed != 0)
return;
else if (!sequence)
{
button->priv->pressed &= ~mask;
if (button->priv->pressed != 0)
return;
}
button->priv->press_sequence = NULL;
button->priv->device = NULL;
st_widget_remove_style_pseudo_class (ST_WIDGET (button), "active");
if (clicked_button || sequence)
if (clicked_button)
{
if (button->priv->is_toggle)
st_button_set_checked (button, !button->priv->is_checked);
@@ -180,10 +162,6 @@ st_button_button_press (ClutterActor *actor,
{
StButton *button = ST_BUTTON (actor);
StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button);
ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event);
if (button->priv->press_sequence)
return CLUTTER_EVENT_PROPAGATE;
if (button->priv->button_mask & mask)
{
@@ -191,7 +169,7 @@ st_button_button_press (ClutterActor *actor,
clutter_grab_pointer (actor);
button->priv->grabbed |= mask;
st_button_press (button, device, mask, NULL);
st_button_press (button, mask);
return TRUE;
}
@@ -205,14 +183,13 @@ st_button_button_release (ClutterActor *actor,
{
StButton *button = ST_BUTTON (actor);
StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (event->button);
ClutterInputDevice *device = clutter_event_get_device ((ClutterEvent*) event);
if (button->priv->button_mask & mask)
{
gboolean is_click;
is_click = button->priv->grabbed && st_widget_get_hover (ST_WIDGET (button));
st_button_release (button, device, mask, is_click ? event->button : 0, NULL);
st_button_release (button, mask, is_click ? event->button : 0);
button->priv->grabbed &= ~mask;
if (button->priv->grabbed == 0)
@@ -224,39 +201,6 @@ st_button_button_release (ClutterActor *actor,
return FALSE;
}
static gboolean
st_button_touch_event (ClutterActor *actor,
ClutterTouchEvent *event)
{
StButton *button = ST_BUTTON (actor);
StButtonMask mask = ST_BUTTON_MASK_FROM_BUTTON (1);
ClutterEventSequence *sequence;
ClutterInputDevice *device;
if (button->priv->pressed != 0)
return CLUTTER_EVENT_PROPAGATE;
device = clutter_event_get_device ((ClutterEvent*) event);
sequence = clutter_event_get_event_sequence ((ClutterEvent*) event);
if (event->type == CLUTTER_TOUCH_BEGIN && !button->priv->press_sequence)
{
clutter_input_device_sequence_grab (device, sequence, actor);
st_button_press (button, device, 0, sequence);
return CLUTTER_EVENT_STOP;
}
else if (event->type == CLUTTER_TOUCH_END &&
button->priv->device == device &&
button->priv->press_sequence == sequence)
{
st_button_release (button, device, mask, 0, sequence);
clutter_input_device_sequence_ungrab (device, sequence);
return CLUTTER_EVENT_STOP;
}
return CLUTTER_EVENT_PROPAGATE;
}
static gboolean
st_button_key_press (ClutterActor *actor,
ClutterKeyEvent *event)
@@ -269,7 +213,7 @@ st_button_key_press (ClutterActor *actor,
event->keyval == CLUTTER_KEY_Return ||
event->keyval == CLUTTER_KEY_KP_Enter)
{
st_button_press (button, NULL, ST_BUTTON_ONE, NULL);
st_button_press (button, ST_BUTTON_ONE);
return TRUE;
}
}
@@ -292,7 +236,7 @@ st_button_key_release (ClutterActor *actor,
gboolean is_click;
is_click = (button->priv->pressed & ST_BUTTON_ONE);
st_button_release (button, NULL, ST_BUTTON_ONE, is_click ? 1 : 0, NULL);
st_button_release (button, ST_BUTTON_ONE, is_click ? 1 : 0);
return TRUE;
}
}
@@ -308,7 +252,7 @@ st_button_key_focus_out (ClutterActor *actor)
/* If we lose focus between a key press and release, undo the press */
if ((button->priv->pressed & ST_BUTTON_ONE) &&
!(button->priv->grabbed & ST_BUTTON_ONE))
st_button_release (button, NULL, ST_BUTTON_ONE, 0, NULL);
st_button_release (button, ST_BUTTON_ONE, 0);
CLUTTER_ACTOR_CLASS (st_button_parent_class)->key_focus_out (actor);
}
@@ -325,11 +269,9 @@ st_button_enter (ClutterActor *actor,
if (button->priv->grabbed)
{
if (st_widget_get_hover (ST_WIDGET (button)))
st_button_press (button, button->priv->device,
button->priv->grabbed, NULL);
st_button_press (button, button->priv->grabbed);
else
st_button_release (button, button->priv->device,
button->priv->grabbed, 0, NULL);
st_button_release (button, button->priv->grabbed, 0);
}
return ret;
@@ -347,11 +289,9 @@ st_button_leave (ClutterActor *actor,
if (button->priv->grabbed)
{
if (st_widget_get_hover (ST_WIDGET (button)))
st_button_press (button, button->priv->device,
button->priv->grabbed, NULL);
st_button_press (button, button->priv->grabbed);
else
st_button_release (button, button->priv->device,
button->priv->grabbed, 0, NULL);
st_button_release (button, button->priv->grabbed, 0);
}
return ret;
@@ -451,7 +391,6 @@ st_button_class_init (StButtonClass *klass)
actor_class->key_focus_out = st_button_key_focus_out;
actor_class->enter_event = st_button_enter;
actor_class->leave_event = st_button_leave;
actor_class->touch_event = st_button_touch_event;
widget_class->style_changed = st_button_style_changed;
widget_class->get_accessible_type = st_button_accessible_get_type;
@@ -740,24 +679,13 @@ void
st_button_fake_release (StButton *button)
{
if (button->priv->pressed)
st_button_release (button, button->priv->device,
button->priv->pressed, 0, NULL);
st_button_release (button, button->priv->pressed, 0);
if (button->priv->grabbed)
{
button->priv->grabbed = 0;
clutter_ungrab_pointer ();
}
if (button->priv->device &&
button->priv->press_sequence)
{
clutter_input_device_sequence_ungrab (button->priv->device,
button->priv->press_sequence);
button->priv->press_sequence = NULL;
}
button->priv->device = NULL;
}
/******************************************************************************/

View File

@@ -171,32 +171,38 @@ _st_set_text_from_style (ClutterText *text,
CoglHandle
_st_create_texture_material (CoglHandle src_texture)
{
static CoglPipeline *texture_pipeline_template = NULL;
CoglPipeline *pipeline;
static CoglHandle texture_material_template = COGL_INVALID_HANDLE;
CoglHandle material;
/* The only state used in the pipeline that would affect the shader
generation is the texture type on the layer. Therefore we create
a template pipeline which sets this state and all texture
pipelines are created as a copy of this. That way Cogl can find
the shader state for the pipeline more quickly by looking at the
pipeline ancestry instead of resorting to the shader cache. */
if (G_UNLIKELY (texture_pipeline_template == NULL))
g_return_val_if_fail (src_texture != COGL_INVALID_HANDLE,
COGL_INVALID_HANDLE);
/* We use a material that has a dummy texture as a base for all
texture materials. The idea is that only the Cogl texture object
would be different in the children so it is likely that Cogl will
be able to share GL programs between all the textures. */
if (G_UNLIKELY (texture_material_template == COGL_INVALID_HANDLE))
{
CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ());
static const guint8 white_pixel[] = { 0xff, 0xff, 0xff, 0xff };
CoglHandle dummy_texture;
texture_pipeline_template = cogl_pipeline_new (ctx);
cogl_pipeline_set_layer_null_texture (texture_pipeline_template,
0, /* layer */
COGL_TEXTURE_TYPE_2D);
dummy_texture =
cogl_texture_new_from_data (1, 1,
COGL_TEXTURE_NONE,
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
COGL_PIXEL_FORMAT_ANY,
4, white_pixel);
texture_material_template = cogl_material_new ();
cogl_material_set_layer (texture_material_template, 0, dummy_texture);
cogl_handle_unref (dummy_texture);
}
pipeline = cogl_pipeline_copy (texture_pipeline_template);
material = cogl_material_copy (texture_material_template);
if (src_texture != NULL)
cogl_pipeline_set_layer_texture (pipeline, 0, src_texture);
cogl_material_set_layer (material, 0, src_texture);
return pipeline;
return material;
}
/*****
@@ -343,9 +349,6 @@ CoglHandle
_st_create_shadow_material (StShadow *shadow_spec,
CoglHandle src_texture)
{
ClutterBackend *backend = clutter_get_default_backend ();
CoglContext *ctx = clutter_backend_get_cogl_context (backend);
static CoglHandle shadow_material_template = COGL_INVALID_HANDLE;
CoglHandle material;
@@ -372,11 +375,13 @@ _st_create_shadow_material (StShadow *shadow_spec,
&width_out, &height_out, &rowstride_out);
g_free (pixels_in);
texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, width_out, height_out,
COGL_PIXEL_FORMAT_A_8,
rowstride_out,
pixels_out,
NULL));
texture = cogl_texture_new_from_data (width_out,
height_out,
COGL_TEXTURE_NONE,
COGL_PIXEL_FORMAT_A_8,
COGL_PIXEL_FORMAT_A_8,
rowstride_out,
pixels_out);
g_free (pixels_out);

View File

@@ -191,15 +191,6 @@ st_scroll_view_fade_set_actor (ClutterActorMeta *meta,
g_return_if_fail (actor == NULL || ST_IS_SCROLL_VIEW (actor));
if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
{
/* if we don't have support for GLSL shaders then we
* forcibly disable the ActorMeta
*/
clutter_actor_meta_set_enabled (meta, FALSE);
return;
}
if (self->vadjustment)
{
g_signal_handlers_disconnect_by_func (self->vadjustment,

View File

@@ -21,6 +21,8 @@
#include "config.h"
#define COGL_ENABLE_EXPERIMENTAL_API /* for cogl_framebuffer_allocate */
#include "st-texture-cache.h"
#include "st-private.h"
#include <gtk/gtk.h>
@@ -60,7 +62,7 @@ static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE(StTextureCache, st_texture_cache, G_TYPE_OBJECT);
/* We want to preserve the aspect ratio by default, also the default
* pipeline for an empty texture is full opacity white, which we
* material for an empty texture is full opacity white, which we
* definitely don't want. Skip that by setting 0 opacity.
*/
static ClutterTexture *
@@ -73,7 +75,7 @@ create_default_texture (void)
/* Reverse the opacity we added while loading */
static void
set_texture_cogl_texture (ClutterTexture *clutter_texture, CoglTexture *cogl_texture)
set_texture_cogl_texture (ClutterTexture *clutter_texture, CoglHandle cogl_texture)
{
clutter_texture_set_cogl_texture (clutter_texture, cogl_texture);
g_object_set (clutter_texture, "opacity", 255, NULL);
@@ -144,7 +146,7 @@ st_texture_cache_init (StTextureCache *self)
G_CALLBACK (on_icon_theme_changed), self);
self->priv->keyed_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, cogl_object_unref);
g_free, cogl_handle_unref);
self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL);
self->priv->file_monitors = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -261,6 +263,8 @@ typedef struct {
StTextureCachePolicy policy;
char *key;
gboolean enforced_square;
guint width;
guint height;
guint scale;
@@ -531,19 +535,81 @@ load_pixbuf_async_finish (StTextureCache *cache, GAsyncResult *result, GError **
return g_simple_async_result_get_op_res_gpointer (simple);
}
static CoglTexture *
pixbuf_to_cogl_texture (GdkPixbuf *pixbuf)
static CoglHandle
data_to_cogl_handle (const guchar *data,
gboolean has_alpha,
int width,
int height,
int rowstride,
gboolean add_padding)
{
ClutterBackend *backend = clutter_get_default_backend ();
CoglContext *ctx = clutter_backend_get_cogl_context (backend);
CoglHandle texture, offscreen;
CoglColor clear_color;
guint size;
GError *error;
return COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx,
gdk_pixbuf_get_width (pixbuf),
gdk_pixbuf_get_height (pixbuf),
gdk_pixbuf_get_has_alpha (pixbuf) ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
gdk_pixbuf_get_rowstride (pixbuf),
gdk_pixbuf_get_pixels (pixbuf),
NULL));
size = MAX (width, height);
if (!add_padding || width == height)
return cogl_texture_new_from_data (width,
height,
COGL_TEXTURE_NONE,
has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
COGL_PIXEL_FORMAT_ANY,
rowstride,
data);
texture = cogl_texture_new_with_size (size, size,
COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY);
offscreen = cogl_offscreen_new_with_texture (texture);
error = NULL;
if (!cogl_framebuffer_allocate (offscreen, &error))
{
g_warning ("Failed to allocate FBO (sized %d): %s", size, error->message);
cogl_object_unref (texture);
cogl_object_unref (offscreen);
g_clear_error (&error);
return cogl_texture_new_from_data (width,
height,
COGL_TEXTURE_NONE,
has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
COGL_PIXEL_FORMAT_ANY,
rowstride,
data);
}
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_push_framebuffer (offscreen);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
cogl_pop_framebuffer ();
cogl_handle_unref (offscreen);
cogl_texture_set_region (texture,
0, 0,
(size - width) / 2, (size - height) / 2,
width, height,
width, height,
has_alpha ? COGL_PIXEL_FORMAT_RGBA_8888 : COGL_PIXEL_FORMAT_RGB_888,
rowstride,
data);
return texture;
}
static CoglHandle
pixbuf_to_cogl_handle (GdkPixbuf *pixbuf,
gboolean add_padding)
{
return data_to_cogl_handle (gdk_pixbuf_get_pixels (pixbuf),
gdk_pixbuf_get_has_alpha (pixbuf),
gdk_pixbuf_get_width (pixbuf),
gdk_pixbuf_get_height (pixbuf),
gdk_pixbuf_get_rowstride (pixbuf),
add_padding);
}
static cairo_surface_t *
@@ -573,7 +639,7 @@ finish_texture_load (AsyncTextureLoadData *data,
{
GSList *iter;
StTextureCache *cache;
CoglTexture *texdata = NULL;
CoglHandle texdata = NULL;
cache = data->cache;
@@ -582,7 +648,7 @@ finish_texture_load (AsyncTextureLoadData *data,
if (pixbuf == NULL)
goto out;
texdata = pixbuf_to_cogl_texture (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, data->enforced_square);
if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE)
{
@@ -591,7 +657,7 @@ finish_texture_load (AsyncTextureLoadData *data,
if (!g_hash_table_lookup_extended (cache->priv->keyed_cache, data->key,
&orig_key, &value))
{
cogl_object_ref (texdata);
cogl_handle_ref (texdata);
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (data->key),
texdata);
}
@@ -605,7 +671,7 @@ finish_texture_load (AsyncTextureLoadData *data,
out:
if (texdata)
cogl_object_unref (texdata);
cogl_handle_unref (texdata);
texture_load_data_free (data);
}
@@ -696,7 +762,7 @@ st_texture_cache_reset_texture (StTextureCachePropertyBind *bind,
const char *propname)
{
GdkPixbuf *pixbuf;
CoglTexture *texdata;
CoglHandle texdata;
g_object_get (bind->source, propname, &pixbuf, NULL);
@@ -704,11 +770,11 @@ st_texture_cache_reset_texture (StTextureCachePropertyBind *bind,
if (pixbuf != NULL)
{
texdata = pixbuf_to_cogl_texture (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, FALSE);
g_object_unref (pixbuf);
clutter_texture_set_cogl_texture (bind->texture, texdata);
cogl_object_unref (texdata);
cogl_handle_unref (texdata);
clutter_actor_set_opacity (CLUTTER_ACTOR (bind->texture), 255);
}
@@ -751,7 +817,7 @@ st_texture_cache_free_bind (gpointer data)
*
* Create a #ClutterTexture which tracks the #GdkPixbuf value of a GObject property
* named by @property_name. Unlike other methods in StTextureCache, the underlying
* #CoglTexture is not shared by default with other invocations to this method.
* CoglHandle is not shared by default with other invocations to this method.
*
* If the source object is destroyed, the texture will continue to show the last
* value of the property.
@@ -802,7 +868,7 @@ st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
*
* Returns: (transfer full): A newly-referenced handle to the texture
*/
CoglTexture *
CoglHandle
st_texture_cache_load (StTextureCache *cache,
const char *key,
StTextureCachePolicy policy,
@@ -810,7 +876,7 @@ st_texture_cache_load (StTextureCache *cache,
void *data,
GError **error)
{
CoglTexture *texture;
CoglHandle texture;
texture = g_hash_table_lookup (cache->priv->keyed_cache, key);
if (!texture)
@@ -819,10 +885,9 @@ st_texture_cache_load (StTextureCache *cache,
if (texture)
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texture);
else
return NULL;
return COGL_INVALID_HANDLE;
}
cogl_object_ref (texture);
cogl_handle_ref (texture);
return texture;
}
@@ -847,7 +912,7 @@ ensure_request (StTextureCache *cache,
AsyncTextureLoadData **request,
ClutterActor *texture)
{
CoglTexture *texdata;
CoglHandle texdata;
AsyncTextureLoadData *pending;
gboolean had_pending;
@@ -946,6 +1011,7 @@ load_gicon_with_colors (StTextureCache *cache,
request->icon_info = info;
request->width = request->height = size;
request->scale = scale;
request->enforced_square = TRUE;
load_texture_async (cache, request);
}
@@ -982,7 +1048,7 @@ static ClutterActor *
load_from_pixbuf (GdkPixbuf *pixbuf)
{
ClutterTexture *texture;
CoglTexture *texdata;
CoglHandle texdata;
int width = gdk_pixbuf_get_width (pixbuf);
int height = gdk_pixbuf_get_height (pixbuf);
@@ -990,11 +1056,11 @@ load_from_pixbuf (GdkPixbuf *pixbuf)
clutter_actor_set_size (CLUTTER_ACTOR (texture), width, height);
texdata = pixbuf_to_cogl_texture (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, FALSE);
set_texture_cogl_texture (texture, texdata);
cogl_object_unref (texdata);
cogl_handle_unref (texdata);
return CLUTTER_ACTOR (texture);
}
@@ -1270,7 +1336,7 @@ st_texture_cache_load_uri_async (StTextureCache *cache,
return CLUTTER_ACTOR (texture);
}
static CoglTexture *
static CoglHandle
st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache,
StTextureCachePolicy policy,
const gchar *uri,
@@ -1279,7 +1345,7 @@ st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache,
int scale,
GError **error)
{
CoglTexture *texdata;
CoglHandle texdata;
GdkPixbuf *pixbuf;
char *key;
@@ -1293,17 +1359,17 @@ st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache,
if (!pixbuf)
goto out;
texdata = pixbuf_to_cogl_texture (pixbuf);
texdata = pixbuf_to_cogl_handle (pixbuf, FALSE);
g_object_unref (pixbuf);
if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
{
cogl_object_ref (texdata);
cogl_handle_ref (texdata);
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texdata);
}
}
else
cogl_object_ref (texdata);
cogl_handle_ref (texdata);
ensure_monitor_for_uri (cache, uri);
@@ -1355,23 +1421,23 @@ out:
}
/**
* st_texture_cache_load_file_to_cogl_texture: (skip)
* st_texture_cache_load_file_to_cogl_texture:
* @cache: A #StTextureCache
* @file_path: Path to a file in supported image format
* @scale: Scale factor of the display
*
* This function synchronously loads the given file path
* into a COGL texture. On error, a warning is emitted
* and %NULL is returned.
* and %COGL_INVALID_HANDLE is returned.
*
* Returns: (transfer full): a new #CoglTexture
* Returns: (transfer full): a new #CoglHandle
*/
CoglTexture *
CoglHandle
st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
const gchar *file_path,
gint scale)
{
CoglTexture *texture;
CoglHandle texture;
GFile *file;
char *uri;
GError *error = NULL;
@@ -1388,7 +1454,7 @@ st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
{
g_warning ("Failed to load %s: %s", file_path, error->message);
g_clear_error (&error);
return NULL;
return COGL_INVALID_HANDLE;
}
return texture;
}

View File

@@ -93,9 +93,9 @@ ClutterActor *st_texture_cache_load_uri_async (StTextureCache *cache,
int available_height,
int scale);
CoglTexture *st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
const gchar *file_path,
gint scale);
CoglHandle st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
const gchar *file_path,
gint scale);
cairo_surface_t *st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache,
const gchar *file_path,
@@ -112,13 +112,13 @@ cairo_surface_t *st_texture_cache_load_file_to_cairo_surface (StTextureCache *ca
* texture handle for the given key, or set @error.
*
*/
typedef CoglTexture * (*StTextureCacheLoader) (StTextureCache *cache, const char *key, void *data, GError **error);
typedef CoglHandle (*StTextureCacheLoader) (StTextureCache *cache, const char *key, void *data, GError **error);
CoglTexture * st_texture_cache_load (StTextureCache *cache,
const char *key,
StTextureCachePolicy policy,
StTextureCacheLoader load,
void *data,
GError **error);
CoglHandle st_texture_cache_load (StTextureCache *cache,
const char *key,
StTextureCachePolicy policy,
StTextureCacheLoader load,
void *data,
GError **error);
#endif /* __ST_TEXTURE_CACHE_H__ */

View File

@@ -69,8 +69,6 @@ elliptical_arc (cairo_t *cr,
static CoglHandle
create_corner_material (StCornerSpec *corner)
{
ClutterBackend *backend = clutter_get_default_backend ();
CoglContext *ctx = clutter_backend_get_cogl_context (backend);
CoglHandle texture;
cairo_t *cr;
cairo_surface_t *surface;
@@ -168,11 +166,12 @@ create_corner_material (StCornerSpec *corner)
cairo_surface_destroy (surface);
texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, size, size,
CLUTTER_CAIRO_FORMAT_ARGB32,
rowstride,
data,
NULL));
texture = cogl_texture_new_from_data (size, size,
COGL_TEXTURE_NONE,
CLUTTER_CAIRO_FORMAT_ARGB32,
COGL_PIXEL_FORMAT_ANY,
rowstride,
data);
g_free (data);
g_assert (texture != COGL_INVALID_HANDLE);
@@ -942,8 +941,6 @@ st_theme_node_prerender_background (StThemeNode *node,
float actor_width,
float actor_height)
{
ClutterBackend *backend = clutter_get_default_backend ();
CoglContext *ctx = clutter_backend_get_cogl_context (backend);
StBorderImage *border_image;
CoglHandle texture;
guint radius[4];
@@ -1259,11 +1256,12 @@ st_theme_node_prerender_background (StThemeNode *node,
if (interior_path != NULL)
cairo_path_destroy (interior_path);
texture = COGL_TEXTURE (cogl_texture_2d_new_from_data (ctx, width, height,
CLUTTER_CAIRO_FORMAT_ARGB32,
rowstride,
data,
NULL));
texture = cogl_texture_new_from_data (width, height,
COGL_TEXTURE_NONE,
CLUTTER_CAIRO_FORMAT_ARGB32,
COGL_PIXEL_FORMAT_ANY,
rowstride,
data);
cairo_destroy (cr);
cairo_surface_destroy (surface);