Compare commits

..

2 Commits

Author SHA1 Message Date
7d598b7725 Bump version to 3.7.3.1
Update NEWS.
2012-12-20 17:47:36 +01:00
9f890982b2 Revert "NetworkMenu: rework multiple NIC support"
This reverts commit 490206b5b2.

Conflicts:
	configure.ac
	src/gvc
2012-12-20 17:46:31 +01:00
76 changed files with 7626 additions and 9973 deletions

51
NEWS
View File

@ -1,53 +1,6 @@
3.7.4.1
3.7.3.1
=======
* userMenu: Use show-full-name-in-top-bar setting [Bastien; #689561]
* dateMenu: Add "Open Clocks" entry [Mathieu; #644390]
* screenshot: Immediately show the flash spot [Jasper; #691875]
* Misc. bug fixes [Rico, Jeremy]
Contributors:
Jeremy Bicha, Mathieu Bridon, Bastien Nocera, Jasper St. Pierre,
Rico Tzschichholz
Translations:
Ihar Hrachyshka [be]
3.7.4
=====
* Make menu separators crisp [Giovanni, Allan; #641745]
* power: Update for new D-Bus name [Bastien; #690506]
* Add smooth scrolling support [Jasper; #687573]
* Tweak notification layout [Allan; #688506]
* Ping the active window when using the app menu [Giovanni; #684340]
* Make password entries insensitive after submission [Jasper; #690594, #690895]
* Honor lock-delay GSettings key [Giovanni, Matthias; #690766, #691170]
* Use text/calendar preferred app as the calendar app [Giovanni; #690767]
* lookingGlass: Move to an inspect() function [Jasper; #690726]
* Make OSK animation quicker, snappier [Rui; #688642]
* Allow to close chat notifications with Escape [Jasper; #690897]
* Honor org.gnome.desktop.screensaver.user-switch-enabled [Giovanni; #691042]
* Add a SelectArea() DBus method [Cosimo; #687954]
* Support non-absolute paths when saving screenshots [Cosimo; #688004]
* OSK: Fix extended keys popups [Rui; #674955]
* Don't hide or show the keyboard immediately [Rui; #688646]
* Improve padding in power menu [Giovanni; #689297]
* Add per-window input source switching [Rui; #691414]
* Misc bug fixes and cleanups [Rico, Jasper, Giovanni, Rui, Florian, Dan;
#690608, #690589, #690539, #687081, #690667, #690665, #690666, #685856,
#690858, #690895, #680414, #690965, #691019, #690590, #681376, #690180,
#685513, #689263, #691553, #691720, #691743, #691750]
Contributors:
Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Allan Day, Rui Matos,
Florian Müllner, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz,
Dan Winship
Translations:
Matej Urbančič [sl], Kjartan Maraas [nb], Mattias Põldaru [et],
Yaron Shahrabani [he], Aurimas Černius [lt], Khaled Hosny [ar],
Fran Diéguez [gl], Daniel Mustieles [es], Piotr Drąg [pl], Balázs Úr [hu],
Baurzhan Muftakhidinov [kk], Tobias Endrigkeit [de], Dušan Kazik [sk],
Aron Xu [zh_CN], Gheyret Kenji [ug]
* Revert 490206b to not depend on NMGTK-0.9.7, which hasn't been released yet
3.7.3
=====

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.7.4.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.7.3.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@ -64,12 +64,13 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.11.11
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.7.4
GJS_MIN_VERSION=1.33.2
MUTTER_MIN_VERSION=3.7.3
GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.5.3
LIBEDATASERVERUI_MIN_VERSION=3.5.3
TELEPATHY_GLIB_MIN_VERSION=0.17.5
TELEPATHY_LOGGER_MIN_VERSION=0.2.4
POLKIT_MIN_VERSION=0.100
@ -77,7 +78,6 @@ STARTUP_NOTIFICATION_MIN_VERSION=0.11
GCR_MIN_VERSION=3.3.90
GNOME_DESKTOP_REQUIRED_VERSION=3.7.1
GNOME_MENUS_REQUIRED_VERSION=3.5.3
NETWORKMANAGER_MIN_VERSION=0.9.6
PULSE_MIN_VERS=2.0
# Collect more than 20 libraries for a prize!
@ -99,9 +99,8 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION)
libnm-glib libnm-util gnome-keyring-1
gcr-3 >= $GCR_MIN_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
@ -126,7 +125,7 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.2.2)
AC_MSG_CHECKING([for bluetooth support])
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],

View File

@ -12,7 +12,6 @@ desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
introspectiondir = $(datadir)/dbus-1/interfaces
introspection_DATA = \
org.gnome.Shell.Screenshot.xml \
org.gnome.ShellSearchProvider.xml \
org.gnome.ShellSearchProvider2.xml

View File

@ -1,128 +0,0 @@
<!DOCTYPE node PUBLIC
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
<node>
<!--
org.gnome.Shell.Screenshot:
@short_description: Screenshot interface
The interface used to capture pictures of the screen contents.
-->
<interface name="org.gnome.Shell.Screenshot">
<!--
Screenshot:
@filename: The filename for the screenshot
@include_cursor: Whether to include the cursor image or not
@flash: Whether to flash the screen or not
@success: whether the screenshot was captured
@filename_used: the file where the screenshot was saved
Takes a screenshot of the whole screen and saves it
in @filename as png image, it returns a boolean
indicating whether the operation was successful or not.
@filename can either be an absolute path or a basename, in
which case the screenshot will be saved in the $XDG_PICTURES_DIR
or the home directory if it doesn't exist. The filename used
to save the screenshot will be returned in @filename_used.
-->
<method name="Screenshot">
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
ScreenshotWindow:
@include_frame: Whether to include the frame or not
@include_cursor: Whether to include the cursor image or not
@flash: Whether to flash the window area or not
@filename: The filename for the screenshot
@success: whether the screenshot was captured
@filename_used: the file where the screenshot was saved
Takes a screenshot of the focused window (optionally omitting the frame)
and saves it in @filename as png image, it returns a boolean
indicating whether the operation was successful or not.
@filename can either be an absolute path or a basename, in
which case the screenshot will be saved in the $XDG_PICTURES_DIR
or the home directory if it doesn't exist. The filename used
to save the screenshot will be returned in @filename_used.
-->
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
ScreenshotArea:
@x: the X coordinate of the area to capture
@y: the Y coordinate of the area to capture
@width: the width of the area to capture
@height: the height of the area to capture
@flash: whether to flash the area or not
@filename: the filename for the screenshot
@success: whether the screenshot was captured
@filename_used: the file where the screenshot was saved
Takes a screenshot of the passed in area and saves it
in @filename as png image, it returns a boolean
indicating whether the operation was successful or not.
@filename can either be an absolute path or a basename, in
which case the screenshot will be saved in the $XDG_PICTURES_DIR
or the home directory if it doesn't exist. The filename used
to save the screenshot will be returned in @filename_used.
-->
<method name="ScreenshotArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
FlashArea:
@x: the X coordinate of the area to flash
@y: the Y coordinate of the area to flash
@width: the width of the area to flash
@height: the height of the area to flash
Renders a flash spot effect in the specified rectangle of the screen.
-->
<method name="FlashArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
</method>
<!--
SelectArea:
@x: the X coordinate of the selected area
@y: the Y coordinate of the selected area
@width: the width of the selected area
@height: the height of the selected area
Interactively allows the user to select a rectangular area of
the screen, and returns its coordinates.
-->
<method name="SelectArea">
<arg type="i" direction="out" name="x"/>
<arg type="i" direction="out" name="y"/>
<arg type="i" direction="out" name="width"/>
<arg type="i" direction="out" name="height"/>
</method>
</interface>
</node>

View File

@ -65,6 +65,11 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
menuitem in single-user, single-session situations.
</_description>
</key>
<key name="show-full-name" type="b">
<default>true</default>
<_summary>Show full name in the user menu</_summary>
<_description>Whether the users full name is shown in the user menu or not.</_description>
</key>
<key name="remember-mount-password" type="b">
<default>false</default>
<_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary>

View File

@ -206,12 +206,11 @@ StScrollBar StButton#vhandle:active {
}
.popup-separator-menu-item {
-gradient-height: 1px;
-gradient-start: rgba(255,255,255,0.0);
-gradient-end: rgba(255,255,255,0.3);
-margin-horizontal: 24px;
height: 1px;
padding: 8px 0px;
-gradient-height: 2px;
-gradient-start: rgba(8,8,8,0);
-gradient-end: #333333;
-margin-horizontal: 1.5em;
height: 1em;
}
.popup-alternating-menu-item:alternate {
@ -252,10 +251,6 @@ StScrollBar StButton#vhandle:active {
icon-size: 1.09em;
}
.popup-battery-percentage {
padding-left: 24px;
}
/* Switches */
.toggle-switch {
width: 65px;
@ -292,17 +287,13 @@ StScrollBar StButton#vhandle:active {
.hotplug-notification-item,
.hotplug-resident-eject-button,
.modal-dialog-button {
font-weight: bold;
border: 1px solid #8b8b8b;
background-gradient-direction: vertical;
background-gradient-start: rgba(255, 255, 255, 0.2);
background-gradient-end: rgba(255, 255, 255, 0);
}
.dash-search-button,
.modal-dialog-button {
font-weight: bold;
}
.dash-search-button:hover,
.notification-button:hover,
.notification-icon-button:hover,
@ -363,7 +354,7 @@ StScrollBar StButton#vhandle:active {
background-gradient-start: rgba(5,5,6,0.1);
background-gradient-end: rgba(254,254,254,0.1);
background-gradient-direction: vertical;
transition-duration: 300ms;
transition-duration: 300;
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
}
@ -398,7 +389,7 @@ StScrollBar StButton#vhandle:active {
color: rgb(64, 64, 64);
caret-color: rgb(64, 64, 64);
font-weight: bold;
transition-duration: 0ms;
transition-duration: 0;
}
.notification StEntry,
@ -429,7 +420,7 @@ StScrollBar StButton#vhandle:active {
background-color: black;
font-weight: bold;
height: 1.86em;
transition-duration: 250ms;
transition-duration: 250;
}
#panel.lock-screen {
@ -512,7 +503,7 @@ StScrollBar StButton#vhandle:active {
-minimum-hpadding: 6px;
font-weight: bold;
color: #ccc;
transition-duration: 100ms;
transition-duration: 100;
}
#panel.unlock-screen .panel-button,
@ -926,7 +917,7 @@ StScrollBar StButton#vhandle:active {
border-radius: 4px;
padding: 3px;
border: 1px rgba(0,0,0,0);
transition-duration: 100ms;
transition-duration: 100;
text-align: center;
}
@ -943,7 +934,7 @@ StScrollBar StButton#vhandle:active {
.grid-search-result:hover .overview-icon {
background-color: rgba(255,255,255,0.1);
text-shadow: black 0px 2px 2px;
transition-duration: 100ms;
transition-duration: 100;
color:white;
}
@ -965,13 +956,13 @@ StScrollBar StButton#vhandle:active {
background-gradient-direction: vertical;
border-radius: 4px;
box-shadow: inset 0px 1px 2px 0px rgba(0, 0, 0, 1);
transition-duration: 100ms;
transition-duration: 100;
}
.show-apps:checked .show-apps-icon,
.show-apps:focus .show-apps-icon {
color: white;
transition-duration: 100ms;
transition-duration: 100;
}
.app-well-app:focus > .overview-icon,
@ -1010,7 +1001,7 @@ StScrollBar StButton#vhandle:active {
-minimum-hpadding: 6px;
font-weight: bold;
color: #ccc;
transition-duration: 100ms;
transition-duration: 100;
padding-left: .3em;
padding-right: .3em;
}
@ -1313,8 +1304,7 @@ StScrollBar StButton#vhandle:active {
#message-tray {
background: #2e3436 url(message-tray-background.png);
background-repeat: repeat;
transition-duration: 250ms;
height: 72px;
transition-duration: 250;
}
#message-tray:keyboard {
@ -1341,7 +1331,7 @@ StScrollBar StButton#vhandle:active {
border-radius: 10px 10px 0px 0px;
background: rgba(0,0,0,0.9);
padding: 8px 8px 4px 8px;
spacing-rows: 4px;
spacing-rows: 10px;
spacing-columns: 10px;
}
@ -1421,7 +1411,6 @@ StScrollBar StButton#vhandle:active {
}
.notification-actions {
padding-top: 18px;
spacing: 10px;
}
@ -1584,7 +1573,7 @@ StScrollBar StButton#vhandle:active {
.summary-source {
border-radius: 4px;
padding: 0 6px 0 6px;
transition-duration: 100ms;
transition-duration: 100;
}
.summary-source-counter {

View File

@ -88,18 +88,11 @@ doc-gen-org.gnome.Shell.SearchProvider2.xml: $(top_srcdir)/data/org.gnome.ShellS
--generate-docbook doc-gen \
$(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
doc-gen-org.gnome.Shell.Screenshot.xml: $(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
gdbus-codegen \
--interface-prefix org.gnome.Shell.Screenshot. \
--generate-docbook doc-gen \
$(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
content_files= \
doc-gen-org.gnome.Shell.SearchProvider.xml \
doc-gen-org.gnome.Shell.SearchProvider2.xml \
doc-gen-org.gnome.Shell.Screenshot.xml
doc-gen-org.gnome.Shell.SearchProvider2.xml
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
# These files must be listed here *and* in content_files

View File

@ -49,6 +49,7 @@ nobase_dist_js_DATA = \
ui/extensionSystem.js \
ui/extensionDownloader.js \
ui/environment.js \
ui/flashspot.js \
ui/ibusCandidatePopup.js\
ui/grabHelper.js \
ui/iconGrid.js \
@ -73,7 +74,6 @@ nobase_dist_js_DATA = \
ui/popupMenu.js \
ui/remoteSearch.js \
ui/runDialog.js \
ui/screenshot.js \
ui/screenShield.js \
ui/scripting.js \
ui/search.js \

View File

@ -532,7 +532,6 @@ const SessionListItem = new Lang.Class({
color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill();
cr.$dispose();
},
_onClicked: function() {

View File

@ -159,6 +159,86 @@ function killall(processName) {
}
}
// This was ported from network-manager-applet
// Copyright 2007 - 2011 Red Hat, Inc.
// Author: Dan Williams <dcbw@redhat.com>
const _IGNORED_WORDS = [
'Semiconductor',
'Components',
'Corporation',
'Communications',
'Company',
'Corp.',
'Corp',
'Co.',
'Inc.',
'Inc',
'Incorporated',
'Ltd.',
'Limited.',
'Intel',
'chipset',
'adapter',
'[hex]',
'NDIS',
'Module'
];
const _IGNORED_PHRASES = [
'Multiprotocol MAC/baseband processor',
'Wireless LAN Controller',
'Wireless LAN Adapter',
'Wireless Adapter',
'Network Connection',
'Wireless Cardbus Adapter',
'Wireless CardBus Adapter',
'54 Mbps Wireless PC Card',
'Wireless PC Card',
'Wireless PC',
'PC Card with XJACK(r) Antenna',
'Wireless cardbus',
'Wireless LAN PC Card',
'Technology Group Ltd.',
'Communication S.p.A.',
'Business Mobile Networks BV',
'Mobile Broadband Minicard Composite Device',
'Mobile Communications AB',
'(PC-Suite Mode)'
];
function fixupPCIDescription(desc) {
desc = desc.replace(/[_,]/, ' ');
/* Attempt to shorten ID by ignoring certain phrases */
for (let i = 0; i < _IGNORED_PHRASES.length; i++) {
let item = _IGNORED_PHRASES[i];
let pos = desc.indexOf(item);
if (pos != -1) {
let before = desc.substring(0, pos);
let after = desc.substring(pos + item.length, desc.length);
desc = before + after;
}
}
/* Attmept to shorten ID by ignoring certain individual words */
let words = desc.split(' ');
let out = [ ];
for (let i = 0; i < words.length; i++) {
let item = words[i];
// skip empty items (that come out from consecutive spaces)
if (item.length == 0)
continue;
if (_IGNORED_WORDS.indexOf(item) == -1) {
out.push(item);
}
}
return out.join(' ');
}
// lowerBound:
// @array: an array or array-like object, already sorted
// according to @cmp

View File

@ -220,8 +220,25 @@ const BoxPointer = new Lang.Class({
this.bin.allocate(childBox, flags);
if (this._sourceActor && this._sourceActor.mapped) {
this._reposition();
this._updateFlip();
this._reposition(this._sourceActor, this._arrowAlignment);
if (this._shouldFlip()) {
switch (this._arrowSide) {
case St.Side.TOP:
this._arrowSide = St.Side.BOTTOM;
break;
case St.Side.BOTTOM:
this._arrowSide = St.Side.TOP;
break;
case St.Side.LEFT:
this._arrowSide = St.Side.RIGHT;
break;
case St.Side.RIGHT:
this._arrowSide = St.Side.LEFT;
break;
}
this._reposition(this._sourceActor, this._arrowAlignment);
}
}
},
@ -388,11 +405,11 @@ const BoxPointer = new Lang.Class({
cr.setLineWidth(borderWidth);
cr.stroke();
}
cr.$dispose();
},
setPosition: function(sourceActor, alignment) {
this._arrowSide = this._userArrowSide;
// We need to show it now to force an allocation,
// so that we can query the correct size.
this.actor.show();
@ -400,8 +417,7 @@ const BoxPointer = new Lang.Class({
this._sourceActor = sourceActor;
this._arrowAlignment = alignment;
this._reposition();
this._updateFlip();
this._reposition(sourceActor, alignment);
},
setSourceAlignment: function(alignment) {
@ -413,10 +429,7 @@ const BoxPointer = new Lang.Class({
this.setPosition(this._sourceActor, this._arrowAlignment);
},
_reposition: function() {
let sourceActor = this._sourceActor;
let alignment = this._arrowAlignment;
_reposition: function(sourceActor, alignment) {
// Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
@ -540,7 +553,7 @@ const BoxPointer = new Lang.Class({
_shiftActor : function() {
// Since the position of the BoxPointer depends on the allocated size
// of the BoxPointer and the position of the source actor, trying
// to position the BoxPointer via the x/y properties will result in
// to position the BoxPoiner via the x/y properties will result in
// allocation loops and warnings. Instead we do the positioning via
// the anchor point, which is independent of allocation, and leave
// x == y == 0.
@ -548,47 +561,37 @@ const BoxPointer = new Lang.Class({
-(this._yPosition + this._yOffset));
},
_calculateArrowSide: function(arrowSide) {
_shouldFlip: function() {
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
let [minWidth, minHeight, boxWidth, boxHeight] = this._container.get_preferred_size();
let boxAllocation = Shell.util_get_transformed_allocation(this.actor);
let boxWidth = boxAllocation.x2 - boxAllocation.x1;
let boxHeight = boxAllocation.y2 - boxAllocation.y1;
let monitor = Main.layoutManager.findMonitorForActor(this.actor);
switch (arrowSide) {
switch (this._arrowSide) {
case St.Side.TOP:
if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
if (boxAllocation.y2 > monitor.y + monitor.height &&
boxHeight < sourceAllocation.y1 - monitor.y)
return St.Side.BOTTOM;
return true;
break;
case St.Side.BOTTOM:
if (sourceAllocation.y1 - boxHeight < monitor.y &&
if (boxAllocation.y1 < monitor.y &&
boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
return St.Side.TOP;
return true;
break;
case St.Side.LEFT:
if (sourceAllocation.y2 + boxWidth > monitor.x + monitor.width &&
if (boxAllocation.x2 > monitor.x + monitor.width &&
boxWidth < sourceAllocation.x1 - monitor.x)
return St.Side.RIGHT;
return true;
break;
case St.Side.RIGHT:
if (sourceAllocation.y1 - boxWidth < monitor.x &&
if (boxAllocation.x1 < monitor.x &&
boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
return St.Side.LEFT;
return true;
break;
}
return arrowSide;
},
_updateFlip: function() {
let arrowSide = this._calculateArrowSide(this._userArrowSide);
if (this._arrowSide != arrowSide) {
this._arrowSide = arrowSide;
this._reposition();
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._container.queue_relayout();
return false;
}));
}
return false;
},
set xOffset(offset) {

View File

@ -60,14 +60,18 @@ const KeyringDialog = new Lang.Class({
this._controlTable = null;
let buttons = [{ label: '',
action: Lang.bind(this, this._onCancelButton),
key: Clutter.Escape
},
{ label: '',
action: Lang.bind(this, this._onContinueButton),
default: true
}]
this._cancelButton = this.addButton({ label: '',
action: Lang.bind(this, this._onCancelButton),
key: Clutter.Escape });
this._continueButton = this.addButton({ label: '',
action: Lang.bind(this, this._onContinueButton),
default: true },
{ expand: true, x_fill: false, x_align: St.Align.END });
this.setButtons(buttons);
this._cancelButton = buttons[0].button;
this._continueButton = buttons[1].button;
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
@ -142,14 +146,6 @@ const KeyringDialog = new Lang.Class({
this._messageBox.add(table, { x_fill: true, y_fill: true });
},
_updateSensitivity: function(sensitive) {
this._passwordEntry.reactive = sensitive;
this._passwordEntry.clutter_text.editable = sensitive;
this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive;
},
_ensureOpen: function() {
// NOTE: ModalDialog.open() is safe to call if the dialog is
// already open - it just returns true without side-effects
@ -171,14 +167,12 @@ const KeyringDialog = new Lang.Class({
_onShowPassword: function(prompt) {
this._buildControlTable();
this._ensureOpen();
this._updateSensitivity(true);
this._passwordEntry.grab_key_focus();
},
_onShowConfirm: function(prompt) {
this._buildControlTable();
this._ensureOpen();
this._updateSensitivity(true);
this._continueButton.grab_key_focus();
},
@ -198,7 +192,6 @@ const KeyringDialog = new Lang.Class({
},
_onContinueButton: function() {
this._updateSensitivity(false);
this.prompt.complete();
},

View File

@ -159,13 +159,14 @@ const AuthenticationDialog = new Lang.Class({
messageBox.add(this._nullMessageLabel);
this._nullMessageLabel.show();
this._cancelButton = this.addButton({ label: _("Cancel"),
action: Lang.bind(this, this.cancel),
key: Clutter.Escape });
this._okButton = this.addButton({ label: _("Authenticate"),
action: Lang.bind(this, this._onAuthenticateButtonPressed),
default: true },
{ expand: true, x_fill: false, x_align: St.Align.END });
this.setButtons([{ label: _("Cancel"),
action: Lang.bind(this, this.cancel),
key: Clutter.Escape
},
{ label: _("Authenticate"),
action: Lang.bind(this, this._onAuthenticateButtonPressed),
default: true
}]);
this._doneEmitted = false;
@ -213,17 +214,8 @@ const AuthenticationDialog = new Lang.Class({
}
},
_updateSensitivity: function(sensitive) {
this._passwordEntry.reactive = sensitive;
this._passwordEntry.clutter_text.editable = sensitive;
this._okButton.can_focus = sensitive;
this._okButton.reactive = sensitive;
},
_onEntryActivate: function() {
let response = this._passwordEntry.get_text();
this._updateSensitivity(false);
this._session.response(response);
// When the user responds, dismiss already shown info and
// error texts (if any)
@ -277,7 +269,6 @@ const AuthenticationDialog = new Lang.Class({
this._passwordBox.show();
this._passwordEntry.set_text('');
this._passwordEntry.grab_key_focus();
this._updateSensitivity(true);
this._ensureOpen();
},

View File

@ -1346,8 +1346,9 @@ const AccountNotification = new Lang.Class({
this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) {
case 'view':
let cmd = 'empathy-accounts --select-account=' +
account.get_path_suffix();
let cmd = '/usr/bin/empathy-accounts'
+ ' --select-account=%s'
.format(account.get_path_suffix());
let app_info = Gio.app_info_create_from_commandline(cmd, null, 0);
app_info.launch([], global.create_app_launch_context());
break;

View File

@ -32,7 +32,6 @@ function _onVertSepRepaint (area)
cr.setDash([1, 3], 1); // Hard-code for now
cr.setLineWidth(stippleWidth);
cr.stroke();
cr.$dispose();
};
const DateMenuButton = new Lang.Class({
@ -84,26 +83,12 @@ const DateMenuButton = new Lang.Class({
}));
vbox.add(this._calendar.actor);
let separator = new PopupMenu.PopupSeparatorMenuItem();
separator.setColumnWidths(1);
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
this._openCalendarItem.actor.can_focus = false;
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._openClocksItem = new PopupMenu.PopupMenuItem(_("Open Clocks"));
this._openClocksItem.connect('activate', Lang.bind(this, this._onOpenClocksActivate));
this._openClocksItem.actor.can_focus = false;
vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
Shell.AppSystem.get_default().connect('installed-changed',
Lang.bind(this, this._appInstalledChanged));
this._appInstalledChanged();
item = this.menu.addSettingsAction(_("Date and Time Settings"), 'gnome-datetime-panel.desktop');
if (item) {
let separator = new PopupMenu.PopupSeparatorMenuItem();
separator.setColumnWidths(1);
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
item.actor.show_on_set_parent = false;
item.actor.can_focus = false;
item.actor.reparent(vbox);
@ -123,6 +108,16 @@ const DateMenuButton = new Lang.Class({
// Event list
vbox.add(this._eventList.actor, { expand: true });
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
this._openCalendarItem.actor.can_focus = false;
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._calendarSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.office.calendar' });
this._calendarSettings.connect('changed::exec',
Lang.bind(this, this._calendarSettingsChanged));
this._calendarSettingsChanged();
// Whenever the menu is opened, select today
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
if (isOpen) {
@ -156,9 +151,10 @@ const DateMenuButton = new Lang.Class({
this._sessionUpdated();
},
_appInstalledChanged: function() {
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
this._openClocksItem.actor.visible = app !== null;
_calendarSettingsChanged: function() {
let exec = this._calendarSettings.get_string('exec');
let fullExec = GLib.find_program_in_path(exec);
this._openCalendarItem.actor.visible = fullExec != null;
},
_setEventsVisibility: function(visible) {
@ -209,14 +205,24 @@ const DateMenuButton = new Lang.Class({
_onOpenCalendarActivate: function() {
this.menu.close();
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
app.launch([], global.create_app_launch_context());
},
_onOpenClocksActivate: function() {
this.menu.close();
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
app.activate();
let tool = this._calendarSettings.get_string('exec');
if (tool.length == 0 || tool.substr(0, 9) == 'evolution') {
// TODO: pass the selected day
let app = Shell.AppSystem.get_default().lookup_app('evolution-calendar.desktop');
app.activate();
} else {
let needTerm = this._calendarSettings.get_boolean('needs-term');
if (needTerm) {
let terminalSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.terminal' });
let term = terminalSettings.get_string('exec');
let arg = terminalSettings.get_string('exec-arg');
if (arg != '')
Util.spawn([term, arg, tool]);
else
Util.spawn([term, tool]);
} else {
Util.spawnCommandLine(tool)
}
}
}
});

45
js/ui/flashspot.js Normal file
View File

@ -0,0 +1,45 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const FLASHSPOT_ANIMATION_TIME = 0.25; // seconds
const Flashspot = new Lang.Class({
Name: 'Flashspot',
Extends: Lightbox.Lightbox,
_init: function(area) {
this.parent(Main.uiGroup, { inhibitEvents: true,
width: area.width,
height: area.height });
this.actor.style_class = 'flashspot';
this.actor.set_position(area.x, area.y);
},
fire: function() {
this.actor.opacity = 0;
Tweener.addTween(this.actor,
{ opacity: 255,
time: FLASHSPOT_ANIMATION_TIME,
transition: 'linear',
onComplete: Lang.bind(this, this._onFireShowComplete)
});
this.actor.show();
},
_onFireShowComplete: function() {
Tweener.addTween(this.actor,
{ opacity: 0,
time: FLASHSPOT_ANIMATION_TIME,
transition: 'linear',
onComplete: Lang.bind(this, function() {
this.destroy();
})
});
}
});

View File

@ -183,9 +183,6 @@ const GrabHelper = new Lang.Class({
else if (hadFocus || params.grabFocus)
_navigateActor(newFocus);
if ((params.grabFocus || params.modal) && !this._capturedEventId)
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._grabStack.push(params);
return true;
},
@ -195,6 +192,8 @@ const GrabHelper = new Lang.Class({
if (firstGrab) {
if (!Main.pushModal(this._owner, this._modalParams))
return false;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
}
this._modalCount++;
@ -206,6 +205,11 @@ const GrabHelper = new Lang.Class({
if (this._modalCount > 0)
return;
if (this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
Main.popModal(this._owner);
global.sync_pointer();
},
@ -304,11 +308,6 @@ const GrabHelper = new Lang.Class({
this._releaseFocusGrab();
}
if (!this.grabbed && this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
if (hadFocus) {
let poppedGrab = poppedGrabs[0];
_navigateActor(poppedGrab.savedFocus);
@ -317,13 +316,6 @@ const GrabHelper = new Lang.Class({
_onCapturedEvent: function(actor, event) {
let type = event.type();
if (type == Clutter.EventType.KEY_PRESS &&
event.get_key_symbol() == Clutter.KEY_Escape) {
this.ungrab({ isUser: true });
return true;
}
let press = type == Clutter.EventType.BUTTON_PRESS;
let release = type == Clutter.EventType.BUTTON_RELEASE;
let button = press || release;
@ -336,6 +328,12 @@ const GrabHelper = new Lang.Class({
if (!button && this._modalCount == 0)
return false;
if (type == Clutter.EventType.KEY_PRESS &&
event.get_key_symbol() == Clutter.KEY_Escape) {
this.ungrab({ isUser: true });
return true;
}
if (this._isWithinGrabbedActor(event.get_source()))
return false;

View File

@ -2,21 +2,18 @@
const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter;
const DBus = imports.dbus;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer;
const Layout = imports.ui.layout;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const KEYBOARD_REST_TIME = Layout.KEYBOARD_ANIMATION_TIME * 2 * 1000;
const KEYBOARD_SCHEMA = 'org.gnome.shell.keyboard';
const KEYBOARD_TYPE = 'keyboard-type';
@ -59,7 +56,14 @@ const Key = new Lang.Class({
if (this._key.name == 'Control_L' || this._key.name == 'Alt_L')
this._key.latch = true;
this._key.connect('key-pressed', Lang.bind(this, function ()
{ this.actor.checked = true }));
this._key.connect('key-released', Lang.bind(this, function ()
{ this.actor.checked = false; }));
if (this._extended_keys.length > 0) {
this._grabbed = false;
this._eventCaptureId = 0;
this._key.connect('notify::show-subkeys', Lang.bind(this, this._onShowSubkeysChanged));
this._boxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
{ x_fill: true,
@ -111,23 +115,52 @@ const Key = new Lang.Class({
this._boxPointer.bin.add_actor(this._extended_keyboard);
},
get subkeys() {
return this._boxPointer;
_onEventCapture: function (actor, event) {
let source = event.get_source();
let type = event.type();
if ((type == Clutter.EventType.BUTTON_PRESS ||
type == Clutter.EventType.BUTTON_RELEASE) &&
this._extended_keyboard.contains(source)) {
source.extended_key.press();
source.extended_key.release();
return false;
}
if (type == Clutter.EventType.BUTTON_PRESS) {
this._boxPointer.actor.hide();
this._ungrab();
return true;
}
return false;
},
_ungrab: function () {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
this._grabbed = false;
Main.popModal(this.actor);
},
_onShowSubkeysChanged: function () {
if (this._key.show_subkeys) {
this.actor.fake_release();
this._boxPointer.actor.raise_top();
this._boxPointer.setPosition(this.actor, 0.5);
this.emit('show-subkeys');
this.actor.fake_release();
this._boxPointer.show(BoxPointer.PopupAnimation.FULL);
this.actor.set_hover(false);
if (!this._grabbed) {
Main.pushModal(this.actor);
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
this._grabbed = true;
}
this._key.release();
} else {
this.emit('hide-subkeys');
if (this._grabbed)
this._ungrab();
this._boxPointer.hide(BoxPointer.PopupAnimation.FULL);
}
}
});
Signals.addSignalMethods(Key.prototype);
const Keyboard = new Lang.Class({
// HACK: we can't set Name, because it collides with Name dbus property
@ -149,18 +182,6 @@ const Keyboard = new Lang.Class({
this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA });
this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged));
this._settingsChanged();
this._showIdleId = 0;
this._subkeysBoxPointer = null;
this._capturedEventId = 0;
this._capturedPress = false;
this._keyboardVisible = false;
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, function(o, visible) {
this._keyboardVisible = visible;
}));
this._keyboardRequested = false;
this._keyboardRestingId = 0;
},
init: function () {
@ -252,14 +273,10 @@ const Keyboard = new Lang.Class({
return;
let time = global.get_current_time();
if (!(focus instanceof Clutter.Text)) {
if (focus instanceof Clutter.Text)
this.Show(time);
else
this.Hide(time);
return;
}
if (!this._showIdleId)
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() { this.Show(time); }));
},
_addKeys: function () {
@ -314,19 +331,6 @@ const Keyboard = new Lang.Class({
return trayButton;
},
_onCapturedEvent: function(actor, event) {
let type = event.type();
let press = type == Clutter.EventType.BUTTON_PRESS;
let release = type == Clutter.EventType.BUTTON_RELEASE;
if (press)
this._capturedPress = true;
else if (release && this._capturedPress)
this._hideSubkeys();
return true;
},
_addRows : function (keys, layout) {
let keyboard_row = new St.BoxLayout();
for (let i = 0; i < keys.length; ++i) {
@ -349,19 +353,6 @@ const Keyboard = new Lang.Class({
// Add new key for hiding message tray
right_box.add(this._getTrayIcon());
}
button.connect('show-subkeys', Lang.bind(this, function() {
if (this._subkeysBoxPointer)
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
this._subkeysBoxPointer = button.subkeys;
this._subkeysBoxPointer.show(BoxPointer.PopupAnimation.FULL);
if (!this._capturedEventId)
this._capturedEventId = this.actor.connect('captured-event',
Lang.bind(this, this._onCapturedEvent));
}));
button.connect('hide-subkeys', Lang.bind(this, function() {
this._hideSubkeys();
}));
}
keyboard_row.add(left_box, { expand: true, x_fill: false, x_align: St.Align.START });
keyboard_row.add(right_box, { expand: true, x_fill: false, x_align: St.Align.END });
@ -471,37 +462,7 @@ const Keyboard = new Lang.Class({
actor._extended_keys || actor.extended_key;
},
_clearKeyboardRestTimer: function() {
if (!this._keyboardRestingId)
return;
GLib.source_remove(this._keyboardRestingId);
this._keyboardRestingId = 0;
},
show: function (monitor) {
this._keyboardRequested = true;
if (this._keyboardVisible) {
if (monitor != Main.layoutManager.keyboardIndex) {
Main.layoutManager.keyboardIndex = monitor;
this._redraw();
}
return;
}
this._clearKeyboardRestTimer();
this._keyboardRestingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
KEYBOARD_REST_TIME,
Lang.bind(this, function() {
this._clearKeyboardRestTimer();
this._show(monitor);
}));
},
_show: function(monitor) {
if (!this._keyboardRequested)
return;
Main.layoutManager.keyboardIndex = monitor;
this._redraw();
Main.layoutManager.showKeyboard();
@ -509,41 +470,10 @@ const Keyboard = new Lang.Class({
},
hide: function () {
this._keyboardRequested = false;
if (!this._keyboardVisible)
return;
this._clearKeyboardRestTimer();
this._keyboardRestingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
KEYBOARD_REST_TIME,
Lang.bind(this, function() {
this._clearKeyboardRestTimer();
this._hide();
}));
},
_hide: function() {
if (this._keyboardRequested)
return;
this._hideSubkeys();
Main.layoutManager.hideKeyboard();
this._createSource();
},
_hideSubkeys: function() {
if (this._subkeysBoxPointer) {
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
this._subkeysBoxPointer = null;
}
if (this._capturedEventId) {
this.actor.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
this._capturedPress = false;
},
_moveTemporarily: function () {
let currentWindow = global.screen.get_display().focus_window;
let rect = currentWindow.get_outer_rect();
@ -572,13 +502,6 @@ const Keyboard = new Lang.Class({
return one - two;
},
_clearShowIdle: function() {
if (!this._showIdleId)
return;
GLib.source_remove(this._showIdleId);
this._showIdleId = 0;
},
// D-Bus methods
Show: function(timestamp) {
if (!this._enableKeyboard)
@ -587,8 +510,6 @@ const Keyboard = new Lang.Class({
if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp;
this.show(Main.layoutManager.focusIndex);
@ -601,8 +522,6 @@ const Keyboard = new Lang.Class({
if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp;
this.hide();

View File

@ -16,7 +16,7 @@ const Tweener = imports.ui.tweener;
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
const STARTUP_ANIMATION_TIME = 0.2;
const KEYBOARD_ANIMATION_TIME = 0.15;
const KEYBOARD_ANIMATION_TIME = 0.5;
const PLYMOUTH_TRANSITION_TIME = 1;
const MonitorConstraint = new Lang.Class({
@ -437,7 +437,7 @@ const LayoutManager = new Lang.Class({
Tweener.addTween(this.keyboardBox,
{ anchor_y: 0,
time: immediate ? 0 : KEYBOARD_ANIMATION_TIME,
transition: 'easeInQuad',
transition: 'easeOutQuad',
onComplete: this._hideKeyboardComplete,
onCompleteScope: this
});
@ -1092,7 +1092,7 @@ const Chrome = new Lang.Class({
} else if (y1 <= primary.y && y2 >= primary.y + primary.height) {
if (x1 <= 0)
side = Meta.Side.LEFT;
else if (x2 >= primary.x + primary.width)
else if (x2 >= global.screen_width)
side = Meta.Side.RIGHT;
else
continue;

View File

@ -39,7 +39,6 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
* in the shell core code too. */
'const stage = global.stage; ' +
/* Special lookingGlass functions */
'const inspect = Lang.bind(Main.lookingGlass, Main.lookingGlass.inspect); ' +
'const it = Main.lookingGlass.getIt(); ' +
'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ';
@ -872,7 +871,8 @@ const LookingGlass = new Lang.Class({
inspectIcon.connect('button-press-event', Lang.bind(this, function () {
let inspector = new Inspector(this);
inspector.connect('target', Lang.bind(this, function(i, target, stageX, stageY) {
this._pushResult('inspect(' + Math.round(stageX) + ', ' + Math.round(stageY) + ')', target);
this._pushResult('<inspect x:' + stageX + ' y:' + stageY + '>',
target);
}));
inspector.connect('closed', Lang.bind(this, function() {
this.actor.show();
@ -1057,10 +1057,6 @@ const LookingGlass = new Lang.Class({
this._entry.text = '';
},
inspect: function(x, y) {
return global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
},
getIt: function () {
return this._it;
},

View File

@ -81,6 +81,8 @@ let _defaultCssStylesheet = null;
let _cssStylesheet = null;
let _overridesSettings = null;
let background = null;
function _sessionUpdated() {
wm.setCustomKeybindingHandler('panel-main-menu',
KeybindingMode.NORMAL |
@ -545,20 +547,19 @@ function pushModal(actor, params) {
if (index >= 0)
popModal(actor);
});
let prevFocus = global.stage.get_key_focus();
let prevFocusDestroyId;
if (prevFocus != null) {
prevFocusDestroyId = prevFocus.connect('destroy', function() {
let curFocus = global.stage.get_key_focus();
let curFocusDestroyId;
if (curFocus != null) {
curFocusDestroyId = curFocus.connect('destroy', function() {
let index = _findModal(actor);
if (index >= 0)
modalActorFocusStack[index].prevFocus = null;
modalActorFocusStack[index].actor = null;
});
}
modalActorFocusStack.push({ actor: actor,
focus: curFocus,
destroyId: actorDestroyId,
prevFocus: prevFocus,
prevFocusDestroyId: prevFocusDestroyId,
focusDestroyId: curFocusDestroyId,
keybindingMode: keybindingMode });
keybindingMode = params.keybindingMode;
@ -599,33 +600,18 @@ function popModal(actor, timestamp) {
record.actor.disconnect(record.destroyId);
if (focusIndex == modalActorFocusStack.length - 1) {
if (record.prevFocus)
record.prevFocus.disconnect(record.prevFocusDestroyId);
if (record.focus)
record.focus.disconnect(record.focusDestroyId);
keybindingMode = record.keybindingMode;
global.stage.set_key_focus(record.prevFocus);
global.stage.set_key_focus(record.focus);
} else {
// If we have:
// global.stage.set_focus(a);
// Main.pushModal(b);
// Main.pushModal(c);
// Main.pushModal(d);
//
// then we have the stack:
// [{ prevFocus: a, actor: b },
// { prevFocus: b, actor: c },
// { prevFocus: c, actor: d }]
//
// When actor c is destroyed/popped, if we only simply remove the
// record, then the focus stack will be [a, c], rather than the correct
// [a, b]. Shift the focus stack up before removing the record to ensure
// that we get the correct result.
let t = modalActorFocusStack[modalActorFocusStack.length - 1];
if (t.prevFocus)
t.prevFocus.disconnect(t.prevFocusDestroyId);
if (t.focus)
t.focus.disconnect(t.focusDestroyId);
// Remove from the middle, shift the focus chain up
for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
modalActorFocusStack[i].prevFocus = modalActorFocusStack[i - 1].prevFocus;
modalActorFocusStack[i].prevFocusDestroyId = modalActorFocusStack[i - 1].prevFocusDestroyId;
modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus;
modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId;
modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode;
}
}

View File

@ -611,8 +611,6 @@ const Notification = new Lang.Class({
setImage: function(image) {
if (this._imageBin)
this.unsetImage();
if (!image)
return;
this._imageBin = new St.Bin();
this._imageBin.child = image;
this._imageBin.opacity = 230;

View File

@ -96,7 +96,8 @@ const ModalDialog = new Lang.Class({
y_align: St.Align.START });
this.buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
vertical: false });
visible: false,
vertical: false });
this.dialogLayout.add(this.buttonLayout,
{ expand: true,
x_align: St.Align.MIDDLE,
@ -119,6 +120,7 @@ const ModalDialog = new Lang.Class({
setButtons: function(buttons) {
this.clearButtons();
this.buttonLayout.visible = (buttons.length > 0);
for (let i = 0; i < buttons.length; i++) {
let buttonInfo = buttons[i];

View File

@ -127,42 +127,42 @@ const NotificationDaemon = new Lang.Class({
this._trayManager.manage_stage(global.stage, Main.messageTray.actor);
},
_imageForNotificationData: function(hints) {
if (hints['image-data']) {
_iconForNotificationData: function(icon, hints) {
// If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon
// and don't show a large image. There are currently many applications that use
// notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
// the 'image-data' hint. These applications don't typically pass in 'app_icon'
// argument to Notify() and actually expect the pixbuf to be shown as an icon.
// So the logic here does the right thing for this case. If both an icon and either
// one of 'image-data' or 'image-path' are specified, we show both an icon and
// a large image.
if (icon) {
if (icon.substr(0, 7) == 'file://')
return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) });
else if (icon[0] == '/') {
return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) });
} else
return new Gio.ThemedIcon({ name: icon });
} else if (hints['image-data']) {
let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = hints['image-data'];
return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha,
bitsPerSample, width, height, rowStride);
} else if (hints['image-path']) {
return new Gio.FileIcon({ file: Gio.File.new_for_path(hints['image-path']) });
} else {
let stockIcon;
switch (hints.urgency) {
case Urgency.LOW:
case Urgency.NORMAL:
stockIcon = 'gtk-dialog-info';
break;
case Urgency.CRITICAL:
stockIcon = 'gtk-dialog-error';
break;
}
return new Gio.ThemedIcon({ name: stockIcon });
}
return null;
},
_fallbackIconForNotificationData: function(hints) {
let stockIcon;
switch (hints.urgency) {
case Urgency.LOW:
case Urgency.NORMAL:
stockIcon = 'gtk-dialog-info';
break;
case Urgency.CRITICAL:
stockIcon = 'gtk-dialog-error';
break;
}
return new Gio.ThemedIcon({ name: stockIcon });
},
_iconForNotificationData: function(icon) {
if (icon) {
if (icon.substr(0, 7) == 'file://')
return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) });
else if (icon[0] == '/')
return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) });
else
return new Gio.ThemedIcon({ name: icon });
}
return null;
},
_lookupSource: function(title, pid, trayIcon) {
@ -355,8 +355,12 @@ const NotificationDaemon = new Lang.Class({
[ndata.id, ndata.icon, ndata.summary, ndata.body,
ndata.actions, ndata.hints, ndata.notification];
let gicon = this._iconForNotificationData(icon, hints);
if (notification == null) {
notification = new MessageTray.Notification(source);
notification = new MessageTray.Notification(source, summary, body,
{ gicon: gicon,
bannerMarkup: true });
ndata.notification = notification;
notification.connect('destroy', Lang.bind(this,
function(n, reason) {
@ -379,33 +383,29 @@ const NotificationDaemon = new Lang.Class({
function(n, actionId) {
this._emitActionInvoked(ndata.id, actionId);
}));
} else {
notification.update(summary, body, { gicon: gicon,
bannerMarkup: true,
clear: true });
}
let gicon = this._iconForNotificationData(icon, hints);
let gimage = this._imageForNotificationData(hints);
let image = null;
// If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon
// and don't show a large image. There are currently many applications that use
// notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
// the 'image-data' hint. These applications don't typically pass in 'app_icon'
// argument to Notify() and actually expect the pixbuf to be shown as an icon.
// So the logic here does the right thing for this case. If both an icon and either
// one of 'image-data' or 'image-path' are specified, we show both an icon and
// a large image.
if (gicon && gimage)
image = new St.Icon({ gicon: gimage });
else if (!gicon && gimage)
gicon = gimage;
else if (!gicon)
gicon = this._fallbackIconForNotificationData(hints);
notification.setImage(image);
notification.update(summary, body, { gicon: gicon,
bannerMarkup: true,
clear: true });
// We only display a large image if an icon is also specified.
if (icon && (hints['image-data'] || hints['image-path'])) {
let image = null;
if (hints['image-data']) {
let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = hints['image-data'];
image = St.TextureCache.get_default().load_from_raw(data, hasAlpha,
width, height, rowStride, notification.IMAGE_SIZE);
} else if (hints['image-path']) {
image = St.TextureCache.get_default().load_uri_async(GLib.filename_to_uri(hints['image-path'], null),
notification.IMAGE_SIZE,
notification.IMAGE_SIZE);
}
notification.setImage(image);
} else {
notification.unsetImage();
}
if (actions.length) {
notification.setUseActionIcons(hints['action-icons'] == true);
@ -435,7 +435,7 @@ const NotificationDaemon = new Lang.Class({
// of the 'transient' hint with hints['transient'] rather than hints.transient
notification.setTransient(hints['transient'] == true);
let sourceGIcon = source.useNotificationIcon ? gicon : null;
let sourceGIcon = source.useNotificationIcon ? this._iconForNotificationData(icon, hints) : null;
source.processNotification(notification, sourceGIcon);
},

View File

@ -598,11 +598,6 @@ const AppMenuButton = new Lang.Class({
return;
menu = new PopupMenu.RemoteMenu(this.actor, this._targetApp.menu, this._targetApp.action_group);
menu.connect('activate', Lang.bind(this, function() {
let win = this._targetApp.get_windows()[0];
win.check_alive(global.get_current_time());
}));
} else {
if (this.menu.isDummyQuitMenu)
return;
@ -751,9 +746,12 @@ const ActivitiesButton = new Lang.Class({
const PanelCorner = new Lang.Class({
Name: 'PanelCorner',
_init: function(side) {
_init: function(box, side) {
this._side = side;
this._box = box;
this._box.connect('style-changed', Lang.bind(this, this._boxStyleChanged));
this.actor = new St.DrawingArea({ style_class: 'panel-corner' });
this.actor.connect('style-changed', Lang.bind(this, this._styleChanged));
this.actor.connect('repaint', Lang.bind(this, this._repaint));
@ -809,12 +807,12 @@ const PanelCorner = new Lang.Class({
return children[index];
},
setStyleParent: function(box) {
_boxStyleChanged: function() {
let side = this._side;
let rtlAwareContainer = box instanceof St.BoxLayout;
let rtlAwareContainer = this._box instanceof St.BoxLayout;
if (rtlAwareContainer &&
box.get_text_direction() == Clutter.TextDirection.RTL) {
this._box.get_text_direction() == Clutter.TextDirection.RTL) {
if (this._side == St.Side.LEFT)
side = St.Side.RIGHT;
else if (this._side == St.Side.RIGHT)
@ -823,9 +821,9 @@ const PanelCorner = new Lang.Class({
let button;
if (side == St.Side.LEFT)
button = this._findLeftmostButton(box);
button = this._findLeftmostButton(this._box);
else if (side == St.Side.RIGHT)
button = this._findRightmostButton(box);
button = this._findRightmostButton(this._box);
if (button) {
if (this._button && this._buttonStyleChangedSignalId) {
@ -852,7 +850,7 @@ const PanelCorner = new Lang.Class({
// The corner doesn't support theme transitions, so override
// the .panel-button default
button.style = 'transition-duration: 0ms';
button.style = 'transition-duration: 0';
}
},
@ -865,8 +863,8 @@ const PanelCorner = new Lang.Class({
let backgroundColor = node.get_color('-panel-corner-background-color');
let borderColor = node.get_color('-panel-corner-border-color');
let overlap = borderColor.alpha != 0;
let offsetY = overlap ? 0 : borderWidth;
let noOverlap = borderColor.alpha == 0;
let offsetY = noOverlap ? borderWidth : 0;
let cr = this.actor.get_context();
cr.setOperator(Cairo.Operator.SOURCE);
@ -890,18 +888,17 @@ const PanelCorner = new Lang.Class({
Clutter.cairo_set_source_color(cr, over);
cr.fill();
if (overlap) {
let offset = borderWidth;
Clutter.cairo_set_source_color(cr, backgroundColor);
if (noOverlap)
return;
cr.save();
cr.translate(xOffsetDirection * offset, - offset);
cr.appendPath(savedPath);
cr.fill();
cr.restore();
}
let offset = borderWidth;
Clutter.cairo_set_source_color(cr, backgroundColor);
cr.$dispose();
cr.save();
cr.translate(xOffsetDirection * offset, - offset);
cr.appendPath(savedPath);
cr.fill();
cr.restore();
},
_styleChanged: function() {
@ -961,10 +958,17 @@ const Panel = new Lang.Class({
this._rightBox = new St.BoxLayout({ name: 'panelRight' });
this.actor.add_actor(this._rightBox);
this._leftCorner = new PanelCorner(St.Side.LEFT);
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL)
this._leftCorner = new PanelCorner(this._rightBox, St.Side.LEFT);
else
this._leftCorner = new PanelCorner(this._leftBox, St.Side.LEFT);
this.actor.add_actor(this._leftCorner.actor);
this._rightCorner = new PanelCorner(St.Side.RIGHT);
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL)
this._rightCorner = new PanelCorner(this._leftBox, St.Side.RIGHT);
else
this._rightCorner = new PanelCorner(this._rightBox, St.Side.RIGHT);
this.actor.add_actor(this._rightCorner.actor);
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
@ -1137,13 +1141,17 @@ const Panel = new Lang.Class({
this._sessionStyle = Main.sessionMode.panelStyle;
if (this._sessionStyle)
this._addStyleClassName(this._sessionStyle);
},
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL) {
this._leftCorner.setStyleParent(this._rightBox);
this._rightCorner.setStyleParent(this._leftBox);
} else {
this._leftCorner.setStyleParent(this._leftBox);
this._rightCorner.setStyleParent(this._rightBox);
_initBox: function(elements, box) {
for (let i = 0; i < elements.length; i++) {
let role = elements[i];
let constructor = PANEL_ITEM_IMPLEMENTATIONS[role];
if (!constructor) {
// panel icon is not supported (can happen for
// bluetooth or network)
continue;
}
}
},

View File

@ -244,21 +244,18 @@ const SystemStatusButton = new Lang.Class({
this.setIcon(iconName);
},
get icons() {
return this._box.get_children();
},
addIcon: function(gicon) {
let icon = new St.Icon({ gicon: gicon,
style_class: 'system-status-icon' });
this._box.add_actor(icon);
this.emit('icons-changed');
return icon;
},
setIcon: function(iconName) {
// Need to first add a NULL GIcon and then set icon_name, to ensure
// compatibility with -symbolic fallbacks
if (!this.mainIcon)
this.mainIcon = this.addIcon(null);
this.mainIcon.icon_name = iconName;

View File

@ -207,7 +207,6 @@ const PopupBaseMenuItem = new Lang.Class({
color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill();
cr.$dispose();
},
// This returns column widths in logical order (i.e. from the dot
@ -605,7 +604,6 @@ const PopupSliderMenuItem = new Lang.Class({
color.alpha / 255);
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
cr.fill();
cr.$dispose();
},
_startDragging: function(actor, event) {
@ -638,34 +636,20 @@ const PopupSliderMenuItem = new Lang.Class({
return true;
},
scroll: function(event) {
_onScrollEvent: function (actor, event) {
let direction = event.get_scroll_direction();
let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) {
delta = -SLIDER_SCROLL_STEP;
} else if (direction == Clutter.ScrollDirection.UP) {
delta = +SLIDER_SCROLL_STEP;
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
// Even though the slider is horizontal, use dy to match
// the UP/DOWN above.
delta = -dy / 10;
this._value = Math.max(0, this._value - SLIDER_SCROLL_STEP);
}
else if (direction == Clutter.ScrollDirection.UP) {
this._value = Math.min(1, this._value + SLIDER_SCROLL_STEP);
}
this._value = Math.min(Math.max(0, this._value + delta), 1);
this._slider.queue_repaint();
this.emit('value-changed', this._value);
},
_onScrollEvent: function(actor, event) {
this.scroll(event);
},
_motionEvent: function(actor, event) {
let absX, absY;
[absX, absY] = event.get_coords();

View File

@ -1,11 +1,9 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GdkPixbuf = imports.gi.GdkPixbuf;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const FileUtils = imports.misc.fileUtils;
const Search = imports.ui.search;
@ -189,18 +187,18 @@ const RemoteSearchProvider = new Lang.Class({
},
createIcon: function(size, meta) {
let gicon;
if (meta['gicon']) {
gicon = Gio.icon_new_for_string(meta['gicon']);
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
icon_size: size });
} else if (meta['icon-data']) {
let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = meta['icon-data'];
gicon = Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha,
bitsPerSample, width, height, rowStride);
let textureCache = St.TextureCache.get_default();
return textureCache.load_from_raw(data, hasAlpha,
width, height, rowStride, size);
}
return new St.Icon({ gicon: gicon,
icon_size: size });
return null;
},
_getResultsFinished: function(results, error) {

View File

@ -25,7 +25,6 @@ const Util = imports.misc.util;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled';
const LOCK_DELAY_KEY = 'lock-delay';
const CURTAIN_SLIDE_TIME = 0.3;
// fraction of screen height the arrow must reach before completing
@ -637,11 +636,7 @@ const ScreenShield = new Lang.Class({
let lightboxWasShown = this._lightbox.shown;
this._lightbox.hide();
// GLib.get_monotonic_time() returns microseconds, convert to seconds
let elapsedTime = (GLib.get_monotonic_time() - this._activationTime) / 1000000;
let shouldLock = lightboxWasShown &&
this._settings.get_boolean(LOCK_ENABLED_KEY) &&
(elapsedTime >= this._settings.get_uint(LOCK_DELAY_KEY));
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
if (shouldLock || this._isLocked) {
this.lock(false);
} else if (this._isActive) {
@ -760,10 +755,6 @@ const ScreenShield = new Lang.Class({
},
_resetLockScreen: function(animateLockScreen, animateLockDialog) {
if (this._lockScreenState == MessageTray.State.SHOWING ||
this._lockScreenState == MessageTray.State.SHOWN)
return;
this._ensureLockScreen();
this._lockDialogGroup.scale_x = 1;
this._lockDialogGroup.scale_y = 1;

View File

@ -1,272 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const ScreenshotIface = <interface name="org.gnome.Shell.Screenshot">
<method name="ScreenshotArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="Screenshot">
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="SelectArea">
<arg type="i" direction="out" name="x"/>
<arg type="i" direction="out" name="y"/>
<arg type="i" direction="out" name="width"/>
<arg type="i" direction="out" name="height"/>
</method>
<method name="FlashArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
</method>
</interface>;
const ScreenshotService = new Lang.Class({
Name: 'ScreenshotService',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
if (flash && result) {
let flashspot = new Flashspot(area);
flashspot.fire();
}
let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
invocation.return_value(retval);
},
ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, flash, filename, callback] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
ScreenshotWindowAsync : function (params, invocation) {
let [include_frame, include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_window (include_frame, include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
ScreenshotAsync : function (params, invocation) {
let [include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot(include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
SelectAreaAsync: function (params, invocation) {
let selectArea = new SelectArea();
selectArea.show();
selectArea.connect('finished', Lang.bind(this,
function(selectArea, areaRectangle) {
if (areaRectangle) {
let retval = GLib.Variant.new('(iiii)',
[areaRectangle.x, areaRectangle.y,
areaRectangle.width, areaRectangle.height]);
invocation.return_value(retval);
} else {
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
"Operation was cancelled");
}
}));
},
FlashArea: function(x, y, width, height) {
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire();
}
});
const SelectArea = new Lang.Class({
Name: 'SelectArea',
_init: function() {
this._startX = -1;
this._startY = -1;
this._lastX = 0;
this._lastY = 0;
this._initRubberbandColors();
this._group = new St.Widget({ visible: false,
reactive: true,
x: 0,
y: 0 });
Main.uiGroup.add_actor(this._group);
this._group.connect('button-press-event',
Lang.bind(this, this._onButtonPress));
this._group.connect('button-release-event',
Lang.bind(this, this._onButtonRelease));
this._group.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._group.connect('motion-event',
Lang.bind(this, this._onMotionEvent));
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL });
this._group.add_constraint(constraint);
this._rubberband = new Clutter.Rectangle({ color: this._background,
has_border: true,
border_width: 1,
border_color: this._border });
this._group.add_actor(this._rubberband);
},
show: function() {
if (!Main.pushModal(this._group) || this._group.visible)
return;
global.set_cursor(Shell.Cursor.CROSSHAIR);
this._group.visible = true;
},
_initRubberbandColors: function() {
function colorFromRGBA(rgba) {
return new Clutter.Color({ red: rgba.red * 255,
green: rgba.green * 255,
blue: rgba.blue * 255,
alpha: rgba.alpha * 255 });
}
let path = new Gtk.WidgetPath();
path.append_type(Gtk.IconView);
let context = new Gtk.StyleContext();
context.set_path(path);
context.add_class('rubberband');
this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
},
_getGeometry: function() {
return { x: Math.min(this._startX, this._lastX),
y: Math.min(this._startY, this._lastY),
width: Math.abs(this._startX - this._lastX),
height: Math.abs(this._startY - this._lastY) };
},
_onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.Escape)
this._destroy(null, false);
return;
},
_onMotionEvent: function(actor, event) {
if (this._startX == -1 || this._startY == -1)
return false;
[this._lastX, this._lastY] = event.get_coords();
let geometry = this._getGeometry();
this._rubberband.set_position(geometry.x, geometry.y);
this._rubberband.set_size(geometry.width, geometry.height);
return false;
},
_onButtonPress: function(actor, event) {
[this._startX, this._startY] = event.get_coords();
this._rubberband.set_position(this._startX, this._startY);
return false;
},
_onButtonRelease: function(actor, event) {
this._destroy(this._getGeometry(), true);
return false;
},
_destroy: function(geometry, fade) {
Tweener.addTween(this._group,
{ opacity: 0,
time: fade ? 0.2 : 0,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
Main.popModal(this._group);
this._group.destroy();
global.unset_cursor();
this.emit('finished', geometry);
})
});
}
});
Signals.addSignalMethods(SelectArea.prototype);
const FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds
const Flashspot = new Lang.Class({
Name: 'Flashspot',
Extends: Lightbox.Lightbox,
_init: function(area) {
this.parent(Main.uiGroup, { inhibitEvents: true,
width: area.width,
height: area.height });
this.actor.style_class = 'flashspot';
this.actor.set_position(area.x, area.y);
},
fire: function() {
this.actor.show();
this.actor.opacity = 255;
Tweener.addTween(this.actor,
{ opacity: 0,
time: FLASHSPOT_ANIMATION_OUT_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.destroy();
})
});
}
});

View File

@ -30,6 +30,5 @@ const HorizontalSeparator = new Lang.Class({
cr.setSource(pattern);
cr.rectangle(margin, gradientOffset, gradientWidth, gradientHeight);
cr.fill();
cr.$dispose();
}
});

View File

@ -9,8 +9,8 @@ const Config = imports.misc.config;
const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils;
const Flashspot = imports.ui.flashspot;
const Main = imports.ui.main;
const Screenshot = imports.ui.screenshot;
const GnomeShellIface = <interface name="org.gnome.Shell">
<method name="Eval">
@ -18,6 +18,34 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="b" direction="out" name="success" />
<arg type="s" direction="out" name="result" />
</method>
<method name="ScreenshotArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="Screenshot">
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="FlashArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
</method>
<property name="Mode" type="s" access="read" />
<property name="OverviewActive" type="b" access="readwrite" />
<property name="ShellVersion" type="s" access="read" />
@ -48,7 +76,6 @@ const GnomeShell = new Lang.Class({
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this._extensionsSerivce = new GnomeShellExtensions();
this._screenshotService = new Screenshot.ScreenshotService();
},
/**
@ -84,6 +111,82 @@ const GnomeShell = new Lang.Class({
return [success, returnValue];
},
_onScreenshotComplete: function(obj, result, area, flash, invocation) {
if (flash && result) {
let flashspot = new Flashspot.Flashspot(area);
flashspot.fire();
}
let retval = GLib.Variant.new('(b)', [result]);
invocation.return_value(retval);
},
/**
* ScreenshotArea:
* @x: The X coordinate of the area
* @y: The Y coordinate of the area
* @width: The width of the area
* @height: The height of the area
* @flash: Whether to flash the area or not
* @filename: The filename for the screenshot
*
* Takes a screenshot of the passed in area and saves it
* in @filename as png image, it returns a boolean
* indicating whether the operation was successful or not.
*
*/
ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, flash, filename, callback] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
/**
* ScreenshotWindow:
* @include_frame: Whether to include the frame or not
* @include_cursor: Whether to include the cursor image or not
* @flash: Whether to flash the window area or not
* @filename: The filename for the screenshot
*
* Takes a screenshot of the focused window (optionally omitting the frame)
* and saves it in @filename as png image, it returns a boolean
* indicating whether the operation was successful or not.
*
*/
ScreenshotWindowAsync : function (params, invocation) {
let [include_frame, include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_window (include_frame, include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
/**
* Screenshot:
* @filename: The filename for the screenshot
* @include_cursor: Whether to include the cursor image or not
* @flash: Whether to flash the screen or not
*
* Takes a screenshot of the whole screen and saves it
* in @filename as png image, it returns a boolean
* indicating whether the operation was successful or not.
*
*/
ScreenshotAsync : function (params, invocation) {
let [include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot(include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
FlashArea: function(x, y, width, height) {
let flashspot = new Flashspot.Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire();
},
Mode: global.session_mode,
get OverviewActive() {

View File

@ -446,5 +446,10 @@ const PinNotification = new Lang.Class({
return this._entry.clutter_text.text.length == 6;
else
return true;
},
grabFocus: function(lockTray) {
this.parent(lockTray);
global.stage.set_key_focus(this._entry);
}
});

View File

@ -366,13 +366,6 @@ const InputSourceIndicator = new Lang.Class({
this._sessionUpdated();
this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop');
this._sourcesPerWindow = false;
this._focusWindowNotifyId = 0;
this._overviewShowingId = 0;
this._overviewHiddenId = 0;
this._settings.connect('changed::per-window', Lang.bind(this, this._sourcesPerWindowChanged));
this._sourcesPerWindowChanged();
},
_sessionUpdated: function() {
@ -438,8 +431,6 @@ const InputSourceIndicator = new Lang.Class({
this._mruSources = currentSource.concat(this._mruSources);
break;
}
this._changePerWindowSource();
},
_inputSourcesChanged: function() {
@ -479,8 +470,6 @@ const InputSourceIndicator = new Lang.Class({
let is = new InputSource(type, id, displayName, shortName, i);
is.connect('activate', Lang.bind(this, function() {
if (this._currentSource.index == is.index)
return;
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
GLib.Variant.new_uint32(is.index));
}));
@ -713,82 +702,6 @@ const InputSourceIndicator = new Lang.Class({
}
},
_getNewInputSource: function(current) {
for (let i in this._inputSources) {
let is = this._inputSources[i];
if (is.type == current.type &&
is.id == current.id)
return is;
}
return this._currentSource;
},
_getCurrentWindow: function() {
if (Main.overview.visible)
return Main.overview;
else
return global.display.focus_window;
},
_setPerWindowInputSource: function() {
let window = this._getCurrentWindow();
if (!window)
return;
if (!window._inputSources) {
window._inputSources = this._inputSources;
window._currentSource = this._currentSource;
} else if (window._inputSources == this._inputSources) {
window._currentSource.activate();
} else {
window._inputSources = this._inputSources;
window._currentSource = this._getNewInputSource(window._currentSource);
window._currentSource.activate();
}
},
_sourcesPerWindowChanged: function() {
this._sourcesPerWindow = this._settings.get_boolean('per-window');
if (this._sourcesPerWindow && this._focusWindowNotifyId == 0) {
this._focusWindowNotifyId = global.display.connect('notify::focus-window',
Lang.bind(this, this._setPerWindowInputSource));
this._overviewShowingId = Main.overview.connect('showing',
Lang.bind(this, this._setPerWindowInputSource));
this._overviewHiddenId = Main.overview.connect('hidden',
Lang.bind(this, this._setPerWindowInputSource));
} else if (!this._sourcesPerWindow && this._focusWindowNotifyId != 0) {
global.display.disconnect(this._focusWindowNotifyId);
this._focusWindowNotifyId = 0;
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
Main.overview.disconnect(this._overviewHiddenId);
this._overviewHiddenId = 0;
let windows = global.get_window_actors().map(function(w) {
return w.meta_window;
});
for (let i = 0; i < windows.length; ++i) {
delete windows[i]._inputSources;
delete windows[i]._currentSource;
}
delete Main.overview._inputSources;
delete Main.overview._currentSource;
}
},
_changePerWindowSource: function() {
if (!this._sourcesPerWindow)
return;
let window = this._getCurrentWindow();
if (!window)
return;
window._inputSources = this._inputSources;
window._currentSource = this._currentSource;
},
_containerGetPreferredWidth: function(container, for_height, alloc) {
// Here, and in _containerGetPreferredHeight, we need to query
// for the height of all children, but we ignore the results

View File

@ -10,31 +10,6 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const VolumeMenu = imports.ui.status.volume;
const FakeStatusIcon = new Lang.Class({
Name: 'FakeStatusIcon',
_init: function(button) {
this.actor = new St.BoxLayout({ style_class: 'panel-status-button-box' });
this._button = button;
this._button.connect('icons-updated', Lang.bind(this, this._reconstructIcons));
this._button.actor.bind_property('visible', this.actor, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._reconstructIcons();
},
_reconstructIcons: function() {
this.actor.destroy_all_children();
this._button.icons.forEach(Lang.bind(this, function(icon) {
let newIcon = new St.Icon({ style_class: 'system-status-icon' });
icon.bind_property('gicon', newIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
icon.bind_property('visible', newIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this.actor.add_actor(newIcon);
}));
}
});
const Indicator = new Lang.Class({
Name: 'LockScreenMenuIndicator',
Extends: PanelMenu.SystemStatusButton,
@ -43,20 +18,41 @@ const Indicator = new Lang.Class({
this.parent(null, _("Volume, network, battery"));
this._box.style_class = 'lock-screen-status-button-box';
this._volumeControl = VolumeMenu.getMixerControl();
this._volumeMenu = new VolumeMenu.VolumeMenu(this._volumeControl);
this.menu.addMenuItem(this._volumeMenu);
this._volume = Main.panel.statusArea.volume;
if (this._volume) {
this._volumeIcon = this.addIcon(null);
this._volume.mainIcon.bind_property('gicon', this._volumeIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._volume.mainIcon.bind_property('visible', this._volumeIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._volume = new FakeStatusIcon(Main.panel.statusArea.volume);
this._box.add_child(this._volume.actor);
// Network may not exist if the user doesn't have NetworkManager
if (Main.panel.statusArea.network) {
this._network = new FakeStatusIcon(Main.panel.statusArea.network);
this._box.add_child(this._network.actor);
this._volumeControl = VolumeMenu.getMixerControl();
this._volumeMenu = new VolumeMenu.VolumeMenu(this._volumeControl);
this.menu.addMenuItem(this._volumeMenu);
}
this._battery = new FakeStatusIcon(Main.panel.statusArea.battery);
this._box.add_child(this._battery.actor);
this._network = Main.panel.statusArea.network;
if (this._network) {
this._networkIcon = this.addIcon(null);
this._network.mainIcon.bind_property('gicon', this._networkIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._network.mainIcon.bind_property('visible', this._networkIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._networkSecondaryIcon = this.addIcon(null);
this._network.secondaryIcon.bind_property('gicon', this._networkSecondaryIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._network.secondaryIcon.bind_property('visible', this._networkSecondaryIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
}
this._battery = Main.panel.statusArea.battery;
if (this._battery) {
this._batteryIcon = this.addIcon(null);
this._battery.mainIcon.bind_property('gicon', this._batteryIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._battery.mainIcon.bind_property('visible', this._batteryIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
}
}
});

View File

@ -8,14 +8,6 @@ const NMClient = imports.gi.NMClient;
const Signals = imports.signals;
const St = imports.gi.St;
// Some of the new code depends on as-yet-unreleased NM
var NMGtk;
try {
NMGtk = imports.gi.NMGtk;
} catch(e) {
NMGtk = null;
}
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
@ -147,6 +139,46 @@ const NMNetworkMenuItem = new Lang.Class({
}
});
const NMWiredSectionTitleMenuItem = new Lang.Class({
Name: 'NMWiredSectionTitleMenuItem',
Extends: PopupMenu.PopupSwitchMenuItem,
_init: function(label, params) {
params = params || { };
params.style_class = 'popup-subtitle-menu-item';
this.parent(label, false, params);
},
updateForDevice: function(device) {
if (device) {
this._device = device;
this.setStatus(device.getStatusLabel());
this.setToggleState(device.connected);
} else
this.setStatus('');
},
activate: function(event) {
this.parent(event);
if (!this._device) {
log('Section title activated when there is more than one device, should be non reactive');
return;
}
let newState = this._switch.state;
let ok;
if (newState)
ok = this._device.activate();
else
ok = this._device.deactivate();
if (!ok)
this._switch.setToggleState(false);
}
});
const NMWirelessSectionTitleMenuItem = new Lang.Class({
Name: 'NMWirelessSectionTitleMenuItem',
Extends: PopupMenu.PopupSwitchMenuItem,
@ -319,7 +351,7 @@ const NMDevice = new Lang.Class({
this._autoConnectionItem = null;
this._overflowItem = null;
this.statusItem = new PopupMenu.PopupSwitchMenuItem('', this.connected, { style_class: 'popup-subtitle-menu-item' });
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
let ok;
if (state)
@ -480,11 +512,6 @@ const NMDevice = new Lang.Class({
}
},
syncDescription: function() {
if (this.device._description)
this.statusItem.label.text = this.device._description;
},
// protected
_createAutomaticConnection: function() {
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
@ -616,6 +643,25 @@ const NMDevice = new Lang.Class({
this.statusItem.setStatus(this.getStatusLabel());
this.emit('state-changed');
},
_getDescription: function() {
let dev_product = this.device.get_product();
let dev_vendor = this.device.get_vendor();
if (!dev_product || !dev_vendor)
return '';
let product = Util.fixupPCIDescription(dev_product);
let vendor = Util.fixupPCIDescription(dev_vendor);
let out = '';
// Another quick hack; if all of the fixed up vendor string
// is found in product, ignore the vendor.
if (product.indexOf(vendor) == -1)
out += vendor + ' ';
out += product;
return out;
}
});
@ -646,7 +692,6 @@ const NMDeviceWired = new Lang.Class({
Extends: NMDeviceSimple,
_init: function(client, device, connections) {
device._description = _("Wired");
this._autoConnectionName = _("Auto Ethernet");
this.category = NMConnectionCategory.WIRED;
@ -674,7 +719,6 @@ const NMDeviceModem = new Lang.Class({
_init: function(client, device, connections) {
let is_wwan = false;
device._description = _("Mobile broadband");
this._enabled = true;
this.mobileDevice = null;
this._connectionType = 'ppp';
@ -793,7 +837,6 @@ const NMDeviceBluetooth = new Lang.Class({
Extends: NMDevice,
_init: function(client, device, connections) {
device._description = _("Bluetooth");
this._autoConnectionName = this._makeConnectionName(device);
device.connect('notify::name', Lang.bind(this, this._updateAutoConnectionName));
@ -839,6 +882,10 @@ const NMDeviceBluetooth = new Lang.Class({
this._clearSection();
this._queueCreateSection();
this._updateStatusItem();
},
_getDescription: function() {
return this.device.name || _("Bluetooth");
}
});
@ -1620,14 +1667,15 @@ const NMApplet = new Lang.Class({
this._mobileUpdateId = 0;
this._mobileUpdateDevice = null;
this._nmDevices = [];
this._devices = { };
this._devices.wired = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
item: new NMWiredSectionTitleMenuItem(_("Wired"))
};
this._devices.wired.section.addMenuItem(this._devices.wired.item);
this._devices.wired.section.actor.hide();
this.menu.addMenuItem(this._devices.wired.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@ -1635,7 +1683,7 @@ const NMApplet = new Lang.Class({
this._devices.wireless = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
item: this._makeToggleItem('wireless', _("Wi-Fi"))
item: this._makeToggleItem('wireless', _("Wireless"))
};
this._devices.wireless.section.addMenuItem(this._devices.wireless.item);
this._devices.wireless.section.actor.hide();
@ -1645,7 +1693,9 @@ const NMApplet = new Lang.Class({
this._devices.wwan = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
item: this._makeToggleItem('wwan', _("Mobile broadband"))
};
this._devices.wwan.section.addMenuItem(this._devices.wwan.item);
this._devices.wwan.section.actor.hide();
this.menu.addMenuItem(this._devices.wwan.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@ -1730,23 +1780,16 @@ const NMApplet = new Lang.Class({
section.actor.hide();
else {
section.actor.show();
// Sync the relation between the section title
// item (the one with the airplane mode switch)
// and the individual device switches
if (item) {
if (devices.length == 1) {
let dev = devices[0];
dev.statusItem.actor.hide();
item.updateForDevice(dev);
} else {
devices.forEach(function(dev) {
dev.statusItem.actor.show();
});
// remove status text from the section title item
item.updateForDevice(null);
}
if (devices.length == 1) {
let dev = devices[0];
dev.statusItem.actor.hide();
item.updateForDevice(dev);
} else {
devices.forEach(function(dev) {
dev.statusItem.actor.show();
});
// remove status text from the section title item
item.updateForDevice(null);
}
}
},
@ -1754,9 +1797,8 @@ const NMApplet = new Lang.Class({
_readDevices: function() {
let devices = this._client.get_devices() || [ ];
for (let i = 0; i < devices.length; ++i) {
this._deviceAdded(this._client, devices[i], true);
this._deviceAdded(this._client, devices[i]);
}
this._syncDeviceNames();
},
_notifyForDevice: function(device, iconName, title, text, urgency) {
@ -1804,23 +1846,7 @@ const NMApplet = new Lang.Class({
return wrapper;
},
_syncDeviceNames: function() {
if (NMGtk) {
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
device._description = names[i];
device._delegate.syncDescription();
}
} else {
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
device._delegate.syncDescription();
}
}
},
_deviceAdded: function(client, device, skipSyncDeviceNames) {
_deviceAdded: function(client, device) {
if (device._delegate) {
// already seen, not adding again
return;
@ -1831,14 +1857,10 @@ const NMApplet = new Lang.Class({
let section = this._devices[wrapper.category].section;
let devices = this._devices[wrapper.category].devices;
section.addMenuItem(wrapper.statusItem);
section.addMenuItem(wrapper.section);
section.addMenuItem(wrapper.section, 1);
section.addMenuItem(wrapper.statusItem, 1);
devices.push(wrapper);
this._nmDevices.push(device);
if (!skipSyncDeviceNames)
this._syncDeviceNames();
this._syncSectionTitle(wrapper.category);
}
},
@ -1856,10 +1878,6 @@ const NMApplet = new Lang.Class({
let pos = devices.indexOf(wrapper);
devices.splice(pos, 1);
pos = this._nmDevices.indexOf(device);
this._nmDevices.splice(pos, 1);
this._syncDeviceNames();
this._syncSectionTitle(wrapper.category)
},

View File

@ -7,7 +7,7 @@ const St = imports.gi.St;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const BUS_NAME = 'org.gnome.SettingsDaemon.Power';
const BUS_NAME = 'org.gnome.SettingsDaemon';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
const UPDeviceType = {
@ -61,7 +61,7 @@ const Indicator = new Lang.Class({
this._primaryDeviceId = null;
this._batteryItem = new PopupMenu.PopupMenuItem('', { reactive: false });
this._primaryPercentage = new St.Label({ style_class: 'popup-battery-percentage' });
this._primaryPercentage = new St.Label();
this._batteryItem.addActor(this._primaryPercentage, { align: St.Align.END });
this.menu.addMenuItem(this._batteryItem);
@ -183,8 +183,7 @@ const DeviceItem = new Lang.Class({
this._box.add_actor(this._label);
this.addActor(this._box);
let percentLabel = new St.Label({ text: C_("percent of battery remaining", "%d%%").format(Math.round(percentage)),
style_class: 'popup-battery-percentage' });
let percentLabel = new St.Label({ text: C_("percent of battery remaining", "%d%%").format(Math.round(percentage)) });
this.addActor(percentLabel, { align: St.Align.END });
//FIXME: ideally we would like to expose this._label and percentLabel
this.actor.label_actor = percentLabel;

View File

@ -5,7 +5,6 @@ const Lang = imports.lang;
const Gio = imports.gi.Gio;
const Gvc = imports.gi.Gvc;
const St = imports.gi.St;
const Signals = imports.signals;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
@ -27,134 +26,79 @@ function getMixerControl() {
return _mixerControl;
}
const StreamSlider = new Lang.Class({
Name: 'StreamSlider',
const VolumeMenu = new Lang.Class({
Name: 'VolumeMenu',
Extends: PopupMenu.PopupMenuSection,
_init: function(control) {
this.parent();
this.hasHeadphones = false;
_init: function(control, title) {
this._control = control;
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));
this._control.connect('default-sink-changed', Lang.bind(this, this._readOutput));
this._control.connect('default-source-changed', Lang.bind(this, this._readInput));
this._control.connect('stream-added', Lang.bind(this, this._maybeShowInput));
this._control.connect('stream-removed', Lang.bind(this, this._maybeShowInput));
this._volumeMax = this._control.get_vol_max_norm();
this.item = new PopupMenu.PopupMenuSection();
this._output = null;
this._outputVolumeId = 0;
this._outputMutedId = 0;
/* Translators: This is the label for audio volume */
this._outputTitle = new PopupMenu.PopupMenuItem(_("Volume"), { reactive: false });
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.addMenuItem(this._outputTitle);
this.addMenuItem(this._outputSlider);
this._title = new PopupMenu.PopupMenuItem(title, { reactive: false });
this._slider = new PopupMenu.PopupSliderMenuItem(0);
this._slider.connect('value-changed', Lang.bind(this, this._sliderChanged));
this._slider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.item.addMenuItem(this._title);
this.item.addMenuItem(this._slider);
this._input = null;
this._inputVolumeId = 0;
this._inputMutedId = 0;
this._inputTitle = new PopupMenu.PopupMenuItem(_("Microphone"), { reactive: false });
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.addMenuItem(this._inputTitle);
this.addMenuItem(this._inputSlider);
this._stream = null;
this._shouldShow = true;
this._onControlStateChanged();
},
get stream() {
return this._stream;
},
scroll: function(direction) {
let currentVolume = this._output.volume;
set stream(stream) {
if (this._stream) {
this._disconnectStream(this._stream);
if (direction == Clutter.ScrollDirection.DOWN) {
let prev_muted = this._output.is_muted;
this._output.volume = Math.max(0, currentVolume - this._volumeMax * VOLUME_ADJUSTMENT_STEP);
if (this._output.volume < 1) {
this._output.volume = 0;
if (!prev_muted)
this._output.change_is_muted(true);
}
this._output.push_volume();
}
else if (direction == Clutter.ScrollDirection.UP) {
this._output.volume = Math.min(this._volumeMax, currentVolume + this._volumeMax * VOLUME_ADJUSTMENT_STEP);
this._output.change_is_muted(false);
this._output.push_volume();
}
this._stream = stream;
this._notifyVolumeChange();
},
if (this._stream) {
this._connectStream(this._stream);
this._updateVolume();
_onControlStateChanged: function() {
if (this._control.get_state() == Gvc.MixerControlState.READY) {
this._readOutput();
this._readInput();
this._maybeShowInput();
} else {
this.emit('stream-updated');
this.emit('icon-changed', null);
}
this._updateVisibility();
},
_disconnectStream: function(stream) {
stream.disconnect(this._mutedChangedId);
this._mutedChangedId = 0;
stream.disconnect(this._volumeChangedId);
this._volumeChangedId = 0;
},
_connectStream: function(stream) {
this._mutedChangedId = stream.connect('notify::is-muted', Lang.bind(this, this._updateVolume));
this._volumeChangedId = stream.connect('notify::volume', Lang.bind(this, this._updateVolume));
},
_shouldBeVisible: function() {
return this._stream != null;
},
_updateVisibility: function() {
let visible = this._shouldBeVisible();
this._title.actor.visible = visible;
this._slider.actor.visible = visible;
},
scroll: function(event) {
this._slider.scroll(event);
},
setValue: function(value) {
// piggy-back off of sliderChanged
this._slider.setValue(value);
},
_sliderChanged: function(slider, value, property) {
if (!this._stream)
return;
let volume = value * this._control.get_vol_max_norm();
let prevMuted = this._stream.is_muted;
if (volume < 1) {
this._stream.volume = 0;
if (!prevMuted)
this._stream.change_is_muted(true);
} else {
this._stream.volume = volume;
if (prevMuted)
this._stream.change_is_muted(false);
}
this._stream.push_volume();
},
_notifyVolumeChange: function() {
global.cancel_theme_sound(VOLUME_NOTIFY_ID);
global.play_theme_sound(VOLUME_NOTIFY_ID, 'audio-volume-change');
},
_updateVolume: function() {
let muted = this._stream.is_muted;
this._slider.setValue(muted ? 0 : (this._stream.volume / this._control.get_vol_max_norm()));
this.emit('stream-updated');
},
getIcon: function() {
if (!this._stream)
return null;
let volume = this._stream.volume;
if (this._stream.is_muted || volume <= 0) {
return 'audio-volume-muted-symbolic';
} else {
let n = Math.floor(3 * volume / this._control.get_vol_max_norm()) + 1;
if (n < 2)
return 'audio-volume-low-symbolic';
if (n >= 3)
return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
}
}
});
Signals.addSignalMethods(StreamSlider.prototype);
const OutputStreamSlider = new Lang.Class({
Name: 'OutputStreamSlider',
Extends: StreamSlider,
_connectStream: function(stream) {
this.parent(stream);
this._portChangedId = stream.connect('notify::port', Lang.bind(this, this._portChanged));
this._portChanged();
},
_findHeadphones: function(sink) {
@ -173,41 +117,60 @@ const OutputStreamSlider = new Lang.Class({
return false;
},
_disconnectStream: function(stream) {
this.parent(stream);
stream.disconnect(this._portChangedId);
this._portChangedId = 0;
},
_portChanged: function() {
let hasHeadphones = this._findHeadphones(this._stream);
if (hasHeadphones != this._hasHeadphones) {
this._hasHeadphones = hasHeadphones;
this.emit('headphones-changed', this._hasHeadphones);
}
}
});
const InputStreamSlider = new Lang.Class({
Name: 'InputStreamSlider',
Extends: StreamSlider,
_init: function(control, title) {
this.parent(control, title);
this._control.connect('stream-added', Lang.bind(this, this._maybeShowInput));
this._control.connect('stream-removed', Lang.bind(this, this._maybeShowInput));
this.hasHeadphones = this._findHeadphones(this._output);
this.emit('headphones-changed');
},
_connectStream: function(stream) {
this.parent(stream);
this._maybeShowInput();
_readOutput: function() {
if (this._outputVolumeId) {
this._output.disconnect(this._outputVolumeId);
this._output.disconnect(this._outputMutedId);
this._output.disconnect(this._outputPortId);
this._outputVolumeId = 0;
this._outputMutedId = 0;
this._outputPortId = 0;
}
this._output = this._control.get_default_sink();
if (this._output) {
this._outputMutedId = this._output.connect('notify::is-muted', Lang.bind(this, this._mutedChanged, '_output'));
this._outputVolumeId = this._output.connect('notify::volume', Lang.bind(this, this._volumeChanged, '_output'));
this._outputPortId = this._output.connect('notify::port', Lang.bind(this, this._portChanged));
this._mutedChanged(null, null, '_output');
this._volumeChanged(null, null, '_output');
this._portChanged();
} else {
this.hasHeadphones = false;
this._outputSlider.setValue(0);
this.emit('icon-changed', 'audio-volume-muted-symbolic');
}
},
_readInput: function() {
if (this._inputVolumeId) {
this._input.disconnect(this._inputVolumeId);
this._input.disconnect(this._inputMutedId);
this._inputVolumeId = 0;
this._inputMutedId = 0;
}
this._input = this._control.get_default_source();
if (this._input) {
this._inputMutedId = this._input.connect('notify::is-muted', Lang.bind(this, this._mutedChanged, '_input'));
this._inputVolumeId = this._input.connect('notify::volume', Lang.bind(this, this._volumeChanged, '_input'));
this._mutedChanged (null, null, '_input');
this._volumeChanged (null, null, '_input');
} else {
this._inputTitle.actor.hide();
this._inputSlider.actor.hide();
}
},
_maybeShowInput: function() {
// only show input widgets if any application is recording audio
let showInput = false;
let recordingApps = this._control.get_source_outputs();
if (this._stream && recordingApps) {
if (this._input && recordingApps) {
for (let i = 0; i < recordingApps.length; i++) {
let outputStream = recordingApps[i];
let id = outputStream.get_application_id();
@ -220,70 +183,63 @@ const InputStreamSlider = new Lang.Class({
}
}
this._showInput = showInput;
this._updateVisibility();
this._inputTitle.actor.visible = showInput;
this._inputSlider.actor.visible = showInput;
},
_shouldBeVisible: function() {
return this.parent() && this._showInput;
}
});
const VolumeMenu = new Lang.Class({
Name: 'VolumeMenu',
Extends: PopupMenu.PopupMenuSection,
_init: function(control) {
this.parent();
this.hasHeadphones = false;
this._control = control;
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));
this._control.connect('default-sink-changed', Lang.bind(this, this._readOutput));
this._control.connect('default-source-changed', Lang.bind(this, this._readInput));
/* Translators: This is the label for audio volume */
this._output = new OutputStreamSlider(this._control, _("Volume"));
this._output.connect('stream-updated', Lang.bind(this, function() {
this.emit('icon-changed');
}));
this._output.connect('headphones-changed', Lang.bind(this, function(stream, value) {
this.emit('headphones-changed', value);
}));
this.addMenuItem(this._output.item);
this._input = new InputStreamSlider(this._control, _("Microphone"));
this.addMenuItem(this._input.item);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._onControlStateChanged();
},
scroll: function(event) {
this._output.scroll(event);
},
_onControlStateChanged: function() {
if (this._control.get_state() == Gvc.MixerControlState.READY) {
this._readInput();
this._readOutput();
_volumeToIcon: function(volume) {
if (volume <= 0) {
return 'audio-volume-muted-symbolic';
} else {
this.emit('icon-changed');
let n = Math.floor(3 * volume / this._volumeMax) + 1;
if (n < 2)
return 'audio-volume-low-symbolic';
if (n >= 3)
return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
}
},
_readOutput: function() {
this._output.stream = this._control.get_default_sink();
_sliderChanged: function(slider, value, property) {
if (this[property] == null) {
log ('Volume slider changed for %s, but %s does not exist'.format(property, property));
return;
}
let volume = value * this._volumeMax;
let prev_muted = this[property].is_muted;
if (volume < 1) {
this[property].volume = 0;
if (!prev_muted)
this[property].change_is_muted(true);
} else {
this[property].volume = volume;
if (prev_muted)
this[property].change_is_muted(false);
}
this[property].push_volume();
},
_readInput: function() {
this._input.stream = this._control.get_default_source();
_notifyVolumeChange: function() {
global.cancel_theme_sound(VOLUME_NOTIFY_ID);
global.play_theme_sound(VOLUME_NOTIFY_ID, 'audio-volume-change');
},
getIcon: function() {
return this._output.getIcon();
_mutedChanged: function(object, param_spec, property) {
let muted = this[property].is_muted;
let slider = this[property+'Slider'];
slider.setValue(muted ? 0 : (this[property].volume / this._volumeMax));
if (property == '_output') {
if (muted)
this.emit('icon-changed', 'audio-volume-muted-symbolic');
else
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
}
},
_volumeChanged: function(object, param_spec, property) {
this[property+'Slider'].setValue(this[property].volume / this._volumeMax);
if (property == '_output' && !this._output.is_muted)
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
}
});
@ -296,13 +252,13 @@ const Indicator = new Lang.Class({
this._control = getMixerControl();
this._volumeMenu = new VolumeMenu(this._control);
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu) {
let icon = this._volumeMenu.getIcon();
this.actor.visible = (icon != null);
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
this._hasPulseAudio = (icon != null);
this.setIcon(icon);
this._syncVisibility();
}));
this._volumeMenu.connect('headphones-changed', Lang.bind(this, function(menu, value) {
this._headphoneIcon.visible = value;
this._volumeMenu.connect('headphones-changed', Lang.bind(this, function() {
this._syncVisibility();
}));
this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'headphones-symbolic' }));
@ -316,7 +272,13 @@ const Indicator = new Lang.Class({
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
},
_syncVisibility: function() {
this.actor.visible = this._hasPulseAudio;
this.mainIcon.visible = this._hasPulseAudio;
this._headphoneIcon.visible = this._hasPulseAudio && this._volumeMenu.hasHeadphones;
},
_onScrollEvent: function(actor, event) {
this._volumeMenu.scroll(event);
this._volumeMenu.scroll(event.get_scroll_direction());
}
});

View File

@ -637,6 +637,5 @@ function drawArrow(area, side) {
Clutter.cairo_set_source_color(cr, bodyColor);
cr.fill();
cr.$dispose();
}

View File

@ -198,23 +198,18 @@ const UnlockDialog = new Lang.Class({
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' });
if (screenSaverSettings.get_boolean('user-switch-enabled')) {
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' });
this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button',
can_focus: true,
child: otherUserLabel,
reactive: true,
x_align: St.Align.START,
x_fill: true });
this._otherUserButton.connect('clicked', Lang.bind(this, this._otherUserClicked));
this.dialogLayout.add(this._otherUserButton,
{ x_align: St.Align.START,
x_fill: false });
} else {
this._otherUserButton = null;
}
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' });
this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button',
can_focus: true,
child: otherUserLabel,
reactive: true,
x_align: St.Align.START,
x_fill: true });
this._otherUserButton.connect('clicked', Lang.bind(this, this._otherUserClicked));
this.dialogLayout.add(this._otherUserButton,
{ x_align: St.Align.START,
x_fill: false });
this._updateSensitivity(true);
@ -236,10 +231,8 @@ const UnlockDialog = new Lang.Class({
this._promptEntry.reactive = sensitive;
this._promptEntry.clutter_text.editable = sensitive;
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
if (this._otherUserButton) {
this._otherUserButton.reactive = sensitive;
this._otherUserButton.can_focus = sensitive;
}
this._otherUserButton.reactive = sensitive;
this._otherUserButton.can_focus = sensitive;
},
_updateOkButtonSensitivity: function(sensitive) {

View File

@ -22,13 +22,12 @@ const Util = imports.misc.util;
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy'
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const LOCK_ENABLED_KEY = 'lock-enabled';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const SHOW_FULL_NAME_IN_TOP_BAR_KEY = 'show-full-name-in-top-bar';
const SHOW_FULL_NAME_KEY = 'show-full-name';
const DIALOG_ICON_SIZE = 64;
@ -478,7 +477,6 @@ const UserMenuButton = new Lang.Class({
this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA });
this._userManager = AccountsService.UserManager.get_default();
@ -555,10 +553,10 @@ const UserMenuButton = new Lang.Class({
Lang.bind(this, this._updateLogout));
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
Lang.bind(this, this._updateLockScreen));
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_IN_TOP_BAR_KEY,
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_KEY,
Lang.bind(this, this._updateUserName));
this._privacySettings.connect('changed::' + SHOW_FULL_NAME_IN_TOP_BAR_KEY,
Lang.bind(this, this._updateUserName));
global.settings.connect('changed::' + SHOW_FULL_NAME_KEY,
Lang.bind(this, this._updateUserName));
this._updateSwitchUser();
this._updateLogout();
this._updateLockScreen();
@ -604,10 +602,10 @@ const UserMenuButton = new Lang.Class({
},
_updateUserName: function() {
let settings = this._privacySettings;
let settings = global.settings;
if (Main.sessionMode.isLocked)
settings = this._screenSaverSettings;
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_IN_TOP_BAR_KEY))
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_KEY))
this._name.set_text(this._user.get_real_name());
else
this._name.set_text("");

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
@ -29,6 +30,9 @@ const CLOSE_BUTTON_FADE_TIME = 0.1;
const DRAGGING_WINDOW_OPACITY = 100;
const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides';
const BUTTON_LAYOUT_KEY = 'button-layout';
// When calculating a layout, we calculate the scale of windows and the percent
// of the available area the new layout uses. If the values for the new layout,
// when weighted with the values as below, are worse than the previous layout's,
@ -256,37 +260,23 @@ const WindowClone = new Lang.Class({
_onScroll : function (actor, event) {
let direction = event.get_scroll_direction();
let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) {
delta = -SCROLL_SCALE_AMOUNT;
} else if (direction == Clutter.ScrollDirection.UP) {
delta = +SCROLL_SCALE_AMOUNT;
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
delta = -dy * 10;
}
if (delta > 0) {
if (direction == Clutter.ScrollDirection.UP) {
if (this._zoomStep == undefined)
this._zoomStart();
if (this._zoomStep < 100) {
this._zoomStep += delta;
this._zoomStep = Math.min(100, this._zoomStep);
this._zoomStep += SCROLL_SCALE_AMOUNT;
this._zoomUpdate();
}
} else if (delta < 0) {
} else if (direction == Clutter.ScrollDirection.DOWN) {
if (this._zoomStep > 0) {
this._zoomStep += delta;
this._zoomStep -= SCROLL_SCALE_AMOUNT;
this._zoomStep = Math.max(0, this._zoomStep);
this._zoomUpdate();
}
if (this._zoomStep <= 0.0)
this._zoomEnd();
}
},
_zoomUpdate : function () {
@ -451,6 +441,8 @@ const WindowOverlay = new Lang.Class({
this._parentActor = parentActor;
this._hidden = false;
this._settings = new Gio.Settings({ schema: BUTTON_LAYOUT_SCHEMA });
this.borderSize = 0;
this.border = new St.Bin({ style_class: 'window-clone-border' });
@ -543,8 +535,15 @@ const WindowOverlay = new Lang.Class({
let button = this.closeButton;
let title = this.title;
let layout = Meta.prefs_get_button_layout();
let side = layout.left_buttons.indexOf(Meta.ButtonFunction.CLOSE) > -1 ? St.Side.LEFT : St.Side.RIGHT;
let layout = this._settings.get_string(BUTTON_LAYOUT_KEY);
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
let split = layout.split(":");
let side;
if (split[0].indexOf("close") > -1)
side = rtl ? St.Side.RIGHT : St.Side.LEFT;
else
side = rtl ? St.Side.LEFT : St.Side.RIGHT;
let buttonX;
let buttonY = cloneY - (button.height - button._overlap);

237
po/ar.po
View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-23 18:34+0200\n"
"POT-Creation-Date: 2012-12-09 04:45+0200\n"
"PO-Revision-Date: 2012-12-09 04:52+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
@ -365,8 +365,8 @@ msgstr "نافذة الولوج"
msgid "Power"
msgstr "الطاقة"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:790
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:789
msgid "Suspend"
msgstr "علّق"
@ -374,8 +374,8 @@ msgstr "علّق"
msgid "Restart"
msgstr "أعِد التشغيل"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788
msgid "Power Off"
msgstr "أطفئ الحاسوب"
@ -410,19 +410,27 @@ msgid "Execution of '%s' failed:"
msgstr "فشل تنفيذ '%s':"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258
#: ../js/ui/appDisplay.js:259
msgid "All"
msgstr "الكل"
#: ../js/ui/appDisplay.js:666
#: ../js/ui/appDisplay.js:318
msgid "APPLICATIONS"
msgstr "التطبيقات"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "الإعدادات"
#: ../js/ui/appDisplay.js:679
msgid "New Window"
msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:670
#: ../js/ui/appDisplay.js:683
msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة"
@ -439,19 +447,19 @@ msgstr "أُزيل %s من مفضّلتك."
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: ../js/ui/calendar.js:61
#: ../js/ui/calendar.js:62
msgctxt "event list time"
msgid "All Day"
msgstr "طوال اليوم"
#. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:66
#: ../js/ui/calendar.js:67
msgctxt "event list time"
msgid "%H:%M"
msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:73
#: ../js/ui/calendar.js:74
msgctxt "event list time"
msgid "%l:%M %p"
msgstr "%l:%M %p"
@ -461,43 +469,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: ../js/ui/calendar.js:104
#: ../js/ui/calendar.js:114
msgctxt "grid sunday"
msgid "S"
msgstr "ح"
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:106
#: ../js/ui/calendar.js:116
msgctxt "grid monday"
msgid "M"
msgstr "ن"
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:108
#: ../js/ui/calendar.js:118
msgctxt "grid tuesday"
msgid "T"
msgstr "ث"
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:110
#: ../js/ui/calendar.js:120
msgctxt "grid wednesday"
msgid "W"
msgstr "ر"
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:112
#: ../js/ui/calendar.js:122
msgctxt "grid thursday"
msgid "T"
msgstr "خ"
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:114
#: ../js/ui/calendar.js:124
msgctxt "grid friday"
msgid "F"
msgstr "ج"
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:116
#: ../js/ui/calendar.js:126
msgctxt "grid saturday"
msgid "S"
msgstr "س"
@ -508,77 +516,77 @@ msgstr "س"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#.
#: ../js/ui/calendar.js:129
#: ../js/ui/calendar.js:139
msgctxt "list sunday"
msgid "Su"
msgstr "الأحد"
#. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:131
#: ../js/ui/calendar.js:141
msgctxt "list monday"
msgid "M"
msgstr "الاثنين"
#. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:133
#: ../js/ui/calendar.js:143
msgctxt "list tuesday"
msgid "T"
msgstr "الثلاثاء"
#. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:135
#: ../js/ui/calendar.js:145
msgctxt "list wednesday"
msgid "W"
msgstr "الأربعاء"
#. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:137
#: ../js/ui/calendar.js:147
msgctxt "list thursday"
msgid "Th"
msgstr "الخميس"
#. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:139
#: ../js/ui/calendar.js:149
msgctxt "list friday"
msgid "F"
msgstr "الجمعة"
#. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:141
#: ../js/ui/calendar.js:151
msgctxt "list saturday"
msgid "S"
msgstr "السبت"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:674
#: ../js/ui/calendar.js:700
msgid "Nothing Scheduled"
msgstr "الجدول خال"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:690
#: ../js/ui/calendar.js:716
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:693
#: ../js/ui/calendar.js:719
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A %d %B %Y"
#: ../js/ui/calendar.js:703
#: ../js/ui/calendar.js:729
msgid "Today"
msgstr "اليوم"
#: ../js/ui/calendar.js:707
#: ../js/ui/calendar.js:733
msgid "Tomorrow"
msgstr "غدا"
#: ../js/ui/calendar.js:718
#: ../js/ui/calendar.js:744
msgid "This week"
msgstr "هذا الأسبوع"
#: ../js/ui/calendar.js:726
#: ../js/ui/calendar.js:752
msgid "Next week"
msgstr "الأسبوع القادم"
@ -940,7 +948,7 @@ msgstr "أظهر الحساب"
msgid "Unknown reason"
msgstr "السبب غير معروف"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87
msgid "Windows"
msgstr "النوافذ"
@ -1080,7 +1088,7 @@ msgstr "هل تريد تنزيل وتثبيت '%s' من extensions.gnome.org؟"
msgid "tray"
msgstr "لوحة النظام"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205
msgid "Keyboard"
msgstr "لوحة المفاتيح"
@ -1107,9 +1115,7 @@ msgstr "اظهر الأخطاء"
msgid "Enabled"
msgstr "مفعّل"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:767 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/lookingGlass.js:767
msgid "Disabled"
msgstr "معطّل"
@ -1141,15 +1147,15 @@ msgstr "افتح"
msgid "Remove"
msgstr "أزِل"
#: ../js/ui/messageTray.js:1552
#: ../js/ui/messageTray.js:1551
msgid "No Messages"
msgstr "لا رسائل"
#: ../js/ui/messageTray.js:1570
#: ../js/ui/messageTray.js:1568
msgid "Message Tray"
msgstr "لوحة الرسائل"
#: ../js/ui/messageTray.js:2639
#: ../js/ui/messageTray.js:2635
msgid "System Information"
msgstr "معلومات النظام"
@ -1158,11 +1164,11 @@ msgctxt "program"
msgid "Unknown"
msgstr "غير معروف"
#: ../js/ui/overview.js:92
#: ../js/ui/overview.js:95
msgid "Undo"
msgstr "تراجع"
#: ../js/ui/overview.js:139
#: ../js/ui/overview.js:144
msgid "Overview"
msgstr "نظرة عامة"
@ -1170,13 +1176,13 @@ msgstr "نظرة عامة"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:218
#: ../js/ui/overview.js:221
msgid "Type to search..."
msgstr "اكتب نصا للبحث عنه..."
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:236
#: ../js/ui/overview.js:242
msgid "Dash"
msgstr "الشريط"
@ -1199,7 +1205,7 @@ msgstr "الشريط العلوي"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:725
#: ../js/ui/popupMenu.js:732
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -1239,15 +1245,15 @@ msgstr[3] "%d تنبيهات جديدة"
msgstr[4] "%d تنبيها جديدا"
msgstr[5] "%d تنبيه جديد"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780
msgid "Lock"
msgstr "أوصِد"
#: ../js/ui/searchDisplay.js:403
#: ../js/ui/searchDisplay.js:277
msgid "Searching..."
msgstr "يبحث..."
#: ../js/ui/searchDisplay.js:451
#: ../js/ui/searchDisplay.js:325
msgid "No results."
msgstr "لا نتائج."
@ -1363,7 +1369,7 @@ msgid "disconnecting..."
msgstr "يقطع الاتّصال..."
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1464
#: ../js/ui/status/network.js:1453
msgid "connecting..."
msgstr "يتّصل..."
@ -1379,7 +1385,7 @@ msgstr "إعدادات لوحة المفاتيح"
msgid "Mouse Settings"
msgstr "إعدادات الفأرة"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270
msgid "Sound Settings"
msgstr "إعدادات الصوت"
@ -1443,15 +1449,15 @@ msgstr "من فضلك أدخل الرقم المذكور على الجهاز."
msgid "OK"
msgstr "حسنا"
#: ../js/ui/status/keyboard.js:363
#: ../js/ui/status/keyboard.js:228
msgid "Show Keyboard Layout"
msgstr "أظهر تخطيط لوحة المفاتيح"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:233
msgid "Region and Language Settings"
msgstr "إعدادات الإقليم واللغة"
#: ../js/ui/status/lockScreenMenu.js:43
#: ../js/ui/status/lockScreenMenu.js:18
msgid "Volume, network, battery"
msgstr "الصوت، الشبكة، البطارية"
@ -1471,7 +1477,7 @@ msgid "unmanaged"
msgstr "غير مُدار"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1456
msgid "authentication required"
msgstr "الاستيثاق مطلوب"
@ -1492,72 +1498,72 @@ msgstr "الكبل مفصول"
msgid "unavailable"
msgstr "غير متاح"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458
msgid "connection failed"
msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1545
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392
#: ../js/ui/status/network.js:1534
msgid "More..."
msgstr "المزيد..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1322
msgid "Connected (private)"
msgstr "متّصل (شخصي)"
#: ../js/ui/status/network.js:641
#: ../js/ui/status/network.js:619
msgid "Auto Ethernet"
msgstr "إيثرنت تلقائي"
#: ../js/ui/status/network.js:688
#: ../js/ui/status/network.js:677
msgid "Auto broadband"
msgstr "شبكة هاتف محمول تلقائية"
#: ../js/ui/status/network.js:691
#: ../js/ui/status/network.js:680
msgid "Auto dial-up"
msgstr "اتصال هاتفي تلقائي"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#: ../js/ui/status/network.js:809 ../js/ui/status/network.js:1339
#, c-format
msgid "Auto %s"
msgstr "%s تلقائي"
#: ../js/ui/status/network.js:822
#: ../js/ui/status/network.js:811
msgid "Auto bluetooth"
msgstr "بلوتوث تلقائي"
#: ../js/ui/status/network.js:1352
#: ../js/ui/status/network.js:1341
msgid "Auto wireless"
msgstr "لاسلكي تلقائي"
#: ../js/ui/status/network.js:1595
#: ../js/ui/status/network.js:1584
msgid "Enable networking"
msgstr "فعّل الشبكات"
#: ../js/ui/status/network.js:1627
#: ../js/ui/status/network.js:1616
msgid "Wi-Fi"
msgstr "واي فاي"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1635
msgid "Network Settings"
msgstr "إعدادات الشّبكة"
#: ../js/ui/status/network.js:1692
#: ../js/ui/status/network.js:1679
msgid "Network Manager"
msgstr "مدير الشبكة"
#: ../js/ui/status/network.js:1774
#: ../js/ui/status/network.js:1761
msgid "Connection failed"
msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:1775
#: ../js/ui/status/network.js:1762
msgid "Activation of network connection failed"
msgstr "فشل تفعيل اتصال الشبكة"
#: ../js/ui/status/network.js:2092
#: ../js/ui/status/network.js:2079
msgid "Networking is disabled"
msgstr "عُطّلت الشبكات"
@ -1675,11 +1681,11 @@ msgid "Unknown"
msgstr "غير معروف"
#. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
#: ../js/ui/status/volume.js:50 ../js/ui/status/volume.js:251
msgid "Volume"
msgstr "شدة الصوت"
#: ../js/ui/status/volume.js:256
#: ../js/ui/status/volume.js:62
msgid "Microphone"
msgstr "ميكروفون"
@ -1715,31 +1721,31 @@ msgstr "ساكن"
msgid "Offline"
msgstr "غير متصل"
#: ../js/ui/userMenu.js:755
#: ../js/ui/userMenu.js:754
msgid "Notifications"
msgstr "التنبيهات"
#: ../js/ui/userMenu.js:763
#: ../js/ui/userMenu.js:762
msgid "Settings"
msgstr "الإعدادات"
#: ../js/ui/userMenu.js:771
#: ../js/ui/userMenu.js:770
msgid "Switch User"
msgstr "بدّل المستخدم"
#: ../js/ui/userMenu.js:776
#: ../js/ui/userMenu.js:775
msgid "Log Out"
msgstr "اخرج"
#: ../js/ui/userMenu.js:796
#: ../js/ui/userMenu.js:795
msgid "Install Updates & Restart"
msgstr "ثبّت التحديثات وأعد التشغيل"
#: ../js/ui/userMenu.js:814
#: ../js/ui/userMenu.js:813
msgid "Your chat status will be set to busy"
msgstr "ستُجعل حالة اتصالك ”مشغول“"
#: ../js/ui/userMenu.js:815
#: ../js/ui/userMenu.js:814
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1747,15 +1753,15 @@ msgstr ""
"التنبيهات معطلة الآن، بما فيها رسائل المحادثة. حالة اتصالك تغيرت حتى يعلم "
"الآخرون أنك قد لا ترى رسائلهم."
#: ../js/ui/viewSelector.js:85
#: ../js/ui/viewSelector.js:91
msgid "Applications"
msgstr "التطبيقات"
#: ../js/ui/viewSelector.js:89
#: ../js/ui/viewSelector.js:95
msgid "Search"
msgstr "ابحث"
#: ../js/ui/wanda.js:92
#: ../js/ui/wanda.js:94
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1764,11 +1770,15 @@ msgstr ""
"عذرًا, لا حكمة لك اليوم:\n"
"%s"
#: ../js/ui/wanda.js:96
#: ../js/ui/wanda.js:98
#, c-format
msgid "%s the Oracle says"
msgstr "يقول الحكيم %s"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr ""
#: ../js/ui/windowAttentionHandler.js:19
#, c-format
msgid "'%s' is ready"
@ -1778,36 +1788,6 @@ msgstr "'%s' جاهز"
msgid "Evolution Calendar"
msgstr "تقويم إيفُليوشِن"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "لا مخرَج"
msgstr[1] "مخرَج واحد"
msgstr[2] "مخرَجين"
msgstr[3] "%u مخارج"
msgstr[4] "%u مخرجا"
msgstr[5] "%u مخرج"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "لا مدخل"
msgstr[1] "مدخل واحد"
msgstr[2] "مدخلين"
msgstr[3] "%u مداخل"
msgstr[4] "%u مدخلا"
msgstr[5] "%u مدخل"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "أصوات النظام"
#: ../src/main.c:332
msgid "Print version"
msgstr "اطبع الإصدارة"
@ -1849,12 +1829,6 @@ msgstr "المبدئي"
msgid "Authentication dialog was dismissed by the user"
msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
#~ msgid "APPLICATIONS"
#~ msgstr "التطبيقات"
#~ msgid "SETTINGS"
#~ msgstr "الإعدادات"
#~ msgid "Subscription request"
#~ msgstr "طلب اشتراك"
@ -1903,6 +1877,27 @@ msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
#~ msgid "System Settings"
#~ msgstr "إعدادات النظام"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "لا مخرَج"
#~ msgstr[1] "مخرَج واحد"
#~ msgstr[2] "مخرَجين"
#~ msgstr[3] "%u مخارج"
#~ msgstr[4] "%u مخرجا"
#~ msgstr[5] "%u مخرج"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "لا مدخل"
#~ msgstr[1] "مدخل واحد"
#~ msgstr[2] "مدخلين"
#~ msgstr[3] "%u مداخل"
#~ msgstr[4] "%u مدخلا"
#~ msgstr[5] "%u مدخل"
#~ msgid "System Sounds"
#~ msgstr "أصوات النظام"
#~ msgid "Failed to unmount '%s'"
#~ msgstr "فشل فصْل '%s'"

727
po/be.po

File diff suppressed because it is too large Load Diff

820
po/de.po

File diff suppressed because it is too large Load Diff

283
po/es.po
View File

@ -10,15 +10,15 @@ 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: 2012-12-19 14:51+0000\n"
"PO-Revision-Date: 2012-12-26 11:38+0100\n"
"POT-Creation-Date: 2012-12-09 13:03+0000\n"
"PO-Revision-Date: 2012-12-16 20:37+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.5\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
@ -38,6 +38,8 @@ msgid "Show the message tray"
msgstr "Mostrar la bandeja de mensajes"
#: ../data/50-gnome-shell-system.xml.in.h:3
#| msgid "%d new notification"
#| msgid_plural "%d new notifications"
msgid "Focus the active notification"
msgstr "Dar el foco a la notificación activa"
@ -153,31 +155,25 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr ""
"Mostrar siempre el elemento de menú «Cerrar sesión» en el menú del usuario."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Esta clave sobreescribe la ocultación automática del elemento de menú «Cerrar "
"sesión» en situaciones de un único usuario o de una única sesión."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show full name in the user menu"
msgstr "Mostrar el nombre completo en el menú del usuario"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not."
msgstr ""
"Indica si se muestra el nombre del usuario en el menú del usuario o no."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Indica si se debe recordar la contraseña para montar sistemas de archivos "
"remotos o cifrados"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
@ -186,10 +182,6 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"La shell solicitará una contraseña cuando se monte un dispositivo cifrado o "
"un sistema de archivos remoto. Si la contraseña se puede guardar para usarla "
"en un futuro, se mostrará la casilla «Recordar contraseña». Esta clave "
"establece el valor predeterminado de la casilla."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Show the week date in the calendar"
@ -227,14 +219,16 @@ msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
#, fuzzy
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to focus the active notification"
msgstr "Asociación de teclas para dar el foco a la notificación activa"
msgstr "Asociación de teclas para abrir el menú de la aplicación"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#, fuzzy
#| msgid "Keybinding to open the application menu."
msgid "Keybinding to focus the active notification."
msgstr "Asociación de teclas para dar el foco a la notificación activa."
msgstr "Asociación de teclas para abrir el menú de la aplicación."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the screen recorder"
@ -283,16 +277,17 @@ msgid ""
"used as a placeholder for a guess at the optimal thread count on the system."
msgstr ""
"Establece la tubería GStreamer usada para codificar grabaciones. Sigue la "
"sintaxis usada para gst-launch. La tubería debería tener un sumidero («sink») "
"desconectado donde grabar el vídeo que se está grabando. Generalmente tendrá "
"un punto de origen desconectado; la salida de ese punto se escribirá en el "
"archivo de salida. Sin embargo, la tubería también puede tomar parte en su "
"propia salida; esto se puede usar para enviar la salida a un servidor "
"«icecast» a través de shout2send o similar. Cuando no está establecido o lo "
"está a un valor vacío, se usará la tubería predeterminada. Actualmente es "
"«'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 "
"threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T "
"como marcador de posición para el número de hilos óptimos en el sistema."
"sintaxis usada para gst-launch. La tubería debería tener un sumidero "
"(«sink») desconectado donde grabar el vídeo que se está grabando. "
"Generalmente tendrá un punto de origen desconectado; la salida de ese punto "
"se escribirá en el archivo de salida. Sin embargo, la tubería también puede "
"tomar parte en su propia salida; esto se puede usar para enviar la salida a "
"un servidor «icecast» a través de shout2send o similar. Cuando no está "
"establecido o lo está a un valor vacío, se usará la tubería predeterminada. "
"Actualmente es «'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 "
"deadline=1000000 threads=%T ! queue ! webmmux» y graba en WEBM usando el "
"códec VP8. Se usa %T como marcador de posición para el número de hilos "
"óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast"
@ -309,8 +304,9 @@ msgstr ""
"grabar en otro formato contenedor diferente."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#| msgid "Open the application menu"
msgid "The application icon mode."
msgstr "El modo de icono de la aplicación."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
@ -318,45 +314,37 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Configura cómo se muestran las ventanas en el selector. Los valore posibles "
"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-"
"only» (sólo muestra el icono de la aplicación) «both»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
msgstr "Acoplar un diálogo modal a la ventana padre"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Esta clave sobreescribe la clave en org.gnome.mutter al ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar"
msgstr "Orden de los botones en la barra de título"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
"Esta clave sobreescribe la clave en org.gnome.desktop.wm.preferences al "
"ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la "
"ventana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically"
msgstr "Las áreas de trabajo se gestionan dinámicamente"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor"
msgstr "Áreas de trabajo solo en la pantalla principal"
msgstr ""
#: ../js/extensionPrefs/main.js:124
#, c-format
@ -401,6 +389,7 @@ msgid "Sign In"
msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:978
#| msgid "Next week"
msgid "Next"
msgstr "Siguiente"
@ -421,8 +410,8 @@ msgstr "Ventana de inicio de sesión"
msgid "Power"
msgstr "Energía"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:790
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:789
msgid "Suspend"
msgstr "Suspender"
@ -430,8 +419,8 @@ msgstr "Suspender"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788
msgid "Power Off"
msgstr "Apagar"
@ -466,19 +455,27 @@ msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258
#: ../js/ui/appDisplay.js:259
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:666
#: ../js/ui/appDisplay.js:318
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:679
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:670
#: ../js/ui/appDisplay.js:683
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
@ -495,19 +492,19 @@ msgstr "Se ha quitado %s de sus favoritos."
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: ../js/ui/calendar.js:61
#: ../js/ui/calendar.js:62
msgctxt "event list time"
msgid "All Day"
msgstr "Todo el día"
#. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:66
#: ../js/ui/calendar.js:67
msgctxt "event list time"
msgid "%H:%M"
msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:73
#: ../js/ui/calendar.js:74
msgctxt "event list time"
msgid "%l:%M %p"
msgstr "%l:%M %p"
@ -517,43 +514,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: ../js/ui/calendar.js:104
#: ../js/ui/calendar.js:114
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:106
#: ../js/ui/calendar.js:116
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:108
#: ../js/ui/calendar.js:118
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:110
#: ../js/ui/calendar.js:120
msgctxt "grid wednesday"
msgid "W"
msgstr "X"
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:112
#: ../js/ui/calendar.js:122
msgctxt "grid thursday"
msgid "T"
msgstr "J"
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:114
#: ../js/ui/calendar.js:124
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:116
#: ../js/ui/calendar.js:126
msgctxt "grid saturday"
msgid "S"
msgstr "S"
@ -564,77 +561,77 @@ msgstr "S"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#.
#: ../js/ui/calendar.js:129
#: ../js/ui/calendar.js:139
msgctxt "list sunday"
msgid "Su"
msgstr "Dom"
#. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:131
#: ../js/ui/calendar.js:141
msgctxt "list monday"
msgid "M"
msgstr "L"
#. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:133
#: ../js/ui/calendar.js:143
msgctxt "list tuesday"
msgid "T"
msgstr "M"
#. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:135
#: ../js/ui/calendar.js:145
msgctxt "list wednesday"
msgid "W"
msgstr "X"
#. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:137
#: ../js/ui/calendar.js:147
msgctxt "list thursday"
msgid "Th"
msgstr "J"
#. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:139
#: ../js/ui/calendar.js:149
msgctxt "list friday"
msgid "F"
msgstr "V"
#. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:141
#: ../js/ui/calendar.js:151
msgctxt "list saturday"
msgid "S"
msgstr "S"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:674
#: ../js/ui/calendar.js:700
msgid "Nothing Scheduled"
msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:690
#: ../js/ui/calendar.js:716
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:693
#: ../js/ui/calendar.js:719
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:703
#: ../js/ui/calendar.js:729
msgid "Today"
msgstr "Hoy"
#: ../js/ui/calendar.js:707
#: ../js/ui/calendar.js:733
msgid "Tomorrow"
msgstr "Mañana"
#: ../js/ui/calendar.js:718
#: ../js/ui/calendar.js:744
msgid "This week"
msgstr "Esta semana"
#: ../js/ui/calendar.js:726
#: ../js/ui/calendar.js:752
msgid "Next week"
msgstr "La semana que viene"
@ -696,8 +693,8 @@ msgstr "La red inalámbrica requiere autenticación"
#: ../js/ui/components/networkAgent.js:310
#, c-format
msgid ""
"Passwords or encryption keys are required to access the wireless network '%"
"s'."
"Passwords or encryption keys are required to access the wireless network "
"'%s'."
msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»."
@ -798,12 +795,14 @@ msgstr "<b>Ayer</b>, <b>%H:%M</b>"
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
#: ../js/ui/components/telepathyClient.js:937
#, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "<b>%A</b>, <b>%H:%M</b>"
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
#: ../js/ui/components/telepathyClient.js:942
#, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%d</b> de <b>%B</b>, <b>%H:%M</b>"
@ -996,6 +995,7 @@ msgid "Unable to connect to %s"
msgstr "No se pudo conectar a %s"
#: ../js/ui/components/telepathyClient.js:1344
#| msgid "Edit account"
msgid "View account"
msgstr "Ver cuenta"
@ -1003,7 +1003,7 @@ msgstr "Ver cuenta"
msgid "Unknown reason"
msgstr "Razón desconocida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87
msgid "Windows"
msgstr "Ventanas"
@ -1130,7 +1130,7 @@ msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
msgid "tray"
msgstr "bandeja"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205
msgid "Keyboard"
msgstr "Teclado"
@ -1189,15 +1189,16 @@ msgstr "Abrir"
msgid "Remove"
msgstr "Quitar"
#: ../js/ui/messageTray.js:1552
#: ../js/ui/messageTray.js:1551
#| msgid "Message Tray"
msgid "No Messages"
msgstr "No hay mensajes"
#: ../js/ui/messageTray.js:1570
#: ../js/ui/messageTray.js:1568
msgid "Message Tray"
msgstr "Bandeja de mensajes"
#: ../js/ui/messageTray.js:2639
#: ../js/ui/messageTray.js:2635
msgid "System Information"
msgstr "Información del sistema"
@ -1206,11 +1207,11 @@ msgctxt "program"
msgid "Unknown"
msgstr "Desconocido"
#: ../js/ui/overview.js:92
#: ../js/ui/overview.js:95
msgid "Undo"
msgstr "Deshacer"
#: ../js/ui/overview.js:139
#: ../js/ui/overview.js:144
msgid "Overview"
msgstr "Vista general"
@ -1218,13 +1219,13 @@ msgstr "Vista general"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:218
#: ../js/ui/overview.js:221
msgid "Type to search..."
msgstr "Teclear para buscar…"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:236
#: ../js/ui/overview.js:242
msgid "Dash"
msgstr "Tablero"
@ -1247,11 +1248,12 @@ msgstr "Barra superior"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:711
#: ../js/ui/popupMenu.js:732
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:205
#| msgid "Please enter a command:"
msgid "Enter a Command"
msgstr "Introducir un comando"
@ -1279,15 +1281,15 @@ msgid_plural "%d new notifications"
msgstr[0] "%d notificación nueva"
msgstr[1] "%d notificaciones nuevas"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780
msgid "Lock"
msgstr "Bloquear"
#: ../js/ui/searchDisplay.js:403
#: ../js/ui/searchDisplay.js:277
msgid "Searching..."
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:451
#: ../js/ui/searchDisplay.js:325
msgid "No results."
msgstr "No se encontraron resultados."
@ -1403,7 +1405,7 @@ msgid "disconnecting..."
msgstr "deconectando…"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1464
#: ../js/ui/status/network.js:1453
msgid "connecting..."
msgstr "conectando…"
@ -1459,7 +1461,8 @@ msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
#: ../js/ui/status/bluetooth.js:364
#, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device."
msgstr "Confirme que el PIN mostrado en «%06d» coincide con el del dispositivo."
msgstr ""
"Confirme que el PIN mostrado en «%06d» coincide con el del dispositivo."
#. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:367
@ -1483,11 +1486,11 @@ msgstr "Introduzca el PIN mencionado en el dispositivo."
msgid "OK"
msgstr "Aceptar"
#: ../js/ui/status/keyboard.js:363
#: ../js/ui/status/keyboard.js:228
msgid "Show Keyboard Layout"
msgstr "Mostrar la distribución del teclado"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:233
msgid "Region and Language Settings"
msgstr "Configuración de región e idioma"
@ -1511,7 +1514,7 @@ msgid "unmanaged"
msgstr "no gestionada"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1456
msgid "authentication required"
msgstr "se necesita autenticación"
@ -1532,72 +1535,72 @@ msgstr "cable desconectado"
msgid "unavailable"
msgstr "no disponible"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458
msgid "connection failed"
msgstr "falló la conexión"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1545
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392
#: ../js/ui/status/network.js:1534
msgid "More..."
msgstr "Más…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1322
msgid "Connected (private)"
msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:641
#: ../js/ui/status/network.js:619
msgid "Auto Ethernet"
msgstr "Ethernet automática"
#: ../js/ui/status/network.js:688
#: ../js/ui/status/network.js:677
msgid "Auto broadband"
msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:691
#: ../js/ui/status/network.js:680
msgid "Auto dial-up"
msgstr "Marcado automático"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#: ../js/ui/status/network.js:809 ../js/ui/status/network.js:1339
#, c-format
msgid "Auto %s"
msgstr "%s automática"
#: ../js/ui/status/network.js:822
#: ../js/ui/status/network.js:811
msgid "Auto bluetooth"
msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1352
#: ../js/ui/status/network.js:1341
msgid "Auto wireless"
msgstr "Inalámbrica automática"
#: ../js/ui/status/network.js:1595
#: ../js/ui/status/network.js:1584
msgid "Enable networking"
msgstr "Activar red"
#: ../js/ui/status/network.js:1627
#: ../js/ui/status/network.js:1616
msgid "Wi-Fi"
msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1635
msgid "Network Settings"
msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1692
#: ../js/ui/status/network.js:1679
msgid "Network Manager"
msgstr "Gestor de la red"
#: ../js/ui/status/network.js:1774
#: ../js/ui/status/network.js:1761
msgid "Connection failed"
msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1775
#: ../js/ui/status/network.js:1762
msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red"
#: ../js/ui/status/network.js:2092
#: ../js/ui/status/network.js:2079
msgid "Networking is disabled"
msgstr "La red está desactivada"
@ -1712,6 +1715,7 @@ msgid "Log in as another user"
msgstr "Iniciar sesión como otro usuario"
#: ../js/ui/unlockDialog.js:224
#| msgid "Login Window"
msgid "Unlock Window"
msgstr "Desbloquear ventana"
@ -1739,31 +1743,32 @@ msgstr "Inactivo"
msgid "Offline"
msgstr "Desconectado"
#: ../js/ui/userMenu.js:755
#: ../js/ui/userMenu.js:754
msgid "Notifications"
msgstr "Notificaciones"
#: ../js/ui/userMenu.js:763
#: ../js/ui/userMenu.js:762
#| msgid "Mouse Settings"
msgid "Settings"
msgstr "Configuración"
#: ../js/ui/userMenu.js:771
#: ../js/ui/userMenu.js:770
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:776
#: ../js/ui/userMenu.js:775
msgid "Log Out"
msgstr "Cerrar la sesión"
#: ../js/ui/userMenu.js:796
#: ../js/ui/userMenu.js:795
msgid "Install Updates & Restart"
msgstr "Instalar actualizaciones y reiniciar"
#: ../js/ui/userMenu.js:814
#: ../js/ui/userMenu.js:813
msgid "Your chat status will be set to busy"
msgstr "Su estado del chat se establecerá a «ocupado»"
#: ../js/ui/userMenu.js:815
#: ../js/ui/userMenu.js:814
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1772,15 +1777,15 @@ msgstr ""
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
"leer sus mensajes."
#: ../js/ui/viewSelector.js:85
#: ../js/ui/viewSelector.js:91
msgid "Applications"
msgstr "Aplicaciones"
#: ../js/ui/viewSelector.js:89
#: ../js/ui/viewSelector.js:95
msgid "Search"
msgstr "Buscar"
#: ../js/ui/wanda.js:92
#: ../js/ui/wanda.js:94
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1789,11 +1794,15 @@ msgstr ""
"Hoy no tiene ningún mensaje:\n"
"%s"
#: ../js/ui/wanda.js:96
#: ../js/ui/wanda.js:98
#, c-format
msgid "%s the Oracle says"
msgstr "%s el oráculo dice"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr "Su mensaje oculto favorito"
#: ../js/ui/windowAttentionHandler.js:19
#, c-format
msgid "'%s' is ready"
@ -1846,15 +1855,6 @@ msgstr "Predeterminada"
msgid "Authentication dialog was dismissed by the user"
msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "APPLICATIONS"
#~ msgstr "APLICACIONES"
#~ msgid "SETTINGS"
#~ msgstr "CONFIGURACIÓN"
#~ msgid "Your favorite Easter Egg"
#~ msgstr "Su mensaje oculto favorito"
#~ msgid "Subscription request"
#~ msgstr "Solicitud de suscripción"
@ -2285,8 +2285,8 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds "
#~ "in time."
#~ msgstr ""
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los segundos "
#~ "en la hora."
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los "
#~ "segundos en la hora."
#~ msgid ""
#~ "This key specifies the format used by the panel clock when the format key "
@ -2303,18 +2303,19 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid ""
#~ "This key specifies the hour format used by the panel clock. Possible "
#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to "
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. 1970-"
#~ "01-01. If set to \"custom\", the clock will display time according to the "
#~ "format specified in the custom_format key. Note that if set to either "
#~ "\"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. "
#~ "1970-01-01. If set to \"custom\", the clock will display time according "
#~ "to the format specified in the custom_format key. Note that if set to "
#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are "
#~ "ignored."
#~ msgstr ""
#~ "Esta clave especifica el formato de la hora especificado por el reloj del "
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 horas), "
#~ "«unix» y «custom» (personalizado).Si se establece a «unix» el reloj mostrará "
#~ "la hora en segundos desde la época (1 de enero de 1970). Si se establece "
#~ "a «custom» el reloj mostrará la hora según el formato especificado en la "
#~ "clave «custom_format». Note que si se establece a «unix» o «custom» se "
#~ "ignoran las claves «show_date» y «show_seconds»."
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 "
#~ "horas), «unix» y «custom» (personalizado).Si se establece a «unix» el "
#~ "reloj mostrará la hora en segundos desde la época (1 de enero de 1970). "
#~ "Si se establece a «custom» el reloj mostrará la hora según el formato "
#~ "especificado en la clave «custom_format». Note que si se establece a "
#~ "«unix» o «custom» se ignoran las claves «show_date» y «show_seconds»."
#~ msgid "Clock Format"
#~ msgstr "Formato del reloj"

View File

@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-12-09 13:03+0000\n"
"PO-Revision-Date: 2012-12-19 16:47+0300\n"
"PO-Revision-Date: 2012-12-18 17:13+0300\n"
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
"Language-Team: Estonian <>\n"
"Language: et\n"
@ -153,8 +153,8 @@ msgid ""
"state of the checkbox."
msgstr ""
"Shell küsib parooli, kui haagitakse krüpteeritud seade või kaugfailisüsteem. "
"Kui parooli on võimalik salvestada edaspidiseks kasutuseks, näidatakse "
"'Salvesta parool' märkeruutu. See võti määrab selle märkeruudu vaikimisi "
"Kui parooli on võimalik salvestada järgmise kasutuse jaoks, näidatakse "
"\"Jäta parool meelde\" märkeruutu. See võti määrab märkeruudu vaikimisi "
"oleku."
msgid "Show the week date in the calendar"
@ -257,9 +257,9 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Seadistab, kuidas aknaid aknavahetajas kuvatakse. Sobivad väärtused on "
"'thumbnail-only' (näidatakse ainult pisipilti aknast), 'app-icon-"
"only' (näidatakse ainult akna ikooni) või 'both' (mõlemad)."
"Seadistab, kuidas aknaid akendevahetajas kuvatakse. Sobivad väärtused on "
"'thumbnail-only' (näidatakse ainult pisipilti), 'app-icon-only' (näidatakse "
"ainult rakenduse ikooni) või 'both' (näidatakse mõlemaid)."
msgid "Attach modal dialog to the parent window"
msgstr "Modaaldialoog kuulub vanemakna juurde"

632
po/gl.po

File diff suppressed because it is too large Load Diff

526
po/he.po

File diff suppressed because it is too large Load Diff

873
po/hu.po

File diff suppressed because it is too large Load Diff

1832
po/kk.po

File diff suppressed because it is too large Load Diff

962
po/lt.po

File diff suppressed because it is too large Load Diff

308
po/nb.po
View File

@ -2,14 +2,14 @@
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
#
# Kjartan Maraas <kmaraas@gnome.org>, 2009-2013.
# Kjartan Maraas <kmaraas@gnome.org>, 2009-2012.
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 3.7.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-01-14 11:20+0100\n"
"PO-Revision-Date: 2013-01-14 11:21+0100\n"
"POT-Creation-Date: 2012-12-09 14:01+0100\n"
"PO-Revision-Date: 2012-12-09 14:02+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
@ -311,11 +311,11 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically"
msgstr "Arbeidsområder håndteres dynamisk"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor"
msgstr "Arbeidsområder vises kun på hovedskjerm"
msgstr ""
#: ../js/extensionPrefs/main.js:124
#, c-format
@ -330,11 +330,11 @@ msgstr "Utvidelse"
msgid "Select an extension to configure using the combobox above."
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
#: ../js/gdm/loginDialog.js:566
#: ../js/gdm/loginDialog.js:565
msgid "Session..."
msgstr "Økt …"
#: ../js/gdm/loginDialog.js:723
#: ../js/gdm/loginDialog.js:722
msgctxt "title"
msgid "Sign In"
msgstr "Logg inn"
@ -342,35 +342,35 @@ msgstr "Logg inn"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:787
#: ../js/gdm/loginDialog.js:786
msgid "Not listed?"
msgstr "Ikke listet?"
#: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:962 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
msgid "Cancel"
msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:979
#: ../js/gdm/loginDialog.js:978
msgctxt "button"
msgid "Sign In"
msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:979
#: ../js/gdm/loginDialog.js:978
msgid "Next"
msgstr "Neste"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:1086 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Brukernavn: "
#: ../js/gdm/loginDialog.js:1383
#: ../js/gdm/loginDialog.js:1382
msgid "Login Window"
msgstr "Innloggingsvindu"
@ -379,8 +379,8 @@ msgstr "Innloggingsvindu"
msgid "Power"
msgstr "Strøm"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:790
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:789
msgid "Suspend"
msgstr "Hvilemodus"
@ -388,8 +388,8 @@ msgstr "Hvilemodus"
msgid "Restart"
msgstr "Start på nytt"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788
msgid "Power Off"
msgstr "Slå av"
@ -424,19 +424,27 @@ msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258
#: ../js/ui/appDisplay.js:259
msgid "All"
msgstr "Alle"
#: ../js/ui/appDisplay.js:666
#: ../js/ui/appDisplay.js:318
msgid "APPLICATIONS"
msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "INNSTILLINGER"
#: ../js/ui/appDisplay.js:679
msgid "New Window"
msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:670
#: ../js/ui/appDisplay.js:683
msgid "Add to Favorites"
msgstr "Legg til i favoritter"
@ -453,19 +461,19 @@ msgstr "%s ble fjernet fra dine favoritter."
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: ../js/ui/calendar.js:61
#: ../js/ui/calendar.js:62
msgctxt "event list time"
msgid "All Day"
msgstr "Hele dagen"
#. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:66
#: ../js/ui/calendar.js:67
msgctxt "event list time"
msgid "%H:%M"
msgstr "%H.%M"
#. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:73
#: ../js/ui/calendar.js:74
msgctxt "event list time"
msgid "%l:%M %p"
msgstr "%l.%M %p"
@ -475,43 +483,43 @@ msgstr "%l.%M %p"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: ../js/ui/calendar.js:104
#: ../js/ui/calendar.js:114
msgctxt "grid sunday"
msgid "S"
msgstr "S"
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:106
#: ../js/ui/calendar.js:116
msgctxt "grid monday"
msgid "M"
msgstr "M"
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:108
#: ../js/ui/calendar.js:118
msgctxt "grid tuesday"
msgid "T"
msgstr "T"
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:110
#: ../js/ui/calendar.js:120
msgctxt "grid wednesday"
msgid "W"
msgstr "O"
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:112
#: ../js/ui/calendar.js:122
msgctxt "grid thursday"
msgid "T"
msgstr "T"
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:114
#: ../js/ui/calendar.js:124
msgctxt "grid friday"
msgid "F"
msgstr "F"
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:116
#: ../js/ui/calendar.js:126
msgctxt "grid saturday"
msgid "S"
msgstr "L"
@ -522,77 +530,77 @@ msgstr "L"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#.
#: ../js/ui/calendar.js:129
#: ../js/ui/calendar.js:139
msgctxt "list sunday"
msgid "Su"
msgstr "Sø"
#. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:131
#: ../js/ui/calendar.js:141
msgctxt "list monday"
msgid "M"
msgstr "Ma"
#. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:133
#: ../js/ui/calendar.js:143
msgctxt "list tuesday"
msgid "T"
msgstr "Ti"
#. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:135
#: ../js/ui/calendar.js:145
msgctxt "list wednesday"
msgid "W"
msgstr "On"
#. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:137
#: ../js/ui/calendar.js:147
msgctxt "list thursday"
msgid "Th"
msgstr "To"
#. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:139
#: ../js/ui/calendar.js:149
msgctxt "list friday"
msgid "F"
msgstr "Fr"
#. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:141
#: ../js/ui/calendar.js:151
msgctxt "list saturday"
msgid "S"
msgstr "Lø"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:674
#: ../js/ui/calendar.js:700
msgid "Nothing Scheduled"
msgstr "Ingenting planlagt"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:690
#: ../js/ui/calendar.js:716
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:693
#: ../js/ui/calendar.js:719
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A %B %d, %Y"
#: ../js/ui/calendar.js:703
#: ../js/ui/calendar.js:729
msgid "Today"
msgstr "I dag"
#: ../js/ui/calendar.js:707
#: ../js/ui/calendar.js:733
msgid "Tomorrow"
msgstr "I morgen"
#: ../js/ui/calendar.js:718
#: ../js/ui/calendar.js:744
msgid "This week"
msgstr "Denne uken"
#: ../js/ui/calendar.js:726
#: ../js/ui/calendar.js:752
msgid "Next week"
msgstr "Neste uke"
@ -609,11 +617,11 @@ msgstr "Åpne med %s"
msgid "Eject"
msgstr "Løs ut"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260
msgid "Password:"
msgstr "Passord:"
#: ../js/ui/components/keyring.js:101
#: ../js/ui/components/keyring.js:105
msgid "Type again:"
msgstr "Skriv på nytt:"
@ -701,7 +709,7 @@ msgstr "Autentisering kreves"
msgid "Administrator"
msgstr "Administrator"
#: ../js/ui/components/polkitAgent.js:165
#: ../js/ui/components/polkitAgent.js:166
msgid "Authenticate"
msgstr "Autentiser"
@ -709,7 +717,7 @@ msgstr "Autentiser"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "Beklager, det virket ikke. Vennligst prøv igjen."
@ -954,11 +962,11 @@ msgstr "Kan ikke koble til %s"
msgid "View account"
msgstr "Vis konto"
#: ../js/ui/components/telepathyClient.js:1383
#: ../js/ui/components/telepathyClient.js:1384
msgid "Unknown reason"
msgstr "Ukjent årsak"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87
msgid "Windows"
msgstr "Vinduer"
@ -966,18 +974,18 @@ msgstr "Vinduer"
msgid "Show Applications"
msgstr "Vis programmer"
#: ../js/ui/dateMenu.js:87
#: ../js/ui/dateMenu.js:86
msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett"
#: ../js/ui/dateMenu.js:112
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "Åpne kalender"
#. 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:191
#: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y"
@ -1082,80 +1090,78 @@ msgstr "Installer"
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Last ned og installer «%s» fra extensions.gnome.org?"
#: ../js/ui/keyboard.js:291
#: ../js/ui/keyboard.js:308
msgid "tray"
msgstr "varslingsområde"
#: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:206
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205
msgid "Keyboard"
msgstr "Tastatur"
#: ../js/ui/lookingGlass.js:692
#: ../js/ui/lookingGlass.js:691
msgid "No extensions installed"
msgstr "Ingen utvidelser installert"
#. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:746
#: ../js/ui/lookingGlass.js:745
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s har ikke avgitt noen feil."
#: ../js/ui/lookingGlass.js:752
#: ../js/ui/lookingGlass.js:751
msgid "Hide Errors"
msgstr "Skjul feil"
#: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815
msgid "Show Errors"
msgstr "Vis feil"
#: ../js/ui/lookingGlass.js:765
#: ../js/ui/lookingGlass.js:764
msgid "Enabled"
msgstr "Aktivert"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/lookingGlass.js:767
msgid "Disabled"
msgstr "Deaktivert"
#: ../js/ui/lookingGlass.js:770
#: ../js/ui/lookingGlass.js:769
msgid "Error"
msgstr "Feil"
#: ../js/ui/lookingGlass.js:772
#: ../js/ui/lookingGlass.js:771
msgid "Out of date"
msgstr "Utdatert"
#: ../js/ui/lookingGlass.js:774
#: ../js/ui/lookingGlass.js:773
msgid "Downloading"
msgstr "Laster ned"
#: ../js/ui/lookingGlass.js:798
#: ../js/ui/lookingGlass.js:797
msgid "View Source"
msgstr "Vis kildekode"
#: ../js/ui/lookingGlass.js:807
#: ../js/ui/lookingGlass.js:806
msgid "Web Page"
msgstr "Nettside"
#: ../js/ui/messageTray.js:1090
#: ../js/ui/messageTray.js:1088
msgid "Open"
msgstr "Åpne"
#: ../js/ui/messageTray.js:1097
#: ../js/ui/messageTray.js:1095
msgid "Remove"
msgstr "Fjern"
#: ../js/ui/messageTray.js:1554
#: ../js/ui/messageTray.js:1551
msgid "No Messages"
msgstr "Ingen meldinger"
#: ../js/ui/messageTray.js:1572
#: ../js/ui/messageTray.js:1568
msgid "Message Tray"
msgstr "Meldingstrau"
#: ../js/ui/messageTray.js:2641
#: ../js/ui/messageTray.js:2635
msgid "System Information"
msgstr "Systeminformasjon"
@ -1164,11 +1170,11 @@ msgctxt "program"
msgid "Unknown"
msgstr "Ukjent"
#: ../js/ui/overview.js:92
#: ../js/ui/overview.js:95
msgid "Undo"
msgstr "Angre"
#: ../js/ui/overview.js:139
#: ../js/ui/overview.js:144
msgid "Overview"
msgstr "Oversikt"
@ -1176,27 +1182,27 @@ msgstr "Oversikt"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:218
#: ../js/ui/overview.js:221
msgid "Type to search..."
msgstr "Skriv for å søke …"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:236
#: ../js/ui/overview.js:242
msgid "Dash"
msgstr "Favoritter"
#: ../js/ui/panel.js:613
#: ../js/ui/panel.js:608
msgid "Quit"
msgstr "Avslutt"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:642
#: ../js/ui/panel.js:637
msgid "Activities"
msgstr "Aktiviteter"
#: ../js/ui/panel.js:976
#: ../js/ui/panel.js:980
msgid "Top Bar"
msgstr "Topp-panel"
@ -1205,7 +1211,7 @@ msgstr "Topp-panel"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:727
#: ../js/ui/popupMenu.js:732
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -1219,33 +1225,33 @@ msgstr "Lukk"
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:113
#: ../js/ui/screenShield.js:112
msgid "%A, %B %d"
msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:177
#: ../js/ui/screenShield.js:176
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d ny melding"
msgstr[1] "%d nye meldinger"
#: ../js/ui/screenShield.js:179
#: ../js/ui/screenShield.js:178
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d ny varsling"
msgstr[1] "%d nye varslinger"
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780
msgid "Lock"
msgstr "Lås"
#: ../js/ui/searchDisplay.js:403
#: ../js/ui/searchDisplay.js:277
msgid "Searching..."
msgstr "Søker …"
#: ../js/ui/searchDisplay.js:451
#: ../js/ui/searchDisplay.js:325
msgid "No results."
msgstr "Ingen resultater."
@ -1361,7 +1367,7 @@ msgid "disconnecting..."
msgstr "kobler fra …"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1464
#: ../js/ui/status/network.js:1453
msgid "connecting..."
msgstr "kobler til …"
@ -1377,7 +1383,7 @@ msgstr "Innstillinger for tastatur"
msgid "Mouse Settings"
msgstr "Innstillinger for mus"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270
msgid "Sound Settings"
msgstr "Innstillinger for lyd"
@ -1441,15 +1447,15 @@ msgstr "Vennligst oppgi PIN som oppgitt på enheten."
msgid "OK"
msgstr "OK"
#: ../js/ui/status/keyboard.js:363
#: ../js/ui/status/keyboard.js:228
msgid "Show Keyboard Layout"
msgstr "Vis tastaturutforming"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:233
msgid "Region and Language Settings"
msgstr "Innstillinger for region og språk"
#: ../js/ui/status/lockScreenMenu.js:43
#: ../js/ui/status/lockScreenMenu.js:18
msgid "Volume, network, battery"
msgstr "Volum, nettverk, batteri"
@ -1469,7 +1475,7 @@ msgid "unmanaged"
msgstr "ikke håndtert"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1456
msgid "authentication required"
msgstr "autentisering kreves"
@ -1490,72 +1496,72 @@ msgstr "kabel koblet fra"
msgid "unavailable"
msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458
msgid "connection failed"
msgstr "tilkobling feilet"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1545
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392
#: ../js/ui/status/network.js:1534
msgid "More..."
msgstr "Mer …"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1322
msgid "Connected (private)"
msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:641
#: ../js/ui/status/network.js:619
msgid "Auto Ethernet"
msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:688
#: ../js/ui/status/network.js:677
msgid "Auto broadband"
msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:691
#: ../js/ui/status/network.js:680
msgid "Auto dial-up"
msgstr "Automatisk oppringt"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#: ../js/ui/status/network.js:809 ../js/ui/status/network.js:1339
#, c-format
msgid "Auto %s"
msgstr "Automatisk %s"
#: ../js/ui/status/network.js:822
#: ../js/ui/status/network.js:811
msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1352
#: ../js/ui/status/network.js:1341
msgid "Auto wireless"
msgstr "Automatisk trådløst"
#: ../js/ui/status/network.js:1595
#: ../js/ui/status/network.js:1584
msgid "Enable networking"
msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1627
#: ../js/ui/status/network.js:1616
msgid "Wi-Fi"
msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1635
msgid "Network Settings"
msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1692
#: ../js/ui/status/network.js:1679
msgid "Network Manager"
msgstr "Nettverkshåndtering"
#: ../js/ui/status/network.js:1774
#: ../js/ui/status/network.js:1761
msgid "Connection failed"
msgstr "Tilkobling feilet"
#: ../js/ui/status/network.js:1775
#: ../js/ui/status/network.js:1762
msgid "Activation of network connection failed"
msgstr "Aktivering av nettverkstilkobling feilet"
#: ../js/ui/status/network.js:2092
#: ../js/ui/status/network.js:2079
msgid "Networking is disabled"
msgstr "Nettverk er slått av"
@ -1611,65 +1617,65 @@ msgctxt "percent of battery remaining"
msgid "%d%%"
msgstr "%d%%"
#: ../js/ui/status/power.js:196
#: ../js/ui/status/power.js:195
msgid "AC adapter"
msgstr "Strømadapter"
#: ../js/ui/status/power.js:198
#: ../js/ui/status/power.js:197
msgid "Laptop battery"
msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:200
#: ../js/ui/status/power.js:199
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:202
#: ../js/ui/status/power.js:201
msgid "Monitor"
msgstr "Skjerm"
#: ../js/ui/status/power.js:204
#: ../js/ui/status/power.js:203
msgid "Mouse"
msgstr "Mus"
#: ../js/ui/status/power.js:208
#: ../js/ui/status/power.js:207
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:210
#: ../js/ui/status/power.js:209
msgid "Cell phone"
msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:212
#: ../js/ui/status/power.js:211
msgid "Media player"
msgstr "Medieavspiller"
#: ../js/ui/status/power.js:214
#: ../js/ui/status/power.js:213
msgid "Tablet"
msgstr "Nettbrett"
#: ../js/ui/status/power.js:216
#: ../js/ui/status/power.js:215
msgid "Computer"
msgstr "Datamaskin"
#: ../js/ui/status/power.js:218
#: ../js/ui/status/power.js:217
msgctxt "device"
msgid "Unknown"
msgstr "Ukjent"
#. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
#: ../js/ui/status/volume.js:50 ../js/ui/status/volume.js:251
msgid "Volume"
msgstr "Volum"
#: ../js/ui/status/volume.js:256
#: ../js/ui/status/volume.js:62
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:203
#: ../js/ui/unlockDialog.js:201
msgid "Log in as another user"
msgstr "Logg inn som en annen bruker"
#: ../js/ui/unlockDialog.js:229
#: ../js/ui/unlockDialog.js:224
msgid "Unlock Window"
msgstr "Lås opp vindu"
@ -1697,31 +1703,31 @@ msgstr "Ledig"
msgid "Offline"
msgstr "Frakoblet"
#: ../js/ui/userMenu.js:755
#: ../js/ui/userMenu.js:754
msgid "Notifications"
msgstr "Varslinger"
#: ../js/ui/userMenu.js:763
#: ../js/ui/userMenu.js:762
msgid "Settings"
msgstr "Innstillinger"
#: ../js/ui/userMenu.js:771
#: ../js/ui/userMenu.js:770
msgid "Switch User"
msgstr "Bytt bruker"
#: ../js/ui/userMenu.js:776
#: ../js/ui/userMenu.js:775
msgid "Log Out"
msgstr "Logg ut"
#: ../js/ui/userMenu.js:796
#: ../js/ui/userMenu.js:795
msgid "Install Updates & Restart"
msgstr "Installer oppdateringer og start på nytt"
#: ../js/ui/userMenu.js:814
#: ../js/ui/userMenu.js:813
msgid "Your chat status will be set to busy"
msgstr "Din pratestatus vil bli satt til opptatt"
#: ../js/ui/userMenu.js:815
#: ../js/ui/userMenu.js:814
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1730,15 +1736,15 @@ msgstr ""
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
"deres meldinger."
#: ../js/ui/viewSelector.js:85
#: ../js/ui/viewSelector.js:91
msgid "Applications"
msgstr "Programmer"
#: ../js/ui/viewSelector.js:89
#: ../js/ui/viewSelector.js:95
msgid "Search"
msgstr "Søk"
#: ../js/ui/wanda.js:92
#: ../js/ui/wanda.js:94
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1747,11 +1753,15 @@ msgstr ""
"Beklager, ingen visdom til deg i dag:\n"
"%s"
#: ../js/ui/wanda.js:96
#: ../js/ui/wanda.js:98
#, c-format
msgid "%s the Oracle says"
msgstr "Orakelet sier %s"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr "Favorittpåskeegget ditt"
#: ../js/ui/windowAttentionHandler.js:19
#, c-format
msgid "'%s' is ready"
@ -1761,28 +1771,6 @@ msgstr "«%s» er klar"
msgid "Evolution Calendar"
msgstr "Evolution kalender"
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u utgang"
msgstr[1] "%u utganger"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u inngang"
msgstr[1] "%u innganger"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Systemlyder"
#: ../src/main.c:332
msgid "Print version"
msgstr "Skriv ut versjon"

724
po/pl.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

344
po/sk.po
View File

@ -10,8 +10,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: 2013-01-08 18:17+0000\n"
"PO-Revision-Date: 2013-01-01 17:50+0100\n"
"POT-Creation-Date: 2012-12-09 02:53+0000\n"
"PO-Revision-Date: 2012-11-19 22:23+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
@ -40,7 +40,7 @@ msgstr "Zobrazí lištu správ"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Focus the active notification"
msgstr "Zamerať aktívne oznámenie"
msgstr "Zamerať na aktívne oznámenia"
# tooltip
#: ../data/50-gnome-shell-system.xml.in.h:4
@ -166,23 +166,20 @@ msgstr ""
"s jedným používateľom alebo jednou reláciou."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
#, fuzzy
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Show full name in the user menu"
msgstr "Zobraziť celé meno v ponuke používateľa"
msgstr "Vždy zobraziť položku „Odhlásiť sa“ v ponuke používateľa"
# description
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not."
msgstr "Určuje, či bude alebo nebude zobrazené celé meno v ponuke používateľa."
msgstr ""
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Určiť, či bude zapamätané heslo pre pripojenie zašifrovaných alebo "
"prenosných súborových systémov"
# description
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
"The shell will request a password when an encrypted device or a remote "
@ -190,10 +187,6 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"Shell bude po pripojení zašifrovaného alebo prenosného súborového systému "
"požadovať heslo. Ak bude možné toto heslo uložiť pre neskoršie použitie, "
"zobrazí sa zaškrtávacie pole „Zapamätať heslo“. Tento kľúč nastaví "
"predvolený stav zaškrtávacieho poľa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Show the week date in the calendar"
@ -316,11 +309,11 @@ msgstr ""
"základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
"formátu kontajneru by mala byť zmenená."
# PM: tento preklad podľa mňa nezodpovedá nasledujúcemu dlhému popisu nastavenia. Ide skor o režim tvorby ikon (z) aplikácií
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#, fuzzy
#| msgid "Open the application menu"
msgid "The application icon mode."
msgstr "Režim aplikácií s ikonami."
msgstr "Otvorí ponuku aplikácií"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid ""
@ -328,9 +321,6 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Konfiguruje, ako sa majú zobraziť okná v prepínači. Platné možnosti sú "
"„thumbnail-only“ (zobrazí miniatúru okna), „app-icon-only“ (zobrazí iba "
"ikonu aplikácie) alebo „both“ (zobrazí oboje)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window"
@ -378,11 +368,11 @@ msgstr "Rozšírenie"
msgid "Select an extension to configure using the combobox above."
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
#: ../js/gdm/loginDialog.js:566
#: ../js/gdm/loginDialog.js:565
msgid "Session..."
msgstr "Relácia…"
#: ../js/gdm/loginDialog.js:723
#: ../js/gdm/loginDialog.js:722
msgctxt "title"
msgid "Sign In"
msgstr "Prihlásenie"
@ -391,35 +381,35 @@ msgstr "Prihlásenie"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:787
#: ../js/gdm/loginDialog.js:786
msgid "Not listed?"
msgstr "Nie ste v zozname?"
#: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137
#: ../js/gdm/loginDialog.js:962 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
msgid "Cancel"
msgstr "Zrušiť"
#: ../js/gdm/loginDialog.js:979
#: ../js/gdm/loginDialog.js:978
msgctxt "button"
msgid "Sign In"
msgstr "Prihlásiť sa"
#: ../js/gdm/loginDialog.js:979
#: ../js/gdm/loginDialog.js:978
msgid "Next"
msgstr "Ďalej"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260
#: ../js/gdm/loginDialog.js:1086 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278
msgid "Username: "
msgstr "Používateľské meno: "
#: ../js/gdm/loginDialog.js:1383
#: ../js/gdm/loginDialog.js:1382
msgid "Login Window"
msgstr "Prihlasovacie okno"
@ -428,8 +418,8 @@ msgstr "Prihlasovacie okno"
msgid "Power"
msgstr "Napájanie"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:790
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678
#: ../js/ui/userMenu.js:789
msgid "Suspend"
msgstr "Uspať"
@ -437,8 +427,8 @@ msgstr "Uspať"
msgid "Restart"
msgstr "Reštartovať"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788
msgid "Power Off"
msgstr "Vypnúť"
@ -473,19 +463,27 @@ msgid "Execution of '%s' failed:"
msgstr "Spustenie „%s“ zlyhalo:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258
#: ../js/ui/appDisplay.js:259
msgid "All"
msgstr "Všetky"
#: ../js/ui/appDisplay.js:666
#: ../js/ui/appDisplay.js:318
msgid "APPLICATIONS"
msgstr "APLIKÁCIE"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "NASTAVENIA"
#: ../js/ui/appDisplay.js:679
msgid "New Window"
msgstr "Nové okno"
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Odstrániť z obľúbených"
#: ../js/ui/appDisplay.js:670
#: ../js/ui/appDisplay.js:683
msgid "Add to Favorites"
msgstr "Pridať do obľúbených"
@ -502,19 +500,19 @@ msgstr "Program %s bol odstránený z obľúbených."
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#.
#: ../js/ui/calendar.js:61
#: ../js/ui/calendar.js:62
msgctxt "event list time"
msgid "All Day"
msgstr "Celý deň"
#. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:66
#: ../js/ui/calendar.js:67
msgctxt "event list time"
msgid "%H:%M"
msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:73
#: ../js/ui/calendar.js:74
msgctxt "event list time"
msgid "%l:%M %p"
msgstr "%l:%M %p"
@ -524,43 +522,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#: ../js/ui/calendar.js:104
#: ../js/ui/calendar.js:114
msgctxt "grid sunday"
msgid "S"
msgstr "Ne"
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:106
#: ../js/ui/calendar.js:116
msgctxt "grid monday"
msgid "M"
msgstr "Po"
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:108
#: ../js/ui/calendar.js:118
msgctxt "grid tuesday"
msgid "T"
msgstr "Ut"
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:110
#: ../js/ui/calendar.js:120
msgctxt "grid wednesday"
msgid "W"
msgstr "St"
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:112
#: ../js/ui/calendar.js:122
msgctxt "grid thursday"
msgid "T"
msgstr "Št"
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:114
#: ../js/ui/calendar.js:124
msgctxt "grid friday"
msgid "F"
msgstr "Pi"
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:116
#: ../js/ui/calendar.js:126
msgctxt "grid saturday"
msgid "S"
msgstr "So"
@ -571,77 +569,77 @@ msgstr "So"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#.
#: ../js/ui/calendar.js:129
#: ../js/ui/calendar.js:139
msgctxt "list sunday"
msgid "Su"
msgstr "Ne"
#. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:131
#: ../js/ui/calendar.js:141
msgctxt "list monday"
msgid "M"
msgstr "Po"
#. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:133
#: ../js/ui/calendar.js:143
msgctxt "list tuesday"
msgid "T"
msgstr "Ut"
#. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:135
#: ../js/ui/calendar.js:145
msgctxt "list wednesday"
msgid "W"
msgstr "St"
#. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:137
#: ../js/ui/calendar.js:147
msgctxt "list thursday"
msgid "Th"
msgstr "Št"
#. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:139
#: ../js/ui/calendar.js:149
msgctxt "list friday"
msgid "F"
msgstr "Pi"
#. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:141
#: ../js/ui/calendar.js:151
msgctxt "list saturday"
msgid "S"
msgstr "So"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:674
#: ../js/ui/calendar.js:700
msgid "Nothing Scheduled"
msgstr "Žiadne naplánované udalosti"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:690
#: ../js/ui/calendar.js:716
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:693
#: ../js/ui/calendar.js:719
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:703
#: ../js/ui/calendar.js:729
msgid "Today"
msgstr "Dnes"
#: ../js/ui/calendar.js:707
#: ../js/ui/calendar.js:733
msgid "Tomorrow"
msgstr "Zajtra"
#: ../js/ui/calendar.js:718
#: ../js/ui/calendar.js:744
msgid "This week"
msgstr "Tento týždeň"
#: ../js/ui/calendar.js:726
#: ../js/ui/calendar.js:752
msgid "Next week"
msgstr "Ďalší týždeň"
@ -659,11 +657,11 @@ msgstr "Otvoriť pomocou programu %s"
msgid "Eject"
msgstr "Vysunúť"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260
msgid "Password:"
msgstr "Heslo:"
#: ../js/ui/components/keyring.js:101
#: ../js/ui/components/keyring.js:105
msgid "Type again:"
msgstr "Zadajte znovu:"
@ -752,7 +750,7 @@ msgstr "Požaduje sa overenie totožnosti"
msgid "Administrator"
msgstr "Správca"
#: ../js/ui/components/polkitAgent.js:165
#: ../js/ui/components/polkitAgent.js:166
msgid "Authenticate"
msgstr "Overiť totožnosť"
@ -760,7 +758,7 @@ msgstr "Overiť totožnosť"
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
@ -789,7 +787,7 @@ msgstr "Prenos súborov"
#: ../js/ui/components/telepathyClient.js:417
msgid "Chat"
msgstr "Rozhovor"
msgstr ""
#: ../js/ui/components/telepathyClient.js:477
msgid "Unmute"
@ -803,25 +801,28 @@ msgstr "Stlmiť"
#: ../js/ui/components/telepathyClient.js:931
#, no-c-format
msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgstr "<b>Včera</b> o <b>%H:%M</b>"
msgstr ""
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
#: ../js/ui/components/telepathyClient.js:937
#, no-c-format
#, fuzzy, no-c-format
#| msgid "<b>%H:%M</b> on <b>%A</b>"
msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>"
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
#: ../js/ui/components/telepathyClient.js:942
#, no-c-format
#, fuzzy, no-c-format
#| msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%e.</b> <b>%B</b> o <b>%H:%M</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>"
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
#: ../js/ui/components/telepathyClient.js:946
#, no-c-format
#, fuzzy, no-c-format
#| msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
msgstr "<b>%e.</b> <b>%B</b> <b>%Y</b> o <b>%H:%M</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>"
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
@ -1000,17 +1001,19 @@ msgstr "Vnútorná chyba"
#: ../js/ui/components/telepathyClient.js:1339
#, c-format
msgid "Unable to connect to %s"
msgstr "Nepodarilo sa pripojiť účet %s"
msgstr ""
#: ../js/ui/components/telepathyClient.js:1344
#, fuzzy
#| msgid "Edit account"
msgid "View account"
msgstr "Zobraziť účet"
msgstr "Upraviť účet"
#: ../js/ui/components/telepathyClient.js:1384
msgid "Unknown reason"
msgstr "Neznámy dôvod"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87
msgid "Windows"
msgstr "Okná"
@ -1019,18 +1022,18 @@ msgstr "Okná"
msgid "Show Applications"
msgstr "Zobrazí aplikácie"
#: ../js/ui/dateMenu.js:87
#: ../js/ui/dateMenu.js:86
msgid "Date and Time Settings"
msgstr "Nastavenia dátumu a času"
#: ../js/ui/dateMenu.js:112
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "Otvoriť kalendár"
#. 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:191
#: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y"
msgstr "%A, %e. %B %Y"
@ -1139,81 +1142,85 @@ msgstr "Inštalovať"
msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Stiahnuť a nainštalovať „%s“ z extensions.gnome.org?"
#: ../js/ui/keyboard.js:291
#: ../js/ui/keyboard.js:308
msgid "tray"
msgstr "lišta"
#: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205
msgid "Keyboard"
msgstr "Klávesnica"
#: ../js/ui/lookingGlass.js:692
#: ../js/ui/lookingGlass.js:691
msgid "No extensions installed"
msgstr "Žiadne nainštalované rozšírenia"
#. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:746
#: ../js/ui/lookingGlass.js:745
#, c-format
msgid "%s has not emitted any errors."
msgstr "%s nevyslal žiadnu chybu."
#: ../js/ui/lookingGlass.js:752
#: ../js/ui/lookingGlass.js:751
msgid "Hide Errors"
msgstr "Skryť chyby"
#: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815
msgid "Show Errors"
msgstr "Zobraziť chyby"
#: ../js/ui/lookingGlass.js:765
#: ../js/ui/lookingGlass.js:764
msgid "Enabled"
msgstr "Povolené"
#: ../js/ui/lookingGlass.js:768
#: ../js/ui/lookingGlass.js:767
msgid "Disabled"
msgstr "Zakázané"
#: ../js/ui/lookingGlass.js:770
#: ../js/ui/lookingGlass.js:769
msgid "Error"
msgstr "Chyba"
#: ../js/ui/lookingGlass.js:772
#: ../js/ui/lookingGlass.js:771
msgid "Out of date"
msgstr "Neaktuálne"
#: ../js/ui/lookingGlass.js:774
#: ../js/ui/lookingGlass.js:773
msgid "Downloading"
msgstr "Sťahuje sa"
# PK: ide tu o zdrojovy kod?
#: ../js/ui/lookingGlass.js:798
#: ../js/ui/lookingGlass.js:797
msgid "View Source"
msgstr "Zobraziť zdroj"
#: ../js/ui/lookingGlass.js:807
#: ../js/ui/lookingGlass.js:806
msgid "Web Page"
msgstr "Webová stránka"
#: ../js/ui/messageTray.js:1090
#: ../js/ui/messageTray.js:1088
msgid "Open"
msgstr "Otvoriť"
#: ../js/ui/messageTray.js:1097
#: ../js/ui/messageTray.js:1095
msgid "Remove"
msgstr "Odstrániť"
#: ../js/ui/messageTray.js:1554
# DK: zvazoval som pouzit "Panel správ"
# neviem co bude vhodnejsie ako preklad "tray"
#: ../js/ui/messageTray.js:1551
#, fuzzy
#| msgid "Message Tray"
msgid "No Messages"
msgstr "Žiadne správy"
msgstr "Lišta správ"
# DK: zvazoval som pouzit "Panel správ"
# neviem co bude vhodnejsie ako preklad "tray"
#: ../js/ui/messageTray.js:1572
#: ../js/ui/messageTray.js:1568
msgid "Message Tray"
msgstr "Lišta správ"
#: ../js/ui/messageTray.js:2641
#: ../js/ui/messageTray.js:2635
msgid "System Information"
msgstr "Informácie o systéme"
@ -1222,11 +1229,11 @@ msgctxt "program"
msgid "Unknown"
msgstr "Neznámy"
#: ../js/ui/overview.js:92
#: ../js/ui/overview.js:95
msgid "Undo"
msgstr "Vrátiť"
#: ../js/ui/overview.js:139
#: ../js/ui/overview.js:144
msgid "Overview"
msgstr "Prehľad"
@ -1234,27 +1241,27 @@ msgstr "Prehľad"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/overview.js:218
#: ../js/ui/overview.js:221
msgid "Type to search..."
msgstr "Vyhľadávanie…"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:236
#: ../js/ui/overview.js:242
msgid "Dash"
msgstr "Dok"
#: ../js/ui/panel.js:613
#: ../js/ui/panel.js:608
msgid "Quit"
msgstr "Ukončiť"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:642
#: ../js/ui/panel.js:637
msgid "Activities"
msgstr "Aktivity"
#: ../js/ui/panel.js:976
#: ../js/ui/panel.js:980
msgid "Top Bar"
msgstr "Horná lišta"
@ -1263,7 +1270,7 @@ msgstr "Horná lišta"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:727
#: ../js/ui/popupMenu.js:732
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -1280,11 +1287,11 @@ msgstr "Zavrieť"
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. Translators: This is a time format for a date in
#. long format
#: ../js/ui/screenShield.js:113
#: ../js/ui/screenShield.js:112
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#: ../js/ui/screenShield.js:177
#: ../js/ui/screenShield.js:176
#, c-format
msgid "%d new message"
msgid_plural "%d new messages"
@ -1292,7 +1299,7 @@ msgstr[0] "%d nových správ"
msgstr[1] "%d nová správa"
msgstr[2] "%d nové správy"
#: ../js/ui/screenShield.js:179
#: ../js/ui/screenShield.js:178
#, c-format
msgid "%d new notification"
msgid_plural "%d new notifications"
@ -1300,15 +1307,15 @@ msgstr[0] "%d nových oznámení"
msgstr[1] "%d nové oznámenie"
msgstr[2] "%d nové oznámenia"
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780
msgid "Lock"
msgstr "Uzamknúť"
#: ../js/ui/searchDisplay.js:403
#: ../js/ui/searchDisplay.js:277
msgid "Searching..."
msgstr "Hľadá sa…"
#: ../js/ui/searchDisplay.js:451
#: ../js/ui/searchDisplay.js:325
msgid "No results."
msgstr "Žiadne výsledky."
@ -1427,7 +1434,7 @@ msgid "disconnecting..."
msgstr "odpája sa…"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1464
#: ../js/ui/status/network.js:1453
msgid "connecting..."
msgstr "pripája sa…"
@ -1443,7 +1450,7 @@ msgstr "Nastavenia klávesnice"
msgid "Mouse Settings"
msgstr "Nastavenia myši"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270
msgid "Sound Settings"
msgstr "Nastavenia zvuku"
@ -1507,15 +1514,15 @@ msgstr "Zadajte PIN, ktoré je uvedené na zariadení."
msgid "OK"
msgstr "Ok"
#: ../js/ui/status/keyboard.js:363
#: ../js/ui/status/keyboard.js:228
msgid "Show Keyboard Layout"
msgstr "Zobraziť rozloženie klávesnice"
#: ../js/ui/status/keyboard.js:368
#: ../js/ui/status/keyboard.js:233
msgid "Region and Language Settings"
msgstr "Miestne a jazykové nastavenia"
#: ../js/ui/status/lockScreenMenu.js:43
#: ../js/ui/status/lockScreenMenu.js:18
msgid "Volume, network, battery"
msgstr "Hlasitosť, sieť, batéria"
@ -1536,7 +1543,7 @@ msgid "unmanaged"
msgstr "nespravované"
#. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1456
msgid "authentication required"
msgstr "požaduje sa overenie totožnosti"
@ -1557,72 +1564,72 @@ msgstr "kábel odpojený"
msgid "unavailable"
msgstr "nedostupné"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458
msgid "connection failed"
msgstr "pripojenie zlyhalo"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1545
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392
#: ../js/ui/status/network.js:1534
msgid "More..."
msgstr "Viac…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1322
msgid "Connected (private)"
msgstr "Pripojené (súkromne)"
#: ../js/ui/status/network.js:641
#: ../js/ui/status/network.js:619
msgid "Auto Ethernet"
msgstr "Automatický ethernet"
#: ../js/ui/status/network.js:688
#: ../js/ui/status/network.js:677
msgid "Auto broadband"
msgstr "Automatické širokopásmové pripojenie"
#: ../js/ui/status/network.js:691
#: ../js/ui/status/network.js:680
msgid "Auto dial-up"
msgstr "Automatické vytáčané pripojenie"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#: ../js/ui/status/network.js:809 ../js/ui/status/network.js:1339
#, c-format
msgid "Auto %s"
msgstr "Automatické pripojenie %s"
#: ../js/ui/status/network.js:822
#: ../js/ui/status/network.js:811
msgid "Auto bluetooth"
msgstr "Automatický bluetooth"
#: ../js/ui/status/network.js:1352
#: ../js/ui/status/network.js:1341
msgid "Auto wireless"
msgstr "Automatická bezdrôtová sieť"
#: ../js/ui/status/network.js:1595
#: ../js/ui/status/network.js:1584
msgid "Enable networking"
msgstr "Povoliť sieť"
#: ../js/ui/status/network.js:1627
#: ../js/ui/status/network.js:1616
msgid "Wi-Fi"
msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1635
msgid "Network Settings"
msgstr "Nastavenia siete"
#: ../js/ui/status/network.js:1692
#: ../js/ui/status/network.js:1679
msgid "Network Manager"
msgstr "Správca siete"
#: ../js/ui/status/network.js:1774
#: ../js/ui/status/network.js:1761
msgid "Connection failed"
msgstr "Pripojenie zlyhalo"
#: ../js/ui/status/network.js:1775
#: ../js/ui/status/network.js:1762
msgid "Activation of network connection failed"
msgstr "Aktivácia pripojenia k sieti zlyhala"
#: ../js/ui/status/network.js:2092
#: ../js/ui/status/network.js:2079
msgid "Networking is disabled"
msgstr "Sieť je zakázaná"
@ -1728,19 +1735,19 @@ msgid "Unknown"
msgstr "Neznáme"
#. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
#: ../js/ui/status/volume.js:50 ../js/ui/status/volume.js:251
msgid "Volume"
msgstr "Hlasitosť"
#: ../js/ui/status/volume.js:256
#: ../js/ui/status/volume.js:62
msgid "Microphone"
msgstr "Mikrofón"
#: ../js/ui/unlockDialog.js:203
#: ../js/ui/unlockDialog.js:201
msgid "Log in as another user"
msgstr "Prihlásiť ako iný používateľ"
#: ../js/ui/unlockDialog.js:229
#: ../js/ui/unlockDialog.js:224
msgid "Unlock Window"
msgstr "Odomykacie okno"
@ -1768,31 +1775,31 @@ msgstr "Nečinný"
msgid "Offline"
msgstr "Odhlásený"
#: ../js/ui/userMenu.js:755
#: ../js/ui/userMenu.js:754
msgid "Notifications"
msgstr "Upozornenia"
#: ../js/ui/userMenu.js:763
#: ../js/ui/userMenu.js:762
msgid "Settings"
msgstr "Nastavenia"
#: ../js/ui/userMenu.js:771
#: ../js/ui/userMenu.js:770
msgid "Switch User"
msgstr "Prepnúť používateľa"
#: ../js/ui/userMenu.js:776
#: ../js/ui/userMenu.js:775
msgid "Log Out"
msgstr "Odhlásiť sa"
#: ../js/ui/userMenu.js:796
#: ../js/ui/userMenu.js:795
msgid "Install Updates & Restart"
msgstr "Nainštalovať aktualizácie a reštartovať"
#: ../js/ui/userMenu.js:814
#: ../js/ui/userMenu.js:813
msgid "Your chat status will be set to busy"
msgstr "Váš stav bude nastavený na zaneprázdnený"
#: ../js/ui/userMenu.js:815
#: ../js/ui/userMenu.js:814
msgid ""
"Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages."
@ -1800,15 +1807,15 @@ msgstr ""
"Oznámenia, vrátane správ rozhovoru, sú teraz zakázané. Váš stav online bol "
"nastavený tak, aby ostatní vedeli, že nemusíte vidieť ich správy."
#: ../js/ui/viewSelector.js:85
#: ../js/ui/viewSelector.js:91
msgid "Applications"
msgstr "Aplikácie"
#: ../js/ui/viewSelector.js:89
#: ../js/ui/viewSelector.js:95
msgid "Search"
msgstr "Hľadať"
#: ../js/ui/wanda.js:92
#: ../js/ui/wanda.js:94
#, c-format
msgid ""
"Sorry, no wisdom for you today:\n"
@ -1817,11 +1824,15 @@ msgstr ""
"Prepáčte, dnes nie je pre vás pripravená žiadna múdrosť:\n"
"%s"
#: ../js/ui/wanda.js:96
#: ../js/ui/wanda.js:98
#, c-format
msgid "%s the Oracle says"
msgstr "Veštec hovorí %s"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr "Vaše obľúbené veľkonočné vajce"
# %s je totiž titulok okna
# informacna bublina
#: ../js/ui/windowAttentionHandler.js:19
@ -1876,30 +1887,6 @@ msgstr "Predvolený"
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "APPLICATIONS"
#~ msgstr "APLIKÁCIE"
#~ msgid "SETTINGS"
#~ msgstr "NASTAVENIA"
#~ msgid "Your favorite Easter Egg"
#~ msgstr "Vaše obľúbené veľkonočné vajce"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u výstupov"
#~ msgstr[1] "%u výstup"
#~ msgstr[2] "%u výstupy"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u vstupov"
#~ msgstr[1] "%u vstup"
#~ msgstr[2] "%u vstupy"
#~ msgid "System Sounds"
#~ msgstr "Zvuky systému"
#~ msgid "Subscription request"
#~ msgstr "Žiadosť o potvrdenie prístupu"
@ -1917,3 +1904,18 @@ msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "Reconnect"
#~ msgstr "Znovu sa pripojiť"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u výstupov"
#~ msgstr[1] "%u výstup"
#~ msgstr[2] "%u výstupy"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u vstupov"
#~ msgstr[1] "%u vstup"
#~ msgstr[2] "%u vstupy"
#~ msgid "System Sounds"
#~ msgstr "Zvuky systému"

1081
po/sl.po

File diff suppressed because it is too large Load Diff

3571
po/ug.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -75,8 +75,9 @@ def start_shell():
if 'GI_TYPELIB_PATH' in os.environ:
typelib_dir += ':%s' % (os.environ['GI_TYPELIB_PATH'],)
env.update({'GI_TYPELIB_PATH' : typelib_dir,
'GNOME_SHELL_JS' : os.path.join(top_dir, "js"),
env.update({'GNOME_SHELL_JS' : os.path.join(top_dir, "js"),
'GNOME_SHELL_BINDIR' : self_dir,
'GI_TYPELIB_PATH' : typelib_dir,
'GNOME_SHELL_DATADIR' : os.path.join(top_dir, "data"),
'GSETTINGS_SCHEMA_DIR' : os.path.join(top_dir, "data") })

View File

@ -284,44 +284,12 @@ gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin)
_shell_wm_kill_switch_workspace (get_shell_wm());
}
static gboolean
ignore_crossing_event (MetaPlugin *plugin,
XIEnterEvent *enter_event)
{
MetaScreen *screen = meta_plugin_get_screen (plugin);
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
if (enter_event->event == clutter_x11_get_stage_window (stage))
{
/* If the pointer enters a child of the stage window (eg, a
* trayicon), we want to consider it to still be in the stage,
* so don't let Clutter see the event.
*/
if (enter_event->detail == XINotifyInferior)
return TRUE;
/* If the pointer is grabbed by a window it is not currently in,
* filter that out as well. In particular, if a trayicon grabs
* the pointer after a click on its label, we don't want to hide
* the message tray. Filtering out this event will leave Clutter
* out of sync, but that happens fairly often with grabs, and we
* can work around it. (Eg, shell_global_sync_pointer().)
*/
if (enter_event->mode == XINotifyGrab &&
(enter_event->detail == XINotifyNonlinear ||
enter_event->detail == XINotifyNonlinearVirtual))
return TRUE;
}
return FALSE;
}
static gboolean
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
XEvent *xev)
{
MetaScreen *screen = meta_plugin_get_screen (plugin);
MetaDisplay *display = meta_screen_get_display (screen);
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin);
#ifdef GLX_INTEL_swap_event
@ -341,15 +309,26 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
}
#endif
/* Make sure that Clutter doesn't see certain focus change events,
* so that when we're moving into something like a tray icon, we
* don't unfocus the container. */
if (xev->type == GenericEvent &&
xev->xcookie.extension == meta_display_get_xinput_opcode (display))
if ((xev->xany.type == EnterNotify || xev->xany.type == LeaveNotify)
&& xev->xcrossing.window == clutter_x11_get_stage_window (stage))
{
XIEvent *input_event = (XIEvent *) xev->xcookie.data;
if ((input_event->evtype == XI_Enter || input_event->evtype == XI_Leave) &&
ignore_crossing_event (plugin, (XIEnterEvent *) input_event))
/* If the pointer enters a child of the stage window (eg, a
* trayicon), we want to consider it to still be in the stage,
* so don't let Clutter see the event.
*/
if (xev->xcrossing.detail == NotifyInferior)
return TRUE;
/* If the pointer is grabbed by a window it is not currently in,
* filter that out as well. In particular, if a trayicon grabs
* the pointer after a click on its label, we don't want to hide
* the message tray. Filtering out this event will leave Clutter
* out of sync, but that happens fairly often with grabs, and we
* can work around it. (Eg, shell_global_sync_pointer().)
*/
if (xev->xcrossing.mode == NotifyGrab &&
(xev->xcrossing.detail == NotifyNonlinear ||
xev->xcrossing.detail == NotifyNonlinearVirtual))
return TRUE;
}

View File

@ -616,9 +616,6 @@ shell_global_set_cursor (ShellGlobal *global,
case SHELL_CURSOR_POINTING_HAND:
name = "hand";
break;
case SHELL_CURSOR_CROSSHAIR:
name = "crosshair";
break;
default:
g_return_if_reached ();
}
@ -641,9 +638,6 @@ shell_global_set_cursor (ShellGlobal *global,
case SHELL_CURSOR_POINTING_HAND:
cursor_type = GDK_HAND2;
break;
case SHELL_CURSOR_CROSSHAIR:
cursor_type = GDK_CROSSHAIR;
break;
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
cursor_type = GDK_X_CURSOR;
break;
@ -1410,6 +1404,7 @@ guint32
shell_global_get_current_time (ShellGlobal *global)
{
guint32 time;
const ClutterEvent *clutter_event;
/* In case we have a xdnd timestamp use it */
if (global->xdnd_timestamp != 0)
@ -1420,7 +1415,7 @@ shell_global_get_current_time (ShellGlobal *global)
from some Clutter event callbacks.
clutter_get_current_event_time() will return the correct time
from a Clutter event callback, but may return CLUTTER_CURRENT_TIME
from a Clutter event callback, but may return an out-of-date
timestamp if called at other times.
So we try meta_display_get_current_time() first, since we
@ -1430,9 +1425,17 @@ shell_global_get_current_time (ShellGlobal *global)
time = meta_display_get_current_time (global->meta_display);
if (time != CLUTTER_CURRENT_TIME)
return time;
return time;
/*
* We don't use clutter_get_current_event_time as it can give us a
* too old timestamp if there is no current event.
*/
clutter_event = clutter_get_current_event ();
return clutter_get_current_event_time ();
if (clutter_event != NULL)
return clutter_event_get_time (clutter_event);
else
return CLUTTER_CURRENT_TIME;
}
/**

View File

@ -63,8 +63,7 @@ typedef enum {
SHELL_CURSOR_DND_UNSUPPORTED_TARGET,
SHELL_CURSOR_DND_MOVE,
SHELL_CURSOR_DND_COPY,
SHELL_CURSOR_POINTING_HAND,
SHELL_CURSOR_CROSSHAIR
SHELL_CURSOR_POINTING_HAND
} ShellCursor;
void shell_global_set_cursor (ShellGlobal *global,

View File

@ -32,7 +32,6 @@ typedef struct _screenshot_data {
ShellScreenshot *screenshot;
char *filename;
char *filename_used;
cairo_surface_t *image;
cairo_rectangle_int_t screenshot_area;
@ -65,140 +64,25 @@ on_screenshot_written (GObject *source,
if (screenshot_data->callback)
screenshot_data->callback (screenshot_data->screenshot,
g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)),
&screenshot_data->screenshot_area,
screenshot_data->filename_used);
&screenshot_data->screenshot_area);
cairo_surface_destroy (screenshot_data->image);
g_object_unref (screenshot_data->screenshot);
g_free (screenshot_data->filename);
g_free (screenshot_data->filename_used);
g_free (screenshot_data);
}
/* called in an I/O thread */
static GOutputStream *
get_stream_for_unique_path (const gchar *path,
const gchar *filename,
gchar **filename_used)
{
GOutputStream *stream;
GFile *file;
gchar *real_path, *real_filename, *name, *ptr;
gint idx;
ptr = g_strrstr (filename, ".png");
if (ptr != NULL)
real_filename = g_strndup (filename, ptr - filename);
else
real_filename = g_strdup (filename);
idx = 0;
real_path = NULL;
do
{
if (idx == 0)
name = g_strdup_printf ("%s.png", real_filename);
else
name = g_strdup_printf ("%s - %d.png", real_filename, idx);
real_path = g_build_filename (path, name, NULL);
g_free (name);
file = g_file_new_for_path (real_path);
stream = G_OUTPUT_STREAM (g_file_create (file, G_FILE_CREATE_NONE, NULL, NULL));
g_object_unref (file);
if (stream != NULL)
*filename_used = real_path;
else
g_free (real_path);
idx++;
}
while (stream == NULL);
g_free (real_filename);
return stream;
}
/* called in an I/O thread */
static GOutputStream *
get_stream_for_filename (const gchar *filename,
gchar **filename_used)
{
const gchar *path;
path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
{
path = g_get_home_dir ();
if (!g_file_test (path, G_FILE_TEST_EXISTS))
return NULL;
}
return get_stream_for_unique_path (path, filename, filename_used);
}
static GOutputStream *
prepare_write_stream (const gchar *filename,
gchar **filename_used)
{
GOutputStream *stream;
GFile *file;
if (g_path_is_absolute (filename))
{
file = g_file_new_for_path (filename);
*filename_used = g_strdup (filename);
stream = G_OUTPUT_STREAM (g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL));
g_object_unref (file);
}
else
{
stream = get_stream_for_filename (filename, filename_used);
}
return stream;
}
static cairo_status_t
do_write_to_stream (void *closure,
const guchar *data,
guint length)
{
GOutputStream *stream = closure;
gboolean res;
res = g_output_stream_write_all (stream, data, length, NULL, NULL, NULL);
return res ? CAIRO_STATUS_SUCCESS : CAIRO_STATUS_WRITE_ERROR;
}
static void
write_screenshot_thread (GSimpleAsyncResult *result,
GObject *object,
GCancellable *cancellable)
{
cairo_status_t status;
GOutputStream *stream;
_screenshot_data *screenshot_data = g_async_result_get_user_data (G_ASYNC_RESULT (result));
g_assert (screenshot_data != NULL);
stream = prepare_write_stream (screenshot_data->filename,
&screenshot_data->filename_used);
if (stream == NULL)
status = CAIRO_STATUS_FILE_NOT_FOUND;
else
status = cairo_surface_write_to_png_stream (screenshot_data->image, do_write_to_stream, stream);
status = cairo_surface_write_to_png (screenshot_data->image, screenshot_data->filename);
g_simple_async_result_set_op_res_gboolean (result, status == CAIRO_STATUS_SUCCESS);
g_clear_object (&stream);
}
static void

View File

@ -26,9 +26,8 @@ GType shell_screenshot_get_type (void) G_GNUC_CONST;
ShellScreenshot *shell_screenshot_new (void);
typedef void (*ShellScreenshotCallback) (ShellScreenshot *screenshot,
gboolean success,
cairo_rectangle_int_t *screenshot_area,
const gchar *filename_used);
gboolean success,
cairo_rectangle_int_t *screenshot_area);
void shell_screenshot_screenshot_area (ShellScreenshot *screenshot,
int x,

View File

@ -32,7 +32,6 @@
#include <glib-object.h>
#include <clutter/clutter.h>
#include <math.h>
#include "st-adjustment.h"
#include "st-private.h"
@ -567,31 +566,3 @@ st_adjustment_get_values (StAdjustment *adjustment,
*page_size = priv->page_size;
}
/**
* st_adjustment_adjust_for_scroll_event:
* @adjustment: An #StAdjustment
* @delta: A delta, retrieved directly from clutter_event_get_scroll_delta()
* or similar.
*
* Adjusts the adjustment using delta values from a scroll event.
* You should use this instead of using st_adjustment_set_value()
* as this method will tweak the values directly using the same
* math as GTK+, to ensure that scrolling is consistent across
* the environment.
*/
void
st_adjustment_adjust_for_scroll_event (StAdjustment *adjustment,
gdouble delta)
{
StAdjustmentPrivate *priv;
gdouble new_value, scroll_unit;
g_return_if_fail (ST_IS_ADJUSTMENT (adjustment));
priv = adjustment->priv;
scroll_unit = pow (priv->page_size, 2.0 / 3.0);
new_value = priv->value + delta * scroll_unit;
st_adjustment_set_value (adjustment, new_value);
}

View File

@ -99,10 +99,6 @@ void st_adjustment_get_values (StAdjustment *adjustment,
gdouble *step_increment,
gdouble *page_increment,
gdouble *page_size);
void st_adjustment_adjust_for_scroll_event (StAdjustment *adjustment,
gdouble delta);
G_END_DECLS
#endif /* __ST_ADJUSTMENT_H__ */

View File

@ -152,7 +152,7 @@ st_drawing_area_paint (ClutterActor *self)
cogl_set_source (priv->material);
cogl_rectangle_with_texture_coords (content_box.x1, content_box.y1,
content_box.x2, content_box.y2,
width, height,
0.0f, 0.0f, 1.0f, 1.0f);
}
}

View File

@ -433,57 +433,42 @@ st_scroll_bar_constructor (GType type,
return obj;
}
static void
adjust_with_direction (StAdjustment *adj,
ClutterScrollDirection direction)
{
gdouble delta;
switch (direction)
{
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_LEFT:
delta = -1.0;
break;
case CLUTTER_SCROLL_RIGHT:
case CLUTTER_SCROLL_DOWN:
delta = 1.0;
break;
case CLUTTER_SCROLL_SMOOTH:
g_assert_not_reached ();
break;
}
st_adjustment_adjust_for_scroll_event (adj, delta);
}
static gboolean
st_scroll_bar_scroll_event (ClutterActor *actor,
ClutterScrollEvent *event)
{
StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
gdouble step, value, delta_x, delta_y;
if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
return TRUE;
if (priv->adjustment)
{
g_object_get (priv->adjustment,
"step-increment", &step,
"value", &value,
NULL);
}
else
{
return FALSE;
}
switch (event->direction)
{
case CLUTTER_SCROLL_SMOOTH:
{
gdouble delta_x, delta_y;
clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
if (priv->vertical)
st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_y);
else
st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_x);
}
clutter_event_get_scroll_delta ((ClutterEvent *)event,
&delta_x, &delta_y);
if (fabs (delta_x) > fabs (delta_y))
st_adjustment_set_value (priv->adjustment, value + delta_x);
else
st_adjustment_set_value (priv->adjustment, value + delta_y);
break;
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
case CLUTTER_SCROLL_LEFT:
st_adjustment_set_value (priv->adjustment, value - step);
break;
case CLUTTER_SCROLL_DOWN:
case CLUTTER_SCROLL_RIGHT:
adjust_with_direction (priv->adjustment, event->direction);
st_adjustment_set_value (priv->adjustment, value + step);
break;
}

View File

@ -665,31 +665,6 @@ st_scroll_view_allocate (ClutterActor *actor,
}
static void
adjust_with_direction (StAdjustment *adj,
ClutterScrollDirection direction)
{
gdouble delta;
switch (direction)
{
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_LEFT:
delta = -1.0;
break;
case CLUTTER_SCROLL_RIGHT:
case CLUTTER_SCROLL_DOWN:
delta = 1.0;
break;
case CLUTTER_SCROLL_SMOOTH:
default:
g_assert_not_reached ();
break;
}
st_adjustment_adjust_for_scroll_event (adj, delta);
}
static void
st_scroll_view_style_changed (StWidget *widget)
{
@ -712,31 +687,57 @@ st_scroll_view_scroll_event (ClutterActor *self,
ClutterScrollEvent *event)
{
StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv;
gdouble value, step, hvalue, vvalue, delta_x, delta_y;
/* don't handle scroll events if requested not to */
if (!priv->mouse_scroll)
return FALSE;
if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
return TRUE;
switch (event->direction)
{
case CLUTTER_SCROLL_SMOOTH:
clutter_event_get_scroll_delta ((ClutterEvent *)event,
&delta_x, &delta_y);
g_object_get (priv->hadjustment,
"value", &hvalue,
NULL);
g_object_get (priv->vadjustment,
"value", &vvalue,
NULL);
break;
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
g_object_get (priv->vadjustment,
"step-increment", &step,
"value", &value,
NULL);
break;
case CLUTTER_SCROLL_LEFT:
case CLUTTER_SCROLL_RIGHT:
g_object_get (priv->hadjustment,
"step-increment", &step,
"value", &value,
NULL);
break;
}
switch (event->direction)
{
case CLUTTER_SCROLL_SMOOTH:
{
gdouble delta_x, delta_y;
clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
st_adjustment_adjust_for_scroll_event (priv->hadjustment, delta_x);
st_adjustment_adjust_for_scroll_event (priv->vadjustment, delta_y);
}
st_adjustment_set_value (priv->hadjustment, hvalue + delta_x);
st_adjustment_set_value (priv->vadjustment, vvalue + delta_y);
break;
case CLUTTER_SCROLL_UP:
st_adjustment_set_value (priv->vadjustment, value - step);
break;
case CLUTTER_SCROLL_DOWN:
adjust_with_direction (priv->vadjustment, event->direction);
st_adjustment_set_value (priv->vadjustment, value + step);
break;
case CLUTTER_SCROLL_LEFT:
st_adjustment_set_value (priv->hadjustment, value - step);
break;
case CLUTTER_SCROLL_RIGHT:
adjust_with_direction (priv->hadjustment, event->direction);
st_adjustment_set_value (priv->hadjustment, value + step);
break;
}

View File

@ -30,6 +30,8 @@
#define CACHE_PREFIX_ICON "icon:"
#define CACHE_PREFIX_URI "uri:"
#define CACHE_PREFIX_URI_FOR_CAIRO "uri-for-cairo:"
#define CACHE_PREFIX_RAW_CHECKSUM "raw-checksum:"
#define CACHE_PREFIX_COMPRESSED_CHECKSUM "compressed-checksum:"
struct _StTextureCachePrivate
{
@ -1412,6 +1414,63 @@ st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache,
return surface;
}
/**
* st_texture_cache_load_from_raw:
* @cache: a #StTextureCache
* @data: (array length=len): raw pixel data
* @len: the length of @data
* @has_alpha: whether @data includes an alpha channel
* @width: width in pixels of @data
* @height: width in pixels of @data
* @rowstride: rowstride of @data
* @size: size of icon to return
*
* Creates (or retrieves from cache) an icon based on raw pixel data.
*
* Return value: (transfer none): a new #ClutterActor displaying a
* pixbuf created from @data and the other parameters.
**/
ClutterActor *
st_texture_cache_load_from_raw (StTextureCache *cache,
const guchar *data,
gsize len,
gboolean has_alpha,
int width,
int height,
int rowstride,
int size,
GError **error)
{
ClutterTexture *texture;
CoglHandle texdata;
char *key;
char *checksum;
texture = create_default_texture ();
clutter_actor_set_size (CLUTTER_ACTOR (texture), size, size);
/* In theory, two images of with different width and height could have the same
* pixel data and thus hash the same. (Say, a 16x16 and a 8x32 blank image.)
* We ignore this for now. If anybody hits this problem they should use
* GChecksum directly to compute a checksum including the width and height.
*/
checksum = g_compute_checksum_for_data (G_CHECKSUM_SHA1, data, len);
key = g_strdup_printf (CACHE_PREFIX_RAW_CHECKSUM "checksum=%s", checksum);
g_free (checksum);
texdata = g_hash_table_lookup (cache->priv->keyed_cache, key);
if (texdata == NULL)
{
texdata = data_to_cogl_handle (data, has_alpha, width, height, rowstride, TRUE);
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texdata);
}
g_free (key);
set_texture_cogl_texture (texture, texdata);
return CLUTTER_ACTOR (texture);
}
static StTextureCache *instance = NULL;
/**

View File

@ -96,6 +96,16 @@ CoglHandle st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
cairo_surface_t *st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache,
const gchar *file_path);
ClutterActor *st_texture_cache_load_from_raw (StTextureCache *cache,
const guchar *data,
gsize len,
gboolean has_alpha,
int width,
int height,
int rowstride,
int size,
GError **error);
/**
* StTextureCacheLoader: (skip)
* @cache: a #StTextureCache

View File

@ -770,72 +770,6 @@ st_theme_node_lookup_double (StThemeNode *node,
return result;
}
/**
* st_theme_node_lookup_time:
* @node: a #StThemeNode
* @property_name: The name of the time property
* @inherit: if %TRUE, if a value is not found for the property on the
* node, then it will be looked up on the parent node, and then on the
* parent's parent, and so forth. Note that if the property has a
* value of 'inherit' it will be inherited even if %FALSE is passed
* in for @inherit; this only affects the default behavior for inheritance.
* @value: (out): location to store the value that was determined.
* If the property is not found, the value in this location
* will not be changed.
*
* Generically looks up a property containing a single time value,
* which is converted to milliseconds.
*
* Return value: %TRUE if the property was found in the properties for this
* theme node (or in the properties of parent nodes when inheriting.)
*/
gboolean
st_theme_node_lookup_time (StThemeNode *node,
const char *property_name,
gboolean inherit,
double *value)
{
gboolean result = FALSE;
int i;
ensure_properties (node);
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0)
{
CRTerm *term = decl->value;
if (term->type != TERM_NUMBER)
continue;
switch (term->content.num->type)
{
case NUM_TIME_S:
*value = 1000 * term->content.num->val;
result = TRUE;
break;
case NUM_TIME_MS:
*value = term->content.num->val;
result = TRUE;
break;
default:
;
}
if (result)
break;
}
}
if (!result && inherit && node->parent_node)
result = st_theme_node_lookup_time (node->parent_node, property_name, inherit, value);
return result;
}
/**
* st_theme_node_get_double:
* @node: a #StThemeNode
@ -2129,7 +2063,7 @@ st_theme_node_get_transition_duration (StThemeNode *node)
if (node->transition_duration > -1)
return st_slow_down_factor * node->transition_duration;
st_theme_node_lookup_time (node, "transition-duration", FALSE, &value);
st_theme_node_lookup_double (node, "transition-duration", FALSE, &value);
node->transition_duration = (int)value;

View File

@ -134,10 +134,6 @@ gboolean st_theme_node_lookup_length (StThemeNode *node,
const char *property_name,
gboolean inherit,
gdouble *length);
gboolean st_theme_node_lookup_time (StThemeNode *node,
const char *property_name,
gboolean inherit,
gdouble *value);
gboolean st_theme_node_lookup_shadow (StThemeNode *node,
const char *property_name,
gboolean inherit,

View File

@ -30,15 +30,13 @@ builddir=`cd $builddir && pwd`
srcdir=$builddir/@srcdir@
srcdir=`cd $srcdir && pwd`
GI_TYPELIB_PATH="$GI_TYPELIB_PATH${GI_TYPELIB_PATH:+:}@MUTTER_TYPELIB_DIR@:$builddir/../src:$builddir/../src/gvc"
GI_TYPELIB_PATH="$GI_TYPELIB_PATH${GI_TYPELIB_PATH:+:}@MUTTER_TYPELIB_DIR@:$builddir/../src"
GJS_PATH="$srcdir:$srcdir/../js"
GJS_DEBUG_OUTPUT=stderr
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
GNOME_SHELL_TESTSDIR="$srcdir/"
GNOME_SHELL_JS="$srcdir/../js"
GNOME_SHELL_DATADIR="$srcdir/../data"
export GI_TYPELIB_PATH GJS_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_TESTSDIR GNOME_SHELL_JS GNOME_SHELL_DATADIR LD_PRELOAD
export GI_TYPELIB_PATH GJS_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_JS GNOME_SHELL_TESTSDIR LD_PRELOAD
for test in $tests ; do
$debug $builddir/../src/run-js-test $test || exit $?

View File

@ -98,7 +98,7 @@ stage {
background-color: #333;
border: 2px solid black;
border-radius: 8px;
transition-duration: 1s;
transition-duration: 1000; /* One second */
}
#transition-container:hover .transition-label {